🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

笔记智联 kubulo/crisp-dsh

DeepSeek Harness
kubulo27 天前有提交已提供中文文档扫描:含敏感能力

让模型读写 Obsidian 笔记,侧栏直连对话

31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/8 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装;安装清单取自 dsh-plugin/package.json。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add kubulo/crisp-dsh
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · other
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 27 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/30) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装;安装清单取自 dsh-plugin/package.json

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-crip(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19 || >=24 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 22:15:15

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 31 处,展示前 29 条)
  • 读取本地文件
    dsh-plugin/lib/index.js:63
    entries = await readdir(dirAbs, { withFileTypes: true })
  • 读取本地文件
    dsh-plugin/lib/index.js:125
    const info = await stat(base).catch(() => undefined)
  • 读取本地文件
    dsh-plugin/lib/index.js:153
    const info = await stat(abs).catch(() => undefined)
  • 读取本地文件
    dsh-plugin/lib/index.js:157
    const body = await readFile(abs, 'utf8')
  • 读取本地文件
    dsh-plugin/lib/index.js:208
    body = await readFile(abs, 'utf8')
  • 读取本地文件
    dsh-plugin/lib/index.js:254
    const existing = await stat(abs).catch(() => undefined)
  • 写入本地文件
    dsh-plugin/lib/index.js:256
    await mkdir(dirname(abs), { recursive: true })
  • 写入本地文件
    dsh-plugin/lib/index.js:258
    await writeFile(abs, body, mode === 'append' && existing ? { flag: 'a' } : 'utf8')
  • 读取本地文件
    obsidian-plugin/composer-focus.dom.cjs:19
    const source = fs.readFileSync(path.join(__dirname, 'main.js'), 'utf8')
  • 读取本地文件
    obsidian-plugin/main.js:82
    if (!fs.existsSync(p)) continue
  • 读取本地文件
    obsidian-plugin/main.js:83
    const text = fs.readFileSync(p, 'utf8')
  • 发起网络请求
    obsidian-plugin/main.js:167
    const req = http.get({
  • 写入剪贴板
    obsidian-plugin/main.js:364
    await navigator.clipboard.writeText(payload)
  • 写入剪贴板
    obsidian-plugin/main.js:675
    await navigator.clipboard.writeText(link)
  • 读取本地文件
    obsidian-plugin/rail-toggle.dom.cjs:16
    const source = fs.readFileSync(path.join(__dirname, 'main.js'), 'utf8')
  • 读取本地文件
    obsidian-plugin/selfcheck.cjs:144
    const source = fs.readFileSync(path.join(__dirname, 'main.js'), 'utf8')
  • 读取本地文件
    obsidian-plugin/token-autodetect.test.cjs:35
    if (fs.existsSync(REAL_TMP_LOG)) {
  • 读取本地文件
    obsidian-plugin/token-autodetect.test.cjs:36
    tmpLogBackup = fs.readFileSync(REAL_TMP_LOG, 'utf8')
  • 删除本地文件
    obsidian-plugin/token-autodetect.test.cjs:37
    fs.rmSync(REAL_TMP_LOG)
  • 写入本地文件
    obsidian-plugin/token-autodetect.test.cjs:42
    if (tmpLogBackup !== null) fs.writeFileSync(REAL_TMP_LOG, tmpLogBackup)
  • 读取本地文件
    obsidian-plugin/token-autodetect.test.cjs:65
    const source = fs.readFileSync(file, 'utf8')
  • 写入本地文件
    obsidian-plugin/token-autodetect.test.cjs:82
    fs.mkdirSync(logDir, { recursive: true })
  • 写入本地文件
    obsidian-plugin/token-autodetect.test.cjs:86
    fs.writeFileSync(log, [
  • 写入本地文件
    obsidian-plugin/token-autodetect.test.cjs:96
    fs.appendFileSync(log, '\n[t3] 打开: http://127.0.0.1:3080/?token=THIRD_boot_token')
  • 写入本地文件
    obsidian-plugin/token-autodetect.test.cjs:100
    fs.writeFileSync(log, '[t4] 服务已在运行')
  • 删除本地文件
    obsidian-plugin/token-autodetect.test.cjs:104
    fs.rmSync(log)
  • 写入本地文件
    obsidian-plugin/token-autodetect.test.cjs:108
    fs.writeFileSync(log, '[t5] 打开: http://127.0.0.1:3080/?token=WITH_EXTRA&foo=bar')
  • 删除本地文件
    obsidian-plugin/token-autodetect.test.cjs:118
    fs.rmSync(log)
  • 删除本地文件
    obsidian-plugin/token-autodetect.test.cjs:121
    fs.rmSync(home, { recursive: true, force: true })
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 读写Obsidian笔记
  • 侧栏直连对话
  • 内嵌侧栏工作台

README

由 DeepSeek 最新模型翻译生成
Crisp DSH(DSH × Obsidian 双端插件) Crisp DSH 是一套自研双端插件体系,专为 DeepSeek Harness (DSH) 与 Obsidian 打造。它让大模型直接读取、搜索、改写本地 Obsidian Vault 笔记,同时在 Obsidian 侧边栏内无缝运行 DSH Web GUI,还支持一键把当前笔记传给模型。 📸 界面效果示意 (Preview) Crisp DSH 界面预览 图:在 Obsidian 右侧栏运行的 Crisp DSH 智灵体工作台,顶部配备「3080 · 就绪」图形化状态胶囊与一键折叠按钮。 🌟 核心特性 - 🛠 双端打通: - DSH 侧:提供 vault_list、vault_read、vault_search、vault_write 四个安全工具,让模型原生拥有知识库操作能力。 - Obsidian 侧:原生集成在右侧栏,无缝嵌入 DSH 会话界面。 - 🟢 椭圆状态胶囊:顶栏左侧实时显示状态胶囊(如 🟢 3080 · 就绪 / 🔴 3080 · 离线),5 秒心跳静默探针,自适应暗黑模式。 - 🗂 彻底折叠左侧栏:提供专属折叠按钮,一键彻底隐藏 DSH 左侧导航栏与图标竖条(Rail),对话主体全宽展开。
展开完整文档(README 剩余 1 节)
Crisp DSH(DSH × Obsidian 双端插件)

Crisp DSH 是一套自研双端插件体系,专为 DeepSeek Harness (DSH) 与 Obsidian 打造。它让大模型直接读取、搜索、改写本地 Obsidian Vault 笔记,同时在 Obsidian 侧边栏内无缝运行 DSH Web GUI,还支持一键把当前笔记传给模型。

📸 界面效果示意 (Preview)

Crisp DSH 界面预览

图:在 Obsidian 右侧栏运行的 Crisp DSH 智灵体工作台,顶部配备「3080 · 就绪」图形化状态胶囊与一键折叠按钮。

🌟 核心特性

- 🛠 双端打通:
- DSH 侧:提供 vault_list、vault_read、vault_search、vault_write 四个安全工具,让模型原生拥有知识库操作能力。
- Obsidian 侧:原生集成在右侧栏,无缝嵌入 DSH 会话界面。
- 🟢 椭圆状态胶囊:顶栏左侧实时显示状态胶囊(如 🟢 3080 · 就绪 / 🔴 3080 · 离线),5 秒心跳静默探针,自适应暗黑模式。
- 🗂 彻底折叠左侧栏:提供专属折叠按钮,一键彻底隐藏 DSH 左侧导航栏与图标竖条(Rail),对话主体全宽展开。
- 🔑 Token 自动捕获:免去繁琐的 Token 复制粘贴,插件自动检测当前进程凭证。
- 🔗 一键笔记联动:右键文件列表里的任意笔记选「添加文件到 DSH 对话」,或在笔记里划选一段后右键选「添加选中文字到 DSH 对话」——引用自动进剪贴板、侧栏跳到前台、光标落进输入框,按一次粘贴回车即发送。

📁 仓库结构

crisp-dsh/
├── obsidian-plugin/ # Obsidian 侧插件(安装至 .obsidian/plugins/dsh-crip/) │ ├── manifest.json │ ├── main.js │ ├── styles.css │ ├── selfcheck.cjs # 契约自检:注册项、设置、URL 拼装、发送链路 │ └── composer-focus.dom.cjs # DOM 自检:输入框定位(需 jsdom) ├── dsh-plugin/ # DSH 侧插件(安装至 ~/.dsh/plugins/dsh-crip/) │ ├── package.json │ ├── cordis.patch.yml │ ├── lib/ │ │ └── index.js │ └── test/ ├── scripts/ # macOS 自启动守护与后台保持脚本 │ ├── start-dsh-daemon.sh │ └── com.dsh.harness.web.plist ├── LICENSE └── README.md

🚀 极速安装指南

1. 安装 DSH 侧插件

1. 将 dsh-plugin/ 目录复制到本机的 ~/.dsh/plugins/dsh-crip/:
mkdir -p ~/.dsh/plugins
cp -r dsh-plugin ~/.dsh/plugins/dsh-crip

2. 编辑 ~/.dsh/plugins/dsh-crip/cordis.patch.yml,将 vault 路径改为你实际的 Obsidian Vault 绝对路径: config: vault: '/Users/yourname/Documents/MyVault'

3. 在终端注册该插件到 DSH 的 web profile:
dsh plugin --profile web add -w file:$HOME/.dsh/plugins/dsh-crip

4. 验证是否安装成功:
dsh --profile web --dump-config | grep -n -A3 "== dsh-crip"

2. 安装 Obsidian 侧插件

1. 将 obsidian-plugin/ 目录复制到你的 Obsidian Vault 插件目录:
mkdir -p /path/to/your/vault/.obsidian/plugins/dsh-crip
cp -r obsidian-plugin/* /path/to/your/vault/.obsidian/plugins/dsh-crip/

2. 打开 Obsidian:
- 进入 设置 → 第三方插件。
- 点击右上角 重新加载已安装插件。
- 找到 Crisp DSH 并打开开关。
3. 点击左侧活动栏的 ✨ 图标,即可在右侧栏唤出 DSH 界面!

3. macOS 后台静默自启动(可选,推荐)

为了避免每次电脑重启都要手动去终端敲命令拉起 DSH,推荐配置 LaunchAgent:

1. 赋予启动脚本权限并复制:
chmod +x scripts/start-dsh-daemon.sh
cp scripts/start-dsh-daemon.sh "$HOME/Library/Application Support/"

2. 修改 scripts/com.dsh.harness.web.plist 中的用户名路径,复制并加载:
cp scripts/com.dsh.harness.web.plist "$HOME/Library/LaunchAgents/"
launchctl load "$HOME/Library/LaunchAgents/com.dsh.harness.web.plist"

🎮 使用说明

1. 状态监控:顶栏左侧胶囊显示 3080 · 就绪 即代表已成功连接后台服务。
2. 彻底全宽:点击顶栏「刷新」左侧的面板图标,彻底隐藏 DSH 左侧导航栏。
3. 笔记传递——三个入口,都是一次粘贴即送达:

| 入口 | 操作 | 送过去的内容 |
| 文件列表右键 | 在左侧文件列表里右键任意笔记 →「添加文件到 DSH 对话」 | [[双链]] + vault 路径 |
| 笔记内划选右键 | 选中一段文字后右键 →「添加选中文字到 DSH 对话」 | 双链 + 行号范围 + 引用块化的选中文字 |
| 命令面板 | Crisp DSH: 把当前笔记交给 DSH / 把选中文字交给 DSH | 同上;可自行绑快捷键 |

选中内容超过 4000 字会被截断并注明——此时上方的路径与行号仍在,模型可以自己读全文。

为什么同时给双链和裸路径? [[双链]] 是 Obsidian 里改名不失效的身份,但 DSH 是独立进程、解析不了它;所以旁边附上 vault 相对路径,那才是 vault_read 认的。两者都给,人看双链、模型用路径。

为什么不能全自动发送、要按一次粘贴?
侧栏加载的是 DSH 编译后的前端,其输入框是 contenteditable 富文本,且状态由 React 托管。用脚本直接写入 DOM 文本不会同步到 React 状态,回车发出去的是空消息。因此这里采取半自动:插件把双链放进剪贴板并聚焦输入框,由一次真实粘贴完成注入——语义正确、且不依赖任何会随版本变化的内部结构。

✅ 自检

cd obsidian-plugin
node selfcheck.cjs # 契约层:注册项 / 菜单 / 选中与文件投递 / 令牌不落盘
node token-autodetect.test.cjs # 令牌嗅探:取最新、降级不崩
npm i jsdom
NODE_PATH=./node_modules node composer-focus.dom.cjs # 输入框定位
NODE_PATH=./node_modules node rail-toggle.dom.cjs # 左侧栏折叠
cd ../dsh-plugin && node test/selfcheck.mjs # DSH 侧:四个工具 + 越界拒绝

为什么脚本里一个类名都不写? DSH 前端用 CSS Module 生成哈希类名(形如 pI_x6G_*),每次构建都变。侧栏折叠功能最初正是硬编码了三个这样的类名——它们在当前版本里已全部消失,按钮因此静默失效,且没人发现。现在两处 DOM 脚本都按行为与几何定位:输入框看「与发送按钮同属一个容器」,左栏看「贴左边缘、通高的最宽面板」。rail-toggle.dom.cjs 会用 1px 分隔条、矮页眉、全宽容器、内缩面板四种干扰来验证这一点。

composer-focus.dom.cjs 会喂给脚本三种干扰场景——页面别处的搜索框、隐藏的输入框、被禁用的输入框——确认它选中「与发送按钮同属一个容器的编辑框」,而不是页面上第一个文本框。DSH 前端用的是 CSS Module 哈希类名,所以脚本按行为定位而非硬编码类名,版本升级不会失效。

💬 技术支持与交流 (Support & Contact)

如果在安装、配置或使用过程中遇到任何疑问或需要协助,欢迎添加作者微信咨询:

- 微信号:kubulo
- 微信二维码:

📄 License

MIT License © 2026 kubulo
预览分享卡片长什么样 ↓kubulo/crisp-dsh
分享 · DeepSeek Harness Hub
kubulo/crisp-dsh

让模型读写 Obsidian 笔记,侧栏直连对话

这是你的仓库?认领条目

回到顶部