Contribute¶
These pages are for whoever changes the project, including the agent working on a contributor's behalf. The rules for issues and pull requests, and where a fix belongs, are in CONTRIBUTING.md; AGENTS.md carries the conventions and the gates every pull request passes; the skills under .agents/skills/ carry the task procedures. SECURITY.md says how to report a vulnerability privately, and the security model is the page such a report argues against.
Local development¶
The pull-request gate, the same commands CI runs:
uv sync --all-extras --all-groups # dev and docs tooling
uv run pre-commit install # hooks, once per clone
uv run pytest -x -q # tests
uv run ruff check --fix . && uv run ruff format . # lint and format
uv run mypy src/ tests/ # type-check
CI runs the tests on Python 3.11 through 3.14; 3.14 also collects branch coverage and enforces the 80% total and patch coverage thresholds. To reproduce that run: uv run --python 3.14 pytest --cov --cov-report=xml --durations=20.
Moving a clone¶
uv sync writes .venv/bin/* scripts with absolute shebangs. After moving the repository, uv run pytest fails with ModuleNotFoundError: No module named 'fastmcp'. Recreate the environment:
rm -rf .venv
uv sync --all-extras --all-groups
uv.lock after a template update¶
When a template update adds a dependency, the uv sync --locked step in CI fails against the stale lockfile. Run uv lock and commit the refreshed uv.lock with the update. CI never rewrites uv.lock in its own workspace, so lockfile drift shows as a red install step with a clear message.
After scaffolding¶
Once, after copier copy and gh repo create --push:
- Fill in the
DOMAIN-*blocks inREADME.mdandAGENTS.md. TheGENERATED-*regions are not yours: the generators own them and rewrite them on every run. - Configure the GitHub secrets below.
- Install the tooling and the hooks (the first two commands above).
- Run the gate; push the first commit. CI should be green.
GitHub secrets¶
The workflows read two required repository secrets and one optional token. Configure them under Settings → Secrets and variables → Actions, or with gh secret set:
| Secret | Used by | How to generate |
|---|---|---|
RELEASE_TOKEN |
release-prepare.yml, release.yml, copier-update.yml, renovate.yml, bootstrap.yml |
A fine-grained personal access token from https://github.com/settings/personal-access-tokens/new with contents: write, pull_requests: write and administration: write (bootstrap applies the repository rulesets, auto-merge, the security settings and the About block). It must belong to a repository admin: the shipped rulesets grant bypass to the admin role, and the tag and GitHub release that knope creates after a release pull request merges rely on it. Scoped to this repository. |
SONAR_TOKEN |
ci.yml |
https://sonarcloud.io: after importing the repository, open Administration → Analysis Method. Turn Automatic Analysis off first, because SonarQube Cloud refuses a CI scan while it is on; choosing GitHub Actions then shows the token. Until the secret exists, CI skips the scan. |
CLAUDE_CODE_OAUTH_TOKEN |
claude.yml |
Optional. Run claude setup-token locally; configure it only for @claude or opted-in automatic review. |
gh secret set RELEASE_TOKEN
gh secret set SONAR_TOKEN
# Optional: enables @claude and opted-in automatic review.
gh secret set CLAUDE_CODE_OAUTH_TOKEN
GITHUB_TOKEN is provided by GitHub; nothing to configure. Dependency updates come from Renovate (renovate.yml), which reuses RELEASE_TOKEN, maintains uv.lock and merges patch and minor bumps once CI Success is green. bootstrap.yml enables auto-merge, applies the rulesets under .github/rulesets/, turns on private vulnerability reporting and Dependabot alerts, and fills the repository's About block from pyproject.toml on the first push; repository protection has the per-branch posture. GitHub Actions versions are updated in the template and arrive through template updates, not per repository.
The other pages here¶
- Documentation structure: where documentation goes and who owns it.
- Release process: how a release is cut and what it publishes.
- Template updates: applying the weekly template update.
- Repository protection: rulesets, required checks and bypass.
- Integration branches: landing an epic as one merge.