{"id":48508358,"url":"https://github.com/libraz/claude-coverwise","last_synced_at":"2026-04-07T17:00:28.879Z","repository":{"id":349788916,"uuid":"1203925164","full_name":"libraz/claude-coverwise","owner":"libraz","description":" Make Claude write tests that actually cover every parameter interaction. Pairwise / t-wise coverage checking and generation as a Claude Code plugin, backed by the   coverwise WASM engine.","archived":false,"fork":false,"pushed_at":"2026-04-07T15:04:09.000Z","size":35,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-07T16:18:14.966Z","etag":null,"topics":["ai-testing","claude-code","claude-code-plugin","combinatorial-testing","covering-array","coverwise","mcp","mcp-server","pairwise","t-wise","test-generation","testing"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/libraz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-07T14:16:23.000Z","updated_at":"2026-04-07T15:01:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/libraz/claude-coverwise","commit_stats":null,"previous_names":["libraz/claude-coverwise"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/libraz/claude-coverwise","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libraz%2Fclaude-coverwise","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libraz%2Fclaude-coverwise/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libraz%2Fclaude-coverwise/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libraz%2Fclaude-coverwise/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/libraz","download_url":"https://codeload.github.com/libraz/claude-coverwise/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libraz%2Fclaude-coverwise/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31520577,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-testing","claude-code","claude-code-plugin","combinatorial-testing","covering-array","coverwise","mcp","mcp-server","pairwise","t-wise","test-generation","testing"],"created_at":"2026-04-07T17:00:19.766Z","updated_at":"2026-04-07T17:00:28.842Z","avatar_url":"https://github.com/libraz.png","language":"JavaScript","readme":"# claude-coverwise\n\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-%E2%89%A522-brightgreen?logo=node.js)](https://nodejs.org/)\n[![Yarn](https://img.shields.io/badge/yarn-4-2C8EBB?logo=yarn)](https://yarnpkg.com/)\n[![Biome](https://img.shields.io/badge/lint-biome-60A5FA?logo=biome)](https://biomejs.dev/)\n[![MCP](https://img.shields.io/badge/protocol-MCP-8A2BE2)](https://modelcontextprotocol.io/)\n[![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-D97757)](https://docs.claude.com/en/docs/claude-code)\n[![powered by coverwise](https://img.shields.io/badge/powered%20by-coverwise-5A67D8)](https://github.com/libraz/coverwise)\n\nPairwise / t-wise combinatorial coverage for AI-written tests, delivered as a Claude Code plugin.\n\nWhen Claude writes tests for code that takes multiple parameters — CLI flags, config options, feature flags, query params, form fields, state machines — it often picks a handful of \"reasonable\" cases and misses interactions. `claude-coverwise` gives Claude the tools and the knowledge to do this properly: build a parameter model, detect uncovered interactions, and generate or extend the minimum test matrix that exercises every combination that matters.\n\nUnder the hood it wraps [**coverwise**](https://github.com/libraz/coverwise), a WASM-first combinatorial test engine, as an MCP server.\n\n## What's in the box\n\n- **MCP server** exposing the coverwise engine (`generate`, `analyze_coverage`, `extend_tests`, `estimate_model`)\n- **Skill** that teaches Claude the constraint DSL, common recipes, and the anti-patterns to avoid\n- **Slash commands** for the three everyday operations:\n  - `/cover-check` — analyze the current test file's combinatorial coverage and list gaps\n  - `/cover-gen` — build a fresh minimum test matrix for a function or endpoint\n  - `/cover-extend` — append the minimum new tests to reach full coverage, leaving existing tests alone\n\n## The loop\n\n```mermaid\ngraph LR\n    A[\"AI-written tests\"] --\u003e B[\"/cover-check\"]\n    B --\u003e C{\"100%?\"}\n    C -- No --\u003e D[\"/cover-extend\"]\n    D --\u003e A\n    C -- Yes --\u003e E[\"Done\"]\n    F[\"New function\"] --\u003e G[\"/cover-gen\"]\n    G --\u003e A\n```\n\nMost combinatorial tools only support generation. coverwise — and therefore this plugin — treats *analyze* and *extend* as first-class operations, which matches how people (and AIs) actually write tests: iteratively, on top of what's already there.\n\n## Install\n\n```\n/plugin marketplace add libraz/claude-coverwise\n/plugin install claude-coverwise\n```\n\nThat's it. On the first Claude Code session after installation, a `SessionStart` hook automatically installs the MCP server's runtime dependencies into `${CLAUDE_PLUGIN_DATA}` — a location that survives plugin updates. The install is idempotent and silent on subsequent sessions.\n\nRequirements:\n\n- **Node ≥ 22** and **npm** on your `PATH` (npm ships with Node; no separate install needed).\n\n### For contributors / local development\n\nClone the repo and install dev dependencies with Yarn 4 (pinned via Volta):\n\n```bash\ngit clone https://github.com/libraz/claude-coverwise\ncd claude-coverwise\nyarn install\n```\n\nThe pinned toolchain (Node 22.21.1, Yarn 4.12.0) is declared in `package.json` under `volta`. [Volta](https://volta.sh/) will apply it automatically.\n\n## How it gets invoked\n\nInstalling the plugin does **not** mean Claude will reach for it on every test. The plugin is designed to stay out of the way for trivial cases and engage when combinatorial coverage actually matters.\n\n**Auto-invoked** — the bundled skill's description matches and Claude decides on its own:\n\n- You ask Claude to write tests for a function / component with **≥ 3 independent parameters** (flags, enums, modes, config options, query params, form fields, state machine inputs).\n- You mention \"pairwise\", \"t-wise\", \"covering array\", \"combinatorial\", or \"test matrix\".\n- The parameter space is obviously large and a hand-written cartesian product would be unreasonable.\n\n**Not auto-invoked** — you'll want to ask or use a slash command:\n\n- Small tests with only 1–2 parameters (correct behavior — pairwise would be overkill).\n- \"Is my existing test suite actually covering everything?\" — Claude doesn't audit existing tests unprompted. Run `/cover-check`.\n- Filling gaps in a suite you wrote by hand. Run `/cover-extend`.\n\n**Explicit commands** — always available:\n\n| Command | When to use |\n|---|---|\n| `/cover-check [path]` | Ask Claude to audit an existing test file's combinatorial coverage |\n| `/cover-gen [target]` | Build a fresh minimum test matrix for a function / endpoint |\n| `/cover-extend [path]` | Append the minimum new tests to reach full coverage without touching existing ones |\n\n### Make it the default for a project\n\nDrop a few lines into your project's `CLAUDE.md` to nudge Claude to consider coverwise whenever it writes tests in this repo:\n\n```markdown\n## Testing\n\nWhen writing tests for functions or components with ≥ 3 input parameters,\nuse the coverwise MCP tools (analyze_coverage / generate / extend_tests)\nto verify combinatorial coverage before finishing. Prefer /cover-check for\nauditing existing tests and /cover-extend for filling gaps. See the\ncoverwise skill for the constraint DSL.\n```\n\nThis raises the plugin from \"opportunistic\" to \"default when applicable\" for that project, without being so aggressive that it triggers on trivial cases.\n\n## Example\n\n\u003e *\"Write tests for `render(theme, density, locale, dir)` where theme ∈ {light, dark, hc}, density ∈ {compact, cozy}, locale ∈ {en, ja, ar}, dir ∈ {ltr, rtl}. Arabic must be RTL; everything else LTR.\"*\n\nClaude calls the `generate` tool with:\n\n```json\n{\n  \"parameters\": [\n    { \"name\": \"theme\",   \"values\": [\"light\", \"dark\", \"hc\"] },\n    { \"name\": \"density\", \"values\": [\"compact\", \"cozy\"] },\n    { \"name\": \"locale\",  \"values\": [\"en\", \"ja\", \"ar\"] },\n    { \"name\": \"dir\",     \"values\": [\"ltr\", \"rtl\"] }\n  ],\n  \"constraints\": [\n    \"IF locale = ar THEN dir = rtl\",\n    \"IF locale IN {en, ja} THEN dir = ltr\"\n  ]\n}\n```\n\nand writes ~9 tests covering every valid 2-way interaction instead of the 36-case cartesian product. The constraint DSL supports `IF/THEN/ELSE`, `AND/OR/NOT`, relational operators, `IN`, and `LIKE` — see the bundled skill for the full grammar and recipes.\n\n## MCP tools\n\n| Tool | Purpose |\n|---|---|\n| `generate` | Build a minimal t-wise test suite from parameters + constraints |\n| `analyze_coverage` | Report missing parameter interactions in an existing suite |\n| `extend_tests` | Add the minimum extra tests to reach 100%, preserving existing ones |\n| `estimate_model` | Sanity-check a model (tuple count, estimated tests) before generating |\n\nAll tools return structured JSON. Uncovered tuples come with human-readable `display` strings and a `reason` that distinguishes real gaps from constraint-excluded combinations.\n\n## Using outside Claude Code\n\nThe MCP server is a plain stdio server and works with any MCP client (Cursor, Cline, Claude Desktop, …). Point your client at `mcp/server.mjs`:\n\n```json\n{\n  \"mcpServers\": {\n    \"coverwise\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/claude-coverwise/mcp/server.mjs\"]\n    }\n  }\n}\n```\n\nafter installing runtime dependencies (`npm install --omit=dev` or `yarn install`) in the project root.\n\n## About coverwise\n\nThe engine underneath is [**coverwise**](https://github.com/libraz/coverwise) — a WASM-first C++17 combinatorial test engine with a pure TypeScript fallback, supporting arbitrary t-wise strength, a full constraint DSL, negative tests, mixed-strength sub-models, boundary values, and equivalence classes. This plugin is a thin shell that exposes its JS API to Claude Code.\n\n## License\n\n[Apache License 2.0](LICENSE)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibraz%2Fclaude-coverwise","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flibraz%2Fclaude-coverwise","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibraz%2Fclaude-coverwise/lists"}