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

Obsidian 笔记桥 gxpppp/dsh-obsidian

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

让 agent 直接读写、检索并编辑你的 Obsidian 笔记库

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

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

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

状态速览

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

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

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

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

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

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 06:03:51

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

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 82 处,展示前 70 条)
  • 读取本地文件
    scripts/prepare.mjs:20
    const stat = statSync(target)
  • 读取本地文件
    scripts/prepare.mjs:23
    for (const entry of readdirSync(target, { withFileTypes: true })) {
  • 读取本地文件
    scripts/prepare.mjs:29
    const shouldBuild = outputs.some((output) => !existsSync(output))
  • 读取本地文件
    scripts/prepare.mjs:30
    || Math.max(...inputs.map(newestMtime)) > Math.min(...outputs.map((output) => statSync(output).mtimeMs))
  • 执行外部命令来自配置/变量
    scripts/prepare.mjs:39
    execFileSync(process.execPath, [npmExecPath, 'run', 'build'], { cwd: root, stdio: 'inherit' })
  • 执行外部命令来自配置/变量
    scripts/prepare.mjs:42
    execFileSync(npm, ['run', 'build'], { cwd: root, stdio: 'inherit' })
  • 删除本地文件递归
    companion/build.mjs:12
    rmSync(join(root, 'companion', 'dist'), { recursive: true, force: true })
  • 写入本地文件
    companion/build.mjs:13
    mkdirSync(join(root, 'companion', 'dist'), { recursive: true })
  • 执行外部命令来自配置/变量
    companion/build.mjs:15
    execFileSync(esbuildExe, [
  • 读取本地文件
    companion/src/main.ts:99
    if (process.platform !== 'win32' && existsSync(this.endpoint)) await removeStaleUnixSocket(this.endpoint)
  • 读取本地文件
    companion/src/main.ts:121
    if (process.platform !== 'win32' && this.endpoint && existsSync(this.endpoint)) {
  • 删除本地文件
    companion/src/main.ts:122
    try { unlinkSync(this.endpoint) } catch { }
  • 读取本地文件
    companion/src/main.ts:417
    if (existsSync(endpoint)) unlinkSync(endpoint)
  • 删除本地文件
    companion/src/main.ts:417
    if (existsSync(endpoint)) unlinkSync(endpoint)
  • 删除本地文件递归
    scripts/build.mjs:19
    rmSync(join(root, 'lib'), { recursive: true, force: true })
  • 写入本地文件
    scripts/build.mjs:20
    mkdirSync(join(root, 'lib'), { recursive: true })
  • 执行外部命令来自配置/变量
    scripts/build.mjs:23
    execFileSync(esbuildExe, args, { cwd: root, stdio: 'inherit' })
  • 执行外部命令来自配置/变量
    scripts/build.mjs:39
    execFileSync(process.execPath, [join(root, 'companion', 'build.mjs')], { cwd: root, stdio: 'inherit' })
  • 执行外部命令来自配置/变量
    scripts/build.mjs:42
    execFileSync(process.execPath, [join(root, 'node_modules', 'typescript', 'bin', 'tsc'), '-p', 'tsconfig.build.json'], {
  • 读取本地文件
    scripts/install-companion.mjs:24
    if (!existsSync(bundle) || !existsSync(manifest)) {
  • 写入本地文件
    scripts/install-companion.mjs:30
    mkdirSync(target, { recursive: true })
  • 写入本地文件
    scripts/install-companion.mjs:31
    copyFileSync(bundle, join(target, 'main.js'))
  • 写入本地文件
    scripts/install-companion.mjs:32
    copyFileSync(manifest, join(target, 'manifest.json'))
  • 读取本地文件
    scripts/install-companion.mjs:37
    if (existsSync(listPath)) {
  • 读取本地文件
    scripts/install-companion.mjs:39
    list = JSON.parse(readFileSync(listPath, 'utf8'))
  • 写入本地文件
    scripts/install-companion.mjs:47
    writeFileSync(listPath, JSON.stringify(list, null, 2))
  • 写入本地文件
    scripts/smoke-dsh-profile.mjs:17
    mkdirSync(packageOutput, { recursive: true })
  • 读取本地文件
    scripts/smoke-dsh-profile.mjs:20
    const tarballs = readdirSync(packageOutput).filter((name) => name.endsWith('.tgz'))
  • 执行外部命令来自配置/变量
    scripts/smoke-dsh-profile.mjs:31
    execFileSync(process.execPath, [bin, 'plugin', '--profile', 'headless', 'add', join(packageOutput, tarballs[0])], {
  • 执行外部命令来自配置/变量
    scripts/smoke-dsh-profile.mjs:36
    const dump = execFileSync(process.execPath, [bin, '--profile', 'headless', '--dump-config'], {
  • 删除本地文件递归
    scripts/smoke-dsh-profile.mjs:46
    rmSync(temporaryRoot, { recursive: true, force: true })
  • 执行外部命令来自配置/变量
    scripts/smoke-dsh-profile.mjs:52
    execFileSync(process.execPath, [npmExecPath, ...args], { cwd, stdio: 'inherit' })
  • 读取本地文件
    scripts/smoke-dsh-profile.mjs:56
    if (existsSync(npmCli)) {
  • 执行外部命令来自配置/变量
    scripts/smoke-dsh-profile.mjs:57
    execFileSync(process.execPath, [npmCli, ...args], { cwd, stdio: 'inherit' })
  • 执行外部命令固定命令
    scripts/smoke-dsh-profile.mjs:60
    execFileSync('npm', args, { cwd, stdio: 'inherit' })
  • 删除本地文件递归
    scripts/test.mjs:8
    rmSync(out, { recursive: true, force: true })
  • 执行外部命令来自配置/变量
    scripts/test.mjs:10
    execFileSync(process.execPath, [
  • 读取本地文件
    scripts/test.mjs:17
    const tests = readdirSync(testDir)
  • 执行外部命令来自配置/变量
    scripts/test.mjs:22
    execFileSync(process.execPath, [
  • 读取本地文件
    scripts/verify-release.mjs:8
    const readJson = (relative) => JSON.parse(readFileSync(join(root, relative), 'utf8'))
  • 读取本地文件
    scripts/verify-release.mjs:12
    const versionSource = readFileSync(join(root, 'src', 'version.ts'), 'utf8')
  • 读取本地文件
    scripts/verify-release.mjs:13
    const companionSource = readFileSync(join(root, 'companion', 'src', 'main.ts'), 'utf8')
  • 读取本地文件
    scripts/verify-release.mjs:14
    const smokeSource = readFileSync(join(root, 'scripts', 'smoke-companion.mjs'), 'utf8')
  • 读取本地文件
    scripts/verify-release.mjs:15
    const protocolSource = readFileSync(join(root, 'src', 'bridge', 'protocol.ts'), 'utf8')
  • 读取本地文件
    scripts/verify-release.mjs:84
    assert.equal(existsSync(join(root, relative)), true, `required release file is missing: ${relative}`)
  • 执行外部命令来自配置/变量
    scripts/verify-release.mjs:113
    return execFileSync(process.execPath, [npmExecPath, ...args], {
  • 执行外部命令来自配置/变量
    scripts/verify-release.mjs:121
    return execFileSync(process.execPath, [npmCli, ...args], {
  • 执行外部命令固定命令
    scripts/verify-release.mjs:127
    return execFileSync('npm', args, {
  • 读取本地文件
    src/bridge/bridge.ts:220
    const raw = await readFile(join(vaultPath, '.obsidian', 'plugins', 'dsh-obsidian-bridge', 'data.json'), 'utf8')
  • 读取本地文件
    src/settings/schema.ts:74
    if (!existsSync(config.vaultPath) || !statSync(config.vaultPath).isDirectory()) {
  • 读取本地文件
    src/settings/schema.ts:74
    if (!existsSync(config.vaultPath) || !statSync(config.vaultPath).isDirectory()) {
  • 读取本地文件
    src/vault/detect.ts:31
    if (!existsSync(candidate)) continue
  • 读取本地文件
    src/vault/detect.ts:33
    const raw = JSON.parse(readFileSync(candidate, 'utf8')) as { vaults?: Record<string, { path?: string }> }
  • 读取本地文件
    src/vault/detect.ts:36
    if (entry.path && existsSync(entry.path)) vaults.push({ name, path: entry.path })
  • 写入本地文件
    src/vault/vaultFs.ts:129
    await fs.mkdir(safeParent, { recursive: true })
  • 读取本地文件
    src/vault/vaultFs.ts:135
    const st = await fs.stat(abs)
  • 读取本地文件
    src/vault/vaultFs.ts:137
    const data = await fs.readFile(abs)
  • 读取本地文件
    src/vault/vaultFs.ts:148
    const st = await fs.stat(abs)
  • 读取本地文件
    src/vault/vaultFs.ts:150
    return this.revision(await fs.readFile(abs))
  • 读取本地文件
    src/vault/vaultFs.ts:165
    const st = await fs.stat(abs)
  • 读取本地文件
    src/vault/vaultFs.ts:177
    try { await fs.access(abs); return true } catch (error) {
  • 写入本地文件
    src/vault/vaultFs.ts:247
    await fs.rename(temp, abs)
  • 删除本地文件
    src/vault/vaultFs.ts:249
    await fs.rm(temp, { force: true }).catch(() => undefined)
  • 写入本地文件
    src/vault/vaultFs.ts:269
    await fs.rename(temp, abs)
  • 删除本地文件
    src/vault/vaultFs.ts:270
    } finally { await fs.rm(temp, { force: true }).catch(() => undefined) }
  • 写入本地文件
    src/vault/vaultFs.ts:303
    await fs.rename(temp, abs)
  • 删除本地文件
    src/vault/vaultFs.ts:304
    } finally { await fs.rm(temp, { force: true }).catch(() => undefined) }
  • 写入本地文件
    src/vault/vaultFs.ts:326
    await fs.mkdir(abs, { recursive: true })
  • 写入本地文件
    src/vault/vaultFs.ts:344
    else if (destination.exists) await fs.copyFile(srcAbs, dstAbs)
  • 删除本地文件
    src/vault/vaultFs.ts:380
    await fs.rm(abs, { recursive: true, force: true })
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-attachment@deepseek-ai/dsh-llm@deepseek-ai/dsh-settings@deepseek-ai/dsh-skill@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/dsh-util-values@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 读写Obsidian笔记
  • 检索笔记内容
  • 编辑笔记

README

由 DeepSeek 最新模型翻译生成
dsh-obsidian dsh-obsidian 是 DeepSeek Harness(DSH)的仅主机端 Obsidian 集成。主分支精确面向 DSH 0.1.2-alpha.2。更早的预发布版本线作为不可变的旧版分支和标签保留。 该插件暴露 25 个 obsidian_* 工具。工具、指引和审批策略仅注入到消息匹配所配置触发词汇的 agent;无关的 agent 不会收到这些 schema。 当前发布线:dsh-obsidian-v0.4.0,面向 DSH dsh-v0.1.2-alpha.2 构建。DSH alpha.2 以 npm dist-tag alpha 发布;latest 和 next 仍解析为 0.1.1-rc.2。请使用精确版本以实现可复现的安装。
展开完整文档(README 剩余 1 节)
dsh-obsidian

dsh-obsidian 是 DeepSeek Harness(DSH)的仅主机端 Obsidian 集成。主分支精确面向 DSH 0.1.2-alpha.2。更早的预发布版本线作为不可变的旧版分支和标签保留。

该插件暴露 25 个 obsidian_* 工具。工具、指引和审批策略仅注入到消息匹配所配置触发词汇的 agent;无关的 agent 不会收到这些 schema。

当前发布线:dsh-obsidian-v0.4.0,面向 DSH dsh-v0.1.2-alpha.2 构建。DSH alpha.2 以 npm dist-tag alpha 发布;latest 和 next 仍解析为 0.1.1-rc.2。请使用精确版本以实现可复现的安装。

能力

Vault 工具,无需 Obsidian 即可使用:

obsidian_status · obsidian_list · obsidian_stat · obsidian_read · obsidian_write · obsidian_edit · obsidian_append · obsidian_mkdir · obsidian_copy · obsidian_move · obsidian_delete

文件系统层使用 vault 相对路径、规范化 realpath 包含检查、受保护的点目录、原子写入、串行化追加、SHA-256 修订、乐观 if_match 冲突、二进制大小限制、取消操作,以及默认的内部回收站。

知识与 Obsidian 语义工具:

obsidian_search · obsidian_metadata · obsidian_frontmatter_update · obsidian_link_resolve · obsidian_links · obsidian_link_insert

搜索有界且分页。当可用时,元数据、frontmatter 处理、反向链接、未解析链接和 Obsidian 生成的链接使用配套插件的原生 API。

附件:

obsidian_attachment_add · obsidian_attachment_read

附件接受 alpha.2 持久化图像引用或 vault 相对源路径。主机绝对路径、URL、点目录、无界二进制负载和原始二进制模型输出均被拒绝。

编辑器与命令工具,需要配套插件:

obsidian_active · obsidian_inline_edit · obsidian_open · obsidian_commands_list · obsidian_command · obsidian_notice

内联编辑携带活动路径、文档修订、选区偏移和预期文本。并发用户编辑或笔记切换会返回冲突,而不是覆盖内容。

安装

首先显式安装 DSH 0.1.2-alpha.2。不要依赖 npm 的 latest 或 next 来获取此版本线:

npm install --global @deepseek-ai/dsh@0.1.2-alpha.2 pnpm@11.7.0

将主机包安装到运行 agent 的 profile 中:

首选:附加到 GitHub Release 的预构建 tarball
dsh plugin --profile add "https://github.com/gxpppp/dsh-obsidian/releases/download/dsh-obsidian-v0.4.0/deepseek-ai-dsh-client-ui-obsidian-0.4.0.tgz"

精确 GitHub 标签;需要具备构建能力的 npm 环境
dsh plugin --profile add "github:gxpppp/dsh-obsidian#dsh-obsidian-v0.4.0"
npm registry,由已获 @deepseek-ai 授权的账户发布后
dsh plugin --profile add @deepseek-ai/dsh-client-ui-obsidian@0.4.0

本地开发检出
dsh plugin --profile add "link:E:\\path\\to\\dsh-obsidian"

将 替换为你实际启动的 profile,例如 web 或 headless。Alpha.2 profile 会记录 dsh.profile.patchReload:web 使用 live;随附的 headless、acp、sdk 和 sdk-minimal profile 使用 startup。在添加或更改插件后,重启仅支持 startup 的 profile。

在不启动的情况下验证组合后的树: bash
dsh --profile --dump-config

输出中必须包含 ui-obsidian 行。

宿主包和 Obsidian 配套插件是独立的产物。从检出目录或解包后的宿主 tarball 安装配套插件: bash
node scripts/install-companion.mjs --vault "C:\\path\\to\\vault"

GitHub Release 中附有一个独立的 dsh-obsidian-bridge-0.4.0.zip。仅将 main.js 和 manifest.json 解压到 /.obsidian/plugins/dsh-obsidian-bridge/,启用该插件,然后重新加载 Obsidian。安装前请对照 SHA256SUMS 验证哈希值。

配套插件将其随机 token 存储在本地插件的 data.json 中。仅当 vaultPath 解析为同一规范 vault 时,宿主才会自动读取它。宿主与配套插件的主/次版本必须匹配;IPC 协议保持为版本 1。

配置

当可选的 DSH 设置提供程序被挂载时,obsidian 设置命名空间会实时生效: yaml obsidian: vaultPath: 'C:\\path\\to\\vault' mode: auto # auto | fs | companion companionEndpoint: '' # optional named-pipe/socket override
protectedPaths: [.obsidian, .trash, .git, .claudian]
maxTextBytes: 5242880
attachmentFolder: Attachments
maxAttachmentBytes: 26214400
approvalMode: dangerous # none | dangerous | writes | all
commandPolicy: approval # deny | allowlist | approval
commandAllowlist: []
announceToAgent: true
autoActivate: true
triggerKeywords: [obsidian, vault, 笔记, 日记, 知识库, 当前笔记, 选中文本]
enabled: true

Alpha.2 设置集成使用 ctx.inject(['settings']) 和 settings.installSection(...);在没有提供程序的情况下,插件会继续使用其 profile 条目配置。机密字段在脱敏的设置界面上保持只写。

开发

要求:Node.js ^22.19.0 || >=24.0.0(不支持 Node 23)、npm >=11、TypeScript 5.7、DSH 0.1.2-alpha.2、Cordis 4.0.2 以及 Obsidian 桌面版。
bash
npm install --ignore-scripts --registry=https://registry.npmjs.org/
npm run typecheck
npm run check:companion
npm test
npm run build
npm run verify:release
npm run smoke:dsh-profile
npm run install:companion -- --vault "C:\\path\\to\\vault"
npm run smoke:companion -- --vault "C:\\path\\to\\vault"

该套件包含 43 项测试,涵盖激活、alpha.2 附件契约、IPC、编辑器上下文、Vault 安全、修订、大小限制、取消以及路径规范化。CI 在 Node 22.19 和 24 上运行静态/构建/打包门禁;仅当两个任务均通过后,才会构建发布资产。

架构与 alpha.2 变更

- src/index.ts:可选的 alpha.2 设置服务接线、运行时生命周期、技能外观以及按代理激活。
- src/activation.ts:触发器匹配、25 工具作用域注入、审批策略以及可逆释放器。
- src/vault/:规范路径边界与持久化 VaultFs。
- src/bridge/:经过身份验证的 JSON Lines IPC、版本行强制以及 vault 身份验证。
- companion/:仅限桌面的 Obsidian 插件,使用 Windows 命名管道或 Unix 套接字。
- src/tools/:Vault、知识、附件、链接、编辑器以及命令定义。

Alpha.2 保留了 execute(args, exec)、exec.signal、作用域 agent.ctx、tools/pre-execute、skills.register 和 systemPrompt.section。它将设置安装移至 ctx.settings,将 JsonValue 移至 @deepseek-ai/dsh-util-values,将工具呈现 code 模式重命名为 ptc,并移除 API Proxy。此插件既不使用呈现模式名称,也不使用 API Proxy,因此这些变更无需兼容垫片。

参见 ARCHITECTURE.md、MIGRATION.md、SECURITY.md 和 CHANGELOG.md。

兼容性

| dsh-obsidian | DSH 宿主 | Companion | Obsidian | 状态 |
| 0.4.x / dsh-obsidian-v0.4.0 | 0.1.2-alpha.2 | 0.4.x | 桌面版 >=1.4.0 | 支持 |
| 0.3.x / dsh-obsidian-v0.3.1 | 0.1.0-rc.8 | 0.3.x | 桌面版 >=1.4.0 | legacy/dsh-rc8 |
| 0.2.x / dsh-obsidian-v0.2.0 | 0.1.0-rc.7 | 0.2.x | 桌面版 >=1.4.0 | legacy/dsh-rc7 |
| 0.1.x / v0.1.0 | rc.6 系列 | 0.1.x | 桌面版 >=1.4.0 | legacy/dsh-rc6 |
| 任何其他跨系列组合 | 不支持 | 不支持 | 任意 | 不支持 |

DSH alpha.2 操作警告

- 可选的 SQLite 会话持久化使用 schema 20。它会拒绝所有其他 schema,并且不附带迁移。请备份 DSH 主目录/会话数据,并使用全新数据库或显式持久化 API 导出/导入。这不会影响 Obsidian vault 文件。
- 官方 DeepSeek 适配器默认启用 dsh_plugin_packages,会将活动的 Loader 支持包名称和版本在模型消息之外发送到配置的官方 DeepSeek 端点。如果部署策略禁止该清单,请禁用 plugin-package-inventory-deepseek 配置文件行。pi-ai 适配器不使用此扩展。
- dsh_session_log 是一个单独的扩展,此插件不会启用它。
- API Proxy 移除已在 alpha.2 中实现。dsh-obsidian 从未使用 API Proxy 或 ctx.remote。

发布与生态系统社区发现使用 GitHub 主题 dsh-plugin。此插件使用带注释的标签 dsh-obsidian-v;诸如 dsh-v0.1.2-alpha.2 之类的核心标签属于 DeepSeek Harness。

每次发布都会同步 package、lockfile、companion manifest、runtime、smoke expectation、documentation 和 tag 版本。verify:release 会检查完整的 DSH 锁闭包、官方注册表来源、必需的 tarball 内容以及禁止的 secret/log/config 路径。tag 工作流会发布一个 host tarball、一个包含两个文件的 companion ZIP 以及 SHA256SUMS。npm 发布不是自动的,需要获得授权的 @deepseek-ai scope 访问权限。

安全

companion 从不请求 URL。它仅监听操作系统本地 IPC,要求一个随机的 32 字节 token,使用常量时间比较,将消息上限设为 1 MiB,并在操作前验证规范 vault 身份。Vault 工具在遇到路径遍历、绝对路径、控制字符、受保护的 dot 目录、符号链接/junction 逃逸、过期修订、超大 payload、未授权命令和取消操作时会安全失败。

许可证

MIT
预览分享卡片长什么样 ↓gxpppp/dsh-obsidian
分享 · DeepSeek Harness Hub
gxpppp/dsh-obsidian

让 agent 直接读写、检索并编辑你的 Obsidian 笔记库

这是你的仓库?认领条目

回到顶部