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.
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. Even a described check like I see an article about bagels is judged once, pinned to the heading that proved it, and replays without the API.
$ jevcumber features/ --frozen # in CI ✓ Given I am on https://en.wikipedia.org ✓ When I search for "bagel" ✓ Then I see an article about bagels
What's new in 0.2
Fresh out of the jar.
One release, four milestones, all shaped by running it against real sites. npm install -g jevcumber gets you 0.2.1.
Deterministic in CI
Descriptive checks are judged by Jev once, then pinned to the page title or heading that proved them — so they replay under --frozen with no key. A heading that later changes gets re-judged, not failed.
Say it, don't quote it
When I click the link that signs me out. When I fill in the new todo with the greeting on the page. Values and targets can be described when they're on the page — at a higher confidence bar.
More vocabulary
Hover, clear, scroll, upload, wait (for "Done" to appear, 3 seconds, for the page to settle); select by text, value or position. "Search for" types and presses Enter.
Failures you can see
Every failing step gets a screenshot and the page exactly as Jev saw it under jevcumber-report/. --trace keeps a Playwright trace for scenarios that didn't pass.
Parallel by default
Scenarios run across workers, each in its own browser context, with one clean block of output per scenario. Snapshots cost one browser round-trip per element instead of five — a 7,000-link page resolves in seconds.
Fits your project
jevcumber.config.mjs holds your base URL and beforeScenario/afterScenario hooks. --reporter json speaks Cucumber's classic format; --reporter junit for CI dashboards.
Explain and record
jevcumber explain features/ shows what every step resolves to, with confidence — no browser, no key, and it fails if a lockfile entry is missing. --record-eval saves exactly what Jev was shown when something resolves wrong.
Bring your agent
npx skills add RubyBrewsday/jevcumber teaches Claude Code, Cursor, Copilot and friends to install jevcumber and write features for you. The cookbook lists every phrasing verified against Jev.