大家好,我是阿超。
最近我在用一个叫 DeepSeek Harness 的工具(简称 DSH)进行一些项目开发。
在经过多轮对话后,想把一些对话内容保存起来供后面查阅,也想知道agent内部是怎么干活的,但发现只有一个导出session对话的下载按钮:

并且导出的是一个 zip,里面密密麻麻一堆 JSONL,根本看不懂。
这是给机器续聊用的,不是给“人”看的。
所以我干脆想着自己写个可以给人看懂的插件,叫:dsh-share-page。
从有想法,到开发,到踩坑,到发上 npm,全程一个人搞定,现在版本 0.1.1。
这篇文章就把这趟「从 0 到 1」完整记下来。
想自己写 DSH 插件的朋友,照着抄作业就行;不想写的,看完也知道它是个啥。
一、先想清楚:做啥、给谁用
开发插件之前,其实需要想清楚:插件是做啥、干啥用的。
我开发的这款插件,一句话:把任意 DSH 会话,一键变成可分享的只读网页。

单文件 HTML,样式脚本全内联,零外部请求,断网也能开。
点开就是一条对话时间线,跟聊天记录一样,谁都能看懂,能知道agent每一步具体流程。

跟官方的 /export 摆一块看,区别很清楚:
/export 产出原始 ZIP,面向机器、面向续聊。
dsh-share-page 产出可读网页,面向人。
再往深一层说,它解决的是"交付"这件事。
对内交付——给同事看 AI 是怎么一步步干完的,省得你复述半天。
对外交付——给客户的东西,带指纹防篡改、带水印、默认脱敏,等于一份可追溯的执行记录。
"面向人的可读分享"这一环,之前是空白,我把它补上了。
二、开发出来的成品长什么样
装上之后,会话 Header 右上角会多一个"分享"按钮。

点开是个轻量对话框,四个选项摆好。

主题——跟随系统 / 浅色 / 深色。
脱敏——默认开。邮箱、密钥、IP、绝对路径自动打码。
思考块——默认折叠,想看再点开。
水印——可选。比如写"内部资料,请勿外传",页脚展示。
选完点"生成分享页",会打开一个html静态页面。
生成出来的页面长这样——顶部是会话信息卡,时间、模型、工作目录、Token 用量一目了然。

下面是时间线,用户和助手的消息一泡泡排开。
工具调用做成了可折叠卡片,参数和结果并排,报错标红。

模型回复里的 Markdown 表格,原样渲染成表格。
页面底部有两个 SHA-256 指纹:
会话指纹——事件流的哈希,跨渲染能对比。
文件指纹——最终 HTML 的哈希,文件被改动,用 sha256sum 一验就知道。
这俩指纹,是给"交付审计"兜底的。
交付给别人的记录,被改过能发现。拿去评审、归档,都踏实。
三、开发阶段踩的坑
在插件开发的过程中,坑也是一个接一个。
最大的一个,栽在 React 的写法约定上。
DSH 的界面插件,用的是React,跟我们平时 Vite、CRA 那套完全是两码事。
最基础的 jsx,它的第三个参数不是 children,是 key。
我用了好几款编程工具定位问题,才定位到是因为把文字当第三参数传进去,结果整个"分享"按钮直接消失,控制台报 TypeError。查了好半天,才搞明白是这回事。
第二个坑,引用的图标组件不存在。
有的编程工具会根据"分享"的意思,猜了个 IconGlobeOutline14 图标来用,结果这组件根本不存在。
引用不存在的组件,渲染直接崩。
第三个坑,manifest 要声明依赖。
插件想在 Header 里塞按钮,得先声明它依赖哪个提供插槽的包。
漏了这条,插件装上去静默失效——界面看着正常,其实压根没加载。
这几个坑一个个填过来,才有了现在这个能跑的版本。
写插件的门槛不高,但暗坑不少。
虽然借助AI工具来写很快完成,但还是会踩坑,这就需要我们定位问题让它来解决。
开发插件用的是DeepSeek-V4-Flash模型来开发的,期间也让它来定位问题,浪费了不少token。
为节省token用量,后来特意等到闲时才处理完这些问题。
由于我装的插件比较多,遇到一些兼容性问题,所以也卸载了一些安装的插件。
还有就是在开发插件的时候,最好是用 创造模式来开发插件。
并且要注意端口占用问题,在修改重启时,很容易遇到端口被占用的问题。
四、发布到 npm:完整流程
开发完,就该发了。有想发插件的朋友,这块可以照着来。
第一步,把 package.json 写全。
name 要全网唯一,我的是 dsh-share-page。
version 从 0.1.0 起步,现在发到 0.1.1。
main 指向入口 index.mjs,exports 把 lib、client 都暴露出来。
keywords 别偷懒,别人在 npm 搜 "dsh-plugin" 能搜到你。
repository、homepage、bugs 这些元数据填上,npm 页面上会显示得规整。
第二步,files 字段控制发布内容。
这是个白名单,我只列了 index.mjs、lib、client、cordis.patch.yml、scripts、README.md。
node_modules、.git 这些 npm 默认不带,有 files 更保险。
第三步,本地先验一遍。
我项目里有个 npm run verify,跑真实会话渲染,18 项自检。
发布前必须全过。
第四步,登录 npm。
npm login第一次会让你填账号密码,邮箱收个验证码。
不确定自己登没登上,npm whoami 看一眼当前账号。
第五步,发布。
npm publish就这一条命令,几秒钟,包就上去了。
不敢真发的话,先 npm publish --dry-run 试跑一遍,它会打印出将要上传哪些文件,不真发。
第六步,版本更新。
改完代码,npm version patch,0.1.1 变 0.1.2,再 npm publish。
发布这里我也踩了两个坑:
第一个,.npmrc 里可能存着发布用的 token,这东西绝不能进 git。
我在 gitignore 里加了 .npmrc,还单独提交了一次"发布凭据"的忽略配置。
凭据泄露了,可不只是删库这么简单。
第二个,2FA。
我 npm 账号开了两步验证,普通登录去发布,直接报 403。
解决办法:去 npmjs.com 生成一个 Granular Access Token,勾上 "Bypass 2fa for publish",把 token 写进项目的 .npmrc。
这步卡了我好一会儿。发之前先把 token 弄对,能省不少时间。
五、装上就能用
安装就一条命令:
dsh plugin --profile web add dsh-share-page重启一下 dsh web,Header 上就有按钮了。
用起来有三种姿势:
第一种,Web UI 按钮。最省事,点按钮选选项就行,这是主入口。
第二种,斜杠命令。在输入框敲 /share,或者 /share session-xxx 指定会话。
第三种,Agent 工具。模型可以直接调 share_session,参数里能指定脱敏开关、主题、输出目录。
输出的 HTML 默认放在 ~/.dsh/shares/ 下面。
这里多说一句:DSH 还在开发者预览期,上游随时可能有破坏性变更。
六、对插件生态的看法
现在插件也是越来越多,有的也是不好选哪个好。质量参差,但头部正在慢慢跑出来。
我觉得现在的状态,像早期的应用商店。
鱼龙混杂是事实,好货要淘也是事实。
装插件的人,装之前先看看它最近有没有更新。
写插件的人,既然发了,就尽量维护下去,并且最好也不要在已有类似功能插件上再重复造轮子。
而且现在DSH还是预览版,也许后面有大更新,插件也要做随之兼容和适配。
最后
这个插件从有想法到发上 npm,花了一下午的时间。
功能说不上多复杂,但它补上了一个我想要的东西——把 AI 干活的过程,体面地拿给别人看。
如果你也在用 DSH,或者想把 AI 干活的记录拿给同事、客户看,装一个试试:
dsh plugin --profile web add dsh-share-page有 bug 直接去 GitHub 提 issue,我会尽快修复。
如果大家有其他好用的插件的想法,也欢迎留言,我们一起把好插件开发出来。
也欢迎大家给仓库点个 star,让它被更多需要的人看到。
如果这篇文章对你有帮助,点个「赞」和「关注」,谢谢~
相关链接
插件仓库:https://github.com/huazhiliange/dsh-share-page
npm 页面:https://www.npmjs.com/package/dsh-share-page
夜雨聆风