Contributing
Welcome! Contributions are warmly appreciated — bug reports, new problem templates, constraint types, documentation improvements, and more.
By participating in this project you agree to abide by the Code of Conduct.
🛠️ Setup
Prerequisites: Python 3.11+, uv.
devenv users: devenv redirects
(uv syncinstalls to.devenv/state/venvinstead of the standard.venv, so ty cannot auto-discover it. Create a gitignoredty.tomlat the project root with:ty.tomltakes full precedence overpyproject.toml, so all three settings are required.)
All common tasks are driven by just:
just test # Run tests with coverage
just lint # Check code style
just fmt # Format code (isort + ruff)
just lint-fix # Auto-fix linting issues
just check # Type checking (ty)
just docs-serve # Serve docs locally
just ci # lint + check + test (full CI suite)
🔁 Workflow
-
Fork the repository and create a branch for your change:
-
Make your changes, then verify everything passes:
-
Commit following Conventional Commits:
| Prefix | Effect |
|---|---|
fix: |
Patch release (0.0.X) |
feat: |
Minor release (0.X.0) |
feat!: / BREAKING CHANGE: |
Major release (X.0.0) |
- Push and open a pull request.
✍️ Code Style
- Line length: 99
- Ruff linter with rules: F, E, I, N, UP, RUF, B, C4, ISC, PIE, PT, PTH, SIM, TID
- Absolute imports only — no relative imports
- All config dataclasses:
@dataclass(frozen=True, kw_only=True)
🏗️ Architecture Guidelines
- Keep the layer separation:
anypinn.corestays pure PyTorch, Lightning stays optional. anypinn.coremust not import fromanypinn.lightning,anypinn.problems, oranypinn.catalog.- If you change the architecture or data flow, update both
CLAUDE.mdandREADME.md.