Skip to main content

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:

  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

Project details


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.

Supported by

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