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

多引擎智能体 hanhtang711-netizen/claudian-dsh

DeepSeek Harness
hanhtang711-netizen49 天前有提交已提供中文文档扫描:高危

在 Obsidian 笔记库里接入多种 AI 编程智能体

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

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

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add hanhtang711-netizen/claudian-dsh
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · model
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 49 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

engines.node 要求 >=24 <25,不满足 Node 22.19.0

展开查看检查明细 ↓

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

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

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 08:37:56

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

安装时即执行脚本命令参数由运行时变量拼接读写/删除本地文件发起外部网络请求
查看扫描证据(共 57 处,展示前 56 条)
  • 读取本地文件
    scripts/postinstall.mjs:21
    if (existsSync(example) && !existsSync(target)) {
  • 写入本地文件
    scripts/postinstall.mjs:22
    copyFileSync(example, target);
  • 发起网络请求
    dsh-bridge/lib/acp.js:246
    .request("session/request_permission", {
  • 读取本地文件
    dsh-bridge/lib/index.js:32
    config = JSON.parse(readFileSync(configPath, "utf8"));
  • 读取本地文件
    dsh-bridge/lib/index.js:40
    systemText = readFileSync(config.systemPromptPath, "utf8");
  • 读取本地文件
    esbuild.config.mjs:21
    if (existsSync('.env.local')) {
  • 读取本地文件
    esbuild.config.mjs:22
    const envContent = readFileSync('.env.local', 'utf-8');
  • 读取本地文件
    esbuild.config.mjs:106
    if (!existsSync(outputPath)) continue;
  • 读取本地文件
    esbuild.config.mjs:134
    const OBSIDIAN_PLUGIN_PATH = OBSIDIAN_VAULT && existsSync(OBSIDIAN_VAULT)
  • 删除本地文件递归
    esbuild.config.mjs:144
    rmSync(path.join(process.cwd(), '.codex-vendor'), { recursive: true, force: true });
  • 读取本地文件
    esbuild.config.mjs:148
    if (!existsSync(OBSIDIAN_PLUGIN_PATH)) {
  • 写入本地文件
    esbuild.config.mjs:149
    mkdirSync(OBSIDIAN_PLUGIN_PATH, { recursive: true });
  • 读取本地文件
    esbuild.config.mjs:154
    if (existsSync(file)) {
  • 写入本地文件
    esbuild.config.mjs:155
    copyFileSync(file, path.join(OBSIDIAN_PLUGIN_PATH, file));
  • 删除本地文件递归
    esbuild.config.mjs:161
    rmSync(pluginVendorRoot, { recursive: true, force: true });
  • 读取本地文件
    scripts/build-css.mjs:20
    if (!existsSync(INDEX_FILE)) {
  • 读取本地文件
    scripts/build-css.mjs:25
    const content = readFileSync(INDEX_FILE, 'utf-8');
  • 读取本地文件
    scripts/build-css.mjs:37
    const entries = readdirSync(dir, { withFileTypes: true });
  • 读取本地文件
    scripts/build-css.mjs:76
    if (!existsSync(resolvedPath)) {
  • 读取本地文件
    scripts/build-css.mjs:81
    const content = readFileSync(resolvedPath, 'utf-8');
  • 写入本地文件
    scripts/build-css.mjs:115
    writeFileSync(OUTPUT, output);
  • 执行外部命令固定命令
    scripts/build.mjs:15
    execSync('node scripts/build-css.mjs', { cwd: ROOT, stdio: 'inherit' });
  • 执行外部命令运行时拼接
    scripts/build.mjs:19
    execSync(`node esbuild.config.mjs ${args}`, { cwd: ROOT, stdio: 'inherit' });
  • 读取本地文件
    scripts/check-architecture-boundaries.test.mjs:9
    for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
  • 读取本地文件
    scripts/check-architecture-boundaries.test.mjs:21
    if (pattern.test(fs.readFileSync(file, 'utf8'))) {
  • 读取本地文件
    scripts/check-architecture-boundaries.test.mjs:30
    const sourceText = fs.readFileSync(file, 'utf8');
  • 读取本地文件
    scripts/check-architecture-boundaries.test.mjs:122
    return fs.readdirSync(providersRoot, { withFileTypes: true })
  • 读取本地文件
    scripts/check-architecture-boundaries.test.mjs:125
    && fs.existsSync(path.join(providersRoot, entry.name, 'registration.ts'))
  • 读取本地文件
    scripts/check-architecture-boundaries.test.mjs:268
    assert.equal(fs.existsSync(tabSource), false);
  • 读取本地文件
    scripts/check-startup-performance.mjs:17
    if (!existsSync(artifactPath)) {
  • 执行外部命令来自配置/变量
    scripts/check-startup-performance.mjs:21
    const syntaxCheck = spawnSync(process.execPath, ['--check', artifactPath], {
  • 读取本地文件
    scripts/check-startup-performance.mjs:31
    const mainContents = readFileSync(mainPath, 'utf8');
  • 读取本地文件
    scripts/check-startup-performance.mjs:43
    const mainBytes = statSync(mainPath).size;
  • 执行外部命令来自配置/变量
    scripts/check-startup-performance.mjs:82
    const result = spawnSync(process.execPath, ['-e', childScript, mainPath], {
  • 执行外部命令来自配置/变量
    scripts/run-jest.js:8
    const result = spawnSync(
  • 执行外部命令来自配置/变量
    scripts/run-tests.js:7
    const result = spawnSync(process.execPath, args, {
  • 读取本地文件
    scripts/sync-version.js:9
    const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
  • 读取本地文件
    scripts/sync-version.js:10
    const manifestJson = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
  • 写入本地文件
    scripts/sync-version.js:14
    fs.writeFileSync(manifestPath, JSON.stringify(manifestJson, null, 2) + '\n');
  • 读取本地文件
    src/utils/cliBinaryLocator.ts:9
    return fs.statSync(filePath).isFile();
  • 读取本地文件
    src/utils/env.ts:198
    if (fs.existsSync(nodePath)) {
  • 读取本地文件
    src/utils/env.ts:199
    const stat = fs.statSync(nodePath);
  • 读取本地文件
    src/utils/env.ts:228
    if (!fs.existsSync(cliPath)) {
  • 读取本地文件
    src/utils/env.ts:232
    const stat = fs.statSync(cliPath);
  • 读取本地文件
    src/utils/env.ts:288
    if (fs.existsSync(nodeInCliDir)) {
  • 读取本地文件
    src/utils/env.ts:289
    const stat = fs.statSync(nodeInCliDir);
  • 读取本地文件
    src/utils/externalContext.ts:115
    const stats = fs.statSync(p);
  • 读取本地文件
    src/utils/externalContextScanner.ts:83
    if (!fs.existsSync(dir)) return [];
  • 读取本地文件
    src/utils/externalContextScanner.ts:85
    const stat = fs.statSync(dir);
  • 读取本地文件
    src/utils/externalContextScanner.ts:88
    const entries = fs.readdirSync(dir, { withFileTypes: true });
  • 读取本地文件
    src/utils/externalContextScanner.ts:103
    const fileStat = fs.statSync(fullPath);
  • 读取本地文件
    src/utils/path.ts:141
    const target = fs.readFileSync(aliasFile, 'utf8').trim();
  • 读取本地文件
    src/utils/path.ts:155
    const alias = fs.readFileSync(path.join(nvmDir, 'alias', 'default'), 'utf8').trim();
  • 读取本地文件
    src/utils/path.ts:162
    const entries = fs.readdirSync(versionsDir)
  • 读取本地文件
    src/utils/path.ts:170
    if (fs.existsSync(binDir)) return binDir;
  • 读取本地文件
    src/utils/path.ts:193
    if (fs.existsSync(current)) {
扫描于 2026/11/2(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

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

界面预览

1 张 · 点击查看大图

功能亮点

  • 接入多种AI编程智能体
  • 新增DSH聊天服务商
  • DSH桥接与ACP修复

Claudian 分支,把 DeepSeek Harness(DSH)加为 ACP 聊天服务商,附带 DSH 桥接和通用 ACP 修复

README

由 DeepSeek 最新模型翻译生成
Claudian 本仓库是 YishenTu/claudian 的 fork(base: v2.1.3 e707f1c),新增 DeepSeek Harness(DSH) 作为第五个聊天引擎(claude/codex/grok/opencode/pi → +dsh),并修复了两个通用的 ACP 集成缺口。全部改动说明与安装步骤见 docs/DSH_INTEGRATION.md。 This fork adds DeepSeek Harness as a new ACP chat provider, plus two generic ACP integration fixes. See docs/DSH_INTEGRATION.md. Everything below is the upstream README. Preview Obsidian 插件,把 AI 编程智能体(Claude Code、Codex、Grok、Opencode、Pi,后续还会支持更多)嵌进你的 vault。vault 就是智能体的工作目录——读写文件、搜索、bash、多步工作流,开箱即用。 功能与用法 从侧边栏图标或命令面板打开聊天侧栏。选中文本,按快捷键即可行内编辑。
展开完整文档(README 剩余 1 节)
Claudian

本仓库是 YishenTu/claudian 的 fork(base: v2.1.3 e707f1c),新增 DeepSeek Harness(DSH) 作为第五个聊天引擎(claude/codex/grok/opencode/pi → +dsh),并修复了两个通用的 ACP 集成缺口。全部改动说明与安装步骤见 docs/DSH_INTEGRATION.md。

This fork adds DeepSeek Harness as a new ACP chat provider, plus two generic ACP integration fixes. See docs/DSH_INTEGRATION.md. Everything below is the upstream README.

Preview

Obsidian 插件,把 AI 编程智能体(Claude Code、Codex、Grok、Opencode、Pi,后续还会支持更多)嵌进你的 vault。vault 就是智能体的工作目录——读写文件、搜索、bash、多步工作流,开箱即用。

功能与用法

从侧边栏图标或命令面板打开聊天侧栏。选中文本,按快捷键即可行内编辑。用法和你熟悉的编程智能体一样,Claude Code、Codex、Grok、Opencode、Pi——跟智能体说话,它就会在你的 vault 里读、写、改、搜文件。

行内编辑 — 选中文本,或把光标停在目标位置 + 快捷键,直接在笔记里编辑,带词级 diff 预览。

斜杠命令与技能 — 输入 / 或 $,调用可复用的提示词模板或技能,来源可以是用户级,也可以是 vault 级。

@mention — 输入 @ 提及任何你想让智能体处理的东西,包括 vault 文件、子代理、外部目录里的文件。

计划模式 — 用 Shift+Tab 切换。智能体先探索、先设计,再动手实现,然后给出计划等你批准。

指令模式(#) — 从聊天输入框添加润色过的自定义指令。

MCP 服务器 — 通过各编程智能体原生的 CLI 托管 MCP 配置,接入外部工具。

标签页与会话管理 — 单面板模式下可用多个标签页;双面板模式下,聊天旁边有常驻的会话管理器。

环境要求

- 至少装一个下面这些 harness:
- Claude Code CLI
- Codex CLI
- Grok Build
- OpenCode
- Pi
- 兼容的订阅或 API 服务商,例如 OpenRouter、Kimi、GLM 或 DeepSeek。
- Obsidian v1.7.2+
- 仅支持桌面端(macOS、Linux、Windows)

安装

从 Obsidian 社区插件安装(推荐)

1. 打开 Obsidian → Settings → Community plugins → Browse
2. 搜索 "Claudian",点击 Install
3. 启用插件

也可以直接从社区插件页面安装。

从源码安装(开发)

1. 把仓库克隆到 vault 的 plugins 目录:
cd /path/to/vault/.obsidian/plugins
git clone https://github.com/YishenTu/claudian.git
cd claudian

2. 安装依赖并构建:
npm install
npm run build

3. 在 Obsidian 中启用插件:
- Settings → Community plugins → Enable "Claudian"

开发

Watch mode
npm run dev

Production build
npm run build

隐私与数据使用

- 发送到 API 的内容:你的输入、附件、图片,以及工具调用输出。具体发往哪里取决于你选的服务商:Anthropic(Claude)、OpenAI(Codex)、xAI(Grok),或者你在 OpenCode、Pi 里配置的服务商。目标地址可以在服务商设置和环境变量里配置。
- 没有遥测,也不会偷偷跑后台任务:Claudian 不会发送遥测信标。UI 里的轮询定时器只读取本地 Obsidian/编辑器的选区状态。网络活动仅限于服务商运行时的必要工作、你配置的 MCP 端点,以及为回答你的请求而调用的服务商 SDK/CLI。

故障排查

下面几节以 Claude Code 为例。

找不到服务商 CLI

如果 Claudian 无法自动检测到服务商 CLI,先确认 CLI 已安装,并且 GUI 应用能通过 PATH 找到它。常见报错有 spawn claude ENOENT 和 Claude CLI not found。用 Node 版本管理器(nvm、fnm、volta)时经常遇到这个问题。

先把 CLI 路径设置留空,让 Claudian 自动检测。如果自动检测失败,找到可执行文件路径,填到 Settings → Advanced → Claude CLI path。

| 平台 | 命令 | 路径示例 |
| macOS/Linux | which claude | /Users/you/.volta/bin/claude |
| Windows(原生) | where.exe claude | C:\Users\you\AppData\Local\Claude\claude.exe |
| Windows(npm) | npm root -g | {root}\@anthropic-ai\claude-code\cli-wrapper.cjs |
注意:在 Windows 上,别用 .cmd 和 .ps1 包装脚本。原生安装用 claude.exe,包管理器安装用 cli-wrapper.cjs。cli.js 只是旧版 Claude Code npm 包的兼容回退。

备选方案:在 Settings → Environment → Custom variables 里,把 Node.js 的 bin 目录加进 PATH。

npm 命令行与 Node.js 不在同一目录

用 npm 安装的服务商命令行时,要确保它的可执行文件和 Node.js 在同一个环境里都能找到。检查它们的路径:

dirname $(which claude)
dirname $(which node)

如果路径不一样,Obsidian 这类 GUI 应用可能找不到 Node.js。

两种做法:

1. 安装原生二进制文件(推荐)。
2. 在 Settings → Environment 里加上 Node.js 路径:PATH=/path/to/node/bin。

更多帮助

服务商各自的安装与配置指引,请看 Requirements 一节里链接的服务商文档。想提功能需求,或者遇到了 bug,请提交 GitHub issue。

架构

src/
├── main.ts # Plugin entry point
├── app/ # Shared defaults and plugin-level storage
├── core/ # Provider-neutral runtime, registry, and type contracts
│ ├── runtime/ # ChatRuntime interface and approval types
│ ├── providers/ # Provider registry and workspace services
│ ├── auxiliary/ # Shared provider auxiliary services
│ ├── bootstrap/ # Plugin bootstrap wiring
│ ├── security/ # Approval utilities
│ └── ... # commands, mcp, prompt, storage, tools, types
├── providers/
│ ├── claude/ # Claude SDK adaptor, prompt encoding, storage, MCP, plugins
│ ├── codex/ # Codex app-server adaptor, JSON-RPC transport, JSONL history
│ ├── grok/ # Grok Build ACP adaptor, native history, models, and tools
│ ├── opencode/ # Opencode adaptor
│ ├── pi/ # Pi RPC adaptor, model discovery, JSONL history
│ └── acp/ # Agent Client Protocol shared transport
├── features/
│ ├── chat/ # Sidebar chat: tabs, controllers, renderers
│ ├── inline-edit/ # Inline edit modal and provider-backed edit services
│ └── settings/ # Settings shell with provider tabs
├── shared/ # Reusable UI components and modals
├── i18n/ # Internationalization (10 locales)
├── types/ # Shared ambient types
├── utils/ # Cross-cutting utilities
└── style/ # Modular CSS

Star 历史

赞助

贝壳控股有限公司(BEIKE)

Claudian 由贝壳控股有限公司(BEIKE)与 MOMA 团队赞助。他们的支持让 Claudian 得以持续开发与维护,不断改进。

想赞助 Claudian,或想出现在这里?联系我:tysk01213@gmail.com。

贡献

欢迎提交 issue 和聚焦的 pull request。建议先从 issue 开始:把问题、复现步骤和环境描述清楚,方便排查。

提交 pull request 之前,请先阅读贡献指南。pull request 必须说明问题是什么、方案是什么、为什么这个方案合适,以及改动如何验证。不接受新增服务商的 pull request;指南里详细解释了这条维护与产品质量的边界。

许可证

基于 MIT License 授权。
预览分享卡片长什么样 ↓hanhtang711-netizen/claudian-dsh
分享 · DeepSeek Harness Hub
hanhtang711-netizen/claudian-dsh

在 Obsidian 笔记库里接入多种 AI 编程智能体

回到顶部