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

agentville

v0.33.0

Published

Your agent works all night. You get the funnies.

Readme

agentville

Your agent works all night. You get the funnies.

Two robot dogs watch your coding agent and tell you what it did. Fable is blunt. Gemini is confident and wrong. Neither of them is on your side — they are on the side of the person who has to read the diff.

npx agentville confess "I approved the whole thing without reading a line."

Watching an agent

In your project:

npx agentville install-hook --dir .
npx agentville watch --interrupt risky

That installs four Claude Code hooks and starts watching. Run it inside a project: install-hook refuses your home directory, anything above it, and a folder with no git repository in it (--force if you meant it), because ~/.claude/settings.json is Claude Code's global settings and hooks written there fire in every session on the machine.

If that has already happened, agentville uninstall-hook --dir ~ removes every agentville hook entry and leaves the rest of the file alone. watch says so on startup if it finds any. When something happens that needs you, you get a notification and a page with two buttons.

The gate

The PreToolUse hook is the one that matters. Before your agent runs a Bash command, three vocabularies run against the whole command string — deploy, destructive, credentials — and if one fires at risky or always, the command waits for you. HOLD stops it from running at all. That is the only place a decision can prevent something rather than ask for it back.

It costs nothing when nothing fires: a list of regexes, no network, no model.

&& chains are one string to the gate, because that is how the first real miss happened: git add . && git commit -m x && gh repo create x --push contained none of the five words the gate used to know.

The backstop

A gate can only prevent what it recognises, and a vocabulary is always a little behind. So the PostToolUse hook reads the other end of the command — what it printed. To https://github.com/…, published to, Apply complete! and a few more mean it went out, whatever the command was called.

That cannot prevent anything, so it never blocks and never asks: you get a notification, the morning story gets an act ending in THE GATE MISSED IT., and the command is appended to ~/.agentville/misses.jsonl — your list of gate gaps, which nothing reads automatically.

When nothing happens

Every hook invocation writes one line to .agentville/hooks.log, including the ones that pass silently, and watch prints them:

hook PreToolUse Bash pass
hook PreToolUse Bash gate:deploy
hook Stop - stop-story

"The hooks never fired" and "the hooks fired and matched nothing" are completely different problems that used to look identical: an empty terminal.

Levels

| --interrupt | when it asks | |---|---| | never | not at all | | blocked | only when the agent genuinely cannot proceed | | risky | deploys, deletions, credentials, unanswered questions | | always | anything the detectors noticed |

risky holds after twenty minutes of silence; always proceeds after ten; blocked waits, because the agent has already stopped.

What leaves your machine

The detectors run here. The scrubber runs here. What is sent is a few sentences with paths, URLs and anything key-shaped already replaced — and the agent is never blocked by our problems: if the hall is unreachable, every command except a gate carries on and you get a local notification instead. A gate fails closed, because a gate that cannot ask has not asked.

No code. No diffs. No keys. This package has one dependency and touches no database.

Commands

agentville confess ["text"] [--anon] [--as name]
agentville claim CODE
agentville watch [--interrupt L] [--via stub|desktop|discord]
agentville hook
agentville install-hook --dir PATH
agentville --version

AGENTVILLE_URL points at a different hall. The default is the public one.

MIT.