DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Md Linebreak — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
M

@workspace/dsh-md-linebreak

Md Linebreak

按照文本的写法渲染 Markdown:正文中的每一行源文本都保留其独立的显示行,而不会合并为一行。主机端通过官方 webserver 索引注入表发布一条 `white-space: pre-line` 规则,使其同时作用于提供服务的 index.html 和 Desktop shell 的启动载荷,而无需修改已安装的应用程序。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:wangjiezhe/dsh-md-linebreak#0a03527064985aa2be6e65d94af12f6ff0b598d3
README兼容性版本

兼容性与来源证明

Md Linebreak 以 @workspace/dsh-md-linebreak 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
any
发布来源
github
Registry 更新时间
2026/9/30

版本

0.1.0stable
2026/9/30

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
any
许可证
未声明
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/9/30
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Experimental Agent Team Web Profile@deepseek-ai/dsh-experimental-agent-team-web-profile用于 Agent Teams Remote 和 UI 插件的实验性 Web 配置层Ab Chartdsh-ab-chart带有绘制其调用的浏览器卡片的图表渲染工具,封装在一个可发布的插件包中Whale Widgetdsh-whale-widgetDSH Web 界面右下角的 DeepSeek 余额小鲸鱼挂件:余额/今日已用/峰谷定价、自定义泡泡点击序列(文本/余额/今日/峰谷/图片/随机语句与并列加权选择)、逐行样式与字体、悬浮快捷编辑、音效与每轮消耗、自定义角色/动图/音效、吸附与翻转自定义

README

dsh-md-linebreak — 正文里的换行不再被合并

它解决的问题

Web 客户端把 Markdown 交给 MarkdownText 渲染,而 CommonMark 的软换行(正文里 单独一个换行)在渲染树里只是一个文本节点里的 \n:

case "text": return node.value

文本节点里的换行在 HTML 里是可折叠空白,所以源码写了多行的段落会被画成一行:

第一行
第二行        →   显示为「第一行 第二行」

DSH 对用户自己发的消息是保留换行的(气泡用 white-space: pre-wrap),只有渲染出来 的 Markdown 会丢——这个插件补的就是这一处。

它做了什么

宿主半边在每次采集注入表时(HTTP 服务每次响应 index.html,以及 host 启动时那一次采集) 往表里推一行 style(webserver/index-inject),规则是:

:is([class*='_markdown_'], [data-dsh-part='message-body']) :is(p, td, th) { white-space: pre-line }
:is([class*='_markdown_'], [data-dsh-part='message-body']) li:not(:has(> :is(p, ul, ol, pre, blockquote, div, table, hr, h1, h2, h3, h4, h5, h6))) { white-space: pre-line }
  • pre-line 就是全部修复:换行按换行显示,其余空白(空格、制表符)照常折叠, 长行仍然在容器边缘自动折行。等价于 GFM 的 breaks: true。 如果你想让被换行的源码连缩进也逐字保留,把 pre-line 换成 pre-wrap 即可 (就在 lib/index.js 的 STYLE 里,改一处)。
  • 代码不动:pre / code 有自己的 white-space 策略;列表项只在内容是行内 时才命中规则——渲染器会在容器的块级子节点之间插入装饰性换行文本节点,pre-line 会把那些画成空行,所以带嵌套列表 / 代码块 / 段落的列表项被排除在外。
  • 两个锚点:[class*="_markdown_"] 是 MarkdownText 的根类(CSS Modules 会写成 _markdown_<hash>_<line>,稳定的部分是本地名),[data-dsh-part="message-body"] 是皮肤中心语义属性契约里「助手消息正文」的官方锚点(启用皮肤时才存在)。任一命中即可。

为什么走 index 注入表

那张表有两个消费者:webserver 每次响应 index.html 时把行渲染进 <head>;Desktop 壳 在启动 payload 里收到同一批行。一行同时覆盖两种载体。因此:

  • 不写入 harness home,也不修改已安装的应用文件(app.asar 一个字节都不动);
  • 升级 DSH 不会把它冲掉,规则失效也只会表现成「换行又被合并」;
  • 卸掉这个 bundle,下一次 host 启动(用浏览器访问 HTTP 端口的话则是刷新)后就没有这条规则了。

怎么生效 / 怎么验证

  1. 重启 DSH(桌面端必须重启,原因见下)。
  2. 回到会话里看一条正文写了多行的回复:每一行各自占一行。
  3. 校验行确实被推入注入表(不需要浏览器):
    $node tools\dsh-env\run-mdlinebreak.mjs
    
    其中一项用真实 cordis 派发 + 官方 renderIndexInjections 渲染真实的 dist/index.html, 断言这条 <style> 落在 <head> 里、__DSH_BOOT_READY__ 未被扰动。
  4. cordis_inspect_query(platform: host, provider: Config, method: listConfigs, input: {name: '@workspace/dsh-md-linebreak'}) 应能看到 include:md-linebreak 这一行,且状态不是 inactive。

为什么桌面端要重启

注入表有两个消费者:HTTP 服务的每次 index 响应,以及桌面壳的启动 payload。浏览器直接访问 http://127.0.0.1:19387 时,刷新即可(每次响应重新收集);桌面端的窗口加载的是 dsh-app://app/(应用自有协议,Electron main 从 app.asar 里的同一份 dist 提供),注入行不是 从 index.html 里读的,而是窗口启动时经 IPC 取「host ready 那一刻采集的那一份」 (dsh-desktop-host/lib/index.js 的 ready 消息 → lib/main.js 的 ipcMain.handle(DESKTOP_IPC.boot))。新增的行因此只在下一次 host 启动时进入窗口, 刷新页面拿到的是同一份 payload。

怎么关掉

设置 → 插件里禁用这个 bundle,然后重启(或刷新,见上)。 彻底移除:plugin_manager(remove_bundle, target: "@workspace/dsh-md-linebreak")。

安装与维护

# 安装(会写入 profile 的 node_modules 与 dsh.profile.bundles)
plugin_manager(install_bundle, target: "file:C:\Users\wangjiezhe\Documents\deepseek-harness\default-workspace\dsh-md-linebreak")
# 改完源码后同步到已安装副本(pnpm 是 COPY,不是 junction)
pwsh -File dsh-md-linebreak\sync-installed.ps1
# 校验:逐文件 SHA256 + 关键标记
$node tools\dsh-env\verify-installed.mjs
dsh-md-linebreak/
  package.json        dsh.bundle.patch 指向 cordis.patch.yml
  cordis.patch.yml    插入一行 id: md-linebreak
  lib/index.js        规则本体 + 一行 style 注入(全部逻辑都在这一个文件里)
  sync-installed.ps1  按内容哈希同步到已安装副本
  README.md           这份文档

已知边界

  • 换行只在正文层面恢复:代码块本来就不折叠;表格单元格在 GFM 里本来就不能跨行 (规则对它没有副作用)。
  • 规则是 CSS,锚点依赖上游的类名 / 语义属性。上游若改名,表现是规则静默失效 (不会画错),此时更新 ANCHOR 常量即可。
  • 这条规则作用于所有 MarkdownText 表面:聊天正文、思考过程(compact 变体)、 右侧文档预览。它们共用同一个渲染器,所以行为一致。