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

@meowshed/meow-lua

v0.1.1

Published

Detects Lua and Neovim plugins from what git tracks, names the runtime or the editor that evaluates the code before it binds anything, prints a stages table bound from the formatter, linter, test runner and rockspec the repository configured, reports a pl

Readme


reader: someone installing or running meow-lua on Pi answers: what meow-lua provides, what it adds to a session and how to install it kind: reference describes: [@meowshed/[email protected]]

@meowshed/meow-lua

Detects Lua and Neovim plugins from what git tracks, names the runtime or the editor that evaluates the code before it binds anything, prints a stages table bound from the formatter, linter, test runner and rockspec the repository configured, reports a plugin with no runtime declared or no help file, writing no file, and carries what a reviewer of Lua or of a Neovim plugin checks that no command reports. Distributed as a Pi package.

Install it

pi install npm:@meowshed/meow-lua

The paw executable ships with @meowshed/meow-core alone (REQ-4612): this package's launchers run their subcommands through it, so install the core package beside this one for the binary-backed checks. Without it, every check reports unrun and lets the command through.

pi install npm:@meowshed/meow-core   # carries the binary the launchers run

Installing from this repository's checkout is the development install: it loads the package in place and runs no lifecycle script.

Bind your stages

meow-lua bind prints a [stages] table for you to paste into .meowpaw/profile.toml, and never writes the profile itself:

[stages]
format = "stylua --check ."
lint = "selene ."
# check: unbound, lua-language-server --check writes its findings to a log file, so a stage reading its exit status hasn't read them; declare a command that reads the report, such as llscheck
test = "busted"
build = "luarocks make shop-1.0-1.rockspec"

| Stage | Bound to | When | | -------- | --------------------------- | ----------------------------------------------------------- | | format | stylua --check . | A stylua.toml or .stylua.toml in the directory or above | | lint | selene . | A selene.toml in the directory | | lint | luacheck . | A .luacheckrc in the directory or above | | lint | selene . && luacheck . | Both, because they check different sets | | check | nothing, printed as unbound | Always | | test | busted | A .busted in a directory whose host is a Lua runtime | | build | luarocks make <rockspec> | One rockspec in the directory |

A stage with no binding is a comment giving the reason. The pack binds the linter you configured and never the other one, because selene leaves out whitespace and line length, so swapping one for the other drops checks without a word. A Neovim plugin's test stays unbound, because its tests run inside nvim --headless and the harness, plenary or mini.test, is yours to declare. build is unresolved without a rockspec, because Lua and a Neovim plugin have no build without one. Where several directories activate, each command runs in its own directory, and a stage one directory leaves unbound is a comment naming that directory. bind prints nothing for a stage your profile already declares.

Check a Neovim plugin

meow-lua check prints a finding for each of these in a Neovim plugin, and exits 1 on any:

| Line | When | | ---------------------------- | --------------------------------------------------------------------------------------------------------- | | <dir>: no .luarc.json, ... | The package commits no .luarc.json, so the language server checks a Lua with no editor runtime declared | | <dir>: no doc/, ... | The package tracks nothing under doc/, so :help has nothing for its users |

With no finding it prints no findings and exits 0.

What it reports instead of a table

| Line | Means | | ----------------------------------------------------- | --------------------------------------------- | | unresolved: not a Lua and Neovim plugins repository | Git tracks no marker | | unresolved: Lua runtime not detected: ... | Nothing names the runtime for a directory | | unresolved: no profile at .meowpaw/profile.toml | check found no profile | | unresolved: the profile doesn't parse: ... | check found a profile that isn't valid TOML |

Each exits 3.

Generated files

Commit .luarc.json, stylua.toml, selene.toml, .luacheckrc, .busted and the rockspec, because they're the configuration every binding reads. Commit a Neovim plugin's generated help file under doc/ as well, because :help reads it from the repository, and a generator such as panvimdoc rewrites it on each push. Ignore log/, which lua-language-server --check writes into the directory it runs from unless --logpath names another.

Review Lua or a Neovim plugin

When Pi reviews Lua, the skill has it run status first and then load reviewing.md, which holds what no command reports: the runtime the change runs on, a global made by a missing local, pcall and the error object, the cost of an __index chain, nil holes in a sequence, and a file with no annotations. For a package it adds startup cost, setup() merging options, autocommand groups, handle validity and the fast event context, vim.system, namespaces, opt loading under vim.pack, and a health check. The skill never swaps one linter for the other, never rewrites .luacheckrc, and never leaves a language server's log directory in your working tree.

What it costs you

The skill's description stays in context on every turn, and reviewing.md costs context only when Lua is reviewed. The program is a native binary shipped inside meow-core, and needs git on the machine. On a machine the unit carries no binary for, it reports the repository as unresolved and exits 3.

Read a subcommand's help

meow-lua --help lists the subcommands, and meow-lua <subcommand> --help names what it determines, what you read to reach the same answer without the tool, and the first word of each kind of line it prints.