A workflow accelerator that scaffolds AI-assisted coding projects with opinionated documentation and launches Claude Code.
Project description
cleanvibe
Website · cleanvibe.emmaleonhart.com
A tiny Python CLI that scaffolds AI-assisted coding projects and launches Claude Code.
cleanvibe is not a coding tool. It's a state initializer -- it removes the friction between "I want to build something" and "Claude is working inside a well-structured environment." The real value lives in the CLAUDE.md it injects: an opinionated behavior contract that enforces documentation discipline, meaningful commits, and iterative file-based thinking.
Install
pip install cleanvibe
Usage
Create a new project
cleanvibe new my-project
This will:
- Create the directory
my-project/ - Write
CLAUDE.md(workflow rules for AI-assisted development) - Write
README.md(starter documentation) - Write
queue.md(active work queue, pre-seeded with a first-session bootstrap sequence that walks Claude through triaging dropped-in files, inferring the project, interviewing the user, creatingtodo.md, populating the real queue, and pushing to a private GitHub repo) - Write
.gitignore(sensible Python defaults) - Initialize a git repo with an initial commit
- Launch Claude Code inside the project
Clone an existing repo — codebase onboarding
cleanvibe clone https://github.com/user/repo
clone is for onboarding an existing codebase, not bootstrapping a blank
one. It is deliberately different from new:
git clonethe repository- Create and check out a dedicated
cleanvibe-onboardingbranch — the default branch is left untouched - Prepend-or-write an onboarding
CLAUDE.mdandqueue.md: if the repo already has them, the fresh block goes on top (newest first) and the original content is preserved below — re-running just layers another block - Inject
.gitignoreonly if missing. Nodata_lake/(it is a real codebase, nothing was dropped in) and no README overwrite - Commit the onboarding scaffold on the branch
- Launch Claude Code inside the project
The onboarding queue.md is small and focused: read & document the repo,
make existing docs accurate, rewrite CLAUDE.md to the repo's real
development practices, add tests/CI if sparse, then synthesize any existing
planning artifacts and hand off to the repo's own todo.md.
Replicate a paper
cleanvibe replicate takes a clawRxiv reference, an arXiv/alphaxiv
reference, a plain URL to non-arXiv research, or a folder name:
From a clawRxiv paper (skill-first):
cleanvibe replicate https://www.clawrxiv.io/abs/2605.02609
cleanvibe replicate clawrxiv:2605.02609
clawRxiv publishes papers authored autonomously by
AI agents and exposes a JSON API (/api/abs/<id>) that differentiates the
paper content, abstract, and skill file (an agent-runnable replication
recipe). That separation is the purest recipe-first case, so clawRxiv gets its
own dedicated mode. The scaffold fetches all three up front: the paper content
is written to replication_target/source/paper.md (committed), and when
clawRxiv ships a separate skill file it lands at replication_skill.md at the
root (otherwise the recipe is embedded in the content and the queue tells the
agent to extract it). There is no download_paper.py — the API returns
everything in one call — and the generated queue.md/SKILL.md are
skill-first: go live early, run the recipe, verify it against the paper,
check all references, then fill only the gaps. clawRxiv ids look arXiv-shaped,
so a bare id stays arXiv — use a clawrxiv.io URL or clawrxiv:<id> to select
clawRxiv mode.
From an arXiv / alphaxiv paper:
cleanvibe replicate https://arxiv.org/abs/1706.03762
cleanvibe replicate https://www.alphaxiv.org/overview/2201.02177
cleanvibe replicate https://doi.org/10.48550/arXiv.1706.03762
cleanvibe replicate 1706.03762v5
Any arXiv/alphaxiv id or URL is accepted — /abs/, /pdf/, /html/,
/src/, alphaxiv's primary /overview/, /audio/, /forum/, the arXiv
DOI form (doi.org/10.48550/arXiv.<id>), arXiv:<id> citation style,
trailing slugs and query strings all resolve. A pinned vN version is
preserved (recorded in paper.json and used for the download), not silently
dropped. This will:
- Fetch the paper's metadata from the arXiv API (with 429-aware
retry/backoff — arXiv rate-limits, so requests honour
Retry-Afterand back off rather than crashing) - Create
replicating-<paper-slug>/(silently-2/-3if it already exists) - Scaffold a standalone replication project: cleanvibe conventions
(
CLAUDE.md,queue.md,data_lake/) plus the replication structure —SKILL.md(the agent-executable replication plan),download_paper.py(fetches the arXiv LaTeX/e-print source and extracts it toreplication_target/source/, with the PDF as a fallback), the paper's homereplication_target/(gitignored — never indata_lake/; the authors' code is cloned here as a git submodule),paper.json, and.github/workflows/that build a GitHub Pages findings site, a transportable PDF report, and a downloadable ZIP replication package - Initialize a git repo with an initial commit
- Launch Claude Code inside the project
The generated scaffold is built around the efficient, recipe-first path:
- Source, not HTML.
download_paper.pydownloads the arXiv e-print source (arxiv.org/src/<id>) and extracts the.textoreplication_target/source/. The.texis far more token-efficient than the rendered HTML, which embeds figures as huge base64 data-URIs you'd otherwise have to strip. The raw archive is gitignored; the extractedsource/is committed. Thecleanvibe replicatecommand runs this extraction itself as a second commit before launching Claude, so the agent opens onto an already-extracted, already-committed paper. - Consent before running code. Because a replication runs code you didn't
write (the recipe / cloned scripts / a downloaded zip), the generated
queue.md's first step makes the agent stop and get your explicit consent before executing any external/cloned code. Reading the paper, source, and recipe is fine; running third-party code is the gated action. - Find the recipe FIRST. Authors very often ship a reproduction recipe
right in the paper source (usually near the end): a
SKILL.md/AGENTS.md, areproduce.*/replicate.*/run.shscript, a Makefile target, a Dockerfile, or a downloadable replication zip. The generatedqueue.md/SKILL.mdtell the agent to find it (copying a recipe toreplication_skill.md, extracting a zip intoreplication/) and run it first, before any deep paper analysis — then verify its output against the paper, check all the paper's references, and only reimplement the gaps the recipe didn't cover. - Go live early. The agent is told to create a PUBLIC GitHub repo and push near the start, so every commit pushes and Pages/CI build as the work goes — not left local-only.
From a plain URL (research that isn't on arXiv):
cleanvibe replicate https://some-lab.org/papers/cool-thing.pdf
cleanvibe replicate https://openreview.net/forum?id=XXXX
When the argument is a plain http(s) URL that isn't an arXiv/clawRxiv
reference, cleanvibe downloads it as the replication source — the page or
PDF lands in replication_target/source/ (paper.pdf or paper.html,
detected automatically), provenance is recorded in source.json, and the
scaffold's wording reflects that the source is already present. Same
429-aware retry/backoff as arXiv mode. Use it for research hosted on lab
sites, OpenReview, journal pages, or anywhere that isn't arXiv/clawRxiv.
From a folder you fill yourself (manual drop-in mode):
cleanvibe replicate my-paper-replication
When the argument is not an arXiv/alphaxiv reference (and not a URL) it is
treated as a folder name and a manual drop-in project is scaffolded — no
metadata
fetch, no download_paper.py, no paper.json, no network. You drop the
paper PDF(s) into replication_target/ and any datasets/notes into
data_lake/ yourself; the scaffolded CLAUDE.md / queue.md / SKILL.md
/ README.md say so up front, and the first queue step makes the agent
stop and ask you for the paper if replication_target/ is empty rather
than invent one. Injection is non-destructive: you can create the folder,
drop your PDF in, then run cleanvibe replicate ./that-folder — nothing
you put there is overwritten.
Every replication produces three compounding artifacts: the runnable
replication, a published findings report, and the reusable SKILL.md
methodology. See docs/replication_framing.md for the full vision.
Options
cleanvibe new my-project --dry-run # Preview what would be created
cleanvibe new my-project --no-claude # Skip launching Claude Code
cleanvibe clone REPO path --dry-run # Preview what would be done
cleanvibe replicate URL --dry-run # Preview the arXiv replication scaffold
cleanvibe replicate FOLDER --dry-run # Preview the manual drop-in scaffold
cleanvibe replicate URL --no-claude # Scaffold without launching Claude
cleanvibe --version # Show version
Why?
Most people struggle with blank repo paralysis, poor commit hygiene, and AI assistants that ramble without producing durable artifacts. cleanvibe solves this by injecting a disciplined thinking contract into every project from the start.
The CLAUDE.md template enforces:
- Commit early and often with meaningful messages
- No planning-only modes -- all thinking produces files and commits
- Keep documentation up to date as the project evolves
- Use
planning/directories for exploration instead of internal planning modes
Cross-platform
Works on Windows, Linux, and macOS. Zero dependencies beyond Python 3.9+.
Website
Full walkthrough — what cleanvibe is and what each subcommand does — at the
project site (built from pages/ and deployed by GitHub Actions):
https://cleanvibe.emmaleonhart.com/
Stability
As of v1.0.0, cleanvibe commits to the following contract (semantic versioning from here on):
- Subcommands
new,clone,convert, andreplicateare stable. Their core behavior will not change incompatibly within the 1.x line. - Injected files:
newguaranteesCLAUDE.md,README.md,queue.md,.gitignore, anddata_lake/.gitkeep.replicatealways guaranteesSKILL.md,CLAUDE.md,queue.md, andreplication_target/; in arXiv mode it additionally guaranteespaper.jsonanddownload_paper.py; in clawRxiv mode it guaranteespaper.jsonandreplication_target/source/paper.md(andreplication_skill.mdwhen clawRxiv ships a separate skill file) but nodownload_paper.py— the API returns everything in one call. Bothpaper.jsonanddownload_paper.pyare absent by design in manual drop-in mode — there is no metadata to fetch. - Non-destructive by contract:
cloneandconvertnever overwrite existing files —cloneprepends;convertonly injects what is missing.replicatein arXiv mode never errors on a name collision (silent-2/-3suffix); in folder mode it injects only what is missing so a pre-dropped paper is never clobbered. - Template wording may evolve (improvements to the workflow contract are not breaking); the set of guaranteed files and the subcommand contracts above are what 1.x holds stable.
- Zero runtime dependencies remains a hard guarantee for the 1.x line.
License
MIT
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 cleanvibe-1.6.2.tar.gz.
File metadata
- Download URL: cleanvibe-1.6.2.tar.gz
- Upload date:
- Size: 63.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7a47131cd5a785288f80b0eb8440b8d843069a9cfdc23a09d7a33be6bbd3e50
|
|
| MD5 |
5654fed5fcdde42ae08009198cce74db
|
|
| BLAKE2b-256 |
5f65cd4046e409bbc1b451b26a6324be6ebd4fc7a289e8803dd1b1b84c60ef28
|
Provenance
The following attestation bundles were made for cleanvibe-1.6.2.tar.gz:
Publisher:
publish.yml on EmmaLeonhart/cleanvibe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cleanvibe-1.6.2.tar.gz -
Subject digest:
a7a47131cd5a785288f80b0eb8440b8d843069a9cfdc23a09d7a33be6bbd3e50 - Sigstore transparency entry: 1606728733
- Sigstore integration time:
-
Permalink:
EmmaLeonhart/cleanvibe@67018c3867721df63044b12e6f98223d0d367878 -
Branch / Tag:
refs/tags/v1.6.2 - Owner: https://github.com/EmmaLeonhart
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@67018c3867721df63044b12e6f98223d0d367878 -
Trigger Event:
release
-
Statement type:
File details
Details for the file cleanvibe-1.6.2-py3-none-any.whl.
File metadata
- Download URL: cleanvibe-1.6.2-py3-none-any.whl
- Upload date:
- Size: 52.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9afba40760d8979bf2903bf4e2cddaff99095bc09d91e5a479480edecc65c014
|
|
| MD5 |
b6b4250b0c8b648da6a8e636cdc4adfa
|
|
| BLAKE2b-256 |
20888147dda6a84495d3a3427492c155efe50175e20da59a00dbed6ac15f2d15
|
Provenance
The following attestation bundles were made for cleanvibe-1.6.2-py3-none-any.whl:
Publisher:
publish.yml on EmmaLeonhart/cleanvibe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cleanvibe-1.6.2-py3-none-any.whl -
Subject digest:
9afba40760d8979bf2903bf4e2cddaff99095bc09d91e5a479480edecc65c014 - Sigstore transparency entry: 1606728825
- Sigstore integration time:
-
Permalink:
EmmaLeonhart/cleanvibe@67018c3867721df63044b12e6f98223d0d367878 -
Branch / Tag:
refs/tags/v1.6.2 - Owner: https://github.com/EmmaLeonhart
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@67018c3867721df63044b12e6f98223d0d367878 -
Trigger Event:
release
-
Statement type: