给 DeepSeek Harness 的极简、克制的终端界面。
32.3/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add nano-sun99/dsh-tui-nano该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 37 处,展示前 37 条)
- 读取本地文件src/attachments/files.ts:25
const info = await stat(path) - 读取本地文件src/attachments/files.ts:27
const stream = createReadStream(path) as unknown as AsyncIterable<Uint8Array> - 读取本地文件src/attachments/prompt.ts:79
const data = await readFile(absolute) - 读取本地文件src/boot/last-session.ts:48
raw = readFileSync(lastSessionPath(dataRoot), 'utf8') - 写入本地文件src/boot/last-session.ts:112
mkdirSync(dataRoot, { recursive: true, mode: 0o700 }) - 写入本地文件src/boot/last-session.ts:122
renameSync(temporary, target) - 读取本地文件src/boot/official.ts:48
const version = (JSON.parse(readFileSync(installAnchor, 'utf8')) as { version?: unknown }).version - 读取本地文件src/boot/official.ts:72
if (!existsSync(resolved)) throw new Error(`nano: 官方模块缺失:${name}`) - 写入本地文件src/boot/profile.ts:35
mkdirSync(dataRoot, { recursive: true, mode: 0o700 }) - 写入本地文件src/boot/profile.ts:36
mkdirSync(dir, { recursive: true, mode: 0o700 }) - 读取本地文件src/boot/profile.ts:39
if (!existsSync(manifestPath)) { - 写入本地文件src/boot/profile.ts:40
mkdirSync(dir, { recursive: true, mode: 0o700 }) - 读取本地文件src/boot/profile.ts:78
value = JSON.parse(readFileSync(path, 'utf8')) - 读取本地文件src/boot/profile.ts:86
if (!existsSync(path)) { - 写入本地文件src/boot/profile.ts:87
writeFileSync(path, '[]\n', { mode: 0o600 }) - 读取本地文件src/boot/profile.ts:94
value = parseYaml(readFileSync(path, 'utf8')) - 读取本地文件src/boot/profile.ts:103
return statSync(path).size - 写入本地文件src/boot/profile.ts:113
renameSync(path, backup) - 写入本地文件src/boot/root.ts:63
mkdirSync(mountDir, { recursive: true, mode: 0o700 }) - 读取本地文件src/boot/root.ts:102
const parsed = JSON.parse(readFileSync(path, 'utf8')) as { pid?: unknown } - 删除本地文件src/boot/root.ts:121
unlinkSync(path) - 写入本地文件src/input/history.ts:33
mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 }) - 读取本地文件src/input/history.ts:50
if (!existsSync(this.path)) return [] - 删除本地文件递归src/main.ts:66
rmSync(paths.dataRoot, { recursive: true, force: true }) - 执行外部命令来自配置/变量src/main.ts:254
const child = spawn(process.execPath, [process.argv[1] as string, ...mode], { - 读取本地文件src/main.ts:269
const credentials = existsSync(credential) - 读取本地文件src/main.ts:274
.filter((path) => existsSync(path)) - 读取本地文件src/main.ts:340
const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { - 写入本地文件src/runtime/fd-guard.ts:25
mkdirSync(options.logsDir, { recursive: true, mode: 0o700 }) - 执行外部命令来自配置/变量src/runtime/fd-guard.ts:30
const child = spawn(process.execPath, [options.entryScript, ...options.argv], { - 写入本地文件src/runtime/handoff.ts:39
mkdirSync(dataRoot, { recursive: true, mode: 0o700 }) - 写入本地文件src/runtime/handoff.ts:50
renameSync(temporary, target) - 读取本地文件src/runtime/handoff.ts:62
raw = readFileSync(target, 'utf8') - 删除本地文件src/runtime/handoff.ts:86
unlinkSync(path) - 执行外部命令固定命令src/runtime/terminal.ts:142
execFileSync('pbcopy', [], { - 执行外部命令固定命令src/runtime/terminal.ts:236
const output = execFileSync('stty', ['size'], { - 删除本地文件src/schedule/storage.ts:86
rmSync(this.probePath, { force: true })
扫描于 2026/11/3(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
一个极简终端界面,由 DeepSeek Harness 驱动。
README
由 DeepSeek 最新模型翻译生成dsh-tui-nano
给 DeepSeek Harness 的极简、克制的终端界面。
English · 规格 · 发布验收
0.2.2。 当前尚未发布到 npm registry;发布验收与证据见 docs/release/0.2.2/。
这是独立项目,不是 DeepSeek 官方产品。
目录
- 这是什么
- 功能
- 环境要求
- 安装、升级与卸载
- 常用键位
- 主题与透明
- 架构
- 当前状态
- 已知边界
- 开发与测试
- 贡献
- 许可证
- 致谢
这是什么
DeepSeek Harness(dsh)负责智能体、模型、工具、会话、权限与持久化。nano 不重写这些能力,只做一层终端界面:
- 一个 TypeScript 代码库:nano 自己建 Cordis 根,用官方 dsh-app-boot 的 boot() 组装 DSH 核心,UI 作为同根插件运行。
- 单一运行时宿主:runtime 是一个 Node 进程,拥有官方服务、会话与业务状态;CLI 入口只做一次 fd 守护包装(stdout/stderr 绑到日志,终端走独立 /dev/tty)。
- 无自造协议:直接调用官方公开导出、直接订阅官方事件,没有跨进程帧格式。
设计上只做三件事:阅读优先、少装饰、不伪造事实。
展开完整文档(README 剩余 1 节)
dsh-tui-nano
给 DeepSeek Harness 的极简、克制的终端界面。
English · 规格 · 发布验收
0.2.2。 当前尚未发布到 npm registry;发布验收与证据见 docs/release/0.2.2/。
这是独立项目,不是 DeepSeek 官方产品。
目录
- 这是什么
- 功能
- 环境要求
- 安装、升级与卸载
- 常用键位
- 主题与透明
- 架构
- 当前状态
- 已知边界
- 开发与测试
- 贡献
- 许可证
- 致谢
这是什么
DeepSeek Harness(dsh)负责智能体、模型、工具、会话、权限与持久化。nano 不重写这些能力,只做一层终端界面:
- 一个 TypeScript 代码库:nano 自己建 Cordis 根,用官方 dsh-app-boot 的 boot() 组装 DSH 核心,UI 作为同根插件运行。
- 单一运行时宿主:runtime 是一个 Node 进程,拥有官方服务、会话与业务状态;CLI 入口只做一次 fd 守护包装(stdout/stderr 绑到日志,终端走独立 /dev/tty)。
- 无自造协议:直接调用官方公开导出、直接订阅官方事件,没有跨进程帧格式。
设计上只做三件事:阅读优先、少装饰、不伪造事实。会话、权限、模型和工具结果的所有权始终在官方 DSH;nano 只显示回执和状态。
功能
- 对话:多行输入、流式输出、发送 / 插话 / 停止、按地址保存草稿、恢复会话。
- 阅读与决策:工具调用、文件差异、问卷、审批、计划卡;过程默认低强调,按需展开。
- 输入增强:@file 引用、图片 / 通用文件附件、技能目录、项目规矩来源。
- 工作流:! 人工命令、任务面板、交互终端、Monitor 任务输出监听。
- 会话与控制:会话列表 / 恢复 / 改名、上下文占用、/compact、定时任务、子代理。
- 模型与权限:/model 选模型与推理强度,/permission 选权限预设。
环境要求
| 项目 | 要求 |
| 系统 / 终端 | macOS arm64 + Ghostty(手工交互验证;0.2.0 视觉截图未取证;其他环境未验证) |
| Node | ≥ 22.19(engines 声明;入口运行时检查,低于下限给可操作错误并退出) |
| 官方 dsh | 精确 0.2.1-rc.2;未知版本拒绝启动 |
| 凭据 | 由官方 dsh 在 ${DSH_HOME:-~/.dsh} 解析;nano 不复制、不显示凭据值 |
数据根默认 ~/.dsh-tui-nano(可用 NANO_DATA_ROOT 覆盖):应用自持 profile、会话、运行时数据、历史与日志都在这里。$DSH_HOME 中 nano 只写 .anonymous-user-id,其他不改不删。
安装、升级与卸载
安装 / 升级
npm install -g dsh-tui-nano
日常卸载:删包与 bin,保留数据根与应用 profile
npm uninstall -g dsh-tui-nano
连数据一起删:先 purge(bin 仍在时),再卸载
nano purge # 交互确认
nano purge --yes # 非交互环境跳过确认
npm uninstall -g dsh-tui-nano
- 普通卸载保留数据根与 profile;只有 nano purge 会删除 profile、会话、运行时数据与历史。
- nano purge 不依赖 npm 的生命周期脚本(npm v7 起不保证 uninstall 脚本运行),所以顺序必须是「先 purge、后卸载」。
- 首次启动自动初始化应用 profile;升级时逐文件校验,损坏先备份再报错,不覆盖用户 settings。
常用键位
| 快捷键 | 作用 |
| Enter | 提交输入(输入) |
| Shift+Enter / Ctrl+Enter / Alt+Enter | 输入换行(输入) |
| Ctrl+C / Esc | 停止当前回合(保留队列)(运行中) |
| Ctrl+S | 引导当前回合(下一 step 生效)(运行中) |
| Ctrl+X | 停止当前回合并清空队列(运行中 / 空闲) |
| Ctrl+C / Ctrl+D | 退出 Nano(空闲) |
| Backspace | 删除前一个字符(输入) |
| Delete | 删除后一个字符(输入) |
| Alt+Backspace / Ctrl+W | 删除前一个词(输入) |
| Ctrl+U | 清空当前输入(输入) |
| Left / Ctrl+B | 向左移动光标(输入) |
| Right / Ctrl+F | 向右移动光标(输入) |
| Alt+Left / Ctrl+Left | 按词左移(输入) |
| Alt+Right / Ctrl+Right | 按词右移(输入) |
| Home / Ctrl+A | 行首(输入) |
| End / Ctrl+E | 行尾(输入) |
| Up | 上一条历史(当前项目)(输入) |
| Down | 下一条历史(输入) |
| PageUp / Shift+Up | 向上滚动 transcript(全局) |
| PageDown / Shift+Down | 向下滚动 transcript(全局) |
| Ctrl+End | 跳到转录末尾并粘底(全局) |
| Esc | 关闭当前覆盖层(覆盖层) |
| Tab | 切换覆盖层焦点(覆盖层) |
| Ctrl+I | 打开/关闭信息面板(技能/模型/上下文)(空闲 / 输入 / 运行中) |
| Ctrl+L | 打开/关闭会话列表(空闲 / 输入 / 运行中) |
| Ctrl+J | 打开/关闭任务面板(空闲 / 输入 / 运行中) |
| Ctrl+T | 打开/关闭终端面板(空闲 / 输入 / 运行中) |
完整键位与参数见 nano --help。启动方式:nano 新建会话;nano -c 续接当前目录最近的会话;nano -r 打开会话选择器(-r <id> 精确恢复);nano --root <id> 指定会话身份(不存在则新建)。!command 以你的用户权限运行,不是 Agent 授权;输出会作为合成上下文注入,但不唤醒模型。
权限模式:新会话默认 danger-full-access(沙箱关闭、审批 never),普通命令不再逐次确认。启动时可用 --permission-mode read-only|workspace-write|danger-full-access 临时覆盖,--dangerously-skip-permissions 等价于 danger-full-access;优先级为 CLI > DSH_PERMISSION_MODE > 默认值。已有会话保留自己 pin 的 preset,要切换请在会话内执行 /permission danger-full-access。显式选择 workspace-write 时,PTY 仍可能因 /dev/ptmx 被拒而弹审批卡。
主题与透明
- NANO_THEME=dark|light 选择 Nano 自有界面的配色,默认 dark;启动时读取一次,修改后重启生效。
- 自有文字、边框、状态、焦点和 diff 输出固定 RGB,不依赖终端的 ANSI 调色板或默认前景。
- 普通背景保留终端默认背景:壁纸、透明度和模糊照常生效;Nano 不铺整屏实色。
- diff、选择、hover 等局部高亮使用 Nano 自己的 RGB;它们是否参与透明合成由终端决定(Ghostty 的 background-opacity-cells)。
- 内嵌终端保留子程序自己的显式颜色,不做全屏改色。
- macOS 原生全屏会禁用背景透明;要在半透明窗口里使用,请用普通窗口。
- Nano 不读取、不修改你的 Ghostty 配置。
显示调试
- NANO_TOOL_PREVIEW_LINES=4..2000 控制展开工具结果保留的总行数,默认 40(头 24 + 尾 16,中间以「省略 K 行」标记)。这是排查旋钮,不是内存修复:调大等于让界面多存;非法值回退 40。修改后重启进程生效。
架构
Ghostty
└─ nano launcher(fd 守护包装,不持业务) └─ runtime(本包 bin,唯一 Node 宿主 / 终端写入者) ├─ 自建 Cordis 根 │ ├─ 官方核心 profile(应用自持,dsh-base + 官方行) │ └─ nano 插件(UI / 输入 / 渲染,同一根) └─ 官方 DSH:Agent / 模型 / 工具 / 会话 / 权限 / 持久化
顶层目录:
| 路径 | 内容 |
| src/ | nano 的全部实现:boot / runtime / render / input / conversation / 各功能面 |
| scripts/ | 键位文档生成与发布前检查 |
| tests/ | 单元测试、功能面测试、发布级 e2e |
| packaging/ | npm 发布与安装说明(仓库内只保留 npm 一条安装路径) |
| docs/specs/ | 规格与验收标准 |
| docs/release/ | 发布验收、证据与已知限制 |
当前状态
| 项目 | 状态 |
| 0.2.2 发布 | 未发布到 registry;npm pack 产物可全局安装,发布结论见 docs/release/0.2.2/ |
| 平台 | macOS arm64 + Ghostty 手工交互验证;0.2.2 视觉截图未取证(沿用 0.2.0 证据) |
| 首次发布 | dist-tag next;发布结论通过后再提升 latest |
已知边界
- 无崩溃隔离:UI 与业务在同一个 Node 进程里,渲染或业务异常会一起结束;崩溃后靠官方会话持久化恢复。
- 共享事件循环上限:渲染、输入与官方 Agent 共用一个事件循环,重负载下延迟会互相影响。
- 强杀后终端可能残留:SIGKILL 无法被捕获,raw mode 与备用屏可能留在终端里;下次启动会检测脏状态并提示 reset。
- 调度没有暂停 / 恢复:停止任务只能删除;投递非严格一次,可能重复。
- Monitor notify 会计费:默认 quiet(官方 inject,不唤醒、不新建 turn,内容随下一次请求计费);切到 notify 会唤醒模型并产生费用。
- 三处与 v1 不同的行为(用户 2026-10-28 明确保留):Monitor 默认 quiet;冷会话改名允许先取写权限(走受控重启);权限切换失败保留原值并提示「可能已部分生效,请重开 /permission 核对」。
- 只接受官方 dsh 0.2.1-rc.2;未知版本直接拒绝启动,不猜字段、不降级。
- @file 只插入路径,不读取文件内容;模型仍需调用文件工具才能读取。
- 强杀、断电和主动逃逸的后代进程不作清理保证;nano 只负责本窗口拥有的进程组。
完整清单见 docs/release/0.2.0/known-limitations.md。
开发与测试
npm ci
npm run build
npm test # tests/unit(S01)+ tests/feature(S02)
npm run test:e2e # 发布级安装/卸载/启动 e2e(合成 HOME/DSH_HOME)
npm run lint
npm run keymap:docs -- --write # 改了键位后重写 README 的键位区块
scripts/keymap-docs.mjs --check 挂在 prepack:README 键位区块过期时 npm pack 会失败。发布前检查见 scripts/prepack-check.mjs。
真实 Ghostty 截图验收需要桌面权限,按需手动跑;自动化回归默认走无头 PTY,不抢焦点、不动剪贴板。所有集成测试使用临时 DSH_HOME 和数据根,不读写用户的真实会话。
贡献
这是个人主导的早期项目,Issue 和 PR 都欢迎。改动前请先开 issue 对齐范围,避免大改被拒。
- 提交前至少跑 npm test;动了安装/入口再跑 npm run test:e2e。
- 涉及真实终端或视觉的改动,请附真实证据(命令输出、截图或录屏)。
- 当前没有 CI,评审靠人工;请保持改动小、说明清楚。
许可证
MIT,全文见 LICENSE。
致谢
- DeepSeek Harness:智能体、模型、工具、会话与持久化。
- React / react-reconciler / Yoga:UI 树与布局。
- 设计样稿与真实终端证据的贡献者。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
nano-sun99/dsh-tui-nano
给 DeepSeek Harness 的极简、克制的终端界面。
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,344已汉化DSH
71.5
终端编码代理esengine/DeepSeek-Reasonix
· 指南 · ACP · 扩展开发 · 规格 · 官方网站 · Discord · QQ
★ 36,045已汉化DSH
71.2
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,202已汉化DSH
71.1