codediff 0.0.7

Fast, robust, syntax-aware code diffing using tree-sitter ASTs
Documentation
# Developement Workflow

- Always read the README.md file in the root of the repository. Always.
- Always read README.md in any directory in this repository before you read or write any files in
that directory.

* You can run benchmark_optimal_solutions binary to check the impact of any changes.

## Markdown files

- Do NOT update the README.md files unless explicitly asked to do so.
- Update SPECS.md files every time you do a big change.
- SPECS.md files SHOULD NOT CONTAIN CODE SNIPPETS.
- Always clean up TODO.md and REVIEW.md files when you complete a task from those files.

# Rust

## TUI

- Prefer Stylize helpers: use "text".dim(), .bold(), .cyan(), .italic(), .underlined() instead of manual Style where possible.
- Prefer simple conversions: use "text".into() for spans and vec![…].into() for lines; when inference is ambiguous (e.g., Paragraph::new/Cell::from), use Line::from(spans) or Span::from(text).
- Computed styles: if the Style is computed at runtime, using `Span::styled` is OK (`Span::from(text).set_style(style)` is also acceptable).
- Avoid hardcoded white: do not use `.white()`; prefer the default foreground (no color).
- Chaining: combine helpers by chaining for readability (e.g., url.cyan().underlined()).
- Single items: prefer "text".into(); use Line::from(text) or Span::from(text) only when the target type isn’t obvious from context, or when using .into() would require extra type annotations.
- Building lines: use vec![…].into() to construct a Line when the target type is obvious and no extra type annotations are needed; otherwise use Line::from(vec![…]).
- Avoid churn: don’t refactor between equivalent forms (Span::styled ↔ set_style, Line::from ↔ .into()) without a clear readability or functional gain; follow file‑local conventions and do not introduce type annotations solely to satisfy .into().
- Compactness: prefer the form that stays on one line after rustfmt; if only one of Line::from(vec![…]) or vec![…].into() avoids wrapping, choose that. If both wrap, pick the one with fewer wrapped lines.