Clawith/CONTRIBUTING.md

223 lines
7.9 KiB
Markdown

# Contributing to Clawith 🦞
Thanks for your interest in contributing! Whether it's a bug fix, new feature, translation, or documentation improvement — every contribution matters.
## Quick Start
1. **Fork** this repo and clone your fork
2. Set up the dev environment:
```bash
bash setup.sh # Backend + frontend + database
bash restart.sh # Start services → http://localhost:3008
```
3. Create a branch: `git checkout -b my-feature`
4. Make your changes
5. Push and open a Pull Request
## What Can I Contribute?
| Area | Examples |
|------|---------|
| 🐛 Bug fixes | UI glitches, API errors, edge cases |
| ✨ Features | New agent skills, tools, UI improvements |
| 🔧 MCP Integrations | New MCP server connectors |
| 🌍 Translations | New languages or improving existing ones |
| 📖 Documentation | README, guides, code comments |
| 🧪 Tests | Unit tests, integration tests |
**New to the project?** Look for issues labeled [`good first issue`](https://github.com/dataelement/Clawith/labels/good%20first%20issue).
## Bug Reports
When reporting a bug, please include:
- Steps to reproduce
- Expected vs actual behavior
- Clawith version and deployment method (Docker / Source)
- Logs or screenshots if available
**Priority guide:**
| Type | Priority |
|------|----------|
| Core functions broken (login, agents, security) | 🔴 Critical |
| Non-critical bugs, performance issues | 🟡 Medium |
| Typos, minor UI issues | 🟢 Low |
## Feature Requests
Please describe:
- The problem you're trying to solve
- Your proposed solution (if any)
- Why this would be useful
## Pull Request Process
1. **Link an issue** — Create one first if it doesn't exist
2. **Keep it focused** — One PR per feature/fix
3. **Test your changes** — Make sure nothing is broken
4. **Follow code style:**
- Backend: Python — formatted with `ruff`
- Frontend: TypeScript — standard React conventions
5. Use `Fixes #<issue_number>` in the PR description
## Working on Multiple Features
It is common to develop several improvements in one sitting before submitting. Rather than sending one giant PR, please split your work into smaller, focused PRs — this makes review faster and merges cleaner.
### Preferred: one branch per feature from the start
```bash
# Start each new feature from a fresh branch off main
git checkout main && git pull
git checkout -b feat/i18n-emoji-cleanup
# ... develop, commit ...
git checkout main
git checkout -b feat/admin-email-templates
# ... develop, commit ...
```
Each branch becomes one PR. Small, clean, easy to review.
### Already mixed everything into one branch? Split it with `git add -p`
`git add -p` (patch mode) lets you selectively stage individual change *hunks* from a file — perfect for creating several commits from one messy branch.
**Step-by-step example:**
```bash
# Assume your branch is called my-big-branch and has 3 logical changes mixed in.
# Goal: create 3 separate PRs from it.
# --- PR 1: emoji cleanup ---
git checkout -b feat/i18n-emoji-cleanup main
# Interactively stage only the emoji-related hunks from en.json and zh.json:
git add -p frontend/src/i18n/en.json # answer y/n for each hunk
git add -p frontend/src/i18n/zh.json
git commit -m "fix: remove emoji from i18n strings"
git push -u origin feat/i18n-emoji-cleanup
# → open PR
# --- PR 2: hardcoded strings → t() ---
git checkout -b feat/i18n-component-strings main
git add -p frontend/src/pages/AgentDetail.tsx # stage only t() hunk
git add -p frontend/src/components/ChannelConfig.tsx
git commit -m "feat: replace hardcoded UI strings with i18n t() calls"
git push -u origin feat/i18n-component-strings
# → open PR
# --- PR 3: admin improvements ---
git checkout -b feat/admin-improvements main
git checkout my-big-branch -- frontend/src/pages/AdminCompanies.tsx # cherry-pick whole file if clean
git commit -m "feat: improve admin company settings"
git push -u origin feat/admin-improvements
# → open PR
```
**Key commands:**
| Command | What it does |
|---------|-------------|
| `git add -p <file>` | Stage hunks interactively (y = yes, n = no, s = split hunk smaller) |
| `git checkout <branch> -- <file>` | Copy a whole file from another branch |
| `git cherry-pick <commit>` | Apply a single commit to the current branch |
| `git diff main...HEAD -- <file>` | Preview what changed in a specific file vs main |
### Tips
- **Commit early, commit often** on your dev branch — individual commits are much easier to cherry-pick later than one large commit.
- Use descriptive commit messages (e.g. `fix: remove emoji from zh.json`, not `update stuff`).
- If two features touch the same file heavily, submit PR 1 first, wait for it to merge, then rebase PR 2 on `main` before opening it.
## Project Structure
```
backend/
├── app/
│ ├── api/ # FastAPI route handlers
│ ├── models/ # SQLAlchemy models
│ ├── services/ # Business logic
│ └── core/ # Auth, events, middleware
frontend/
├── src/
│ ├── pages/ # Page components
│ ├── components/ # Reusable UI components
│ ├── stores/ # Zustand state management
│ └── i18n/ # Translations
```
## Language Policy
To ensure all contributors can participate effectively, please use **English** for issues, PRs, and code comments.
为了确保所有贡献者都能有效参与,请使用**英语**提交 Issue、PR 和代码注释。
すべてのコントリビューターが効果的に参加できるよう、Issue、PR、コードコメントは**英語**でお願いします。
모든 기여자가 효과적으로 참여할 수 있도록, Issue, PR, 코드 코멘트는 **영어**로 작성해 주세요.
Para garantizar que todos los contribuidores puedan participar de manera efectiva, utilice **inglés** para issues, PRs y comentarios de código.
لضمان مشاركة جميع المساهمين بفعالية، يرجى استخدام **اللغة الإنجليزية** في الـ Issues وطلبات السحب وتعليقات الكود.
## Windows Development
Clawith is primarily developed on Linux/macOS, but can run on Windows with a few adjustments.
### Prerequisites
- **Python 3.11+** — Install from [python.org](https://www.python.org/downloads/) (check "Add to PATH")
- **Node.js 18+** — Install from [nodejs.org](https://nodejs.org/)
- **Docker Desktop** — For PostgreSQL and Redis (recommended over native installs)
### Database & Redis via Docker
```powershell
docker run -d --name clawith-postgres -p 5432:5432 -e POSTGRES_PASSWORD=yourpass -e POSTGRES_DB=clawith postgres:15
docker run -d --name clawith-redis -p 6379:6379 redis:7
```
### Backend Setup
```powershell
cd backend
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
# Create .env (copy from .env.example and adjust DATABASE_URL / REDIS_URL)
# Run database migrations
alembic upgrade head
# Start the server
uvicorn app.main:app --host 0.0.0.0 --port 8000
```
### Frontend Setup
```powershell
cd frontend
npm install
npm run dev
```
### Common Windows Issues
| Issue | Solution |
|-------|----------|
| `UnicodeEncodeError` / GBK encoding | Set `PYTHONUTF8=1` in environment variables, or run `chcp 65001` before starting |
| System proxy intercepting LLM API calls | Set `NO_PROXY=*` or unset `HTTP_PROXY` / `HTTPS_PROXY` in your terminal |
| `uvicorn --reload` crashes with watchfiles | Remove `--reload` flag, or install `watchfiles`: `pip install watchfiles` |
| File path errors with backslashes | Use `pathlib.Path` — the codebase already does this in most places |
> **Note**: The recommended deployment method is Docker (`docker compose up -d`), which works identically on Windows, macOS, and Linux. The instructions above are for local development without Docker.
## Getting Help
Stuck? Open a [Discussion](https://github.com/dataelement/Clawith/discussions) or ask in the related issue. We're happy to help! 🙌