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 🙏

© 2026 – Pkg Stats / Ryan Hefner

dry-eyes

v1.0.1

Published

Finds SEMANTIC duplicate code across a whole repository for Claude Code — the same business rule, calculation, or UI/UX pattern implemented independently more than once, often with different behavior each time. Not a copy-paste/token clone detector: profi

Readme

DRY Eyes

DRY Eyes

Finds semantic duplicate code for Claude Code — the same business rule, calculation, or UI/UX pattern implemented independently more than once, often with different behavior each time.

Claude Code

How DRY Eyes works

Finds the same business rule, calculation, or UI/UX pattern implemented independently more than once — often with different behavior each time — then compares every variant against the others and against what a correct implementation would actually need. Not a copy-paste detector: jscpd and PMD-CPD already find literal clones cheaply. This is for the duplication those tools can't see.

Leia em português · Lee en español

Why this exists

Two implementations of the same rule rarely look identical when someone reimplements it independently — different names, different shape, sometimes a different variable-naming convention entirely. A token-matching clone detector is fast and deterministic at catching copy-paste, but it can't tell you that a screen showing an error toast and three screens that don't are all supposed to handle the same failure the same way, or that three files compute "the same" discount with three different edge-case bugs.

DRY Eyes runs cheap, deterministic candidate-generation signals first (repeated string literals, mirrored file paths, shared normalized lines, domain-gated name families, inconsistent UI mechanisms for the same concern) — for the same reason those clone detectors exist: most candidates don't need an LLM call to surface. What's different is what happens next: every real candidate gets read and compared for actual behavior, not just textual similarity. The comparison's own job is to figure out what a correct implementation of the concept requires, independently of any one variant, and then check each variant against that bar. It's common — not rare — for the answer to be "none of them," with a description of what a correct implementation would still need to handle.

Install

npx dry-eyes install --project   # this repo's .claude/skills/dry-eyes
# or, omit --project to install globally at ~/.claude/skills/user/dry-eyes

A brand-new Claude Code session may be needed afterward to discover the skill (skills are read at session start).

git clone https://github.com/kigiela/dry-eyes.git
cd dry-eyes
node bin/cli.js install --project

Use

/dry-eyes init   configure — exclude patterns, output location, scopes,
                 duplication probes; auto-runs non-interactively if skipped
/dry-eyes scan   sweep the whole repo, cluster candidates, verify each
                 skeptically, compare every variant's actual behavior

How it works

  1. Profile once, persist it. /dry-eyes init profiles the repo's packages and languages, then designs a tailored set of duplication-prone categories (validation, calculations, error-display mechanisms, ...) — done once, reused by every future scan, not redesigned per run.
  2. Cheap signals first. /dry-eyes scan runs five deterministic signals — repeated literals, mirrored paths, shared line shapes, domain-gated name families, inconsistent mechanisms for the same concern — merging cross-signal agreement into single candidates before any LLM call happens.
  3. Skeptical verification. Every candidate cluster gets read for real and checked: is this actually the same concept, independently reimplemented — or already shared, coincidental, or two things that are supposed to stay decoupled?
  4. Independent comparison, not a vote for the "winner." For clusters whose variants actually diverge in behavior, several independent analyses each derive what correct behavior requires before looking at any variant — then check every variant against that bar. Disagreement between analyses is adjudicated, not outvoted: the conclusion a converged majority is most likely to miss is exactly "none of these is right."
  5. A report, not a fix. Markdown + JSON, leading with the clusters that need a human decision. Read-only — v1 has no fix command.

What v1 does not do

  • No fix command. The JSON report carries a stable id and a safe/risky-style classification per cluster specifically so a future dry-eyes fix could consume it — applying a consolidation is a different, higher-stakes action than reporting one.
  • No diff/PR-scoped mode. Duplicate detection is inherently a whole-repo comparison — to know if new code duplicates something, the "something" is almost always outside the diff. A faithful diff-scoped version would have to sweep the whole repo anyway, losing the cost saving that justifies a diff mode in the first place.
  • No cross-language comparison. Every scope is exactly one language.
  • No CI wiring, no multi-tool adapters. Claude Code only for v1 — this pipeline leans much more heavily on real deterministic code (bucketing, Jaccard merging, a path-hallucination guard) than a prompted-JSON port to another tool's subagents could reliably reproduce.
  • High-precision, medium-recall, on purpose — and every report says so. Duplication sharing no repeated literal, no shared name, no similar line shape, and no mirrored path is invisible to the deterministic signals; the supplementary LLM sweep only catches it if a category happened to be designed for that area.

License

MIT — see LICENSE.