| # Contributing to DeepBoner | |
| Thank you for your interest in contributing to DeepBoner! This document provides guidelines and instructions for contributing to the project. | |
| ## Table of Contents | |
| - [Code of Conduct](#code-of-conduct) | |
| - [Getting Started](#getting-started) | |
| - [Development Setup](#development-setup) | |
| - [Making Changes](#making-changes) | |
| - [Testing](#testing) | |
| - [Submitting Changes](#submitting-changes) | |
| - [Code Style](#code-style) | |
| - [Documentation](#documentation) | |
| ## Code of Conduct | |
| Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md) to keep our community welcoming and respectful. | |
| ## Getting Started | |
| ### Prerequisites | |
| - Python 3.11 or higher | |
| - [uv](https://github.com/astral-sh/uv) package manager | |
| - Git | |
| ### Development Setup | |
| 1. **Fork the repository** on GitHub | |
| 2. **Clone your fork**: | |
| ```bash | |
| git clone https://github.com/YOUR_USERNAME/DeepBoner.git | |
| cd DeepBoner | |
| ``` | |
| 3. **Install dependencies**: | |
| ```bash | |
| make install | |
| # or manually: | |
| uv sync --all-extras && uv run pre-commit install | |
| ``` | |
| 4. **Copy the environment template**: | |
| ```bash | |
| cp .env.example .env | |
| # Edit .env with your API keys if needed | |
| ``` | |
| 5. **Verify your setup**: | |
| ```bash | |
| make check | |
| ``` | |
| ## Making Changes | |
| ### Branch Naming Convention | |
| - `feature/short-description` - New features | |
| - `fix/short-description` - Bug fixes | |
| - `docs/short-description` - Documentation changes | |
| - `refactor/short-description` - Code refactoring | |
| - `test/short-description` - Test additions/improvements | |
| ### Commit Message Format | |
| We follow conventional commit messages: | |
| ``` | |
| type(scope): short description | |
| Optional longer description explaining the change. | |
| Closes #123 | |
| ``` | |
| Types: | |
| - `feat` - New feature | |
| - `fix` - Bug fix | |
| - `docs` - Documentation only | |
| - `style` - Code style (formatting, no logic change) | |
| - `refactor` - Code refactoring | |
| - `test` - Adding/updating tests | |
| - `chore` - Build process, tooling, dependencies | |
| Examples: | |
| ``` | |
| feat(tools): add OpenAlex API integration | |
| fix(pubmed): handle empty search results gracefully | |
| docs(readme): update quick start instructions | |
| ``` | |
| ## Testing | |
| ### Running Tests | |
| ```bash | |
| # Run all tests | |
| make test | |
| # Run with coverage | |
| make test-cov | |
| # Run specific test file | |
| uv run pytest tests/unit/utils/test_config.py -v | |
| # Run specific test | |
| uv run pytest tests/unit/utils/test_config.py::TestSettings::test_default_max_iterations -v | |
| ``` | |
| ### Test Markers | |
| - `@pytest.mark.unit` - Unit tests (mocked, fast) | |
| - `@pytest.mark.integration` - Integration tests (real APIs) | |
| - `@pytest.mark.slow` - Slow tests | |
| - `@pytest.mark.e2e` - End-to-end tests | |
| ### Writing Tests | |
| - **TDD preferred**: Write tests first, then implementation | |
| - **Location**: Place unit tests in `tests/unit/` mirroring `src/` structure | |
| - **Mocking**: Use `respx` for httpx, `pytest-mock` for general mocking | |
| - **Fixtures**: Add reusable fixtures to `tests/conftest.py` | |
| Example test structure: | |
| ```python | |
| """Tests for search handler module.""" | |
| import pytest | |
| from src.tools.search_handler import SearchHandler | |
| class TestSearchHandler: | |
| """Tests for SearchHandler class.""" | |
| @pytest.mark.unit | |
| def test_parallel_search_returns_results(self, mock_httpx_client): | |
| """Verify parallel search aggregates results correctly.""" | |
| handler = SearchHandler() | |
| result = handler.search("test query") | |
| assert len(result.evidence) > 0 | |
| ``` | |
| ## Code Style | |
| ### Pre-commit Hooks | |
| Pre-commit hooks run automatically on commit: | |
| - **Ruff** - Linting and formatting | |
| - **MyPy** - Type checking | |
| To run manually: | |
| ```bash | |
| make lint # Check linting | |
| make format # Auto-format code | |
| make typecheck # Type checking | |
| ``` | |
| ### Style Guidelines | |
| 1. **Type hints required** - All functions must have type annotations | |
| 2. **Docstrings** - Use Google-style docstrings for public APIs | |
| 3. **Line length** - Maximum 100 characters | |
| 4. **Imports** - Sorted by isort (handled by ruff) | |
| ### Code Quality Rules | |
| We use Ruff with these rule sets: | |
| - `E` - pycodestyle errors | |
| - `F` - pyflakes | |
| - `B` - flake8-bugbear | |
| - `I` - isort | |
| - `N` - pep8-naming | |
| - `UP` - pyupgrade | |
| - `PL` - pylint | |
| - `RUF` - ruff-specific | |
| ## Submitting Changes | |
| ### Pull Request Process | |
| 1. **Ensure tests pass**: `make check` | |
| 2. **Update documentation** if adding features | |
| 3. **Create PR** against `main` branch | |
| 4. **Fill out the PR template** with: | |
| - Summary of changes | |
| - Related issues | |
| - Test plan | |
| 5. **Wait for review** - Address any feedback | |
| ### PR Checklist | |
| - [ ] Tests added/updated and passing | |
| - [ ] `make check` passes locally | |
| - [ ] Documentation updated (if applicable) | |
| - [ ] Commit messages follow convention | |
| - [ ] No secrets or API keys committed | |
| - [ ] Changes are focused (one concern per PR) | |
| ## Documentation | |
| ### Where to Document | |
| - **README.md** - User-facing overview and quick start | |
| - **CLAUDE.md** - Developer/AI agent reference | |
| - **docs/** - Detailed documentation | |
| - `architecture/` - System design | |
| - `development/` - Developer guides | |
| - `deployment/` - Deployment instructions | |
| - `reference/` - API/config reference | |
| ### Documentation Standards | |
| - Use clear, concise language | |
| - Include code examples where helpful | |
| - Keep diagrams updated (Mermaid format) | |
| - Link to related documentation | |
| ## Getting Help | |
| - **Issues**: Open a GitHub issue for bugs or feature requests | |
| - **Discussions**: Use GitHub Discussions for questions | |
| ## Recognition | |
| Contributors will be recognized in release notes. Thank you for helping make DeepBoner better! | |
| --- | |
| *"Peer-reviewed contributions only. We take evidence-based code very seriously."* 🔬 | |