mirror of
https://github.com/omnara-ai/omnara.git
synced 2025-08-12 20:39:09 +03:00
* progress * refactor * backend refactor * test * minor stdio changes * streeeeeaming * stream statuses * change required user input * something * progress * new beginnings * progress * edge case * uuhh the claude wrapper def worked before this commit * progress * ai slop that works * tests * tests * plan mode handling * progress * clean up * bump * migrations * readmes * no text truncation * consistent poll interval * fix time --------- Co-authored-by: Kartik Sarangmath <kartiksarangmath@Kartiks-MacBook-Air.local>
184 lines
6.7 KiB
Markdown
184 lines
6.7 KiB
Markdown
# Claude Code Development Guide for Omnara
|
|
|
|
Welcome Claude! This document contains everything you need to know to work effectively on the Omnara project.
|
|
|
|
## Project Overview
|
|
|
|
Omnara is a platform that allows users to communicate with their AI agents (like you!) from anywhere. It uses the Model Context Protocol (MCP) to enable real-time communication between agents and users through a web dashboard.
|
|
|
|
## Quick Context
|
|
|
|
- **Purpose**: Let users see what their AI agents are doing and communicate with them in real-time
|
|
- **Key Innovation**: Agents can ask questions and receive feedback while working
|
|
- **Architecture**: Separate read (backend) and write (servers) operations for optimal performance
|
|
- **Open Source**: This is a community project - code quality and clarity matter!
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
omnara/
|
|
├── backend/ # FastAPI - Web dashboard API (read operations)
|
|
├── servers/ # FastAPI + MCP - Agent communication server (write operations)
|
|
├── shared/ # Shared database models and infrastructure
|
|
├── omnara/ # Python package directory
|
|
│ └── sdk/ # Python SDK for agent integration
|
|
├── cli/ # Node.js CLI tool for MCP configuration
|
|
├── scripts/ # Utility scripts (JWT generation, linting, etc.)
|
|
├── tests/ # Integration tests
|
|
└── webhooks/ # Webhook handlers (e.g., claude_code.py)
|
|
```
|
|
|
|
## Key Technical Decisions
|
|
|
|
### Authentication Architecture
|
|
- **Two separate JWT systems**:
|
|
1. **Backend**: Supabase JWTs for web users
|
|
2. **Servers**: Custom JWT with weaker RSA (shorter API keys for agents)
|
|
- API keys are hashed (SHA256) before storage - never store raw tokens
|
|
|
|
### Database Design
|
|
- **PostgreSQL** with **SQLAlchemy 2.0+**
|
|
- **Alembic** for migrations - ALWAYS create migrations for schema changes
|
|
- Multi-tenant design - all data is scoped by user_id
|
|
- Key tables: users, user_agents, agent_instances, messages, api_keys
|
|
- **Unified messaging system**: All agent interactions (steps, questions, feedback) are now stored in the `messages` table with `sender_type` and `requires_user_input` fields
|
|
|
|
### Server Architecture
|
|
- **Unified server** (`servers/app.py`) supports both MCP and REST
|
|
- MCP endpoint: `/mcp/`
|
|
- REST endpoints: `/api/v1/*`
|
|
- Both use the same authentication and business logic
|
|
|
|
## Development Workflow
|
|
|
|
### Setting Up
|
|
1. **Always activate the virtual environment first**:
|
|
```bash
|
|
source .venv/bin/activate # macOS/Linux
|
|
.venv\Scripts\activate # Windows
|
|
```
|
|
|
|
2. **Install pre-commit hooks** (one-time):
|
|
```bash
|
|
make pre-commit-install
|
|
```
|
|
|
|
### Before Making Changes
|
|
1. **Check current branch**: Ensure you're on the right branch
|
|
2. **Update dependencies**: Run `pip install -r requirements.txt` if needed
|
|
3. **Check migrations**: Run `alembic current` in `shared/` directory
|
|
|
|
### Making Changes
|
|
|
|
#### Database Changes
|
|
1. Modify models in `shared/models/`
|
|
2. Generate migration:
|
|
```bash
|
|
cd shared/
|
|
alembic revision --autogenerate -m "Descriptive message"
|
|
```
|
|
3. Review the generated migration file
|
|
4. Test migration: `alembic upgrade head`
|
|
5. Include migration file in your commit
|
|
|
|
#### Code Changes
|
|
1. **Follow existing patterns** - check similar files first
|
|
2. **Use type hints** - We use Python 3.12 with full type annotations
|
|
3. **Import style**: Prefer absolute imports from project root
|
|
|
|
#### Testing
|
|
```bash
|
|
make test # Run all tests
|
|
make test-integration # Integration tests (needs Docker)
|
|
```
|
|
|
|
### Before Committing
|
|
1. **Run linting and formatting**:
|
|
```bash
|
|
make lint # Check for issues
|
|
make format # Auto-fix formatting
|
|
```
|
|
|
|
2. **Verify your changes work**:
|
|
- Test the specific functionality you changed
|
|
- Run relevant test suites
|
|
- Check that migrations apply cleanly
|
|
|
|
3. **Update documentation** if you changed functionality
|
|
|
|
## Common Tasks
|
|
|
|
### Working with Messages
|
|
The unified messaging system uses a single `messages` table:
|
|
- **Agent messages**: Set `sender_type=AGENT`, use `requires_user_input=True` for questions
|
|
- **User messages**: Set `sender_type=USER` for feedback/responses
|
|
- **Reading messages**: Use `last_read_message_id` to track reading progress
|
|
- **Queued messages**: Agent receives unread user messages when sending new messages
|
|
|
|
### Adding a New API Endpoint
|
|
1. Add route in `backend/api/` or `servers/fastapi_server/routers.py`
|
|
2. Create Pydantic models for request/response in `models.py`
|
|
3. Add database queries in appropriate query files
|
|
4. Write tests for the endpoint
|
|
|
|
### Adding a New MCP Tool
|
|
1. Add tool definition in `servers/mcp_server/tools.py`
|
|
2. Register tool in `servers/mcp_server/server.py`
|
|
3. Share logic with REST endpoint if applicable
|
|
4. Update agent documentation
|
|
|
|
### Modifying Database Schema
|
|
1. Change models in `shared/models/`
|
|
2. Generate and review migration
|
|
3. Update any affected queries
|
|
4. Update Pydantic models if needed
|
|
5. Test thoroughly with existing data
|
|
|
|
## Important Files to Know
|
|
|
|
- `shared/config.py` - Central configuration using Pydantic settings
|
|
- `shared/models/base.py` - SQLAlchemy base configuration
|
|
- `servers/app.py` - Unified server entry point
|
|
- `backend/auth/` - Authentication logic for web users
|
|
- `servers/fastapi_server/auth.py` - Agent authentication
|
|
|
|
## Environment Variables
|
|
|
|
Key variables you might need:
|
|
- `DATABASE_URL` - PostgreSQL connection
|
|
- `JWT_PUBLIC_KEY` / `JWT_PRIVATE_KEY` - For agent auth
|
|
- `SUPABASE_URL` / `SUPABASE_ANON_KEY` - For web auth
|
|
- `ENVIRONMENT` - Set to "development" for auto-reload
|
|
|
|
## Common Pitfalls to Avoid
|
|
|
|
1. **Don't commit without migrations** - Pre-commit hooks will catch this
|
|
2. **Don't store raw JWT tokens** - Always hash API keys
|
|
3. **Don't mix authentication systems** - Backend uses Supabase, Servers use custom JWT
|
|
4. **Don't forget user scoping** - All queries must filter by user_id
|
|
5. **Don't skip type hints** - Pyright will complain
|
|
|
|
## Debugging Tips
|
|
|
|
1. **Database issues**: Check migrations are up to date
|
|
2. **Auth failures**: Verify JWT keys are properly formatted (with newlines)
|
|
3. **Import errors**: Ensure you're using absolute imports
|
|
4. **Type errors**: Run `make typecheck` to catch issues early
|
|
|
|
## Getting Help
|
|
|
|
- Check existing code for patterns
|
|
- Read test files for usage examples
|
|
- Error messages usually indicate what's wrong
|
|
- The codebase is well-structured - similar things are grouped together
|
|
|
|
## Your Superpowers on This Project
|
|
|
|
As Claude Code, you're particularly good at:
|
|
- Understanding the full codebase quickly
|
|
- Maintaining consistency across files
|
|
- Catching potential security issues
|
|
- Writing comprehensive tests
|
|
- Suggesting architectural improvements
|
|
|
|
Remember: This is an open-source project that helps AI agents communicate with humans. Your work here directly improves the AI-human collaboration experience! |