# Development Guide
This guide covers setting up and developing the CUA (Computer Use Agent) monorepo.
## Project Structure
The project is organized as a monorepo with these main packages:
**Python Packages** (located in `libs/python/`):
- `core/` - Base package with telemetry support
- `computer/` - Computer-use interface (CUI) library
- `agent/` - AI agent library with multi-provider support
- `som/` - Set-of-Mark parser
- `computer-server/` - Server component for VM
- `mcp-server/` - MCP server implementation
- `bench-ui/` - Benchmark UI utilities
**Other Packages**:
- `libs/lume/` - Lume CLI (Swift)
- `libs/typescript/` - TypeScript packages including `cua-cli`
All Python packages are part of a [uv workspace](https://docs.astral.sh/uv/concepts/projects/workspaces/) which manages a shared virtual environment and dependencies.
## Quick Start
1. **Install Lume CLI** (required for local VM management):
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/lume/scripts/install.sh)"
```
2. **Clone the repository**:
```bash
git clone https://github.com/trycua/cua.git
cd cua
```
3. **Create `.env.local`** in the root directory with your API keys:
```bash
ANTHROPIC_API_KEY=your_anthropic_key_here
OPENAI_API_KEY=your_openai_key_here
```
4. **Install Node.js dependencies**:
```bash
npm install -g pnpm # if not already installed
pnpm install
```
5. **Install Python dependencies**:
```bash
pip install uv # if not already installed
uv sync
```
6. **Open workspace in VS Code/Cursor**:
```bash
# For Python development
code .vscode/py.code-workspace
# For Lume (Swift) development
code .vscode/lume.code-workspace
```
7. **Install pre-commit hooks**:
```bash
uv run pre-commit install
```
Why use workspace files?
Using the workspace file is strongly recommended as it:
- Sets up correct Python environments for each package
- Configures proper import paths
- Enables debugging configurations
- Maintains consistent settings across packages
## Python Development
### Requirements
- **Python 3.12+** (see [`pyproject.toml`](./pyproject.toml) for exact requirements)
- **uv** - Python package manager
- **pnpm** - Node.js package manager
### Setup
Install all workspace dependencies with a single command:
```bash
uv sync
```
This installs all dependencies in the virtual environment `.venv`. Each Cua package is installed in editable mode, so changes to source code are immediately reflected.
The `.venv` environment is configured as the default VS Code Python interpreter in [`.vscode/settings.json`](.vscode/settings.json).
### Running Python Scripts
Use `uv run` to execute Python scripts:
```bash
uv run python examples/agent_examples.py
```
Alternatively, activate the virtual environment manually:
```bash
source .venv/bin/activate # On Windows: .venv\Scripts\activate
python examples/agent_examples.py
```
### Running Examples
The Python workspace includes launch configurations for running examples:
- "Run Computer Examples" - Runs computer examples
- "Run Agent Examples" - Runs agent examples
- "SOM" configurations - Various settings for running SOM
- "Run Computer Examples + Server" - Runs both Computer Examples and Server simultaneously
To run examples from VS Code/Cursor:
1. Press F5 or use the Run/Debug view
2. Select the desired configuration
## Code Formatting
The Cua project follows strict code formatting standards to ensure consistency across all packages.
### Python Formatting
#### Tools
- **[Black](https://black.readthedocs.io/)** - Code formatter
- **[isort](https://pycqa.github.io/isort/)** - Import sorter
- **[Ruff](https://beta.ruff.rs/docs/)** - Fast linter and formatter
- **[MyPy](https://mypy.readthedocs.io/)** - Static type checker (configured but not enforced in pre-commit)
All tools are automatically installed when you run `uv sync`.
#### Configuration
Formatting configuration is defined in [`pyproject.toml`](./pyproject.toml). See the `[tool.black]`, `[tool.ruff]`, `[tool.mypy]`, and `[tool.isort]` sections for all settings.
#### Key Rules
- **Line Length**: Maximum of 100 characters
- **Python Version**: Code must be compatible with Python 3.12+
- **Imports**: Automatically sorted (using Ruff's "I" rule)
- **Type Hints**: Required for all function definitions (strict mypy mode)
IDE configuration details
##### Python-specific settings
Python-specific IDE settings are configured in [`.vscode/settings.json`](.vscode/settings.json), including:
- Python interpreter path
- Format on save
- Code actions on save
- Black formatter configuration
- Ruff and MyPy integration
##### JS/TS-specific settings
JavaScript/TypeScript formatting settings are also in [`.vscode/settings.json`](.vscode/settings.json), ensuring Prettier is used for all JS/TS files.
##### Recommended VS Code Extensions
- **Black Formatter** – `ms-python.black-formatter`
- **Ruff** – `charliermarsh.ruff`
- **Pylance** – `ms-python.vscode-pylance`
- **isort** – `ms-python.isort`
- **Prettier** – `esbenp.prettier-vscode`
- **Mypy Type Checker** – `ms-python.mypy-type-checker`
> VS Code will automatically suggest installing the recommended extensions when you open the workspace.
Manual formatting commands
To manually format code:
```bash
# Format all Python files using Black
uv run black .
# Sort imports using isort
uv run isort .
# Run Ruff linter with auto-fix
uv run ruff check .
# Run type checking with MyPy
uv run mypy .
```
#### Pre-commit Validation
Before submitting a pull request, ensure your code passes all formatting checks.
**Recommended: Run all hooks via pre-commit**
```bash
uv run pre-commit run
```
This automatically runs Black, Ruff, isort, Prettier, TypeScript type checking, and other configured hooks. See [`.pre-commit-config.yaml`](.pre-commit-config.yaml) for the complete list.
> **Note:** MyPy is currently disabled in pre-commit hooks due to untyped codebase, but it's still configured and can be run manually.
Run individual tools manually
```bash
# Python checks
uv run black --check .
uv run isort --check .
uv run ruff check .
uv run mypy .
# JavaScript/TypeScript checks
pnpm prettier:check
node ./scripts/typescript-typecheck.js
```
### JavaScript / TypeScript Formatting
The project uses **Prettier** to ensure consistent formatting across all JS/TS/JSON/Markdown/YAML files.
#### Installation
All Node.js dependencies are managed via `pnpm`:
```bash
npm install -g pnpm # if not already installed
pnpm install
```
#### Usage
- **Check formatting** (without making changes):
```bash
pnpm prettier:check
```
- **Automatically format files**:
```bash
pnpm prettier:format
```
- **TypeScript type checking**:
```bash
node ./scripts/typescript-typecheck.js
```
#### VS Code Integration
The workspace config ensures Prettier is used automatically for JS/TS/JSON/Markdown/YAML files. Ensure `editor.formatOnSave` is enabled in VS Code.
### Swift Code (Lume)
For Swift code in the `libs/lume` directory:
- Follow the [Swift API Design Guidelines](https://www.swift.org/documentation/api-design-guidelines/)
- Use SwiftFormat for consistent formatting
- Code will be automatically formatted on save when using the lume workspace
Refer to [`libs/lume/Development.md`](./libs/lume/Development.md) for detailed Lume development instructions.
## Releasing Packages
Cua uses an automated GitHub Actions workflow to bump package versions and publish to PyPI/NPM.
> **Note:** The main branch is currently not protected. If branch protection is enabled in the future, the github-actions bot must be added to the bypass list for these workflows to commit directly.
### Version Bump & Publish Workflow
All packages are managed through a single consolidated workflow: [Bump Version & Publish](https://github.com/trycua/cua/actions/workflows/bump-version.yml)
**Supported packages:**
**Python (PyPI):**
- `pypi/agent` - AI agent library
- `pypi/computer` - Computer-use interface library
- `pypi/computer-server` - Server component for VM
- `pypi/core` - Base package with telemetry
- `pypi/mcp-server` - MCP server implementation
- `pypi/som` - Set-of-Mark parser
**JavaScript/TypeScript (NPM):**
- `npm/cli` - CUA command-line interface
- `npm/computer` - Computer client for TypeScript
- `npm/core` - Core TypeScript utilities
**How to use:**
1. Navigate to the [Bump Version & Publish workflow](https://github.com/trycua/cua/actions/workflows/bump-version.yml)
2. Click the "Run workflow" button in the GitHub UI
3. Select the **service/package** from the dropdown (e.g., `pypi/computer` or `npm/cli`)
4. Select the **bump type** (patch/minor/major) from the second dropdown
5. Click "Run workflow" to start the process
**What happens automatically:**
1. Version is bumped in the package configuration file
2. Changes are committed and pushed to main
3. Package is automatically published to PyPI or NPM
4. For `npm/cli`: Binaries are built and a GitHub release is created
> **Note:** For `pypi/computer`, the workflow also automatically bumps `pypi/agent` to maintain version compatibility.
Local Testing (Advanced)
The Makefile provides utility targets for local testing only:
```bash
# Test version bump locally (dry run)
make dry-run-patch-core
# View current versions
make show-versions
```
**Note:** For production releases, always use the GitHub Actions workflows above instead of running Makefile commands directly.
---
Rolling Back a Version Bump
### Rolling Back a Version Bump
If you need to revert a version bump, follow these steps:
**Step 1: Find the version bump commit**
```bash
# List recent commits
git log --oneline | grep "Bump"
# Example output:
# a1b2c3d Bump cua-core to v0.1.9
```
**Step 2: Revert the commit**
```bash
# Revert the specific commit
git revert
# Example:
# git revert a1b2c3d
```
**Step 3: Delete the git tag**
```bash
# List tags to find the version tag
git tag -l
# Delete the tag locally (use the correct package-specific format)
git tag -d core-v0.1.9
# Delete the tag remotely
git push origin :refs/tags/core-v0.1.9
```
**Step 4: Push the revert**
```bash
git push origin main
```
Per-package tag patterns
Each package uses its own tag format defined in `.bumpversion.cfg`:
- **cua-core**: `core-v{version}` (e.g., `core-v0.1.9`)
- **cua-computer**: `computer-v{version}` (e.g., `computer-v0.4.7`)
- **cua-agent**: `agent-v{version}` (e.g., `agent-v0.4.35`)
- **cua-som**: `som-v{version}` (e.g., `som-v0.1.3`)
- **cua-computer-server**: `computer-server-v{version}` (e.g., `computer-server-v0.1.27`)
- **cua-mcp-server**: `mcp-server-v{version}` (e.g., `mcp-server-v0.1.14`)