npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

llm-diff-patcher

v0.2.1

Published

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

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