dsh-tui-theme 🌸

September 12, 2026 · View on GitHub

dsh-TUI 的樱花粉主题插件。一个包带来五种个性化,全部走官方接缝:

个性化接缝说明
三套粉色主题主题运行时(dsh-TUI ≥ 0.10.0)/ 静态资产(旧宿主)pink-night 夜樱 / pink-day 昼樱 / pink-ansi 樱·ANSI;新宿主优先即时注册,服务晚到时短暂回退并清理本次文件,旧宿主使用 ~/.dsh-tui/themes/
缓存背景跟随设置 + 本地缓存可选地应用已有 theme-follow.json 的昼樱/夜樱结果;不直接读取终端输入或发送 OSC 查询
花符状态行tuiStatus输入框上方一行小装饰:✿ · 时钟 · 实时轮数(默认仅粉主题下显示);dsh-TUI ≥ 0.10.1 经富状态视图按主题配色渲染,旧宿主为无色标量行
设置面板tuiSettingsSections/settings 里一个可编辑区块(背景跟随 / 状态行两组子页),改完即时生效
屏幕提示tuiToast(dsh-TUI ≥ 0.10.0)背景跟随结果、主题文件自愈、旧文件遮蔽提醒各弹一行短提示;旧宿主自动静默降级
旧文件清理tuiDialogs(dsh-TUI ≥ 0.9.3)检测到遮蔽旧主题文件时,额外提供一次性宿主确认对话框,确认后清理逐字节相同的副本;拒绝/忽略则不做任何改动

明确不做的事:不注册快捷键、不注册/修改任何命令、不拦截输入、不追加会话事件、不注入 system prompt(tuiDialogs 是宿主托管的中性确认面板:宿主自渲染、宿主拥有键盘,插件只提交请求,不属于输入拦截)。卸载即无痕(可选删除主题文件)。

主题预览

主题基底风格
pink-night 夜樱dark暗梅底、玫瑰粉强调,宿主 Theme 全键覆盖(0.10.x 为 73 语义键,旧键名经宿主别名映射兼容)
pink-day 昼樱light象牙粉底、墨梅正文、柔和玫瑰强调(已通过宿主浅色身份判定)
pink-ansi 樱·ANSIdark-ansi16 色 ANSI 回退,品牌色映射到 magenta 系

三套均通过 dsh-TUI 官方校验器(零警告、全键覆盖)与 WCAG 对比度检查(正文 ≥ 11:1)。

截图

主题主界面截图实测于 dsh-tui 0.9.2;0.9.3 的 /settings 卡片界面见下图:

昼樱 pink-day夜樱 pink-night
pink-day 主题界面pink-night 主题界面

/settings 里的 pink-theme 区块(终端背景 / 花符 / 时钟 / 轮数 / 状态行展示,保存即时生效):

pink-theme 设置区块

图中 ❯ 提示符与链接是宿主硬编码的,见下文宿主限制

缓存背景跟随

dsh-TUI 没有向插件公开安全的终端查询接缝。为了不与宿主的 stdin/raw-mode 生命周期竞争,插件不会直接发送 OSC 11,也不会读取终端输入。

“应用上次保存的终端背景”开启后:

  • 启动时读取 ~/.dsh-tui/theme-follow.json 中已有的 light 结果,亮 → pink-day,暗 → pink-night,并将选择写入 ~/.dsh-tui/theme.json
  • 不存在缓存时完全保留当前 /theme 选择;插件不会自行创建或刷新缓存;
  • 默认关闭。该缓存可由之前的兼容版本留下;未来 dsh-TUI 提供宿主拥有的查询接缝后,插件才会安全地恢复刷新能力;
  • 开启后该缓存会在启动时覆盖 /theme 的持久选择;关闭即可恢复手动选择;
  • DSH_TUI_THEME 环境变量仍然最优先(宿主行为,插件不覆盖环境变量)。

dsh-TUI ≥ 0.10.0 上,跟随结果会以 toast 短提示呈现:真正改写了 theme.json 时提示「已按保存的终端背景改用 …,/reload 即时生效」(当前画面仍显示旧主题,/reload 或重启后生效);在 /settings 里手动开启但无缓存时如实提示「没有保存的终端背景缓存」。启动基线未变化时保持安静,避免每次开机重复打扰。

屏幕提示(toast)

插件日志对 TUI 用户不可见,因此少数值得知道的事件会走宿主 toast(dsh-TUI ≥ 0.10.0 的 tuiToast 接缝,纯输出、不拦截任何输入;旧宿主没有该接缝,自动退回纯日志行为):

事件提示
背景跟随改写了主题偏好✿ 已按保存的终端背景改用 …,/reload 即时生效
手动开启跟随且缓存与当前一致✿ 已按保存的终端背景保持 …
手动开启跟随但无缓存✿ 没有保存的终端背景缓存,保持当前主题(警告色)
主题文件损坏被自动修复✿ 已修复损坏的主题文件:…(警告色)
旧版遗留的同名主题文件与内置版本完全相同✿ … 与插件内置相同,删除后配色将随插件自动更新

最后一条只针对与内置副本逐字节相同的文件——你手动调过色的文件永远不会被提及或删除。遮蔽场景还会在支持该接缝的宿主上(dsh-TUI ≥ 0.9.3)提供一次性确认对话框:确认后插件按同样的逐字节校验清理副本并以 toast 反馈结果,拒绝/忽略则一切维持现状。

安装

# 方式一:从 npm(已发布)
dsh plugin --profile dsh-tui add -w dsh-tui-theme@latest

# 方式二:本地 tarball(开发/自用;不要直接安装源码目录)
cd /path/to/dsh-tui-theme
npm run build
npm pack
dsh plugin --profile dsh-tui add -w ./dsh-tui-theme-<版本>.tgz

不要以本地源码目录作为依赖安装:其开发 node_modules 可能与 dsh-TUI 宿主解析出不同的 Cordis/DSH framework instance,造成插件无法注册服务。

升级

# npm 已发布版本:请求最新版本并刷新 profile 依赖
dsh plugin --profile dsh-tui add -w dsh-tui-theme@latest

在 dsh-TUI ≥ 0.10.0 中,三套主题通过 ctx.tuiThemes 运行时注册:调色板随插件即时生效,正常挂载时不写入用户目录,主题选择器显示中文 displayName。若服务晚到,插件会先同步回退到静态路径,并在确认运行时服务后删除本次写入且仍未被改写的文件。旧宿主使用静态文件路径:插件只在主题文件缺失时复制,绝不覆盖你编辑过的 ~/.dsh-tui/themes/pink-*.json。唯一的例外是已损坏的目标文件(无法解析为 JSON,例如安装中途中断留下的残文件):插件会把它改名为 <文件名>.corrupt-<时间戳> 保留现场,再重新安装内置副本,记录一条警告,并在支持 toast 的宿主上弹一条屏幕提示。

从旧宿主升级后,若希望改用运行时托管,请先备份并删除 ~/.dsh-tui/themes/pink-{night,day,ansi}.json;插件不会自动删除用户文件。遗留文件若与内置副本完全相同,插件会在运行时托管确认时弹一条一次性提醒,并额外提供一次性确认对话框(宿主 tuiDialogs 面板):确认删除则清理这些遮蔽副本,拒绝或忽略则不做任何改动;你手动调过色的文件永远不会被提及或删除。

旧宿主重启 dsh-TUI 后插件会把三套主题复制进 ~/.dsh-tui/themes/仅缺失时复制,绝不覆盖你已有的同名文件);0.10.0 及更新宿主则直接使用运行时注册,然后:

# 在 dsh-TUI 里
/theme              # 选择器:夜樱 / 昼樱 / 樱·ANSI
/theme pink-night   # 或直接切换(开启跟随后由插件接管)

配置

配置有三层,优先级:/settings 用户层 > cordis.yml 配置层 > 内置默认值。

/settings 里找到 pink-theme 区块即可编辑(分「背景跟随」「状态行」两组子页):

字段默认说明
followSystemfalse启动时应用上次保存的终端背景结果(昼樱 ↔ 夜樱);插件不刷新缓存。开启时该字段会直接显示缓存状态,如 on(缓存: light · 2026-09-12)on(无缓存,启动时不动)
showGlyphtrue花符开关:开 = 以花符开头,关 = 不显示
statusGlyph花符字符(文本字段):1–2 个显示单元、不接受控制字符,留空恢复默认
showClocktrue显示 HH:MM 时钟
showTurnstrue显示当前会话轮数(N✦,自本次启动起计)
statusSeparator·各段之间的分隔符(文本字段):同花符字符的校验规则
statusScopepink-only状态行展示:pink-only 仅樱花粉主题 / all-themes 所有主题

三项装饰全关时状态行整体消失。另有仅 profile 层的开关(cordis.patch.yml,不出现在 /settings):autoInstallThemesstatusEnabled

受宿主限制、目前无法定制的部分

以下元素的颜色/形态由 dsh-TUI 宿主硬编码,不读取任何主题键,主题 JSON 与插件接缝都覆盖不到(dsh-TUI 0.9.3 实测):

元素现状位置(宿主源码)
输入框 ❯ 提示符默认态无颜色参数(终端默认前景色,模型工作时变暗);最高推理档充能动画用写死的蓝色 ramp(深色端 #82B9FF / 浅色端 #1E5FEBEffortChargeGlyph.tsxtrajectory/effortIgnition.ts
底栏上下文进度条分段色system / prompt / assistant / thinking / tools 五段为写死的藏青→品牌蓝系#22305F#5A7CFF),永远不随主题变化screens/StatusMetrics.ts
进度条空余段配色宿主按 themeName === 'light' 字符串比较取浅色配色——自定义浅色主题(如 pink-day)不等于 'light',会拿到深色空余段,在浅色终端上偏深screens/StatusLine.tsx
状态行文字颜色旧路径标量状态行(tuiStatus.set)由宿主统一以无色 + 终端 dim 渲染;dsh-TUI ≥ 0.10.1 插件已改用 tuiStatus.registerView 富状态视图按主题配色渲染(✿ 品牌色 / 正文 text 色 / 分隔符 subtle 色,颜色取自生效主题文件,pink-ansi 为具名 ANSI 值),旧宿主自动回退标量路径(无色 + dim)screens/Chat.tsxdsh-adapter/status.ts
输入框块状光标宿主挂载期间隐藏终端原生光标(?25l),输入框光标由应用以反色字符自绘(<Text inverse>),颜色即主题 text/background 的反色——OSC 12 光标色只能染到不可见的原生光标,插件无法给输入光标上色(辅助功能模式 CLAUDE_CODE_ACCESSIBILITY=1 下原生光标才可见)ink/components/App.tsxcomponents/PromptInput.tsx
正文链接OSC 8 超链接默认写死的 ANSI 蓝chalk.blue);注释说明 wrap-ansi 无法跨 OSC 8 保留主题 RGB 色,故链接色不读主题键cc/hyperlink.ts
顶栏像素鲸鱼颜色四色调色板(描边/身体/腹部/嘴)写死且模块加载时预渲染,不读取任何主题键——任何主题都无法改变鲸鱼配色components/Whale.tsx
顶栏文字色✦ dsh-TUI 字标与欢迎语经 claude(0.10.1 起 accent)跟主题;DEEPSEEK 像素字主色与渐变结尾色分别跟 claude / claudeBlue_FOR_SYSTEM_SPINNER(0.10.1 起 accent / activity);HARNESS 像素字只有主色跟主题——渐变结尾色是宿主固定常量 PALE,不读任何主题键,主题覆盖不到它的结尾段;两词的扫过高光(FLASH)同为宿主常量。另:宿主 parseRGB 只认 rgb(r,g,b) 格式,hex/ansi 值会静默回退固定品牌蓝(pink-ansi 因此顶栏仍为蓝色)components/LogoV2.tsxcomponents/bigfont.tscomponents/shimmer.tscomponents/Spinner/spinnerUtils.ts
主界面组件与布局顶栏像素鲸鱼、工具卡、输入框等宿主组件不可被插件替换或改布局——平台规则(内建优先,无组件替换接缝);主题能碰的只有颜色层宿主架构约定

这些都需要上游 dsh-TUI 修改(例如:把充能色/进度条分段色接入主题键、空余段判断改用 isLightThemeActive()、给输入光标增加主题键)。上游修复前,任何社区主题包都受同样约束。

卸载

# 先在 dsh-TUI 内切换到非 pink-* 主题,例如:
/theme auto

# 再移除插件和可选的本地主题资产
dsh plugin --profile dsh-tui remove -w dsh-tui-theme
rm ~/.dsh-tui/themes/pink-{night,day,ansi}.json
rm ~/.dsh-tui/theme-follow.json

开发

npm install
npm run build
npm run verify
npm run verify:package
DSH_TUI_ADAPTER_DIR=/path/to/dsh-TUI/lib/types/dsh-adapter \
DSH_TUI_SOURCE_ROOT=/path/to/dsh-TUI-source \
npm run verify:host

verify:host 默认使用开发依赖中的 dsh-TUI(当前为 0.10.1)进行零配置验证;需要验证旧版或发布基线时,再显式指向同一版本的宿主 adapter 与源码。需要锁定版本时,额外设置 DSH_TUI_EXPECTED_VERSION

主题调色板改起来最直接:编辑 themes/*.json 后重新 npm run verify,再删掉 ~/.dsh-tui/themes/ 下对应文件让插件重装。

兼容性

  • dsh-TUI 版本下限:0.8.8(状态行与设置面板;0.9.3 实测)。0.10.0 及更新版本使用运行时主题注册;0.10.1 起状态行经富状态视图按主题配色(更旧宿主自动回退无色标量行);更旧的宿主缺 dsh-tui-extensions 扩展面时,插件自动降级为“仅安装三套主题”,不报错。
  • Node ^22.19 || >=24,纯 ESM,MIT。