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

claude-config-lint

v0.1.0

Published

Static linter for Claude Code instruction hierarchies: zombie SUPERSEDED-BY references, dead markers, skill-description routing collisions.

Readme

claude-config-lint

Static-analysis linter for Claude Code instruction hierarchies. It reads your global and project CLAUDE.md files plus every SKILL.md in the tree (project **/skills/*/ and global ~/.claude/skills/) and reports three classes of silent failure:

  • ZOMBIE-DOC — a doc retired with a SUPERSEDED-BY marker that a live skill still references. The agent reads a dead doc and follows dead rules. Full retirement is an error; a marker that scopes itself ("naming section only — rest is LIVE") is a warning.
  • DEAD-MARKER — a SUPERSEDED-BY marker whose named successor file doesn't exist. Every reader dead-ends.
  • SKILL-COLLISION — two skill descriptions whose trigger sets overlap enough that the model may route to the wrong skill. Lexical scoring (quoted-trigger extraction + token Jaccard), no LLM call — and it stays silent on intentional cede clauses ("not for risk screening — use risk-screen"), which are cross-references, not collisions.

Runs locally, no API key, machine-readable output for CI.

Usage

bunx claude-config-lint            # lint cwd + your global ~/.claude
bunx claude-config-lint <root>     # lint a specific tree
bunx claude-config-lint --no-global --json   # project only, JSON findings

Findings print as severity path:line RULE message. Exit codes: 0 clean (warnings are advisory by default), 1 warnings with --strict, 2 any error.

Config (optional, claude-config-lint.json or --config <path> — see claude-config-lint.example.json): roots, extra content dirs to scan for rule docs, global-dir override, per-rule enable/severity/threshold.

What counts as a marker

A line in the doc's first 5 lines that starts with SUPERSEDED-BY (leading > blockquote and allowed):

> ⚠ SUPERSEDED-BY: docs/new-sop.md — whole doc retired.

Mid-sentence mentions ("always follow SUPERSEDED-BY headers") never match — that false positive is a regression fixture, learned from the bash script this tool grew out of. Scope words inside the marker's own blockquote lines ("brand refs only", "rest of this doc is LIVE") mark a PARTIAL retirement, which downgrades zombie references to warnings. Templated references like channels/<channel>/SOP.md are never resolved.

How it compares

Existing agent-config linters score files for structure, clarity, and security — AgentLinter (8-dimension scoring, secret patterns) and claudelint (116 rules across CLAUDE.md size/imports, skill frontmatter/security, settings/hooks/MCP schemas — verified against its actual list-rules output, 2026-08-12). Neither models the instruction lifecycle: nothing checks SUPERSEDED-BY retirement chains, and claudelint's trigger checks (skill-description-missing-trigger, skill-overly-generic-name) are per-file — there is no pairwise trigger-overlap detection between skills. That's the gap this tool covers: it models how Claude Code actually loads and routes instructions.

Measured on a real 45-skill install (kept local, never committed — see below): all 45 descriptions parse, top pairwise Jaccard 0.264 (below threshold), zero false collisions on 11 intentional cede-clause cross-references.

Fixtures and privacy

The committed test corpus is a synthetic structural clone — same file shapes, frontmatter grammar, and marker conventions as a real install, invented content. No real install snapshot is ever committed; .ci/leak-lint.sh greps every committed fixture against a hashed denylist on every CI run and fails the build loudly if real-install strings ever land.

Development

bun install
bun test        # fixture-driven; every rule proven against stub and always-fires impls
bash .ci/leak-lint.sh

Rules are pure functions (model) => Finding[] in src/rules/ — one file per rule, the seam a future rule (e.g. cross-file precedence conflicts, planned v0.2) plugs into.

MIT.