agentforeman 0.1.0__tar.gz
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.
- agentforeman-0.1.0/.gitignore +11 -0
- agentforeman-0.1.0/CHANGELOG.md +36 -0
- agentforeman-0.1.0/CONTRIBUTING.md +53 -0
- agentforeman-0.1.0/LICENSE +21 -0
- agentforeman-0.1.0/PKG-INFO +392 -0
- agentforeman-0.1.0/README.md +363 -0
- agentforeman-0.1.0/SECURITY.md +54 -0
- agentforeman-0.1.0/SPEC.md +533 -0
- agentforeman-0.1.0/agentforeman/__init__.py +3 -0
- agentforeman-0.1.0/agentforeman/__main__.py +5 -0
- agentforeman-0.1.0/agentforeman/agentforeman_hook.py +717 -0
- agentforeman-0.1.0/agentforeman/cli.py +147 -0
- agentforeman-0.1.0/agentforeman/collector.py +1233 -0
- agentforeman-0.1.0/agentforeman/control.py +448 -0
- agentforeman-0.1.0/agentforeman/demo.py +1738 -0
- agentforeman-0.1.0/agentforeman/diffs.py +119 -0
- agentforeman-0.1.0/agentforeman/install.py +227 -0
- agentforeman-0.1.0/agentforeman/rulelib.py +9 -0
- agentforeman-0.1.0/agentforeman/server.py +589 -0
- agentforeman-0.1.0/agentforeman/static/app.css +309 -0
- agentforeman-0.1.0/agentforeman/static/app.js +1337 -0
- agentforeman-0.1.0/agentforeman/static/index.html +51 -0
- agentforeman-0.1.0/pyproject.toml +71 -0
- agentforeman-0.1.0/tests/release_wheel_check.py +92 -0
- agentforeman-0.1.0/tests/test_acceptance.py +693 -0
- agentforeman-0.1.0/tests/test_accuracy.py +396 -0
- agentforeman-0.1.0/tests/test_controls.py +635 -0
- agentforeman-0.1.0/tests/test_demo_home.py +243 -0
- agentforeman-0.1.0/tests/test_demo_media.py +211 -0
- agentforeman-0.1.0/tests/test_foreman_approvals.py +727 -0
- agentforeman-0.1.0/tests/test_foreman_approvals_ui.py +116 -0
- agentforeman-0.1.0/tests/test_foreman_cleanup.py +82 -0
- agentforeman-0.1.0/tests/test_foreman_core.py +597 -0
- agentforeman-0.1.0/tests/test_foreman_core_ui.py +176 -0
- agentforeman-0.1.0/tests/test_hygiene.py +281 -0
- agentforeman-0.1.0/tests/test_record_gifs.py +101 -0
- agentforeman-0.1.0/tests/test_release.py +278 -0
- agentforeman-0.1.0/tests/test_release_ui.py +71 -0
- agentforeman-0.1.0/tests/test_sign_in.py +197 -0
- agentforeman-0.1.0/tests/test_ui_e2e.py +582 -0
- agentforeman-0.1.0/tools/record_gifs.py +439 -0
- agentforeman-0.1.0/tools/record_showcase.py +259 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to AgentForeman are in this file. The format follows Keep a Changelog, and the versions follow Semantic Versioning.
|
|
4
|
+
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
## 0.1.0 - 2026-10-04
|
|
8
|
+
|
|
9
|
+
The first public release.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- One local page that shows every live Claude Code session, its subagents, and recent Codex threads.
|
|
14
|
+
- A Needs attention table for sessions that wait for a reply or an approval, oldest first.
|
|
15
|
+
- Approve or deny a waiting tool call, with the whole command and the diff of an edit.
|
|
16
|
+
- Approve all similar calls in every session with one click.
|
|
17
|
+
- "Always allow" rules that the page suggests after 3 approvals. Rules start off and fail closed.
|
|
18
|
+
- Reply to a session that ended its turn.
|
|
19
|
+
- Steering notes that a running session, subagent, or teammate reads at its next tool call.
|
|
20
|
+
- Stop one subagent or a whole session at its next tool call.
|
|
21
|
+
- A same-file guard that warns or asks before a second session edits a file.
|
|
22
|
+
- Split-pane (tmux) Agent Teams teammates under their lead, with their own controls.
|
|
23
|
+
- A flag for an agent that repeats the same call.
|
|
24
|
+
- A session panel with a timeline, a trace, subagents, and details.
|
|
25
|
+
- Search, a project filter, keyboard keys, an activity chart, and desktop alerts.
|
|
26
|
+
- A theme that follows the system until you pick one.
|
|
27
|
+
- The `agentforeman` command with `serve`, `open`, `demo`, `install`, `uninstall`, and `--version`.
|
|
28
|
+
- `agentforeman demo`, which serves sample sessions from a temporary folder and removes it on exit.
|
|
29
|
+
|
|
30
|
+
### Security
|
|
31
|
+
|
|
32
|
+
- The server listens on `127.0.0.1` only.
|
|
33
|
+
- The page and its data open only with a sign-in link, so other accounts on the Mac cannot use them.
|
|
34
|
+
- The token lives in a file that only you can read, and the browser keeps it in an `HttpOnly` cookie.
|
|
35
|
+
- Host and origin checks and frame blocking guard every action.
|
|
36
|
+
- The control folder has mode `0700`. The installer writes the settings file through a private temporary file.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Contributing to AgentForeman
|
|
2
|
+
|
|
3
|
+
Thank you for your help. This file tells you how to set up the project, run the checks, and send a change.
|
|
4
|
+
|
|
5
|
+
## Every change starts in SPEC.md
|
|
6
|
+
|
|
7
|
+
`SPEC.md` is the contract of AgentForeman. Write the new or changed rule there first. Then change the code and the tests to match it. A pull request that changes behavior without a SPEC change goes back for one.
|
|
8
|
+
|
|
9
|
+
## Set up
|
|
10
|
+
|
|
11
|
+
You need macOS and Python 3.11 or later.
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
git clone https://github.com/xmpuspus/agentforeman
|
|
15
|
+
cd agentforeman
|
|
16
|
+
python3 -m venv .venv
|
|
17
|
+
. .venv/bin/activate
|
|
18
|
+
pip install -e ".[dev]"
|
|
19
|
+
python -m playwright install chromium
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The package itself needs no other package. The `dev` extra adds pytest, Playwright, and ruff for the checks.
|
|
23
|
+
|
|
24
|
+
## Run the checks
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
ruff check .
|
|
28
|
+
ruff format --check .
|
|
29
|
+
pytest -q
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- The tests start real servers on free ports of `127.0.0.1`, against fake Claude Code and Codex folders.
|
|
33
|
+
- The browser tests use Playwright with Chromium.
|
|
34
|
+
- No test reads or writes your real `~/.claude` or `~/.agentforeman`.
|
|
35
|
+
|
|
36
|
+
Never run `agentforeman install` against your real settings while you test. Pass `--settings` and `--control-dir` with paths in a temporary folder.
|
|
37
|
+
|
|
38
|
+
## Code style
|
|
39
|
+
|
|
40
|
+
- Use only the Python standard library at run time.
|
|
41
|
+
- Keep functions small. Write few comments, and make each one say why.
|
|
42
|
+
- The hook file `agentforeman/agentforeman_hook.py` imports only the standard library, because the installer copies it alone.
|
|
43
|
+
- A test changes only when the contract changes. Never loosen an assertion to make a test pass.
|
|
44
|
+
|
|
45
|
+
## Send a change
|
|
46
|
+
|
|
47
|
+
1. Make a branch.
|
|
48
|
+
2. Change `SPEC.md`, then the code and the tests.
|
|
49
|
+
3. Run the checks above.
|
|
50
|
+
4. Add a line to `CHANGELOG.md` under "Unreleased".
|
|
51
|
+
5. Open a pull request that says what changed and why.
|
|
52
|
+
|
|
53
|
+
To report a security problem, read [SECURITY.md](SECURITY.md) first.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Xavier Puspus
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: agentforeman
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Approve, steer, and stop every Claude Code agent from one page.
|
|
5
|
+
Project-URL: Homepage, https://github.com/xmpuspus/agentforeman
|
|
6
|
+
Project-URL: Repository, https://github.com/xmpuspus/agentforeman
|
|
7
|
+
Project-URL: Issues, https://github.com/xmpuspus/agentforeman/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/xmpuspus/agentforeman/blob/main/CHANGELOG.md
|
|
9
|
+
Author: Xavier Puspus
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: agents,approvals,claude,claude-code,codex,dashboard,hooks,subagents
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Environment :: Web Environment
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Software Development
|
|
23
|
+
Requires-Python: >=3.11
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: playwright>=1.45; extra == 'dev'
|
|
26
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
27
|
+
Requires-Dist: ruff<0.16,>=0.15; extra == 'dev'
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+

|
|
31
|
+
|
|
32
|
+
# AgentForeman
|
|
33
|
+
|
|
34
|
+
Approve, steer, and stop every Claude Code agent from one page.
|
|
35
|
+
|
|
36
|
+

|
|
37
|
+
|
|
38
|
+
AgentForeman is a local web page for the Claude Code sessions on your Mac. It shows sessions in VS Code panels and in terminals, their subagents, and your recent Codex threads. It shows which sessions wait for you, and what every agent does now. With its hooks on, you can answer and steer those agents from the same page. It runs on your Mac, and only you can open it.
|
|
39
|
+
|
|
40
|
+
## Why AgentForeman
|
|
41
|
+
|
|
42
|
+
AgentForeman works on the sessions that you already run, and it acts on all of them from one page:
|
|
43
|
+
|
|
44
|
+
- **Works on the sessions you already run.** It finds every Claude Code session on your Mac. You start nothing through it.
|
|
45
|
+
- **Approve with the whole command and its diff.** The card shows the full command, or the diff of an edit.
|
|
46
|
+
- **Approve every matching call at once.** One click answers every waiting call of the same kind, across sessions.
|
|
47
|
+
- **Allow rules from your approvals.** It suggests a rule after repeat approvals. Rules start off, and they fail closed.
|
|
48
|
+
- **Steer a running session.** The agent reads your note at its next tool call, and keeps working.
|
|
49
|
+
- **Stop one subagent or a whole session.** The stop takes effect at the next tool call.
|
|
50
|
+
- **Warn when two sessions edit one file.** The second session gets a warning, or Claude Code asks you first.
|
|
51
|
+
- **Show split-pane teammates.** Agent Teams teammates in their own tmux pane show under their lead.
|
|
52
|
+
- **Local, with nothing to build.** Only the Python standard library. No account and no cloud service.
|
|
53
|
+
|
|
54
|
+
[Compared with other tools](#compared-with-other-tools) shows how 59 other tools differ.
|
|
55
|
+
|
|
56
|
+
## Install
|
|
57
|
+
|
|
58
|
+
With pipx:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
pipx install agentforeman
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
With uv, without an install:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
uvx agentforeman --open
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
From source:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
git clone https://github.com/xmpuspus/agentforeman
|
|
74
|
+
cd agentforeman
|
|
75
|
+
python3 -m agentforeman --open
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Quick start
|
|
79
|
+
|
|
80
|
+
1. See it on sample sessions first. The demo changes no file outside a temporary folder:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
agentforeman demo
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Open the link that it prints. Press `Ctrl+C` to stop the demo.
|
|
87
|
+
|
|
88
|
+
2. Watch your own sessions:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
agentforeman --open
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The page opens in your browser, and the browser stays signed in. To open it again later, or in another browser, run `agentforeman open`. Until you turn on the controls, the page only reads your sessions.
|
|
95
|
+
|
|
96
|
+
3. Turn on the controls, so you can approve, reply, steer, and stop from the page:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
agentforeman install
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
It saves a backup of `~/.claude/settings.json`, then adds four hooks. Running sessions get them without a restart. To remove them, run `agentforeman uninstall`.
|
|
103
|
+
|
|
104
|
+
`serve` is the default command, so `agentforeman --port 4330` works too. Its options:
|
|
105
|
+
|
|
106
|
+
- `--port`: the port of the page. The default is `4320`.
|
|
107
|
+
- `--open`: open the page in your browser.
|
|
108
|
+
- `--claude-dir`: where Claude Code keeps its session files. The default is `~/.claude`.
|
|
109
|
+
- `--codex-dir`: where Codex keeps its thread files. The default is `~/.codex`.
|
|
110
|
+
- `--control-dir`: the folder that the page and the hooks share. The default is `~/.agentforeman`.
|
|
111
|
+
- `--dry-open`: the button **Open in VS Code** returns its commands and runs nothing.
|
|
112
|
+
|
|
113
|
+
`open` takes `--port`, `--control-dir`, and `--print`. With `--print`, it prints the sign-in link instead of opening it.
|
|
114
|
+
|
|
115
|
+
`install` and `uninstall` take `--settings` and `--control-dir`.
|
|
116
|
+
|
|
117
|
+
## Features
|
|
118
|
+
|
|
119
|
+
### See which sessions wait for you
|
|
120
|
+
|
|
121
|
+
The Overview counts the sessions that wait for you, the running and idle sessions, the recent tool calls, and the live sessions. The table **Needs attention** lists each session that waits for you, oldest first. The badge Needs input means that the session ended its turn with a question. The badge Awaiting approval means that a tool call waits for your permission. The browser tab title starts with the count, for example "(3) AgentForeman".
|
|
122
|
+
|
|
123
|
+
### Approve or deny a tool call
|
|
124
|
+
|
|
125
|
+
The card shows the whole command that waits, with its line breaks. For an Edit or a Write, it shows the diff. Click **Approve** or **Deny**. You can also answer in VS Code, the terminal, or the Claude app. The first answer wins, and the card goes away.
|
|
126
|
+
|
|
127
|
+

|
|
128
|
+
|
|
129
|
+
### Approve similar calls at once
|
|
130
|
+
|
|
131
|
+
When other sessions wait for the same kind of call, the card shows **Approve all N**. Click it, then click **Confirm** within 4 seconds.
|
|
132
|
+
|
|
133
|
+

|
|
134
|
+
|
|
135
|
+
### Always allow rules
|
|
136
|
+
|
|
137
|
+
The card names a rule for the call, for example **Always allow Bash(make eval)**. Click it to add the rule. Adding a rule never turns rules on. Turn rules on with the switch on the **Rules** page.
|
|
138
|
+
|
|
139
|
+
While rules are on, a matching call runs at once, also while the page does not run. The Rules page lists each rule with its hits, and the last 20 calls that rules allowed. A rule never matches a command with `$`, a redirect, or a part that no rule covers. Such a call comes to you.
|
|
140
|
+
|
|
141
|
+

|
|
142
|
+
|
|
143
|
+
### Reply to a session
|
|
144
|
+
|
|
145
|
+
When a session ends its turn, its panel shows a reply box. Type your reply, then click **Send reply** or press `Cmd+Enter`. The session wakes up and reads your text.
|
|
146
|
+
|
|
147
|
+
### Steer a running agent
|
|
148
|
+
|
|
149
|
+
A running session, subagent, or teammate has a note box in its panel. The agent gets the note at its next tool call, as extra context, and keeps working. The panel shows when the note arrives. A chip such as "Repeating: Read config.toml x5" marks an agent that makes the same call again and again.
|
|
150
|
+
|
|
151
|
+

|
|
152
|
+
|
|
153
|
+
### Stop a subagent or a session
|
|
154
|
+
|
|
155
|
+
Each running subagent has a **Stop** button. A running session has the button **Stop session**. Click, then confirm within 4 seconds. The agent stops at its next tool call. A command that already runs keeps running until it ends.
|
|
156
|
+
|
|
157
|
+

|
|
158
|
+
|
|
159
|
+
### Same-file guard
|
|
160
|
+
|
|
161
|
+
When two sessions edit one file, the Overview shows the file and both sessions. The guard warns the second session before its edit. On the Rules page, choose **Off**, **Warn**, or **Block**. The mode **Block** makes Claude Code ask you before such an edit.
|
|
162
|
+
|
|
163
|
+

|
|
164
|
+
|
|
165
|
+
### Subagents and teammates
|
|
166
|
+
|
|
167
|
+
The Subagents page groups subagents by session, for the last 6 hours. A subagent that another subagent started sits under its parent. Agent Teams teammates show here too, also the ones in their own split pane.
|
|
168
|
+
|
|
169
|
+

|
|
170
|
+
|
|
171
|
+
### Session panel
|
|
172
|
+
|
|
173
|
+
Click a session row to open its panel. The panel shows a timeline of tool calls, a trace on one clock, the subagents, and the details. The button **Open in VS Code** brings the window of that session forward. The button **Open in Claude app** opens its Remote Control page on claude.ai.
|
|
174
|
+
|
|
175
|
+
### Search and keys
|
|
176
|
+
|
|
177
|
+
Search finds sessions by title, folder, message, file, command, or subagent. The project menu shows one project folder. Keys: `/` searches, `j` and `k` move, `Enter` opens, `o` opens VS Code, and `Esc` closes.
|
|
178
|
+
|
|
179
|
+
### Activity and Codex
|
|
180
|
+
|
|
181
|
+
The page **Activity** shows tool calls per minute for the last 30 minutes, with an event log. The page **Codex** lists Codex threads from the last 48 hours. The theme follows your system until you pick one. With **Alerts** on, a desktop alert shows when a session starts to wait for you.
|
|
182
|
+
|
|
183
|
+
## Compared with other tools
|
|
184
|
+
|
|
185
|
+
We read the README or the docs of 59 tools on 4 October 2026. Most of them fall into three groups:
|
|
186
|
+
|
|
187
|
+
- **Dashboards** show sessions, costs, and logs. A few of them also approve tool calls.
|
|
188
|
+
- **Session managers** start agents for you, often each in its own git worktree. Your sessions run inside them.
|
|
189
|
+
- **Remote approvers** send permission prompts to your phone or a chat app.
|
|
190
|
+
|
|
191
|
+
AgentForeman works on the sessions that you already run, and it acts on all of them from one page. The table shows the tools that have at least one of these features. A dot means that the README or the docs do not mention the feature. It does not prove that the tool lacks it.
|
|
192
|
+
|
|
193
|
+
| Tool | Finds the sessions you run | Approve a call | Note to a running agent | Stop one subagent | Same-file warning | Rules from approvals |
|
|
194
|
+
|---|---|---|---|---|---|---|
|
|
195
|
+
| **AgentForeman** | Yes | Yes, with the diff | Yes | Yes | Yes | Yes |
|
|
196
|
+
| Claude Code Remote Control | One session per connection | Yes | Yes | Yes | · | · |
|
|
197
|
+
| Claude Code agent view | Only after `/bg` | No, attach to answer | Queued | Whole session only | · | · |
|
|
198
|
+
| claude.ai/code | Cloud sessions only | · | Queued | · | · | · |
|
|
199
|
+
| [nikitadoudikov/claude-pulse](https://github.com/nikitadoudikov/claude-pulse) | Yes | Yes | · | · | · | · |
|
|
200
|
+
| [bruceyxli/claude-code-monitor](https://github.com/bruceyxli/claude-code-monitor) | Yes | Yes | · | · | · | · |
|
|
201
|
+
| [tombelieber/claude-view](https://github.com/tombelieber/claude-view) | Yes | · | · | · | · | · |
|
|
202
|
+
| [sverrirsig/claude-control](https://github.com/sverrirsig/claude-control) | · | Yes | · | · | · | · |
|
|
203
|
+
| [d-kimuson/claude-code-viewer](https://github.com/d-kimuson/claude-code-viewer) | · | Yes | · | · | · | · |
|
|
204
|
+
| [tiann/hapi](https://github.com/tiann/hapi) | · | Yes | · | · | · | · |
|
|
205
|
+
| [Justin0504/Aegis](https://github.com/Justin0504/Aegis) | · | Yes | · | · | · | · |
|
|
206
|
+
| [mercurialsolo/claudectl](https://github.com/mercurialsolo/claudectl) | · | Its local model decides | Between its own agents | · | Prevents it in its own swarm | · |
|
|
207
|
+
| [hahahahahahahahah6/edit-guard](https://github.com/hahahahahahahahah6/edit-guard) | · | · | · | · | Blocks stale edits | · |
|
|
208
|
+
| [gantrol/AgentController](https://github.com/gantrol/AgentController) | · | · | Codex only | · | · | · |
|
|
209
|
+
| Seven phone and chat approvers, listed below | · | Yes | · | · | · | · |
|
|
210
|
+
|
|
211
|
+
Stars and dates in the lists below come from GitHub on 4 October 2026.
|
|
212
|
+
|
|
213
|
+
<details>
|
|
214
|
+
<summary>Official tools (5)</summary>
|
|
215
|
+
|
|
216
|
+
| Tool | What it does |
|
|
217
|
+
|---|---|
|
|
218
|
+
| [Claude Code agent view](https://code.claude.com/docs/en/agent-view) | One screen for your background Claude Code sessions, with `claude agents` |
|
|
219
|
+
| [Claude Code Remote Control](https://code.claude.com/docs/en/remote-control) | Continues one local session from claude.ai/code or the Claude mobile app |
|
|
220
|
+
| [Claude Code desktop app](https://code.claude.com/docs/en/desktop) | Parallel sessions with git isolation, panes, a terminal, and a file editor |
|
|
221
|
+
| [claude.ai/code](https://code.claude.com/docs/en/claude-code-on-the-web) | Claude Code sessions that run in the cloud |
|
|
222
|
+
| [Codex app](https://github.com/openai/codex) | The OpenAI client for parallel Codex agents |
|
|
223
|
+
|
|
224
|
+
</details>
|
|
225
|
+
|
|
226
|
+
<details>
|
|
227
|
+
<summary>Dashboards and monitors (10)</summary>
|
|
228
|
+
|
|
229
|
+
| Tool | Stars | What it does |
|
|
230
|
+
|---|---|---|
|
|
231
|
+
| [disler/claude-code-hooks-multi-agent-observability](https://github.com/disler/claude-code-hooks-multi-agent-observability) | 1,545 | Shows Claude Code agents live through hook events |
|
|
232
|
+
| [hoangsonww/Claude-Code-Agent-Monitor](https://github.com/hoangsonww/Claude-Code-Agent-Monitor) | 1,039 | Tracks Claude Code and Codex sessions in a dashboard |
|
|
233
|
+
| [nikitadoudikov/claude-pulse](https://github.com/nikitadoudikov/claude-pulse) | 246 | Watches every local Claude Code and Codex session, with approvals from a phone |
|
|
234
|
+
| [tombelieber/claude-view](https://github.com/tombelieber/claude-view) | 110 | Live dashboard with cost tracking, search, and subagents |
|
|
235
|
+
| [FlorianBruniaux/ccboard](https://github.com/FlorianBruniaux/ccboard) | 96 | Terminal and web dashboard for sessions, costs, and settings |
|
|
236
|
+
| [bruceyxli/claude-code-monitor](https://github.com/bruceyxli/claude-code-monitor) | 13 | Live dashboard for Claude Code sessions, with remote approval |
|
|
237
|
+
| [szaher/claude-monitor](https://github.com/szaher/claude-monitor) | 6 | Shows token use, costs, and tool calls of your sessions |
|
|
238
|
+
| [appaquet/ccmon](https://github.com/appaquet/ccmon) | 0 | Live dashboard for Claude Code sessions |
|
|
239
|
+
| [londondan/AgentConductor](https://github.com/londondan/AgentConductor) | 0 | Claude Code plugin that shows a live agent tree |
|
|
240
|
+
| [Doogit/AgentWrangler](https://github.com/Doogit/AgentWrangler) | 0 | Shows token spend and session outcomes |
|
|
241
|
+
|
|
242
|
+
</details>
|
|
243
|
+
|
|
244
|
+
<details>
|
|
245
|
+
<summary>Session managers that start the agents (26)</summary>
|
|
246
|
+
|
|
247
|
+
| Tool | Stars | What it does |
|
|
248
|
+
|---|---|---|
|
|
249
|
+
| [stablyai/orca](https://github.com/stablyai/orca) | 84,439 | Runs many coding agents side by side, each in its own worktree |
|
|
250
|
+
| [BloopAI/vibe-kanban](https://github.com/BloopAI/vibe-kanban) | 28,256 | Kanban board for coding agents. Its README says that it is ending |
|
|
251
|
+
| [manaflow-ai/cmux](https://github.com/manaflow-ai/cmux) | 27,599 | macOS terminal with tabs and alerts for coding agents |
|
|
252
|
+
| [winfunc/opcode](https://github.com/winfunc/opcode) | 22,425 | Desktop app and toolkit for Claude Code |
|
|
253
|
+
| [superset-sh/superset](https://github.com/superset-sh/superset) | 14,852 | Agent workspace with terminals, code review, and previews |
|
|
254
|
+
| [siteboon/claudecodeui](https://github.com/siteboon/claudecodeui) | 13,922 | Web and mobile client for Claude Code, Codex, and others |
|
|
255
|
+
| [Untrivial-ai/agent-orchestrator](https://github.com/Untrivial-ai/agent-orchestrator) | 12,688 | Plans, runs, and supervises teams of coding agents |
|
|
256
|
+
| [smtg-ai/claude-squad](https://github.com/smtg-ai/claude-squad) | 8,566 | Terminal app for many agents in separate workspaces |
|
|
257
|
+
| [stravu/crystal](https://github.com/stravu/crystal) | 3,123 | Parallel sessions in git worktrees. It is now Nimbalyst |
|
|
258
|
+
| [omnara-ai/omnara](https://github.com/omnara-ai/omnara) | 2,878 | Platform to run and manage agents |
|
|
259
|
+
| [nimbalyst/nimbalyst](https://github.com/nimbalyst/nimbalyst) | 1,828 | Visual workspace for parallel coding agents |
|
|
260
|
+
| [d-kimuson/claude-code-viewer](https://github.com/d-kimuson/claude-code-viewer) | 1,292 | Full web client for Claude Code, with inline approvals |
|
|
261
|
+
| [kbwo/ccmanager](https://github.com/kbwo/ccmanager) | 1,257 | Command line manager for sessions across worktrees |
|
|
262
|
+
| [sugyan/claude-code-webui](https://github.com/sugyan/claude-code-webui) | 1,137 | Web chat for the Claude CLI. Archived |
|
|
263
|
+
| [asheshgoplani/agent-deck](https://github.com/asheshgoplani/agent-deck) | 995 | Terminal session manager for coding agents |
|
|
264
|
+
| [Ark0N/Codeman](https://github.com/Ark0N/Codeman) | 783 | Self-hosted control center for agents in tmux |
|
|
265
|
+
| [built-by-as/FleetCode](https://github.com/built-by-as/FleetCode) | 424 | Runs command line agents in parallel worktrees |
|
|
266
|
+
| [craftzdog/tmux-claude-hatch](https://github.com/craftzdog/tmux-claude-hatch) | 395 | tmux plugin with one Claude Code popup per project |
|
|
267
|
+
| [imbue-ai/sculptor](https://github.com/imbue-ai/sculptor) | 235 | Parallel coding agents in isolated containers |
|
|
268
|
+
| [mercurialsolo/claudectl](https://github.com/mercurialsolo/claudectl) | 202 | Runs a swarm of agents with a local model that approves calls |
|
|
269
|
+
| [sverrirsig/claude-control](https://github.com/sverrirsig/claude-control) | 135 | macOS app that starts and manages sessions, with approvals |
|
|
270
|
+
| [vultuk/claude-code-web](https://github.com/vultuk/claude-code-web) | 97 | Web interface for the Claude Code CLI |
|
|
271
|
+
| [OneStepAt4time/aegis](https://github.com/OneStepAt4time/aegis) | 12 | Starts and manages Claude Code sessions through an API |
|
|
272
|
+
| [superkoh/koloft](https://github.com/superkoh/koloft) | 2 | macOS app that runs and manages sessions |
|
|
273
|
+
| [StanislavBG/claude-code-session-manager](https://github.com/StanislavBG/claude-code-session-manager) | 1 | Schedules sessions and watches the token budget |
|
|
274
|
+
| [Conductor](https://www.conductor.build/) | Closed source | Runs parallel agents in isolated workspaces on your Mac |
|
|
275
|
+
|
|
276
|
+
</details>
|
|
277
|
+
|
|
278
|
+
<details>
|
|
279
|
+
<summary>Remote and mobile control (14)</summary>
|
|
280
|
+
|
|
281
|
+
| Tool | Stars | What it does |
|
|
282
|
+
|---|---|---|
|
|
283
|
+
| [slopus/happy](https://github.com/slopus/happy) | 23,999 | Mobile and web client for Claude Code and Codex |
|
|
284
|
+
| [tiann/hapi](https://github.com/tiann/hapi) | 5,174 | Controls agent sessions from a phone, the web, or Telegram |
|
|
285
|
+
| [overwirehq/claude-code-telegram](https://github.com/overwirehq/claude-code-telegram) | 2,798 | Telegram bot for Claude Code |
|
|
286
|
+
| [gbasin/agentboard](https://github.com/gbasin/agentboard) | 418 | Web interface for tmux, made for agent terminals |
|
|
287
|
+
| [onikan27/claude-code-monitor](https://github.com/onikan27/claude-code-monitor) | 310 | Watches sessions from a terminal or a phone |
|
|
288
|
+
| [yuuichieguchi/claude-remote-approver](https://github.com/yuuichieguchi/claude-remote-approver) | 74 | Approves permission prompts from a phone |
|
|
289
|
+
| [gantrol/AgentController](https://github.com/gantrol/AgentController) | 44 | Controls Codex with a game controller |
|
|
290
|
+
| [jsayubi/ccgram](https://github.com/jsayubi/ccgram) | 27 | Controls Claude Code from Telegram |
|
|
291
|
+
| [coa00/claude-push](https://github.com/coa00/claude-push) | 7 | Sends permission requests to a phone through ntfy |
|
|
292
|
+
| [nickknissen/claude-ntfy-hook](https://github.com/nickknissen/claude-ntfy-hook) | 6 | Allow or Deny from a phone through ntfy |
|
|
293
|
+
| [tsyche/hookline](https://github.com/tsyche/hookline) | 0 | Approves permission prompts from a phone through ntfy |
|
|
294
|
+
| [ssarnecki/claude-code-phone-notifications](https://github.com/ssarnecki/claude-code-phone-notifications) | 0 | Phone alerts with Approve, Approve All, and Deny |
|
|
295
|
+
| [heywood8/claude-mobile-buddy](https://github.com/heywood8/claude-mobile-buddy) | 0 | Approves prompts from an Android phone over Bluetooth |
|
|
296
|
+
| [wolfpeter/claude-session-manager](https://github.com/wolfpeter/claude-session-manager) | 0 | Runs and watches sessions in tmux from a phone |
|
|
297
|
+
|
|
298
|
+
</details>
|
|
299
|
+
|
|
300
|
+
<details>
|
|
301
|
+
<summary>Policy and safety tools (4)</summary>
|
|
302
|
+
|
|
303
|
+
| Tool | Stars | What it does |
|
|
304
|
+
|---|---|---|
|
|
305
|
+
| [Justin0504/Aegis](https://github.com/Justin0504/Aegis) | 479 | Policy rules, approvals, and a kill switch for agents |
|
|
306
|
+
| [anipotts/cc](https://github.com/anipotts/cc) | 2 | Tools for many Claude Code sessions. Archived |
|
|
307
|
+
| [LoveCppp/AgentReins](https://github.com/LoveCppp/AgentReins) | 0 | Safety checks and recovery for coding agents on macOS |
|
|
308
|
+
| [hahahahahahahahah6/edit-guard](https://github.com/hahahahahahahahah6/edit-guard) | 0 | A hook that blocks stale edits across sessions |
|
|
309
|
+
|
|
310
|
+
</details>
|
|
311
|
+
|
|
312
|
+
Usage trackers such as [ccusage](https://github.com/ccusage/ccusage), [Claude-Code-Usage-Monitor](https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor), [ccflare](https://github.com/snipeship/ccflare), and [better-ccusage](https://github.com/cobra91/better-ccusage) count tokens and costs. They do not control sessions, so they are not in the count.
|
|
313
|
+
|
|
314
|
+
If a tool is missing or a row is wrong, open an issue.
|
|
315
|
+
|
|
316
|
+
## Security
|
|
317
|
+
|
|
318
|
+
AgentForeman can approve tool calls, so it guards its own page:
|
|
319
|
+
|
|
320
|
+
- The server listens on `127.0.0.1` only. Other computers cannot connect.
|
|
321
|
+
- The page and its data open only with a sign-in link. Other accounts on your Mac cannot use them.
|
|
322
|
+
- The link holds a token from `~/.agentforeman/token`, which only you can read. The token stays the same across restarts.
|
|
323
|
+
- The browser keeps the token in a cookie that page scripts cannot read.
|
|
324
|
+
- Each button also sends the token. The server refuses a request with a different host name or from another web site.
|
|
325
|
+
- No other page can show AgentForeman inside a frame.
|
|
326
|
+
- AgentForeman trusts other programs of the same macOS user. They can read the same files.
|
|
327
|
+
- Rules are off by default, and they fail closed.
|
|
328
|
+
|
|
329
|
+
[SECURITY.md](SECURITY.md) has the full threat model and tells you how to report a problem.
|
|
330
|
+
|
|
331
|
+
## How it works
|
|
332
|
+
|
|
333
|
+
1. Claude Code writes one small file for each live session in `~/.claude/sessions/`.
|
|
334
|
+
2. AgentForeman keeps the sessions whose process is still alive.
|
|
335
|
+
3. For each session, it reads the end of its transcript in `~/.claude/projects/`, then only new lines.
|
|
336
|
+
4. It reads the subagent files of each session, and the team files of Agent Teams.
|
|
337
|
+
5. For Codex, it reads the thread tables in `~/.codex` in read-only mode.
|
|
338
|
+
6. About every 1.5 seconds, the server sends any change to the open page.
|
|
339
|
+
|
|
340
|
+
AgentForeman never writes to these folders. The controls work through small files in `~/.agentforeman`, which only you can read. A hook writes a file when a tool call waits or a turn ends. The page shows it. When you click, the server writes your answer as a file, and the hook gives it to the session.
|
|
341
|
+
|
|
342
|
+
Each hook fails open, so a broken hook never blocks Claude Code. `SPEC.md` holds the full contract.
|
|
343
|
+
|
|
344
|
+
## Requirements
|
|
345
|
+
|
|
346
|
+
- macOS. The tests do not cover Linux.
|
|
347
|
+
- Python 3.11 or later. Check with `python3 --version`.
|
|
348
|
+
- Claude Code.
|
|
349
|
+
- Codex is optional. The Codex page needs it.
|
|
350
|
+
- VS Code is optional. The button **Open in VS Code** needs it.
|
|
351
|
+
|
|
352
|
+
## Fix common problems
|
|
353
|
+
|
|
354
|
+
- **"Address already in use":** AgentForeman already runs. Run `agentforeman open`, or use `--port 4330`.
|
|
355
|
+
- **The page says "Open AgentForeman from your terminal":** run `agentforeman open`.
|
|
356
|
+
- **The sidebar says "Signed out":** someone deleted `~/.agentforeman/token`. Run `agentforeman open`.
|
|
357
|
+
- **No sessions show:** start a Claude Code session, then wait two seconds.
|
|
358
|
+
- **Still no sessions:** check that `~/.claude/sessions/` holds files.
|
|
359
|
+
- **Open in VS Code fails:** install VS Code in `/Applications`.
|
|
360
|
+
- **Open in VS Code still fails:** in VS Code, run "Shell Command: Install 'code' command in PATH".
|
|
361
|
+
- **The button says Terminal:** that session runs in a terminal, so switch to that terminal window.
|
|
362
|
+
- **The sidebar says Controls off:** run `agentforeman install`.
|
|
363
|
+
- **The sidebar says Controls outdated:** the hook changed in an update. Run `agentforeman install` again.
|
|
364
|
+
- **A question shows no reply box:** its turn ended before the install. Answer in the session this time.
|
|
365
|
+
- **Approve does nothing:** someone answered in VS Code, the terminal, or the Claude app first.
|
|
366
|
+
- **A note never arrives:** the agent makes no tool call now. The note goes away when the turn ends.
|
|
367
|
+
- **A rule does not allow a call:** check that rules are on.
|
|
368
|
+
- **A rule still does not allow it:** a rule never matches a command that it cannot read safely.
|
|
369
|
+
- **Always allow is missing on a card:** that rule grants too much, for example `Bash(sudo apt)`.
|
|
370
|
+
- **Alerts stay off:** allow notifications for `127.0.0.1` in your browser, then click **Alerts off** again.
|
|
371
|
+
- **The first load is slow:** security software on some Macs scans each file that AgentForeman opens.
|
|
372
|
+
- **A hook seems to do nothing:** create the file `~/.agentforeman/debug`, then read `~/.agentforeman/hook.log`.
|
|
373
|
+
|
|
374
|
+
## Development
|
|
375
|
+
|
|
376
|
+
Every change starts in `SPEC.md`. [CONTRIBUTING.md](CONTRIBUTING.md) has the details.
|
|
377
|
+
|
|
378
|
+
```
|
|
379
|
+
python3 -m venv .venv
|
|
380
|
+
. .venv/bin/activate
|
|
381
|
+
pip install -e ".[dev]"
|
|
382
|
+
python -m playwright install chromium
|
|
383
|
+
ruff check .
|
|
384
|
+
ruff format --check .
|
|
385
|
+
pytest -q
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
To record the GIFs again, install ffmpeg and run `python tools/record_gifs.py`. To record the one-minute tour, also install Pillow and run `python tools/record_showcase.py`.
|
|
389
|
+
|
|
390
|
+
## License
|
|
391
|
+
|
|
392
|
+
MIT. See [LICENSE](LICENSE).
|