Archon/README.md
Rasmus Widing c142dbbc54
feat(cli): Add git repository safety check (#328)
* feat(cli): Add git repository safety check

Add validation to ensure CLI workflows only run from within a git
repository. If the user runs from a subdirectory, the CLI resolves
to the repo root. Running from a non-git directory produces a clear
error message with guidance.

- Add git.findRepoRoot() check before workflow commands
- Bypass check for version/help commands
- Add tests for git repo validation behavior

* docs: Update CLI documentation for git repository requirement

* fix(cli): Improve error handling and tests for git repo check

- Move git.findRepoRoot() inside try-catch block to ensure proper error
  handling and database cleanup on unexpected errors
- Add path existence validation before git check for clearer error messages
- Improve tests: test real git.findRepoRoot behavior instead of mocks
- Add tests for path validation and command categorization logic
2026-01-22 10:00:12 +02:00

1439 lines
39 KiB
Markdown

# Dynamous Remote Coding Agent
Control AI coding assistants (Claude Code, Codex) remotely from Telegram, GitHub, and more. Built for developers who want to code from anywhere with persistent sessions and flexible workflows/systems.
**Quick Start:** [CLI Installation](#cli-installation) • [Server Setup](#server-quick-start) • [AI Assistant Setup](#2-ai-assistant-setup-choose-at-least-one) • [Platform Setup](#3-platform-adapter-setup-choose-at-least-one) • [Usage Guide](#usage)
## Features
- **Multi-Platform Support**: Interact via Telegram, Slack, Discord, GitHub issues/PRs, and more
- **Multiple AI Assistants**: Choose between Claude Code or Codex (or both)
- **Persistent Sessions**: Sessions survive container restarts with full context preservation
- **Codebase Management**: Clone and work with any GitHub repository
- **Flexible Streaming**: Real-time or batch message delivery per platform
- **Generic Command System**: User-defined commands versioned with Git
- **Docker Ready**: Simple deployment with Docker Compose
## CLI Usage
Archon CLI lets you run AI workflows directly from your terminal, without needing a server or messaging platform.
### Setup
**Step 1: Clone and install**
```bash
git clone https://github.com/dynamous-community/remote-coding-agent
cd remote-coding-agent
bun install
```
**Step 2: Make CLI globally available (optional but recommended)**
```bash
cd packages/cli
bun link
```
This creates an `archon` command available from anywhere on your system.
**Step 3: Authenticate with Claude**
```bash
claude /login
```
The CLI uses your existing Claude authentication.
**Step 4: Run workflows**
```bash
# If you ran bun link (recommended)
archon workflow list --cwd /path/to/your/repo
archon workflow run assist --cwd /path/to/your/repo "What does this codebase do?"
# Without bun link (from the repo directory)
bun run cli workflow list --cwd /path/to/your/repo
```
**Note:** Workflow and isolation commands must be run from within a git repository. Running from subdirectories works (resolves to repo root). Version and help commands work anywhere.
**Detailed documentation:** [CLI User Guide](docs/cli-user-guide.md)
---
## Prerequisites
**System Requirements:**
- Docker & Docker Compose (for server deployment)
- [Bun](https://bun.sh) 1.0+ (for local development)
**Platform Support:**
- **macOS**: Apple Silicon (M1/M2/M3) and Intel - fully supported
- **Linux**: x64 and ARM64 - fully supported
- **Windows**: Requires WSL2 (Windows Subsystem for Linux 2) - see [Windows Setup](#windows-wsl2-setup) below
**Accounts Required:**
- GitHub account (for repository cloning via `/clone` command)
- At least one of: Claude Pro/Max subscription OR Codex account
- At least one of: Telegram, Slack, Discord, or GitHub account (for server interaction)
---
## Server Quick Start
### Option 1: Docker (*Not working yet => works when repo goes public*)
```bash
# 1. Get the files
mkdir remote-agent && cd remote-agent
curl -fsSL https://raw.githubusercontent.com/dynamous-community/remote-coding-agent/main/deploy/docker-compose.yml -o docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/dynamous-community/remote-coding-agent/main/deploy/.env.example -o .env
# 2. Configure (edit .env with your tokens)
nano .env
# 3. Run
docker compose up -d --profile <yourprofile>
# 4. Check it's working
curl http://localhost:3000/health
```
### Option 2: Local Development
```bash
# 1. Clone and install
git clone https://github.com/dynamous-community/remote-coding-agent
cd remote-coding-agent
bun install
# 2. Configure
cp .env.example .env
nano .env # Add your tokens
# 3. Start database
docker compose --profile with-db up -d postgres
# 4. Run migrations
psql $DATABASE_URL < migrations/000_combined.sql
# 5. Start with hot reload
bun run dev
# 6. Validate setup
bun run validate
```
### Option 3: Self-Hosted Production
See [Cloud Deployment Guide](docs/cloud-deployment.md) for deploying to:
- DigitalOcean, Linode, AWS EC2, or any VPS
- With automatic HTTPS via Caddy
## Directory Structure
The app uses `~/.archon/` for all managed files:
```
~/.archon/
├── workspaces/ # Cloned repositories (auto-synced before worktree creation)
├── worktrees/ # Git worktrees for isolation
├── archon.db # SQLite database (when DATABASE_URL not set)
└── config.yaml # Optional: global configuration
```
On Windows: `C:\Users\<username>\.archon\`
In Docker: `/.archon/`
See [Configuration Guide](docs/configuration.md) for customization options.
---
## Setup Guide
**Get started:**
```bash
git clone https://github.com/dynamous-community/remote-coding-agent
cd remote-coding-agent
bun install
```
### 1. Core Configuration (Required)
**Create environment file:**
```bash
cp .env.example .env
```
**Set these required variables:**
| Variable | Purpose | How to Get |
|----------|---------|------------|
| `DATABASE_URL` | PostgreSQL connection (optional) | See database options below. Omit to use SQLite |
| `GH_TOKEN` | Repository cloning | [Generate token](https://github.com/settings/tokens) with `repo` scope |
| `GITHUB_TOKEN` | Same as `GH_TOKEN` | Use same token value |
| `PORT` | HTTP server port | Default: `3090` (optional) |
| `ARCHON_HOME` | (Optional) Override base directory | Default: `~/.archon` |
**GitHub Personal Access Token Setup:**
1. Visit [GitHub Settings > Personal Access Tokens](https://github.com/settings/tokens)
2. Click "Generate new token (classic)" → Select scope: **`repo`**
3. Copy token (starts with `ghp_...`) and set both variables:
```env
# .env
GH_TOKEN=ghp_your_token_here
GITHUB_TOKEN=ghp_your_token_here # Same value
```
**Note:** Repository clones are stored in `~/.archon/workspaces/` by default (or `/.archon/workspaces/` in Docker). Set `ARCHON_HOME` to override the base directory.
**Database Setup - Choose One:**
<details>
<summary><b>Option A: SQLite (Default - No Setup Required)</b></summary>
Simply **omit the `DATABASE_URL` variable** from your `.env` file. The app will automatically:
- Create a SQLite database at `~/.archon/archon.db`
- Initialize the schema on first run
- Use this database for all operations
**Pros:**
- Zero configuration required
- No external database needed
- Perfect for single-user CLI usage
**Cons:**
- Not suitable for multi-container deployments
- No network access (CLI and server can't share database across different hosts)
</details>
<details>
<summary><b>Option B: Remote PostgreSQL (Supabase, Neon)</b></summary>
Set your remote connection string:
```env
DATABASE_URL=postgresql://user:password@host:5432/dbname
```
**For fresh installations**, run the combined migration:
```bash
psql $DATABASE_URL < migrations/000_combined.sql
```
This creates 5 tables:
- `remote_agent_codebases` - Repository metadata
- `remote_agent_conversations` - Platform conversation tracking
- `remote_agent_sessions` - AI session management
- `remote_agent_command_templates` - Global command templates
- `remote_agent_isolation_environments` - Worktree isolation tracking
**For updates to existing installations**, run only the migrations you haven't applied yet:
```bash
# Check which migrations you've already run, then apply new ones:
psql $DATABASE_URL < migrations/002_command_templates.sql
psql $DATABASE_URL < migrations/003_add_worktree.sql
psql $DATABASE_URL < migrations/004_worktree_sharing.sql
psql $DATABASE_URL < migrations/006_isolation_environments.sql
psql $DATABASE_URL < migrations/007_drop_legacy_columns.sql
```
</details>
<details>
<summary><b>Option C: Local PostgreSQL (via Docker)</b></summary>
Use the `with-db` profile for automatic PostgreSQL setup:
```env
DATABASE_URL=postgresql://postgres:postgres@postgres:5432/remote_coding_agent
```
**For fresh installations**, database schema is created automatically when you start with `docker compose --profile with-db`. The combined migration runs on first startup.
**For updates to existing Docker installations**, you need to manually run new migrations:
```bash
# Connect to the running postgres container
docker compose exec postgres psql -U postgres -d remote_coding_agent
# Then run the migrations you haven't applied yet
\i /migrations/002_command_templates.sql
\i /migrations/003_add_worktree.sql
\i /migrations/004_worktree_sharing.sql
\i /migrations/006_isolation_environments.sql
\i /migrations/007_drop_legacy_columns.sql
\q
```
Or from your host machine (requires `psql` installed):
```bash
psql postgresql://postgres:postgres@localhost:5432/remote_coding_agent < migrations/002_command_templates.sql
psql postgresql://postgres:postgres@localhost:5432/remote_coding_agent < migrations/003_add_worktree.sql
psql postgresql://postgres:postgres@localhost:5432/remote_coding_agent < migrations/004_worktree_sharing.sql
psql postgresql://postgres:postgres@localhost:5432/remote_coding_agent < migrations/006_isolation_environments.sql
psql postgresql://postgres:postgres@localhost:5432/remote_coding_agent < migrations/007_drop_legacy_columns.sql
```
</details>
---
### 2. AI Assistant Setup (Choose At Least One)
You must configure **at least one** AI assistant. Both can be configured if desired.
<details>
<summary><b>🤖 Claude Code</b></summary>
**Recommended for Claude Pro/Max subscribers.**
**Authentication Options:**
Claude Code supports three authentication modes via `CLAUDE_USE_GLOBAL_AUTH`:
1. **Global Auth** (set to `true`): Uses credentials from `claude /login`
2. **Explicit Tokens** (set to `false`): Uses tokens from env vars below
3. **Auto-Detect** (not set): Uses tokens if present in env, otherwise global auth
**Option 1: Global Auth (Recommended)**
```env
CLAUDE_USE_GLOBAL_AUTH=true
```
**Option 2: OAuth Token**
```bash
# Install Claude Code CLI first: https://docs.claude.com/claude-code/installation
claude setup-token
# Copy the token starting with sk-ant-oat01-...
```
```env
CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat01-xxxxx
```
**Option 3: API Key (Pay-per-use)**
1. Visit [console.anthropic.com/settings/keys](https://console.anthropic.com/settings/keys)
2. Create a new key (starts with `sk-ant-`)
```env
CLAUDE_API_KEY=sk-ant-xxxxx
```
**Set as default assistant (optional):**
If you want Claude to be the default AI assistant for new conversations without codebase context, set this environment variable:
```env
DEFAULT_AI_ASSISTANT=claude
```
</details>
<details>
<summary><b>🤖 Codex</b></summary>
**Authenticate with Codex CLI:**
```bash
# Install Codex CLI first: https://docs.codex.com/installation
codex login
# Follow browser authentication flow
```
**Extract credentials from auth file:**
On Linux/Mac:
```bash
cat ~/.codex/auth.json
```
On Windows:
```cmd
type %USERPROFILE%\.codex\auth.json
```
**Set all four environment variables:**
```env
CODEX_ID_TOKEN=eyJhbGc...
CODEX_ACCESS_TOKEN=eyJhbGc...
CODEX_REFRESH_TOKEN=rt_...
CODEX_ACCOUNT_ID=6a6a7ba6-...
```
**Set as default assistant (optional):**
If you want Codex to be the default AI assistant for new conversations without codebase context, set this environment variable:
```env
DEFAULT_AI_ASSISTANT=codex
```
</details>
**How Assistant Selection Works:**
- Assistant type is set per codebase (auto-detected from `.codex/` or `.claude/` folders)
- Once a conversation starts, the assistant type is locked for that conversation
- `DEFAULT_AI_ASSISTANT` (optional) is used only for new conversations without codebase context
---
### 3. Platform Adapter Setup (Choose At Least One)
You must configure **at least one** platform to interact with your AI assistant.
<details>
<summary><b>💬 Telegram</b></summary>
**Create Telegram Bot:**
1. Message [@BotFather](https://t.me/BotFather) on Telegram
2. Send `/newbot` and follow the prompts
3. Copy the bot token (format: `123456789:ABCdefGHIjklMNOpqrsTUVwxyz`)
**Set environment variable:**
```env
TELEGRAM_BOT_TOKEN=123456789:ABCdefGHI...
```
**Configure streaming mode (optional):**
```env
TELEGRAM_STREAMING_MODE=stream # stream (default) | batch
```
**For streaming mode details, see [Advanced Configuration](#advanced-configuration).**
</details>
<details>
<summary><b>💼 Slack</b></summary>
**Create Slack App with Socket Mode:**
See the detailed **[Slack Setup Guide](docs/slack-setup.md)** for step-by-step instructions.
**Quick Overview:**
1. Create app at [api.slack.com/apps](https://api.slack.com/apps)
2. Enable Socket Mode and get App Token (`xapp-...`)
3. Add Bot Token Scopes: `app_mentions:read`, `chat:write`, `channels:history`, `im:history`, `im:write`
4. Subscribe to events: `app_mention`, `message.im`
5. Install to workspace and get Bot Token (`xoxb-...`)
**Set environment variables:**
```env
SLACK_BOT_TOKEN=xoxb-your-bot-token
SLACK_APP_TOKEN=xapp-your-app-token
```
**Optional configuration:**
```env
# Restrict to specific users (comma-separated Slack user IDs)
SLACK_ALLOWED_USER_IDS=U1234ABCD,W5678EFGH
# Streaming mode
SLACK_STREAMING_MODE=batch # batch (default) | stream
```
**Usage:**
Interact by @mentioning your bot in channels or DM directly:
```
@your-bot /clone https://github.com/user/repo
@your-bot /status
```
Thread replies maintain conversation context, enabling workflows like:
1. Clone repo in main channel
2. Continue work in thread
3. Use `/worktree` for parallel development
</details>
<details>
<summary><b>🐙 GitHub Webhooks</b></summary>
**Requirements:**
- GitHub repository with issues enabled
- `GITHUB_TOKEN` already set in Core Configuration above
- Public endpoint for webhooks (see ngrok setup below for local development)
**Step 1: Generate Webhook Secret**
On Linux/Mac:
```bash
openssl rand -hex 32
```
On Windows (PowerShell):
```powershell
-join ((1..32) | ForEach-Object { '{0:x2}' -f (Get-Random -Maximum 256) })
```
Save this secret - you'll need it for steps 3 and 4.
**Step 2: Expose Local Server (Development Only)**
<details>
<summary>Using ngrok (Free Tier)</summary>
```bash
# Install ngrok: https://ngrok.com/download
# Or: choco install ngrok (Windows)
# Or: brew install ngrok (Mac)
# Start tunnel
ngrok http 3000
# Copy the HTTPS URL (e.g., https://abc123.ngrok-free.app)
# ⚠️ Free tier URLs change on restart
```
Keep this terminal open while testing.
</details>
<details>
<summary>Using Cloudflare Tunnel (Persistent URLs)</summary>
```bash
# Install: https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/
cloudflared tunnel --url http://localhost:3000
# Get persistent URL from Cloudflare dashboard
```
Persistent URLs survive restarts.
</details>
**For production deployments**, use your deployed server URL (no tunnel needed).
**Step 3: Configure GitHub Webhook**
Go to your repository settings:
- Navigate to: `https://github.com/owner/repo/settings/hooks`
- Click "Add webhook"
- **Note**: For multiple repositories, you'll need to add the webhook to each one individually
**Webhook Configuration:**
| Field | Value |
|-------|-------|
| **Payload URL** | Local: `https://abc123.ngrok-free.app/webhooks/github`<br>Production: `https://your-domain.com/webhooks/github` |
| **Content type** | `application/json` |
| **Secret** | Paste the secret from Step 1 |
| **SSL verification** | Enable SSL verification (recommended) |
| **Events** | Select "Let me select individual events":<br>✓ Issues<br>✓ Issue comments<br>✓ Pull requests |
Click "Add webhook" and verify it shows a green checkmark after delivery.
**Step 4: Set Environment Variables**
```env
WEBHOOK_SECRET=your_secret_from_step_1
```
**Important**: The `WEBHOOK_SECRET` must match exactly what you entered in GitHub's webhook configuration.
**Step 5: Configure Streaming (Optional)**
```env
GITHUB_STREAMING_MODE=batch # batch (default) | stream
```
**For streaming mode details, see [Advanced Configuration](#advanced-configuration).**
**Usage:**
Interact by @mentioning `@Archon` in issues or PRs:
```
@Archon can you analyze this bug?
@Archon /command-invoke prime
@Archon review this implementation
```
**First mention behavior:**
- Automatically clones the repository to `/.archon/workspaces/`
- Detects and loads commands from `.archon/commands/` if present
- Injects full issue/PR context for the AI assistant
**Subsequent mentions:**
- Resumes existing conversation
- Maintains full context across comments
---
**Adding Additional Repositories**
Once your server is running, add more repos by creating a webhook with the same secret:
```bash
# Get your existing webhook secret
WEBHOOK_SECRET=$(grep WEBHOOK_SECRET .env | cut -d= -f2)
# Add webhook to new repo (replace OWNER/REPO)
gh api repos/OWNER/REPO/hooks --method POST \
-f "config[url]=https://YOUR_DOMAIN/webhooks/github" \
-f "config[content_type]=json" \
-f "config[secret]=$WEBHOOK_SECRET" \
-f "events[]=issues" \
-f "events[]=issue_comment" \
-f "events[]=pull_request" \
-f "events[]=pull_request_review_comment"
```
Or via GitHub UI: **Repo Settings → Webhooks → Add webhook**
- **Payload URL**: Your server URL + `/webhooks/github`
- **Content type**: `application/json`
- **Secret**: Same `WEBHOOK_SECRET` from your `.env`
- **Events**: Issues, Issue comments, Pull requests, Pull request review comments
**Important**: The webhook secret must be identical across all repos.
</details>
<details>
<summary><b>💬 Discord</b></summary>
**Create Discord Bot:**
1. Visit [Discord Developer Portal](https://discord.com/developers/applications)
2. Click "New Application" → Enter a name → Click "Create"
3. Go to the "Bot" tab in the left sidebar
4. Click "Add Bot" → Confirm
**Get Bot Token:**
1. Under the Bot tab, click "Reset Token"
2. Copy the token (starts with a long alphanumeric string)
3. **Save it securely** - you won't be able to see it again
**Enable Message Content Intent (Required):**
1. Scroll down to "Privileged Gateway Intents"
2. Enable **"Message Content Intent"** (required for the bot to read messages)
3. Save changes
**Invite Bot to Your Server:**
1. Go to "OAuth2" → "URL Generator" in the left sidebar
2. Under "Scopes", select:
-`bot`
3. Under "Bot Permissions", select:
- ✓ Send Messages
- ✓ Read Message History
- ✓ Create Public Threads (optional, for thread support)
- ✓ Send Messages in Threads (optional, for thread support)
4. Copy the generated URL at the bottom
5. Paste it in your browser and select your server
6. Click "Authorize"
**Note:** You need "Manage Server" permission to add bots.
**Set environment variable:**
```env
DISCORD_BOT_TOKEN=your_bot_token_here
```
**Configure user whitelist (optional):**
To restrict bot access to specific users, enable Developer Mode in Discord:
1. User Settings → Advanced → Enable "Developer Mode"
2. Right-click on users → "Copy User ID"
3. Add to environment:
```env
DISCORD_ALLOWED_USER_IDS=123456789012345678,987654321098765432
```
**Configure streaming mode (optional):**
```env
DISCORD_STREAMING_MODE=batch # batch (default) | stream
```
**For streaming mode details, see [Advanced Configuration](#advanced-configuration).**
**Usage:**
The bot responds to:
- **Direct Messages**: Just send messages directly
- **Server Channels**: @mention the bot (e.g., `@YourBotName help me with this code`)
- **Threads**: Bot maintains context in thread conversations
</details>
---
### 4. Start the Application
Choose the Docker Compose profile based on your database setup:
**Option A: With Remote PostgreSQL (Supabase, Neon, etc.)**
Starts only the app container (requires `DATABASE_URL` set to remote database in `.env`):
```bash
# Start app container
docker compose --profile external-db up -d --build
# View logs
docker compose logs -f app
```
**Option B: With Local PostgreSQL (Docker)**
Starts both the app and PostgreSQL containers:
```bash
# Start containers
docker compose --profile with-db up -d --build
# Wait for startup (watch logs)
docker compose logs -f app-with-db
# Database tables are created automatically via init script
```
**Option C: Local Development (No Docker)**
Run directly with Bun (requires local PostgreSQL or remote `DATABASE_URL` in `.env`):
```bash
bun install # First time only
bun run dev
```
**Stop the application:**
```bash
docker compose --profile external-db down # If using Option A
docker compose --profile with-db down # If using Option B
```
---
## Usage
### Available Commands
Once your platform adapter is running, you can use these commands. Type `/help` to see this list.
#### Command Templates (Global)
| Command | Description |
|---------|-------------|
| `/<name> [args]` | Invoke a template directly (e.g., `/plan "Add dark mode"`) |
| `/templates` | List all available templates |
| `/template-add <name> <path>` | Add template from file |
| `/template-delete <name>` | Remove a template |
#### Codebase Commands (Per-Project)
| Command | Description |
|---------|-------------|
| `/command-set <name> <path> [text]` | Register a command from file |
| `/load-commands <folder>` | Bulk load commands (recursive) |
| `/command-invoke <name> [args]` | Execute a codebase command |
| `/commands` | List registered commands |
> **Note:** Commands use relative paths (e.g., `.archon/commands/plan.md`)
#### Codebase Management
| Command | Description |
|---------|-------------|
| `/clone <repo-url>` | Clone repository |
| `/repos` | List repositories (numbered) |
| `/repo <#\|name> [pull]` | Switch repo (auto-loads commands) |
| `/repo-remove <#\|name>` | Remove repo and codebase record |
| `/getcwd` | Show working directory |
| `/setcwd <path>` | Set working directory |
> **Tip:** Use `/repo` for quick switching between cloned repos, `/setcwd` for manual paths.
#### Worktrees (Isolation)
| Command | Description |
|---------|-------------|
| `/worktree create <branch>` | Create isolated worktree |
| `/worktree list` | Show worktrees for this repo |
| `/worktree remove [--force]` | Remove current worktree |
| `/worktree cleanup merged\|stale` | Clean up worktrees |
| `/worktree orphans` | Show all worktrees from git |
#### Workflows
| Command | Description |
|---------|-------------|
| `/workflow list` | Show available workflows |
| `/workflow reload` | Reload workflow definitions |
| `/workflow status` | Show running workflow details |
| `/workflow cancel` | Cancel running workflow |
> **Note:** Workflows are YAML files in `.archon/workflows/`
#### Session Management
| Command | Description |
|---------|-------------|
| `/status` | Show conversation state |
| `/reset` | Clear session completely |
| `/reset-context` | Reset AI context, keep worktree |
| `/help` | Show all commands |
#### Setup
| Command | Description |
|---------|-------------|
| `/init` | Create `.archon` structure in current repo |
### Example Workflow (Telegram)
**Clone a Repository**
```
You: /clone https://github.com/user/my-project
Bot: Repository cloned successfully!
Repository: my-project
✓ App defaults available at runtime
Session reset - starting fresh on next message.
You can now start asking questions about the code.
```
> **Note:** Default commands and workflows are loaded at runtime and merged with repo-specific ones. Repo commands/workflows override app defaults by name. To disable defaults, set `defaults.loadDefaultCommands: false` or `defaults.loadDefaultWorkflows: false` in the repo's `.archon/config.yaml`.
**Ask Questions Directly**
```
You: What's the structure of this repo?
Bot: [Claude analyzes and responds...]
```
**Create Custom Commands (Optional)**
```
You: /init
Bot: Created .archon structure:
.archon/
├── config.yaml
└── commands/
└── example.md
Use /load-commands .archon/commands to register commands.
```
You can then create your own commands in `.archon/commands/` and load them with `/load-commands`.
**Check Status**
```
You: /status
Bot: Platform: telegram
AI Assistant: claude
Codebase: my-project
Repository: https://github.com/user/my-project
Repository: my-project @ main
Worktrees: 0/10
```
**Work in Isolation with Worktrees**
```
You: /worktree create feature-auth
Bot: Worktree created!
Branch: feature-auth
Path: feature-auth/
This conversation now works in isolation.
Run dependency install if needed (e.g., bun install).
```
**Reset Session**
```
You: /reset
Bot: Session cleared. Starting fresh on next message.
Codebase configuration preserved.
```
### Example Workflow (GitHub)
Create an issue or comment on an existing issue/PR:
```
@your-bot-name can you help me understand the authentication flow?
```
Bot responds with analysis. Continue the conversation:
```
@your-bot-name can you create a sequence diagram for this?
```
Bot maintains context and provides the diagram.
---
## Advanced Configuration
<details>
<summary><b>Streaming Modes Explained</b></summary>
### Stream Mode
Messages are sent in real-time as the AI generates responses.
**Configuration:**
```env
TELEGRAM_STREAMING_MODE=stream
GITHUB_STREAMING_MODE=stream
```
**Pros:**
- Real-time feedback and progress indication
- More interactive and engaging
- See AI reasoning as it works
**Cons:**
- More API calls to platform
- May hit rate limits with very long responses
- Creates many messages/comments
**Best for:** Interactive chat platforms (Telegram)
### Batch Mode
Only the final summary message is sent after AI completes processing.
**Configuration:**
```env
TELEGRAM_STREAMING_MODE=batch
GITHUB_STREAMING_MODE=batch
```
**Pros:**
- Single coherent message/comment
- Fewer API calls
- No spam or clutter
**Cons:**
- No progress indication during processing
- Longer wait for first response
- Can't see intermediate steps
**Best for:** Issue trackers and async platforms (GitHub)
</details>
<details>
<summary><b>Concurrency Settings</b></summary>
Control how many conversations the system processes simultaneously:
```env
MAX_CONCURRENT_CONVERSATIONS=10 # Default: 10
```
**How it works:**
- Conversations are processed with a lock manager
- If max concurrent limit reached, new messages are queued
- Prevents resource exhaustion and API rate limits
- Each conversation maintains its own independent context
**Check current load:**
```bash
curl http://localhost:3000/health/concurrency
```
**Response:**
```json
{
"status": "ok",
"active": 3,
"queued": 0,
"maxConcurrent": 10
}
```
**Tuning guidance:**
- **Low resources**: Set to 3-5
- **Standard**: Default 10 works well
- **High resources**: Can increase to 20-30 (monitor API limits)
</details>
<details>
<summary><b>Health Check Endpoints</b></summary>
The application exposes health check endpoints for monitoring:
**Basic Health Check:**
```bash
curl http://localhost:3090/health
```
Returns: `{"status":"ok"}`
**Database Connectivity:**
```bash
curl http://localhost:3090/health/db
```
Returns: `{"status":"ok","database":"connected"}`
**Concurrency Status:**
```bash
curl http://localhost:3090/health/concurrency
```
Returns: `{"status":"ok","active":0,"queued":0,"maxConcurrent":10}`
**Use cases:**
- Docker healthcheck configuration
- Load balancer health checks
- Monitoring and alerting systems (Prometheus, Datadog, etc.)
- CI/CD deployment verification
</details>
<details>
<summary><b>Custom Command System</b></summary>
Create your own commands by adding markdown files to your codebase:
**1. Create command file:**
```bash
mkdir -p .archon/commands
cat > .archon/commands/analyze.md << 'EOF'
You are an expert code analyzer.
Analyze the following aspect of the codebase: $1
Provide:
1. Current implementation analysis
2. Potential issues or improvements
3. Best practices recommendations
Focus area: $ARGUMENTS
EOF
```
**2. Load commands:**
```
/load-commands .archon/commands
```
**3. Invoke your command:**
```
/command-invoke analyze "security vulnerabilities"
```
**Variable substitution:**
- `$1`, `$2`, `$3`, etc. - Positional arguments
- `$ARGUMENTS` - All arguments as a single string
- `$PLAN` - Previous plan from session metadata
- `$IMPLEMENTATION_SUMMARY` - Previous execution summary
Commands are version-controlled with your codebase, not stored in the database.
</details>
<details>
<summary><b>Workflows (Multi-Step Automation)</b></summary>
Workflows are YAML files that define multi-step AI processes. They can be step-based (sequential commands) or loop-based (autonomous iteration).
**Location:** `.archon/workflows/`
**Example step-based workflow** (`.archon/workflows/fix-github-issue.yaml`):
```yaml
name: fix-github-issue
description: |
Use when: User wants to FIX or RESOLVE a GitHub issue.
Does: Investigates root cause -> creates plan -> makes code changes -> creates PR.
model: sonnet # Optional: provider inherited from .archon/config.yaml
steps:
- command: investigate-issue
- command: implement-issue
clearContext: true
```
**Example loop-based workflow** (autonomous iteration):
```yaml
name: ralph-loop
description: Execute plan until all validations pass
model: sonnet # Optional: provider inherited from .archon/config.yaml
loop:
until: "All validations pass"
max_iterations: 10
fresh_context: true
prompt: |
Continue implementing the plan. Run validation after each change.
Signal completion with: "All validations pass"
```
**How workflows are invoked:**
- AI routes to workflows automatically based on user intent
- Workflows use commands defined in `.archon/commands/`
- Only one workflow can run per conversation at a time
**Managing workflows:**
```
/workflow list # Show available workflows
/workflow reload # Reload definitions after editing
/workflow cancel # Cancel a running workflow
```
</details>
---
## Architecture
### System Overview
```
┌─────────────────────────────────────────────────────────┐
│ Platform Adapters (Telegram, Slack, Discord, GitHub) │
└──────────────────────────┬──────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Orchestrator │
│ (Message Routing & Context Management) │
└─────────────┬───────────────────────────┬───────────────┘
│ │
┌───────┴────────┐ ┌───────┴────────┐
│ │ │ │
▼ ▼ ▼ ▼
┌───────────┐ ┌────────────┐ ┌──────────────────────────┐
│ Command │ │ Workflow │ │ AI Assistant Clients │
│ Handler │ │ Executor │ │ (Claude / Codex) │
│ (Slash) │ │ (YAML) │ │ │
└───────────┘ └────────────┘ └──────────────────────────┘
│ │ │
└──────────────┴──────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ PostgreSQL (6 Tables) │
│ Codebases • Conversations • Sessions • Workflow Runs │
│ Command Templates • Isolation Environments │
└─────────────────────────────────────────────────────────┘
```
### Key Design Patterns
- **Adapter Pattern**: Platform-agnostic via `IPlatformAdapter` interface
- **Strategy Pattern**: Swappable AI assistants via `IAssistantClient` interface
- **Session Persistence**: AI context survives restarts via database storage
- **Generic Commands**: User-defined markdown commands versioned with Git
- **Workflow Engine**: YAML-based multi-step automation with step and loop modes
- **Worktree Isolation**: Git worktrees enable parallel work per conversation, auto-synced with origin before creation
- **Concurrency Control**: Lock manager prevents race conditions
### Database Schema
<details>
<summary><b>6 tables with `remote_agent_` prefix</b></summary>
1. **`remote_agent_codebases`** - Repository metadata
- Commands stored as JSONB: `{command_name: {path, description}}`
- AI assistant type per codebase
- Default working directory
2. **`remote_agent_conversations`** - Platform conversation tracking
- Platform type + conversation ID (unique constraint)
- Linked to codebase via foreign key
- AI assistant type locked at creation
3. **`remote_agent_sessions`** - AI session management
- Active session flag (one per conversation)
- Session ID for resume capability
- Metadata JSONB for command context
4. **`remote_agent_command_templates`** - Global command templates
- Shared command definitions (like `/plan`, `/commit`)
- Available across all codebases
5. **`remote_agent_isolation_environments`** - Worktree isolation
- Tracks git worktrees per issue/PR
- Enables worktree sharing between linked issues and PRs
6. **`remote_agent_workflow_runs`** - Workflow execution tracking
- Tracks active workflows per conversation
- Prevents concurrent workflow execution
- Stores workflow state and step progress
</details>
---
## Troubleshooting
### Bot Not Responding
**Check if application is running:**
```bash
docker compose ps
# Should show 'app' or 'app-with-db' with state 'Up'
```
**Check application logs:**
```bash
docker compose logs -f app # If using --profile external-db
docker compose logs -f app-with-db # If using --profile with-db
```
**Verify bot token:**
```bash
# In your .env file
cat .env | grep TELEGRAM_BOT_TOKEN
```
**Test with health check:**
```bash
curl http://localhost:3090/health
# Expected: {"status":"ok"}
```
### Database Connection Errors
**Check database health:**
```bash
curl http://localhost:3090/health/db
# Expected: {"status":"ok","database":"connected"}
```
**For local PostgreSQL (`with-db` profile):**
```bash
# Check if postgres container is running
docker compose ps postgres
# Check postgres logs
docker compose logs -f postgres
# Test direct connection
docker compose exec postgres psql -U postgres -c "SELECT 1"
```
**For remote PostgreSQL:**
```bash
# Verify DATABASE_URL
echo $DATABASE_URL
# Test connection directly
psql $DATABASE_URL -c "SELECT 1"
```
**Verify tables exist:**
```bash
# For local postgres
docker compose exec postgres psql -U postgres -d remote_coding_agent -c "\dt"
# Should show: remote_agent_codebases, remote_agent_conversations, remote_agent_sessions,
# remote_agent_command_templates, remote_agent_isolation_environments
```
### Clone Command Fails
**Verify GitHub token:**
```bash
cat .env | grep GH_TOKEN
# Should have both GH_TOKEN and GITHUB_TOKEN set
```
**Test token validity:**
```bash
# Test GitHub API access
curl -H "Authorization: token $GH_TOKEN" https://api.github.com/user
```
**Check workspace permissions:**
```bash
# Use the service name matching your profile
docker compose exec app ls -la /.archon/workspaces # --profile external-db
docker compose exec app-with-db ls -la /.archon/workspaces # --profile with-db
```
**Try manual clone:**
```bash
docker compose exec app git clone https://github.com/user/repo /.archon/workspaces/test-repo
# Or app-with-db if using --profile with-db
```
### GitHub Webhook Not Triggering
**Verify webhook delivery:**
1. Go to your webhook settings in GitHub
2. Click on the webhook
3. Check "Recent Deliveries" tab
4. Look for successful deliveries (green checkmark)
**Check webhook secret:**
```bash
cat .env | grep WEBHOOK_SECRET
# Must match exactly what you entered in GitHub
```
**Verify ngrok is running (local dev):**
```bash
# Check ngrok status
curl http://localhost:4040/api/tunnels
# Or visit http://localhost:4040 in browser
```
**Check application logs for webhook processing:**
```bash
docker compose logs -f app | grep GitHub # --profile external-db
docker compose logs -f app-with-db | grep GitHub # --profile with-db
```
### TypeScript Compilation Errors
**Clean and rebuild:**
```bash
# Stop containers (use the profile you started with)
docker compose --profile external-db down # or --profile with-db
# Clean build
rm -rf dist node_modules
bun install
bun run build
# Restart (use the profile you need)
docker compose --profile external-db up -d --build # or --profile with-db
```
**Check for type errors:**
```bash
bun run type-check
```
### Container Won't Start
**Check logs for specific errors:**
```bash
docker compose logs app # If using --profile external-db
docker compose logs app-with-db # If using --profile with-db
```
**Verify environment variables:**
```bash
# Check if .env is properly formatted (include your profile)
docker compose --profile external-db config # or --profile with-db
```
**Rebuild without cache:**
```bash
docker compose --profile external-db build --no-cache # or --profile with-db
docker compose --profile external-db up -d # or --profile with-db
```
**Check port conflicts:**
```bash
# See if port 3090 is already in use
# Linux/Mac:
lsof -i :3090
# Windows:
netstat -ano | findstr :3090
```
---
## Windows (WSL2 Setup)
Archon CLI requires WSL2 (Windows Subsystem for Linux 2) on Windows. Native Windows binaries are not currently supported.
### Why WSL2?
The Archon CLI relies on Unix-specific features and tools:
- Git worktree operations with symlinks
- Shell scripting for AI agent execution
- File system operations that differ between Windows and Unix
WSL2 provides a full Linux environment that runs seamlessly on Windows.
### Quick WSL2 Setup
1. **Install WSL2** (requires Windows 10 version 2004+ or Windows 11):
```powershell
wsl --install
```
This installs Ubuntu by default. Restart your computer when prompted.
2. **Set up Ubuntu**:
Open "Ubuntu" from the Start menu and create a username/password.
3. **Install Bun in WSL2**:
```bash
curl -fsSL https://bun.sh/install | bash
source ~/.bashrc
```
4. **Clone and install Archon**:
```bash
git clone https://github.com/dynamous-community/remote-coding-agent
cd remote-coding-agent
bun install
```
5. **Make CLI globally available**:
```bash
cd packages/cli
bun link
```
6. **Verify installation**:
```bash
archon version
```
### Working with Windows Files
WSL2 can access your Windows files at `/mnt/c/` (for C: drive):
```bash
archon workflow run assist --cwd /mnt/c/Users/YourName/Projects/my-repo "What does this code do?"
```
For best performance, keep projects inside the WSL2 file system (`~/projects/`) rather than `/mnt/c/`.
### Tips
- **VS Code Integration**: Install "Remote - WSL" extension to edit WSL2 files from VS Code
- **Terminal**: Windows Terminal provides excellent WSL2 support
- **Git**: Use Git inside WSL2 for consistent behavior with Archon