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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # webmux
2
2
 
3
- A web dashboard for managing parallel AI coding agents. Built on top of [workmux](https://github.com/raine/workmux), which handles git worktrees and tmux orchestration webmux adds a browser UI with embedded terminals, live status tracking, and CI integration.
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
+ ![linear-1 5x](https://github.com/user-attachments/assets/3187fbe2-eeee-4a33-8780-c51c3575b72a)
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 .workmux.yaml and .webmux.yaml
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
- | [**workmux**](https://github.com/raine/workmux) | Worktree + tmux orchestration |
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 two config files in the project root:
75
+ webmux uses a single config file in the project root:
70
76
 
71
- - **`.workmux.yaml`** — Controls worktree directory, pane layout, agent selection, and lifecycle hooks. See the [workmux docs](https://github.com/raine/workmux).
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
- name: default
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
- name: sandbox
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
- extraMounts:
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.default.name` | string | yes | Identifier for the default profile |
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.extraMounts[].hostPath` | string | yes | Host path to mount (`~` expands to `$HOME`) |
133
- | `profiles.sandbox.extraMounts[].guestPath` | string | no | Container mount path (defaults to `hostPath`) |
134
- | `profiles.sandbox.extraMounts[].writable` | boolean | no | `true` for read-write; omit or `false` for read-only |
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 |