Thank you for your interest in contributing to Gobbler.
- Fork the repository on GitHub.
- Clone your fork:
git clone https://github.com/YOUR_USERNAME/gobbler.git cd gobbler - Install dependencies:
make dev
- Install pre-commit hooks:
uv run pre-commit install
- Start Docker services when working on web or document conversion:
make start-docker
# Run tests
make test
make test-unit
# Code quality
uv run ruff check src/ tests/ --fix
uv run ruff format src/ tests/
uv run mypy src/
uv run bandit -c pyproject.toml -r src/
uv run pre-commit run --all-filessrc/
gobbler_cli/ # Typer CLI commands
gobbler_core/ # Configuration, converters, providers, utilities
gobbler_relay/ # WebSocket relay for browser extension
gobbler_queue/ # Background job queue
skills/ # AI-agent skill instructions that call the CLI
tests/ # Unit, integration, and end-to-end tests
- Python 3.11+
- Line length: 100 characters
- Google-style docstrings for public functions
- Type annotations for public functions
- Ruff for linting and formatting
- Prefer existing core/provider abstractions over new parallel code paths
- Add converter logic under
src/gobbler_core/converters/. - Add or reuse provider code under
src/gobbler_core/providers/when the converter talks to a backend. - Add a CLI command or option under
src/gobbler_cli/commands/if users need a new workflow. - Add focused unit tests under
tests/unit/. - Update README and docs when the user-facing command surface changes.
The blocking pull-request gate mirrors CI:
uv run pytest tests/unit/ -v \
--cov=src/gobbler_core --cov=src/gobbler_cli \
--cov=src/gobbler_relay --cov=src/gobbler_queue \
--cov-report=term-missing --cov-fail-under=0
uv run ruff format --check src/ tests/
uv run ruff check src/ tests/
uv run --extra docs mkdocs build --strict
# Single file
uv run pytest tests/unit/test_youtube_converter.py -v
# Single test
uv run pytest tests/unit/test_youtube_converter.py::TestVideoIdExtraction::test_extract_video_id_standard_url -vmypy and integration tests are useful additional checks, but the current GitHub workflow treats them as advisory: mypy uses continue-on-error, and integration tests run after pushes to main, not on pull requests.
- Tests pass
- Ruff check and format pass
- Type-checking output was reviewed when relevant (currently advisory in CI)
- Security checks pass when relevant
- Documentation updated for user-facing changes
- Changes are scoped to the requested behavior
- Update
CHANGELOG.mdanddocs/changelog.md. - Keep the version synchronized in
pyproject.toml,src/gobbler_core/__init__.py,src/gobbler_cli/__init__.py,src/gobbler_queue/__init__.py,browser-extension/manifest.json, andbrowser-extension/background.js. - Run the blocking gate above;
tests/unit/test_version_sync.pydetects version drift. - Merge the release commit, tag
vX.Y.Z, and create the GitHub release from that exact commit.
Use Conventional Commits:
feat:New featurefix:Bug fixdocs:Documentationrefactor:Code refactoringtest:Adding testschore:Maintenance