让 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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
gxpppp/dsh-obsidian
让 agent 直接读写、检索并编辑你的 Obsidian 笔记库
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
智能体运行框架路由HarnessRouter/harnessrouter
智能体 harness 的统一接口。
★ 3,984已汉化DSH
71.3
这是你的仓库?认领条目