DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

MT3166 /

MT3166/dsh-project-skills-mng

Verified

DSH 插件:在右侧栏浏览、编辑与管理项目级 / 全局技能(project & global skills)

★ 0 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@9f296dc3

dsh-project-skills-mng

test

在 DSH 右侧栏浏览与管理项目级技能(project skills)和全局技能(global skills)。

名字里的 mng = management:它不是"提供技能"的插件,而是管理技能的插件。 插件包名、GitHub 仓库名、右栏 tab id、Host API 路由(/dsh-project-skills-mng/api) 与 CSS 作用域统一使用 dsh-project-skills-mng 这一前缀。

DSH 原生已经会在会话里发现技能文件:项目技能位于 <projectRoot>/.dsh/skills 与 <projectRoot>/.agents/skills,全局技能位于 ~/.dsh/skills 与 ~/.agents/skills。 但这个发现过程对用户不可见,也没有 GUI 可以增删改。本插件补上这一层:

  • 右侧栏 guide 页常驻入口「项目技能」,点开才展开面板,不会自己弹出来;
  • 面板按 DSH 自己的四级发现顺序分级列出当前会话生效的技能(项目 .dsh/skills(100)→ 项目 .agents/skills(200)→ 全局 ~/.dsh/skills(400)→ 全局 ~/.agents/skills(500), 数字越小越优先),每层显示路径、条目数、缺失/只读状态与优先级数字,可单独折叠;
  • 每行显示模型可调用(M)/ 用户可调用(U)标记、链接安装(~/.dsh/skills 指向 ~/.agents/skills 的镜像)标记,以及同名的被覆盖条目;被覆盖的条目照样 可以打开、编辑、删除——操作落在它自己所在的根上,不会动到胜出的那条同名技能;
  • 支持新建、编辑、删除 SKILL.md,切换两个调用开关,frontmatter 校验与 frontmatter 之外正文的原样保留;
  • 同时注册一个 skills_manage 工具,让模型可以复用同一套读写逻辑。

面板只读写技能文件本身,不重建技能注册表——DSH 的 @deepseek-ai/dsh-skill-filesystem 已经在监听这些目录,保存后模型侧会自动看到新内容。

安装

仓库地址:https://github.com/MT3166/dsh-project-skills-mng

git clone git@github.com:MT3166/dsh-project-skills-mng.git

在 DSH 里安装克隆下来的目录(bundle 包):

plugin_manager action=install_bundle target=<本仓库绝对路径>

新装 bundle 由 HMR 直接生效;若是替换已安装的旧版本,需要重启 DSH 才会加载新的 JS。

面板

  1. 会话打开右侧栏(Ctrl+Shift+E 一类的右栏开关),点「+」或 guide 页卡片 「项目技能」;
  2. 四个层级分组按优先级排列(100 / 200 / 400 / 500),点分组头折叠,点任意一行进入详情;
  3. 详情里可以直接编辑 SKILL.md 正文与 frontmatter,保存后列表自动刷新;
  4. 工具栏可以刷新与新建技能(名称 + 描述生成 frontmatter 模板,再手动补正文)。

安全边界

  • 所有路径先过技能名白名单(^[a-z0-9]+(?:-[a-z0-9]+)*$),再做 realpath 校验, 写操作只允许落在上述四个技能根目录内;
  • 写入是 tmp 文件 + rename 的原子替换,且写前回读校验 frontmatter;
  • 删除只作用于解析后的 SKILL.md 所在技能目录,UI 会二次确认。

验证

  • test/host.test.mjs(12 项):假 ctx 覆盖 list 的四级 tier 与覆盖判定、按 rootId 读取被覆盖技能、 write→read 往返、toggle 保留正文、平铺 <name>.md 原地覆盖、skills_manage 的 create/update→write 映射、delete、非法名(../escape、a/b、UPPER、空名)、 frontmatter 名不匹配、缺失根可写、未知会话返回 SESSION_NOT_FOUND。
  • test/client.smoke.mjs(12 项):模块表格式、tab 类型/guide 卡片注册、pane body 槽注册、 zh/en key 对齐、样式注入与清理、空态零请求、相对 URL + sessionId、四级分组渲染(优先级数字、 缺失/只读提示只在异常层出现)、详情→toggle→编辑→保存往返、新建模板、被覆盖行按自身 rootId 读取/删除/编辑。
  • test/probe.mjs:在真实 ~/.dsh/skills、~/.agents/skills 上跑完整 list,得到 {project:1, global:44, total:45, shadowed:20, broken:0}、linkedCount: 20(20 条同名覆盖 按 rank 正确标出)。
  • 真实 GUI:右栏 guide 卡片「项目技能」点开即面板,四层分级与链接标记显示正常。
  • 仓库内 .dsh/skills/demo-skill 是验证用的项目技能样本,删掉不影响插件,也不在 npm files 里。

开发

node --test test/host.test.mjs
node --test test/client.smoke.mjs
node test/probe.mjs

改面板样式时不必反复重启 DSH:test/preview.mjs 会用真实的主题 token(从 @deepseek-ai/dsh-client-ui-theme 抽出)与一个迷你 React 把 client.js 渲染成静态 HTML, 输出到 test/preview-out/(list|detail|edit|create|empty × light|dark), 再用本机 Edge/Chrome headless 截图查看效果:

node test/preview.mjs
msedge --headless=new --disable-gpu --hide-scrollbars --force-device-scale-factor=2 ^
  --window-size=420,830 --user-data-dir=%TEMP%\edgeshot-list-light ^
  --screenshot=test\preview-out\list-light.png ^
  "file:///%CD%/test/preview-out/list-light.html"
  • index.js — Host 半边:/dsh-project-skills-mng/api 路由(roots/list/read/write/delete/toggle) 与 skills_manage 工具;
  • client.js — Web 客户端半边:右栏 tab 类型、guide 卡片、面板 UI(模块表格式, React 由 DSH 浏览器侧提供);
  • cordis.patch.yml — 把 dsh-project-skills-mng 这一行插入 profile;
  • locale/{en,zh}.json — bundle 的标题/描述;
  • docs/superpowers/plans/ — 设计与实现计划。

反馈

  • 面板/Host API/工具出问题:用 Bug 报告;
  • 想要新能力:用 功能建议。

License

MIT © 2026 MT3166,见 LICENSE。

—/ 5

No ratings yet

Verified DSH bundle

Commit 9f296dc310a9

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout