Ddx Term
БесплатноНе проверенEnables AI agents to execute commands in a shared tmux session that is simultaneously visible to a human via a web-based terminal UI.
Описание
Enables AI agents to execute commands in a shared tmux session that is simultaneously visible to a human via a web-based terminal UI.
README
Shared multi-terminal bridge — one tmux session, many addressable terminals,
attached by a human (web / xterm.js) and an AI agent (MCP) simultaneously,
both looking at the exact same terminals. Architecture in one line: a single
pinned-size tmux session is the shared state; a NestJS broker owns the
canonical terminal registry and fans output to the web UI per-terminal over
WebSocket; an MCP server lets Claude shell out to the same tmux session (it
holds no PTY); a Next.js web app renders the terminals with xterm.js.
Packages
| Package | Role | Port / transport |
|---|---|---|
@ddx/term-contract (packages/ddx-term-contract) |
Shared zod types — WS frames, MCP tool I/O, terminal/session descriptors | library (ESM+CJS+types) |
ddx-term-broker |
Human channel + canonical state: tmux control-mode attach, registry, REST CRUD, per-terminalId WS | HTTP/WS 13330 (DDX_TERM_BROKER_PORT) |
@dudoxx/ddx-term-mcp |
Agent channel: MCP stdio server, thin tmux client (no PTY) | stdio (node dist/server.js) |
ddx-term-web |
Next.js 16 xterm.js UI, one tab per terminalId | HTTP 13340 (DDX_TERM_WEB_PORT) |
Ports default to the high 133XX band on purpose — clear of
3000/5173/8080so the bridge never collides with your own running codebases. Override via env or a.envfile (see Configuration).
ddx-cli-py/ddx-cli-tsare interactive e2e-target fixtures, not workspace packages — they are never built or published from here.
Bring-up
The normal path is agent-driven — you do not start a dev server by hand. Build once,
register the MCP (below), then call any term_* verb: the MCP server's supervisor spawns
the broker (13330) and web (13340) automatically and attaches to them.
pnpm install
pnpm build # builds all packages incl. ddx-term-mcp/dist/server.js
# or just the MCP server + its contract dep:
pnpm --filter @dudoxx/ddx-term-mcp... build
Then open the web UI at http://localhost:13340 to watch the same terminals the agent
drives. Lock files at ~/.ddx-term/{broker,web}.lock make the stack a machine-wide
singleton; set DDX_TERM_WEB=0 to run broker-only (headless).
Hacking on the broker/web themselves?
pnpm devstill runs both concurrently via turbo (broker 13330 + web 13340) for a live edit loop — but it is no longer required for normal agent use. See SETUP.md.
Register the MCP server (agent channel)
Add this to a Claude Code project's .mcp.json (or your Claude Desktop config).
A copy lives in .mcp.json.example — replace /abs/path
with this repo's absolute path:
{
"mcpServers": {
"ddx-term": {
"command": "node",
"args": ["/abs/path/dudoxx-ai-terminal/ddx-term-mcp/dist/server.js"],
"env": {
"DDX_TERM_SOCKET": "/tmp/ddx-term.sock",
"DDX_TERM_SESSION": "ddx-shared",
"DDX_TERM_DEFAULT": "t01",
"DDX_TERM_BROKER_PORT": "13330",
"DDX_TERM_WEB_PORT": "13340"
}
}
}
}
| Env | Default | Purpose |
|---|---|---|
DDX_TERM_SOCKET |
/tmp/ddx-term.sock |
tmux -S socket of the shared session |
DDX_TERM_SESSION |
ddx-shared |
session hosting all terminals (windows) |
DDX_TERM_DEFAULT |
t01 |
terminalId used when a verb omits terminalId |
DDX_TERM_BROKER_PORT |
13330 |
broker HTTP/WS port |
DDX_TERM_WEB_PORT |
13340 |
web UI HTTP port |
DDX_TERM_HOST |
127.0.0.1 |
bind/connect host (loopback by design) |
DDX_TERM_WEB |
(unset → web on) | set 0 to run broker-only (no web spawn) |
The env: block is the per-client override layer — it wins over .env files. The full
table (read caps, allow-list, supervisor-written URLs) is in DEPENDENCIES.md.
Global install (every Claude Code session)
The package is bin-shaped (ddx-term-mcp → dist/server.js) with a prepare
script that builds on install. To register it for all projects, add it to your
user-scope MCP config via the CLI (run from this repo so $PWD resolves):
pnpm -F @dudoxx/ddx-term-mcp build # produces an executable dist/server.js
claude mcp add ddx-term --scope user \
--env DDX_TERM_SOCKET=/tmp/ddx-term.sock \
--env DDX_TERM_SESSION=ddx-shared \
--env DDX_TERM_DEFAULT=t01 \
--env DDX_TERM_BROKER_PORT=13330 \
--env DDX_TERM_WEB_PORT=13340 \
-- node "$PWD/ddx-term-mcp/dist/server.js"
Verify with claude mcp list (look for ddx-term … ✔ Connected).
Configuration
Every setting has a built-in code default and three override layers — highest wins, and
override: false means an explicitly-set var always beats a file:
- The MCP client
env:block (.mcp.json/claude mcp add --env) — per agent / per client. - A project-local
.envin the current working directory. - A global
~/.ddx-term/.env— applies to every client on the machine.
Copy .env.example to .env (project) or ~/.ddx-term/.env (global) and
edit. The MCP server loads both files (src/load-dotenv.ts) before resolving ports; the
broker and web load them too for the standalone pnpm dev path. Example — move the whole
stack onto a different band:
# ~/.ddx-term/.env
DDX_TERM_BROKER_PORT=14330
DDX_TERM_WEB_PORT=14340
.env is gitignored; .env.example is the committed template.
Publishing is wired —
@dudoxx/ddx-term-mcpships as a self-contained npm package. Its publish bundle (build:bundle, tsup) inlines@ddx/term-contractfrom source into a singledist/server.js(noExternal: ['@ddx/term-contract']), keeping onlyzod+@modelcontextprotocol/sdkas external runtime deps. That bundle is wired asprepublishOnly, so the published tarball carries noworkspace:*reference — the contract stays"private": trueand is never published separately (by design; it lives in the changesetignore[]). Once a version is released to the registry (see Release & versioning below), thenpx -y @dudoxx/ddx-term-mcpform resolves. Until the first registry release, register by absolute path as above.
The MCP server is a thin tmux client — it never owns a PTY (no node-pty); it
shells out to tmux against the same session the broker and the human are attached
to. That shared-state property is the whole point: a command the agent types is
visible live in the web UI.
Attach natively from a real terminal emulator (human channel, no browser)
Because the bridge IS a standard tmux session, you can also attach with a native
tmux control-mode client — iTerm2 and WezTerm render tmux -CC natively:
tmux -CC attach -t ddx-shared
This opens the shared terminals as native tabs/windows in iTerm2 / WezTerm, alongside the web UI and the agent — all three see the same terminals.
Verification
pnpm typecheck # turbo run typecheck across all packages
pnpm lint
pnpm test # turbo run test (unit + e2e; e2e spins throwaway tmux on a temp socket)
Release & versioning (Changesets → npm)
Only @dudoxx/ddx-term-mcp publishes to public npm; broker, web, and the
contract are "private": true and listed in .changeset/config.json ignore[].
pnpm changeset # 1. describe the change + pick a bump (patch/minor/major)
git commit && push # 2. open a PR that includes the .changeset/*.md
On merge to main, .github/workflows/release.yml runs Changesets' action:
- It opens (or updates) a "Version Packages" PR that bumps
package.json, writesCHANGELOG.md, and consumes the changeset files. - Merging that PR triggers
pnpm release→build:bundle(tsup, inlines the contract) →changeset publish→npm publishof any package whose version changed.
The publish authenticates via the repo secret NPM_TOKEN (an npm automation
token with publish rights to the @dudoxx scope) and emits provenance
(NPM_CONFIG_PROVENANCE=true). After the first release lands, the
npx -y @dudoxx/ddx-term-mcp registration form resolves.
Verify a tarball before publishing:
cd ddx-term-mcp && pnpm build:bundle && npm pack --dry-run— it must listdist/server.js(self-contained, noworkspace:*),package.json,README.md,INSTALLATION.md,LICENSE, and the twoassets/*.png.
For the full release walkthrough, bump-type guidance, and CI details see CLAUDE_PUBLISHING.md and ddx-documentation/05-publishing/release-flow.md.
Dudoxx UG / Acceleate Consulting - Walid Boudabbous [email protected]
Установка Ddx Term
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/Dudoxx/dudoxx-ai-terminalFAQ
Ddx Term MCP бесплатный?
Да, Ddx Term MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Ddx Term?
Нет, Ddx Term работает без API-ключей и переменных окружения.
Ddx Term — hosted или self-hosted?
Self-hosted: сервер запускается локально на твоей машине командой из раздела установки.
Как установить Ddx Term в Claude Desktop, Claude Code или Cursor?
Открой Ddx Term на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
LibreOffice Tools
Enables AI agents to read, write, and edit Office documents via LibreOffice with token-efficient design. Supports multiple formats including DOCX, XLSX, PPTX, a
автор: passerbyflutterdannote/figma-use
Full Figma control: create shapes, text, components, set styles, auto-layout, variables, export. 80+ tools.
автор: dannoteLogo.dev
Search and retrieve company logos by brand or domain. Customize size, format, and theme to match your design needs. Accelerate design, prototyping, and content
автор: NOVA-3951PIX4Dmatic
Enables GUI automation for controlling PIX4Dmatic on Windows through MCP. Supports launching, focusing, capturing screenshots, sending hotkeys, clicking UI elem
автор: jangjo123Compare Ddx Term with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории design
