This guide covers local setup and quality checks for contributors. All changes must pass CI before merge.
- Python 3.14
- Node.js 24
- pre-commit
pip install pre-commit
# or: brew install pre-commitpre-commit installThis installs the hooks from .pre-commit-config.yaml. They run automatically on git commit.
pip install pytest==9.0.2npm cipre-commit run --all-filesmacOS Python.org installer: If you see
SSL: CERTIFICATE_VERIFY_FAILEDwhen pre-commit installs hooks, this is the classic Python.org macOS certificate issue. Run the bundled installer:/Applications/Python 3.xx/Install Certificates.command
pytest tests/ -v --tb=shortnpm testUpdate license headers and NOTICE files:
make update-license
# or: python3 scripts/update_license_files.pyVerify without modifying (useful for CI):
make update-license-check
# or: python3 scripts/update_license_files.py --checkLicense headers are not applied to *.yml or *.yaml files (including GitHub Actions workflows).
The update-license-files hook uses always_run: true in .pre-commit-config.yaml so the script runs on every pre-commit invocation and rescans all header targets (not only when certain file types are staged).
- YAML lint:
yamllint .(uses.yamllint.yml) - Shell lint:
find scripts tests -type f -name '*.sh' -print0 | xargs -0 shellcheck - GitHub Actions lint:
actionlint - Python lint:
ruff check . - Python format:
ruff format --check . - Python type-check:
mypy --strict scripts/ - GitHub Actions lint:
actionlint
The following hooks run on commit (and in CI via the pre-commit job):
| Hook | Scope | Purpose |
|---|---|---|
| yamllint | *.yml, *.yaml |
YAML style and structure |
| shellcheck | Shell scripts | Shell script linting |
| actionlint | GitHub Actions workflows | GitHub Actions workflow linting |
| ruff | Python files (repo-wide) | Python lint (with --fix) |
| ruff-format | Python files (repo-wide) | Python formatting |
| mypy | scripts/**/*.py |
Python type-checking (strict) |
| update-license-files | Scripts, shell, TypeScript tests, NOTICE | Apache 2.0 headers, NOTICE sync |
| pre-commit-hooks | Various | Trailing whitespace, EOF, etc. |
The CI workflow (.github/workflows/ci.yml) runs on every PR to main. See docs/workflows/ci.md for details.
- CI workflow: docs/workflows/ci.md
- Pre-commit config: .pre-commit-config.yaml
- Workflow catalog: docs/workflows/README.md