它做什么
dsh-tianshu-tui 是 Harness 的终端前端,而 README 里关于它最吃重的一句话是架构性的:TUI 自身不注册任何 prompt、工具或上下文面。它画出来的每一处状态都派生自会话事件流,你输入的内容成为一条普通日志消息。这正是它能在不改变模型所见的前提下提供极大界面的原因——也是可以把它当作展示层、而不是一次 agent 改写来对待的原因。
渲染核心是自研的极简 ANSI 引擎,由作者早前的天枢 Tianshu-Tui 项目演进而来(Apache-2.0,逐文件来源见 SOURCE-MAP.md 与 NOTICE)。
| 区域 | README 记录的能力 |
|---|---|
| 会话 | /session new|list|switch、/fork、/branch、/rewind(转录截断 + 可选文件回退)、/export 导出 Markdown、/clear |
| 输入面 | 模糊前缀 slash 菜单(MRU 排序、ghost 预览)、@-路径补全与 @mention 展开、bracketed paste、可选 vim 键位、$EDITOR 转交、历史搜索 |
| 图片 | 剪贴板粘贴、经 kitty / iTerm2 图形协议内联渲染、发送前自适应压缩到长边 1568px |
| 交互 | 结构化提问面板、带内联 diff 预览的审批卡、模式循环(Shift+Tab:normal → plan → always-approve)、命令面板,以及 status / config / skills / tasks / 委派树 / workflow 实时面板 |
| 推理 | 实时思考头行,折叠为紧凑滚动行(✻ 思考 (3.2s) · 12 行),Ctrl+O 原位展开 |
| 主题 | 16+ 内置加 custom:、自动终端检测与 16 色降级、尊重 NO_COLOR、自定义主题按声明背景做对比度警告 |
两半:展示层,以及它站在什么之上
清单把这条分界写得很明确。dsh.runtime 为 "host",dsh.bundle.patch 指向 cordis.patch.yml,后者在 dsh-base 之上插入单行 tui-runner:
- id: tui-runner
name: '@huiliyi37/dsh-tianshu-tui'
TUI 展示的一切都来自宿主;它暴露的能力——图片与视觉桥、记忆、带文件快照的会话持久化、验证门、代码智能、git 工具——位于独立的宿主包中,不随本 bundle 分发,README 对此说得很直白。TUI 是这些能力的主要交互面。
有两条依赖事实在安装前值得读清楚,因为它们决定了这是「一个视图插件」还是「一个带运行时血统的视图插件」:
peerDependencies是官方包——十七个,@deepseek-ai/dsh-agent、-llm、-session、-tools、-subagent、-workflow、-user-approval等均为^0.1.5-rc.1,外加@deepseek-ai/cordis^4.0.2。这些由宿主提供,不要另装。dependencies包含十七个@huiliyi37/dsh-*@0.6.0——TUI 演进自的那条 fork 血统,另有chalk、diff、sharp、string-width、get-east-asian-width。
声明的 Harness 目标为 >=0.1.5-rc.1。它来自 README(「需 ≥ 0.1.5-rc.1」,peer 对齐),而不是 dsh.compatibility 块——清单里没有该字段。本条目把它逐字记录为 dshTarget,因此等级为 L3。
要求与安装
-
Node ≥ 24.4。 README 明确解释了原因:0.1.5 宿主 CLI 入口依赖
import.meta.main,过旧的 Node 会静默无输出。engines.node声明为^22.19 || >=24,比 README 自己的警告更宽松——这里请以 README 为准。 -
先装官方
@deepseek-ai/dshCLI 且版本 ≥0.1.5-rc.1。 本包不是独立程序,只npm i本包跑不起来。 -
用 pnpm,不要用 npm 11。 README 记录了用 npm 11(Node 24 自带)安装官方 CLI 那棵 60+ 包的依赖树时会稳定复现
JavaScript heap out of memory,并建议改用 pnpm。 -
不要直接敲 PATH 上的旧
dsh。 低于0.1.0-rc.8的二进制会把安装带到本地 staging 路径,报ERR_FS_EISDIR/Path is a directory …/@deepseek-ai/dsh。请显式使用pnpm dlx @deepseek-ai/dsh。 -
装进
tuiprofile——这是插件面向的 profile,上面的安装命令保留了它:pnpm dlx @deepseek-ai/dsh plugin --profile tui add @huiliyi37/dsh-tianshu-tui用
github:huiliyi37/dsh-tianshu-tui也可以,因为仓库已包含构建好的lib/index.js。README 说明 pnpm 可能提示 peer missing,可忽略——peer 由宿主提供。 -
启动用
pnpm dlx @deepseek-ai/dsh --profile tui。 欢迎页显示dsh-tianshu-tui品牌即表示加载成功。Ctrl+Q或/exit退出。 -
无安装期生命周期脚本。 声明的脚本为
build、lint、typecheck、test、e2e:tui。 -
LSP 用户的迁移提示: 如果你此前单独装过旧的社区版
github:omdsh-dev/dsh-lsp,请在升级前先移除——两者注册同名模型工具,同时装配会重复注册。
网络与数据
升级检查是它唯一主动出网的行为。 从 npm 安装后,每次启动会对照 npm latest:有新版本就写入 profile 并提示重启。/update 是按需检查且只打印命令、不安装。设置 DSH_TUI_SKIP_UPDATE=1 可关闭该检查。github: / link: 安装不会被改写成 npm 包——如果你刻意钉了某个分支,这一点很重要。
LSP 桥是本地行为。 agent 触碰文件时按扩展名懒启动语言服务,默认单次拉取超时 2000ms(typescript 经 npx 默认可用;pyright、gopls、rust-analyzer、clangd、jdtls 按 PATH 探测)。诊断只进 TUI 本地展示缓存——README 声明它们不写入会话事件、也不注册任何模型面。初始化慢于超时的服务就是静默无诊断,下次触碰文件再拉。
其余一切跟随宿主。 除升级检查外,TUI 不新增自己的出站流量:模型调用、附件与视觉桥都走宿主自己的服务。
未记录遥测。 本条目为 security: unverified,没有第三方扫描或独立审计记录。
已知限制
- 两套依赖,其中一套是 fork 血统。 十七个
@huiliyi37/dsh-*@0.6.0运行时包作为硬依赖发布,而官方 DSH 包是^0.1.5-rc.1的 peer。从依赖角度看它并不是一个轻量展示层,这也让声明的主机下限(>=0.1.5-rc.1)值得遵守而不是试探。 - 图片再询问需要伴生包。
ask_image工具与会话图片注册表位于同仓的独立包@deepseek-ai/dsh-vision-ask。未装配时,已发送的图片无法再次询问,同角度重复描述会再次调用视觉模型;一次性提交时的视觉桥仍然可用。 - LSP 诊断有锋利边缘。 初始化慢于超时的服务静默无输出;大仓库里
tsserver常驻内存;切会话不重启服务,rootUri沿用首个会话的 cwd。 app.ts仍是约 3.2k 行的单体。 README 把它列为待办:挂起状态机已控制器化,渲染组合与键仲裁还没有。- 四个投影模型中只有两个已接线。 README 如实记录了这一点,而不是暗示全覆盖。
- 不要在 Harness 工作区根目录跑
tsdown。 README 警告它会把未发布的@deepseek-ai/dsh-root写进 bundle,加载必失败。 - Star(277)代表关注度,不代表审查。 本站没有条目声称 L4/L5,本条目也不表示已做过冒烟安装。
何时用 / 何时不用
适合你在终端里工作、并且希望整个会话都在终端里的人:可搜索可导出的滚动转录、fork 与 rewind、内联渲染的图片、带 diff 的审批卡、工具卡上的 LSP 诊断,以及你想要时的 vim 键位。「不注册任何模型面」这一性质是它最有力的论据——你能得到大得多的界面,而不改变模型被告知的内容。
不要指望它是无头渲染器,或者能用脚本驱动 Harness:它需要 TTY 和 pnpm 管理的主机。如果你在 Node 低于 24.4,或者不愿离开 npm 11 工具链,请先解决那件事——README 记录的那几个失败模式都是静默的。如果你要的是一个依赖极少的轻量展示层,那它不是——依赖树本身就是设计的一部分。
FAQ
它是插件还是 Harness 的 fork?
是插件——dsh.runtime 为 "host",以单行 tui-runner 装进 profile。但它带着十七个 @huiliyi37/dsh-*@0.6.0 作为依赖,所以也不是零足迹的视图。它需要的官方 DSH 包是宿主提供的 peer。
TUI 会改变模型看到的内容吗?
不会。README 声明它不注册任何 prompt、工具或上下文面:用户输入成为普通日志消息,所有渲染派生自会话事件。例外是面向模型的 LSP 工具(lsp_goto_definition、lsp_find_references、lsp_diagnostics),它们由随包内置的伴生 LSP 插件注册。
为什么每次启动都要查 npm?
为了在有新版本时告诉你——它会把版本写进 profile 并提示重启。/update 只报告。若你希望它永不外呼,设 DSH_TUI_SKIP_UPDATE=1;另外 github: 与 link: 安装永远不会被改写成 npm 包名。
安装报 ERR_FS_EISDIR 是为什么?
README 归因于 PATH 上的旧 dsh 二进制(低于 0.1.0-rc.8),或 ~/.dsh/profiles/node_modules 里旧的安装 fallback 与官方 CLI 冲突。文档给的处置办法是换干净目录启动,例如 DSH_HOME=/tmp/dsh-tianshu pnpm dlx @deepseek-ai/dsh …。
能和另一个 TUI 插件一起用吗?
同一个终端只应由一个前端占用。它可以和宿主自身的能力共存——记忆、workflow、子代理等是可选服务,未装配时 TUI 会明确报不可用,而不是静默吞掉。