Thank you for your interest in contributing to Rooben! This guide covers everything you need to get started.
- Fork the repository
- Clone your fork:
git clone https://github.com/YOUR_USERNAME/rooben.git - Install dev dependencies:
pip install -e ".[dev]" - Run tests:
pytest tests/ --ignore=tests/e2e -v --timeout=60 - Verify linting:
ruff check src/ tests/
Rooben follows a spec-driven orchestration architecture. See ARCHITECTURE.md for a full system diagram and module map.
Key concepts:
- Specification — YAML/JSON contract defining deliverables, agents, and acceptance criteria
- Orchestrator — Central engine that drives plan → execute → verify → deliver
- Agents — Pluggable workers (LLM, MCP, HTTP, subprocess transports)
- Verifiers — Test runners + LLM judges that validate task output
- Extensions — pip-installable plugins for agents, templates, and integrations
Core source is in src/rooben/. The Next.js dashboard lives in dashboard/.
- Python 3.11+
- Node 20+ (for dashboard development)
- Docker (for full-stack local dev)
make install # Local Python + Node setup
make test # Run tests (skip E2E)
make test-all # Run all tests including E2E
make lint # Check style with ruff
make fmt # Auto-format with ruff
make dev # Start full stack (API + Dashboard + Postgres) via Docker
make dev-api # Just API + Postgres
make dev-dash # Just Dashboard (assumes API running)- Linter/formatter: Ruff — 100-char line length, Python 3.11 target
- Type hints: Required for all public APIs. Use
from __future__ import annotationsfor forward references. - Models: Use Pydantic
BaseModelfor data structures. - Protocols: Use
typing.Protocolfor extension points (not ABC where possible). - Logging: Use
structlog.get_logger()with structured key-value pairs. - Async: All I/O-bound code should be async. Use
asyncio.gather()for concurrent work.
- Framework: pytest with pytest-asyncio (auto mode)
- Timeout: Default 30s per test
- Structure: Tests mirror source layout in
tests/ - Mocking: Use the mock providers in
tests/helpers.pyfor LLM-dependent tests
# Run a specific test file
pytest tests/test_orchestrator.py -v
# Run tests matching a pattern
pytest tests/ -k "test_circuit" -v
# Skip E2E tests (requires browser)
pytest tests/ --ignore=tests/e2e -v --timeout=60- Implement
AgentProtocolfromsrc/rooben/agents/protocol.py - Add the transport enum value to
AgentTransportinsrc/rooben/spec/models.py - Register the builder in
AgentRegistry._build_agent()(src/rooben/agents/registry.py) - Add tests in
tests/ - Document in
docs/guides/CUSTOM-AGENTS.md
- Implement
LLMProviderprotocol fromsrc/rooben/planning/provider.py - Add provider initialization to CLI (
src/rooben/cli.py) and dashboard factory - Register pricing in
src/rooben/billing/costs.py - Add tests with mock responses
- Implement
Verifierprotocol fromsrc/rooben/verification/verifier.py - Wire into the tiered verification chain (
src/rooben/verification/tiered.py)
- Create a directory under
extensions/(agents, templates, or integrations) - Add a
rooben-extension.yamlmanifest (see existing extensions for schema) - See
docs/guides/CUSTOM-AGENTS.mdfor full packaging guide
- Create a feature branch from
main - Make your changes with clear, focused commits
- Add tests for new functionality
- Run the full test suite:
make test - Run the linter:
make lint - Format your code:
make fmt
- Tests pass (
pytest tests/ --ignore=tests/e2e -v --timeout=60) - Linter passes (
ruff check src/ tests/) - New public APIs have type hints
- Breaking changes documented in PR description
- New features have corresponding tests
Follow conventional commits style:
feat: add Bedrock provider supportfix: handle empty task dependencies in plannerrefactor: extract orchestrator finalization into _finalize_phasedocs: add custom agents guidetest: add circuit breaker integration test
Be respectful, constructive, and collaborative. We're all here to build something great.