微信公众号排版工作台:把 Markdown 渲染成带内联样式的 HTML,粘进公众号编辑器即成排版;配右侧栏面板、11 套主题与五个模型工具做块级改稿。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-fishpai
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:OMSociety/dsh-fishpai
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
这是什么 • 核心特性 • 效果 • 安装方式 • 模型工具 • 面板快捷键 • 开发 • 许可证与作者
这是什么
鱼排编辑器把 Markdown 排成内联样式 HTML:整段粘进微信公众号编辑器就得到成品排版。
它同时是一个人在回路里的改稿台——面板与模型看的是同一篇文档,谁改了什么一目了然。
渲染内核与主题来自 MoPai 墨排 / mopai-markdown(MIT),
本仓库把同一套管线重构为 DSH 插件。署名与许可链条见 NOTICE.md。
核心特性
| 特性 | 说明 |
|---|---|
| Markdown 快捷键 | 选中后 Ctrl/⌘+B 加粗、+I 斜体、+K 链接、+Alt+1/2/3 标题、+Shift+8/7 列表;列表里回车自动续写 |
| 图片直接粘进来 | 截图 Ctrl/⌘+V 粘入(也可以拖进来)→ 存到文档同级的 assets/,正文自动插入引用,预览立刻可见 |
| 实时预览 + 手机宽度 | 打字 300ms 后预览跟着变;栏位够宽左右并排,窄了自动单栏;可切 375px 看公众号真实观感 |
| 批注与占位 | 光标所在段落加批注(模型下次 fishpai_read 就能看到);正文里写 <!-- 鱼排: 这里补个过渡 --> 也一样;点批注「定位」直接选中它引用的那段 |
| 块级 diff 与局部改稿 | 模型只改该改的块,你的其它改动原样保留;写入必须带 base_revision,不符先拒并回带"自你上次写入以来的改动" |
| 冲突不丢字 | 模型与你同时改时给出「用我的覆盖 / 看 AI 的版本」,采用 AI 版会先把你的草稿存进历史 |
| 主题与主题色 | 11 套主题,按"是否适合公众号"分组;主题色只对「默认公众号」生效(用不上的取色行会自动隐藏),有风险的主题直接提示原因;另有工作目录级的「自定义主题」(模型可在内置主题上只改几个槽位) |
| 复制与导出 | 复制为 text/html + text/plain 双格式;本地图片内嵌 base64,粘过去不用手动重传;也能导出成自包含 .html |
| 五个模型工具 | fishpai_open / read / write / render / theme,配一份教模型怎么用的技能 |
效果
同一份 HTML 用「导出 HTML」存成文件、在浏览器里打开,看到的就是面板右侧那个样子。
安装方式
从 npm 安装
# 先停掉正在运行的 DSH(运行中的服务会锁住依赖,装完再起)
dsh plugin --profile <profile> add "dsh-fishpai"
装好后刷新一下浏览器页面,「鱼排编辑器」从右侧栏的引导页打开——只重启宿主不够,客户端产物是页面加载时取的;入口与布局按会话记忆,新会话第一次要点一次(模型调
fishpai_open时也会自动打开)。 本插件零运行时依赖,不受minimumReleaseAge影响。
装完怎么用
- 让模型
fishpai_open打开一篇 Markdown → 右侧栏应自动弹出鱼排并显示正文与预览 - 在面板里打字 → 预览跟着变;选中文字按
Ctrl/⌘+B→ 变成**加粗**,Ctrl+Z能撤销 - 截图后
Ctrl/⌘+V→ 正文出现,预览里能看到图,文档同级多出assets/目录 - 光标放在某段上点「+批注」写一句要求,再到正文里写一行
<!-- 鱼排: 这里补个过渡 --> - 让模型
fishpai_read→ 它应当说出你改了哪一块、批注要求什么、占位在哪一行 - 让模型
fishpai_write(mode: "patch")→ 只有那块变了,你其它改动原样保留 - 点「复制到公众号」→ 粘进公众号编辑器,版式正确(标题 / 列表 / 引用 / 表格 / 信息卡片)
模型工具
| 工具 | 作用 | 关键参数 |
|---|---|---|
fishpai_open |
打开 / 新建文档,并在右侧栏弹出面板 | path(可省扩展名,自动补 .md)、markdown(新建时写正文)、theme |
fishpai_read |
改稿前必做:读块级 diff、批注、占位、图片提醒与块 id | doc_key、include |
fishpai_write |
改稿。必须带 base_revision;优先按块改 |
doc_key、base_revision、mode(patch / replace)、patches[{block_id 或 block_index, op, markdown}] |
fishpai_render |
导出可粘贴 / 归档的自包含 HTML(本地图片内嵌 base64) | out_path(可省扩展名)、theme、theme_spec(临时自定义主题,不落盘)、publish(false = 预览原样形态)、embed_images |
fishpai_theme |
工作目录级的**「自定义主题」**(一套,set / show / clear):模型在某套内置主题上只覆盖想改的槽位,面板主题列表里就是那一个占位 |
action、theme_spec |
模型的标准动作顺序是 open → 等你改 → read → write → 你点复制;技能 fishpai
(随插件注册)里写明了这套纪律与排版口径,模型会在需要时自己读。
面板快捷键
| 快捷键 | 作用 | 快捷键 | 作用 |
|---|---|---|---|
Ctrl/⌘ + B |
加粗 | Ctrl/⌘ + Alt + 1/2/3 |
一级 / 二级 / 三级标题 |
Ctrl/⌘ + I |
斜体 | Ctrl/⌘ + Alt + 0 |
正文(去掉标题) |
Ctrl/⌘ + E |
行内代码 | Ctrl/⌘ + Shift + . |
引用 |
Ctrl/⌘ + K |
链接 | Ctrl/⌘ + Shift + 8 / + 7 |
无序 / 有序列表 |
Ctrl/⌘ + Shift + X |
删除线 | Tab / Shift + Tab |
缩进 / 反缩进 |
Ctrl/⌘ + S |
保存 | Ctrl/⌘ + Shift + C |
复制到公众号 |
Ctrl/⌘ + V |
粘贴图片(或拖进来) | Ctrl/⌘ + Enter |
添加批注(在批注框里) |
编辑器右上角的「快捷键」按钮里就是这份表(Mac 显示 ⌘、Windows 显示 Ctrl)。
数据放在哪
| 位置 | 内容 | 说明 |
|---|---|---|
你指定的 .md |
文档正文 | 普通 Markdown,任何编辑器都能改;鱼排不往正文里塞标记 |
.fishpai/docs/ |
没指定路径时新建的文档 | fishpai_open 省略 path 就落在这里,按标题命名 |
<文档同级>/assets/ |
粘贴进来的图片 | 相对路径引用(assets/xxx.png),文档搬走图也跟着走 |
.fishpai/state/ |
主题、revision、baseline、批注 | 按文档路径哈希命名;删掉会丢批注、历史与「模型上次写入的基线」(正文不动,但模型暂时看不出你改了什么) |
.fishpai/history/ |
历史快照(最多 50 份) | 面板「历史」抽屉里可一键回滚 |
.fishpai/theme.json |
「自定义主题」(工作目录级,只有一套) | fishpai_theme set 写、clear 删;改坏了静默退回「默认公众号」 |
.fishpai/.gitignore |
忽略 state/、history/、theme.json |
插件自建,只追加缺失的行(你写的改动一字不动);正文与图片是否入库由你自己决定,主题想跟仓库走就用 git add -f |
开发
npm install # 只有 devDependencies(esbuild / typescript / @types/react / @types/react-dom / @deepseek-ai/cordis)
npm test # 全量回归:golden + 站点对照 + 块/diff/批注/补丁 + 宿主红线 + 微信兼容层 + 主题规格 + 主题图标内联核对 + bundle + 快捷键 + 挂载 + 客户端 store 时序 + 接口层(api)
npm run typecheck # 客户端 TSX 类型检查
npm run build # 重新打包 lib/client.js(改完客户端必须跑,并提交产物)
npm run check:build # 确认 lib/ 无漂移
目录与「改东西去哪」:
plugin/index.mjs 宿主入口:注册工具 + /fishpai/api 路由 + fishpai 技能
plugin/core/ 渲染内核(ESM,零依赖):runtime / markdown / render / diff / notes / patch / theme-info / theme-spec
plugin/host/ 宿主侧:工具契约、HTTP 路由、文档存储、图片、自定义主题
plugin/vendor/ 上游 themes.js + markdown-it 14.1.0 + highlight.js 11.9.0 + hljs-map.json
client/ 客户端源码(TSX → esbuild 打成 lib/client.js)
lib/client.js 客户端 bundle(入库;dsh plugin add 不做构建)
skills/fishpai/ 鱼排技能:教模型怎么选主题、怎么按块改稿
test/ golden、站点对照、块/diff/批注/补丁、宿主红线、微信兼容层、主题规格、主题图标内联核对、bundle 形态、快捷键、真实 Cordis 挂载、客户端 store 时序、接口层(api)
用微信官方校验器复验(需要本机 Chrome,不进依赖):
git clone --depth 1 https://github.com/wechatjs/verify-article-structure-spec "$env:TEMP\was"
cd "$env:TEMP\was\cli"; $env:PUPPETEER_SKIP_DOWNLOAD='true'; npm install
$env:PUPPETEER_EXECUTABLE_PATH='C:\Program Files\Google\Chrome\Application\chrome.exe'
npx tsx src/index.ts <导出的 article.html> --json # isValid: true 即通过
支持与致谢
如果这个插件对你有帮助,欢迎点亮 Star,有问题和建议请提交 Issue 或 Pull Request;动手前请读
CONTRIBUTING.md,安全相关问题走SECURITY.md的私密渠道。想改主题或加一套自己的:主题定义集中在
plugin/vendor/themes.js,加完跑npm run test:golden:regen重生成 goldenMoPai 墨排 / mopai-markdown(MIT):渲染管线、主题、以及"复制到公众号"的整套行为都来自这里
markdown-it(MIT)与 highlight.js(BSD-3-Clause):随包内嵌的 vendor 资产
DeepSeek Harness:插件、右侧栏与技能的宿主
许可证与作者
MIT。上游 mopai-markdown © 2026 @ye4wzp;本仓库新增部分 © 2026 @OMSociety。
链接
同类插件
tt-a1i/archify#integrations/deepseek-harness★ 89901
从仓库或系统描述生成经过校验的自包含交互式架构图、流程图、时序图、数据流图和生命周期图。
dream-num/dsh-univer-office★ 614
为 DeepSeek Harness 打造一个真正的办公环境。Univer Office 插件将电子表格、文档、幻灯片、画布、多维表格等汇聚到同一个运行时——数据互联、修改经过校验、变更按版本管理,并以隔离工作树支持多 Agent 协作。
ECNU/EduWork#dsh-knowledge-studio★ 246
基于工作区资料的 Studio,复用 DSH 模型与共享成果服务,制作报告、演示文稿、表格、思维导图、测验、闪卡及音视频。Office 生成需 Python 3.12+ 及相关依赖,并配置 DSH_OFFICE_PYTHON;媒体渲染需 Chromium;本地语音转写另需 whisper.cpp 和模型。
PerryLink/dsh-industry-research★ 214
面向 DeepSeek Harness 的确定性行业研究报告:公司与行业研究流程基于分阶段证据产出结构化、可核验的报告。
HuanLinOTO/dsh-plugin-mineru★ 48
向模型暴露 MineRU 文档解析工具。
PolinniZhong/dsh-knit★ 47
把会话工作区里已有的 Markdown 文档、源码、图片与视频列进 DSH 侧边栏,按与当前对话的相关性排序。默认的词法模式用最近几条消息在本地与标题、摘要、正文做带 IDF 加权的匹配(BM25)—— 不调用模型、没有网络出口,内容不出本机。列表来自工作区扫描,而不是「最近打开记录」,所以重启 DSH 或新开会话都不会变空。排序结果组织成主要 / 辅助 / 相关三层的阅读顺序,每一条都写明可核验的理由(命中了哪个字段、被哪一篇引用),点一行即可就地预览:Markdown 按渲染后的样子显示、相对路径图片真实渲染、源码走宿主自带的语法高亮、视频走 HTTP Range 流式播放。同一份 Context Pack 也作为 knit_docs 工具交给 agent。后续版本陆续补上读取证据与生命周期(归因在读那一刻冻结)、固定 / 排除(排除先于检索生效,且可恢复)、关系证据(引用 / 导入 / 测试,带行号)与增量索引(重启后复用)。v0.23 起还多一条可选的混合检索:默认关闭,只有你自己配好 Ollama 或 OpenAI 兼容的 embedding 服务才会生效。它生效时,发出去的是你这句查询原话加上每篇候选文件的标题与摘要 —— Markdown 的摘要取自正文首段(不超过 60 字),代码的摘要是它所在的工作区相对目录,图片 / 视频贡献的是文件名;完整正文与绝对路径都不发送,指向本机服务(loopback)时内容不出这台机器。v0.24 起还能做变更关联:用一条只读的 git status(固定 argv、不走 shell、子进程环境白名单),配合同一套引用 / 导入 / 测试 / 提及证据,指出这次改动大概率该一起看哪些文件 —— 默认关闭。语义检索的收益仍待真 provider 实测,因此不承诺召回提升。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。