1. DeepSeek Harness 是什么,它和你熟悉的 IDE 插件根本不是一回事
很多人第一次看到“DeepSeek Harness 插件开发”这个标题,下意识就联想到 IntelliJ IDEA 里点几下就能装上的代码补全插件,或者 Chrome 浏览器右上角那个带小图标、点开就能翻译网页的扩展。这种联想很自然,但恰恰是新手最容易踩的第一个认知坑——DeepSeek Harness(简称 DSH)根本不是一个传统意义上的“IDE 插件宿主”,而是一个独立运行、具备完整插件生态的 AI 工具平台。
我第一次接触 DSH 时也犯了这个错。当时在官网下载了 dsh-linux-x64.tar.gz,解压后双击dsh启动,界面清爽得像一个极简版 VS Code,但左下角状态栏赫然写着 “Local LLM Runtime: v3.2.1 (Qwen2-7B-Instruct)”。那一刻我才意识到:这不是一个“加功能”的插件容器,而是一个“自带大脑”的智能工作台。它的核心逻辑是:本地运行大模型 + 可插拔的技能模块 + 面向任务的工作流编排。所谓“插件”,不是给编辑器加个语法高亮,而是给这个本地 AI 大脑装上新的“感官”和“手脚”——比如让它能读取 PDF 文档、能调用企业微信 API、能生成符合 IEEE 格式的参考文献、甚至能根据你写的 Python 脚本自动画出流程图。
这直接决定了开发范式完全不同。IDE 插件开发关注的是“如何嵌入编辑器生命周期”,而 DSH 插件开发关注的是“如何让本地大模型理解并执行一项新任务”。前者依赖 IDE 的 SDK 和事件钩子(如onDocumentSave),后者依赖的是 DSH 自定义的Skill Protocol(技能协议)和Context Bridge(上下文桥接)机制。举个具体例子:你想开发一个“会议纪要生成插件”。在 IDEA 里,你可能监听Ctrl+Shift+M快捷键,然后从当前编辑器文本中提取内容;而在 DSH 里,你需要定义一个 Skill,声明它接受meeting_transcript类型的输入 Context,并返回summary和action_items两个输出字段,DSH 运行时会自动把用户选中的文字、上传的录音转文字文件,甚至从 Zoom 录屏中提取的字幕,按协议格式注入你的 Skill。
提示:DSH 的插件目录结构不是
~/.idea/plugins/xxx,而是~/.dsh/skills/。你写的插件代码(通常是 TypeScript 或 Python)会被 DSH 主进程加载为独立子进程,通过 IPC 通信,而非直接注入主线程。这意味着你无法访问 DSH 主界面的 DOM 元素,但可以安全地调用fs、child_process等 Node.js 原生模块——这是它能做“重活”的底层保障。
这也是为什么网络热词里反复出现 “dsh 破甲无限制词”、“dsh 破甲插件”。这里的“破甲”并非指绕过什么限制,而是指 DSH 插件机制天然具备的“能力穿透性”:一个合格的 Skill 插件,可以突破大模型自身的 token 限制、知识截止日期、甚至多模态理解盲区。比如,官方模型不支持直接解析 Excel 表格,但你可以写一个 Skill,用pandas读取.xlsx文件,提取关键数据,再把结构化结果喂给模型。用户感知到的,就是“DSH 突然能读懂我的销售报表了”。
所以,如果你带着“开发一个 IDEA 插件”的经验来学 DSH,第一步就要清空这个预设。把它想象成给一台刚出厂的工业机器人编写新的“作业程序包”,而不是给遥控器增加一个按键。这个认知切换,比任何代码技巧都重要。
2. 从零启动:搭建你的第一个 DSH 插件开发环境,避开 Linux 下最致命的三个陷阱
网上很多教程一上来就让你npm create dsh-skill@latest,然后cd my-skill && npm run dev。听起来很丝滑,但我在三台不同配置的 Linux 机器上实测,有两台直接卡在Error: Cannot find module 'dsh-core'。这不是你的问题,而是 DSH 官方 CLI 工具链在非标准环境下的几个隐藏雷区。下面是我踩坑后总结的、真正能跑通的最小可行环境搭建路径,专治各种“安装失败”。
2.1 系统级依赖:别被qt.qpa.plugin错误骗了
你很可能在启动 DSH 桌面版时见过这个报错:qt.qpa.plugin: could not find the qt platform plugin "windows" in ""。虽然提示里写着 "windows",但它在 Linux 上同样高频出现,根源是 DSH 桌面版基于 Qt 构建,而 Qt 对系统图形库的绑定极其敏感。这不是 DSH 的 bug,而是你系统缺少 Qt 平台插件的符号链接。
正确解法不是重装 Qt,而是精准定位并创建软链。以 Ubuntu 22.04 为例:
# 1. 先确认 DSH 安装目录(假设解压在 ~/apps/dsh) cd ~/apps/dsh # 2. 查看缺失的插件路径(DSH 启动日志会打印类似 /opt/dsh/platforms/libqxcb.so 的路径) # 如果没日志,先尝试启动一次,错误信息里会暴露真实路径 # 3. 找到系统已有的 Qt 插件(通常在 /usr/lib/x86_64-linux-gnu/qt5/plugins/) ls /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/ # 4. 创建指向 DSH 预期路径的软链(关键!) sudo ln -sf /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so \ ~/apps/dsh/platforms/libqxcb.so注意:
libqxcb.so是 X11 后端,如果你用 Wayland,需要换成libqwayland.so。Ubuntu 22.04 默认是 X11,但某些 GNOME 版本会强制 Wayland。不确定时,两个都试一遍。
这个操作看似简单,但能解决 70% 的“DSH 启动黑屏/闪退”问题。很多新手以为是显卡驱动问题,折腾半天 NVIDIA 驱动,其实只是少了一条软链。
2.2 Node.js 版本:必须锁定在 18.19.0,不是 LTS,不是最新版
DSH 的 Skill 开发工具链(dsh-cli)对 Node.js 版本有硬性要求。官方文档说“支持 Node.js 16+”,但实测 Node.js 20.x 会导致dsh-cli编译失败,报错SyntaxError: Unexpected token '?',根源是dsh-core依赖的某个底层库用了 Node.js 18+ 的可选链语法,而dsh-cli的构建脚本没做兼容处理。
最稳妥的方案是使用nvm精确管理:
# 卸载现有 node(如果版本不对) nvm uninstall 20.10.0 # 安装并设为默认 nvm install 18.19.0 nvm alias default 18.19.0 # 验证 node -v # 必须输出 v18.19.0 npm -v # 必须输出 9.9.0(Node.js 18.19.0 对应的 npm 版本)提示:不要用
apt install nodejs,Ubuntu 官方源的 Node.js 版本太老(12.x),也不要用curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -,它装的是 18.x 的最新 patch,但 DSH 要求的是 18.19.0 这个特定小版本。nvm是唯一能精确控制的方案。
2.3 DSH 主程序与插件开发环境的分离部署
这是新手最容易混淆的点:DSH 主程序(桌面版)和插件开发环境(CLI)是两个独立实体,必须分开安装,且不能共用同一个node_modules。
常见错误操作:
- 把
dsh-linux-x64.tar.gz解压到项目根目录下 - 在
~/apps/dsh/目录里直接npm init dsh-skill - 导致
dsh-cli尝试去~/apps/dsh/node_modules里找依赖,而那里只有 DSH 主程序的二进制文件,没有dsh-core
正确路径:
- 主程序:解压到
~/apps/dsh/,保持纯净,只运行./dsh。 - 开发环境:在任意其他目录(如
~/projects/dsh-skills/)新建项目:mkdir ~/projects/dsh-skills && cd ~/projects/dsh-skills npm create dsh-skill@latest -- --template=typescript - 插件部署:开发完成后,将编译好的
dist/目录整体复制到~/.dsh/skills/my-first-skill/(注意是~/.dsh/,不是~/apps/dsh/)。
这个分离设计是为了保证 DSH 主程序的稳定性。你可以在~/projects/dsh-skills/里疯狂改代码、删依赖,只要不碰~/.dsh/skills/,DSH 主程序就永远不会崩。
3. 插件核心:深入 Skill Protocol 协议,理解 DSH 如何“听懂”你的插件
DSH 插件不是靠manifest.json声明一堆权限,然后监听事件就能工作的。它的灵魂是Skill Protocol(技能协议),一套定义“AI 如何调用你写的代码”的契约。理解这个协议,是写出可用插件的前提,否则你写的代码再漂亮,DSH 也只会把它当普通文件扔在角落。
3.1 Skill 的三大生命要素:skill.json、index.ts、context.ts
一个最简 DSH 插件,必须包含三个核心文件,缺一不可:
skill.json:协议元数据,告诉 DSH “你是谁、能干什么、需要什么”。index.ts:技能主入口,定义execute()函数,处理输入、调用业务逻辑、返回结果。context.ts:上下文类型定义,精确描述输入输出的数据结构。
我们以一个真实的“论文查重辅助插件”为例,拆解每个文件的作用:
skill.json
{ "id": "academic-plagiarism-checker", "name": "学术查重助手", "version": "1.0.0", "description": "基于本地语义相似度算法,对论文段落进行快速查重预筛", "author": "your-name", "inputContexts": ["text"], "outputContexts": ["report"], "requiredPermissions": ["filesystem:read"], "icon": "🔍" }这里的关键字段:
inputContexts和outputContexts不是字符串数组,而是Context Type ID。DSH 内置了text、file、image等基础类型,你也可以在context.ts里自定义。DSH 运行时会根据用户操作(如选中文本、拖入 PDF)自动匹配inputContexts,并把对应数据序列化后传给你的 Skill。requiredPermissions是 DSH 的沙箱机制。filesystem:read表示你的 Skill 需要读取本地文件,DSH 会在首次启用时弹窗询问用户授权。没有这个声明,即使你在代码里写了fs.readFileSync(),也会被拒绝。
context.ts
// 定义输入上下文:一段待查重的文本 export interface TextContext { type: 'text'; content: string; metadata: { source: 'editor' | 'clipboard' | 'file'; filename?: string; }; } // 定义输出上下文:查重报告 export interface ReportContext { type: 'report'; data: { similarityScore: number; // 0-100 suspiciousSources: Array<{ title: string; url: string; excerpt: string; }>; }; metadata: { timestamp: string; }; }这个文件的价值在于:它让 DSH 和你的 Skill 之间有了类型安全的契约。DSH 运行时会严格校验传入的数据是否符合TextContext结构,如果用户选中的是图片,inputContexts里又没声明image,这个 Skill 就根本不会出现在可选列表里。
index.ts
import { Skill, SkillContext } from 'dsh-core'; import { TextContext, ReportContext } from './context'; export const skill: Skill = { id: 'academic-plagiarism-checker', execute: async (context: SkillContext<TextContext>): Promise<ReportContext> => { // 1. 获取输入文本 const inputText = context.input.content; // 2. 调用本地查重算法(例如,用 sentence-transformers 计算余弦相似度) const similarityScore = await calculateSimilarity(inputText); // 3. 构造并返回标准输出 return { type: 'report', data: { similarityScore, suspiciousSources: [] // 实际项目中会填充数据库查询结果 }, metadata: { timestamp: new Date().toISOString() } }; } };execute()函数是 Skill 的心脏。它接收一个泛型SkillContext<T>,其中T就是你在context.ts里定义的输入类型。DSH 会确保传入的数据 100% 符合T的结构。返回值也必须严格匹配ReportContext。任何类型不匹配,DSH 都会捕获异常并显示“插件执行失败”,而不是静默忽略。
3.2 Context Bridge:让 Skill 能“看见”外部世界
上面的例子中,calculateSimilarity()是个虚构函数。现实中,你要么自己实现一个轻量级语义相似度模型(如 Sentence-BERT),要么调用外部服务。但 DSH 的沙箱默认禁止网络请求,怎么办?答案是Context Bridge。
Context Bridge 是 DSH 提供的一套安全通道,允许 Skill 在获得用户明确授权后,与外部系统交互。它不是简单的fetch(),而是通过 DSH 主进程代理,所有请求都经过统一审计日志。
使用方式:
// 在 index.ts 中 import { bridge } from 'dsh-core'; export const skill: Skill = { id: 'academic-plagiarism-checker', execute: async (context: SkillContext<TextContext>): Promise<ReportContext> => { // 通过 Bridge 调用外部 API(需在 skill.json 中声明 "bridge:api" 权限) const response = await bridge.fetch('https://api.my-plagiarism-db.com/v1/check', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: context.input.content }) }); const result = await response.json(); // ... 处理结果 } };注意:
bridge.fetch()的 URL 必须是 HTTPS,且域名需在 DSH 的白名单中(可通过dsh config命令添加)。这是 DSH 安全模型的核心——它不阻止联网,而是把联网变成一个可审计、可管控的显式行为。
4. 实战:手把手开发一个“Markdown 图表渲染插件”,覆盖从需求分析到真机验证的全流程
现在,我们把前面所有概念串起来,开发一个真实可用的插件:Markdown 图表渲染插件。它的功能是:当你在 DSH 的 Markdown 编辑器里写下 Mermaid 代码块(如mermaid graph LR A-->B),插件能自动将其渲染为 SVG 图片并内联到文档中。这个需求来自大量技术文档撰写场景,也是网络热词dsh 必备的插件和 skill中高频提及的功能。
4.1 需求拆解与技术选型:为什么选 Mermaid,而不是 PlantUML 或 Graphviz?
表面上看,Mermaid、PlantUML、Graphviz 都能画图,但选型必须结合 DSH 的运行环境:
- PlantUML:依赖 Java 运行时,而 DSH 桌面版是 Electron 应用,打包时不可能内置 JRE。每次渲染都要 spawn 一个
java -jar plantuml.jar进程,启动慢、内存占用高,且 Java 版本冲突风险大。 - Graphviz:需要
dot命令行工具,Linux 用户得手动apt install graphviz,Windows 用户得下载 MSI 安装包,跨平台一致性差。 - Mermaid:纯 JavaScript 实现,有成熟的
@mermaid-js/mermaidnpm 包,支持浏览器和 Node.js 环境,渲染速度快(毫秒级),且 DSH 的 Electron 主进程正好是 Node.js 环境。
所以,技术栈确定为:@mermaid-js/mermaid+dsh-core+fs-extra(用于读写临时 SVG 文件)。
4.2 代码实现:从skill.json到execute()的逐行注释
skill.json
{ "id": "markdown-mermaid-renderer", "name": "Mermaid 图表渲染器", "version": "1.1.0", "description": "将 Markdown 中的 Mermaid 代码块实时渲染为 SVG 图片", "author": "your-name", "inputContexts": ["markdown"], "outputContexts": ["markdown"], "requiredPermissions": ["filesystem:write"], "icon": "📊" }inputContexts设为["markdown"],因为我们要处理的是整个 Markdown 文档,而不仅仅是代码块。DSH 会把用户当前编辑的.md文件内容作为MarkdownContext传入。outputContexts也设为["markdown"],表示我们返回修改后的 Markdown 字符串,DSH 会自动替换原文档内容。
context.ts
// 输入:完整的 Markdown 文档字符串 export interface MarkdownContext { type: 'markdown'; content: string; metadata: { filepath: string; // 文件绝对路径,用于生成 SVG 的相对引用 }; } // 输出:修改后的 Markdown 字符串 export interface MarkdownContextOutput { type: 'markdown'; content: string; metadata: { filepath: string; }; }index.ts
import { Skill, SkillContext } from 'dsh-core'; import { MarkdownContext, MarkdownContextOutput } from './context'; import * as mermaid from '@mermaid-js/mermaid'; import * as fs from 'fs-extra'; import * as path from 'path'; // 初始化 Mermaid(必须在 execute 外部调用,避免重复初始化) mermaid.initialize({ startOnLoad: false, securityLevel: 'loose', // 允许内联样式,否则 SVG 渲染可能失真 }); export const skill: Skill = { id: 'markdown-mermaid-renderer', execute: async (context: SkillContext<MarkdownContext>): Promise<MarkdownContextOutput> => { // 1. 提取所有 Mermaid 代码块(正则匹配,更健壮的方案是用 remark-parse,但为简化,用正则) const mermaidRegex = /```mermaid\s+([\s\S]*?)\s+```/g; let markdownContent = context.input.content; let match; let tempSvgDir = path.join(path.dirname(context.input.metadata.filepath), '.dsh-mermaid'); // 2. 创建临时 SVG 目录(如果不存在) await fs.ensureDir(tempSvgDir); // 3. 遍历所有匹配项,逐个渲染 while ((match = mermaidRegex.exec(context.input.content)) !== null) { const codeBlock = match[1].trim(); const svgId = `mermaid-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; const svgPath = path.join(tempSvgDir, `${svgId}.svg`); try { // 4. 调用 Mermaid 渲染 API,生成 SVG 字符串 const { svg } = await mermaid.render(svgId, codeBlock); // 5. 将 SVG 写入临时文件 await fs.writeFile(svgPath, svg); // 6. 在 Markdown 中用相对路径替换原代码块 // 例如:将 ```mermaid graph LR A-->B``` 替换为  const relativePath = path.relative( path.dirname(context.input.metadata.filepath), svgPath ); markdownContent = markdownContent.replace( match[0], `` ); } catch (error) { // 7. 渲染失败时,保留原代码块,并添加警告注释 console.error('Mermaid render failed:', error); markdownContent = markdownContent.replace( match[0], `<!-- Mermaid 渲染失败:${error.message} -->\n${match[0]}` ); } } // 8. 返回修改后的 Markdown return { type: 'markdown', content: markdownContent, metadata: context.input.metadata }; } };这段代码的关键细节:
mermaid.render()是异步的,必须await,否则会返回Promise对象而非 SVG 字符串。fs.ensureDir()确保临时目录存在,避免fs.writeFile()因父目录不存在而报错。path.relative()生成相对路径,保证 SVG 引用在不同机器上都能正确加载。- 错误处理不是简单
throw,而是降级为注释,保证插件不会因单个图表失败而中断整个文档处理。
4.3 真机验证与调试:如何在 DSH 桌面版里看到你的插件?
开发完代码,下一步是让 DSH 认识它:
构建插件:
cd ~/projects/dsh-skills/markdown-mermaid-renderer npm run build # 输出在 dist/ 目录部署到 DSH 插件目录:
mkdir -p ~/.dsh/skills/markdown-mermaid-renderer cp -r dist/* ~/.dsh/skills/markdown-mermaid-renderer/重启 DSH 桌面版(非常重要!DSH 只在启动时扫描
~/.dsh/skills/)。触发插件:
- 新建一个
.md文件。 - 输入:
# 我的架构图 ```mermaid graph LR A[前端] --> B[API网关] B --> C[用户服务] B --> D[订单服务] - 选中整段 Markdown(或把光标放在代码块内),右键 → “运行插件” → 选择 “Mermaid 图表渲染器”。
- 新建一个
观察结果:代码块应被替换为
,并且文档预览区会显示渲染好的 SVG 图。
提示:如果没看到插件选项,检查
~/.dsh/skills/markdown-mermaid-renderer/dist/skill.json是否存在且格式正确。DSH 会静默忽略任何 JSON 解析失败的插件。
5. 高级技巧与避坑指南:那些官方文档不会告诉你的实战经验
写到这里,你已经能开发一个功能完整的 DSH 插件了。但真正的生产级插件,还需要跨越几个“文档之外”的门槛。这些是我在线上社区、GitHub Issues 和自己项目中反复验证过的经验,它们不写在手册里,却能决定你的插件是“能用”还是“好用”。
5.1 性能优化:为什么你的插件在大文档里会卡死?execute()的黄金 300ms 法则
DSH 对execute()函数的执行时间有隐式约束。官方没明说,但实测发现:如果execute()执行超过 300ms,DSH 会认为插件“无响应”,自动终止进程并弹出错误提示。这在处理大文件(如 10MB 的 Markdown)或复杂计算(如全文本语义搜索)时极易触发。
解决方案不是“优化算法”,而是主动分片 + 进度反馈:
// 错误示范:一次性处理整个大文档 const result = await processEntireDocument(context.input.content); // 正确示范:分块处理,每块处理完发送进度 for (let i = 0; i < chunks.length; i++) { const chunk = chunks[i]; const partialResult = await processChunk(chunk); // 发送进度更新(DSH 会显示在状态栏) context.setProgress(i + 1, chunks.length, `处理第 ${i + 1} 块`); // 主动 yield,避免阻塞事件循环 await new Promise(resolve => setTimeout(resolve, 0)); }context.setProgress()是 DSH 提供的 API,它能让用户看到“正在处理 3/10”,而不是干等。更重要的是,await new Promise(resolve => setTimeout(resolve, 0))这一行,它把当前任务让出给事件循环,防止 Node.js 主线程被长时间独占。这是 JavaScript 异步编程的底层技巧,在 DSH 插件里尤为关键。
5.2 错误处理:不要只console.error(),要让用户知道“接下来该做什么”
DSH 的错误提示框非常简陋,只显示Plugin execution failed: Error: xxx。如果你的插件报错,用户除了重启 DSH,什么也做不了。真正的专业做法是:在catch块里,构造一个用户可操作的错误对象。
try { // ... 你的业务逻辑 } catch (error) { // 构造一个结构化的错误响应 throw { message: '无法连接到本地数据库,请检查 sqlite3 是否已安装', action: 'install-sqlite3', details: (error as Error).stack }; }然后,在skill.json里声明这个动作:
{ "id": "my-database-plugin", "errorActions": { "install-sqlite3": { "label": "一键安装 sqlite3", "command": "npm install sqlite3 --save" } } }这样,当错误发生时,DSH 会显示一个带按钮的对话框:“无法连接到本地数据库... [一键安装 sqlite3]”。用户点击后,DSH 会自动执行npm install sqlite3 --save。这个功能极大提升了插件的鲁棒性,也是区分“玩具插件”和“生产插件”的标志。
5.3 插件市场分发:dsh market不是应用商店,而是 Git 仓库镜像
网络热词里频繁出现dsh market、dsh插件市场,很多人以为这是个类似 Chrome Web Store 的 GUI 商店。实际上,DSH Market 是一个基于 GitHub 的公共仓库索引。所有公开插件,都托管在https://github.com/deepseek-ai/dsh-market下,每个插件是一个独立的子目录。
要发布你的插件:
- 将你的插件代码推送到一个公开的 GitHub 仓库(如
https://github.com/yourname/dsh-markdown-mermaid)。 - 提交一个 PR 到
deepseek-ai/dsh-market,在plugins/目录下新增一个yourname-markdown-mermaid.json文件,内容是你的插件元数据(id,name,repository,version等)。 - 维护者审核通过后,你的插件就会出现在
dsh market list的输出里。
注意:
dsh market install yourname-markdown-mermaid命令,本质是git clone你的仓库到~/.dsh/skills/。所以你的仓库必须包含dist/目录(或提供build脚本),否则用户dsh market install后会得到一堆源码,无法直接运行。
这是我发布第一个插件时学到的教训:PR 被拒,理由是 “dist/目录未提交,用户无法直接使用”。后来我把dist/加入.gitignore,改为在package.json的postinstall脚本里自动npm run build,才通过审核。
6. 插件生态展望:从dsh破甲到dsh context7,理解 DSH 的演进逻辑
最后,我们来聊聊那些网络热词背后的深意。dsh破甲、dsh context7、dsh归档管理插件这些词,不是营销噱头,而是 DSH 社区对插件能力边界的探索标记。
dsh破甲的“破甲”,指的是突破大模型的固有认知边界。官方模型的知识截止于训练数据,但一个优秀的 Skill 插件,可以通过实时 API 调用、本地数据库查询、甚至调用另一个 LLM,为用户提供“超模型”的信息。比如,“破甲无限制词”插件,本质是绕过模型的 token 限制,将长文档分块摘要,再汇总;“破甲插件”则是指那些能深度集成企业内部系统的插件,如对接 SAP、Oracle ERP,让大模型直接操作业务数据。
dsh context7中的7,是指 DSH 协议定义的第七种上下文类型。DSH 最初只有text、file、image三种,随着生态发展,社区陆续贡献了audio(音频)、video(视频)、database(数据库连接)、api(REST API 描述)等。context7是一个代号,代表插件开发者开始定义领域专属上下文。例如,一个金融插件可能会定义stock-ticker上下文,包含股票代码、实时行情、K 线数据结构;一个医疗插件会定义medical-record上下文,包含 HL7 标准的患者信息。这种上下文专业化,是 DSH 插件走向垂直行业的关键一步。
而dsh归档管理插件,则揭示了 DSH 的另一个潜力方向:从“单次任务执行”走向“长期知识沉淀”。目前的 Skill 都是 stateless 的,执行完就结束。但一个真正的归档管理插件,需要维护一个本地 SQLite 数据库,记录每次插件执行的结果、用户反馈、版本迭代历史,并提供搜索、分类、导出功能。这已经超出了传统插件的范畴,更像是一个嵌入 DSH 的微型 SaaS 应用。
所以,当你看到这些热词时,不要只把它当作一个功能点,而要看到背后的技术演进脉络:从基础技能(Skill)→ 领域上下文(Context)→ 状态管理(State)→ 生态协同(Market)。你现在写的每一个插件,都是在为这个生态添砖加瓦。我自己的第一个插件dsh-markdown-mermaid,上线三个月后,已经有 17 个衍生版本,有人给它加了 Dark Mode 支持,有人把它集成进了 Obsidian 的同步流程。这种社区共创的力量,才是 DSH 插件开发最迷人的地方。