martty
面向 DeepSeek Harness 的 Rust/ratatui Agent TUI,支持流式工具调用、子代理、持久会话和可扩展的 Cordis 客户端界面。
安装
dsh plugin --profile web add martty
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
<p align="center">
<img src="https://raw.githubusercontent.com/openma-ai/Martty/main/assets/martty-lockup.svg" width="650" alt="Martty terminal lockup" />
</p>
<h1 align="center">Martty</h1>
<p align="center">
A DSH-first terminal with the same Cordis plugin model, plus support for other ACP agents.
</p>
Native binaries are packaged for macOS arm64, macOS x64, Linux x64, and Windows
x64. Requires Node.js 22.19+.
Rename note: the project and recommended npm package have moved from
DeepSeek Harness TUI /marttyto Martty /martty.
Configuration and session data remain compatible. The production profile is
nowmartty; legacytuiprofiles continue to work. Thedsh-tuicommand
is no longer installed by the martty package — see
[Migrating from DeepSeek Harness TUI / the scoped package](#migrating-from-deepseek-harness-tui--the-scoped-package).
Global Agent TUI
npm install --global martty martty-cli # the first launch creates `martty`; use `martty` afterwards
Martty directly depends on our @openma/deepseek-harness-acp implementation.
It resolves this built-in ACP from its own dependency graph, connects DSH by
default, and requires no separate ACP installation. For another ACP server,
configure DSH_TUI_AGENT; Cordis embedding can instead provide config.agent
or config.stream. --agent is only the standalone CLI override for the same
connection configuration.
Recommended
npm install --global @deepseek-ai/dsh dsh plugin --profile martty add martty@latest dsh --profile martty
The profile command is the recommended install and upgrade path. It creates a
missing profile and installs the TUI plus its ACP dependency; no global
martty installation is required.
dsh installs plugins with pnpm. Martty declares no install lifecycle scripts
(preinstall/install/postinstall), so it installs under pnpm's strict
build-script policy (ERR_PNPM_IGNORED_BUILDS) without --ignore-scripts. A
profile where an install of 0.3.2 or earlier failed (martty is a dependency
but not in dsh.profile.bundles) needs `dsh plugin --profile martty remove
martty and then add` again.
With such a profile in place, the npm entry point attaches to it too:
npx martty --dsh martty # same as dsh --profile martty, after a version check
Harness resolution and supported dsh
1. Default (martty / npx martty): the bundled @openma/deepseek-harness-acp
and its bundled dsh runtime; ambient installs never override it.
2. --dsh <profile>: the global dsh on PATH with that profile — a profile
carrying martty gets the terminal, one carrying only dsh-acp becomes the
ACP agent. Below the dsh floor Martty falls back to (1) and shows a short
notice (/dismiss hides it).
3. As a dsh plugin (dsh --profile martty): the hosting dsh.
4. An explicit dsh path in a harness recipe (--dsh-path / DSH_PATH).
Supported dsh is a floor, >=0.1.7-rc.2 (engines.dsh, which dsh's own plugin
compatibility check reads), never an exact list. Newer dsh releases are
attempted — API differences are feature-detected, and a dsh newer than the
newest tested one (0.2.1-rc.2) only warns. Below the floor, or when the Host
lacks a required capability, dsh --profile martty still opens the TUI and the
conversation explains the installed version, the floor or missing capability,
and the options (npx martty, or install a supported dsh).
Migrating from DeepSeek Harness TUI / the scoped package
martty is the recommended package name. Starting with 0.2.13, it and the
legacy martty package are published by the same CI run
with identical versions and artifacts. The scoped name is deprecated; switch
package names with:
npm install --global martty
No removal is needed first, whatever state the legacy package is in —
published versions of martty register dsh-tui
(every version) and martty (0.2.14/0.2.20) global commands, and npm linked
legacy checkouts own the same names (a checkout of this repository links as
martty, so it replaces — or is replaced by — an installed martty with no
collision). The martty package declares only martty-cli so npm never
refuses the install over a bin another package owns (EEXIST). It ships no
install scripts: the first launch of martty-cli (or npx martty) retires
the stale martty/dsh-tui/dsb links that verifiably belonged to the
legacy package (a third-party dsh-tui stays untouched), creates the martty
command itself, and detaches the legacy package's bin declarations so a later
npm rm -g can't take martty down with it. Until that first launch a fresh
install has only martty-cli; upgrades from 0.3.2 keep their martty.
Removing martty afterwards is optional
cleanup; martty warns at launch while it remains — on an interactive
terminal the notice prints when the session exits, so the TUI cannot hide
it. And after `npm rm -g
martty, the martty` command left behind is a self-cleaning shim: invoking
it once prints the reinstall hint and removes it — nothing dead is left
in <prefix>/bin.
Inside a dsh profile the same switch is:
dsh plugin --profile tui remove martty dsh plugin --profile martty add martty@latest
The recommended profile changes from tui to martty; runtime behavior,
config, and session data remain unchanged. Legacy tui profiles remain
compatible.
The martty package no longer installs a dsh-tui command: the name
collided with both the legacy package and an unrelated dsh-tui package on
npm, which blocked npm install --global martty outright. If your fingers
still type dsh-tui, alias it: alias dsh-tui=martty.
The profile Host mounts the ACP plugin on Base, then starts a separate TUI
Client process over standard ACP stdin/stdout. For standalone use, run
martty and use --agent <cmd> plus repeated --agent-arg <arg> for another
ACP server.
Harness CLI quick start
Run these commands in a sys
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:47,最后更新 2026-10-17