<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[DeepSeek Harness 开源插件商店]]></title> 
<atom:link href="https://dsh.lewz.cn/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[插件即能力，开源即未来。]]></description>
<link>https://dsh.lewz.cn/</link>
<language>zh-cn</language>

<item>
    <title>dsh-workbench</title>
    <link>https://dsh.lewz.cn/dpf555-dsh-workbench.html</link>
    <description><![CDATA[<h1>DSH Workbench — VS Code 风格三栏布局插件</h1>
<p>中文 | <a href="README.en.md">English</a></p>
<p>参考 <a href="https://github.com/microsoft/vscode">microsoft/vscode</a> 的设计，为 DeepSeek Harness（DSH）Web GUI 增加：</p>
<ul>
<li><strong>右侧常驻 Explorer 文件树</strong>（VS Code 官方 seti 文件类型图标、展开/折叠、新建文件/文件夹、刷新、全部折叠、可拖宽/折叠面板）</li>
<li><strong>中间区域点击文件即切换为代码编辑器</strong>（monaco-editor 0.52.2 —— VS Code 编辑器核心；多标签页、语法高亮、minimap、Ctrl+S、脏标记、保存冲突&quot;重新加载/强制覆盖&quot;）</li>
<li><strong>Markdown 渲染预览</strong>：打开 <code>.md</code> 文件后标签行出现&quot;预览&quot;按钮，一键切换渲染视图（标题/列表/表格/代码块/引用/任务清单/链接/图片），随编辑实时刷新；内置自包含渲染器，无额外依赖</li>
<li><strong>编辑器占满整列</strong>（编辑时下方输入框/停靠条自动隐藏，&quot;返回会话&quot;或顶部&quot;对话&quot;标签切回）</li>
<li><strong>安全边界</strong>：所有文件操作经 DSH 的 <code>ctx.fs</code> 服务，双重围栏在工作区沙箱内，越界拒绝；写入走版本号 CAS 防覆盖</li>
</ul>
<pre><code>┌─────────┬──────────────────────────┬────────────┐
│ 左侧边栏 │  中间：会话 ⇄ 文件内容     │ 右侧：文件树 │
│ （不变） │  点文件 → Monaco 编辑器    │ Explorer   │
└─────────┴──────────────────────────┴────────────┘</code></pre>
<h2>架构</h2>
<table>
<thead>
<tr>
<th>文件</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>index.js</code></td>
<td>主机半部（Cordis 插件）：注册 <code>/wb/*</code> 静态资源路由 + <code>/wb/api/&lt;op&gt;</code> 文件操作（describe/listDir/readFile/writeFile/createFile/createDir/assetText），工作区围栏</td>
</tr>
<tr>
<td><code>client.js</code></td>
<td>客户端半部（浏览器插件 bundle）：引导加载 <code>/wb/workbench-client.js</code></td>
</tr>
<tr>
<td><code>assets/workbench-client.js</code></td>
<td>UI bundle：右栏 ExplorerRoot（<code>explorer</code> slot）+ 中栏 EditorView（<code>conversation.view</code> 的 <code>workbench.editor</code> 视图）</td>
</tr>
<tr>
<td><code>assets/vs/</code></td>
<td>monaco-editor 发行版（<code>npm run setup:assets</code> 生成，不入库）</td>
</tr>
<tr>
<td><code>assets/seti.*</code></td>
<td>seti 图标字体与生成产物（<code>npm run generate:seti</code>）</td>
</tr>
<tr>
<td><code>patches/*.patch</code></td>
<td>对 DSH 检出包的三处内嵌补丁（三栏布局依赖它们）</td>
</tr>
<tr>
<td><code>scripts/*.mjs</code></td>
<td>资产下载/图标生成/补丁应用/profile 安装</td>
</tr>
<tr>
<td><code>dynamic/</code></td>
<td>会话内动态插件形态（cordis_define 用），可选</td>
</tr>
</tbody>
</table>
<p>三处补丁（<code>patches/</code>，对 DSH <code>0.1.0-rc.6</code> 生成）：</p>
<ol>
<li><code>ui-layout.patch</code> — AppFrame 新增第 4 条网格轨道 <code>explorer</code>（240–420px、默认 300）+ <code>explorer</code> slot + 拖宽手柄 + <code>toggleExplorer</code> 服务方法</li>
<li><code>ui-conversation.patch</code> — 暴露 <code>window.__DSH_CONV_BRIDGE__[sessionId].setView</code>，点击文件自动切换中间视图</li>
<li><code>ui-sidebar.patch</code> — 页面加载即挂载 UI bundle（刷新自愈）</li>
</ol>
<h2>安装</h2>
<p>前置：Node.js ≥ 18、git、可访问 npm registry 的网络。</p>
<pre><code class="language-bash">git clone &lt;this-repo&gt; dsh-workbench
cd dsh-workbench

# 1. 下载 monaco 资产并生成 seti 图标（约 13MB）
npm run setup:assets

# 2. 安装到 DSH profile（下次 `dsh web` 重启后随组合加载 /wb 路由与客户端引导）
node scripts/install-profile.mjs --profile web

# 3. 给当前 DSH 检出打三栏布局补丁（不改则只有浮窗/无右栏，见下方"补丁"说明）
node scripts/apply-patches.mjs --checkout &lt;checkout-root&gt;
# 不传 --checkout 时自动探测 ~/.npm-cache/_npx 下的检出</code></pre>
<p>然后<strong>重启 <code>dsh web</code></strong> 并 <strong>Ctrl+F5 硬刷新</strong>页面。</p>
<blockquote>
<p>检出根目录：包含 <code>node_modules/@deepseek-ai/</code> 的目录（npx 安装通常位于<br />
<code>~/.npm-cache/_npx/&lt;hash&gt;/</code>；本机示例 <code>C:\Users\&lt;you&gt;\.npm-cache\_npx\1e7f6d9597241db0</code>）。</p>
</blockquote>
<h2>补丁（为什么需要）</h2>
<p>DSH 的客户端壳不提供&quot;常驻右栏 + 点击文件切换中间视图&quot;的公开扩展点：</p>
<ul>
<li>右栏需要布局壳新增网格轨道（<code>explorer</code> slot）——由 <code>ui-layout.patch</code> 完成</li>
<li>中间视图环（<code>conversation.view</code>）的活动视图切换是私有状态——由 <code>ui-conversation.patch</code> 暴露桥接</li>
</ul>
<p>补丁直接修改检出的客户端 bundle（DSH 按请求实时读取、<code>cache-control: no-cache</code>，硬刷新即生效，无需构建）。补丁基于 <code>0.1.0-rc.6</code> 生成；DSH 升级后如不能应用，请对照新 bundle 重新生成（<code>git diff --no-index &lt;原始&gt; &lt;补丁后&gt;</code>）。</p>
<h2>使用</h2>
<ol>
<li>硬刷新页面 → 右栏出现文件树</li>
<li>点目录展开、点文件 → 中间自动切换为 Monaco 编辑器，输入框隐藏</li>
<li>Ctrl+S 保存；顶部&quot;对话 / 代码&quot;标签或&quot;返回会话&quot;按钮切换</li>
<li>右栏头部：新建文件/文件夹、刷新、全部折叠、<code>«</code> 收起面板；左边缘拖宽；<strong>收起后右侧保留 28px 窄条，点击即可重新展开</strong></li>
</ol>
<h2>工作区跟随</h2>
<p>文件树根 = <strong>当前活跃会话的工作区</strong>（该会话的 <code>header.cwd</code>，即其沙箱边界）：</p>
<ul>
<li>切换到哪个工作区/会话，右栏就显示那个工作区的文件；切换时编辑器标签页与文件树自动重建</li>
<li>客户端把活跃会话 id 注入每个 <code>/wb/api/*</code> 调用，服务端按 <code>sandboxPolicy.resolve({ session })</code> 解析栅栏根</li>
<li>无活跃会话时回退到部署根（<code>sandboxPolicy</code> fallback root，可通过 profile 的 <code>cordis.patch.yml</code> 固定）</li>
</ul>
<blockquote>
<p>注意：会话级解析需要主机半部注入 <code>sessions</code> 服务，改完 <code>index.js</code> / <code>client.js</code> 后需<strong>重启 <code>dsh web</code></strong> 再硬刷新。</p>
</blockquote>
<h2>卸载</h2>
<ol>
<li>删除 <code>&lt;DSH_HOME&gt;/profiles/web/cordis.patch.yml</code> 中 <code>- insert:</code> 的 <code>workbench</code> 行，重启 <code>dsh web</code></li>
<li>删除 <code>&lt;DSH_HOME&gt;/profiles/web/node_modules/@dsh-local/dsh-workbench/</code></li>
<li>补丁回退：重装对应 npm 包（<code>npm i @deepseek-ai/dsh-client-ui-{layout,conversation,sidebar}@0.1.0-rc.6</code> 后覆盖检出的 <code>lib/client.js</code>），或 <code>git apply -R patches/*.patch</code></li>
</ol>
<h2>已知限制</h2>
<ul>
<li><code>ctx.fs</code> 契约无 rename/delete → 暂不支持重命名/删除文件</li>
<li>二进制文件只读拒绝；单文件读取上限 5MB</li>
<li>未打开会话时右栏可见但点击文件不切换中间视图（视图环是会话级的）；此时文件树显示部署根</li>
<li>文件树根 = 当前活跃会话的工作区（无会话时回退到 <code>sandboxPolicy</code> fallback root，可用 profile 补丁固定）</li>
<li>Markdown 预览为自包含渲染器的 GFM 子集：支持标题/粗斜体/行内与围栏代码/列表与任务清单/引用/表格/链接/图片/分隔线；暂不支持嵌套列表、脚注、HTML 透传（HTML 一律转义防注入）</li>
</ul>
<h2>致谢与许可</h2>
<ul>
<li><a href="https://github.com/microsoft/vscode">microsoft/vscode</a>（Explorer 设计参考；seti 图标与主题数据，MIT）</li>
<li><a href="https://github.com/microsoft/monaco-editor">microsoft/monaco-editor</a>（MIT）</li>
<li><a href="https://github.com/jesseweed/seti-ui">jesseweed/seti-ui</a>（seti 字体上游，MIT）</li>
<li>本插件 MIT License</li>
</ul>]]></description>
    <pubDate>Thu, 20 Aug 2026 00:50:38 +0800</pubDate>
    <dc:creator>blogger</dc:creator>
    <guid>https://dsh.lewz.cn/dpf555-dsh-workbench.html</guid>
</item>
<item>
    <title>dsh-annotate</title>
    <link>https://dsh.lewz.cn/bramblexu-dsh-annotate.html</link>
    <description><![CDATA[<h1>dsh-annotate</h1>
<p><img src="https://raw.githubusercontent.com/BrambleXu/dsh-annotate/main/assets/hero.png" alt="dsh-annotate hero" /></p>
<p align="center">
  <a href="LICENSE"><img src="https://img.shields.io/github/license/BrambleXu/dsh-annotate?style=flat-square" alt="MIT license"></a>
  <a href="package.json"><img src="https://img.shields.io/badge/Node.js-%5E22.19%20%7C%20%3E%3D24-339933?style=flat-square&logo=nodedotjs&logoColor=white" alt="Node.js ^22.19 or >=24"></a>
  <a href="package.json"><img src="https://img.shields.io/badge/TypeScript-5.9-3178C6?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript 5.9"></a>
  <a href="package.json"><img src="https://img.shields.io/badge/tests-Vitest-6E9F18?style=flat-square&logo=vitest&logoColor=white" alt="Tests with Vitest"></a>
</p>
<p align="center">
  <a href="https://github.com/awesome-dsh-plugin/awesome-dsh-plugin#development--runtime"><img src="https://img.shields.io/static/v1?label=awesome%20%C2%B7%20DSH%20plugin&amp;message=development&amp;color=5B4CF0&amp;style=flat-square" alt="awesome · DSH plugin · development"></a>
</p>
<p align="center">English | <a href="README.zh.md">中文</a></p>
<p>Visual browser feedback for DeepSeek Harness. <code>/annotate</code> asks the companion Chrome extension to enter selection mode; each selected element contributes a selector, DOM facts, computed style highlights, accessibility data, a comment, and an optional viewport screenshot to the agent's next turn.</p>
<h2>Why this exists 💡</h2>
<p>Browser UI problems are difficult to describe precisely through plain text. <code>dsh-annotate</code> lets you point at the relevant element and send the Agent the surrounding browser facts, so visual feedback stays attached to the page element instead of becoming a vague description or a copied screenshot.</p>
<h2>Features ✨</h2>
<ul>
<li>Select elements directly in Chrome or Chromium through <code>/annotate</code>.</li>
<li>Capture selectors, DOM facts, computed-style highlights, accessibility data, comments, and optional viewport screenshots.</li>
<li>Send structured annotations to the Agent through a local loopback WebSocket bridge.</li>
<li>Restrict browser connections by loopback host, extension origin, and optional extension ID.</li>
</ul>
<h2>Install 📦</h2>
<p>Add the plugin project to a Harness profile:</p>
<pre><code class="language-sh">dsh plugin --profile demo add ./dsh-annotate</code></pre>
<p>Then install the companion extension:</p>
<ol>
<li>Open <code>chrome://extensions</code> in Chrome or Chromium.</li>
<li>Enable <strong>Developer mode</strong>.</li>
<li>Choose <strong>Load unpacked</strong> and select this project's <code>browser-extension</code> directory.</li>
<li>Open the extension popup and keep the default bridge endpoint.</li>
</ol>
<p>For tighter local authorization, copy the extension ID shown in the popup into <code>allowedExtensionId</code> in a later Harness patch layer.</p>
<h2>Use 🚀</h2>
<pre><code class="language-text">/annotate
/annotate http://localhost:3000</code></pre>
<p>Click an element, enter its comment, and repeat as needed. <strong>Submit</strong> sends all captured facts and the visible-tab screenshot to the agent. <strong>Escape</strong> cancels.</p>
<h2>Configure ⚙️</h2>
<pre><code class="language-yaml">- id: dsh-annotate
  name: dsh-annotate
  config:
    host: 127.0.0.1
    port: 43119
    allowedExtensionId: abcdefghijklmnopqrstuvwxyzabcdef
    requestTimeoutMs: 300000
    maxPayloadBytes: 16777216
    includeScreenshot: true</code></pre>
<p>The server refuses non-loopback hosts and browser connections whose origin is not <code>chrome-extension://</code>. An empty <code>allowedExtensionId</code> accepts any locally installed Chrome extension; set the exact ID for stricter isolation.</p>
<h2>Develop 🧑‍💻</h2>
<pre><code class="language-sh">pnpm install
pnpm run check</code></pre>
<p>Reload the unpacked browser extension after editing its files.</p>
<h2>Scope 🎯</h2>
<p>Version 0.1 targets one local Chrome/Chromium browser, one active tab, and visible-viewport screenshots. Remote browsers, full-page capture, edit recording, and inline draggable note cards are deferred.</p>
<h2>License 📄</h2>
<p>MIT</p>
<h2>Credits 🙏</h2>
<p>The interaction is inspired by <a href="https://github.com/nicobailon/pi-annotate"><code>pi-annotate</code></a>. This implementation is built around Harness's human-command, attachment, and Agent APIs and uses a small loopback WebSocket bridge instead of a native-messaging host.</p>]]></description>
    <pubDate>Thu, 20 Aug 2026 00:50:08 +0800</pubDate>
    <dc:creator>blogger</dc:creator>
    <guid>https://dsh.lewz.cn/bramblexu-dsh-annotate.html</guid>
</item>
<item>
    <title>dsh-ui-preset-enhance</title>
    <link>https://dsh.lewz.cn/lssyd20070106-dsh-ui-preset-enhance.html</link>
    <description><![CDATA[<h1>dsh-ui-preset-enhance</h1>
<p><a href="README.md">简体中文</a> · <a href="README.en.md">English</a> · <a href="INSTALL-GUIDE.md">小白安装手册</a></p>
<p>一个给 <strong>DeepSeek Harness（DSH）WebUI</strong> 用的第三方界面增强插件。</p>
<p>它主要解决 4 件事：<strong>界面个性化、常用 Prompt 复用、Token / Context 查看、手动 Compact。</strong></p>
<blockquote>
<p>当前版本：<strong>v0.1.0 Preview</strong><br />
第三方项目，不是 DeepSeek 官方组件。项目按当前公开的 DSH <code>0.1.0-rc.6</code> 客户端接口进行了源码兼容检查，并附带构建、运行入口和 DSH 安装 Smoke Test。正式发布初期仍建议保留 Preview 标记，方便收集不同环境的兼容反馈。</p>
</blockquote>
<h2>效果预览</h2>
<p align="center">
  <img src="https://raw.githubusercontent.com/lssyd20070106/dsh-ui-preset-enhance/main/assets/preview-home.png" alt="DSH WebUI background preview" width="100%" />
</p>
<p align="center">
  <img src="https://raw.githubusercontent.com/lssyd20070106/dsh-ui-preset-enhance/main/assets/preview-settings.png" alt="DSH appearance settings prototype" width="100%" />
</p>
<blockquote>
<p>上面两张图来自项目早期视觉原型。正式插件使用独立的 <strong>“设置 → 界面增强”</strong> 页面提供同方向的壁纸、模糊、透明度和强调色功能，具体控件位置可能与原型图略有不同。</p>
</blockquote>
<h2>最简单的安装方法</h2>
<p>电脑已经有 Node.js 和 pnpm 时，只需要这一行：</p>
<pre><code class="language-powershell">npx --yes @deepseek-ai/dsh plugin --profile web add github:lssyd20070106/dsh-ui-preset-enhance</code></pre>
<p>安装完成后：</p>
<ol>
<li>完全关闭并重新启动 DSH Web；</li>
<li>浏览器按 <code>Ctrl + F5</code>；</li>
<li>打开 <strong>设置 → 界面增强</strong>。</li>
</ol>
<h3>不会命令行？</h3>
<p>下载本仓库 ZIP，<strong>先解压</strong>，然后双击：</p>
<pre><code class="language-text">INSTALL-WINDOWS.cmd</code></pre>
<p>它会检查 Node.js、pnpm、插件文件和 DSH 安装结果。遇到问题直接看：</p>
<p><strong><a href="INSTALL-GUIDE.md">《小白安装手册》INSTALL-GUIDE.md</a></strong></p>
<h2>功能</h2>
<table>
<thead>
<tr>
<th>功能</th>
<th>简单说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>🖼️ 自定义背景</td>
<td>本地上传、网络图片或 5 个渐变预设</td>
</tr>
<tr>
<td>🌫️ 透明与模糊</td>
<td>调整 DSH 界面层透明度和壁纸模糊</td>
</tr>
<tr>
<td>🎨 主题颜色</td>
<td>主色、辅助色与强调色阶</td>
</tr>
<tr>
<td>📑 Prompt 预设</td>
<td>7 个内置模板 + 自定义保存 / 删除 / 快速载入</td>
</tr>
<tr>
<td>📊 Token / Context</td>
<td>查看当前 Session 的 Context 压力、窗口和 Token 组成</td>
</tr>
<tr>
<td>🧹 手动 Compact</td>
<td>通过当前 Session 的 DSH 命令接口执行 <code>/compact</code></td>
</tr>
</tbody>
</table>
<h2>安全与边界</h2>
<p>这个项目定位是 <strong>Web 客户端增强</strong>：</p>
<ul>
<li>不注册新的后端 Tool；</li>
<li>不修改 Agent-Loop 核心；</li>
<li>不上传你保存的 Prompt 到本项目自己的服务器；</li>
<li>壁纸、主题和用户 Prompt 预设主要保存在浏览器 <code>localStorage</code>；</li>
<li>自定义壁纸 URL 只接受 <code>http://</code>、<code>https://</code> 和图片 <code>data:</code> URL，拒绝任意脚本 / CSS URL。</li>
</ul>
<p>如果你使用网络图片作为壁纸，浏览器仍会正常访问那个图片服务器，因此对方服务器可以收到普通网络请求信息。</p>
<h2>我们检查了什么</h2>
<p>仓库内置两层 Smoke Test：</p>
<pre><code class="language-text">scripts/smoke.mjs
scripts/runtime-smoke.mjs</code></pre>
<p>它们会检查：</p>
<ul>
<li><code>package.json</code> / <code>cordis.patch.yml</code> / <code>./client</code> 导出是否一致；</li>
<li><code>window.__ModuleLoader__.load(...)</code> 包装和插件 ID；</li>
<li>Settings 与 Sidebar Slot 是否能注册；</li>
<li>当前 Session 的 Token Projection 是否能读到；</li>
<li><code>/compact</code> 是否走 Session <code>command()</code>；</li>
<li>已保存壁纸、主题 Token 是否能在插件启动时恢复；</li>
<li>构建产物是否含本机绝对路径。</li>
</ul>
<p>GitHub Actions 还会在干净环境中：</p>
<ol>
<li>TypeScript 检查；</li>
<li>重建 <code>dsh/client.js</code> / <code>dsh/index.js</code>；</li>
<li>JavaScript Syntax Check；</li>
<li><code>npm pack --dry-run</code>；</li>
<li>用 <code>@deepseek-ai/dsh@0.1.0-rc.6</code> 创建干净 Web Profile，并实际执行一次 <code>dsh plugin add file:...</code> 安装检查。</li>
</ol>
<blockquote>
<p>自动化测试能覆盖“能否构建、能否加载插件结构、能否被 DSH CLI 安装”。最终的浏览器视觉和不同 DSH 预览版本仍需要真实用户环境反馈。</p>
</blockquote>
<h2>为什么普通用户不用自己编译</h2>
<p>仓库直接提交了：</p>
<pre><code class="language-text">dsh/client.js
dsh/index.js</code></pre>
<p>所以普通用户安装的是已经构建好的运行文件，不需要安装 TypeScript，也不需要在安装过程中运行构建脚本。</p>
<p>开发者修改 <code>src/</code> 后才需要：</p>
<pre><code class="language-powershell">npm install
npm run verify</code></pre>
<h2>检查安装是否成功</h2>
<p>下载版双击：</p>
<pre><code class="language-text">VERIFY-WINDOWS.cmd</code></pre>
<p>或者运行：</p>
<pre><code class="language-powershell">npx --yes @deepseek-ai/dsh plugin --profile web list dsh-ui-preset-enhance --depth 0</code></pre>
<h2>卸载</h2>
<pre><code class="language-powershell">npx --yes @deepseek-ai/dsh plugin --profile web remove dsh-ui-preset-enhance</code></pre>
<p>下载版也可以双击：</p>
<pre><code class="language-text">UNINSTALL-WINDOWS.cmd</code></pre>
<h2>推荐搭配：Skills 管理“技巧”插件</h2>
<p>如果你经常使用 DSH Skills，我推荐原作者 <strong>Fishquito7</strong> 的：</p>
<h3><a href="https://github.com/Fishquito7/dsh-skill-viewer">Fishquito7/dsh-skill-viewer</a></h3>
<p>这个项目<strong>不是我制作的，也不是本项目的一部分</strong>。它主要用于在 DSH Web 界面查看、添加、删除以及热启用 / 停用 Skills。安装方法、版本和问题请以原作者仓库为准。</p>
<p>简单区分：</p>
<ul>
<li><strong>dsh-ui-preset-enhance</strong>：界面、壁纸、主题、Prompt、Token / Context；</li>
<li><strong>dsh-skill-viewer</strong>：Skills 管理。</li>
</ul>
<h2>项目结构</h2>
<pre><code class="language-text">dsh-ui-preset-enhance/
├─ .github/workflows/ci.yml
├─ assets/                    # README 截图
├─ docs/                      # 设计说明
├─ dsh/                       # 已构建、可直接运行的 DSH 文件
├─ scripts/                   # 构建与 Smoke Test
├─ src/                       # TypeScript / React 源码
├─ INSTALL-GUIDE.md           # 小白安装手册
├─ INSTALL-WINDOWS.cmd        # 双击安装
├─ VERIFY-WINDOWS.cmd         # 双击检查
├─ UNINSTALL-WINDOWS.cmd      # 双击卸载
├─ install.ps1
├─ verify.ps1
├─ uninstall.ps1
├─ package.json
├─ cordis.patch.yml
└─ LICENSE</code></pre>
<h2>开发</h2>
<p>需要 Node.js 20+。</p>
<pre><code class="language-powershell">npm install
npm run typecheck
npm run build
npm run smoke</code></pre>
<p>或者一次完成：</p>
<pre><code class="language-powershell">npm run verify</code></pre>
<p>构建脚本只使用 TypeScript，不依赖原生 bundler 二进制；<code>src/client.tsx</code> 是单文件 Client Entry，运行时模块由 DSH 的 Client Module Loader 提供。</p>
<h2>问题反馈</h2>
<p>提交 Issue 时最好附上：</p>
<ul>
<li>DSH 版本；</li>
<li>Windows / macOS / Linux 版本；</li>
<li>安装命令完整输出；</li>
<li>浏览器 Console 的相关红色报错。</li>
</ul>
<p>请先删除 API Key、Cookie、Token、私有 Prompt、路径中的个人姓名等敏感信息。</p>
<h2>License</h2>
<p>MIT — 见 <a href="LICENSE">LICENSE</a>。</p>]]></description>
    <pubDate>Thu, 20 Aug 2026 00:49:39 +0800</pubDate>
    <dc:creator>blogger</dc:creator>
    <guid>https://dsh.lewz.cn/lssyd20070106-dsh-ui-preset-enhance.html</guid>
</item>
<item>
    <title>dsh-ux</title>
    <link>https://dsh.lewz.cn/jiangnanquan-dsh-ux.html</link>
    <description><![CDATA[<h1>dsh-ux</h1>
<p><strong>中文</strong> | <a href="README_EN.md">English</a></p>
<p>DSH(DeepSeek Harness)Web 界面体验套件,包含两件东西:</p>
<table>
<thead>
<tr>
<th>部分</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>dsh-enhance</strong>(仓库根目录)</td>
<td>DSH web 插件:主题、布局、折叠胶囊、账户用量</td>
</tr>
<tr>
<td><strong>dsh-desktop</strong>(<code>desktop/</code> 子目录)</td>
<td>无边框 Electron 桌面壳,双击即用</td>
</tr>
</tbody>
</table>
<p><img src="https://raw.githubusercontent.com/jiangnanquan/dsh-ux/main/screenshot.png" alt="dsh-enhance" /></p>
<h2>能力(dsh-enhance)</h2>
<table>
<thead>
<tr>
<th>类别</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>主题</td>
<td>Solarized 浅色配色(深色保留官方默认)+ Maple Mono 字体栈(检测到才启用)</td>
</tr>
<tr>
<td>布局</td>
<td>加宽消息列、紧凑间距、收窄输入队列、禁用橡皮筋滚动</td>
</tr>
<tr>
<td>折叠胶囊</td>
<td>思考块聚合为 <code>Think ×N</code> 胶囊、工具调用聚合为 <code>A → B → C</code> 链路胶囊；长链路按可用宽度换行，每行独立成胶囊，点击任一行展开</td>
</tr>
<tr>
<td>账户用量</td>
<td>底部显示官方账户余额、本轮 token 成本、近 30 天用量图表</td>
</tr>
</tbody>
</table>
<p>长工具链会跟随消息列宽度自动重新分行，每个视觉行保持独立、完整的胶囊轮廓：</p>
<p><img src="https://raw.githubusercontent.com/jiangnanquan/dsh-ux/main/docs/images/tool-chain-multiline-capsules.png" alt="工具链换行后每行独立胶囊" /></p>
<h2>安装</h2>
<p>前置:已按 DSH 的 profile 机制运行(<code>dsh web</code>)。</p>
<pre><code class="language-bash">dsh plugin --profile web add github:jiangnanquan/dsh-ux#main</code></pre>
<p>本包声明了 <code>dsh.bundle.patch</code> 与 <code>dsh.client</code>,<code>dsh plugin add</code> 会自动把它加入 profile 的 bundles,<strong>重启 dsh 后即生效</strong>,无需手改任何配置。重复执行该命令是安全的(幂等);升级用 <code>dsh plugin --profile web update dsh-enhance</code>。</p>
<h2>交给你的 AI</h2>
<p>不想手动敲命令?把下面这段话粘贴给任意 AI agent(Claude Code、dsh、Gemini CLI……),让它读 INSTALL.md 并完成安装与自检:</p>
<blockquote>
<p>请按照 <a href="https://github.com/jiangnanquan/dsh-ux/blob/main/INSTALL.md">https://github.com/jiangnanquan/dsh-ux/blob/main/INSTALL.md</a> 里的步骤,在我的机器上安装并验证 dsh-enhance 插件(profile 用 web),然后运行文档里的健康检查并告诉我结果。如果任何一步失败,按文档的回滚步骤恢复原状并说明原因。</p>
</blockquote>
<h2>桌面壳(dsh-desktop)</h2>
<p>macOS 无边框沉浸式窗口,把 dsh web 装进桌面应用形态:双击 <code>启动 DSH.command</code> 自动拉起后端 + 窗口,退出时只清理自己拉起的后端。支持 <code>DSH_URL</code> / <code>DSH_SNAPSHOT</code> 环境变量。</p>
<p>见 <a href="desktop/README.md">desktop/README.md</a>。</p>
<h2>依赖与前提(dsh-enhance)</h2>
<ul>
<li><strong>字体</strong>:优先使用 Maple Mono;未安装时自动回退到 PingFang SC / SF Mono / Menlo / 等宽字体,效果略有差异。推荐安装 <a href="https://github.com/subframe7536/maple-font">Maple Mono</a> 获得完整观感。</li>
<li><strong>余额 / 本轮成本 / 用量图表</strong>:调用 DeepSeek 官方接口,需要当前 DSH 已配置 <code>DEEPSEEK_API_KEY</code> 凭据;未配置时这些信息显示为查询失败/不可用,不影响其余功能。</li>
<li>计价表按官方峰谷价(北京时间 9–12、14–18 高峰,其余空闲半价)硬编码,官方调价后需更新 <code>lib/index.js</code> 里的 <code>pricingFor</code>。</li>
</ul>
<h2>卸载</h2>
<pre><code class="language-bash">dsh plugin --profile web remove dsh-enhance</code></pre>
<h2>License</h2>
<p>MIT</p>]]></description>
    <pubDate>Thu, 20 Aug 2026 00:49:09 +0800</pubDate>
    <dc:creator>blogger</dc:creator>
    <guid>https://dsh.lewz.cn/jiangnanquan-dsh-ux.html</guid>
</item>
<item>
    <title>dskin</title>
    <link>https://dsh.lewz.cn/dancingmemory-dskin.html</link>
    <description><![CDATA[<p align="center">
  <img src="https://raw.githubusercontent.com/dancingmemory/dskin/main/assets/banner.jpg" alt="DSKIN banner" width="100%">
</p>
<p align="center">
  <a href="README.md"><img src="https://img.shields.io/badge/🌏-简体中文-2e3a59" alt="简体中文"></a>
  <a href="README.en.md"><img src="https://img.shields.io/badge/🌏-English-2e3a59" alt="English"></a>
</p>
<h1 align="center">🐱 DSKIN · 像素小猫派对</h1>
<p align="center">
  <b>DeepSeek Harness（DSH）专用卡通像素皮肤插件</b><br>
  <i>A cartoon pixel kitten plugin made exclusively for the DeepSeek Harness (DSH) Web GUI</i>
</p>
<p align="center">
  <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/dsh--plugin-✅%20官方插件区-blue" alt="dsh-plugin"></a>
  <a href="LICENSE"><img src="https://img.shields.io/github/license/dancingmemory/dskin" alt="license"></a>
  <a href="https://github.com/dancingmemory/dskin"><img src="https://img.shields.io/github/v/tag/dancingmemory/dskin?label=version" alt="version"></a>
  <img src="https://img.shields.io/badge/平台-Web%20UI-4a90d9" alt="platform">
  <img src="https://img.shields.io/github/stars/dancingmemory/dskin?style=social&label=Stars" alt="stars">
</p>
<hr />
<p><strong>界面零改动，只养猫。</strong> DSKIN 不加外框、不改背景、不动布局——页面底边住着<br />
<strong>1~4 只像素小猫</strong>（数量可调、品种可换），它们散步、玩耍、可以被你抓住拖来拖去。</p>
<blockquote>
<p><strong>纯皮肤插件</strong>：不注入服务、不发事件、不触碰模型请求。遵循官方<br />
<code>dsh.client</code> 客户端插件契约，可热插拔、可卸载，卸载后完整还原。</p>
</blockquote>
<h2>✨ 特性 / Features</h2>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>🐱 <strong>1~4 随机小猫</strong></td>
<td>每次刷新随机出现 1~4 只（大橘 / 小白 / 玄猫 / 花猫），可手动加减</td>
</tr>
<tr>
<td>🤝 <strong>猫咪互动</strong></td>
<td>相遇会面对面玩耍、蹦跳，然后各自散开；点击一只，它跳起来</td>
</tr>
<tr>
<td>🎨 <strong>每只独立换装</strong></td>
<td>面板里点一只小猫（选中），再点品种，只改那一只</td>
</tr>
<tr>
<td>🖐️ <strong>可拖拽 + 挂顶</strong></td>
<td>抓住小猫到处拖；拖到屏幕顶边会<strong>倒挂</strong>住不落，再抓住拉下来即可</td>
</tr>
<tr>
<td>💕 <strong>摸猫冒爱心</strong></td>
<td>鼠标停在猫身上，它会开心蹦跶并冒出 ♥</td>
</tr>
<tr>
<td>🐾 <strong>爪爪面板</strong></td>
<td>右下角 🐾：<code>− N ＋</code> 加减小猫数量，品种按钮给选中的小猫换装，全部记住</td>
</tr>
<tr>
<td>📏 <strong>不挡视线</strong></td>
<td>活动区限定在屏幕底部，无外框无背景，界面完全原生</td>
</tr>
</tbody>
</table>
<h2>🐱 四只小猫 · 特写 / Kitten Close-ups</h2>
<p>四只可切换的像素小猫（DSKIN 在 DSH Web 中实装）：</p>
<table>
<thead>
<tr>
<th>🐱 大橘</th>
<th>🐱 小白</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="https://raw.githubusercontent.com/dancingmemory/dskin/main/assets/shot-bigorange.png" alt="bigorange" /></td>
<td><img src="https://raw.githubusercontent.com/dancingmemory/dskin/main/assets/shot-white.png" alt="white" /></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>🐱 玄猫</th>
<th>🐱 花猫</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="https://raw.githubusercontent.com/dancingmemory/dskin/main/assets/shot-black.png" alt="black" /></td>
<td><img src="https://raw.githubusercontent.com/dancingmemory/dskin/main/assets/shot-tuxedo.png" alt="tuxedo" /></td>
</tr>
</tbody>
</table>
<h2>🎮 玩法 / Play</h2>
<ul>
<li><strong>看它们玩</strong>：小猫在屏幕底部散步、眨眼、到边转身；两只靠近时会停下来面对面蹦跳，然后散开。</li>
<li><strong>拖拽</strong>：按住小猫拖到任意位置——它会在半空挣扎（摇摆 + &quot;!&quot; 气泡）；<strong>拖到屏幕顶边会倒挂住</strong>，松手也不会掉下来，抓住拉下来才回地面。</li>
<li><strong>摸</strong>：鼠标悬停在猫身上，它开心蹦跶并冒爱心 ♥。</li>
<li><strong>点击</strong>：猫跳一下。</li>
<li><strong>切换品种</strong>：右下角 🐾 面板——先点一只小猫选中，再点品种按钮只给那只换装；<code>− ＋</code> 可以加减小猫数量。</li>
</ul>
<h2>🤖 一键安装（丢给 AI）/ One-Click Install (hand to your AI)</h2>
<p>复制下面这句话，发给你的 AI 助手（例如 opencode / Claude / 或 DSH 自带的智能体）：</p>
<blockquote>
<p><strong>请给我的 DSH 安装 <a href="https://github.com/dancingmemory/dskin">https://github.com/dancingmemory/dskin</a> 插件，并在插件工具中显示。</strong></p>
</blockquote>
<p>AI 应该按以下步骤执行：</p>
<pre><code class="language-sh"># 1. 安装插件（写入 web profile）
dsh plugin --profile web add github:dancingmemory/dskin

# 2. 若 pnpm ≥ 10 提示构建脚本被阻止，把下面内容追加到
#    ~/.dsh/profiles/web/pnpm-workspace.yaml 后重跑第 1 步
#    allowBuilds:
#      dskin: true

# 3. 重启 web 服务，插件进入加载图谱
dsh web

# 4. 验证：设置 → 插件 中应看到 dskin（ui-skin-dskin），
#    页面右下角出现 🐾 爪爪按钮，屏幕底边有小猫散步</code></pre>
<h2>📦 安装 / Install</h2>
<p>要求：DeepSeek Harness <code>dsh</code> CLI（或 <code>npx @deepseek-ai/dsh</code>）。</p>
<pre><code class="language-sh"># GitHub 安装（推荐）
dsh plugin --profile web add github:dancingmemory/dskin

# 源码安装
git clone https://github.com/dancingmemory/dskin.git
cd dskin &amp;&amp; pnpm install
dsh plugin --profile web add .</code></pre>
<blockquote>
<p>pnpm ≥ 10 首次安装 git 依赖可能拒绝执行构建脚本，dsh 会提示你把<br />
<code>allowBuilds: dskin: true</code> 写进 profile 的 <code>pnpm-workspace.yaml</code>，重跑即可。</p>
</blockquote>
<h2>🚀 使用 / Usage</h2>
<pre><code class="language-sh">dsh web        # 安装后重启，让新插件行进入加载图谱</code></pre>
<p>打开 <code>http://127.0.0.1:3080</code>，小猫已经在你屏幕底边等你了。<br />
还原：<code>dsh plugin --profile web remove dskin</code> 再重启。</p>
<h2>🔒 安全边界 / Privacy &amp; Scope</h2>
<p>DSKIN <strong>只在你自己的 DSH Web 应用页面内运行</strong>（默认 <code>http://127.0.0.1:3080</code>）：</p>
<ul>
<li><strong>不是浏览器扩展</strong>：不会在其他网站运行，不修改任何网页、主页、搜索引擎或浏览器设置</li>
<li><strong>不收集数据</strong>：无统计、无追踪、无第三方脚本；只读/写 DSH 页面自己的 localStorage（猫咪配置）</li>
<li><strong>唯一的联网请求</strong>：每 6 小时一次只读检查 GitHub 是否有新版本；升级按钮仅在点击后才打开 GitHub</li>
<li><strong>卸载即还原</strong>：<code>dsh plugin --profile web remove dskin</code> + 重启，页面完整还原</li>
</ul>
<h2>🔍 发现 / Discoverability</h2>
<p>本仓库已打上官方 <strong><code>dsh-plugin</code></strong> 主题标签，可在<br />
<a href="https://github.com/topics/dsh-plugin">github.com/topics/dsh-plugin</a> 下被索引到，<br />
另带 <code>dsh</code> / <code>deepseek-harness</code> / <code>pixel-art</code> 等标签。</p>
<h2>⭐ Star 趋势 / Star History</h2>
<p><img src="https://raw.githubusercontent.com/dancingmemory/dskin/main/assets/star-trend.svg" alt="star-trend" /></p>
<blockquote>
<p>图表由 <strong>GitHub Actions 每日自动重绘</strong>并提交到本仓库（脚本 <code>scripts/gen-star-chart.py</code>），<br />
随 ⭐ 增长实时更新。<br />
<em>The chart is regenerated daily by GitHub Actions (scripts/gen-star-chart.py) and<br />
auto-committed, so it tracks the ⭐ count automatically.</em></p>
</blockquote>
<p>喜欢 DSKIN？点个 ⭐ 支持一下。<br />
<em>Like DSKIN? Hit ⭐ and help the curve grow.</em></p>
<h2>🛠️ 开发 / Development</h2>
<pre><code class="language-sh">pnpm install   # 安装依赖 + prepare 自动构建
pnpm build     # tsdown: lib/index.js (host) + lib/client.js (browser bundle)
pnpm test      # vitest: apply/dispose/拖拽 契约测试</code></pre>
<pre><code>├── package.json          # dsh.bundle 补丁 + dsh.client 清单（官方插件契约）
├── cordis.patch.yml      # 向 web 图谱插入 ui-skin-dskin 行
├── skin.json             # 皮肤元数据
├── tsdown.shared.ts      # 官方 clientBundle 构建预设的独立移植（自包含）
├── web-platform.ts       # 官方平台模块表（bundle external 判定）
├── src/client/
│   ├── index.ts          # apply(ctx) + 小猫状态机（idle/walk/互动/拖拽/回巢）
│   ├── mascots.ts        # 4 只小猫 × 4 帧像素 SVG（scripts/gen-mascots.mjs 生成）
│   └── dskin.module.css  # 样式，全部作用域于 body[data-dsh-dskin]
├── tests/apply.spec.ts   # 契约测试
├── assets/               # banner / logo / 实拍截图
└── scripts/              # 猫帧 / 预览图 / 宣传图生成器</code></pre>
<p><strong>皮肤契约（官方标准）</strong>：纯呈现层；样式全部挂在 <code>body[data-dsh-dskin]</code>；<br />
<code>apply(ctx)</code> 写什么就在 <code>ctx.effect</code> disposer 里收回什么；CSS Modules 由加载器<br />
注入/移除；不携带静态资源（小猫为内联 SVG）。</p>
<h2>📄 许可 / License</h2>
<p>MIT License。Logo 与小猫像素画为原创；参考了 DeepSeek 鲸鱼吉祥物形象。</p>]]></description>
    <pubDate>Thu, 20 Aug 2026 00:48:38 +0800</pubDate>
    <dc:creator>blogger</dc:creator>
    <guid>https://dsh.lewz.cn/dancingmemory-dskin.html</guid>
</item>
<item>
    <title>dsh-ui-appearance</title>
    <link>https://dsh.lewz.cn/tqsy114514-dsh-ui-appearance.html</link>
    <description><![CDATA[<h1>dsh-ui-appearance</h1>
<p><a href="README.en.md">English</a> · 中文</p>
<p>DeepSeek Harness 外观自定义插件 —— 自由调色的主题色板、壁纸/视频背景、毛玻璃与背景氛围,全部实时预览、自动持久化。</p>
<p><a href="https://www.npmjs.com/package/dsh-ui-appearance"><img src="https://img.shields.io/npm/v/dsh-ui-appearance" alt="npm" /></a><br />
<a href="https://github.com/TQSY114514/dsh-ui-appearance/actions"><img src="https://github.com/TQSY114514/dsh-ui-appearance/actions/workflows/build.yml/badge.svg" alt="CI" /></a><br />
<a href="https://github.com/TQSY114514/dsh-ui-appearance/releases"><img src="https://img.shields.io/github/v/release/TQSY114514/dsh-ui-appearance" alt="Release" /></a></p>
<blockquote>
<p>零核心代码改动:完全通过官方插件机制(<code>ctx.theme.overrideTokens()</code> 主题扩展点与 <code>settings.general.item</code> 插槽)实现;卸载后界面完整恢复默认。</p>
</blockquote>
<!-- 演示:将录屏放入 docs/demo.gif 并替换此行
![demo](https://raw.githubusercontent.com/TQSY114514/dsh-ui-appearance/main/docs/demo.gif)
-->
<h2>界面</h2>
<table>
<thead>
<tr>
<th>设置面板</th>
<th>壁纸 + 毛玻璃效果</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="https://raw.githubusercontent.com/TQSY114514/dsh-ui-appearance/main/docs/screenshot-settings.png" alt="设置面板" /></td>
<td><img src="https://raw.githubusercontent.com/TQSY114514/dsh-ui-appearance/main/docs/screenshot-wallpaper.png" alt="壁纸毛玻璃" /></td>
</tr>
</tbody>
</table>
<blockquote>
<p>效果图中的壁纸素材 © MadYY(<a href="docs/wallpaper-madYY.png">原图</a>),仅作演示;用户上传自己的图片即可。</p>
</blockquote>
<h2>功能</h2>
<p><strong>主题颜色</strong> —— 6 个颜色角色:主色、背景色、面板色、输入框色、文字色、边框色。每个角色都支持取色器与 HEX 输入;文字选区与键盘焦点环自动跟随主色;消息气泡跟随主色(半透明时保留主色相)。</p>
<p><strong>壁纸背景</strong> —— 点击上传或拖拽图片(JPG / PNG / WebP),或<strong>粘贴图片/视频 URL 一键加载</strong>(按扩展名自动分流,支持 CORS 友好的图床/视频直链),自动压缩后作为全界面壁纸;上传时自动采样亮度(深色壁纸协调抬亮表面)并<strong>自动提取主色作为强调色</strong>(壁纸与界面色调自动和谐)。也支持<strong>视频背景</strong>(MP4 / WebM,静音循环,与图片互斥),视频存入 IndexedDB,不占用 localStorage 配额。</p>
<p><strong>毛玻璃与半透明</strong> —— 面板不透明度与毛玻璃强度两个滑块,让侧边栏、设置面板、聊天区、任务面板、卡片、按钮一同融进壁纸,而非突兀的实心色块;侧边栏可单独保持不透明。<strong>输入框与代码块可独立调节不透明度</strong>(100% 时跟随面板不透明度)。路径/文件名等强调字(<code>pnpm-lock.yaml</code>、<code>lib/</code>)的背景会保留主色的低透明度色相——强调靠色相而非实心,同时可用「强调字浓度」滑块独立调节深浅(0% 即完全透明)。</p>
<p><strong>背景氛围</strong> —— 背景不透明度、背景模糊、背景遮罩三个独立滑块:不透明度控制壁纸的浓淡,模糊让壁纸退到远处,遮罩在壁纸上叠加随深浅色模式自动配色的纱帘,保证图片上的文字易读。</p>
<p><strong>预设起步</strong> —— 默认 / 午夜 / 海洋 / 森林 / 玫瑰 / 单色六套预设,一键应用后仍可自由微调,不被预设锁死。</p>
<p><strong>配色分享</strong> —— 一键导出配色 JSON(复制到剪贴板),粘贴导入即应用;与朋友交换配色方案只需一段文本。</p>
<p>所有修改实时生效,无需刷新,无需保存。</p>
<h2>安装</h2>
<pre><code class="language-sh"># npm 发布版(推荐)
dsh plugin --profile &lt;name&gt; add dsh-ui-appearance

# 或从源码(已验证端到端)
git clone https://github.com/TQSY114514/dsh-ui-appearance.git
dsh plugin --profile &lt;name&gt; add file:&lt;克隆到的本地路径&gt;</code></pre>
<p>卸载:<code>dsh plugin --profile &lt;name&gt; remove dsh-ui-appearance</code></p>
<p><strong>更新</strong>:新版本发布后,重新执行 <code>add</code> 命令即可升级到最新版。</p>
<blockquote>
<p>安装流程已验证端到端:npm registry 与 <code>file:</code> 源码直装两种方式均实测可用(host 半部零 <code>@deepseek-ai</code> 运行时依赖,浏览器与 Host 均能正确加载)。克隆后 <code>pnpm install</code> 会自动构建;修改代码后重新执行 <code>pnpm install &amp;&amp; pnpm prepare</code> 并重启 dsh web。<br />
版本演进见 <a href="CHANGELOG.md">CHANGELOG.md</a>。</p>
</blockquote>
<h2>使用</h2>
<ol>
<li>打开 WebUI,进入侧栏「设置」→「通用」</li>
<li>在「外观」行下方找到「个性化外观」,点击展开</li>
<li>点预设快速换肤 → 用取色器或 HEX 微调 6 个颜色角色 → 上传或拖入壁纸/视频 → 拖动氛围与界面滑块</li>
<li>完成。所有调整实时生效,无需刷新、无需保存</li>
</ol>
<p>设置面板内容一览:</p>
<table>
<thead>
<tr>
<th>区块</th>
<th>控件</th>
</tr>
</thead>
<tbody>
<tr>
<td>预设主题</td>
<td>默认 / 午夜 / 海洋 / 森林 / 玫瑰 / 单色,一键应用后可继续微调</td>
</tr>
<tr>
<td>主题颜色</td>
<td>6 个角色 × (取色器 + HEX 输入):主色、背景色、面板色、输入框色、文字色、边框色</td>
</tr>
<tr>
<td>背景</td>
<td>图片上传/更换/删除、视频上传/删除、<strong>URL 加载(图片/视频)</strong>、背景不透明度、背景模糊、背景遮罩</td>
</tr>
<tr>
<td>界面</td>
<td>面板不透明度、输入框不透明度、代码块不透明度、强调字浓度、侧边栏保持不透明、毛玻璃强度</td>
</tr>
<tr>
<td>配色方案</td>
<td>导出配色、导入配色(JSON 文本)</td>
</tr>
</tbody>
</table>
<h2>持久化与恢复</h2>
<ul>
<li>设置保存在浏览器 localStorage(键 <code>dsh-ui-appearance.settings</code>),刷新与重启后保留,多标签页自动同步</li>
<li>从 profile 移除插件后界面恢复默认:卸载时自动回收所有覆写 token、样式表与背景图层</li>
<li>注意:设置跟随浏览器,换浏览器或清除站点数据会丢失;壁纸以压缩后的 data URL 存储,受 localStorage 配额约束</li>
</ul>
<h2>工作原理</h2>
<table>
<thead>
<tr>
<th>能力</th>
<th>机制</th>
</tr>
</thead>
<tbody>
<tr>
<td>颜色</td>
<td><code>ctx.theme.overrideTokens()</code> 覆写 <code>--dsw-alias-*</code> 语义 token,浅/深模式切换自动重套,派生色按模式推导</td>
</tr>
<tr>
<td>背景图层</td>
<td>自有的固定定位图层,位于页面背景之上、内容之下,由 CSS 变量驱动</td>
</tr>
<tr>
<td>毛玻璃</td>
<td>背景图层整体模糊(<code>filter: blur</code>,背景模糊 + 毛玻璃两滑块之和),不动 <code>#root</code>,不产生 <code>backdrop-filter</code> 的包含块副作用</td>
</tr>
<tr>
<td>半透明</td>
<td>表面 token 按模式烘焙为 <code>rgba()</code>(角色色 → 深色翻转色 → 默认面色表),不依赖 <code>color-mix</code>,全浏览器可用;覆盖面含设置面板(<code>bg-layer-2</code>)、对话区任务面板/排队坞/目标栏(<code>specific-tip</code>)、行内代码与代码块(<code>markdown-*</code>)、命令/加号按钮及其 hover(<code>selector</code> / <code>interactive-bg-hover-solid</code>)</td>
</tr>
<tr>
<td>强调与半透明</td>
<td>主操作按钮与强调字(<code>markdown-inline-code</code>)半透明化但保留品牌色相:按钮用主色 <code>α=面板不透明度</code>,强调字用主色低透明度(0~45%,默认 22%,与 harness 原生引用 chip 一致)——强调靠色相而非实心色块</td>
</tr>
<tr>
<td>气泡角色</td>
<td>气泡设置已移除:harness 将唯一的气泡背景渲染在用户消息上(AI 消息无气泡),气泡直接跟随主色(浓度 = 面板不透明度);主色未设置时保持默认浅蓝白</td>
</tr>
<tr>
<td>持久化</td>
<td>浏览器 localStorage(harness 的 settings 网关仅对产品命名空间开放浏览器写入),加载时按 schema 校验钳制</td>
</tr>
</tbody>
</table>
<h2>兼容性与限制</h2>
<ul>
<li>半透明直接烘焙为 <code>rgba()</code>,滑块全程平滑;毛玻璃与背景模糊合并为背景图层的一次模糊(两滑块之和),不依赖 <code>backdrop-filter</code>,开启时不会改变页面内固定定位元素的包含块,低端设备可把模糊调回 0</li>
<li>深色壁纸或深色背景色自动触发表面家族协调翻转;显式设置的文字色仍然优先</li>
<li>每个颜色角色单值双模式共用,派生色按当前模式自动推导</li>
<li>图片压缩预算 2MB、输入上限 5MB;受 localStorage 配额约束;持久化数据加载时会按 schema 校验与钳制,手改坏 localStorage 也不会产生无效样式</li>
<li>视频背景建议使用 H.264(MP4)或 VP8/VP9(WebM)编码;不支持的编码(如 HEVC)会自动降级回壁纸;更换视频会同步清理 IndexedDB 中的旧记录</li>
<li>代码的语法高亮文字色(shiki <code>--shiki-token-*</code>)是独立的语法语言配色,不随主色变化(与 IDE 惯例一致);主色为白色时强调字背景为白色半透明,在浅色表面上视觉上接近不可见,属正常物理结果</li>
<li>气泡跟随主色,没有独立的气泡颜色设置:harness 把唯一的气泡背景渲染在用户消息上,AI 消息没有气泡(渲染事实,插件无法细分);主色未设置时气泡保持默认浅蓝白</li>
</ul>
<h2>包结构</h2>
<pre><code>src/
├── index.ts                  # Host 半部(空 apply,零运行时依赖)
├── invariant.ts              # 运行时不变式伴生
├── appearance-settings.ts    # 设置类型与默认值
└── client/
    ├── index.ts              # apply():localStorage 持久化、插槽注册
    ├── applier.ts            # DOM 应用器(token 覆写、背景图层、毛玻璃)
    ├── tokens.ts             # 颜色角色 → token 映射、预设、半透明烘焙
    ├── color.ts / image.ts   # 色值工具 / 图片压缩
    ├── video-store.ts        # IndexedDB 视频存储(20MB 上限)
    ├── color-scheme.ts       # 配色导出/导入(纯函数)
    ├── settings-store.ts     # 设置镜像 store
    ├── locales.ts            # 中英文案
    └── AppearanceCustomizerRow.tsx + .module.css   # 设置行 UI
tests/                        # 测试(`pnpm test` 独立运行,@deepseek-ai 运行时以 tests/stubs 桩替代)
types/client.d.ts             # 手写 client 半部类型声明
cordis.patch.yml              # bundle patch
tsdown.standalone.config.ts   # 自包含构建
vitest.config.ts              # 独立测试配置(alias 指向 tests/stubs)
lib/                          # 构建产物</code></pre>
<p><code>@deepseek-ai/*</code> 依赖全部为 optional peer,运行期由宿主提供;唯一运行时依赖是 <code>clsx</code>。97 个 vitest 测试全绿(独立仓库可独立运行),CI 构建与产物断言全绿。</p>
<h2>License</h2>
<p>MIT</p>]]></description>
    <pubDate>Thu, 20 Aug 2026 00:48:08 +0800</pubDate>
    <dc:creator>blogger</dc:creator>
    <guid>https://dsh.lewz.cn/tqsy114514-dsh-ui-appearance.html</guid>
</item>
<item>
    <title>dsh-client-ui-skin-claude</title>
    <link>https://dsh.lewz.cn/pakiknowledge-dsh-client-ui-skin-claude.html</link>
    <description><![CDATA[<h1>dsh-client-ui-skin-claude</h1>
<p><a href="https://github.com/awesome-dsh-plugin/awesome-dsh-plugin"><img src="https://awesome-dsh-plugin.com/badge.svg" alt="awesome · DSH plugin" /></a> <a href="https://raw.githubusercontent.com/PAKIKNOWLEDGE/dsh-client-ui-skin-claude/main/README.en.md">English</a> | 中文</p>
<p>Claude 风格的 DSH Web 界面皮肤：暖黑画布、陶橙点缀、衬线 UI，跟随原生亮/暗主题。</p>
<p><img src="https://raw.githubusercontent.com/PAKIKNOWLEDGE/dsh-client-ui-skin-claude/main/docs/dark.png" alt="暗色" /> · <img src="https://raw.githubusercontent.com/PAKIKNOWLEDGE/dsh-client-ui-skin-claude/main/docs/light.png" alt="亮色" /></p>
<h2>特性</h2>
<ul>
<li>暖黑（#141413）画布 + Anthropic 陶橙（#d97757）点缀</li>
<li>衬线界面字体（Georgia），代码用等宽栈</li>
<li>细滚动条、陶橙选中 / 焦点、胶囊徽章</li>
<li>亮 / 暗双主题，跟随系统切换</li>
</ul>
<h2>安装</h2>
<p>从 npm 安装（推荐，预构建免授权）：</p>
<pre><code class="language-sh">dsh plugin --profile web add @pakiknowledge/dsh-client-ui-skin-claude</code></pre>
<p>或从 GitHub 安装：</p>
<pre><code class="language-sh">dsh plugin --profile web add github:PAKIKNOWLEDGE/dsh-client-ui-skin-claude</code></pre>
<p>装完重启 <code>dsh web</code>，刷新页面。</p>
<h2>切换</h2>
<p>同一时刻只启用一个皮肤。编辑 <code>~/.dsh/cordis.patch.yml</code>：</p>
<pre><code class="language-yaml"># dsh-skin managed 段之外
- insert:
    - id: ui-skin-claude
      name: '@pakiknowledge/dsh-client-ui-skin-claude'</code></pre>
<p>（并把当前启用皮肤的 <code>disabled: true</code> 加上。）配置 watcher 几秒内热加载，刷新页面生效。</p>
<h2>卸载</h2>
<ol>
<li>删除 <code>~/.dsh/cordis.patch.yml</code> 里的 <code>ui-skin-claude</code> insert 行</li>
<li><code>dsh plugin --profile web remove @pakiknowledge/dsh-client-ui-skin-claude</code></li>
<li>重启 <code>dsh web</code></li>
</ol>
<h2>许可</h2>
<p>MIT</p>]]></description>
    <pubDate>Thu, 20 Aug 2026 00:47:38 +0800</pubDate>
    <dc:creator>blogger</dc:creator>
    <guid>https://dsh.lewz.cn/pakiknowledge-dsh-client-ui-skin-claude.html</guid>
</item>
<item>
    <title>dafy-whale-theme</title>
    <link>https://dsh.lewz.cn/dviridescent-dafy-whale-theme.html</link>
    <description><![CDATA[<h1>dafy-whale-theme（蓝色大肥鱼主题）</h1>
<p>DeepSeek Harness web 前端的整站主题插件：海洋蓝配色、游动鱼群、上升气泡、右下角 DeepSeek 娘吉祥物（可互动）、输入框上方「每日鱼语」、左上角品牌替换。</p>
<p><img src="https://raw.githubusercontent.com/DViridescent/dafy-whale-theme/main/preview.png" alt="preview" /></p>
<h2>一句话安装</h2>
<blockquote>
<p>帮我去 <a href="https://github.com/DViridescent/dafy-whale-theme">https://github.com/DViridescent/dafy-whale-theme</a> 安装大肥鱼插件</p>
</blockquote>
<p>把这句话发给你的 DeepSeek Harness，它会自动完成全部安装；完成后按它提示重启 <code>dsh web</code> 并刷新浏览器（F5）即可。</p>
<h2>官方安装（唯一通路）</h2>
<p>需要 pnpm。本包在 <code>package.json</code> 中声明了 <code>dsh.bundle</code>，随包携带自己的组合层 <code>cordis.patch.yml</code>，因此官方 CLI 一条命令完成安装并自动挂载：</p>
<pre><code class="language-bash">dsh plugin --profile web add github:DViridescent/dafy-whale-theme</code></pre>
<p>升级与卸载同样走官方通路：</p>
<pre><code class="language-bash">dsh plugin --profile web update dafy-whale-theme   # 升级
dsh plugin --profile web remove dafy-whale-theme   # 卸载</code></pre>
<blockquote>
<p>patch 层只在<strong>下次启动</strong>时生效：重启 <code>dsh web</code> 后刷新页面（web 组合禁用了 HMR，不会热加载）。</p>
</blockquote>
<h2>补齐素材（可选）</h2>
<p>DeepSeek 娘动图因许可原因不随仓库分发（见 NOTICE），不补齐时吉祥物自动回退为 emoji。克隆本仓库后运行：</p>
<pre><code class="language-bash">node install.mjs</code></pre>
<p>脚本只做两件事：尚未安装时执行上面的官方命令（本仓库路径）；把动图素材补进已安装的包目录。幂等，可重复执行。</p>
<h2>特性</h2>
<ul>
<li>海洋蓝亮/暗双主题配色，DeepSeek 蓝品牌色</li>
<li>全屏氛围：海面光晕、上升气泡、来回游动的鱼群（侧边栏可开关）</li>
<li>右下角 DeepSeek 娘吉祥物：单击招手+随机肥鱼语录，双击弹出梗图，悬停 ✕ 收起</li>
<li>输入框上方滚动「每日鱼语」</li>
<li>左上角品牌：官方鲸鱼图标 + 「蓝色大肥鱼」字标</li>
<li>窄侧栏自适应，无 UI 裁切</li>
</ul>
<h2>素材与许可</h2>
<p>代码采用 MIT 许可（见 <a href="LICENSE">LICENSE</a>）。图片素材来自社区仓库，逐文件许可明细见 <a href="NOTICE">NOTICE</a>：</p>
<ul>
<li>MIT 许可素材（鲸鱼娘立绘、肥鱼表情、梗图）随仓库分发</li>
<li>DeepSeek 娘动图（源仓库无许可声明）由安装脚本在<strong>安装时自动从原仓库获取</strong>，本仓库不直接分发</li>
</ul>
<p>「DeepSeek 娘」为基于 DeepSeek 品牌角色的二创形象，如计划大规模商业使用请自行评估品牌权利风险。</p>]]></description>
    <pubDate>Thu, 20 Aug 2026 00:47:08 +0800</pubDate>
    <dc:creator>blogger</dc:creator>
    <guid>https://dsh.lewz.cn/dviridescent-dafy-whale-theme.html</guid>
</item>
<item>
    <title>dsh-joi-channel-theme</title>
    <link>https://dsh.lewz.cn/tpmoonchefryan-dsh-joi-channel-theme.html</link>
    <description><![CDATA[<p align="center">
  <img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/app-logo-flowers.png" width="380" alt="轴伊Joi 双衣装主题 · 双人 logo">
</p>
<h1 align="center">轴伊Joi 双衣装主题</h1>
<p align="center">
  <strong>把 DeepSeek Harness 变成她的房间。</strong><br>
  基于 VirtuaReal 虚拟主播轴伊Joi 制作的非官方、非商业 DeepSeek Harness 主题插件。
</p>
<p align="center">
  <a href="./README.en.md">English</a> ·
  <strong>简体中文</strong> ·
  <a href="./README.ja.md">日本語</a> ·
  <a href="./README.ko.md">한국어</a> ·
  <a href="./README.fr.md">Français</a>
</p>
<p align="center">
  <img alt="DeepSeek Harness" src="https://img.shields.io/badge/DeepSeek-Harness-4D6BFE?style=flat-square&logoColor=white">
  <img alt="Claude Fable 5" src="https://img.shields.io/badge/Claude-Fable%205-D97757?style=flat-square&logoColor=white">
  <a href="https://space.bilibili.com/61639371"><img alt="轴伊Joi 的哔哩哔哩个人主页" src="https://img.shields.io/badge/Bilibili-轴伊Joi-00A1D6?style=flat-square&logo=bilibili&logoColor=white"></a>
</p>
<p align="center">
  <img alt="dsh web plugin" src="https://img.shields.io/badge/dsh%20plugin-web-8B5CF6?style=flat-square">
  <img alt="两套衣装" src="https://img.shields.io/badge/衣装-Flowers%20%C2%B7%20Library-EE7F2D?style=flat-square">
  <a href="./LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/code-MIT-3DA639?style=flat-square"></a>
  <a href="./LICENSE-ASSETS.md"><img alt="CC BY-NC-SA 4.0" src="https://img.shields.io/badge/assets-CC%20BY--NC--SA%204.0-EF9421?style=flat-square"></a>
</p>
<p align="center">
  <a href="#overview">项目简介</a> ·
  <a href="#gallery">界面预览</a> ·
  <a href="#states">状态演出</a> ·
  <a href="#installation">安装</a> ·
  <a href="#wardrobe">换装与原生</a> ·
  <a href="#design">设计与技术</a> ·
  <a href="#license">许可说明</a>
</p>
<hr />
<p><a id="overview"></a></p>
<h2>项目简介</h2>
<p>轴伊Joi 是一名活跃于中国视频平台哔哩哔哩的虚拟主播，隶属于虚拟艺人团体 VirtuaReal。</p>
<p>喜欢像素风绘画、赛博朋克和电影《银翼杀手》；讨厌运动；特长是「一口能吃一个带橘子」，<br />
并认为橘子是最完美的水果——「🍊」由此成为她的事实 emoji 代表（非公式）。</p>
<p>这套主题把她的<strong>两套官设服装做成了两间完整的房间</strong>：暖色舞台感的 <strong>Joi·Flowers</strong>，<br />
和冷色书房感的 <strong>Joi·Library</strong>。不是同一张皮换个色相——底色、面板、气泡、代码高亮、<br />
底纹、角色演出，两套各成体系，<strong>互不混用</strong>。而「换装」这个词本身，正是电影里<br />
Joi 的叙事在这个界面上唯一落脚的地方。</p>
<table>
<thead>
<tr>
<th style="text-align: center;">衣装</th>
<th style="text-align: center;">明暗</th>
<th style="text-align: center;">语义色槽</th>
<th style="text-align: center;">角色</th>
<th style="text-align: center;">内联素材</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;"><code>2 套</code></td>
<td style="text-align: center;"><code>浅 · 深 · 跟随系统</code></td>
<td style="text-align: center;"><code>7 + 叶</code></td>
<td style="text-align: center;"><code>轴伊 · 轴芯 · 鲸鱼娘</code></td>
<td style="text-align: center;"><code>10 件 · 2.4 MB · 零外链</code></td>
</tr>
</tbody>
</table>
<blockquote>
<p>[!IMPORTANT]<br />
<strong>非官方粉丝作品。</strong> 本项目与轴伊Joi、VirtuaReal、哔哩哔哩、DeepSeek 及相关权利方<br />
不存在隶属、授权、合作、赞助或背书关系。角色名称、形象、人物设定及相关品牌权利<br />
归各自合法权利人所有。</p>
</blockquote>
<p><a id="gallery"></a></p>
<h2>界面预览</h2>
<p>新会话页：她站在房间门口，视线落在「探索未至之境」上；鲸鱼娘趴在标题上打盹，<br />
爪尖恰好压进汉字 4 个像素——这是「趴在上面」唯一的深度线索。</p>
<table>
<thead>
<tr>
<th style="text-align: right;"></th>
<th style="text-align: center;">Joi·Flowers</th>
<th style="text-align: center;">Joi·Library</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: right;"><strong>浅色</strong></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/new-chat-flowers.png" width="410" alt="Joi·Flowers 新会话页 · 浅色"></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/new-chat-library.png" width="410" alt="Joi·Library 新会话页 · 浅色"></td>
</tr>
<tr>
<td style="text-align: right;"><strong>深色</strong></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/new-chat-flowers-dark.png" width="410" alt="Joi·Flowers 新会话页 · 深色"></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/new-chat-library-dark.png" width="410" alt="Joi·Library 新会话页 · 深色"></td>
</tr>
</tbody>
</table>
<p>明暗永远跟着 app 自己的外观设置走；衣装换的是色相，不是明暗。四个象限<br />
（两套衣装 × 浅深）每一格都按同一份冻结基线逐值校过。</p>
<h3>品牌双人照</h3>
<p>侧栏左上角的鲸鱼图标，换成了一张<strong>双人合照</strong>——鲸鱼娘和轴伊挤在同一张<br />
die-cut 贴纸里：引擎和她，一个都不能少。合照随衣装一起换装，白描边直接<br />
烘焙进图，浅色底上也立得住；两张图按同一画布对齐，换装时脸的位置纹丝不动。</p>
<p align="center">
  <img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/app-logo-flowers.png" width="360" alt="Flowers 双人 logo">
  &nbsp;&nbsp;
  <img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/app-logo-library.png" width="360" alt="Library 双人 logo">
</p>
<p><a id="states"></a></p>
<h2>状态演出</h2>
<p>对话页上，输入框两侧坐着两个小家伙：左边是<strong>轴芯</strong>（粉丝形象），右边是<strong>轴伊</strong> Q 版。<br />
它们跟着这一轮对话换表情——同一套词表、同一个时刻结算，绝不各说各的：</p>
<table>
<thead>
<tr>
<th style="text-align: right;"></th>
<th style="text-align: center;">Joi·Flowers</th>
<th style="text-align: center;">Joi·Library</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: right;"><strong>待机</strong> <code>info</code></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/idle-flowers.png" width="380" alt="Flowers 待机"></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/idle-library.png" width="380" alt="Library 待机"></td>
</tr>
<tr>
<td style="text-align: right;"><strong>执行中</strong> <code>running</code></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/working-flowers.png" width="380" alt="Flowers 执行中"></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/working-library.png" width="380" alt="Library 执行中"></td>
</tr>
<tr>
<td style="text-align: right;"><strong>成功</strong> <code>success</code></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/success-flowers.png" width="380" alt="Flowers 成功"></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/success-library.png" width="380" alt="Library 成功"></td>
</tr>
<tr>
<td style="text-align: right;"><strong>失败</strong> <code>error</code></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/failed-flowers.png" width="380" alt="Flowers 失败"></td>
<td style="text-align: center;"><img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/failed-library.png" width="380" alt="Library 失败"></td>
</tr>
</tbody>
</table>
<p>跑成了，两个人一起眯眼开心；跑砸了，一起垂眼掉一滴泪——难过五秒，然后打起精神<br />
回到待机。失败从不被表演成嚎啕：那不是她们的性格。</p>
<p>长对话里文字压到角色身上时，重叠的那几行会自动获得一圈底色描边——<br />
可读性永远排在可爱前面。</p>
<p><a id="installation"></a></p>
<h2>安装</h2>
<h3>先确认两件事</h3>
<table>
<thead>
<tr>
<th>前提</th>
<th>为什么</th>
<th>检查</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Node.js</strong> <code>^22.19</code> 或 <code>&gt;=24</code></td>
<td>DeepSeek Harness 的运行底座</td>
<td><code>node -v</code></td>
</tr>
<tr>
<td><strong>pnpm</strong></td>
<td><code>dsh plugin</code> 本质是 pnpm 的转发器，缺了会报 <code>pnpm not found on PATH</code></td>
<td><code>pnpm -v</code></td>
</tr>
</tbody>
</table>
<p>没有 pnpm 就先装一个（任选其一）：</p>
<pre><code class="language-bash">npm install -g pnpm</code></pre>
<pre><code class="language-bash">corepack enable pnpm</code></pre>
<h3>情况 A：你平时用 <code>npx</code> 跑 harness</h3>
<p>如果你习惯直接 <code>npx @deepseek-ai/dsh web</code>，那么 <code>dsh</code> 这个命令<strong>并不在 PATH 上</strong><br />
——单独敲 <code>dsh plugin ...</code> 会报 <code>command not found</code>。用同样的 <code>npx</code> 前缀即可：</p>
<pre><code class="language-bash">npx @deepseek-ai/dsh plugin --profile web add dsh-joi-channel-theme</code></pre>
<p>装完再照常启动：</p>
<pre><code class="language-bash">npx @deepseek-ai/dsh web</code></pre>
<blockquote>
<p>[!IMPORTANT]<br />
<strong>profile 名必须是 <code>web</code>。</strong> 只有 <code>web</code> 和 <code>headless</code> 两个名字带出厂模板；<br />
换成别的名字只会得到一个没有网页界面的空 profile，页面起不来。</p>
</blockquote>
<h3>情况 B：你想少打点字</h3>
<p>把 harness 装成全局命令，之后 <code>dsh</code> 直接可用：</p>
<pre><code class="language-bash">npm install -g @deepseek-ai/dsh</code></pre>
<pre><code class="language-bash">dsh plugin --profile web add dsh-joi-channel-theme &amp;&amp; dsh web</code></pre>
<h3>然后</h3>
<p>浏览器打开终端里打印的地址（默认 <code>http://127.0.0.1:3080</code>），刷新一次，她就在了。</p>
<p><strong>如果 harness 正在运行</strong>，插件不会热加载——插件集变更只在重启时生效。<br />
按 <code>Ctrl+C</code> 停掉，装好插件，再重新启动。</p>
<h3>卸载</h3>
<pre><code class="language-bash">npx @deepseek-ai/dsh plugin --profile web remove dsh-joi-channel-theme</code></pre>
<blockquote>
<p>[!NOTE]<br />
<strong>命令行只用这一次。</strong> 装完之后所有操作都在界面里：换装、以及回到原生外观，<br />
都在 设置 → 通用设置 的同一栏。DeepSeek Harness 目前没有图形化的插件安装入口，<br />
所以这一步绕不开。</p>
<p>[!TIP]<br />
卸载后界面会逐项回到原生——token、图标、字标、代码高亮，零残留，<br />
这一点经过实机逐项核对。</p>
</blockquote>
<details>
<summary><strong>常见问题</strong></summary>

**`dsh: command not found`** — 你没有全局安装 harness。用 `npx @deepseek-ai/dsh plugin ...`
（情况 A），或者先 `npm install -g @deepseek-ai/dsh`（情况 B）。

**`dsh: pnpm not found on PATH`** — `dsh plugin` 需要 pnpm 来管理 profile 的依赖。
先 `npm install -g pnpm` 或 `corepack enable pnpm`。

**装完了但界面没变** — 插件集变更只在重启时生效。停掉 harness 再启动，然后硬刷浏览器
（`Cmd/Ctrl+Shift+R`）。

**国内网络下 `npx` 拉不动** — 本包已发布到官方 npm；若你的默认源是镜像，
镜像通常几分钟内同步。急用可临时指定官方源：
`npx --registry=https://registry.npmjs.org/ @deepseek-ai/dsh plugin --profile web add dsh-joi-channel-theme`

**从本地检出安装（开发用）**

```bash
dsh plugin --profile web add /path/to/dsh-joi-channel-theme
```

从 GitHub 直装**不推荐**：pnpm ≥10 会拦下 `prepare` 构建脚本，首次安装必定失败，
需要手动把提示的包名写进 profile 的 `pnpm-workspace.yaml` 的 `allowBuilds` 再重跑。
npm 包已带构建产物，不需要任何构建授权。

</details>
<p><a id="wardrobe"></a></p>
<h2>换装与原生</h2>
<p><strong>换装</strong>入口在 设置 → 通用设置 → 换装：三张卡并排，选一张，房间会跟着换。<br />
下半部分仍是原生的浅色 / 深色 / 跟随系统三方块——明暗永远归 app 自己管。</p>
<p align="center">
  <img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/settings-wardrobe.png" width="405" alt="换装行 · 浅色 · Joi·Flowers">
  &nbsp;
  <img src="https://raw.githubusercontent.com/tpmoonchefryan/dsh-joi-channel-theme/main/docs/settings-wardrobe-dark.png" width="405" alt="换装行 · 深色 · Joi·Library">
</p>
<p><strong>「DeepSeek 原生」是第三张卡</strong>，就并排在两套衣装旁边：选它即回到 DeepSeek 原生外观，<br />
插件保持安装；再选回任一套衣装即刻恢复。装了插件，不等于必须换肤。</p>
<p>它没有做成「插件开关」，因为它本来就不是——关掉不会停用插件，profile 里的 bundle<br />
照样装着、照样加载，插件列表里的状态一动不动。它切换的自始至终只是外观。</p>
<details>
<summary><strong>这间房间里藏了什么（设计彩蛋）</strong></summary>

- **会成熟的橘子** — 上下文用量不再是进度环，是一颗从深绿熟到橙红的橘子。
  熟过头本身就是警示；叶恒绿、蒂恒褐，因为身份不随状态变。
- **鲸蓝恒定** — 模型、用量、子代理的颜色两套衣装完全相同。
  人的颜色会换，工具的颜色不换。
- **金色配额** — 她的瞳色 `#FFCE65` 在 Flowers 里可以铺满用户气泡，
  在 Library 里只准出现在胸针尺度的点缀上。克制也是设计。
- **底纹即衣料** — Flowers 的花瓣点阵来自裙面印花，Library 的方格纸来自制图线。
- **字标手术** — 侧栏的 deepseek 字标被小心地重排成双行，HARNESS 徽章
  精确对齐到「ek」的 e——原生 SVG 一个字节都没改，随时可逆。
- **🍊 无处不在** — 标签页图标、一级列表记号，都是那颗最完美的水果。
- **子代理小鲸鱼** — 并发的子任务排成一排小鲸鱼：排队闭眼、运行喷水、完成眯眼。

</details>
<p><a id="design"></a></p>
<h2>设计与技术</h2>
<p>这套主题先有一份<strong>冻结的设计基线</strong>，后有代码：每个色值、每个锚点、每条精灵格<br />
比例都写在一份 <code>baseline-4q.json</code> 里，代码在构建期从基线生成常量，禁止手抄。回归脚本按同一份基线断言四个象限（283 项全绿才算过）。</p>
<table>
<thead>
<tr>
<th>项目</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td>插件 ID</td>
<td><code>dsh-joi-channel-theme</code></td>
</tr>
<tr>
<td>形态</td>
<td>dsh bundle + web 客户端插件（官方安装链路，无需自打包前端）</td>
</tr>
<tr>
<td>令牌覆盖</td>
<td>每套衣装 19 级中性色阶 + 44 条语义映射 + 9 项代码高亮，浅深双值</td>
</tr>
<tr>
<td>角色资产</td>
<td>轴伊 2×2 ×2 套 · 轴芯 2×2 · 鲸鱼娘趴/站 · 小鲸鱼 1×3</td>
</tr>
<tr>
<td>内联素材</td>
<td>10 件 WebP data URI，共 2.4 MB，零外链（CSP 友好）</td>
</tr>
<tr>
<td>兼容</td>
<td>DeepSeek Harness web <code>0.1.0-rc.5+</code></td>
</tr>
<tr>
<td>深入阅读</td>
<td><a href="./docs/DEVELOPMENT.md">开发与设计文档</a></td>
</tr>
</tbody>
</table>
<details>
<summary><strong>查看仓库结构</strong></summary>

```text
dsh-joi-channel-theme/
├── README.md                 # 本文（en/ja/ko/fr 见同级）
├── LICENSE                   # 代码：MIT
├── LICENSE-ASSETS.md         # 素材：CC BY-NC-SA 4.0
├── THIRD_PARTY_NOTICES.md
├── cordis.patch.yml          # dsh bundle 配置层
├── src/                      # 宿主半边 + 浏览器半边
├── scripts/                  # 基线/素材生成 · 精灵对齐 · 四象限回归
├── stuff/                    # 原始素材（含未采用版本）
└── docs/                     # 截图与开发文档
```

</details>
<p><a id="license"></a></p>
<h2>许可与权利声明</h2>
<p>本仓库采用分类授权：</p>
<ul>
<li>代码、项目原创配置与文档文字采用 <a href="./LICENSE">MIT License</a>；</li>
<li><code>stuff/</code> 与 <code>docs/</code> 中项目作者依法有权许可的原创视觉贡献采用<br />
<a href="./LICENSE-ASSETS.md">CC BY-NC-SA 4.0</a>，要求署名、非商业性使用及相同方式共享。</li>
</ul>
<blockquote>
<p>[!WARNING]<br />
两份许可证均只覆盖项目维护者或贡献者依法有权许可的原创部分，不授予轴伊Joi 的<br />
姓名、角色形象、设定，以及 VirtuaReal、哔哩哔哩、DeepSeek 或其他第三方名称、<br />
商标、素材和参考资料的任何权利。</p>
</blockquote>
<p>角色、品牌与资料来源的完整权利边界见 <a href="./THIRD_PARTY_NOTICES.md"><code>THIRD_PARTY_NOTICES.md</code></a>。</p>
<hr />
<p align="center">
  <sub>Unofficial fan project · Code MIT · Original assets CC BY-NC-SA 4.0 · 🍊</sub>
</p>]]></description>
    <pubDate>Thu, 20 Aug 2026 00:46:38 +0800</pubDate>
    <dc:creator>blogger</dc:creator>
    <guid>https://dsh.lewz.cn/tpmoonchefryan-dsh-joi-channel-theme.html</guid>
</item>
<item>
    <title>dsh-client-ui-mobile-adapt</title>
    <link>https://dsh.lewz.cn/hotsteel2901-dsh-client-ui-mobile-adapt.html</link>
    <description><![CDATA[<h1>dsh-client-ui-mobile-adapt</h1>
<blockquote>
<p><strong>Your DeepSeek Harness web UI, rebuilt for the phone in your hand.</strong></p>
<p>Built for developers who code in <strong>Termux on Android</strong>: the three-column<br />
desktop shell collapses into a clean single-column mobile layout — sidebar<br />
becomes a swipe drawer, composer tools stay on one line, settings and<br />
trajectory details open as full-screen panels that actually scroll, and a<br />
tap on the stats pill reveals the whole session report. Desktop stays<br />
exactly as it is; your phone finally works.</p>
<p><strong>为在手机上用 Termux 敲代码的你，把 DeepSeek Harness 的 Web 界面真正搬上手机屏。</strong></p>
<p>专为 Android 上的 Termux 开发者打造：三栏桌面布局收敛为清爽的单栏移动布局——<br />
侧边栏变成滑出抽屉、输入工具保持一行、设置与轨迹详情以可滚动的全屏面板呈现、<br />
点一下统计胶囊就能看到完整会话报告。桌面端分毫不动，手机端终于能用了。</p>
</blockquote>
<p>DeepSeek Harness Web GUI 的手机端适配<strong>客户端插件</strong>。</p>
<p>纯客户端插件：仅在 <code>max-width: 768px</code> 视口下生效，桌面端完全不受影响。<br />
采用官方客户端插件格式（<code>dsh.client</code> 声明 + <code>window.__ModuleLoader__.load</code> 模块），<br />
同时可作为 profile bundle（<code>dsh.bundle.patch</code>）一键挂载。</p>
<h2>功能</h2>
<table>
<thead>
<tr>
<th>区域</th>
<th>效果</th>
</tr>
</thead>
<tbody>
<tr>
<td>整体布局</td>
<td>三栏 Grid 覆盖为 <code>0 minmax(0,1fr) 0</code>，中栏占满全宽</td>
</tr>
<tr>
<td>侧边栏</td>
<td>左侧抽屉（<code>left</code> 位移动画），内容组件填满抽屉宽度</td>
</tr>
<tr>
<td>汉堡按钮</td>
<td><code>shell.overlay</code> 槽位浮动按钮（左上角，安全区适配），点遮罩关闭</td>
</tr>
<tr>
<td>会话头部</td>
<td>给汉堡留位、标题/操作可换行、「对话/轨迹」标签以屏幕中线为对称轴居中</td>
</tr>
<tr>
<td>输入工具行</td>
<td>强制单行（权限选择/计划/附加/模型选择/上下文/发送），触发器限宽 112px</td>
</tr>
<tr>
<td>弹层</td>
<td>模型选择、上下文详情、命令菜单限宽 <code>calc(100vw - 16px)</code> 不出屏</td>
</tr>
<tr>
<td>设置面板</td>
<td>全屏显示，顶部导航单行可横滑，内容区可滚动，自带 × 关闭</td>
</tr>
<tr>
<td>插件面板</td>
<td>fixed 悬浮、底部 130px（不遮触发按钮），可开可关</td>
</tr>
<tr>
<td>轨迹页面</td>
<td>表格全宽；详情面板改固定高度悬浮窗（<code>min(52vh,460px)</code>），内部可滚动</td>
</tr>
<tr>
<td>底部统计</td>
<td>胶囊摘要（轮/步/缓存/Token），点击展开完整统计面板（可滚动，× 关闭）</td>
</tr>
<tr>
<td>iOS</td>
<td><code>100dvh</code> 动态视口、刘海/底部安全区适配</td>
</tr>
</tbody>
</table>
<h2>安装</h2>
<h3>方式一：推荐 —— 专用 profile（<code>dsh --profile webmobile</code>）</h3>
<p>本包同时是 <strong>profile bundle</strong>，最省事的使用方式是建一个包含它的 profile。</p>
<pre><code class="language-bash"># 1. 创建 webmobile profile（在 $DSH_HOME/profiles/webmobile/）
#    package.json:
#    {
#      "name": "dsh-profile-webmobile",
#      "private": true,
#      "dependencies": {
#        "dsh-client-ui-mobile-adapt": "https://github.com/Hotsteel2901/dsh-client-ui-mobile-adapt/archive/refs/heads/main.tar.gz"
#      },
#      "dsh": { "profile": { "bundles": [
#        "@deepseek-ai/dsh-base",
#        "@deepseek-ai/dsh-web-app",
#        "dsh-client-ui-mobile-adapt"
#      ] } }
#    }

# 2. 安装依赖
cd ~/.dsh/profiles/webmobile
npm install

# 3. 启动（= web 全部功能 + 手机适配）
dsh --profile webmobile</code></pre>
<h3>方式二：装进已有 profile</h3>
<pre><code class="language-bash"># 任意 profile 目录下
dsh plugin --profile web &lt;profile 名&gt; add https://github.com/Hotsteel2901/dsh-client-ui-mobile-adapt/archive/refs/heads/main.tar.gz</code></pre>
<p>或手动在 profile 的 <code>cordis.patch.yml</code> 里插入一行：</p>
<pre><code class="language-yaml">- insert:
    - id: ui-mobile-adapt
      name: 'dsh-client-ui-mobile-adapt'</code></pre>
<p>重启即生效。</p>
<blockquote>
<p>⚠️ <strong>npm 12 安全策略</strong>：npm 默认禁止 <code>git://</code>、<code>github:用户名/仓库</code> 和远程 tarball 依赖<br />
（<code>EALLOWGIT</code> / <code>EALLOWREMOTE</code>）。<strong>普通 <code>https://.../archive/refs/heads/main.tar.gz</code> URL 可以正常安装</strong>，<br />
所以请使用 tarball URL 形式，不要用 <code>github:</code> 简写。</p>
<p>更新到最新版本（改代码重新 push 后）：</p>
<pre><code class="language-bash">npm cache clean --force &amp;&amp; rm -rf node_modules/dsh-client-ui-mobile-adapt &amp;&amp; npm install</code></pre>
<p>版本约束：CSS 类名对应 DSH <code>0.1.0-rc.6</code> 的前端构建产物（CSS Modules 哈希类名）。<br />
若 DSH 升级、前端构建变化，需要按新构建产物重新核对类名。</p>
</blockquote>
<h2>依赖</h2>
<ul>
<li><code>react</code>、<code>@deepseek-ai/cordis</code></li>
<li>运行时客户端服务（由 host 侧其他 client 包提供）：<code>slots</code>、<code>layout</code>、<code>locale</code></li>
<li>peer 依赖中的 <code>@deepseek-ai/dsh-client-*</code> 包</li>
</ul>
<h2>开发 / 发布</h2>
<pre><code class="language-bash">npm pack              # 本地打包验证
npm publish           # 发布到 npm（需 npm 账号与 2FA；本包也可以只留在 GitHub）</code></pre>
<p>包结构：</p>
<pre><code>lib/index.js       # host 空入口
lib/client.js      # 浏览器客户端插件（window.__ModuleLoader__.load 官方格式）
cordis.patch.yml   # bundle patch（insert ui-mobile-adapt 行）</code></pre>
<h2>涉及的产品内部类名（对应 0.1.0-rc.6 前端构建）</h2>
<ul>
<li>布局：<code>.pI_x6G_*</code>（<code>dsh-client-ui-layout</code>）</li>
<li>会话/输入：<code>.wSkVaW_*</code>、<code>.uV2eYG_*</code>、<code>.Md3f7G_*</code>（<code>dsh-client-ui-conversation</code>）</li>
<li>设置：<code>.VOzbGW_*</code>（<code>dsh-client-ui-settings-general</code>）</li>
<li>插件面板：<code>.Nqubda_*</code>（<code>dsh-client-ui-cordis</code>）</li>
<li>轨迹：<code>.qBU-ya_*</code>、<code>.Y0dWHa_*</code>、<code>.fV0t5q_*</code>（<code>dsh-client-ui-trajectory</code>）</li>
</ul>
<h2>License</h2>
<p>MIT</p>]]></description>
    <pubDate>Thu, 20 Aug 2026 00:46:08 +0800</pubDate>
    <dc:creator>blogger</dc:creator>
    <guid>https://dsh.lewz.cn/hotsteel2901-dsh-client-ui-mobile-adapt.html</guid>
</item>
</channel>
</rss>