zenpatch 0.1.0

A robust library for applying text-based patches, designed for AI coding agents with backtracking algorithm
Documentation
# Zenpatch

A robust library for applying text-based patches, designed for AI coding agents. It operates on an in-memory Virtual File System (VFS).

Patching is a crucial component of AI-driven coding. AI-generated patches are often imperfect and require lenient rules for application, especially concerning whitespace and special characters. Inspired in part by `https://github.com/openai/codex`'s approach to whitespace, Zenpatch offers a novel solution.

To the best of our knowledge, Zenpatch is a unique implementation that uses backtracking to apply patches. This approach has several advantages:
*   **Simplicity:** It avoids the need for complex, hand-written heuristics for patch application.
*   **Precision:** It is precise and will not apply an ambiguous patch. Ambiguity is detected by counting the number of possible solutions; a correct patch must have exactly one unique solution.

## Usage

The primary function is `zenpatch::apply`, which takes a patch string and a `Vfs` (a `HashMap<String, String>`), and returns the patched `Vfs`.

### Example

```rust
use zenpatch::{apply, Vfs, ZenpatchError};

fn main() -> Result<(), ZenpatchError> {
    // Initialize a VFS with some files.
    let mut vfs = Vfs::new();
    vfs.insert("file_to_update.txt".to_string(), "line 1\nold content\nline 3".to_string());
    vfs.insert("file_to_delete.txt".to_string(), "this file will be deleted".to_string());

    // A single patch can contain multiple actions (add, update, delete).
    let patch_content = r#"
*** Begin Patch
*** Update File: file_to_update.txt
@@
 line 1
-old content
+new content
 line 3
*** Add File: new_file.txt
+hello world
*** Delete File: file_to_delete.txt
-this file will be deleted
*** End Patch
"#;

    // Apply the patch to the VFS.
    let patched_vfs = apply(patch_content, &vfs)?;

    // Verify the results.
    assert_eq!(patched_vfs.get("file_to_update.txt").unwrap(), "line 1\nnew content\nline 3");
    assert_eq!(patched_vfs.get("new_file.txt").unwrap(), "hello world");
    assert!(patched_vfs.get("file_to_delete.txt").is_none());

    println!("Patch applied successfully!");
    Ok(())
}
```

## Patch Format

For detailed instructions on the text-based patch format, especially for use in AI coding agents, please refer to the `llms.txt` file in this crate. The content of this file is also available programmatically via the `zenpatch::get_llm_instructions()` function.