Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 57 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@
- **Kanban Task Board** — Visual Queue / Running / Done columns with live output streaming
- **DAG Pipelines** — Define task dependencies with automatic cascade execution and failure propagation
- **Flexible Scheduling** — Immediate, delayed, one-time datetime, and cron-based recurring tasks
- **Chat Control** — Create tasks and receive notifications from Telegram, Slack, or Feishu/Lark
- **Dual Agent Backends** — Run tasks with Claude Code CLI or OpenAI Codex CLI; choose per-task or set a default
- **Chat Control** — Create tasks and receive notifications from Telegram, Slack, Feishu/Lark, or WeChat
- **Persistent Storage** — SQLite-backed task history, run logs, and streaming output
- **Native macOS App** — Electron shell with one-click DMG install

Expand All @@ -47,7 +48,8 @@
- macOS 12.0+ (Apple Silicon or Intel)
- Python 3.12+
- Node.js 18+
- [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code) installed and on `PATH`
- [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code) installed and on `PATH` (default agent)
- [OpenAI Codex CLI](https://github.com/openai/codex) on `PATH` — optional, required only if using Codex as agent backend (`npm install -g @openai/codex`)

---

Expand Down Expand Up @@ -123,7 +125,7 @@ Once the app is running, the backend listens on `http://127.0.0.1:9712`.
**Create a task via curl:**

```bash
# Run immediately
# Run immediately (uses default agent — claude)
curl -X POST http://localhost:9712/api/tasks \
-H "Content-Type: application/json" \
-d '{
Expand Down Expand Up @@ -155,6 +157,25 @@ curl -X POST http://localhost:9712/api/tasks \
"cron_expr": "0 9 * * *",
"max_runs": 30
}'

# Use Codex CLI instead of Claude Code
curl -X POST http://localhost:9712/api/tasks \
-H "Content-Type: application/json" \
-d '{
"title": "Refactor auth module",
"prompt": "Refactor the authentication module for clarity",
"working_dir": "~/projects/myapp",
"schedule_type": "immediate",
"agent": "codex"
}'
```

To set Codex as the default agent for all tasks:

```bash
curl -X PUT http://localhost:9712/api/settings \
-H "Content-Type: application/json" \
-d '{"default_agent": "codex"}'
```

---
Expand All @@ -168,6 +189,7 @@ Control AgentForge from your favorite messaging app. Channels auto-start when th
| Telegram | Bot API (polling) | Easy |
| Slack | Socket Mode | Moderate |
| Feishu / Lark | WebSocket long-connection | Moderate |
| WeChat | Node bridge (experimental) | Moderate |

<details>
<summary><b>Telegram setup</b></summary>
Expand Down Expand Up @@ -267,6 +289,36 @@ Or configure from the desktop app's settings page.

</details>

<details>
<summary><b>WeChat setup (experimental)</b></summary>

WeChat uses a Node.js sidecar bridge — no environment variables needed. Configure and enable it via the API or the desktop app's settings page.

### 1. Enable via API

```bash
curl -X POST http://127.0.0.1:9712/api/channels/settings \
-H "Content-Type: application/json" \
-d '{
"weixin_enabled": "true",
"weixin_default_working_dir": "~/projects",
"weixin_base_url": "https://ilinkai.weixin.qq.com",
"weixin_account_id": ""
}'
```

### 2. Scan the QR code

On first launch the bridge will request a QR code login. Scan it with your WeChat mobile app to authenticate. The session is saved for subsequent restarts.

### Notes

- Text-only MVP — rich media is not supported.
- The bridge uses the `getupdates` / `sendmessage` HTTP protocol.
- Single-account per AgentForge instance.

</details>

> See [`channels/README.md`](channels/README.md) for detailed setup, notification behavior, and adding custom channels.

---
Expand Down Expand Up @@ -386,7 +438,7 @@ launchctl load ~/Library/LaunchAgents/com.agentforge.taskboard.plist
[ SQLite DB ] [ Scheduler ] [ Claude CLI ]
```

- **Python backend** (`taskboard.py`) — single-file `BaseHTTPRequestHandler` server. Manages tasks in SQLite (`~/.agentforge/tasks.db`), runs `claude` CLI via `AgentExecutor`, and schedules work with `TaskScheduler` (polls every 2 s, supports cron via `croniter`).
- **Python backend** (`taskboard.py`) — single-file `BaseHTTPRequestHandler` server. Manages tasks in SQLite (`~/.agentforge/tasks.db`), runs `claude` or `codex` CLI via `AgentExecutor`, and schedules work with `TaskScheduler` (polls every 2 s, supports cron via `croniter`).
- **Electron shell** (`taskboard-electron/`) — spawns the Python backend on start, kills it on quit. Loads React renderer from Vite dev server (dev) or bundled assets (prod).
- **React frontend** (`App.jsx`) — single-component kanban board that polls the REST API and renders colorized streaming output.

Expand All @@ -405,7 +457,7 @@ Contributions are welcome! Here's how to get started:
- `taskboard.py` — entire Python backend (DB, scheduler, executor, HTTP handlers)
- `taskboard-electron/src/main.js` — Electron main process
- `taskboard-electron/src/renderer/App.jsx` — React frontend (~1500 lines)
- `channels/` — pluggable chat channel adapters
- `channels/` — pluggable chat channel adapters (Telegram, Slack, Feishu, WeChat)
- `skills/agentforge/` — Claude Code skill for agent-to-agent delegation

---
Expand Down
Loading