Include the piou version, Python version, a minimal CLI that reproduces the problem and the exact command line.
Open an issue to discuss before starting a new feature or a public API change; PRs for those without prior discussion may be closed.
Fork the repo, clone your fork and create a branch. Requires uv.
uv sync --all-extras --all-groups
uv run prek install --hook-type pre-commit --hook-type commit-msg # ruff, uv lock, conventional commit messagesCI runs these on Python 3.10 to 3.15; run them before opening a PR:
uv run ruff check . && uv run ruff format --check .
uv run pyright
uv run pytest
./bin/run-examples.shTUI tests use pytest-textual-snapshot: after an intended UI
change, update the snapshots with uv run pytest tests/tui --snapshot-update and review the SVG diffs.
- Keep the core light:
richis the only required runtime dependency,textualstays behind thetuiextra. Import time is benchmarked in CI (./bin/bench-imports.sh), so keep optional imports lazy. - New behavior comes with tests; parametrize them with
pytest.param(..., id="..."). - Update
docs/andREADME.mdfor user-facing changes. Preview docs withuv run --group docs mkdocs serve.
- Title in Conventional Commits form (
feat:,fix:,docs:, ...); PRs are squash-merged and the title decides the next version bump and changelog entry. - Keep the description short: what changed and why.
AI tools are welcome; AGENTS.md gives them the repo's commands and rules. You remain responsible for your change:
you must understand it and explain it in your own words, in the PR body and in review replies. PRs opened
autonomously by an agent will be closed.
Releases are automatic: every green CI run on master runs cz bump (version and CHANGELOG.md from the commit
messages), tags, creates the GitHub release and publishes to PyPI. Don't bump the version by hand.