Package Exports
- llm-diff-patcher
- llm-diff-patcher/dist/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (llm-diff-patcher) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
llm-diff-patcher
A TypeScript library for applying "fuzzy" diffs, particularly designed for LLM-generated code modifications where line numbers may not be accurate.
Installation
npm install llm-diff-patcherUsage
import { applyPatchToFiles } from 'llm-diff-patcher';
// Original source code
const sourceText = `function hello() {
console.log("Hello, world!");
return true;
}`;
// A diff to apply (in unified diff format)
const diffText = `@@ -1,4 +1,4 @@
function hello() {
- console.log("Hello, world!");
+ console.log("Hello, universe!");
return true;
}`;
// Apply the fuzzy diff
const result = applyDiff(sourceText, diffText);
console.log(result);
// Output:
// function hello() {
// console.log("Hello, universe!");
// return true;
// }
// For applying to files in a directory:
const patchResult = applyPatchToFiles(diffText, {
basePath: '/path/to/project',
dryRun: false
});
console.log(`Files: ${patchResult.successfulFiles}/${patchResult.totalFiles}, Hunks: ${patchResult.appliedHunks}/${patchResult.totalHunks}`);Configuration Options
You can customize the behavior with options:
// When applying to files
const result = applyPatchToFiles(diffText, {
// Base directory for resolving file paths
basePath: '/path/to/project',
// If true, doesn't actually write to files (default: false)
dryRun: true,
// Minimum number of context lines required for a match
minContextLines: 2,
// Options passed to the underlying diff library
jsDiffApplyPatchOptions: {
// Maximum Levenshtein distance between context in patch and actual file lines
// Higher values allow more fuzzy matches (default: 0)
fuzzFactor: 2,
// Automatically handle different line endings between patch and source file
// (default: true)
autoConvertLineEndings: true,
// Custom function to compare lines for equality when patching
// Allows for very flexible fuzzy matching
compareLine: (lineNumber, line, operation, patchContent) => {
// Custom comparison logic here
// Return true if lines should be considered equal, false otherwise
return line.trim() === patchContent.trim(); // Example: ignore whitespace
}
}
});Why llm-diff-patcher?
Unlike traditional diff tools that require exact line numbers to match, llm-diff-patcher is designed to handle the imprecise nature of diffs generated by Large Language Models (LLMs).
Key benefits:
- Fuzzy Matching: Applies changes based on context even when line numbers are incorrect
- Robust Error Handling: Provides detailed information about successful and failed patches
- Flexible Configuration: Adjust matching strictness to your needs
- Dry Run Mode: Test patches without modifying files
Use Cases
- Applying code changes suggested by AI assistants like GPT, Claude, or other LLMs
- Implementing code modifications across slightly different versions of files
- Working with diffs that may not have perfect context or line numbers
- Automated code refactoring with LLM-generated patches
API
The library provides several key functions:
applyPatchToFiles: Apply patch to multiple files in a directoryapplyDiff: Apply a single diff to a stringparsePatch: Parse a patch string into a structured formatcleanPatch: Clean up and normalize patch text
Error Handling
The library provides detailed error information to help you understand what went wrong:
if (!patchResult.success) {
console.error(`Failed to apply patch. Errors:`);
patchResult.errors.forEach(error => {
console.error(`- ${error.message} (${error.context})`);
});
}License
MIT