Thank you for your interest in contributing to RPAForge! This document provides guidelines and instructions for contributing.
- Code of Conduct
- Getting Started
- Development Setup
- Project Structure
- Coding Standards
- Commit Guidelines
- Pull Request Process
- Testing
- Documentation
This project follows the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to the project maintainers.
- Fork the repository
- Clone your fork locally
- Create a feature branch
- Make your changes
- Submit a pull request
feature/PR-XXX-description- New featuresfix/PR-XXX-description- Bug fixesdocs/description- Documentation changesrefactor/PR-XXX-description- Code refactoringtest/PR-XXX-description- Test additions/updates
Example: feature/PR-007-desktop-ui-library
- Python 3.10 or higher
- Node.js 20 or higher
- Git
- Make (optional, for convenience commands)
# Clone your fork
git clone https://github.com/YOUR_USERNAME/rpaforge.git
cd rpaforge
# Create virtual environment
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install development dependencies
pip install -r requirements-dev.txt
# Install pre-commit hooks
pre-commit install
# Install packages in editable mode
pip install -e packages/core
pip install -e packages/libraries
# Install Studio UI dependencies
cd packages/studio
pnpm installrpaforge/
├── packages/
│ ├── core/ # Core engine (Python)
│ │ ├── src/rpaforge/
│ │ └── tests/
│ ├── libraries/ # RPA libraries (Python)
│ │ ├── src/rpaforge_libraries/
│ │ └── tests/
│ ├── studio/ # Desktop UI (Electron + React)
│ │ ├── electron/
│ │ └── src/
│ └── orchestrator/ # Control Tower (Python FastAPI)
├── docs/ # Documentation
├── plugins/ # Example plugins
├── examples/ # Sample scripts
└── tools/ # Development tools
We follow PEP-8 and strict type checking conventions:
- Style: PEP-8 with 88 character line length (Ruff default)
- Type checking: mypy with strict mode
- Async: asyncio-first where applicable
# Example library
from typing import Any
from rpaforge_libraries.base import Activity
class MyActivity(Activity):
"""Example activity following RPAForge conventions."""
name = "Do Something"
description = "Do something with the provided arguments"
def execute(
self, arg: str, optional: int = 0
) -> dict[str, Any]:
"""Execute the activity.
Args:
arg: Description of arg.
optional: Description of optional.
Returns:
A dictionary with results.
"""
return {"result": arg, "count": optional}- Style: ESLint + Prettier
- Components: Functional components with hooks
- State: Zustand for global state
- Styling: TailwindCSS
// Example component
import { useState } from "react";
import { useStore } from "../stores/processStore";
interface ActivityCardProps {
id: string;
name: string;
onSelect: (id: string) => void;
}
export function ActivityCard({ id, name, onSelect }: ActivityCardProps) {
const [isSelected, setSelected] = useState(false);
const { activities } = useStore();
return (
<div
className={`p-4 border rounded ${isSelected ? "border-blue-500" : ""}`}
onClick={() => {
setSelected(!isSelected);
onSelect(id);
}}
>
{name}
</div>
);
}We follow Conventional Commits:
<type>(<scope>): <description>
[optional body]
[optional footer(s)]
feat: New featurefix: Bug fixdocs: Documentation onlystyle: Code style changes (formatting, etc.)refactor: Code refactoringtest: Adding/updating testschore: Maintenance tasks
feat(core): add breakpoint condition support
Add support for conditional breakpoints using Python expressions.
The condition is evaluated before stopping execution.
Closes #42
fix(libraries): correct selector timeout handling
The timeout was not properly converted from string to seconds.
- Create a branch from
mainfollowing naming convention - Make your changes with clear commit messages
- Add/update tests for your changes
- Update documentation if needed
- Run tests locally:
make test - Run linting:
make lint - Push your branch and create a PR
## Description
[Describe your changes]
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [ ] Unit tests added/updated
- [ ] Integration tests added/updated
- [ ] Manual testing performed
## Checklist
- [ ] Code follows style guidelines
- [ ] Self-review completed
- [ ] Documentation updated
- [ ] Tests pass locally- At least one approval required
- All CI checks must pass
- No merge conflicts
- Squash and merge to
main
# All tests
make test
# Python tests only
pytest packages/core/tests
pytest packages/libraries/tests
# With coverage
pytest --cov=src/rpaforge packages/core/tests
# UI tests
cd packages/studio
npm run test# Python test example
import pytest
from rpaforge.engine.executor import StudioEngine
class TestStudioEngine:
def test_create_process(self):
engine = StudioEngine()
process = engine.create_process("Test Process")
assert process.name == "Test Process"
def test_run_simple_process(self):
engine = StudioEngine()
result = engine.run_string("*** Tasks ***\nTest\n Log Hello")
assert result.suite.tests[0].status == "PASS"# Install docs dependencies
pip install -r requirements-docs.txt
# Serve locally
mkdocs serve
# Build
mkdocs build- Use Markdown for all documentation
- Follow the existing structure
- Include code examples
- Update API reference for new public APIs
- Open a Discussion
- Join our community chat (coming soon)
Thank you for contributing to RPAForge! 🎉