JSPM

llm-diff-patcher

0.1.0
    • ESM via JSPM
    • ES Module Entrypoint
    • Export Map
    • Keywords
    • License
    • Repository URL
    • TypeScript Types
    • README
    • Created
    • Published
    • Downloads 132
    • Score
      100M100P100Q85878F
    • License MIT

    A library for applying fuzzy diffs generated by LLMs, especially useful for AI-generated code modifications

    Package Exports

      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-patcher

      Usage

      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:

      1. Fuzzy Matching: Applies changes based on context even when line numbers are incorrect
      2. Robust Error Handling: Provides detailed information about successful and failed patches
      3. Flexible Configuration: Adjust matching strictness to your needs
      4. 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 directory
      • applyDiff: Apply a single diff to a string
      • parsePatch: Parse a patch string into a structured format
      • cleanPatch: 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