Thanks for your interest in contributing to Repowise! This guide will help you get started.
- Python 3.11+
- Node.js 20+
- uv (Python package manager)
- Git
# Clone the repo
git clone https://github.com/repowise-dev/repowise.git
cd repowise
# Install Python dependencies (uv workspace — installs all packages)
uv sync --all-packages
# Install web frontend dependencies
npm install
# Build the web frontend
npm run build
# Verify the CLI runs
uv run repowise --version
# Run tests
uv run pytest tests/unit/- Fork the repository
- Create a branch from
main:git checkout -b feat/your-feature
- Make your changes — keep commits focused and well-described
- Run tests before pushing:
uv run pytest tests/unit/ npm run lint npm run type-check
- Push to your fork and open a Pull Request against
main
Use descriptive prefixes:
| Prefix | Purpose |
|---|---|
feat/ |
New features |
fix/ |
Bug fixes |
chore/ |
Maintenance, CI, docs |
refactor/ |
Code restructuring |
We follow Conventional Commits with an
optional scope, e.g. feat(cli): add --resume to init or fix(health): bound duplication detection. Keep the subject line in the imperative mood and under
~72 characters.
repowise/
packages/
core/ # Ingestion pipeline, analysis, generation engine
cli/ # CLI commands (click-based)
server/ # FastAPI API + MCP server
types/ # Shared TypeScript types
ui/ # Shared React UI components
web/ # Next.js frontend
tests/ # Unit and integration tests
docs/ # Documentation
- Python: Formatted with ruff (
ruff format .,ruff check .) - TypeScript: Linted with ESLint (
npm run lint) and type-checked (npm run type-check) - Keep functions small and focused
- Write docstrings for public APIs
-
Create
packages/core/src/repowise/core/providers/llm/<name>.py- Subclass
BaseProviderand implementgenerate(),provider_name,model_name - For local CLI providers, use
asyncio.create_subprocess_exec(nevershell=True), validate user-supplied model names against a safe character set, and resolve paths withPath.resolve() - See
opencode.pyfor a clean reference implementation
- Subclass
-
Register in
registry.py— add to_BUILTIN_PROVIDERSand the_missingpackage map -
Wire up configuration in these files:
rate_limiter.py— addRateLimitConfigtoPROVIDER_DEFAULTSprovider_config.py— add entry toPROVIDER_CATALOGprovider_selection.py— add to_PROVIDER_DEFAULTS,_PROVIDER_ENV,_PROVIDER_SIGNUP, and detectionhelpers.py— add validation invalidate_provider_config()
-
Update the web UI — add to
PROVIDERS,MODEL_PLACEHOLDERS, andPROVIDER_ENV_VARSinprovider-section.tsxandrun-config-form.tsx -
Add tests in
tests/unit/test_providers/— mock the subprocess, test success/error/timeout paths (seetest_codex_cli_provider.pyfor the pattern) -
Write docs —
docs/<NAME>.mdandwebsite/<name>.md, followingdocs/CODEX.mdanddocs/OPENCODE.md.
Adding a new language or LLM provider has a dedicated recipe — see docs/LANGUAGE_SUPPORT.md.
- Add tests for new features and bug fixes
- Place tests in
tests/unit/ortests/integration/ - Run the full suite with
uv run pytest
- Keep PRs focused on a single change
- Write a clear description of what and why
- Reference any related issues
- Ensure CI passes before requesting review
- All PRs require at least one code owner approval
- Use GitHub Issues for bugs and feature requests
- For security vulnerabilities, see SECURITY.md
- For questions and discussion, join us on Discord
By contributing, you agree that your contributions will be licensed under the AGPL-3.0 license.