Thanks for your interest! ClawBack welcomes contributions of all kinds — bug fixes, new features, parser improvements, and documentation.
- Check open issues to avoid duplication
- For significant changes, open an issue first to discuss the approach
- All contributions require passing CI (lint + typecheck + tests)
git clone https://github.com/yhyatt/clawback.git
cd clawback
pip install -e ".[dev]"# Full suite (517 tests, no external calls)
pytest
# With coverage
pytest --cov=clawback --cov-report=term
# Oracle edge-case suite (130 cases, no LLM)
pytest -m oracle
# Oracle + LLM confirmation message validation (optional, requires ANTHROPIC_API_KEY)
# Never runs in CI — manual use only
pytest -m oracle --haikuWe use ruff for linting and formatting, and mypy for type checking.
ruff check src tests # lint
ruff format src tests # format
mypy src # type checkAll three must pass before opening a PR. CI will enforce this.
- One PR per concern — keep changes focused
- Write tests — all new parser cases should have oracle coverage
- Update oracle fixtures if you're adding or changing parse behaviour
- Squash commits — we use squash merges; your commit history will be squashed
- Branch naming —
fix/...,feat/...,docs/...,chore/...
The parser (src/clawback/parser.py) is regex-based — intentionally no LLM. If you're adding a new language or currency:
- Add the parse pattern to
parser.py - Add oracle test cases to
tests/fixtures/oracle_cases.json - Run
pytest -m oracleto verify all cases pass
Please do not open a public issue for security vulnerabilities. See SECURITY.md.
By contributing, you agree your code will be licensed under the MIT License.