Scaffold a Claude Code agent harness into any project
Project description
sellier
Scaffold a Claude Code agent harness into any project.
A harness is the system that lets an AI coding agent produce correct, high-quality code consistently. It is four things working together:
- Guidance —
CLAUDE.mdand rules in.claude/rules/that shape what the agent writes. - Guardrails — automated checks (lint, tests, type-checking) wrapped in commands the agent runs.
- Flywheel — a feedback loop: review feedback updates a rule file, reloads it, and re-applies. Every review improves every future conversation.
- Executable Workflows — agents, commands, and skills under
.claude/that turn institutional knowledge into runnable procedures.
sellier ships a generic, slim version of all four. You run it once in your project, then run a single Claude command (/saddle-up) to fill in placeholders with project specifics.
Read the blog post that inspired this tool.
Quick start
Four steps from zero to a project-aware harness:
# 1. Install
pip install sellier
# 2. Scaffold the harness into your project
cd /path/to/your/project
sellier init
Then open the project in Claude Code and run:
# 3. Customize the harness for this project
/saddle-up
# 4. Audit the codebase against the harness standards
/giddy-up
/saddle-up reads your repo (package files, build config, README, branch state) and proposes values for every [PLACEHOLDER] in the harness. You confirm or correct, and Claude rewrites the files.
/giddy-up walks the codebase looking for violations of the rules in .claude/rules/ and reports findings in a single table. It is read-only — you decide what to fix.
What sellier init writes
CLAUDE.md
.claude/
├── settings.json
├── agents/
│ ├── ci-diagnose.md
│ ├── refactor-changes.md
│ ├── review-functional.md
│ ├── review-security.md
│ └── self-review.md
├── commands/
│ ├── giddy-up.md
│ ├── pre-commit.md
│ └── saddle-up.md
├── rules/
│ ├── commits.md
│ ├── design-principles.md
│ ├── security.md
│ └── tests.md
└── skills/
└── implement-change/SKILL.md
CLI reference
sellier init [PATH] # default: current directory
# --force, -f overwrite existing harness files in place
# --clean remove existing .claude/ before writing
sellier version # print installed version
sellier --help
Alternative installs
uv tool install sellier # if you use uv
pipx install sellier # isolated install via pipx
Placeholder syntax
Every project-specific value in the harness is a [PLACEHOLDER] token — uppercase letters, digits, and underscores in square brackets. The /saddle-up command grep-finds and replaces them. Common placeholders:
| Token | Example value |
|---|---|
[PROJECT_NAME] |
"Acme Portal" |
[PROJECT_DESCRIPTION] |
"Internal billing dashboard for Acme accounts" |
[TECH_STACK] |
"TypeScript, Next.js 15, Prisma, PostgreSQL" |
[MAIN_BRANCH] |
"main" |
[TASK_TRACKER] |
"Linear" |
[CI_PROVIDER] |
"GitHub Actions" |
[LINT_COMMAND] |
"pnpm lint" |
[TEST_COMMAND] |
"pnpm test" |
[FRONTEND_TEST_COMMAND] |
"pnpm test:ui" |
[BUILD_COMMAND] |
"pnpm build" |
You can edit the harness afterwards. sellier writes; it does not own the files - you do.
For developers
Stack
- Python 3.14
- uv for environments and packaging
- typer for the CLI
- pytest for tests
- hatchling as the build backend
Layout
src/sellier/
├── __init__.py # version
├── cli.py # typer app — init / version
├── scaffolder.py # template traversal and copy logic
└── templates/ # the harness, shipped as package data
├── CLAUDE.md
└── .claude/...
tests/
├── test_cli.py # typer CliRunner tests
└── test_scaffolder.py # scaffolder logic tests
The templates directory is the deliverable. cli.py and scaffolder.py are thin — most of the value is in the markdown.
Develop
uv sync # install runtime + dev dependencies
uv run pytest # run tests
uv run sellier init /tmp/sellier-smoke # local smoke test
Adding a placeholder
- Use
[NEW_PLACEHOLDER]in the relevant template file. - Add a row to the placeholder table in this README.
- Add an entry to the expected-placeholders list in
.claude/commands/saddle-up.mdso Claude knows to look for it.
Adding a rule, agent, command, or skill
Drop a new file under src/sellier/templates/.claude/{rules,agents,commands,skills}/. It will ship on the next release. Use placeholders for any project-specific text.
Tests
uv run pytest # all tests
uv run pytest tests/test_scaffolder.py # one file
uv run pytest -k init # one keyword
The scaffolder tests assert byte-equality between the templates shipped in the package and what init writes — if you add a binary asset, the test still applies.
Release
Bump the version in pyproject.toml and src/sellier/__init__.py together in a single chore(release): commit, then:
uv build
uv publish
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 sellier-0.1.2.tar.gz.
File metadata
- Download URL: sellier-0.1.2.tar.gz
- Upload date:
- Size: 31.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f493e1ebd5490a88faa2492d0641fe28b0f04e1da6a8b605e04add52e5faa20
|
|
| MD5 |
62e9fbb4c01160b3618f8a24d91a4819
|
|
| BLAKE2b-256 |
84521668e0ecfea6ed0e4cb090ff4c11b6baf042f0a41dcffd709e803ddb1c72
|
File details
Details for the file sellier-0.1.2-py3-none-any.whl.
File metadata
- Download URL: sellier-0.1.2-py3-none-any.whl
- Upload date:
- Size: 22.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e8a287833d6e642558cbef338e2d6db0547318107e87894aa85b71a6af69e166
|
|
| MD5 |
de4054d8201b763b364bd742b91719b4
|
|
| BLAKE2b-256 |
91afcde6949a43f2f1ef0522200c3d33b7e2082b1861fc27182687a6844973ba
|