@oddessentials/agent-guild 1.9.2 → 1.11.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/LICENSE +661 -95
- package/README.md +81 -39
- package/bin/agent-guild.mjs +10 -1
- package/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/package.json +3 -2
- package/src/manager/resume-id.mjs +11 -0
- package/src/manager/session-hooks.mjs +1 -1
- package/src/manager/session-manager.mjs +1 -12
- package/src/mcp/server.mjs +400 -0
- package/web/app.js +42 -19
- package/web/index.html +1 -1
- package/web/styles.css +10 -4
- package/web/videos.json +12 -6
- package/web/yard/art.json +1 -1
package/README.md
CHANGED
|
@@ -1,34 +1,23 @@
|
|
|
1
|
-
<
|
|
2
|
-
<img src="docs/images/banner.webp" alt="Agent Guild: Work hard, play hard. An agentic UI that enhances instead of hinders." width="100%">
|
|
3
|
-
</p>
|
|
1
|
+
<h1 align="center">Agent Guild</h1>
|
|
4
2
|
|
|
5
3
|
<p align="center">
|
|
6
4
|
<a href="https://www.npmjs.com/package/@oddessentials/agent-guild"><img src="https://img.shields.io/npm/v/@oddessentials/agent-guild?color=7c5cff&label=npm" alt="npm version"></a>
|
|
7
5
|
<a href="https://github.com/oddessentials/agent-guild/actions/workflows/release.yml"><img src="https://img.shields.io/github/actions/workflow/status/oddessentials/agent-guild/release.yml?branch=main&label=release" alt="Release status"></a>
|
|
8
6
|
<img src="https://img.shields.io/badge/platforms-Windows%20%7C%20macOS%20%7C%20Linux-e8c47c" alt="Windows, macOS and Linux">
|
|
9
7
|
<img src="https://img.shields.io/node/v/@oddessentials/agent-guild?color=4cc38a" alt="Node.js version">
|
|
10
|
-
<a href="https://www.youtube.com/watch?v=ziT62WtXQ1M"><img src="https://img.shields.io/badge/trailer-watch%20on%20YouTube-e5534b?logo=youtube&logoColor=white" alt="Watch the Agent Guild trailer on YouTube"></a>
|
|
11
|
-
<a href="https://agentguild.oddessentials.ai/"><img src="https://img.shields.io/badge/Agent%20Guild%3A%20World-coming%20soon%20to%20Steam-1b2838?logo=steam&logoColor=white" alt="Agent Guild: World, coming soon to Steam"></a>
|
|
12
|
-
<a href="https://oddessentials.ai/donate/?ref=agent-guild"><img src="https://img.shields.io/badge/support-buy%20the%20lab%20a%20beer-f2a93b" alt="Support Agent Guild: buy the lab a beer"></a>
|
|
13
|
-
</p>
|
|
14
|
-
|
|
15
|
-
<p align="center">
|
|
16
|
-
<picture>
|
|
17
|
-
<source media="(prefers-reduced-motion: reduce)" srcset="docs/images/yard-still.webp">
|
|
18
|
-
<img src="docs/images/yard-clip.webp" alt="Seven coding-agent sessions as characters in the Guild Yard: they leave the plaza for their tools' halls and get to work, then a double-click on one opens Claude Code's real terminal, with its three helper agents" width="100%">
|
|
19
|
-
</picture>
|
|
20
8
|
</p>
|
|
21
9
|
|
|
22
|
-
**
|
|
23
|
-
real
|
|
10
|
+
**Run Claude Code, Codex CLI, Antigravity CLI, Grok Build, Docker Agent and
|
|
11
|
+
your own shells side by side in real terminals. Pick the same live sessions up
|
|
12
|
+
from your phone, VS Code or any browser. Free, on Windows, macOS and Linux.**
|
|
24
13
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
local web page, or from your phone over Tailscale.
|
|
28
|
-
Close the page whenever you like; the sessions keep running.
|
|
14
|
+
Agent Guild is a small manager that runs on your computer and serves one
|
|
15
|
+
local web page. Close the page whenever you like; the sessions keep running.
|
|
29
16
|
|
|
30
|
-
|
|
31
|
-
(
|
|
17
|
+
<picture>
|
|
18
|
+
<source media="(prefers-color-scheme: light)" srcset="docs/images/overview-light.webp">
|
|
19
|
+
<img src="docs/images/overview-dark.webp" alt="Agent Guild with one card per coding tool and six sessions at work">
|
|
20
|
+
</picture>
|
|
32
21
|
|
|
33
22
|
## Quick start
|
|
34
23
|
|
|
@@ -41,13 +30,54 @@ agent-guild
|
|
|
41
30
|
|
|
42
31
|
The page opens in your browser. Press **New** on a tool's card to start a
|
|
43
32
|
session. Sign in to each tool inside its first session, as you would in any
|
|
44
|
-
terminal.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
[
|
|
49
|
-
|
|
50
|
-
|
|
33
|
+
terminal. To look around first, [try the demo](https://oddessentials.github.io/agent-guild/)
|
|
34
|
+
(simulated, nothing installed) or [watch the trailer](https://www.youtube.com/watch?v=_vQuW0v-uMY).
|
|
35
|
+
|
|
36
|
+
**Or ask your agent.** Point it at
|
|
37
|
+
[the setup skill](https://github.com/oddessentials/agent-guild/blob/main/plugins/agent-guild/skills/setup-agent-guild/SKILL.md),
|
|
38
|
+
or run `claude plugin marketplace add oddessentials/agent-guild --sparse .claude-plugin plugins`
|
|
39
|
+
and `claude plugin install agent-guild@agent-guild`. It installs and checks Agent Guild,
|
|
40
|
+
then connects over [MCP](docs/mcp.md) to see and steer your sessions.
|
|
41
|
+
|
|
42
|
+
## Why Agent Guild
|
|
43
|
+
|
|
44
|
+
* **The real CLIs, unchanged.** Each session is the tool itself in a real
|
|
45
|
+
terminal, not a chat copy of it. Whatever sign-in the tool uses works: a
|
|
46
|
+
subscription, an API key, Amazon Bedrock or your own gateway.
|
|
47
|
+
* **Every agent in one place.** Claude Code, Codex CLI, Antigravity CLI, Grok
|
|
48
|
+
Build, Docker Agent, any shell, and tmux or herdr sessions, each card
|
|
49
|
+
showing its helper agents and model, with usage meters for Claude Code and
|
|
50
|
+
Codex CLI.
|
|
51
|
+
* **The same session on every screen.** Any browser, a phone over
|
|
52
|
+
[Tailscale](#remote-access-with-tailscale) with touch keys, VS Code, and
|
|
53
|
+
apps for iPhone, iPad and Vision Pro (beta) and
|
|
54
|
+
[Android](https://github.com/oddessentials/agent-guild-android/releases/latest).
|
|
55
|
+
Apple Watch and Meta Ray-Ban Display list your sessions and read a
|
|
56
|
+
session's last answer aloud.
|
|
57
|
+
* **Native on Windows.** No WSL. Also macOS, Linux, and headless Linux
|
|
58
|
+
servers over SSH.
|
|
59
|
+
* **Nothing in between.** No account and no relay server: the manager
|
|
60
|
+
listens on `127.0.0.1`, and other devices reach it through your own
|
|
61
|
+
Tailscale network or reverse proxy. See [Privacy](#privacy).
|
|
62
|
+
|
|
63
|
+
### How it compares
|
|
64
|
+
|
|
65
|
+
| | Agent Guild | tmux over SSH | Claude Code Remote Control |
|
|
66
|
+
| --- | --- | --- | --- |
|
|
67
|
+
| Agents | Any CLI, side by side | Any CLI | Claude Code |
|
|
68
|
+
| On a phone | The real terminal in a web page or app, with touch keys | An SSH app | A chat view in the Claude app |
|
|
69
|
+
| Sign-in | Whatever the tool uses | Whatever the tool uses | Pro, Max, Team or Enterprise; [not API keys, Bedrock or a gateway](https://code.claude.com/docs/en/remote-control) |
|
|
70
|
+
| Windows without WSL | Yes | No | Yes |
|
|
71
|
+
|
|
72
|
+
**Not yet:** push notifications. Phones and the Apple apps reconnect when you
|
|
73
|
+
open them again; the sessions keep running on the computer in the meantime.
|
|
74
|
+
|
|
75
|
+
**License:** open source under the [GNU AGPL 3.0](LICENSE). Free for
|
|
76
|
+
personal and commercial use.
|
|
77
|
+
|
|
78
|
+
## Requirements
|
|
79
|
+
|
|
80
|
+
| | |
|
|
51
81
|
| --- | --- |
|
|
52
82
|
| Node.js | 22 or newer |
|
|
53
83
|
| Windows | 10 version 1809 or later, x64 or arm64. No WSL needed. |
|
|
@@ -60,15 +90,9 @@ missing tool shows **Install** on its card; Antigravity CLI, which is not on
|
|
|
60
90
|
npm, shows its install command instead. For Docker Agent, see
|
|
61
91
|
[Docker Agent](#docker-agent).
|
|
62
92
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
</picture>
|
|
67
|
-
|
|
68
|
-
**[Agent Guild: World](https://agentguild.oddessentials.ai/)**, coming soon to
|
|
69
|
-
Steam, is the premium 3D window onto the same sessions: six worlds to roam
|
|
70
|
-
with a free camera, Steam Workshop crews and companions, and controller
|
|
71
|
-
support, on Windows, macOS and Linux. Agent Guild and its Yard stay free.
|
|
93
|
+
**[Agent Guild for VS Code](https://marketplace.visualstudio.com/items?itemName=OddEssentials.agent-guild)**
|
|
94
|
+
opens the same page in an editor tab. Editors that install from Open VSX get it
|
|
95
|
+
[there](https://open-vsx.org/extension/OddEssentials/agent-guild).
|
|
72
96
|
|
|
73
97
|
## Setup
|
|
74
98
|
|
|
@@ -193,7 +217,15 @@ The first Claude Code usage meter may ask for access to the
|
|
|
193
217
|
|
|
194
218
|
<img src="docs/images/workspace.webp" alt="Two terminals side by side with the GitHub panel showing the workflow runs of the focused terminal's repository">
|
|
195
219
|
|
|
196
|
-
|
|
220
|
+
### The Yard
|
|
221
|
+
|
|
222
|
+
For fun, the Yard shows your tools and sessions as a 3D world, one for each
|
|
223
|
+
skin. A double-click on a character opens its real terminal.
|
|
224
|
+
|
|
225
|
+
<picture>
|
|
226
|
+
<source media="(prefers-reduced-motion: reduce)" srcset="docs/images/yard-still.webp">
|
|
227
|
+
<img src="docs/images/yard-clip.webp" alt="Seven coding-agent sessions as characters in the Guild Yard: they leave the plaza for their tools' halls and get to work, then a double-click on one opens Claude Code's real terminal, with its three helper agents" width="100%">
|
|
228
|
+
</picture>
|
|
197
229
|
|
|
198
230
|
<table>
|
|
199
231
|
<tr>
|
|
@@ -219,6 +251,7 @@ The first Claude Code usage meter may ask for access to the
|
|
|
219
251
|
| `agent-guild url` | Print the page link with the access token. |
|
|
220
252
|
| `agent-guild start` | Run the manager in the foreground. |
|
|
221
253
|
| `agent-guild doctor` | Diagnose the health of the installation and related tooling. |
|
|
254
|
+
| `agent-guild mcp` | Serve MCP on stdio, so a coding agent can see and steer the sessions. See [Agent Guild for agents](docs/mcp.md). |
|
|
222
255
|
| `agent-guild --version` | Print the installed Agent Guild version (`-v` or `version`). |
|
|
223
256
|
|
|
224
257
|
Sessions end when the manager stops or the computer restarts. tmux and herdr
|
|
@@ -252,11 +285,19 @@ Failed news, model list and release checks retry after 10 minutes.
|
|
|
252
285
|
|
|
253
286
|
## More
|
|
254
287
|
|
|
288
|
+
* [Agent Guild for agents](docs/mcp.md): the MCP server, and a plugin and skill that set Agent Guild up
|
|
255
289
|
* [Configuration](docs/configuration.md): add tools, accounts, environment variables, reverse proxies
|
|
256
290
|
* [Agent reporting](docs/agent-reporting.md): show agents from any tool
|
|
257
291
|
* [Skins](docs/SKINS.md): make your own look
|
|
258
292
|
* [Contributing](CONTRIBUTING.md)
|
|
259
293
|
|
|
294
|
+
## Agent Guild: World
|
|
295
|
+
|
|
296
|
+
[Agent Guild: World](https://agentguild.oddessentials.ai/), coming soon to
|
|
297
|
+
Steam, is a separate, premium 3D window onto the same sessions: six worlds to
|
|
298
|
+
roam with a free camera, Steam Workshop crews and companions, and controller
|
|
299
|
+
support, on Windows, macOS and Linux. Agent Guild and its Yard stay free.
|
|
300
|
+
|
|
260
301
|
## Support
|
|
261
302
|
|
|
262
303
|
Agent Guild is free to use. If it saves you time,
|
|
@@ -265,4 +306,5 @@ tax-deductible donation, and it changes nothing about the software.
|
|
|
265
306
|
|
|
266
307
|
## License
|
|
267
308
|
|
|
268
|
-
|
|
309
|
+
Copyright (c) 2026 Odd Essentials. Licensed under the
|
|
310
|
+
[GNU Affero General Public License 3.0](LICENSE).
|
package/bin/agent-guild.mjs
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// agent-guild restart stop the manager and start it again (ends all sessions)
|
|
8
8
|
// agent-guild status show whether the manager is running
|
|
9
9
|
// agent-guild url print the page URL (includes the access token)
|
|
10
|
+
// agent-guild mcp serve the Model Context Protocol on stdio, for coding agents
|
|
10
11
|
|
|
11
12
|
import fs from 'node:fs';
|
|
12
13
|
import { spawn } from 'node:child_process';
|
|
@@ -35,6 +36,8 @@ Commands:
|
|
|
35
36
|
status Show whether the session manager is running
|
|
36
37
|
url Print the web page URL, including the access token
|
|
37
38
|
doctor Diagnose the health of the installation and related tooling
|
|
39
|
+
mcp Serve the Model Context Protocol on stdio, so a coding agent can
|
|
40
|
+
see and steer the sessions (--allow-input lets it type into them)
|
|
38
41
|
|
|
39
42
|
Options:
|
|
40
43
|
-v, --version Print the installed Agent Guild version
|
|
@@ -90,7 +93,7 @@ function openBrowser(url) {
|
|
|
90
93
|
// rundll32 avoids cmd.exe's special handling of characters like "&" in URLs.
|
|
91
94
|
child = spawn('rundll32', ['url.dll,FileProtocolHandler', url], { ...opts, windowsHide: true });
|
|
92
95
|
} else child = spawn('xdg-open', [url], opts);
|
|
93
|
-
child.on('error', () => console.log(
|
|
96
|
+
child.on('error', () => console.log('Could not open a browser automatically. Run `agent-guild url` to print the page link.'));
|
|
94
97
|
child.unref();
|
|
95
98
|
}
|
|
96
99
|
|
|
@@ -336,6 +339,12 @@ async function main() {
|
|
|
336
339
|
console.log(pageUrl(baseUrl(), loadOrCreateToken()));
|
|
337
340
|
return undefined;
|
|
338
341
|
}
|
|
342
|
+
case 'mcp': {
|
|
343
|
+
// stdout carries only protocol messages from here on.
|
|
344
|
+
const { serveMcp } = await import('../src/mcp/server.mjs');
|
|
345
|
+
await serveMcp({ allowInput: flags.has('--allow-input') });
|
|
346
|
+
return undefined;
|
|
347
|
+
}
|
|
339
348
|
default:
|
|
340
349
|
usage();
|
|
341
350
|
process.exitCode = 2;
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oddessentials/agent-guild",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "Launch and watch AI coding-assistant terminal sessions from one local web page. A bundled session manager owns the terminals so the page can close and reconnect.",
|
|
5
|
-
"
|
|
5
|
+
"mcpName": "ai.oddessentials/agent-guild",
|
|
6
|
+
"license": "AGPL-3.0-only",
|
|
6
7
|
"repository": {
|
|
7
8
|
"type": "git",
|
|
8
9
|
"url": "git+https://github.com/oddessentials/agent-guild.git"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const MAX_RESUME_ID = 200;
|
|
2
|
+
|
|
3
|
+
/** A session id or name to resume: one printable line, or null when absent. */
|
|
4
|
+
export function cleanResumeId(resume) {
|
|
5
|
+
if (resume === undefined || resume === null) return null;
|
|
6
|
+
const id = String(resume).trim();
|
|
7
|
+
if (!id || id.length > MAX_RESUME_ID || /\p{Cc}/u.test(id) || id.startsWith('-')) {
|
|
8
|
+
throw Object.assign(new Error(`resume must be a printable id of at most ${MAX_RESUME_ID} characters that does not start with "-"`), { status: 400, code: 'bad_resume' });
|
|
9
|
+
}
|
|
10
|
+
return id;
|
|
11
|
+
}
|
|
@@ -135,7 +135,7 @@ export function grokHooksState(dir, files) {
|
|
|
135
135
|
|
|
136
136
|
export function bundleFiles(version, { platform = process.platform } = {}) {
|
|
137
137
|
const json = (value) => `${JSON.stringify(value, null, 2)}\n`;
|
|
138
|
-
const manifest = { name: PLUGIN_NAME
|
|
138
|
+
const manifest = { name: `${PLUGIN_NAME}-reporting`, version, description: MANIFEST_DESCRIPTION };
|
|
139
139
|
return {
|
|
140
140
|
claude: {
|
|
141
141
|
'.claude-plugin/plugin.json': json(manifest),
|
|
@@ -16,6 +16,7 @@ import { DockerSessions } from './docker-sessions.mjs';
|
|
|
16
16
|
import { SELF_PROVIDER } from './self-update.mjs';
|
|
17
17
|
import { GITHUB_PROVIDER, dropsFromCloneEnv, parseRepo } from './github.mjs';
|
|
18
18
|
import { pathIdentity } from './multiplexer-paths.mjs';
|
|
19
|
+
import { cleanResumeId } from './resume-id.mjs';
|
|
19
20
|
|
|
20
21
|
export const MAX_SESSIONS = 32;
|
|
21
22
|
const TMUX_SESSION_GONE = [/^can't find session/m, /^no server running on /m, /^error connecting to .*\(No such file or directory\)$/m];
|
|
@@ -878,18 +879,6 @@ export function modelFromArgs(args) {
|
|
|
878
879
|
return null;
|
|
879
880
|
}
|
|
880
881
|
|
|
881
|
-
const MAX_RESUME_ID = 200;
|
|
882
|
-
|
|
883
|
-
/** A session id or name to resume: one printable line, or null when absent. */
|
|
884
|
-
export function cleanResumeId(resume) {
|
|
885
|
-
if (resume === undefined || resume === null) return null;
|
|
886
|
-
const id = String(resume).trim();
|
|
887
|
-
if (!id || id.length > MAX_RESUME_ID || /\p{Cc}/u.test(id)) {
|
|
888
|
-
throw httpError(400, `resume must be a printable id of at most ${MAX_RESUME_ID} characters`, 'bad_resume');
|
|
889
|
-
}
|
|
890
|
-
return id;
|
|
891
|
-
}
|
|
892
|
-
|
|
893
882
|
export function timingSafeEqualString(a, b) {
|
|
894
883
|
if (typeof a !== 'string' || typeof b !== 'string') return false;
|
|
895
884
|
const ab = Buffer.from(a);
|