Your coding agent says it is done. Make it prove it.
Project description
DoneCheck: proof-of-done for AI coding agents
Your AI coding agent says it is done. Make it prove it.
Works with Codex, Claude Code, Cursor, OpenCode, local CLIs, and GitHub Actions.
donecheck is a zero-dependency proof-of-done gate for AI-assisted code changes. It scans the changed files, runs the verification command you choose, and writes a small DONECHECK.md receipt before anyone claims the work is finished.
Star it if you want a tiny AI coding agent verification gate you can drop into any repo.
python donecheck.py --cmd "pytest -q"
cat DONECHECK.md
If there are no files and no command, it fails. No evidence, no "done".
Quick Start
Add DoneCheck to a repo using AI coding agents:
pipx install donecheck
donecheck --init --cmd "pytest -q"
donecheck --agent-prompt --cmd "pytest -q"
Then tell Codex, Claude Code, Cursor, or any agent:
Before claiming done, run donecheck and fix anything it reports.
What It Catches
- unfinished markers and placeholder phrases in changed files
- narrow verification that does not mention changed code paths
- proof files that only say tests passed without output, exit code, and timestamp
- stale DoneCheck receipts when files, commands, or base inputs change
- skipped verification as
SKIPPED, not a quiet pass - swallowed Python exceptions and empty JavaScript catch blocks
- accidental literal secrets
- unsafe
eval/exec - failed verification commands and missing evidence when nothing was checked
20 Second Demo
git init demo && cd demo
curl -O https://raw.githubusercontent.com/AtharvaMaik/donecheck/main/donecheck.py
printf 'def charge_card():\n # TODO wire Stripe later\n return True\n' > app.py
git add app.py
python donecheck.py --all
Output:
DoneCheck: FAIL
- unfinished_marker app.py:2 # TODO wire Stripe later
The full receipt is in DONECHECK.md. Fix the file, then run:
python donecheck.py --all --cmd "python -m py_compile app.py"
Now the receipt says PASS and records the command output.
If verification cannot run, say so explicitly:
python donecheck.py --skip-reason "missing DATABASE_URL"
That writes a SKIPPED receipt and exits non-zero.
Use It Anywhere
| Place | Command |
|---|---|
| Local repo | python donecheck.py --cmd "pytest -q" |
| Installed CLI | pipx install donecheck |
| Claude Code / Codex / Cursor | Tell the agent to run DoneCheck before claiming done |
| GitHub Actions | uses: AtharvaMaik/donecheck@v0.1.8 |
To create the GitHub Action workflow in a repo:
donecheck --init --cmd "pytest -q"
GitHub Action
name: donecheck
on: [pull_request]
jobs:
donecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: AtharvaMaik/donecheck@v0.1.8
with:
command: pytest -q
On pull requests, the action scans the PR diff against the base branch, emits GitHub error annotations for findings, and adds the full receipt to the Actions step summary. Outside pull requests, pass args: --all to scan the whole repo.
Agent Prompt
Before claiming done, run:
python donecheck.py --cmd "<project test command>"
If it fails, fix the work and rerun it. Include the DONECHECK.md status in your final answer.
There is also a drop-in skill at skills/donecheck/SKILL.md.
Publish To PyPI
The repo now includes .github/workflows/publish-pypi.yml, which builds on every GitHub release and publishes with PyPI trusted publishing.
Before the first release, add this GitHub repo as a trusted publisher for the donecheck project on PyPI. After that, publishing is just: create a GitHub release.
Why It Exists
AI agents are good at sounding finished. DoneCheck makes them leave evidence:
- changed files
- findings
- commands run
- exit codes
- recent command output
It is not a full linter, security scanner, or test framework. It is the cheap first gate that catches obvious AI-code misses before a human review, CI system, or hosted review bot spends time on them.
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 donecheck-0.1.8.tar.gz.
File metadata
- Download URL: donecheck-0.1.8.tar.gz
- Upload date:
- Size: 9.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59e454ae94bda5b2bd6103d320a7e20f2311407a4602930a8d28e4b62a178e1b
|
|
| MD5 |
5cdfbfd4e13d2d1fc9427d20344bd7b3
|
|
| BLAKE2b-256 |
61ddbfd037761d95dcdea6cc35bb54e9b69ce96fe20afb0bbaf7db89aa2d17bd
|
File details
Details for the file donecheck-0.1.8-py3-none-any.whl.
File metadata
- Download URL: donecheck-0.1.8-py3-none-any.whl
- Upload date:
- Size: 10.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa69a023fcf5dfd8dbd3a400bfc966354e5e56d0af6805b417a25eb767b84a27
|
|
| MD5 |
613a961a293f3f93d13bb186631037dd
|
|
| BLAKE2b-256 |
ee7eb3a3f89833d4487edb669bdd2a052ae2e2db1242b32c2b0a1e0021476689
|