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

speqkit

v0.10.0

Published

The kernel: loads plugins and gets out of the way.

Readme

speqkit

A declarative test framework where almost everything is a plugin — including the authoring format, the CLI, control flow and the reports.

npm i -g speqkit     # the package is speqkit, the command is speq
speq init
speq install
speq run

The package is speqkit. The command is speq.

What this package is

The kernel, and nothing else. It knows how to find a project, read its config, load plugins, execute a tree of steps, evaluate assertions, manage scoped resources and emit an event stream. It does not know what HTTP is, what a browser is, what YAML is, or that a terminal exists.

speq.yaml   →  discoverRoot   find the project
            →  loadConfig     flatten `extends`, layer one environment
            →  loadPlugins    resolve from link, store or node_modules
            →  handover       everything you recognise as the framework

Four steps. Everything after them is contributed.

A test

# .speq/suites/health.yaml
name: service answers
tags: [smoke]

steps:
  - id: login
    type: http
    method: POST
    url: /session
    body: { user: "${env:USER}" }

  - id: me
    type: http
    url: /users/${login.body.id}

assert:
  - type: status
    expected: 200
  - type: jsonpath
    path: name
    expected: Ada

http is not a kernel feature. It is @speqkit/plugin-http, and a step type you write yourself is registered exactly the same way.

The commands the kernel owns

Only the ones that must work before plugins are loaded — otherwise there would be no way to install the plugin that provides the rest.

speq init [--mode in-repo|test-repo]   scaffold a project
speq install [--frozen]                fetch what speq.yaml asks for
speq add <plugin>... | speq remove     edit speq.yaml and install
speq link <path> | speq unlink         a plugin you are writing right now
speq plugins                           what is loaded, and what it contributes
speq doctor                            environment, store, compatibility

speq run, speq report, speq validate and speq list come from @speqkit/plugin-cli. Remove it and the kernel still runs — from an editor, a TUI, or your own harness.

Installing plugins without npm

speq install talks to the npm registry over HTTP itself: resolves the range, downloads the tarball, verifies its sha512, unpacks it, lays out a store and writes speq.lock. It never shells out to npm, pnpm or yarn — requiring the very package manager we replace would defeat the point, and a QA repository that is not a Node project should not have to become one.

The store layout is pnpm's, for pnpm's reason: a dependency is a symlink inside the depending package's own directory, so ordinary Node resolution finds it and two plugins may want different versions of the same library.

As a library

The kernel is a normal ES module. A custom harness, an editor extension or a CI wrapper drives it directly:

import { bootstrap, discoverTests, runTests } from 'speqkit'

const session = await bootstrap({ root: '.speq', env: 'ci' })
const tests = await discoverTests(session.registry, { root: session.root.root, tags: ['smoke'] })
const outcome = await runTests(session.registry, tests, { reporters: ['junit'] })

process.exit(outcome.status === 'passed' ? 0 : 1)

A plugin does not do this. A plugin runs inside a kernel that is already booted and reaches it as ctx.host — see @speqkit/plugin-api. The distinction matters: a plugin that imports this package ships a second kernel in its dependencies, and the installer will faithfully install it.

Stability

0.x — nothing is stable. @speqkit/plugin-api is the contract that will be frozen at 1.0; this package's version is free to move underneath it.

MIT.