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

热重载工具 louisyeaaah/dsh-reload

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

不重启进程即可重载插件代码与技能目录

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add louisyeaaah/dsh-reload
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件
查看扫描证据(共 13 处,展示前 12 条)
  • 读取本地文件
    lib/index.js:126
    if (!existsSync(file)) return;
  • 读取本地文件
    lib/index.js:129
    raw = readFileSync(file, 'utf8');
  • 读取本地文件
    lib/skill-reload.js:79
    const file = existsSync(bundle) ? bundle : existsSync(flat) ? flat : undefined;
  • 读取本地文件
    lib/skill-reload.js:83
    raw = await readFile(file, 'utf8');
  • 读取本地文件
    lib/skill-provider.js:30
    if (existsSync(join(dir, '.git'))) return dir;
  • 读取本地文件
    lib/skill-provider.js:185
    raw = await readFile(file, 'utf8');
  • 读取本地文件
    lib/skill-provider.js:226
    entries = await readdir(root.path, { withFileTypes: true });
  • 读取本地文件
    lib/skill-provider.js:239
    const info = await stat(file);
  • 读取本地文件
    lib/skill-provider.js:283
    entries = await readdir(root.path, { withFileTypes: true });
  • 读取本地文件
    lib/skill-provider.js:294
    const info = await stat(target);
  • 读取本地文件
    lib/shared.js:120
    if (existsSync(join(dir, 'package.json'))) return dir;
  • 读取本地文件
    lib/shared.js:131
    return JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools@deepseek-ai/dsh-commands@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 不重启重载插件
  • 重载技能目录
  • 诊断技能不可见

不重启就重载 DSH 插件和技能:reload_plugin 重新导入已加载插件自身的模块并重新应用(带回滚);reload_skill 强制重新发现技能,并诊断技能为何不可见。

README

由 DeepSeek 最新模型翻译生成
dsh-reload 让 DSH 不重启就能用上新装的插件和新写的代码。 两个工具、两个斜杠命令: | 工具 | 一句话 | | reload_plugin | 把一个已加载插件的代码从磁盘重新装进正在运行的进程(清模块缓存 → 卸载 → 重新 import/apply),失败自动回滚 | | reload_skill | 强制技能目录重新发现,并诊断「技能为什么看不见」 | | /reload-plugin | 同 reload_plugin,人直接在输入框里用 | | /reload-skill | 同 reload_skill | 为什么需要它 DSH 自带热更新,但有三处缺口,都是实测出来的(证据见 DESIGN.md): 1. 插件源码不在 watch 范围:profile 里 HMR 的配置是 root: [],源码级监听默认关闭 —— 改了 lib/index.js 不会自动生效。 2. HMR 的自动重载跳过 node_modules:partialReload() 判断依赖时对 /node_modules/ 直接 return,而用户装的插件恰好都在 <profile>/node_modules/ 下。 两者叠加的结果就是「改完插件只能 ⌘Q 重开」。
展开完整文档(README 剩余 1 节)
dsh-reload

让 DSH 不重启就能用上新装的插件和新写的代码。

两个工具、两个斜杠命令:

| 工具 | 一句话 |
| reload_plugin | 把一个已加载插件的代码从磁盘重新装进正在运行的进程(清模块缓存 → 卸载 → 重新 import/apply),失败自动回滚 |
| reload_skill | 强制技能目录重新发现,并诊断「技能为什么看不见」 |
| /reload-plugin | 同 reload_plugin,人直接在输入框里用 |
| /reload-skill | 同 reload_skill |

为什么需要它

DSH 自带热更新,但有三处缺口,都是实测出来的(证据见 DESIGN.md):

1. 插件源码不在 watch 范围:profile 里 HMR 的配置是 root: [],源码级监听默认关闭 —— 改了 lib/index.js 不会自动生效。
2. HMR 的自动重载跳过 node_modules:partialReload() 判断依赖时对 /node_modules/ 直接 return,而用户装的插件恰好都在 <profile>/node_modules/ 下。
两者叠加的结果就是「改完插件只能 ⌘Q 重开」。
3. 技能注册表没有 TTL:只有 provider 自己调用 invalidate() 才会重新发现。
宿主自带 filesystem provider 又是「按根整体 list,一根失败全 provider 失败」——本机就踩到了:cordis preset 把 customSkillDirs 指向 app.asar 内部目录, list 抛 Cannot mix BigInt and other types,于是 ~/.dsh/skills 下的技能连一个都看不见(12 个技能里原本只能看到 5 个 bundled 的)。

dsh-reload 把这三件事补上:缺口 1+2 由 reload_plugin 解决,缺口 3 由 reload_skill(强制刷新 + 诊断)和一个兜底技能提供方解决。

安装

别人(或你自己在另一台机器上)三种装法,任选其一:

1) 直接从 GitHub 装(推荐)
dsh plugin --profile <profile> add github:louisyeaaah/dsh-reload

2) 用 Release 里预打包的 tarball(无需构建,链接钉在 tag 上不会失效)
dsh plugin --profile <profile> add "https://github.com/louisyeaaah/dsh-reload/releases/download/v0.1.4/dsh-reload-0.1.4.tgz"

3) 应用内:插件管理面板 / dsh-market 里搜 dsh-reload

三种方式都不需要重启:宿主会把新增的插件行热组装进来。
技能随插件一起注册(apply() 里调 ctx.skills.register()),不用手动往 ~/.dsh/skills/ 拷。

本仓库自己开发时用的手动装法:

scripts/install.sh [profile] # 默认 desktop

做三件事:把插件包实体拷到 <profile>/node_modules/dsh-reload;把 cordis.patch.yml 的插件行并入 profile 的 patch 层(带标记,可回滚);把技能装到 $DSH_HOME/skills/dsh-reload/。

正常情况下不需要重启:新增的 patch 行会被运行中的 DSH 热组装(这一点已实测,不是推测)。装完可以直接让 agent 调 reload_plugin({}) 验证。

卸载:

scripts/uninstall.sh [profile]

它会从 patch 层删掉插件行、删掉 node_modules/dsh-reload 与技能。
实测:宿主会把 patch 的「删除」也热协调掉 —— 删掉三个探针插件的行之后,运行中的 Loader 树里那三行立即消失(209 → 206 行),不用重启。
只有在这一步没生效时才需要 ⌘Q 重开。

用法

reload_plugin

reload_plugin({}) # 列清单:包名、entry id、运行状态
reload_plugin({ name: 'dsh-video' }) # 按包名重载
reload_plugin({ name: 'tool-video' }) # 按 entry id 重载
reload_plugin({ name: 'dsh-video', dryRun: true }) # 只预览会清理哪些模块
reload_plugin({ filter: '@deepseek-ai/' }) # 列全部插件行(默认只列第三方/本地与未运行的行)

真实输出(重载自己,v0.1.1 → v0.1.2;路径中段为省略):

✅ 重载成功:include:tool-reload(dsh-reload)模块:file:///Users/yezhipeng/.dsh/profiles/desktop/node_modules/dsh-reload/lib/index.js 包根:/Users/yezhipeng/.dsh/profiles/desktop/node_modules/dsh-reload 清理并重新求值的本地模块(5):
• …/dsh-reload/lib/index.js
• …/dsh-reload/lib/plugin-reload.js
• …/dsh-reload/lib/shared.js
• …/dsh-reload/lib/skill-provider.js
• …/dsh-reload/lib/skill-reload.js 工具清单无变化。
耗时 11ms

— dsh-reload v0.1.2 ← 版本号变化 = 新代码真的生效了

行为要点:

- 只清目标插件自己的模块(包根目录下、排除嵌套 node_modules)。共享依赖不动,不会顺手把别的插件也换掉。
- 重新跑一遍 apply():工具、服务、命令、prompt 段一起更新。
- 任何一步失败都会回滚到旧模块,不会把插件留在半死状态。
- entry 存在但没在跑(启动失败、被关掉)时,它做的是「激活」而不是「重载」。
- 带 dsh.client 的插件,宿主半边热重载,浏览器半边要刷新一次页面(报告里会提示)。

reload_skill

reload_skill() # 强制刷新:报告新增/移除/变更
reload_skill({ name: 'my-skill' }) # 刷新 + 诊断这个技能
reload_skill({ cwd: '/path/to/repo' }) # 指定按哪个目录解析项目技能根

真实输出(诊断一个不存在的技能):

技能目录已强制重新发现(缓存已清,skills/change 已广播)。
技能总数:12(本次观察不完整,某个来源失败了 —— 见下方诊断)与刷新前相比:新增 0 / 移除 0 / 变更 0 当前目录:
• dsh-video [user-dsh/dsh-reload] /Users/yezhipeng/.dsh/skills/dsh-video/SKILL.md
• probe-project [cwd-dsh/dsh-reload] /…/dsh-plugin/.dsh/skills/probe-project/SKILL.md …
❌ 技能 "not-a-real-skill" 不在(刷新后的)目录里。
扫描过的根里没有这个技能文件:
• …/dsh-plugin/.dsh/skills(cwd-dsh)
• /Users/yezhipeng/.dsh/skills(user-dsh)…
提供方诊断(逐个调用 list() 的结果):
• global/dsh-office: 3 条
• global/dsh-reload: 7 条
• scope#3/filesystem: ❌ cannot list "…/app.asar/dsh/node_modules/@deepseek-ai/dsh-agent-preset/skills": Cannot mix BigInt and other types, use explicit conversions

那行 ❌ 就是上面缺口 3 的现场:注册表遇到 provider 抛错只会「跳过 + 标记不完整」,模型侧完全看不到诊断 —— reload_skill 把它摊开给你看。

兜底技能提供方

fallbackRoots: true(默认)时插件会注册一个自己的技能提供方,按同样的规则扫同样的根,但逐根容错:某个根读不了只丢那个根,其余技能照常出现。它注册在全局层,宿主自己的 provider 正常工作时按「就近层优先」压过它,不会出现重复技能。

扫描顺序(优先级从高到低,同路径自动去重):

| 来源 | 路径 |
| cwd-dsh | <会话工作目录>/.dsh/skills |
| cwd-agents | <会话工作目录>/.agents/skills |
| project-dsh / project-agents | 最近的 .git 祖先下的同名目录 |
| custom | 配置项 customSkillDirs |
| user-dsh | $DSH_HOME/skills(默认 ~/.dsh/skills,跳过 .system) |
| user-agents | $DSH_AGENTS_HOME/skills(默认 ~/.agents/skills) |

与宿主规则的一处有意差异:宿主只用「最近的 .git 祖先」当项目根。
本机 $HOME 就是 git 仓库,于是任何 ~/project/… 会话的项目根都变成 $HOME, <cwd>/.dsh/skills 永远扫不到。兜底提供方额外把会话工作目录自己也当一个根,优先级最高。不想要这个行为就配 includeProjectRoots: false。

默认每 2 秒轮询一次这些根,内容指纹变化就 invalidate() —— 新装的技能会自动出现,不依赖手动调用。

配置

- insert:
- id: tool-reload
name: 'dsh-reload'
config:
fallbackRoots: true # 兜底技能提供方
customSkillDirs: [] # 额外技能根
watchIntervalMs: 2000 # 兜底提供方的轮询间隔,0 = 不轮询

验证

不需要 DSH 在跑:

scripts/verify.sh # 语法 + patch YAML + 工具清单 + 纯逻辑单测

需要 DSH 的(真实验证,全部已跑通):

1. 装完不重启 → 工具直接出现在会话里;
2. 改插件源码 → reload_plugin → 版本号与行为同时变化;
3. 往 ~/.dsh/skills/ 放一个新技能 → reload_skill → 出现在目录里,并且 skill <名字> 能真的加载;
4. reload_plugin 一个别人的插件(dsh-video)→ 重载后 video_doctor / video_frame 正常。

已知边界

- 本插件不做「卸载」:把 patch 行删掉时,宿主的 patch 协调会热移除对应的 entry (已实测),所以不需要工具代劳;删行属于改配置,不是热重载。
- disabled: true 的行不会被强行启用:那属于改配置,不是热重载。
- 只重载目标插件自己的模块:共享依赖(node_modules)故意不动。
- 客户端(浏览器)半边:宿主半边热重载后,页面仍可能显示旧组件;带 dsh.client 的插件需要刷新页面,或用 pnpm run dev:web 的 bundle watcher 自动换。
- reload_plugin 触碰的是宿主内部的 ctx.loader / ctx.hmr / ctx.skills 结构。
DSH 升级后若这些结构变化,插件会明确报错(并回滚),而不是静默做错事。

文件

| 文件 | 作用 |
| lib/index.js | 插件入口:配置、工具、斜杠命令 |
| lib/plugin-reload.js | 插件热重载(清缓存 → 卸载 → 重新 init,带回滚) |
| lib/skill-reload.js | 技能强制刷新 + 差异 + 诊断 |
| lib/skill-provider.js | 兜底技能提供方、frontmatter 解析、轮询 |
| lib/shared.js | 宿主结构读取、模块缓存操作、提供方诊断 |
| skills/dsh-reload/SKILL.md | 给 agent 用的技能(什么时候用哪个工具) |
| DESIGN.md | 宿主内部机制、实现取舍、实测证据 |
预览分享卡片长什么样 ↓louisyeaaah/dsh-reload
分享 · DeepSeek Harness Hub
louisyeaaah/dsh-reload

不重启进程即可重载插件代码与技能目录

回到顶部