Skip to content

enhancement: auto-chunking for large diffs #188

Description

@ajianaz

Description

Full codebase review (500K+ chars) exceeds default max_diff_size (50K). Users must manually split diffs into batches.

Code References

File Line Current State
src/commands/review.rs 88-113 Size check — max_diff_size enforced, no chunking
src/engine/llm.rs 261-270 review_diff() — single LLM call for entire diff
src/config/schema.rs default max_diff_size: 50_000 (50KB)

No chunking logic exists. If diff > max → error or blocked (depends on on_violation setting).

Fix Plan

Architecture

review.rs
  ├── diff > max_diff_size && auto_chunk enabled?
  │   ├── chunk_diff(diff, max_size) → Vec<DiffChunk>
  │   │   ├── Parse diff into per-file hunks
  │   │   ├── Group by directory (related files together)
  │   │   └── Each chunk ≤ max_diff_size
  │   ├── for chunk in chunks:
  │   │   ├── review_diff_with_cache(chunk)
  │   │   └── collect findings
  │   └── merge + deduplicate findings
  └── else: single review (current behavior)

Implementation Steps

  1. Add --auto-chunk flag to cora review CLI
  2. New module src/engine/chunker.rs:
    • Parse unified diff into (filename, hunk_lines) tuples
    • Group by directory prefix
    • Split groups until each ≤ max_diff_size
    • Return Vec<String> (each a valid unified diff)
  3. Update execute_review():
    • If --auto-chunk and diff > max → call chunker
    • Review each chunk separately
    • Merge ReviewIssue vectors
    • Deduplicate by (file, line, title) tuple
  4. Progress reporting: "Reviewing chunk 3/10 (src/config/*)…"
  5. Summary merge: concatenate chunk summaries

Edge Cases

  • Single file > max_diff_size → warn, review truncated
  • Overlapping findings across chunks → dedup
  • Empty chunk → skip
  • LLM failure on one chunk → partial results + warning

Target

  • Minor release: v0.5.0 (new feature + new module)
  • Files: new src/engine/chunker.rs, review.rs, main.rs, progress.rs

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions