🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

极简终端 nano-sun99/dsh-tui-nano

DeepSeek Harness
nano-sun990 天前有提交已提供中文文档扫描:含敏感能力

给 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 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · ui
装得上吗
本站尚未做安装检查
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 0 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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 树与布局。
- 设计样稿与真实终端证据的贡献者。
预览分享卡片长什么样 ↓nano-sun99/dsh-tui-nano
分享 · DeepSeek Harness Hub
nano-sun99/dsh-tui-nano

给 DeepSeek Harness 的极简、克制的终端界面。

回到顶部