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

标签页内嵌网页服务 hyci3/obsidian-dsh-tab

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

在标签页内一键启停本机 AI 编码助手网页

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

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

自动兼容检查未通过:仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装。以下命令仍可尝试,但可能失败。
无法用 dsh 插件命令安装(仓库内无 dsh 插件清单)
git clone https://github.com/hyci3/obsidian-dsh-tab.git
按该仓库 README 的原生方式安装;若作者另行发布了 DSH 插件包,请以其文档为准

状态速览

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

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

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

仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装

展开查看检查明细 ↓

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

✗npm 包obsidian-dsh-tab(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

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

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 23 处,展示前 23 条)
  • 发起网络请求
    dist/main.js:259
    fetch(`http://127.0.0.1:${port}/`, { mode: "no-cors", signal: controller.signal }).then(() => resolve(true)).catch(() => resolve(false)).finally(() =>
  • 发起网络请求
    plugin/main.js:259
    fetch(`http://127.0.0.1:${port}/`, { mode: "no-cors", signal: controller.signal }).then(() => resolve(true)).catch(() => resolve(false)).finally(() =>
  • 读取本地文件
    plugin/src/dshHome.ts:76
    if (existsSync(file)) {
  • 读取本地文件
    plugin/src/dshHome.ts:78
    data = JSON.parse(readFileSync(file, "utf8")) as WorkspaceRegistryFile;
  • 写入本地文件
    plugin/src/dshHome.ts:108
    mkdirSync(join(dshHome, "storages"), { recursive: true });
  • 写入本地文件
    plugin/src/dshHome.ts:109
    writeFileSync(file, JSON.stringify(data, null, 2), "utf8");
  • 写入本地文件
    plugin/src/dshHome.ts:119
    mkdirSync(target, { recursive: true });
  • 读取本地文件
    plugin/src/dshHome.ts:125
    if (existsSync(src) && !existsSync(dst)) {
  • 写入本地文件
    plugin/src/dshHome.ts:126
    copyFileSync(src, dst);
  • 发起网络请求
    plugin/src/processManager.ts:91
    fetch(`http://127.0.0.1:${port}/`, { mode: "no-cors", signal: controller.signal })
  • 执行外部命令来自配置/变量
    plugin/src/processManager.ts:100
    const res = realSpawnSync(probe.executable, probe.args, {
  • 执行外部命令来自配置/变量
    plugin/src/processManager.ts:110
    const res = realSpawnSync(probe.executable, probe.args, {
  • 执行外部命令来自配置/变量
    plugin/src/processManager.ts:123
    const res = realSpawnSync(process.env.ComSpec ?? "cmd.exe", ["/c", "npm cache ls @deepseek-ai/dsh"], {
  • 执行外部命令来自配置/变量
    plugin/src/processManager.ts:149
    const res = realSpawnSync(process.env.ComSpec ?? "cmd.exe", ["/c", `netstat -ano`], {
  • 执行外部命令来自配置/变量
    plugin/src/processManager.ts:158
    return realSpawn(executable, args, opts as never) as unknown as ChildLike;
  • 读取本地文件
    plugin/src/processManager.ts:180
    const parsed = JSON.parse(readFileSync(statePath, "utf8")) as { ownedPid?: unknown };
  • 写入本地文件
    plugin/src/processManager.ts:189
    mkdirSync(logDir, { recursive: true });
  • 写入本地文件
    plugin/src/processManager.ts:190
    writeFileSync(statePath, JSON.stringify({ ownedPid: pid }, null, 2), "utf8");
  • 执行外部命令来自配置/变量
    plugin/src/processManager.ts:226
    spawnSync: (exe, args, opts) => realSpawnSync(exe, args, opts as never),
  • 读取本地文件
    plugin/src/processManager.ts:632
    if (!existsSync(this.deps.logDir)) {
  • 写入本地文件
    plugin/src/processManager.ts:633
    mkdirSync(this.deps.logDir, { recursive: true });
  • 删除本地文件
    plugin/src/processManager.ts:637
    rmSync(this.stderrPath(), { force: true });
  • 读取本地文件
    plugin/src/processManager.ts:657
    return readFileSync(this.stderrPath(), "utf8");
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 标签页内打开本机网页
  • 自动启动与检测
  • 自动关闭服务

在 Obsidian 标签页中打开本机 DSH(DeepSeek Harness)网页,自动管理其启动、检测与关闭。

README

由 DeepSeek 最新模型翻译生成
DSH Tab — 在 Obsidian 中打开本机 DSH 在 Obsidian 标签页中直接打开本机运行的 DSH(DeepSeek Harness) 网页界面,并自动管理 DSH 的启动、检测与关闭。插件以当前 Obsidian 库作为 DSH 的工作目录,所有数据保存在本机,不上传云端。 平台:Windows 电脑版 Obsidian(1.10+)| 版本:0.1.0| License:MIT 项目介绍 DSH(DeepSeek Harness)是一个本地运行的 AI 编码助手网页服务,通常通过 dsh web --port 3080 在浏览器中打开。每次手动启动、关停、切换终端窗口都很麻烦。 本插件把 DSH 网页界面嵌入 Obsidian 的标签页: - 点一下左侧功能区图标,DSH 没启动就自动拉起,启动了就直接显示界面 - 标签标题实时显示「DSH · 运行中 / 启动中 / 已停止…」等状态,动作按钮随状态切换 - 关闭 Obsidian 时 DSH 自动一起退出,无残留进程、无黑窗闪现 - 每个库有独立的 DSH 数据目录,会话与工作区互不干扰 无需全局安装 DSH:优先使用本机全局 dsh 命令;未安装时自动回退 npx --yes @deepseek-ai/dsh(首次运行由 npx 自动下载,之后走缓存)。
展开完整文档(README 剩余 1 节)
DSH Tab — 在 Obsidian 中打开本机 DSH

在 Obsidian 标签页中直接打开本机运行的 DSH(DeepSeek Harness) 网页界面,并自动管理 DSH 的启动、检测与关闭。插件以当前 Obsidian 库作为 DSH 的工作目录,所有数据保存在本机,不上传云端。

平台:Windows 电脑版 Obsidian(1.10+)| 版本:0.1.0| License:MIT

项目介绍

DSH(DeepSeek Harness)是一个本地运行的 AI 编码助手网页服务,通常通过 dsh web --port 3080 在浏览器中打开。每次手动启动、关停、切换终端窗口都很麻烦。

本插件把 DSH 网页界面嵌入 Obsidian 的标签页:

- 点一下左侧功能区图标,DSH 没启动就自动拉起,启动了就直接显示界面
- 标签标题实时显示「DSH · 运行中 / 启动中 / 已停止…」等状态,动作按钮随状态切换
- 关闭 Obsidian 时 DSH 自动一起退出,无残留进程、无黑窗闪现
- 每个库有独立的 DSH 数据目录,会话与工作区互不干扰

无需全局安装 DSH:优先使用本机全局 dsh 命令;未安装时自动回退 npx --yes @deepseek-ai/dsh(首次运行由 npx 自动下载,之后走缓存)。

功能特性

- 功能区一键打开:左侧功能区按钮 → 打开 DSH 标签页;DSH 未运行时自动启动
- 六种状态视图:未运行 / 启动中(转圈)/ 运行中(内嵌网页)/ 关闭中(转圈)/ 已停止(可重启)/ 出错(可重试)

- 库即工作区:以当前库文件夹为 DSH 工作目录,DSH 产生的文件落在库里
- 智能生命周期:
- 关闭标签页不影响 DSH 运行,再打开直接显示界面
- 关闭 Obsidian 时自动关闭 DSH(可在设置中关闭)
- 插件加载时自动检测 DSH 是否已在运行
- 体验优化:
- 按钮点击动画(功能区图标 / 头部按钮 / 大按钮按压缩放反馈)
- 关闭过渡界面:点「关闭 dsh」立即显示「正在关闭 dsh…」,完成后再变「已关闭」
- 启动即时应答:点图标立即显示「正在打开 dsh…」,检测放后台
- 每库独立配置:每个库有独立的 DSH 数据目录,会话/工作区互不干扰,首次运行自动继承本机 ~/.dsh 的模型配置
- 外部进程隔离:只接管本插件启动的 DSH;端口被外部 DSH/程序占用时提示「端口被占用」,不进入、不接管、不杀
- 首次启动检查:启动前自动检查——dsh --version 可用则用 dsh 启动;不可用则查本地 npx 缓存(npm cache ls,纯本地、不触发下载),缓存中有 @deepseek-ai/dsh 则用 npx 启动;两者都不可用时显示错误页「没安装 dsh」并附官网下载链接();手动填写的自定义命令则严格按填写值执行
- 秒退:DSH 运行中退出 Obsidian 时的清理约 1ms(原生 kill 端口进程,外层 cmd 自然退出),退出不卡顿、无黑窗闪现、无残留进程
- 设置页:插件版本号、端口(默认 3080)、启动命令、随 Obsidian 关闭开关

安装

方式一:直接安装(无需构建)

1. 下载 latest release。
2. 将 main.js、manifest.json 和 styles.css 复制到 .obsidian/plugins/obsidian-dsh-tab/。
3. 重启 Obsidian。
4. 在 设置 → 第三方插件 中启用 DSH Tab。

方式二:从源码构建

git clone
cd plugin
npm install
npm run build # 类型检查 + 生成 main.js

构建完成后按方式一的步骤 2、3 安装 main.js / manifest.json / styles.css。

说明:main.js 构建产物已随仓库提交(clone 即装),仅在改动源码后需要重新构建。

使用示例

首次使用

1. 打开 Obsidian,进入任意一个库,点击左侧功能区的 DSH 图标
2. 首次点击:标签页立即显示「正在打开 dsh…」(后台自动检测/启动),就绪后显示 DSH 网页
3. 插件会自动创建该库专属的 DSH 数据目录(库/.obsidian/plugins/obsidian-dsh-tab/.dsh-home/),首次运行继承本机 ~/.dsh 的模型配置

无需提前安装 DSH:插件会自动检查——dsh --version 可用则直接启动;不可用则查本地 npx 缓存(npm cache ls,不触发下载),缓存中有则用 npx 启动;两者都不可用时显示「没安装 dsh」错误页,附官网下载链接(),装好后点「重试」即可。

关闭标签页 vs 关闭 DSH

| 操作 | 结果 |
| 点标签页的 × | 只关闭标签页,DSH 继续在后台运行 |
| 点标签行头部的关闭按钮 | 停止 DSH(先显示「正在关闭 dsh…」,完成后再变「已关闭」) |
| 关闭 Obsidian | 自动一起关闭 DSH(可在设置中改为保留) |

之后想再次使用:再点一次功能区图标,若 DSH 仍在运行则直接显示界面,无需等待。

端口被外部占用时

若你在终端手动启动过 DSH(如 dsh web --port 3080),插件检测到端口被占用时会显示「端口被占用」错误页:

- 插件不会进入、接管或杀掉外部进程
- 请自行关闭外部 DSH 进程,或在插件设置中更换端口后重启 Obsidian

修改端口 / 启动命令

设置页支持修改端口(默认 3080)与启动命令(默认 dsh),修改后需重启 Obsidian 生效。

开发与测试

cd plugin
npm install # 安装依赖
npm run dev # 监听模式编译(main.js)
npm run build # 类型检查 + 生产构建
npm test # 运行全部测试(单元 + 真实进程集成)
npm run verify # 构建 + 全部测试
npm run sync # 把产物同步到本地 test-vault(测试库)
npm run package # 打发布安装包到 ../dist/

测试说明:共 119 个测试,覆盖状态机(含关闭中)、进程管理(启动/停止/崩溃/超时/端口占用/命令回退)、界面渲染、设置、styles.css 约束、外部进程隔离、退出关闭速度与幂等、退出零弹窗零残留、DSH 真实进程生命周期等。集成测试通过 DSH_HOME 环境变量把数据重定向到工作区目录,不会触碰本机真实 ~/.dsh 数据,也不会占用 3080 端口。

仓库结构

├── docs/ # 项目文档(PRD、设计、开发计划、优化需求、验收记录、问题清单) ├── plugin/ # 插件源码与测试 │ ├── src/ # 源码(进程管理、状态机、视图、设置等) │ ├── tests/ # 单元测试 + 真实进程集成测试 │ ├── scripts/ # 同步 / 打包脚本 │ ├── main.js # 构建产物(已入库,clone 即装) │ └── manifest.json # 插件声明 └── dist/ # 发布用安装包(zip,含 main.js / manifest.json / styles.css)

文档索引

| 文档 | 说明 |
| docs/PRD.md | 产品需求文档(目标、功能、验收标准) |
| docs/01-页面结构与交互设计.md | 页面结构与交互设计 |
| docs/02-开发计划.md | 详细开发计划 |
| docs/03-M1验证记录.md | 技术验证记录 |
| docs/04-验收记录.md | 自动化验收记录 |
| docs/05-手动验收清单.md | 手动 GUI 验收清单 |
| docs/06-优化需求.md | v0.2 优化需求(O1-O4) |
| docs/07-优化开发计划.md | v0.2 优化开发计划 |
| docs/08-待修复问题清单.md | 问题清单与修复记录(FIX-01 ~ FIX-08) |

注意事项

- 仅支持电脑版 Obsidian(桌面端),手机版不支持(isDesktopOnly)
- 启动方式:自动检查 dsh --version 可用则用 dsh 启动;不可用则查本地 npx 缓存(npm cache ls,不触发下载),缓存中有 @deepseek-ai/dsh 则用 npx 启动;两者都不可用则显示错误页并附官网下载链接
- 若在设置里手动填写「启动命令」,插件严格按填写值执行(含空格路径请用引号包裹),不再自动回退
- 当前版本支持单标签页、单端口;修改设置后需重启 Obsidian 生效
- 插件的 DSH 数据目录位于 库/.obsidian/plugins/obsidian-dsh-tab/.dsh-home/,随库一起保存在本机
- 目前未发布到 Obsidian 社区插件市场,请按上方「安装」手动安装

许可证

MIT

致谢

本项目由 DeepSeek Harness(DSH) 开发完成 —— 一个本地运行的开源 AI 编码助手(npm 包:@deepseek-ai/dsh)。
预览分享卡片长什么样 ↓hyci3/obsidian-dsh-tab
分享 · DeepSeek Harness Hub
hyci3/obsidian-dsh-tab

在标签页内一键启停本机 AI 编码助手网页

这是你的仓库?认领条目

回到顶部