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

rman-node

v1.3.0

Published

Node.js support for rman - the commands and conventions that only mean something in a Node repository

Readme

rman-node

Node.js support for rman.

rman's core is about repositories - packages, versions, changelogs, releases, branches. Anything that only means something because the repository happens to be a Node one lives here, so the core stays usable by a repository in any language.

Full API reference: docs/node.md.

Install

npm i -D rman-node
# .rmanrc.yml
plugins: ['rman-node']

A plugin that cannot be loaded is an error, not a skip: silently losing rman publish is worse than not starting.

Commands

These three commands do not exist without this package - rman clean is Unknown argument: clean in a repository that names no plugin.

rman publish

Publishes every package to its configured registry - npm by default, or whatever each package's own .rmanrc "publish.target" says ("npm", "docker", or both). Each target decides for itself whether the current version is already out there: npm view on the npm side, docker manifest inspect on the docker side.

rman publish                              # show the plan, then ask for confirmation
rman publish --yes                        # publish immediately, no confirmation
rman publish --dry-run                    # only show the plan, never publish
rman publish --access public              # required for a new scoped package
rman publish --tag next
rman publish --otp 123456
rman publish --registry https://registry.example.com --userconfig ./ci.npmrc
rman publish --package-manager pnpm
rman publish --target docker              # only the packages configured for the "docker" target

A "workspace:*"/"workspace:^"/"workspace:~" dependency range is automatically rewritten to a real, registry-consumable range immediately before each package's publish, and restored right after - see docs/node.md#publishservice.

A package opts into building/pushing a Docker image via .rmanrc "publish.target": ["docker"] plus a "publish.docker" block (image, platforms, buildContexts, buildArgs, ...) - see docs/cli/publish.md.

rman ci

Deletes node_modules and any lockfile in every package (or runs the package's own "ci" script instead, if it defines one), then installs once at the root.

rman ci
rman ci --package-manager pnpm

rman clean

Removes compiled TypeScript output (.js/.js.map/.d.ts under src/test, plus any *.tsbuildinfo) and whatever .rmanrc clean.include/clean.exclude configures. Never touches node_modules - that's ci's job.

rman clean
rman clean --dry-run              # preview what would be removed

Every one of its built-in behaviours is a TypeScript fact, which is why it is here and not in the core: nothing in it would fire for a Cargo or Go repository, and both ship a clean of their own. A .d.ts with no matching .ts beside it is left alone - that is a hand-written declaration, not build output.

Config keys

Three .rmanrc keys come from this package, and they reach rman's own RmanConfig type by declaration merging - so pkg.config.clean is typed where it is read, with no cast:

| Key | Level | | | --- | --- | --- | | packageManager | root only | Which package manager ci/publish shell out to, and whose version info reports. Default npm. | | clean | per package | include/exclude globs beyond TypeScript's own output, plus skip. | | publish.directory | per package | Where this package's publishable output lives, relative to its own directory. |

RmanNodeConfig is the name a config author annotates with, and importing its defineConfig is what carries the augmentation:

// .rmanrc.mjs
import { defineConfig } from 'rman-node';

export default defineConfig({
  plugins: ['rman-node'],
  packageManager: 'pnpm',
  '[*]': { clean: { include: 'build' }, publish: { directory: 'build' } },
});

The JSON and YAML forms of the config carry no type - rman ships no JSON Schema, because a schema cannot describe keys a plugin contributes. See docs/rman.md#editor-support-types.

Seams and augmentations

Beyond the commands, this package answers the questions rman's core deliberately has no answer to: what a package is (package.json), which directories are packages (workspaces), how a version is planned, what pre<script>/post<script> mean, and that node_modules/.bin belongs on a child process's PATH. Without it a repository has no manifest reader at all - which is the point: another ecosystem supplies its own through the same seams rather than working around npm's.

Some core behaviour is neutral by default and this package turns it on, because installing it is itself the statement that the repository is a Node one.

SystemInfo (rman info): the core service asks about a package manager only when told to - a repository in another language reporting "npm: Not Found" is a wrong answer, not a missing feature. This package makes npm the default and adds its own version to the report:

# without the plugin          # with it
 Binaries:                     Binaries:
    Node : 24.15.0                Node       : 24.15.0
                                  npm        : 11.12.1
                               npmPackages:
                                  rman-node : ...
                                  rman       : ...

.rmanrc "packageManager" still decides which one; the augmentation only decides that there is one at all.

Not here

Docker publishing stayed in the core - any language's project can publish an image. What is still wrong is that publish is what drives it, so a non-Node repository has to install this plugin to reach publish --target docker. Fixing that means making a publish target something a plugin contributes to a core publish.

Licence

MIT