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

ache

v0.0.3

Published

A bash script templater.

Readme

ache

npm i ache -g

Why?

I was sick and tired of build tools available. I simply want to leverage bash / and shell scripts and add a templating component on top of them using node. Named ache because the existing tools are a headache, and it rhymes with make, jake, rake, you get the idea.

How it works

Add a achefile.js or achefiles directory with many different JavaScript files to your project.

export let helloWorld = `
echo 'hello world'
`

Then run ache hello-world and your done.

Ache Spec

I designed ache to inevitably support three distinct syntax types. Providing some versatility.

Syntax 1

Export values can return a execString directly.

export let helloWorld = `
echo 'hello-world'
`

Syntax 2

Export values can return a special ache-specific Cmd class, where you can pass a execString.

export let helloWorld = new Cmd(`
echo 'hello-world'
`)

The benefit here is that you can add optional params to helloWorld for instance helloWorld.usage.

Syntax 3

Export values can return that same Cmd class, when a function is passed you have access to global data from the root ache consumer. This allows the most amount of uniformity between scripts and modularity because you don't need to use globals.

export let echo = new Cmd(({argv}) => `
echo '${argv._[1]}'
`)

Another benefit of this approach is that you can preform validation like this.

export let helloWorld = new Cmd(({argv}) => {
  if (argv._[1] !== 'please') throw new Error('ask nicely')
  return `
    echo 'hello-world'
  `
})

Ache Specific

Here's the operational flags you can pass to ache.

  • ache --ache-scope changes the path where ache looks for your ache scope
  • ache --ache-cwd changes the current working directory CWD to a specified path
  • ache --ache-list lists all the commands in the ache scope
  • ache --ache-dry-run logs the string command to be run (without running it)
  • ache --ache-error logs error stack trace instead of just error message
  • ache --ache-verbose shortcut for DEBUG=ache and --ache-error

Examples

examples$ npm i ache -g
/Users/thomasreggi/.nvm/versions/node/v6.2.2/bin/ache -> /Users/thomasreggi/.nvm/versions/node/v6.2.2/lib/node_modules/ache/lib/bin.js
/Users/thomasreggi/.nvm/versions/node/v6.2.2/lib
└── [email protected]

examples$ cd 01_example/
01_example$ ache
01_example$ ache list
[ 'meow-mix' ]
01_example$ ache meow-mix
meow meow meow meow meow meow

01_example$ cd ..
examples$ cd 02_example/
02_example$ ache list
[ 'bar', 'baz', 'foo', 'hello-world' ]
02_example$ ache bar
bar

02_example$ ache hello-world
hello-world

02_example$ cd ..
examples$ cd 03_example/
03_example$ ache list
[ 'bar', 'baz', 'foo', 'hello-world', 'meow-mix' ]
03_example$ ache hello-world
hello-world

03_example$

Here's an example of scope diving & setting the cwd.

ache$ cd examples
examples$ ache --ache-scope ./01_example/ --ache-cwd ./03_example/ cat-file
03_example
examples$ ache --ache-scope ./01_example/ --ache-cwd ./03_example/ cat-file --ache-verbose
  ache starting +0ms
  ache argv {"_":["cat-file"],"ache-scope":"./01_example/","ache-cwd":"./03_example/","ache-verbose":true} +4ms
  ache cwd /Users/thomasreggi/Desktop/ache/examples +1ms
  ache ache scope /Users/thomasreggi/Desktop/ache/examples/01_example +0ms
  ache ache cwd /Users/thomasreggi/Desktop/ache/examples/03_example +0ms
  ache commands meow-mix, cat-file +124ms
03_example