AI-first testing orchestration that turns test execution into stored, comparable, reproducible evidence and recommendations.
Project description
Nove Test
Continuous testing intelligence layers for AI coding agents.
Stop naive testing — simply running tests and getting pass/fail results.
Add testing intelligence layers on top of your native test engines: structured guidance through coverage-guided testing, regression testing, and fault localization.
Nove Test ships with native test runner wrappers, test result memory, a coverage analyzer, a regression engine, fault localization, and test replay — all under one CLI, all under one JSON contract.
Install · Quick start · Why · For AI agents · Docs · License
Install
One line, Linux and macOS:
curl -fsSL https://raw.githubusercontent.com/Nove-Lab/Nove-Test/main/scripts/install.sh | sh
One line, Windows (PowerShell 5.1+):
irm https://raw.githubusercontent.com/Nove-Lab/Nove-Test/main/scripts/install.ps1 | iex
Both scripts detect your OS/arch, download a signed binary from the latest GitHub Release, verify SHA-256, and install to ~/.local/bin/novetest (Linux/macOS) or %USERPROFILE%\.local\bin\novetest.exe (Windows). Re-running upgrades in place.
Inspect-first (recommended):
# Linux / macOS
curl -fsSL -o install.sh https://raw.githubusercontent.com/Nove-Lab/Nove-Test/main/scripts/install.sh
less install.sh # read it
sh install.sh
# Windows
irm https://raw.githubusercontent.com/Nove-Lab/Nove-Test/main/scripts/install.ps1 -OutFile install.ps1
Get-Content install.ps1 # read it
.\install.ps1
Or download a binary directly:
curl -fsSL -o novetest \
https://github.com/Nove-Lab/Nove-Test/releases/latest/download/novetest-linux-x86_64
curl -fsSL -o novetest.sha256 \
https://github.com/Nove-Lab/Nove-Test/releases/latest/download/novetest-linux-x86_64.sha256
sha256sum -c novetest.sha256
chmod +x novetest && mv novetest ~/.local/bin/
For Python tooling users:
uv tool install novetest # via uv (Astral)
pipx install novetest # via pipx
Quick start
cd your-project # any project — Python, JS, Go, Java, .NET, Rust
novetest init # creates .novetest/, detects the test engine
novetest test # runs your tests, stores the result, prints JSON
novetest status # list stored runs
novetest inspect <id> # full Run Record (passes, failures, coverage, metadata)
novetest compare A B # what changed between runs A and B
novetest localization run --formula ochiai # rank likely buggy files (SBFL)
Every command emits a novetest/v1 JSON envelope on stdout:
{
"version": "novetest/v1",
"verb": "test",
"exit_code": 0,
"data": {
"run_id": "2026-06-10T07:23:14Z-a1b2c3",
"summary": { "total": 42, "passed": 41, "failed": 1, "skipped": 0 },
"results": [
{
"test_id": "tests/test_auth.py::test_login_succeeds_with_valid_credentials",
"outcome": "passed",
"duration_ms": 12
}
]
},
"warnings": [],
"errors": []
}
The JSON shape is stable across all six engines (pytest, jest, JUnit, go test, dotnet, cargo). Your scripts and AI agents see the same envelope regardless of what's underneath.
Why Nove Test?
| You are | Nove Test gives you |
|---|---|
| An AI coding agent | Stable novetest/v1 envelopes — parse JSON, not stderr. Run Records as ground truth — compare your edits against a known baseline. SBFL fault localization — get a ranked list of probable culprit files. |
| A solo developer | One binary, six engines, zero per-engine config. Persistent run history without setting up a database. |
| A team CI integrator | Stable JSON contract across pytest / jest / JUnit / go test / dotnet / cargo. Deterministic regression detection. |
| A test-engine author | Documented, minimal adapter contract. Bring your own engine, get storage and cross-run analysis for free. |
Features
- ✅ Adapters for six native test engines — pytest · jest · JUnit (Maven, Gradle) · go test · dotnet (xUnit / NUnit / MSTest) · cargo
- ✅ Parsers for five coverage formats — coverage.py · istanbul (LCOV) · jacoco · cobertura · with cross-drive normalization on Windows
- ✅ Persistent run records — every execution stored as immutable JSON under
.novetest/ - ✅ Cross-run regression — deterministic deltas between any two runs
- ✅ Fault localization — SBFL (Ochiai, DStar, Op2, Tarantula) across three degradation modes
- ✅ Replay — re-execute a prior run under reconstructed conditions
- ✅ AI-friendly by default —
--output jsonis the default contract;NOVETEST_OUTPUT=jsonenv override - ✅ Single binary — PyApp-wrapped, no Python toolchain required on the user's machine
For AI coding agents
If you're an AI agent invoking Nove Test on a user's project, here's the contract you can rely on:
- One verb, one envelope, one exit code. Every CLI verb emits
{ version: "novetest/v1", verb, exit_code, data, warnings, errors }. Parse JSON; ignore stderr. - The
versionfield is the schema contract. When it ticks tonovetest/v2, the schema may break — until then it won't. - Run IDs are stable references. Use them in subsequent calls (
inspect <id>,compare <A> <B>,localization run --baseline <id>). - Determinism is a first-class goal. A given input project + engine + version produces the same
summaryblock. Differences across runs are user-visible flake, not framework noise. warnings[]is your degradation signal. Adapter quirks, partial coverage, missing tooling — all surface here as structured{ code, message, ... }entries. Match oncodefor programmatic handling.
See docs/ for the full envelope reference and integration patterns.
Status
v0.1.2 — production-ready for Linux, macOS, and Windows.
Stable today:
- All six native test engines and CLI verbs
- The
novetest/v1JSON envelope schema - The on-disk Run Record format under
.novetest/ - Linux (x86_64, aarch64), macOS (universal2), and Windows (x86_64) distribution
Roadmap:
- Rich TTY renderer — tables, colors, and single-line summaries for human use
- Nove Test Console — a dashboard for humans to inspect what AI coding agents are doing through Nove Test
- Nove Test Team — team-scale collaborative test-driven development built on the Nove Test engine
Documentation
User documentation ships in two parallel sets — same flow, same verbs, tuned to two audiences:
- For humans — install, quick start, per-language notes, deeper verbs, troubleshooting. Examples are scannable terminal text with glyph summaries (
✓ ✗ — ⚠ ! ? · ↳). - For AI agents — same flow, same verbs, but every example is a full
novetest/v1JSON envelope with deterministic routing onrecommendations[].category.
Start at docs/ for the audience picker.
License
Nove Test is released under the Apache License 2.0 — see LICENSE.
Free for any use:
- Internal use, CI integration, production deployment, by individuals and organizations of any size
- Forking, modifying, redistributing (with notices preserved)
- Academic and research use, including publishing modifications
The Apache 2.0 patent grant terminates if you initiate patent litigation against Nove Test or its contributors (Apache 2.0 §3).
Enterprise licensing inquiries (custom terms, indemnification, support contracts): admin.nove@gmail.com
Contributing
Pull requests, bug reports, documentation improvements, and adapter contributions for new test engines are all welcome. See CONTRIBUTING.md for how to get started.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file novetest-0.1.3.tar.gz.
File metadata
- Download URL: novetest-0.1.3.tar.gz
- Upload date:
- Size: 2.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
baddff49bab41c0b59fbf9d8ed30bb34235ab8338c022537fe12bc3a19f16fcf
|
|
| MD5 |
e6eee4bf3b16a346b590679c2ea9869a
|
|
| BLAKE2b-256 |
d5e09484c28dddbde837799589e79d25ed868387e5ab71492949401d7876e9b7
|
Provenance
The following attestation bundles were made for novetest-0.1.3.tar.gz:
Publisher:
pypi-publish.yml on Nove-Lab/Nove-Test
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
novetest-0.1.3.tar.gz -
Subject digest:
baddff49bab41c0b59fbf9d8ed30bb34235ab8338c022537fe12bc3a19f16fcf - Sigstore transparency entry: 2112160227
- Sigstore integration time:
-
Permalink:
Nove-Lab/Nove-Test@56ed3f2697afdb97f2763de9d1a8144c4a24a2dc -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Nove-Lab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@56ed3f2697afdb97f2763de9d1a8144c4a24a2dc -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file novetest-0.1.3-py3-none-any.whl.
File metadata
- Download URL: novetest-0.1.3-py3-none-any.whl
- Upload date:
- Size: 2.8 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
797ed577091c19e276c8030501ca031a84925063cac069bdb25625f409cde36f
|
|
| MD5 |
9fd8d73495c55c54801a8a066f8dceaa
|
|
| BLAKE2b-256 |
9128a14cc0ede253f8fa52f03818c0eac5844aef9f4d728c0333f0589a9eb906
|
Provenance
The following attestation bundles were made for novetest-0.1.3-py3-none-any.whl:
Publisher:
pypi-publish.yml on Nove-Lab/Nove-Test
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
novetest-0.1.3-py3-none-any.whl -
Subject digest:
797ed577091c19e276c8030501ca031a84925063cac069bdb25625f409cde36f - Sigstore transparency entry: 2112160263
- Sigstore integration time:
-
Permalink:
Nove-Lab/Nove-Test@56ed3f2697afdb97f2763de9d1a8144c4a24a2dc -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Nove-Lab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@56ed3f2697afdb97f2763de9d1a8144c4a24a2dc -
Trigger Event:
workflow_dispatch
-
Statement type: