conductor-oss 0.18.0 → 0.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +222 -201
- package/package.json +5 -5
- package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/packages/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/packages/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
- package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +3 -3
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/page/server-reference-manifest.json +7 -7
- package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/server-reference-manifest.json +7 -7
- package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/server-reference-manifest.json +7 -7
- package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +7 -7
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__379d412d._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__749fe4b2._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__5b5bf182._.js → [root-of-the-server]__992cdcf8._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__12bb92c8._.js → [root-of-the-server]__a565f9a3._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__6fcf1553._.js → [root-of-the-server]__da08a50a._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_0e1412de._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_532f707d._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{_6d557023._.js → _62d206cc._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_69e05fca._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_80efe193._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_c0f0e227._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_f36ddaa9._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_adc83dc2._.js → node_modules_5646ec2d._.js} +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_2157a581._.js → node_modules_6d2fa1ea._.js} +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_4f296b1d._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_599a1810._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +8 -8
- package/web/.next/{static/chunks/9a7ec6f186a2b5ad.js → standalone/packages/web/.next/static/chunks/58a9b117e5684e7c.js} +1 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/{697cfa8e22c0eb00.js → 8d05dc3b261207bb.js} +1 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/a8cd591e904d769e.js +1 -0
- package/web/.next/standalone/packages/web/.next/static/chunks/{9d6d2b45dba0f005.js → c1e720eabb98af26.js} +1 -1
- package/web/.next/{standalone/packages/web/.next/static/chunks/9a7ec6f186a2b5ad.js → static/chunks/58a9b117e5684e7c.js} +1 -1
- package/web/.next/static/chunks/{697cfa8e22c0eb00.js → 8d05dc3b261207bb.js} +1 -1
- package/web/.next/static/chunks/a8cd591e904d769e.js +1 -0
- package/web/.next/static/chunks/{9d6d2b45dba0f005.js → c1e720eabb98af26.js} +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_06d0c313._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_2fb7c4e5._.js +0 -3
- package/web/.next/standalone/packages/web/.next/static/chunks/031a3df658ea8a21.js +0 -1
- package/web/.next/static/chunks/031a3df658ea8a21.js +0 -1
- /package/web/.next/standalone/packages/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_buildManifest.js +0 -0
- /package/web/.next/standalone/packages/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/packages/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_ssgManifest.js +0 -0
- /package/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_buildManifest.js +0 -0
- /package/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Conductor OSS
|
|
4
4
|
|
|
5
|
-
###
|
|
5
|
+
### The local-first control plane for AI coding agents
|
|
6
6
|
|
|
7
7
|
**One command. Markdown-native. No cloud relay.**
|
|
8
8
|
|
|
@@ -14,61 +14,30 @@
|
|
|
14
14
|
|
|
15
15
|
</div>
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
---
|
|
18
18
|
|
|
19
|
-
It
|
|
19
|
+
Conductor OSS is a local-first orchestration platform for AI coding agents. It takes Markdown kanban boards, turns them into dispatchable work, and launches your installed coding CLIs — Claude Code, Codex, Gemini, and seven others — inside isolated git worktrees with full terminal access from a browser dashboard.
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Everything runs on your machine. State lives in local files and SQLite. Agents keep their own authentication and billing. Conductor is the operating layer around them, not a replacement.
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- Dispatches tasks from `CONDUCTOR.md` boards into real agent sessions.
|
|
26
|
-
- Runs agents locally in the repo or in isolated git worktrees.
|
|
27
|
-
- Uses a terminal-first runtime so each session remains an interactive shell-backed workspace.
|
|
28
|
-
- Streams session status into a dashboard over SSE and websocket-backed terminal connections.
|
|
29
|
-
- Tracks retries, restores, kill/archive flows, session diffs, checks, previews, and feedback loops.
|
|
30
|
-
- Stores state locally in `conductor.yaml`, `CONDUCTOR.md`, and `.conductor/conductor.db`.
|
|
31
|
-
- Keeps agent authentication and billing with the upstream CLI you already installed.
|
|
32
|
-
|
|
33
|
-
## Core Workflow
|
|
34
|
-
|
|
35
|
-
1. Add a local repo or clone one into a managed workspace.
|
|
36
|
-
2. Create or edit tasks in `CONDUCTOR.md`.
|
|
37
|
-
3. Move a task into `Ready to Dispatch`.
|
|
38
|
-
4. Conductor launches the selected agent in an isolated workspace.
|
|
39
|
-
5. Follow the session from the browser:
|
|
40
|
-
- `Terminal`: the live terminal is the primary session workspace.
|
|
41
|
-
- `Overview`: normalized feed, runtime state, metadata, and recovery hints.
|
|
42
|
-
- `Preview`: connect a local dev URL and interact with the app from the session page.
|
|
43
|
-
- `Diff`: inspect changed files, workspace contents, and checks.
|
|
44
|
-
6. Retry, restore, send feedback, or archive the session when needed.
|
|
23
|
+
<div align="center">
|
|
45
24
|
|
|
46
|
-
|
|
25
|
+

|
|
47
26
|
|
|
48
|
-
|
|
49
|
-
- Markdown-native planning: boards remain readable outside the app.
|
|
50
|
-
- Multi-agent support with adapter-based discovery and launch logic.
|
|
51
|
-
- Worktree-aware execution for parallel changes in the same repository.
|
|
52
|
-
- Session recovery after backend restarts, including direct PTY terminal restore for live runtimes.
|
|
53
|
-
- GitHub-aware flows for repository import, PR metadata, checks, and project syncing.
|
|
54
|
-
- MCP server mode for integrating Conductor with external clients.
|
|
27
|
+
</div>
|
|
55
28
|
|
|
56
|
-
##
|
|
29
|
+
## Why Conductor
|
|
57
30
|
|
|
58
|
-
|
|
31
|
+
Running one agent in one terminal works fine for a single task. When you want to queue multiple tasks across multiple repos, dispatch them to different agents, watch them run in parallel, retry failures, review diffs, and coordinate it all from one place — you need an orchestration layer.
|
|
59
32
|
|
|
60
|
-
|
|
61
|
-
- Codex
|
|
62
|
-
- Gemini
|
|
63
|
-
- Qwen Code
|
|
64
|
-
- Amp
|
|
65
|
-
- Cursor Agent
|
|
66
|
-
- OpenCode
|
|
67
|
-
- Droid
|
|
68
|
-
- GitHub Copilot
|
|
69
|
-
- CCR
|
|
33
|
+
Conductor adds:
|
|
70
34
|
|
|
71
|
-
|
|
35
|
+
- **Planning** — Markdown kanban boards that work in Obsidian and in the browser
|
|
36
|
+
- **Dispatch** — Automated task-to-agent assignment with queue management
|
|
37
|
+
- **Isolation** — Git worktree-per-session so agents never step on each other
|
|
38
|
+
- **Visibility** — Live terminal streaming, session feeds, and diff inspection
|
|
39
|
+
- **Recovery** — Session restore after backend restarts, retries, and feedback loops
|
|
40
|
+
- **Review** — PR creation, CI check monitoring, and code diff tools built in
|
|
72
41
|
|
|
73
42
|
## Quick Start
|
|
74
43
|
|
|
@@ -76,234 +45,286 @@ Availability still depends on what is installed and authenticated on your machin
|
|
|
76
45
|
|
|
77
46
|
- Node.js `>= 18`
|
|
78
47
|
- `git`
|
|
79
|
-
-
|
|
48
|
+
- At least one supported coding agent CLI installed and authenticated
|
|
80
49
|
|
|
81
|
-
### Launch
|
|
50
|
+
### Launch
|
|
82
51
|
|
|
83
52
|
```bash
|
|
84
53
|
npx conductor-oss@latest
|
|
85
54
|
```
|
|
86
55
|
|
|
87
|
-
|
|
56
|
+
This starts the Rust backend and Next.js dashboard, then opens the browser. Default ports:
|
|
88
57
|
|
|
89
|
-
|
|
58
|
+
- Dashboard: `http://127.0.0.1:4747`
|
|
59
|
+
- Backend: `http://127.0.0.1:4748`
|
|
90
60
|
|
|
91
|
-
|
|
61
|
+
### Initialize an existing repo
|
|
92
62
|
|
|
93
|
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
63
|
+
```bash
|
|
64
|
+
npx conductor-oss@latest init
|
|
65
|
+
npx conductor-oss@latest start --workspace .
|
|
66
|
+
```
|
|
96
67
|
|
|
97
|
-
|
|
68
|
+
This scaffolds `conductor.yaml`, `CONDUCTOR.md`, and `.conductor/conductor.db` in the current directory.
|
|
98
69
|
|
|
99
|
-
|
|
70
|
+
### Global install
|
|
100
71
|
|
|
101
|
-
|
|
72
|
+
```bash
|
|
73
|
+
npm install -g conductor-oss
|
|
74
|
+
co
|
|
75
|
+
```
|
|
102
76
|
|
|
103
|
-
|
|
77
|
+
The launcher registers three aliases: `conductor-oss`, `conductor`, and `co`.
|
|
104
78
|
|
|
105
|
-
|
|
79
|
+
## Supported Agents
|
|
106
80
|
|
|
107
|
-
|
|
81
|
+
Conductor ships with adapters for 10 coding agent CLIs. Each adapter handles binary detection, launch commands, process monitoring, and prompt delivery.
|
|
108
82
|
|
|
109
|
-
|
|
83
|
+
| Agent | CLI |
|
|
84
|
+
|-------|-----|
|
|
85
|
+
| Claude Code | `claude` |
|
|
86
|
+
| Codex | `codex` |
|
|
87
|
+
| Gemini | `gemini` |
|
|
88
|
+
| Qwen Code | `qwen` |
|
|
89
|
+
| Amp | `amp` |
|
|
90
|
+
| Cursor Agent | `cursor-agent` |
|
|
91
|
+
| OpenCode | `opencode` |
|
|
92
|
+
| Droid | `droid` |
|
|
93
|
+
| GitHub Copilot | `gh copilot` |
|
|
94
|
+
| CCR | `ccr` |
|
|
110
95
|
|
|
111
|
-
|
|
96
|
+
Agents appear in the dashboard picker based on what is installed and authenticated on your machine.
|
|
112
97
|
|
|
113
|
-
|
|
98
|
+
## Native Terminal Experience
|
|
114
99
|
|
|
115
|
-
|
|
100
|
+
Conductor launches agents into their real terminal UIs — not a synthetic chat shell. Claude Code runs as Claude Code. Codex runs as Codex. The dashboard terminal is a live viewer over the backend-owned PTY session using the TTyD binary protocol, so reconnecting or switching sessions preserves the native agent experience.
|
|
116
101
|
|
|
117
|
-
|
|
118
|
-
- Rust backend: `http://127.0.0.1:4748`
|
|
102
|
+
<div align="center">
|
|
119
103
|
|
|
120
|
-
|
|
104
|
+
| Agent Picker | Claude Code Session |
|
|
105
|
+
|:---:|:---:|
|
|
106
|
+
|  |  |
|
|
121
107
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
```
|
|
108
|
+
| Codex Session | Gemini Session |
|
|
109
|
+
|:---:|:---:|
|
|
110
|
+
|  |  |
|
|
126
111
|
|
|
127
|
-
|
|
112
|
+
</div>
|
|
128
113
|
|
|
129
|
-
|
|
130
|
-
- `CONDUCTOR.md`
|
|
131
|
-
- `.conductor/conductor.db`
|
|
114
|
+
## How It Works
|
|
132
115
|
|
|
133
|
-
|
|
116
|
+
### Task Lifecycle
|
|
134
117
|
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
co
|
|
118
|
+
```
|
|
119
|
+
Inbox → Ready to Dispatch → Dispatching → In Progress → Review → Done
|
|
138
120
|
```
|
|
139
121
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
- `co start` - start the Rust backend and web dashboard
|
|
149
|
-
- `co dashboard` - open the dashboard
|
|
150
|
-
- `co init` - scaffold `conductor.yaml` and `CONDUCTOR.md`
|
|
151
|
-
- `co setup` - guided first-run setup
|
|
152
|
-
- `co doctor` - diagnose backend and runtime issues
|
|
153
|
-
- `co spawn` - create a session
|
|
154
|
-
- `co list` - list sessions
|
|
155
|
-
- `co status` - summarize session state
|
|
156
|
-
- `co send` - send a follow-up to a session
|
|
157
|
-
- `co attach` - legacy command kept only to explain the direct-terminal migration
|
|
158
|
-
- `co restore` - restore an exited session
|
|
159
|
-
- `co retry` - create a new attempt from an earlier task or session
|
|
160
|
-
- `co kill` - terminate a session
|
|
161
|
-
- `co cleanup` - reclaim resources from completed sessions
|
|
162
|
-
- `co feedback` - send reviewer feedback back into a session
|
|
163
|
-
- `co task` - task graph helpers
|
|
164
|
-
- `co mcp-server` - run Conductor as an MCP server over stdio
|
|
165
|
-
|
|
166
|
-
There is also a native Rust CLI in `crates/conductor-cli` used by the launcher and source development. Its command set is intentionally smaller and lower-level than the npm launcher.
|
|
122
|
+
1. **Create tasks** in `CONDUCTOR.md` — a Markdown kanban board compatible with Obsidian
|
|
123
|
+
2. **Move tasks** to "Ready to Dispatch" (or let the automation promote them)
|
|
124
|
+
3. **Conductor dispatches** — picks up queued tasks, selects an agent, prepares the workspace
|
|
125
|
+
4. **Agent executes** — launched in an isolated git worktree with a compiled task prompt
|
|
126
|
+
5. **Monitor live** — terminal streaming, normalized session feed, and runtime metadata in the dashboard
|
|
127
|
+
6. **Review output** — inspect diffs, browse changed files, view CI checks, create PRs
|
|
128
|
+
7. **Iterate** — retry, restore, send feedback, or archive
|
|
167
129
|
|
|
168
|
-
|
|
130
|
+
### Dashboard Surfaces
|
|
169
131
|
|
|
170
|
-
|
|
132
|
+
Each session page provides:
|
|
171
133
|
|
|
172
|
-
-
|
|
173
|
-
|
|
174
|
-
-
|
|
175
|
-
|
|
176
|
-
- `.conductor/conductor.db`
|
|
177
|
-
SQLite persistence for sessions, metadata, and runtime state.
|
|
178
|
-
- `.conductor/rust-backend/detached/`
|
|
179
|
-
Runtime artifacts for direct PTY-backed sessions.
|
|
180
|
-
- `attachments/...`
|
|
181
|
-
Uploaded session files and generated artifacts.
|
|
134
|
+
- **Terminal** — live interactive terminal over the agent's PTY session
|
|
135
|
+
- **Overview** — normalized conversation feed, runtime state, metadata, and recovery actions
|
|
136
|
+
- **Preview** — connect a local dev URL and interact with the running app
|
|
137
|
+
- **Diff** — file-level change inspection and workspace file browser
|
|
182
138
|
|
|
183
|
-
|
|
139
|
+
<div align="center">
|
|
184
140
|
|
|
185
|
-
|
|
141
|
+
| Dashboard Overview | Session Detail |
|
|
142
|
+
|:---:|:---:|
|
|
143
|
+
|  |  |
|
|
186
144
|
|
|
187
|
-
|
|
145
|
+
</div>
|
|
188
146
|
|
|
189
|
-
|
|
190
|
-
- board editing and task comments
|
|
191
|
-
- session monitoring
|
|
192
|
-
- terminal access
|
|
193
|
-
- preview browser controls
|
|
194
|
-
- diff and file inspection
|
|
195
|
-
- PR and check visibility
|
|
196
|
-
- app update notices and runtime health
|
|
147
|
+
## CLI Reference
|
|
197
148
|
|
|
198
|
-
|
|
149
|
+
The npm launcher (`co`) is the primary CLI. Run `co --help` for the full command list.
|
|
199
150
|
|
|
200
|
-
|
|
151
|
+
| Command | Description |
|
|
152
|
+
|---------|-------------|
|
|
153
|
+
| `co start` | Start the backend and dashboard |
|
|
154
|
+
| `co init` | Scaffold `conductor.yaml` and `CONDUCTOR.md` |
|
|
155
|
+
| `co setup` | Guided first-run configuration |
|
|
156
|
+
| `co doctor` | Diagnose backend and runtime issues |
|
|
157
|
+
| `co spawn` | Create a new session |
|
|
158
|
+
| `co list` | List all sessions |
|
|
159
|
+
| `co status` | Summarize workspace and session state |
|
|
160
|
+
| `co send` | Send a follow-up message to a running session |
|
|
161
|
+
| `co feedback` | Send reviewer feedback into a session |
|
|
162
|
+
| `co retry` | Create a new attempt from a prior task or session |
|
|
163
|
+
| `co restore` | Restore an exited session |
|
|
164
|
+
| `co kill` | Terminate a session |
|
|
165
|
+
| `co cleanup` | Reclaim resources from completed sessions |
|
|
166
|
+
| `co dashboard` | Open the dashboard in a browser |
|
|
167
|
+
| `co mcp-server` | Run Conductor as an MCP server over stdio |
|
|
201
168
|
|
|
202
|
-
-
|
|
203
|
-
- executor discovery and agent adapters
|
|
204
|
-
- direct PTY runtime management
|
|
205
|
-
- workspace and worktree preparation
|
|
206
|
-
- SQLite persistence
|
|
207
|
-
- SSE event streaming
|
|
208
|
-
- terminal websocket transport
|
|
209
|
-
- board automation and filesystem watching
|
|
210
|
-
- GitHub and notification integrations
|
|
169
|
+
A lower-level Rust CLI also exists in `crates/conductor-cli` for direct backend interaction during development.
|
|
211
170
|
|
|
212
|
-
|
|
171
|
+
## Configuration
|
|
213
172
|
|
|
214
|
-
|
|
173
|
+
Conductor uses three local files:
|
|
215
174
|
|
|
216
|
-
|
|
175
|
+
| File | Purpose |
|
|
176
|
+
|------|---------|
|
|
177
|
+
| `conductor.yaml` | Workspace config, project definitions, agent defaults, runtime preferences |
|
|
178
|
+
| `CONDUCTOR.md` | Markdown kanban board for planning and dispatch |
|
|
179
|
+
| `.conductor/conductor.db` | SQLite database for sessions, metadata, and runtime state |
|
|
217
180
|
|
|
218
|
-
|
|
181
|
+
Additional runtime artifacts:
|
|
219
182
|
|
|
220
|
-
-
|
|
221
|
-
-
|
|
222
|
-
- [Terminal QA matrix](docs/terminal-qa-matrix.md) is the sign-off sheet for recorded timings and pass/fail status.
|
|
223
|
-
- `bun run bench:terminal -- <session-id>` runs the lightweight terminal benchmark sweep through the dashboard endpoints.
|
|
183
|
+
- `.conductor/rust-backend/detached/` — PTY session data for terminal restore
|
|
184
|
+
- `attachments/` — Uploaded files and generated session artifacts
|
|
224
185
|
|
|
225
186
|
## Architecture
|
|
226
187
|
|
|
227
|
-
|
|
188
|
+
```
|
|
189
|
+
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
|
190
|
+
│ npm launcher │ │ Next.js 16 UI │ │ Rust backend │
|
|
191
|
+
│ packages/cli │ │ packages/web │ │ conductor- │
|
|
192
|
+
│ │ │ │ │ server │
|
|
193
|
+
│ start, spawn, │───▶│ Dashboard, │◀──▶│ HTTP + SSE + │
|
|
194
|
+
│ init, doctor │ │ Terminal, │ │ WebSocket │
|
|
195
|
+
│ │ │ Diff, Preview │ │ │
|
|
196
|
+
└─────────────────┘ └──────────────────┘ └────────┬────────┘
|
|
197
|
+
│
|
|
198
|
+
┌───────────────────────────────────┤
|
|
199
|
+
│ │
|
|
200
|
+
┌────────▼────────┐ ┌──────────▼──────────┐
|
|
201
|
+
│ conductor-core │ │ conductor-executors │
|
|
202
|
+
│ Types, config, │ │ 10 agent adapters, │
|
|
203
|
+
│ board parsing │ │ process management │
|
|
204
|
+
└─────────────────┘ └──────────────────────┘
|
|
205
|
+
│ │
|
|
206
|
+
┌────────▼────────┐ ┌──────────▼──────────┐
|
|
207
|
+
│ conductor-db │ │ conductor-git │
|
|
208
|
+
│ SQLite via sqlx │ │ Worktree isolation │
|
|
209
|
+
└─────────────────┘ └──────────────────────┘
|
|
210
|
+
```
|
|
228
211
|
|
|
229
|
-
|
|
230
|
-
- Next.js dashboard in `packages/web`
|
|
231
|
-
- Rust backend in `crates/conductor-server`
|
|
212
|
+
### Rust Crates
|
|
232
213
|
|
|
233
|
-
|
|
214
|
+
| Crate | Purpose |
|
|
215
|
+
|-------|---------|
|
|
216
|
+
| `conductor-server` | Axum HTTP server — 24 route modules, session manager, PTY runtime, SSE streaming |
|
|
217
|
+
| `conductor-core` | Shared types, board parser, configuration, task and session models |
|
|
218
|
+
| `conductor-executors` | 10 agent adapters — binary detection, launch commands, prompt delivery |
|
|
219
|
+
| `conductor-db` | SQLite persistence via sqlx with compile-time checked queries |
|
|
220
|
+
| `conductor-git` | Git operations and worktree lifecycle management |
|
|
221
|
+
| `conductor-watcher` | Filesystem watcher for `CONDUCTOR.md` changes |
|
|
222
|
+
| `conductor-cli` | Low-level Rust CLI binary |
|
|
234
223
|
|
|
235
|
-
|
|
236
|
-
- `crates/conductor-core`
|
|
237
|
-
- `crates/conductor-db`
|
|
238
|
-
- `crates/conductor-executors`
|
|
239
|
-
- `crates/conductor-git`
|
|
240
|
-
- `crates/conductor-server`
|
|
241
|
-
- `crates/conductor-watcher`
|
|
224
|
+
### TypeScript Packages
|
|
242
225
|
|
|
243
|
-
|
|
226
|
+
| Package | Purpose |
|
|
227
|
+
|---------|---------|
|
|
228
|
+
| `packages/cli` | npm launcher — user-facing CLI, binary management, process orchestration |
|
|
229
|
+
| `packages/web` | Next.js 16 dashboard — session UI, terminal viewer, board editor, diff tools |
|
|
230
|
+
| `packages/core` | Shared TypeScript types and Zod schemas |
|
|
244
231
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
-
|
|
248
|
-
-
|
|
249
|
-
-
|
|
232
|
+
### Key Design Decisions
|
|
233
|
+
|
|
234
|
+
- **Local-first** — no cloud relay, no credential proxying, all state on disk
|
|
235
|
+
- **SQLite-only** — single-file database, no external DB dependency
|
|
236
|
+
- **Direct PTY** — shell-backed sessions via `portable-pty`, not synthetic chat shells
|
|
237
|
+
- **Agent-agnostic** — Conductor orchestrates; each agent keeps its own auth and billing
|
|
238
|
+
- **Markdown-native** — boards live in `CONDUCTOR.md`, readable in any editor or Obsidian
|
|
239
|
+
- **Worktree isolation** — each session gets its own git worktree to prevent conflicts
|
|
240
|
+
- **TTyD protocol** — binary WebSocket framing for efficient terminal streaming
|
|
250
241
|
|
|
251
242
|
## Develop From Source
|
|
252
243
|
|
|
253
|
-
|
|
244
|
+
### Prerequisites
|
|
254
245
|
|
|
246
|
+
- Rust stable toolchain
|
|
255
247
|
- Bun `>= 1.2`
|
|
256
248
|
- Node.js `>= 18`
|
|
257
|
-
-
|
|
258
|
-
|
|
249
|
+
- `git`
|
|
250
|
+
|
|
251
|
+
### Setup
|
|
259
252
|
|
|
260
253
|
```bash
|
|
261
254
|
bun install
|
|
262
255
|
```
|
|
263
256
|
|
|
264
|
-
|
|
257
|
+
### Commands
|
|
265
258
|
|
|
266
259
|
```bash
|
|
267
|
-
bun run dev:full
|
|
260
|
+
bun run dev:full # Dashboard (port 3000) + Rust backend (port 4749)
|
|
261
|
+
bun run dev # Dashboard only
|
|
262
|
+
bun run dev:backend # Backend only (or: cargo run --bin conductor-server)
|
|
263
|
+
bun run build # Full production build
|
|
264
|
+
bun run typecheck # TypeScript type checking
|
|
265
|
+
|
|
266
|
+
cargo test --workspace # Rust tests
|
|
267
|
+
cargo clippy --workspace -- -D warnings # Rust linting
|
|
268
268
|
```
|
|
269
269
|
|
|
270
|
-
|
|
270
|
+
### Dev Ports
|
|
271
271
|
|
|
272
|
-
|
|
273
|
-
|
|
272
|
+
| Service | Port |
|
|
273
|
+
|---------|------|
|
|
274
|
+
| Dashboard (dev) | `http://localhost:3000` |
|
|
275
|
+
| Dashboard (prod) | `http://127.0.0.1:4747` |
|
|
276
|
+
| Rust backend | `http://127.0.0.1:4749` |
|
|
274
277
|
|
|
275
|
-
|
|
278
|
+
## Demos
|
|
276
279
|
|
|
277
|
-
|
|
278
|
-
bun run dev
|
|
279
|
-
bun run dev:backend
|
|
280
|
-
bun run dev:full
|
|
281
|
-
bun run build
|
|
282
|
-
cargo test --workspace
|
|
283
|
-
cargo clippy --workspace -- -D warnings
|
|
284
|
-
bun run typecheck
|
|
285
|
-
```
|
|
280
|
+
<div align="center">
|
|
286
281
|
|
|
287
|
-
|
|
282
|
+
| Add a task | Auto-dispatch |
|
|
283
|
+
|:---:|:---:|
|
|
284
|
+
|  |  |
|
|
288
285
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
- Preview tooling is strongest when a repo exposes a local dev server or preview URL.
|
|
293
|
-
- Public tunnel-style remote access was removed; protected remote setups should use your own network or proxy layer.
|
|
286
|
+
| Live terminal | PR creation |
|
|
287
|
+
|:---:|:---:|
|
|
288
|
+
|  |  |
|
|
294
289
|
|
|
295
|
-
|
|
290
|
+
</div>
|
|
291
|
+
|
|
292
|
+
## Project Structure
|
|
293
|
+
|
|
294
|
+
```
|
|
295
|
+
conductor-oss/
|
|
296
|
+
├── crates/
|
|
297
|
+
│ ├── conductor-server/ # Axum HTTP server, routes, state, SSE
|
|
298
|
+
│ ├── conductor-core/ # Types, config, board parsing
|
|
299
|
+
│ ├── conductor-executors/ # Agent adapters (10 agents)
|
|
300
|
+
│ ├── conductor-db/ # SQLite persistence
|
|
301
|
+
│ ├── conductor-git/ # Git/worktree operations
|
|
302
|
+
│ ├── conductor-watcher/ # Filesystem watcher
|
|
303
|
+
│ ├── conductor-cli/ # Rust CLI binary
|
|
304
|
+
│ └── notify-rust/ # Desktop notifications
|
|
305
|
+
├── packages/
|
|
306
|
+
│ ├── cli/ # npm launcher
|
|
307
|
+
│ ├── web/ # Next.js dashboard
|
|
308
|
+
│ └── core/ # Shared TypeScript types
|
|
309
|
+
├── docs/
|
|
310
|
+
│ ├── screenshots/ # Dashboard and session screenshots
|
|
311
|
+
│ ├── demo/ # Workflow demo GIFs
|
|
312
|
+
│ └── terminal-*.md # Terminal protocol and QA docs
|
|
313
|
+
├── .github/workflows/ # CI, release, security, PR checks
|
|
314
|
+
├── Cargo.toml # Rust workspace
|
|
315
|
+
├── package.json # Bun workspace
|
|
316
|
+
├── conductor.yaml # Workspace config (user-created)
|
|
317
|
+
├── CONDUCTOR.md # Kanban board (user-created)
|
|
318
|
+
└── LICENSE # MIT
|
|
319
|
+
```
|
|
296
320
|
|
|
297
|
-
|
|
321
|
+
## Known Constraints
|
|
298
322
|
|
|
299
|
-
-
|
|
300
|
-
-
|
|
301
|
-
-
|
|
302
|
-
-
|
|
303
|
-
-
|
|
304
|
-
- recovery
|
|
305
|
-
- review
|
|
306
|
-
- browser-based coordination
|
|
323
|
+
- Agent output quality depends entirely on the upstream CLI you install — Conductor orchestrates, it does not modify agent behavior
|
|
324
|
+
- GitHub-integrated flows (PR creation, check monitoring) work best with `gh` installed and authenticated
|
|
325
|
+
- Preview tooling requires a repo that exposes a local dev server URL
|
|
326
|
+
- Remote access was intentionally removed — use your own network or proxy layer for remote setups
|
|
327
|
+
- The runtime is direct PTY-only; legacy tmux sessions are treated as compatibility data
|
|
307
328
|
|
|
308
329
|
## Links
|
|
309
330
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "conductor-oss",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/launcher.js",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"directory": "packages/cli"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@conductor-oss/core": "0.18.
|
|
36
|
+
"@conductor-oss/core": "0.18.2",
|
|
37
37
|
"chalk": "^5.6.2",
|
|
38
38
|
"commander": "^14.0.3",
|
|
39
39
|
"ora": "^9.3.0",
|
|
@@ -71,9 +71,9 @@
|
|
|
71
71
|
"tailwind-merge": "^3.5.0"
|
|
72
72
|
},
|
|
73
73
|
"optionalDependencies": {
|
|
74
|
-
"conductor-oss-native-darwin-universal": "0.18.
|
|
75
|
-
"conductor-oss-native-linux-x64": "0.18.
|
|
76
|
-
"conductor-oss-native-win32-x64": "0.18.
|
|
74
|
+
"conductor-oss-native-darwin-universal": "0.18.2",
|
|
75
|
+
"conductor-oss-native-linux-x64": "0.18.2",
|
|
76
|
+
"conductor-oss-native-win32-x64": "0.18.2"
|
|
77
77
|
},
|
|
78
78
|
"files": [
|
|
79
79
|
"dist/",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
FHjp9qazH2xWUCRt6mqg4
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
"static/chunks/a6dad97d9634a72d.js"
|
|
8
8
|
],
|
|
9
9
|
"lowPriorityFiles": [
|
|
10
|
-
"static/
|
|
11
|
-
"static/
|
|
10
|
+
"static/FHjp9qazH2xWUCRt6mqg4/_ssgManifest.js",
|
|
11
|
+
"static/FHjp9qazH2xWUCRt6mqg4/_buildManifest.js"
|
|
12
12
|
],
|
|
13
13
|
"rootMainFiles": [
|
|
14
14
|
"static/chunks/723acbe92d3f9e7e.js",
|
|
@@ -83,8 +83,8 @@
|
|
|
83
83
|
"dynamicRoutes": {},
|
|
84
84
|
"notFoundRoutes": [],
|
|
85
85
|
"preview": {
|
|
86
|
-
"previewModeId": "
|
|
87
|
-
"previewModeSigningKey": "
|
|
88
|
-
"previewModeEncryptionKey": "
|
|
86
|
+
"previewModeId": "cd843150be9c66c1676a4916a107fdf2",
|
|
87
|
+
"previewModeSigningKey": "c4a90eb970448dc4eec39fdde6f67807f5de2d72ab66df65b456b17c53cc3f8e",
|
|
88
|
+
"previewModeEncryptionKey": "f144929a66edbb09da9d721e2a0b898aa227b0d367715d44558e68071ac91f50"
|
|
89
89
|
}
|
|
90
90
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/723acbe92d3f9e7e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"
|
|
1
|
+
<!DOCTYPE html><!--FHjp9qazH2xWUCRt6mqg4--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/723acbe92d3f9e7e.js"/><script src="/_next/static/chunks/81e3cea43881b17d.js" async=""></script><script src="/_next/static/chunks/fadfecf0d2ea625f.js" async=""></script><script src="/_next/static/chunks/640c112d1b9a4643.js" async=""></script><script src="/_next/static/chunks/3770166bed1577ce.js" async=""></script><script src="/_next/static/chunks/turbopack-9809b4096e86149a.js" async=""></script><script src="/_next/static/chunks/3350ec1a9ca0dab5.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/723acbe92d3f9e7e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"FHjp9qazH2xWUCRt6mqg4\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/3350ec1a9ca0dab5.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
|