Open source · MIT · v0.1

Cucumber tests. Hold the step definitions.

Write the .feature file. That's the whole test. jevcumber opens a real browser and works out what each Gherkin step means on the page in front of it — no glue code, no regex, no page objects.

wikipedia_search.featureTHE WHOLE TEST
Feature: Wikipedia search

Scenario: Searching for bagels
  Given I am at https://en.wikipedia.org
  When I search for "bagels"
  Then I see an article about bagels

Unedited, apart from fast-forwarding the typing

Watch it order a bagel.

A brand-new feature file, written in vim and run against the live Wikipedia. Nobody told jevcumber where the search box is, or what "an article about bagels" looks like.

jevcumber features/wikipedia_search.feature --headed

Stay for the last frame: when the run passes, the terminal's autosuggest offers to “refactor the step definitions to improve maintainability.” There aren't any.

How it works

You order. Jev reads the menu.

jevcumber is built on Jev, TypeSafe AI's fast System One model. Jev doesn't write code and it doesn't invent values. It answers multiple-choice questions — and jevcumber writes the choices from what is really on the page.

Code lists what's there

Playwright opens the page. jevcumber collects its buttons, fields and links, and the literal values in your step.

Jev picks among them

One request, about a second: what kind of action, which control, which value. Every answer comes back with a probability.

Playwright does it

The picks become an ordinary click, fill, or assertion — and get written down so they never need asking again.

It refuses to guess.

If Jev isn't sure, jevcumber won't click anything. The step is reported as ambiguous, with what it was torn between, so you can say what you meant.

? When I click it (ambiguous)
  Jev was not confident about the element
  (0.10 < 0.6). Candidates: button "Log in" (45%),
  link "Sign up" (35%), none (20%).

Pickled for later.

The first run saves what every step resolved to in a lockfile next to your feature. Commit it, like a package-lock.json.

After that, runs replay it: no API calls, no API key, no model variance. Change a step and only that step is re-resolved. Change your UI and the step heals itself — visibly, in the diff.

$ jevcumber features/ --frozen  # in CI
 Given I am on https://en.wikipedia.org
 When I search for "bagel"
 Then the URL should contain "/wiki/Bagel"

No sign-up needed for the first taste

Try it in two minutes.

The repo ships an example with its lockfile already recorded, so you can watch a replay before you get an API key. Needs Node.js 20+.

1npm install -g jevcumber
2jevcumber install-browser
3git clone https://github.com/RubyBrewsday/jevcumber && cd jevcumber
4jevcumber examples/ --frozen --headed

To run your own features, get a key from TypeSafe, export TYPESAFE_API_KEY=…, write a .feature file anywhere and run jevcumber path/to/it. The README has the full CLI reference and a CI recipe.

House rules

Writing steps it can resolve.

Jev selects; it never makes things up. So give it something to select.

Put data in quotes

Values are picked out of your step, not invented.

When I fill in the email field with "alice@example.com"When I fill in a valid email

Say where to go

A full URL, a bare domain, or a path with --base-url.

Given I am on https://example.com/loginGiven I am on the login page

Name controls the way the page does

The words on the button are the best locator there is.

And I click the Log in buttonAnd I click "Log in"

Two kinds of Then

Quoted text becomes a fast, cached Playwright assertion. A described expectation is judged by Jev against the live page on every run.

Then I should see "Welcome, alice"Then I see an article about bagels

The fine print, in normal-size print

Things you should know.

What gets sent to TypeSafe

For a step that isn't replayed from the lockfile: the step text and its literals, earlier step texts, the page's URL, title and interactive elements, and up to 8,000 characters of visible text. Never the value of a password field. Under --frozen, nothing leaves your machine.

Some sites don't want robots

Google answers a scripted search with a “prove you're not a robot” page, and jevcumber will correctly tell you your results aren't there. It makes no attempt to evade bot detection. Test your own app, or sites that allow automation.

It's v0.1

One action per step. Scenarios run one at a time. No iframes, uploads, drag-and-drop or multi-tab flows yet. Web UIs only.

It's yours

MIT licensed. Not affiliated with TypeSafe AI or the Cucumber project — just very fond of both. Issues and pull requests welcome.