在设置面板里分组查看并启用禁用本机 agent skill
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Nay-1/dsh-skill-manager该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · market
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 47 处,展示前 26 条)
- 读取本地文件lib/index.js:96
return await stat(target); - 读取本地文件lib/index.js:232
const raw = await readFile(file, "utf8"); - 写入本地文件lib/index.js:275
await writeFile(temp, bom + out.join(eol), { encoding: "utf8", mode: stamp.mode & 0o777 }); - 写入本地文件lib/index.js:276
await rename(temp, file); - 删除本地文件lib/index.js:279
await rm(temp, { force: true }); - 读取本地文件lib/index.js:402
return await readdir(root.path, { withFileTypes: true }); - 写入本地文件lib/index.js:778
await rename(row.skillFile, to); - 写入本地文件lib/index.js:794
await rename(row.skillFile, to); - 删除本地文件递归lib/index.js:810
await rm(target, { recursive: true, force: true }); - 读取本地文件lib/index.js:826
return { skillFile: file, content: await readFile(file, "utf8") }; - 执行外部命令固定命令lib/index.js:848
const child = spawn("explorer.exe", args, { detached: true, stdio: "ignore" }); - 发起网络请求lib/client.js:241
const response = await fetch(`${API}${path}`, body === undefined - 读取本地文件test-client.mjs:207
const source = readFileSync(join(import.meta.dirname, "lib", "client.js"), "utf8"); - 写入本地文件test-host.mjs:38
await mkdir(join(path, ".."), { recursive: true }).catch(() => {}); - 写入本地文件test-host.mjs:39
await mkdir(path.replace(/[ /][^ /]+$/, ""), { recursive: true }); - 写入本地文件test-host.mjs:40
await writeFile(path, `---\n${frontmatter}\n---\n\n${body}`, "utf8"); - 写入本地文件test-host.mjs:51
await writeFile(join(userAgents, "flat-skill.md"), "---\nname: flat-skill\ndescription: A flat markdown skill.\n---\n\nbody\n", "utf8"); - 写入本地文件test-host.mjs:59
await mkdir(join(userAgents, "empty-dir"), { recursive: true }); - 写入本地文件test-host.mjs:69
await mkdir(join(userAgents, "crlf-skill"), { recursive: true }); - 读取本地文件test-host.mjs:288
const before = await readFile(file, "utf8"); - 读取本地文件test-host.mjs:294
check("SKILL.md 还在,没有被改名", existsSync(file) && !existsSync(skillFile(target, "SKILL.md.disabled"))); - 读取本地文件test-host.mjs:296
const after = await readFile(file, "utf8"); - 读取本地文件test-host.mjs:309
const restored = await readFile(file, "utf8"); - 读取本地文件test-host.mjs:312
check("启用后文件名依旧没变", existsSync(file) && !existsSync(skillFile(target, "SKILL.md.disabled"))); - 读取本地文件test-host.mjs:320
const text1 = await readFile(file, "utf8"); - 删除本地文件递归test-host.mjs:509
await rm(root, { recursive: true, force: true });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 分组查看本机技能
- 启用禁用技能
- 定位预览删除技能
在 DSH 设置面板里管理 agent skill:按项目或来源分组列出,支持启用、禁用、定位、预览与删除
README
由 DeepSeek 最新模型翻译生成dsh-skill-manager
在 DeepSeek Harness 的设置面板里加一个「Skill 管理」分区(左栏导航,排在「Agent 预设」下方),用来查看和打理本机的 agent skill。
界面
设置 ├── 通用设置 ├── 模型 ├── 内置插件 ├── Agent 预设 └── Skill 管理 ← 本插件,order 30
页面本身:
- 顶部是搜索框 + 刷新按钮;
- 汇总行告诉你一共几个 skill、其中几个被禁用、扫了几个根目录;
- 卡片按“位置”分组,样式对齐内置「内置插件」页:一行一个分组,左侧箭头、主标题是位置、副标题说明这是什么 + 几个,组与组之间一条细线;默认全部收起,点整行展开/收起;
- 项目级按具体项目分组(一个项目的 .dsh/skills 与 .agents/skills 合成一组),标题用缩短后的项目路径(~\Desktop\agent-test)——两个同名项目也能分辨;
- 用户级、随包内置、运行时按来源分组:用户 .dsh → 用户 .agents → 随包内置 → 运行时;
- 一搜索就自动把所有组摊开(既然是在找东西,就不该再点一遍箭头);
- 卡片高度统一:描述固定两行(超出截断,鼠标悬停看全文),没有 description 的也占满两行,所以一屏里的卡片块块对齐;
展开完整文档(README 剩余 1 节)
dsh-skill-manager
在 DeepSeek Harness 的设置面板里加一个「Skill 管理」分区(左栏导航,排在「Agent 预设」下方),用来查看和打理本机的 agent skill。
界面
设置 ├── 通用设置 ├── 模型 ├── 内置插件 ├── Agent 预设 └── Skill 管理 ← 本插件,order 30
页面本身:
- 顶部是搜索框 + 刷新按钮;
- 汇总行告诉你一共几个 skill、其中几个被禁用、扫了几个根目录;
- 卡片按“位置”分组,样式对齐内置「内置插件」页:一行一个分组,左侧箭头、主标题是位置、副标题说明这是什么 + 几个,组与组之间一条细线;默认全部收起,点整行展开/收起;
- 项目级按具体项目分组(一个项目的 .dsh/skills 与 .agents/skills 合成一组),标题用缩短后的项目路径(~\Desktop\agent-test)——两个同名项目也能分辨;
- 用户级、随包内置、运行时按来源分组:用户 .dsh → 用户 .agents → 随包内置 → 运行时;
- 一搜索就自动把所有组摊开(既然是在找东西,就不该再点一遍箭头);
- 卡片高度统一:描述固定两行(超出截断,鼠标悬停看全文),没有 description 的也占满两行,所以一屏里的卡片块块对齐;
- 卡片内容:名字、来源标签、描述、缩短后的 SKILL.md 路径(主目录显示成 ~,悬停看全路径),以及按可得性出现的操作按钮。
| 按钮 | 出现条件 | 干什么 |
| 启用 / 禁用 | 文件系统上可写的 skill | SKILL.md ⇄ SKILL.md.disabled 改名(可逆) |
| 打开目录 | 磁盘上存在的 skill | 资源管理器定位到它 |
| 查看 / 收起 | 磁盘上存在的 skill | 就地预览 SKILL.md 正文 |
| 删除 | 文件系统上可写的 skill | 删掉整个 skill(内联二次确认,不可恢复) |
一屏只留一个“实体按钮”(启用/禁用,描边),定位、预览、删除都做成轻量文字动作。
随包内置的(bundled)与运行时 provider 提供的 skill 只展示、只读。
它怎么认 skill
DSH 的 skill 是文件系统资源,插件的扫描规则与 @deepseek-ai/dsh-skill-filesystem 对齐:
| 根目录 | source | rank |
| /.dsh/skills | project-dsh | 100 |
| /.agents/skills | project-agents | 200 |
| $DSH_HOME/skills(默认 ~/.dsh/skills) | user-dsh | 400 |
| $DSH_AGENTS_HOME/skills(默认 ~/.agents/skills) | user-agents | 500 |
| $DSH_BUNDLED_SKILL_DIR | bundled | 600 |
项目根取 DSH 进程的工作目录,外加工作区账本(ctx.workspaceRegistry)里登记过的每个路径。
每个根下认两种形态:目录包 /SKILL.md,以及平铺文件 .md。
以 . 开头的条目(含 .system)一律跳过。
清单来自两处合并:
1. ctx.skills.list() —— DSH 实际认得的 skill,含随包内置与运行时 provider 注册的;
2. 磁盘扫描 —— 文件到底在哪、能不能动。
两者缺一不可:被禁用的 skill 只存在于磁盘上(注册表看不到它),而运行时 provider 的 skill 只存在于注册表里(没有文件)。页面会标出每个条目的来源;注册表整个不可用时,页面会明确提示 “现在只有磁盘扫描结果”。
实测结论(0.2.0-rc.2):宿主插件上下文里的 ctx.skills.list() 只返回随包内置与运行时 provider 的 skill,看不到 skill-filesystem 提供的那批 —— DSH 的 skill 注册表可以由 agent preset 或 host composition 挂载,而文件系统 provider 挂在前者。所以页面上的文件系统 skill 一律来自磁盘扫描,这不是降级。GET /skill-manager/api/registry 能把各 cwd 的原始返回摊开看。
启用 / 禁用的机制
DSH 本身没有 skill 开关。这里用改名实现,且是双向可逆的:
//SKILL.md ⇄ //SKILL.md.disabled
/.md ⇄ /.md.disabled
.disabled 后缀不匹配 provider 的发现规则(目录包只认 SKILL.md,平铺只认 .md),所以改完名下一条扫描就看不到它了;文件一个字节都没动,随时能改回来。
安全边界
所有文件动作的目标都不是从请求体里信任的,而是重新扫描后核对过的:
- 目标必须落在已知 skill 根目录之内;
- 必须是根下一层的 skill 条目(目录包或平铺文件),根目录自身不行;
- bundled 根下的一律拒绝(403);
- 客户端传的路径先 resolve() 规范化,.. 穿越会被前缀检查挡掉。
HTTP API
全部挂在 /skill-manager/api:
| 方法 | 路径 | 说明 |
| GET | /health | 自检:home、agentsHome、bundledDir、注册表是否可用 |
| GET | /list | 完整清单:projects / roots / skills / registryAvailable |
| GET | /registry | 诊断:把 ctx.skills.list() 的原始返回按 cwd 逐个摊开 |
| POST | /toggle | { target } → 改名启停 |
| POST | /delete | { target } → 删除 |
| POST | /read | { target } → 返回 SKILL.md 正文(>512 KB 拒绝) |
| POST | /reveal | { target } → 资源管理器定位(仅 Windows) |
安装
先克隆到本地(路径里别带空格),再用 dsh plugin 以 file: 依赖把它装进 profile:
git clone https://github.com/Nay-1/dsh-skill-manager.git C:/dsh-plugins/dsh-skill-manager
dsh plugin --profile desktop add "file:C:/dsh-plugins/dsh-skill-manager"
desktop 是 profile 名,按你自己的改。装完确认 profile 的 package.json 里 dsh.profile.bundles 有 dsh-skill-manager —— 只有进了 bundles,cordis.patch.yml 那行插入才会生效*(dsh plugin add 通常会自动加,加不上就手动补一行)。
改了源码之后
pnpm 的 file: 依赖是拷贝而不是软链,而且它只看 lockfile:直接再 add 一次只会得到
Already up to date,磁盘上的拷贝不会更新。必须先 remove 再 add:
dsh plugin --profile desktop remove dsh-skill-manager
dsh plugin --profile desktop add "file:C:/dsh-plugins/dsh-skill-manager"
另外 host 半和 client 半都只在 DSH 启动时加载一次(没有热重载),改完必须重启桌面端。
卸载:
dsh plugin --profile desktop remove dsh-skill-manager
然后从 dsh.profile.bundles 里删掉同名条目。
改源码后必须重装一次再重启 DSH:pnpm 的 file: 依赖是拷贝而不是软链。
结构
dsh-skill-manager/
├── package.json 插件清单;dsh.bundle.patch 指到 cordis.patch.yml ├── cordis.patch.yml bundle 层:插入本插件 ├── lib/index.js host 半:扫描 + HTTP API + 文件动作 ├── lib/client.js client 半:settings.section 页面 ├── test-host.mjs host 半自测(62 项) └── test-client.mjs client 半自测(43 项)
node test-host.mjs # 临时目录里造真实 skill 树,打 API
node test-client.mjs # mock Module Loader / React / fetch,真渲染一遍页面
已知限制
- 项目根靠猜:DSH 的 host 插件拿不到"当前会话的工作目录",只能拿进程 cwd 和工作区账本。项目级 skill 因此可能比你预期多列或少列几个。
- 不改 provider:禁用是磁盘改名,不是给 skill 系统加开关;正在跑的会话里已经加载过的 skill 不受影响。
- 删除就是删除:rm -rf 掉 skill 目录,没有回收站。
- 预览只显示 SKILL.md 原文(不渲染 Markdown),够用来核对内容。
- 非 Windows 平台没有"打开目录",接口会返回 revealed: false。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Nay-1/dsh-skill-manager
在设置面板里分组查看并启用禁用本机 agent skill
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,225未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,370已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13941 个插件含 PR 收录与…
★ 355已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
这是你的仓库?认领条目