Thank you for your interest in contributing to NOVA! This document explains how to set up your environment, run tests, and submit high-quality contributions.
- Getting Started
- Development Setup
- Project Structure
- Running Tests
- Code Style
- How to Contribute
- Pull Request Process
- Reporting Bugs
- Requesting Features
Before contributing, please:
- Read the README and Quickstart
- Check open issues to avoid duplicate work
- For large changes, open an issue first to discuss the approach
# Clone the repository
git clone https://github.com/noivan0/NOVA.git
cd NOVA
# Create a virtual environment
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# Install in editable mode with all dev dependencies
pip install -e ".[dev]"
# Verify the setup
nova --help
python -m pytest tests/ -vnova/
cli/ # CLI entry point (nova run, nova list, ...)
core/ # Core engine
config.py # Config loading (nova.yaml + env vars)
harness.py # Harness YAML parser and dataclasses
orchestrator.py # Execution engine (pipeline / fanout)
checkpoint.py # Resumable run state
evolution.py # Per-run history logging
kb.py # Local knowledge base
providers/ # Pluggable backends
llm.py # OpenAI / Anthropic / Ollama / custom / echo
notifier.py # Telegram / Slack / Discord / webhook / none
publisher.py # file / WordPress / Ghost / none
harnesses/ # Built-in harness examples
research/ # Multi-angle research report
summarizer/ # Long-form content summarizer
data-pipeline/ # CSV data analysis pipeline
docs/ # Documentation
guides/
quickstart.md
providers.md
custom-provider.md
writing-harnesses.md
quality-gates.md
tests/
unit/ # Unit tests (no LLM calls, no network)
integration/ # Integration tests (echo provider only)
# Run all tests (uses echo provider — no API key required)
python -m pytest tests/ -v
# Run only unit tests
python -m pytest tests/unit/ -v
# Run with coverage report
python -m pytest tests/ --cov=nova --cov-report=term-missing
# Run a specific test file
python -m pytest tests/unit/test_harness_loader.py -vAll tests use the echo provider and require no API key.
Never add tests that make real LLM API calls — use echo or mock the provider.
NOVA uses standard Python tooling:
# Format code
black nova/ tests/
# Lint
ruff check nova/ tests/
# Type check
mypy nova/These checks run automatically in CI. All three must pass before a PR is merged.
Guidelines:
- Line length: 100 characters
- Type annotations on all public functions
- Docstrings on all public classes and non-trivial functions
- No external dependencies unless strictly necessary (core must stay minimal)
- Add a class to
nova/providers/llm.pyinheriting fromLLMProvider - Implement
complete(prompt, system, timeout) -> str - Register it in the
get_llm_provider()factory function - Add a test in
tests/unit/that mocks the HTTP call - Document it in
docs/guides/providers.md
Same pattern as LLM — inherit Notifier in nova/providers/notifier.py,
implement send(message) -> bool, register in factory, add test and docs.
Same pattern — inherit Publisher in nova/providers/publisher.py,
implement publish(title, content, tags, metadata) -> Optional[str].
- Create
harnesses/<name>/harness.yaml - Follow the existing examples (research, summarizer, data-pipeline)
- Use only the
echoprovider in any automated test for it - Mention it in the README harness table
- Docs live in
docs/guides/ - Follow the existing style: short intro, code blocks, no jargon
- Update
docs/index links if you add a new page
-
Fork the repository and create a branch from
maingit checkout -b feature/my-feature -
Make your changes — keep each PR focused on one thing
-
Add tests — every new feature or bug fix needs a test
-
Check locally before pushing:
black nova/ tests/ ruff check nova/ tests/ mypy nova/ python -m pytest tests/ -v
-
Write a clear commit message:
feat: add Discord notifier provider fix: checkpoint resume skips wrong phase index docs: add quality gate explanationWe follow Conventional Commits.
-
Open the PR — fill in the PR template, link any related issues
-
CI must pass — all checks run automatically on push
-
One reviewer approval required before merge
Use the Bug Report template.
Please include:
- NOVA version (
nova --version) - Python version
- OS
- Minimal reproduction steps
- Full error output (stack trace)
- Your
nova.yaml(redact API keys)
Use the Feature Request template.
Please describe:
- The problem you're trying to solve
- Your proposed solution
- Alternatives you considered
Open a Discussion on GitHub. We aim to respond within 48 hours.