Repository navigation
Releases: libraz/coverwise-mcp
Release list
v0.5.1 — the pairwise_* tools are registered again
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/coverwise1.5.0 → 1.6.0vitest4 → 5, which requiresviteas an explicit peer@biomejs/biome2.5.10 → 2.5.13
v0.5.0 — coverwise-mcp rename & the pairwise_* tool surface
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 initThe 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 explicitparametersarray. - Suites travel as
columnsplus positionalrows, which drop into a table-driven test (test.each,t.Runtables,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_extendreturnsnewRows(just the additions) andbefore(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.jsonrather 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
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 optionalstepon 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
classname (e.g. every 4xx isclient_error); the result gains aclassCoverageblock (totalClassTuples/coveredClassTuples/classCoverageRatio) so you can argue "all categories covered" without testing every value. @libraz/coverwisebumped 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) dispatchesinit/uninstall/--help/--version, and boots the stdio MCP server with no arguments.
Fixes
- Structured error payloads (
CoverwiseError) now keep their human-readablemessage(anddetail). They were previously dropped becauseError.messageis non-enumerable and got stripped byJSON.stringify. This is more visible in 1.2.0, where malformed constraint syntax is now a hardCONSTRAINT_ERRORrather than a warning. - CI: synced the
binentry intoyarn.lock(the--immutableinstall failed without it) and migrated the JS actions onto the Node 24 runtime (actions/checkoutv5,volta-cli/actionv5). Tested Node baseline is unchanged.
Docs & tests
- README / README_ja document the install helper; the bundled skill and
/cover-gencommand document boundary expansion and equivalence classes. - Added
tests/init.test.mjsplus 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
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/listdiscovery (asserts the four expected tool names)generatehappy pathgeneratehonouring constraints (no violating combinations in the output)analyze_coveragegap detection on an incomplete suiteanalyze_coveragewith constraints (verifies the constraint-impossible tuples are removed from the universe — the 1.1.0 semantic)extend_testspreserving every existing testestimate_modelreturning correct parameter statistics- Warning surfacing for syntactically malformed constraints
scripts/install-deps.mjsno-op smoke test (exits 0 when no env vars set)
CI
GitHub Actions workflow (.github/workflows/ci.yml):
- Matrix job running on
ubuntu-latestandmacos-latest:yarn install --immutable,yarn lint,yarn test, plus a launcher-based MCP smoke test that pipes a realtools/listJSON-RPC request throughmcp/launch.mjsand asserts every tool name is present. - Manifest validation job: shape-checks
plugin.json(required fields,mcpServers.coverwise) andmarketplace.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
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.