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

agent-eval-harness

v0.1.0

Published

Static + schema + routing + spawn-fixture eval harness for *.md subagents (Claude Code, etc.). Catches description bloat, fence-mimicry, low routing margin, and schema regressions before they ship.

Readme

agent-eval-harness

Static + schema + routing + spawn-fixture eval harness for *.md subagent definitions.

Drop a directory of agents (Claude Code subagents, or any markdown-frontmatter agents) into a project, point the harness at it, and get a 100-point lint that catches description bloat, scope drift, fence-mimicry traps, low routing margin, and schema regressions before they ship.

Quick start

# In a fresh directory
node /path/to/agent-eval-harness/cli.js --init
node /path/to/agent-eval-harness/cli.js --threshold=1.0

--init scaffolds agents/, _evals/, and an agent-eval.config.json. The sample agent passes 100% out of the box — copy its shape for your own.

What it checks

| Suite | Per-agent | What it catches | |---|---|---| | static | 8 checks | missing name/description, too many tools, invalid tool names, file-name mismatch, missing trigger ("use when..."), no Scope/Hard-rules section, agent calls itself recursively | | schema | 1 check + fence audit | no Return Contract section, no JSON shape declared, ```json fence inside Return Contract (provokes mimicry in some LLMs) | | routing | N cases + overlap audit | wrong agent ranks first for a given prompt, zero margin between top two, two descriptions overlap ≥0.20 Jaccard | | spawn | M schema-bound agents | fixture in fixtures/<name>.txt doesn't parse as JSON, missing required fields, type mismatches, enum violations |

Strict mode (--strict or --threshold=1.0) promotes the fence audit, overlap audit, and missing-fixture from informational to blocking.

Config

agent-eval.config.json — paths and thresholds. Resolved relative to the config file's directory:

{
  "agentSourceDir": "./agents",
  "fixturesDir": "./_evals/fixtures",
  "schemasFile": "./_evals/schemas.json",
  "casesFile": "./_evals/cases.jsonl",
  "validTools": ["Read", "Write", "Edit", "Bash", "Grep", "Glob", "WebSearch", "WebFetch", "NotebookEdit", "Task"],
  "minDescriptionChars": 40,
  "maxTools": 5,
  "defaultThreshold": 0.85
}

Override paths via --config=path/to/cfg.json or AGENT_EVAL_CONFIG env var.

Library use

const { loadConfig, loadAgents, staticSuite, schemaSuite, routingSuite, spawnSuite } = require('agent-eval-harness');

const config = loadConfig({ configPath: './agent-eval.config.json' });
const agents = loadAgents(config.agentSourceDir);
const results = staticSuite(agents, config);
// ... render however you want

Schema file shape

{
  "<agent-name>": {
    "required": ["field1", "field2"],
    "types": { "field1": "string", "field2": "number" },
    "enums": { "field1": ["ok", "error"] },
    "nested": {
      "field2": { "required": ["sub1"], "types": { "sub1": "string" } }
    }
  }
}

Cases file shape (cases.jsonl)

One JSON object per line:

{"id":"case-1","prompt":"some user prompt","expect_agent":"agent-name"}

Fixture file shape

fixtures/<agent-name>.txt — a real recorded response from spawning the agent. Can include surrounding prose or fences; the harness extracts the JSON. Aim for one fixture per schema-bound agent.

Exit codes

| Code | Meaning | |---|---| | 0 | Score ≥ threshold | | 1 | Runtime error (config missing, file not found) | | 2 | Score below threshold |

License

MIT.