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

decisium

v0.1.5

Published

Semantic UI testing with decision models: plain-English Gherkin Steps executed by Jev in a real browser, pass/fail decided by code, record/replay cassettes

Readme


Write what the user does. Decisium runs it in Playwright:

@url:https://www.saucedemo.com/
Feature: Checkout

  Scenario: Checkout requires a first name
    When I log in as "standard_user" with password "$SAUCE_PASSWORD"
    And I add "Sauce Labs Backpack" to the cart
    And I open the cart
    And I start the checkout
    And I try to continue without filling in the form
    Then the error should say "First Name is required"

No selectors, no page objects, no step definitions.

How it works

Each Step is executed by Jev, TypeSafe's decision model. Jev does not generate text or code. It picks among the options Decisium enumerates from the page (elements, actions, check kinds) and returns a probability for each. Code, not the model, decides whether a Step passed: a value check compares the element's value with the quoted one, a presence check looks for the text, a state check reads the control's state. No LLM, no prompts, no invented selectors.

What each Step resolved to is recorded in a cassette next to the feature. CI replays it with zero model calls, the same outcome every run; a real UI change fails as UI_CHANGED.

Install

Global, one decisium command for every project:

npm install -g decisium
decisium install                     # the Chromium build Decisium drives

Or per project, with the version pinned in package.json (run commands as npx decisium …):

npm install --save-dev decisium
npx decisium install

Then:

echo 'TYPESAFE_API_KEY=...' >> .env   # live runs only; replays need no key
decisium doctor

Node 22.18+ or 23.6+.

Use

decisium lint checkout.feature                 # how each Step will be read; flags known-bad wordings
decisium run checkout.feature                  # live: asks Jev, records checkout.cassette.json
decisium run checkout.feature --record none    # replay: zero model calls (CI)
decisium step "I open the cart" --url https://www.saucedemo.com/   # try one wording

A failed run prints the reason under each Step and writes <reportDir>/<timestamp>/report.md (reportDir defaults to runs): the Step, Jev's answers, the page text around the element, a screenshot, a Playwright trace and a rerun command, ready for you or a coding agent.

Decisium runs inside cucumber-js: your cucumber.mjs, profiles, formatters (--format junit:junit.xml) and your own step definitions (--import, with this.page and this.context) keep working.

Configuration

Put Decisium options in worldParameters.decisium in your project's cucumber.mjs. decisium run loads it automatically:

// cucumber.mjs
export default {
  worldParameters: {
    decisium: {
      url: "http://localhost:3000",
      reportDir: "e2e/runs",
      checkTimeout: 10000, // milliseconds to wait for the expected state
      actionTimeout: 10000, // milliseconds to wait for the page to settle after an action
      maxTurns: 12, // action Turns allowed per Step
      confidence: { target: 0.5, answer: 0.8 }, // default confidence thresholds
    },
  },
};

Precedence: CLI flag > DECISIUM_* environment variable > configuration > default. For example, --check-timeout 15000 overrides both DECISIUM_CHECK_TIMEOUT and checkTimeout in the file.

Raise timeouts for slow apps; raise maxTurns for long flows, or split the Step. Reword ambiguous Steps before changing confidence. Lowering confidence.answer below 0.6 warns because a wrong reading can pass.

See Configuration for every option, default, flag, environment variable, and reporter setup.

Docs

andletenkov.github.io/decisium

Jev and your data

Live runs call Jev through the TypeSafe API and need a TypeSafe API key; Jev is TypeSafe's hosted service under its own terms. Per Turn it receives the Step's text and a text snapshot of the page (the accessibility tree: roles, names, visible text, link URLs). No screenshots, cookies or network traffic. Write credentials as "$NAME": only the token leaves your machine. Replays send nothing.

License

MIT © Andrei Letenkov