Skip to content

Releases: libraz/coverwise-mcp

v0.5.1 — the pairwise_* tools are registered again

Choose a tag to compare

@libraz libraz released this 15 Sep 02:08

Fixed

The four pairwise_* tools were never reaching the model. Each tool's input schema carried a top-level anyOf to express "either model or parameters must be given", and a client whose backing API rejects top-level schema combinators skips such a tool outright. Because the server still connected and still answered tools/list, the four tools were simply absent with no error anywhere a user would look.

The anyOf is gone. The requirement is stated in the model and parameters field descriptions and is still enforced at runtime, which already rejected both input forms at once and neither of them. A test now asserts that no tool schema carries a top-level anyOf, oneOf, allOf or not.

Dependencies

  • @libraz/coverwise 1.5.0 → 1.6.0
  • vitest 4 → 5, which requires vite as an explicit peer
  • @biomejs/biome 2.5.10 → 2.5.13

v0.5.0 — coverwise-mcp rename & the pairwise_* tool surface

Choose a tag to compare

@libraz libraz released this 23 Aug 17:08

Rename release. The plugin, the repository and the four MCP tools all change name, so this one needs a manual step from anyone already running it. Alongside the rename, the tool surface is reworked to sit one level above the engine API, a session hook makes the plugin engage on a plain "write tests for this", and the install helper reaches four more MCP clients.

Breaking changes

The plugin is now coverwise-mcp

The repository moved from libraz/claude-coverwise to libraz/coverwise-mcp, and the plugin name with it. Re-add it:

/plugin uninstall claude-coverwise
/plugin marketplace remove claude-coverwise
/plugin marketplace add libraz/coverwise-mcp
/plugin install coverwise-mcp

Outside Claude Code, re-run the install helper so generated entries point at the new specifier:

npx -y github:libraz/coverwise-mcp init

The MCP tools moved to the pairwise_* namespace

Before Now
generate pairwise_generate
analyze_coverage pairwise_analyze
extend_tests pairwise_extend
estimate_model pairwise_estimate

They now read as one namespace in a client's tool list. Any project CLAUDE.md naming the old tools needs updating.

What's new

A tool surface above the engine API

  • A parameter model can be given as a plain { name: [values] } map instead of the explicit parameters array.
  • Suites travel as columns plus positional rows, which drop into a table-driven test (test.each, t.Run tables, pytest.mark.parametrize) and cost fewer tokens than repeating key names on every case.
  • Values come back in the JSON type they were declared with — 0, not "0".
  • pairwise_extend returns newRows (just the additions) and before (the coverage of the suite as it stood), so explaining the additions needs no second analyze call.
  • Positional rows are accepted wherever test cases are taken, so a suite travels between tools unchanged.

Session hook

A SessionStart hook states the applicability rule up front: a target with three or more independent parameters gets a parameter model rather than hand-picked combinations. The tools and the skill are both passive and only match a request that already sounds combinatorial — but the request that needs them most is a plain "write tests for this", which matched nothing. The hook stays silent outside code checkouts.

Install helper covers seven clients

Claude Desktop, Cursor, Cline and Gemini CLI join Claude Code (user and project) and Codex CLI, with per-platform config paths. Config writes now go through a temp file and an atomic rename and carry over the existing file mode, so a config a running client is reading is never left half-written. Codex sub-tables such as [mcp_servers.coverwise.env] are stripped along with the main block instead of being left to attach to the following section.

coverwise 1.5.0

@libraz/coverwise bumped to ^1.5.0. An existing row that drifts from the model is now preserved in the suite with a warning naming the offending value, instead of being dropped; it still does not count toward coverage.

Internals

  • The CLI banner and the MCP handshake read the version from package.json rather than restating it, and manifest consistency tests pin the name and version across both plugin manifests, the repository URLs and the generated config specifier.
  • The toolchain pin moves from volta to mise (Node 22.23.2, Yarn 4.18.0); CI actions move with it.
  • Both READMEs are rewritten for the current surface, with the Mermaid loop diagram replaced by hand-authored light and dark SVGs.

v0.3.0 — install helper & coverwise 1.2.0 features

Choose a tag to compare

@libraz libraz released this 26 Jun 01:29

Feature release: surfaces the new coverwise 1.2.0 test-design capabilities through the MCP server and adds a one-command install helper for using the server outside the Claude Code plugin. No breaking changes.

What's new

coverwise 1.2.0 features exposed

The MCP input schema now accepts the test-design primitives added upstream in coverwise 1.2.0:

  • Boundary value expansion — declare type ("integer" / "float"), range: [min, max], and optional step on a parameter and the engine injects the off-by-one neighbours (min-1, min, min+1, max-1, max, max+1) instead of you hand-bucketing them.
  • Equivalence classes — tag interchangeable values with a shared class name (e.g. every 4xx is client_error); the result gains a classCoverage block (totalClassTuples / coveredClassTuples / classCoverageRatio) so you can argue "all categories covered" without testing every value.
  • @libraz/coverwise bumped to ^1.2.0.

Install helper (npx)

For using the server outside the Claude Code plugin (Codex CLI, Cursor, Cline, Claude Desktop, …):

npx -y github:libraz/claude-coverwise init        # write the mcpServers.coverwise entry
npx -y github:libraz/claude-coverwise uninstall   # remove it again
  • Interactive writer/remover for Claude Code user (~/.claude.json), project (.mcp.json), and Codex CLI (~/.codex/config.toml) configs.
  • Merges into existing config — preserves every other server and key — and previews the impact ((new) / (merge) / (replace coverwise)) before writing.
  • New bin (claude-coverwise) dispatches init / uninstall / --help / --version, and boots the stdio MCP server with no arguments.

Fixes

  • Structured error payloads (CoverwiseError) now keep their human-readable message (and detail). They were previously dropped because Error.message is non-enumerable and got stripped by JSON.stringify. This is more visible in 1.2.0, where malformed constraint syntax is now a hard CONSTRAINT_ERROR rather than a warning.
  • CI: synced the bin entry into yarn.lock (the --immutable install failed without it) and migrated the JS actions onto the Node 24 runtime (actions/checkout v5, volta-cli/action v5). Tested Node baseline is unchanged.

Docs & tests

  • README / README_ja document the install helper; the bundled skill and /cover-gen command document boundary expansion and equivalence classes.
  • Added tests/init.test.mjs plus CLI-boot and new-feature regression tests (29 tests total).

Compatibility

Drop-in upgrade from 0.2.x. Existing generate / analyze_coverage / extend_tests / estimate_model calls are unchanged; the new parameter fields are all optional. Requires Node ≥ 22.

v0.2.1 — dev infrastructure

Choose a tag to compare

@libraz libraz released this 08 Apr 00:56

Maintenance release: no API changes, no behavior changes. Adds the development infrastructure that should have shipped with the initial release.

What's new

LICENSE

Apache-2.0 (matches upstream coverwise).

End-to-end tests

9 vitest tests in tests/server.test.mjs that spawn mcp/server.mjs and drive it via the official @modelcontextprotocol/sdk Client over stdio — exactly the way Claude Code does. Coverage:

  • tools/list discovery (asserts the four expected tool names)
  • generate happy path
  • generate honouring constraints (no violating combinations in the output)
  • analyze_coverage gap detection on an incomplete suite
  • analyze_coverage with constraints (verifies the constraint-impossible tuples are removed from the universe — the 1.1.0 semantic)
  • extend_tests preserving every existing test
  • estimate_model returning correct parameter statistics
  • Warning surfacing for syntactically malformed constraints
  • scripts/install-deps.mjs no-op smoke test (exits 0 when no env vars set)

CI

GitHub Actions workflow (.github/workflows/ci.yml):

  • Matrix job running on ubuntu-latest and macos-latest: yarn install --immutable, yarn lint, yarn test, plus a launcher-based MCP smoke test that pipes a real tools/list JSON-RPC request through mcp/launch.mjs and asserts every tool name is present.
  • Manifest validation job: shape-checks plugin.json (required fields, mcpServers.coverwise) and marketplace.json (name + non-empty plugins array).

A CI status badge has been added to both READMEs.

Compatibility

No changes to the MCP tool surface, the Skill, the slash commands, the install hook, the launcher, or any external behavior. Drop-in upgrade from 0.2.0.

Full changelog: v0.2.0...v0.2.1

v0.2.0 — initial release

Choose a tag to compare

@libraz libraz released this 07 Apr 15:04

First public release of claude-coverwise, a Claude Code plugin that wraps the coverwise WASM combinatorial test engine as an MCP server, skill, and slash commands. Helps Claude write tests that actually cover every parameter interaction instead of picking "a few reasonable cases" and missing the rest.

What's included

MCP server (mcp/server.mjs)

Four tools backed by @libraz/coverwise@^1.1.0:

Tool Purpose
generate Build a minimal t-wise test suite from parameters + constraints
analyze_coverage Report missing parameter interactions in an existing suite (now constraint-aware)
extend_tests Add the minimum extra tests to reach 100% coverage, preserving existing ones
estimate_model Sanity-check a model (tuple count, estimated tests) before generating

All tools expose weights, seeds, subModels, and maxTests where applicable, so Claude can reach every feature of the engine.

Skill (skills/coverwise/SKILL.md)

Teaches Claude:

  • The constraint DSL grammar (IF/THEN/ELSE, AND/OR/NOT, relational operators, IN, LIKE)
  • Recipes for common patterns (exclusion, dependency, forbidden triples, numeric bucketing)
  • Anti-patterns (over-constraining, type mismatch, raw continuous ranges, strength inflation)
  • The "use the same constraints across generate / analyze_coverage / extend_tests" rule of thumb

Slash commands

Command When to use
/cover-check [path] Audit an existing test file's combinatorial coverage
/cover-gen [target] Build a fresh minimum test matrix for a function or endpoint
/cover-extend [path] Append the minimum new tests to reach full coverage without touching existing ones

Robust startup

  • SessionStart hook (scripts/install-deps.mjs) installs runtime dependencies into `${CLAUDE_PLUGIN_DATA}` (which survives plugin updates) and symlinks them into the plugin root for ESM resolution.
  • Launcher wrapper (mcp/launch.mjs) re-runs the install-deps check synchronously before starting the MCP server, closing a race window where the server could spawn before the hook had finished after a plugin version bump.

Constraint-aware coverage analysis

This release ships against coverwise 1.1.0, whose `analyzeCoverage` accepts an optional `constraints` argument. Pass the same constraint array you used for `generate` and constraint-impossible tuples are removed from the coverage universe — so AI agents can reliably distinguish real coverage gaps from physically impossible combinations and stop chasing the latter.

Install

```
/plugin marketplace add libraz/claude-coverwise
/plugin install claude-coverwise
```

Requires Node 22+ and npm on `PATH`. The SessionStart hook handles dependency installation automatically.

See the README for the full workflow and examples.