deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:terwer/dsh-siyuan-note
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
把 思源笔记(SiYuan Note) 作为 DSH(DeepSeek Harness)的知识库集成,包含两个组件:
siyuan-note 插件(DSH 静态插件):侧边栏浏览 / 搜索 / 渲染预览,一键启停内核服务。siyuan-note skill(Agent skill):让 Agent 通过思源官方 CLI 直连工作空间,做搜索、读写、快照、同步等操作。二者都基于思源官方原生内核 CLI(SiYuan-Kernel),不依赖任何第三方库。详见下文各章节。
把思源笔记(SiYuan Note)作为 DSH 的核心知识库,包含两个组件,各司其职:
| 组件 | 形态 | 作用 | 触发方式 |
|---|---|---|---|
| ① siyuan-note 插件 | DSH 静态插件 | 主界面侧边栏「思源笔记」tab:浏览/搜索/渲染预览,一键启停 serve | 每次 DSH 启动自动加载 |
| ② siyuan-note skill | Agent skill(SKILL.md) | 让 Agent 通过官方 CLI 直连工作空间,做搜索/读写/快照/同步等操作 | Agent 按需调用 |
SiYuan-Kernel)集成,不用任何第三方库。DSH集成思源笔记/
├── README.md ← 本文件(复原指南)
├── config/ ← ① 配置
│ ├── README.md ← 配置说明 + settings 白名单 patch 步骤
│ └── profile-package.json ← DSH profile 主 package.json(声明依赖 + bundles)
├── plugin/ ← ② 插件(完整、最新、已验证)
│ └── siyuan-note/
│ ├── package.json ← 插件 manifest(含 exports "./package.json" 关键项)
│ ├── cordis.patch.yml ← host 侧 cordis patch(插入插件 id)
│ └── lib/
│ ├── index.js ← host half:serve 启停 / /siyuan 路由 / settings 注册
│ └── client.js ← client half:侧边栏 tab + 配置表单
└── skill/ ← ③ skill(Agent 能力)
└── siyuan-note/
└── SKILL.md ← skill 定义(frontmatter + 用法),完整内容见第十章
换系统时,只有下面 4 处「系统/用户特定」路径需要改,其余代码通用。
| 项 | 位置 | macOS | Windows | Linux |
|---|---|---|---|---|
| ① 思源内核 CLI | index.js 顶部 const SY = ... |
/usr/local/bin/siyuan(或 /Applications/SiYuan.app/Contents/Resources/kernel/SiYuan-Kernel) |
C:\Program Files\SiYuan\resources\kernel\SiYuan-Kernel.exe |
/opt/siyuan/resources/kernel/SiYuan-Kernel |
| ② PID 文件 | index.js 顶部 const PID_FILE = ... |
/tmp/siyuan-note.pid |
C:\Users\<你>\AppData\Local\Temp\siyuan-note.pid |
/tmp/siyuan-note.pid |
| ③ 默认工作空间 | index.js 顶部 const DEFAULT_WORKSPACE = ... |
你的 workspace 绝对路径 | 你的 workspace 绝对路径 | 你的 workspace 绝对路径 |
| ④ DSH profile 目录 | 复原时插件拷贝目标 | ~/.dsh/profiles/web/ |
%USERPROFILE%\.dsh\profiles\web\ |
~/.dsh/profiles/web/ |
说明:③ 也可以通过 DSH 设置页(设置 → 插件 → 思源笔记 → 工作空间)直接改,无需动代码。①② 是代码内常量,换系统必须改。
| 信息 | 是否敏感 | 位置 | 处理方式 |
|---|---|---|---|
| 思源 API token | ⚠️ 敏感 | 每个 workspace 的 conf/conf.json → api.token |
插件自动读取,绝不硬编码、绝不写进本包。换机器后各空间 token 各自不同,无需也不应手动配置 |
| workspace 绝对路径 | ⚠️ 用户特定 | index.js 的 DEFAULT_WORKSPACE + settings |
含当前用户名,换机器必须改;建议直接走设置页配置 |
| 思源内核 CLI 路径 | 系统特定(非敏感) | index.js 的 SY |
换系统改 |
| PID 文件路径 | 系统特定(非敏感) | index.js 的 PID_FILE |
换系统改 |
为什么 token 不能写死:思源每个工作空间有独立 token。写死成某个空间的 token 后,切换空间会 Auth failed,只读模式下笔记本被全部筛掉,表现为「数据全没了」(实际数据完好)。因此 token 一律从当前 workspace 的 conf/conf.json 自动读取,切换空间自动跟随,本仓库不包含任何 token。
DSH 静态插件 = 本地 npm 包 + 三处声明,DSH 启动时自动加载进 bundle:
cordis.patch.yml(host 侧 patch):向 host 插件组插入插件 id。
- insert:
- id: siyuan-note
name: 'siyuan-note'
package.json 的 dsh 字段:
{
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" },
"client": { "platform": "web", "inject": [] }
}
}
profile 主 package.json 声明依赖 + 加入 bundles:
{
"dependencies": { "siyuan-note": "file:./siyuan-note" },
"dsh": { "profile": { "bundles": [ "...", "siyuan-note" ] } }
}
exports 必须含 "./package.json": "./package.json":host 通过 require.resolve(pkg + "/package.json") 扫描 client 入口,缺这一行 client 不会进 bundle。file: 依赖是「复制」不是软链:改源码后必须 rm -rf node_modules/siyuan-note && pnpm install 才同步。ctx.webServer.register({ kind: "prefix", path: "/siyuan", handler })。pathname.startsWith(prefix + "/"))。fetch(location.origin + "/siyuan/<action>", { POST }) 调 host。window.__ModuleLoader__.load({ id, factory }) 注册,factory 内 require("react") 拿 React,React.createElement 写 UI(无 JSX/构建转换)。DSH 当前版本尚未开放插件自定义配置暴露到设置页(源码注释明确标注 "deferred work")。要让本插件的「工作空间/只读」出现在 设置 → 插件 → 思源笔记,需改一处 DSH 核心包:
<DSH安装>/node_modules/@deepseek-ai/dsh-host-apiproxy/lib/index.jsconst WEB_SETTINGS_NAMESPACES = [...] 白名单数组"siyuan-note"const WEB_SETTINGS_NAMESPACES = [
"agent-loop", "shell", "locale", "permission",
"ui-conversation", "ui-theme", "web-search-deepseek",
"siyuan-note" // ← 新增
];
⚠️ DSH 升级会覆盖此文件,升级后需重新加这一行。这是 DSH 当前的已知限制,非本插件缺陷。 找不到 DSH 安装路径时:
which dsh→ 其软链指向<DSH>/lib/bin.js,向上两级即<DSH>包目录。
dsh web 用默认端口 3080)。把本包 plugin/siyuan-note/ 整个拷贝到 DSH profile 插件目录:
# macOS / Linux
mkdir -p ~/.dsh/profiles/web
cp -R siyuan-note ~/.dsh/profiles/web/
# Windows(PowerShell)
mkdir $env:USERPROFILE\.dsh\profiles\web
Copy-Item -Recurse siyuan-note $env:USERPROFILE\.dsh\profiles\web\
编辑 ~/.dsh/profiles/web/siyuan-note/lib/index.js 顶部:
const SY = ... → 本系统的思源内核 CLI 路径(见第三节表)const PID_FILE = ... → 本系统临时目录(Windows 不能用 /tmp)const DEFAULT_WORKSPACE = ... → 你的 workspace 绝对路径(或之后在设置页改)把 config/profile-package.json 的内容合并进 ~/.dsh/profiles/web/package.json(即加 siyuan-note: file:./siyuan-note 到 dependencies,siyuan-note 到 bundles)。
cd ~/.dsh/profiles/web
rm -rf node_modules/siyuan-note && pnpm install # 每次改源码后都要这样重装
给 dsh-host-apiproxy/lib/index.js 的 WEB_SETTINGS_NAMESPACES 加 "siyuan-note"。
dsh web # cwd 用 ~,端口默认 3080
重启后浏览器打开 http://127.0.0.1:3080 验收(见第七节)。
| 功能 | 说明 | 验收 |
|---|---|---|
| 侧边栏 tab 常驻 | 会话切换自动打开,无需拖动 | 每个会话侧边栏都有「📔思源笔记」tab |
| 一键启停 serve | 真启停后台思源内核进程 | 点「开启」变绿「已启动」,点「关闭」停止 |
| 笔记本→文档→内容 | 逐层递归展开 | 有子文档的显示 📁 可展开,叶子 📄 点击看内容 |
| 全文搜索 | 搜正文 | 输入关键词回车,结果可点击跳转文档 |
| 搜索重置 | 清空搜索结果 | 结果页有「✕ 清空」按钮 |
| 文档渲染 | 官方 lute 引擎渲染 kramdown→HTML | 标题/列表/代码块/表格正常排版 |
| 资源文件显示 | 图片等改写为思源绝对地址 | 文档内图片正常显示(非 404) |
| 只读模式 | 只读保护 workspace | 默认 true,public 真实空间必须保持 true |
| token 自动读取 | 切换 workspace 自动跟随 token | 切空间后数据正常,不 Auth failed |
harness is not defined:动态 cordis 包才用 harness.handle,静态插件用 ctx.webServer.register。冲突**:dsh 扁平 RPC 网关占用/api,插件必须用别的前缀(本插件用/siyuan`)。/siyuan/ 匹配不到,必须 /siyuan。package.json 的 exports 缺 "./package.json" 时 require.resolve 失败。file: 依赖是复制,改码后必须 rm -rf node_modules/siyuan-note && pnpm install。assets/...,浏览器用 DSH origin 解析会 404,必须改写为思源内核绝对地址 http://127.0.0.1:<port>/assets/...。pgrep -f "dsh web" 匹配不可靠,用 lsof -iTCP:3080 拿 PID 最稳。siyuan --help # 查看全部子命令
siyuan serve -w <workspace> --port 6806 --readonly true # 只读启动内核
siyuan serve -w <workspace> --port 6806 # 可写启动
核心 API(供扩展参考,全部 POST,header Authorization: Token <api.token>):
notebook/lsNotebooks — 笔记本列表filetree/listDocsByPath {notebook, path} — 文档树search/fullTextSearchBlock {query} — 全文搜索block/getBlockKramdown {id} — 取 kmd(.sy 源码)lute/md2html {markdown, mode} — 官方渲染 kramdown→HTMLDSH 的 skill = 一个目录 + 一个 SKILL.md,DSH 启动时自动扫描注册,Agent 按需调用。它让 Agent 能通过官方 CLI 直连工作空间,做插件 UI 做不到的事:写笔记、建快照、拉推同步、SQL 查询等。
建目录(DSH 约定位置):
# macOS / Linux
mkdir -p ~/.dsh/skills/siyuan-note
# Windows(PowerShell)
mkdir $env:USERPROFILE\.dsh\skills\siyuan-note
放 SKILL.md:把本包 skill/siyuan-note/SKILL.md 复制到上述目录。
SKILL.md,目录名即 skill 名(siyuan-note)。重启 DSH:DSH 启动时扫描 ~/.dsh/skills/*/SKILL.md,读取 YAML frontmatter 的 name + description 完成注册。重启后 Agent 即可按 description 触发该 skill。
---
name: siyuan-note
description: Use when the user wants to search, read, create, or organize notes in SiYuan (思源笔记) as a knowledge base through the official native `siyuan` kernel CLI. ...
---
name:skill 唯一标识(= 目录名,小写 kebab-case)。description:触发条件,Agent 据此判断何时调用本 skill,务必写清楚"何时用、干什么"。本包已附带 skill/siyuan-note/SKILL.md 全文(145 行,即第 10.2 步要复制的文件),核心要点如下:
siyuan;每个命令必须显式 -w <workspace>;给机器解析一律 -f json;写操作先 --dry-run。test(测试,可放心读写)dev(开发,写入谨慎)public(真实数据,默认只读,写入必须先征得用户同意)sync pull → sync push)";破坏性命令先 --dry-run;大改前先 repo create 建快照;CLI 无能力直接报告、禁止蛮干改数据库/配置文件。attr/bookmark/database/template/file/asset/sync/inbox/history/repo/serve/workspace 等。~/.config/siyuan/;块 ID 形如 20240110144035-xxn8zfh;内部链接 [文本](siyuan://blocks/<id>);勿与桌面端同时写同一工作空间;不确定参数先 siyuan <cmd> --help。| 插件(siyuan-note) | skill(siyuan-note) | |
|---|---|---|
| 载体 | ~/.dsh/profiles/web/siyuan-note/ |
~/.dsh/skills/siyuan-note/SKILL.md |
| 用户 | 人(点侧边栏 UI) | Agent(被 description 触发) |
| 能力 | 浏览/搜索/预览/启停 serve(只读) | 读写/快照/同步/SQL 等(可写,受安全铁律约束) |
| 数据通道 | HTTP serve + 思源 API | CLI 直连工作空间 |
| 是否需要 serve | 是 | 否 |
二者同名
siyuan-note但互不依赖、互不冲突:一个在profiles下、一个在skills下,DSH 分别加载。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。