webmux 0.7.2 → 0.8.0
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 +66 -17
- package/backend/dist/server.js +3043 -1437
- package/bin/webmux.js +767 -100
- package/frontend/dist/assets/index-Cu0O1qK6.js +32 -0
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
- package/frontend/dist/assets/index-B8KQ-AWX.js +0 -32
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# webmux
|
|
2
2
|
|
|
3
|
-
A web dashboard for managing parallel AI coding agents.
|
|
3
|
+
A web dashboard for managing parallel AI coding agents. webmux owns git worktree lifecycle, tmux layout, agent runtime events, service health monitoring, and sandbox containers directly.
|
|
4
4
|
|
|
5
5
|
https://github.com/user-attachments/assets/48c9564f-42a5-404f-97e2-c5ee0138f15d
|
|
6
6
|
|
|
@@ -34,12 +34,18 @@ Track dev server ports across worktrees. webmux polls configured services and sh
|
|
|
34
34
|
|
|
35
35
|
Run agents in isolated Docker containers for untrusted or experimental work. webmux manages the container lifecycle, port forwarding, and volume mounts automatically.
|
|
36
36
|
|
|
37
|
+
### Linear Integration
|
|
38
|
+
|
|
39
|
+

|
|
40
|
+
|
|
41
|
+
See your assigned Linear issues alongside your worktrees. Webmux matches branches to issues automatically, so you can browse your backlog, pick an issue, and spin up a worktree for it in one click.
|
|
42
|
+
|
|
37
43
|
## Quick Start
|
|
38
44
|
|
|
39
45
|
```bash
|
|
40
46
|
# 1. Install prerequisites
|
|
41
|
-
cargo install workmux # or: brew install raine/workmux/workmux
|
|
42
47
|
sudo apt install tmux # or: brew install tmux
|
|
48
|
+
sudo apt install python3 # or: brew install python
|
|
43
49
|
curl -fsSL https://bun.sh/install | bash
|
|
44
50
|
|
|
45
51
|
# 2. Install webmux
|
|
@@ -47,7 +53,7 @@ bun install -g webmux
|
|
|
47
53
|
|
|
48
54
|
# 3. Set up your project
|
|
49
55
|
cd /path/to/your/project
|
|
50
|
-
webmux init # creates .
|
|
56
|
+
webmux init # creates .webmux.yaml
|
|
51
57
|
|
|
52
58
|
# 4. Start the dashboard
|
|
53
59
|
webmux # opens on http://localhost:5111
|
|
@@ -58,7 +64,7 @@ webmux # opens on http://localhost:5111
|
|
|
58
64
|
| Tool | Purpose |
|
|
59
65
|
|------|---------|
|
|
60
66
|
| [**bun**](https://bun.sh) | Runtime |
|
|
61
|
-
|
|
|
67
|
+
| **python3** | Per-worktree hook/event helper runtime |
|
|
62
68
|
| **tmux** | Terminal multiplexer |
|
|
63
69
|
| **git** | Worktree management |
|
|
64
70
|
| **gh** | PR and CI status (optional) |
|
|
@@ -66,10 +72,9 @@ webmux # opens on http://localhost:5111
|
|
|
66
72
|
|
|
67
73
|
## Configuration
|
|
68
74
|
|
|
69
|
-
webmux uses
|
|
75
|
+
webmux uses a single config file in the project root:
|
|
70
76
|
|
|
71
|
-
- **`.
|
|
72
|
-
- **`.webmux.yaml`** — Dashboard-specific config: service health checks, profiles, linked repos, and Docker sandbox settings.
|
|
77
|
+
- **`.webmux.yaml`** — Worktree root, pane layout, service ports, profiles, linked repos, and Docker sandbox settings.
|
|
73
78
|
|
|
74
79
|
<details>
|
|
75
80
|
<summary><strong>.webmux.yaml example</strong></summary>
|
|
@@ -77,6 +82,11 @@ webmux uses two config files in the project root:
|
|
|
77
82
|
```yaml
|
|
78
83
|
name: My Project
|
|
79
84
|
|
|
85
|
+
workspace:
|
|
86
|
+
mainBranch: main
|
|
87
|
+
worktreeRoot: __worktrees
|
|
88
|
+
defaultAgent: claude
|
|
89
|
+
|
|
80
90
|
services:
|
|
81
91
|
- name: BE
|
|
82
92
|
portEnv: BACKEND_PORT
|
|
@@ -89,15 +99,26 @@ services:
|
|
|
89
99
|
|
|
90
100
|
profiles:
|
|
91
101
|
default:
|
|
92
|
-
|
|
102
|
+
runtime: host
|
|
103
|
+
yolo: false
|
|
104
|
+
envPassthrough: []
|
|
105
|
+
panes:
|
|
106
|
+
- id: agent
|
|
107
|
+
kind: agent
|
|
108
|
+
focus: true
|
|
109
|
+
- id: frontend
|
|
110
|
+
kind: command
|
|
111
|
+
split: right
|
|
112
|
+
command: FRONTEND_PORT=$FRONTEND_PORT npm run dev
|
|
93
113
|
|
|
94
114
|
sandbox:
|
|
95
|
-
|
|
115
|
+
runtime: docker
|
|
116
|
+
yolo: true
|
|
96
117
|
image: my-sandbox
|
|
97
118
|
envPassthrough:
|
|
98
119
|
- AWS_ACCESS_KEY_ID
|
|
99
120
|
- AWS_SECRET_ACCESS_KEY
|
|
100
|
-
|
|
121
|
+
mounts:
|
|
101
122
|
- hostPath: ~/.codex
|
|
102
123
|
guestPath: /root/.codex
|
|
103
124
|
writable: true
|
|
@@ -108,6 +129,19 @@ profiles:
|
|
|
108
129
|
linkedRepos:
|
|
109
130
|
- repo: myorg/related-service
|
|
110
131
|
alias: svc
|
|
132
|
+
|
|
133
|
+
startupEnvs:
|
|
134
|
+
NODE_ENV: development
|
|
135
|
+
|
|
136
|
+
auto_name:
|
|
137
|
+
model: claude-3-5-haiku-latest
|
|
138
|
+
system_prompt: >
|
|
139
|
+
Generate a concise git branch name from the task description.
|
|
140
|
+
Return only the branch name in lowercase kebab-case.
|
|
141
|
+
|
|
142
|
+
lifecycleHooks:
|
|
143
|
+
postCreate: scripts/post-create.sh
|
|
144
|
+
preRemove: scripts/pre-remove.sh
|
|
111
145
|
```
|
|
112
146
|
|
|
113
147
|
</details>
|
|
@@ -118,25 +152,40 @@ linkedRepos:
|
|
|
118
152
|
| Parameter | Type | Required | Description |
|
|
119
153
|
|-----------|------|----------|-------------|
|
|
120
154
|
| `name` | string | no | Project name shown in sidebar and browser tab |
|
|
155
|
+
| `workspace.mainBranch` | string | no | Base branch used for new worktrees |
|
|
156
|
+
| `workspace.worktreeRoot` | string | no | Relative or absolute directory for managed worktrees |
|
|
157
|
+
| `workspace.defaultAgent` | string | no | Default agent for new worktrees |
|
|
121
158
|
| `services[].name` | string | yes | Display name shown in the dashboard |
|
|
122
159
|
| `services[].portEnv` | string | yes | Env var containing the service port |
|
|
123
160
|
| `services[].portStart` | number | no | Base port for auto-allocation |
|
|
124
161
|
| `services[].portStep` | number | no | Port increment per worktree slot (default: `1`) |
|
|
125
|
-
| `profiles
|
|
162
|
+
| `profiles.<name>.runtime` | string | yes | `host` or `docker` |
|
|
163
|
+
| `profiles.<name>.yolo` | boolean | no | Enables `--dangerously-skip-permissions` for Claude or `--yolo` for Codex |
|
|
164
|
+
| `profiles.<name>.panes[]` | array | yes | Pane layout for that profile |
|
|
165
|
+
| `profiles.<name>.panes[].kind` | string | yes | `agent`, `shell`, or `command` |
|
|
166
|
+
| `profiles.<name>.panes[].command` | string | yes (for `command`) | Startup command run inside the pane |
|
|
126
167
|
| `profiles.default.systemPrompt` | string | no | Agent system prompt; `${VAR}` placeholders expanded at runtime |
|
|
127
168
|
| `profiles.default.envPassthrough` | string[] | no | Env vars passed to the agent process |
|
|
128
|
-
| `profiles.sandbox.name` | string | yes (if used) | Identifier for the sandbox profile |
|
|
129
169
|
| `profiles.sandbox.image` | string | yes (if used) | Docker image for containers |
|
|
130
170
|
| `profiles.sandbox.systemPrompt` | string | no | Agent system prompt for sandbox |
|
|
131
171
|
| `profiles.sandbox.envPassthrough` | string[] | no | Host env vars forwarded into the container |
|
|
132
|
-
| `profiles.sandbox.
|
|
133
|
-
| `profiles.sandbox.
|
|
134
|
-
| `profiles.sandbox.
|
|
135
|
-
| `linkedRepos[].repo` | string | yes | GitHub repo slug (e.g. `org/repo`) |
|
|
136
|
-
| `linkedRepos[].alias` | string | no | Short label for the UI |
|
|
172
|
+
| `profiles.sandbox.mounts[].hostPath` | string | yes | Host path to mount (`~` expands to `$HOME`) |
|
|
173
|
+
| `profiles.sandbox.mounts[].guestPath` | string | no | Container mount path (defaults to `hostPath`) |
|
|
174
|
+
| `profiles.sandbox.mounts[].writable` | boolean | no | `true` for read-write; omit or `false` for read-only |
|
|
175
|
+
| `integrations.github.linkedRepos[].repo` | string | yes | GitHub repo slug (e.g. `org/repo`) |
|
|
176
|
+
| `integrations.github.linkedRepos[].alias` | string | no | Short label for the UI |
|
|
177
|
+
| `startupEnvs.<KEY>` | string or boolean | no | Extra env vars materialized into worktree runtime env |
|
|
178
|
+
| `auto_name.model` | string | no | Model used to generate the branch name when the branch field is left empty; supports Anthropic (`claude-*`), Gemini (`gemini-*`), and OpenAI (`gpt-*`, `chatgpt-*`, `o*`) models |
|
|
179
|
+
| `auto_name.system_prompt` | string | no | System prompt sent to the auto-name model |
|
|
180
|
+
| `lifecycleHooks.postCreate` | string | no | Shell command run after a managed worktree is created and its runtime env is materialized, but before the tmux session/panes are started |
|
|
181
|
+
| `lifecycleHooks.preRemove` | string | no | Shell command run before a managed worktree is removed |
|
|
137
182
|
|
|
138
183
|
</details>
|
|
139
184
|
|
|
185
|
+
Lifecycle hooks run with the worktree as `cwd` and receive the same computed runtime env that the managed panes will use, including `startupEnvs`, allocated service ports, and `WEBMUX_*` metadata.
|
|
186
|
+
|
|
187
|
+
When `auto_name` is enabled, `webmux` calls the provider API directly with structured output and uses `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, or `OPENAI_API_KEY` based on the configured model.
|
|
188
|
+
|
|
140
189
|
## Keyboard Shortcuts
|
|
141
190
|
|
|
142
191
|
| Shortcut | Action |
|