# qikly

Builds a test suite from acceptance criteria, then repairs the code in a loop while the coding agent stays blind to those criteria.

- MCP server · `type=mcp` · Claude Code, Codex, Cursor, GitHub Copilot, Windsurf (Devin Desktop), Cline, Zed, Gemini CLI · ★ 18
- Author: gal-a
- License: Apache-2.0 · policy=link-only · description only; the file stays with the author
- Source: https://github.com/gal-a/qikly
- Updated: 2026-10-19
- HTML: https://affpapa.org/en/nevibecode/mcp/qikly

## What it does

qikly splits the job between two agents. One derives tests from acceptance criteria in the spec. The other edits code and gets no look at what the tests assert. That gap is the whole point: nobody tunes the checks to match the implementation, because the author of the code never read them. A constraint surfaces as a failing test during the run, not as a hand-written hint.

From your project root the work runs in three steps. `qikly --score my_module.py` plants faults in a copy of your code and reports the ones your tests miss. `qikly --scaffold my_module.py` drafts a spec in `inputs_private/config/tasks/MY_MODULE_VERIFY.yaml`. `qikly --tasks my_module.py` runs the repair loop. Steps 2 and 3 call a model, so they need a key from Google Gemini (free tier), Anthropic or OpenAI.

The spec agent works from your README and docstrings, not your source, so a drafted criterion can ask for behaviour the code does not have. Read the answers in `MY_MODULE_VERIFY.yaml` and rewrite the ones you disagree with. Also make sure the suite passes on its own before you start: qikly invokes it through `python -m pytest`, and a missing package or wrong Python version halts step 1 with it.

## Requirements
- Needs: Python and uv (commands run via uvx)
- Environment variables: `QIKLY_PROJECT_ROOT` — keys and tokens: ask the human for the values, never commit them or put them in shared files.

## Install

### Claude Code (native platform)

**Platform CLI**
```bash
claude mcp add --env QIKLY_PROJECT_ROOT=<QIKLY_PROJECT_ROOT> --transport stdio qikly -- uvx qikly
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from qikly <command>

### Codex

**Platform CLI**
```bash
codex mcp add qikly --env QIKLY_PROJECT_ROOT=<QIKLY_PROJECT_ROOT> -- uvx qikly
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from qikly <command>

### Cursor

**Config file**
File `.cursor/mcp.json`:
```json
{
    "mcpServers": {
        "qikly": {
            "command": "uvx",
            "args": [
                "qikly"
            ],
            "env": {
                "QIKLY_PROJECT_ROOT": "<QIKLY_PROJECT_ROOT>"
            }
        }
    }
}
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from qikly <command>

### GitHub Copilot

**Config file**
File `.vscode/mcp.json`:
```json
{
    "servers": {
        "qikly": {
            "type": "stdio",
            "command": "uvx",
            "args": [
                "qikly"
            ],
            "env": {
                "QIKLY_PROJECT_ROOT": "<QIKLY_PROJECT_ROOT>"
            }
        }
    }
}
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from qikly <command>

### Gemini CLI

**Platform CLI**
```bash
gemini mcp add -e QIKLY_PROJECT_ROOT=<QIKLY_PROJECT_ROOT> qikly uvx qikly
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from qikly <command>

## When to use it
- find faults your existing tests never notice
- draft a spec from README and docstrings
- run a repair loop without exposing criteria to the coder
- spot modules whose coverage rests on empty checks
- check test quality in CI with no API key

## Example prompts
- Run `--score` on `my_module.py` and list what my tests miss.
- Draft the spec with `--scaffold my_module.py` and show where each answer came from.
- Run `--tasks my_module.py` until the suite goes green.

## Similar
- [Front-End Checklist](https://affpapa.org/en/nevibecode/mcp/front-end-checklist.md) — MCP server · ★ 74559
- [Keploy](https://affpapa.org/en/nevibecode/mcp/keploy.md) — MCP server · ★ 18727
- [SeleniumBase MCP](https://affpapa.org/en/nevibecode/mcp/seleniumbase-mcp.md) — MCP server · ★ 13169
- [mobile-mcp](https://affpapa.org/en/nevibecode/mcp/mobile-mcp.md) — MCP server · ★ 9946
- [e2e](https://affpapa.org/en/nevibecode/mcp/e2e.md) — MCP server · ★ 11912
- [mockserver](https://affpapa.org/en/nevibecode/mcp/mockserver.md) — MCP server · ★ 4996

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
