Doover CLI Reference
This skill provides a complete reference for the doover app CLI commands used to create, develop, test, and deploy Doover applications.
Overview
The Doover CLI provides commands for the full application lifecycle:
| Command | Purpose |
|---|---|
doover app create | Create a new app from template |
doover app run | Run app locally with simulators |
doover app build | Build Docker image |
doover app publish | Deploy to Doover platform |
doover app test | Run pytest tests |
doover app lint | Check code with ruff |
doover app format | Format code with ruff |
doover app channels | Debug channel data |
App Creation
doover app create
Create a new application using the interactive wizard.
doover app create --name my-app --description "My application description"
Options
| Option | Required | Description |
|---|---|---|
--name TEXT | Yes | Application name (snake_case recommended) |
--description TEXT | Yes | Short description of the app |
--git / --no-git | No | Initialize git repository |
--container-registry | No | Registry: ghcr.io/getdoover, ghcr.io/other, DockerHub (spaneng), DockerHub (other) |
--owner-org-key TEXT | No | Organization key for ownership |
--container-profile TEXT | No | Container registry profile |
Examples
# Basic creation doover app create --name temperature-monitor --description "Monitor temperature sensors" # With git initialization doover app create --name my-app --description "My app" --git # Specify container registry doover app create \ --name my-app \ --description "My app" \ --container-registry "ghcr.io/getdoover" # With organization ownership doover app create \ --name my-app \ --description "My app" \ --owner-org-key "org-uuid-here"
Generated Structure
The command creates a complete project:
my-app/ ├── src/my_app/ │ ├── __init__.py │ ├── application.py │ ├── app_config.py │ ├── app_ui.py │ └── app_state.py ├── simulators/ │ ├── sample/ │ │ ├── main.py │ │ ├── Dockerfile │ │ └── pyproject.toml │ ├── docker-compose.yml │ └── app_config.json ├── tests/ │ ├── __init__.py │ └── test_imports.py ├── doover_config.json ├── pyproject.toml ├── Dockerfile └── README.md
Local Development
doover app run
Run the application locally using docker-compose from the simulators directory.
doover app run
Options
| Option | Default | Description |
|---|---|---|
[REMOTE] | None | Remote host to run on |
--port INTEGER | 2375 | Port for remote connection |
Examples
# Run locally (most common) doover app run # Run on remote device doover app run 192.168.1.100 # Run on remote with custom port doover app run 192.168.1.100 --port 2376 # Pass additional docker-compose arguments doover app run -- --build doover app run -- -d # Run detached
How It Works
- •Looks for
simulators/docker-compose.yml - •Runs
docker compose upwith the specified services - •Services typically include:
- •
device_agent- Doover device agent - •Simulator services - Generate test data
- •Application - Your app under development
- •
Stopping
Press Ctrl+C to stop all services, or if running detached:
cd simulators && docker compose down
Build and Publish
doover app build
Build the Docker image for your application.
doover app build
Options
| Option | Default | Description |
|---|---|---|
[APP_FP] | . | Path to application directory |
--buildx / --no-buildx | --buildx | Use docker buildx for multi-platform |
Examples
# Build current directory doover app build # Build specific app doover app build /path/to/my-app # Build without buildx (single platform) doover app build --no-buildx # Pass additional docker build arguments doover app build -- --no-cache
Build Arguments
Build arguments are read from doover_config.json:
{
"my_app": {
"build_args": "--platform linux/amd64,linux/arm64"
}
}
doover app publish
Publish your application to the Doover platform and container registry.
doover app publish
Options
| Option | Default | Description |
|---|---|---|
[APP_FP] | . | Path to application directory |
--skip-container / --no-skip-container | --no-skip-container | Skip container build/push |
--staging / --no-staging | --no-staging | Force staging mode |
--export-config / --no-export-config | --export-config | Export config before publishing |
--buildx / --no-buildx | --buildx | Use docker buildx |
--profile TEXT | None | Config profile for authentication |
Examples
# Full publish (build, push, update) doover app publish # Update config only (skip container) doover app publish --skip-container # Publish to staging doover app publish --staging # Don't regenerate config doover app publish --no-export-config # Use specific profile doover app publish --profile production
Publish Process
- •Exports configuration (regenerates
doover_config.json) - •Builds Docker image
- •Pushes image to configured registry
- •Updates application on Doover platform
Testing and Quality
doover app test
Run pytest tests on your application.
doover app test
Options
| Option | Default | Description |
|---|---|---|
[APP_FP] | . | Path to application directory |
Additional arguments are passed to pytest.
Examples
# Run all tests doover app test # Run with verbose output doover app test -- -v # Run specific test file doover app test -- tests/test_application.py # Run tests matching pattern doover app test -- -k "test_config" # Show print statements doover app test -- -s # Run tests in specific app doover app test /path/to/my-app
Test File Structure
# tests/test_imports.py
def test_import_app():
from my_app.application import MyApplication
assert MyApplication
def test_config():
from my_app.app_config import MyConfig
config = MyConfig()
assert isinstance(config.to_dict(), dict)
def test_ui():
from my_app.app_ui import MyUI
ui = MyUI()
components = ui.fetch()
assert len(components) > 0
def test_state():
from my_app.app_state import MyState
state = MyState()
assert state.state_machine.state == "initial"
doover app lint
Run the ruff linter to check code quality.
doover app lint
Options
| Option | Default | Description |
|---|---|---|
[APP_FP] | . | Path to application directory |
--fix / --no-fix | --no-fix | Auto-fix linting issues |
Examples
# Check for issues doover app lint # Auto-fix issues doover app lint --fix # Lint specific app doover app lint /path/to/my-app # Lint and fix specific app doover app lint /path/to/my-app --fix
Common Issues
| Code | Issue | Fix |
|---|---|---|
| F401 | Unused import | Remove or use the import |
| F841 | Unused variable | Remove or prefix with _ |
| E501 | Line too long | Break into multiple lines |
| E302 | Expected 2 blank lines | Add blank lines between functions |
doover app format
Format code using ruff formatter.
doover app format
Options
| Option | Default | Description |
|---|---|---|
[APP_FP] | . | Path to application directory |
--fix / --no-fix | --no-fix | Apply formatting fixes |
Examples
# Check formatting (dry run) doover app format # Apply formatting doover app format --fix # Format specific app doover app format /path/to/my-app --fix
Debugging
doover app channels
Open the channel viewer in your browser for debugging published data.
doover app channels
Options
| Option | Default | Description |
|---|---|---|
--host TEXT | localhost | Host to connect to |
--port INTEGER | 49100 | Port for channel viewer |
Examples
# Open local channel viewer doover app channels # Connect to specific host doover app channels --host 192.168.1.100 # Use custom port doover app channels --port 8080
Usage
- •Run your app with
doover app run - •Open channel viewer with
doover app channels - •View real-time channel data in your browser
- •Debug data format and timing issues
Workflow Examples
New App Development
# 1. Create new app doover app create --name sensor-monitor --description "Monitor sensors" cd sensor-monitor # 2. Edit code # ... modify src/sensor_monitor/*.py # 3. Run locally doover app run # 4. Debug channels (in another terminal) doover app channels # 5. Run tests doover app test # 6. Check code quality doover app lint --fix doover app format --fix # 7. Publish when ready doover app publish
Iterative Development
# Run in background doover app run -- -d # Make changes to code # ... # Rebuild and restart cd simulators && docker compose up -d --build my_app # View logs docker compose logs -f my_app # Stop when done docker compose down
CI/CD Pipeline
# Install dependencies uv sync # Run linting doover app lint if [ $? -ne 0 ]; then exit 1; fi # Run tests doover app test -- -v if [ $? -ne 0 ]; then exit 1; fi # Build image doover app build # Publish to staging doover app publish --staging # Publish to production doover app publish --profile production
Remote Development
# Deploy to remote device for testing doover app run 192.168.1.100 # View remote logs ssh device "docker logs -f my_app" # Publish directly to device doover app build docker save my_app | ssh device "docker load"
Configuration Export
Regenerating Config
After modifying app_config.py, regenerate doover_config.json:
# Using the project script uv run export-config # Or directly uv run python -c "from my_app.app_config import export; export()"
Verifying Config
# Check JSON is valid python -m json.tool doover_config.json > /dev/null # View generated schema cat doover_config.json | jq '.my_app.config_schema'
CLI Profiles
Profiles configure which Doover environment to use. The default profile is dv2.
Setting the Default Profile
Set via environment variable (recommended):
# Add to ~/.bashrc or ~/.zshrc export DOOVER_PROFILE=dv2
Per-Command Profile
Override for a single command:
doover app publish --profile dv2 doover app publish --profile staging doover app publish --profile production
Available Profiles
| Profile | Description |
|---|---|
dv2 | Default Doover environment |
Troubleshooting
Build Failures
# Clean Docker cache docker builder prune # Rebuild without cache doover app build -- --no-cache # Check Dockerfile syntax docker build --check .
Run Failures
# Check container logs cd simulators && docker compose logs # Verify compose file docker compose config # Check port conflicts lsof -i :49100
Test Failures
# Run with verbose output doover app test -- -v --tb=long # Run single test for debugging doover app test -- tests/test_imports.py::test_config -v
Publish Failures
# Verify authentication doover auth status # Check registry access docker login ghcr.io # Test build locally first doover app build