← 返回列表
未验证
一个 DeepSeek Harness 客户端 UI 插件:当你在模型消息中选中文本并复制时,剪贴板内容会被重写为…
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/19 · 已提供中文文档
将 dsh 助手输出复制为 Markdown,保留链接、LaTeX 源码和代码围栏。
综合分
29.9
GitHub 分
29.9
用户评分
—
★ Stars
4
周下载量
—
兼容 / 相关生态插件(非 dsh 原生,请按其对应运行时安装)
git clone https://github.com/Asianfleet/dsh-message-copy-enhance.git数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
dsh-message-copy-enhance npm version npm downloads License: MIT TypeScript English · 一个 DeepSeek Harness 客户端 UI 插件:当你在模型消息中选中文本并复制时,剪贴板内容会被重写为 Markdown,这样链接、LaTeX 源码、代码围栏语言信息等就不再丢失。 工作原理 DSH 通过 dsh-client-ui-conversation → dsh-client-ui-primitives 渲染模型输出: | 内容 | DOM 结构 | 恢复方式 | |---|---|---| | 链接 | | 直接取 href,输出 label | | 行内 / 块级 LaTeX | KaTeX 渲染的 .katex / .katex-display | 从 MathML 分支中的 取回 TeX 源码,输出 $...$ / $$...$$ | | 代码块 | .md-code-block(横幅显示语言)+ pre | 输出围栏代码块;语言来自 language- 类或横幅的 infostring | | 标题 / 强调 / 列表 / 引用 / 表格 | 标准 HTML | 恢复为 GFM | 该插件在 捕获阶段 监听 document 上的 copy 事件,仅当选区起始于 [data-chat-flow-kind="assistant"] 消息内部且包含 markdown 关键元素时才接管: 1. 将选区扩展到完整的 .katex 元素(在公式中间选中也能拿到完整源码) 2. 用 Range.cloneContents() 克隆选区 DOM 3. 用内置的零依赖 DOM→Markdown 转换器恢复 markdown(src/client/toMarkdown.ts,用 TypeScript 编写,类型擦除后内联进 bundle) 4. preventDefault() 并写入 text/plain 和 text/markdown 其他选区(用户气泡、工具卡片、纯文本)和空选区完全不受影响;如果转换失败,会自动恢复默认复制行为。 项目结构 dsh-message-copy-enhance/ ├── package.json # dsh.client 元数据(客户端插件声明) ├── tsconfig.json # 类型检查配置(strict,包含 src/test/vite.config.ts) ├── vite.config.ts # vite 构建(DSH module-loader 输出)+ vitest 配置 ├── src/client/ │ ├── index.ts # 插件入口:复制拦截 + apply/inject(TS,apply(ctx) 使用官方 │ │ # @deepseek-ai/cordis Context 类型,与 dsh-client-ui- 相同) │ └── toMarkdown.ts # DOM→Markdown 转换器(TS,零依赖) ├── lib/ │ ├── index.js # 宿主侧空操作插件(由 DSH Loader 加载的 JS 入口) │ └── index.d.ts # 宿主入口的类型声明 ├── dist/client.js # 构建产物(预生成) └── test/ # vitest(.test.ts):转换器 / 打包 / 包布局 构建与测试 npm install # 开发依赖:typescript / vite / vitest / @types/node / linkedom / @deepseek-ai/cordis(官方类型) npm run typecheck # tsc -p tsconfig.json — 完整类型检查(严格模式) npm run build # vite build — 将 src/client 打包为 dist/client.js,采用 DSH 模块加载器格式 npm test # vitest run — 36 个用例(转换器 / 真实打包 / 包布局) npm run test:watch # vitest — 监听模式 npm run test:coverage # vitest run --coverage — v8 覆盖率报告 发布 发布由 release-it 驱动,并使用 Conventional Commits 变更日志。请在 main 分支上、工作区干净的状态下运行: pnpm release 它是交互式的:首先会展示自上一个标签以来的提交作为变更日志预览(按类型分组,包含 conventional-commits 推荐版本),然后你从提示中选择下一个版本(patch / minor / major / 预发布变体 / 自定义)。按顺序会发生以下事情: 1. 检查(npm run check:release):版本是有效的 SemVer,该版本尚未发布到 npm(或自其标签以来有新的提交),GITHUB_TOKEN 已设置,npm 已认证;然后运行类型检查和测试套件。 2. 提示 — 打印变更日志预览,并交互式选择下一个版本(显示来自 conventional commits 的推荐升级;feat → minor,fix/perf/revert → patch,破坏性变更 → major)。 3. 变更日志 — 根据自上一个标签以来的提交重新生成 CHANGELOG.md,置于所选版本下。 4. 构建 — npm run build(DSH 模块加载器客户端打包)。 5. 发布 — 提交 chore(release): vX.Y.Z,打标签 vX.Y.Z,推送到 GitHub,创建 GitHub Release(发布说明来自变更日志),然后执行 npm publish。 前提条件: - 已导出 GITHUB_PAT_TOKEN(一个 GitHub PAT — 具有 repo 范围的经典令牌,或在本仓库上具有 Contents: Read and write 权限的细粒度令牌;gh auth token 也可以;GITHUB_TOKEN 可作为后备),并已 npm login。协作者预检查会被跳过(github.skipChecks),因为细粒度令牌在该端点上会收到 403;GitHub 在创建发布时仍会强制执行真实权限。 - 提交遵循 Conventional Commits;脚本仅识别这些类型。 实用变体: pnpm release:dry # 试运行:预览所有内容而不做任何更改 pnpm release -- --increment=patch # 跳过提示并强制 patch 升级(或 minor/major) pnpm release -- --ci # 完全非交互式(用于 CI;回退到补丁版本号递增) 注意:如果设置了 CI 环境变量,release-it 会自动切换到非交互模式。 安装 dsh plugin --profile desktop add dsh-message-copy-enhance 升级 dsh plugin --profile desktop add dsh-message-copy-enhance@latest 此包尚未发布 1.0 版本,像 ^0.1.0 这样的脱字符范围仅覆盖补丁版本(0.1.x)——次版本递增(0.1 → 0.2)超出了该范围,因此 dsh plugin update 不会获取到它。请使用 @latest(或 @)显式升级。 用法 在任意模型回答中选中内容并按 Ctrl/Cmd+C,然后粘贴到 Typora / Obsidian / VS Code / 任意 markdown 编辑器中,即可获得完整的 markdown。 限制 - 跨多条消息的选区不会被拦截(仅处理起始于助手消息内部的选区)。 - 被渲染白名单过滤掉的链接(例如 file:、相对链接)本身就没有 href,无法恢复。 - 代码块仅恢复选中的行(不会强制展开整个代码块);当选中区域不包含语言标识行时,语言标签会缺失。 - 显示为 .katex-error(KaTeX 渲染失败)的元素会以 $source$ 形式输出。 - 表格以 GFM 管道表格形式输出;| 会被转义。 许可证 MIT — 版权所有 (c) 2026 Asianfleet
扫码进群