Skip to main content

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:

  1. GuidanceCLAUDE.md and rules in .claude/rules/ that shape what the agent writes.
  2. Guardrails — automated checks (lint, tests, type-checking) wrapped in commands the agent runs.
  3. Flywheel — a feedback loop: review feedback updates a rule file, reloads it, and re-applies. Every review improves every future conversation.
  4. 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

  1. Use [NEW_PLACEHOLDER] in the relevant template file.
  2. Add a row to the placeholder table in this README.
  3. Add an entry to the expected-placeholders list in .claude/commands/saddle-up.md so 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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sellier-0.1.2.tar.gz (31.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sellier-0.1.2-py3-none-any.whl (22.8 kB view details)

Uploaded Python 3

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

Hashes for sellier-0.1.2.tar.gz
Algorithm Hash digest
SHA256 0f493e1ebd5490a88faa2492d0641fe28b0f04e1da6a8b605e04add52e5faa20
MD5 62e9fbb4c01160b3618f8a24d91a4819
BLAKE2b-256 84521668e0ecfea6ed0e4cb090ff4c11b6baf042f0a41dcffd709e803ddb1c72

See more details on using hashes here.

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

Hashes for sellier-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e8a287833d6e642558cbef338e2d6db0547318107e87894aa85b71a6af69e166
MD5 de4054d8201b763b364bd742b91719b4
BLAKE2b-256 91afcde6949a43f2f1ef0522200c3d33b7e2082b1861fc27182687a6844973ba

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page