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

技能自管理 fuxin123z/dsh-skill-manage

DeepSeek 客户端
fuxin123z74 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

让智能体在运行时创建、修补和删除自己的技能

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

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

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/fuxin123z/dsh-skill-manage.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
暂无时间戳·判据 →
装得上吗[实装验证]—
该类项目属生态应用(桌面端 / Web 外壳),不以 dsh plugin add 方式安装,请按仓库说明部署
数据截至 2026/09/25·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 74 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(unknown · 2026/9/25) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件
查看扫描证据(共 54 处,展示前 33 条)
  • 读取本地文件
    index.js:78
    try { await lstat(path.join(current, '.git')); return current } catch { }
  • 读取本地文件
    index.js:218
    await readFile(skillMd, 'utf8')
  • 读取本地文件
    index.js:223
    await readFile(fileMd, 'utf8')
  • 写入本地文件
    index.js:244
    await mkdir(path.dirname(target), { recursive: true })
  • 写入本地文件
    index.js:246
    await writeFile(tmp, content, 'utf8')
  • 写入本地文件
    index.js:247
    await rename(tmp, target)
  • 读取本地文件
    index.js:262
    try { st = await lstat(dir) } catch { return `Skill directory not found: ${dir}` }
  • 读取本地文件
    index.js:266
    const resolvedRoot = await realpath(root).catch(() => root)
  • 读取本地文件
    index.js:267
    const resolved = await realpath(dir).catch(() => dir)
  • 删除本地文件
    index.js:391
    await rm(found.skillMd, { force: true })
  • 删除本地文件递归
    index.js:398
    await rm(found.dir, { recursive: true, force: true })
  • 删除本地文件
    index.js:428
    await rm(r.target, { force: true })
  • 删除本地文件递归
    index.js:433
    if (!entries.length) await rm(parent, { recursive: true, force: true }).catch(() => {})
  • 读取本地文件
    loadtest.mjs:77
    const onDisk = readFileSync(path.join(REAL_ROOT, NAME, 'SKILL.md'), 'utf8')
  • 读取本地文件
    loadtest.mjs:88
    assert.ok(!existsSync(path.join(REAL_ROOT, NAME)), 'directory removed')
  • 删除本地文件递归
    test.mjs:18
    rmSync(SANDBOX, { recursive: true, force: true })
  • 写入本地文件
    test.mjs:19
    mkdirSync(SKILLS, { recursive: true })
  • 读取本地文件
    test.mjs:47
    check('file exists', existsSync(path.join(SKILLS, 'smoke-test-skill', 'SKILL.md')))
  • 读取本地文件
    test.mjs:48
    check('agent marker injected', readFileSync(path.join(SKILLS, 'smoke-test-skill', 'SKILL.md'), 'utf8').includes('created_by: agent'))
  • 写入本地文件
    test.mjs:63
    mkdirSync(path.join(SKILLS, 'smoke-test-skill', 'references'), { recursive: true })
  • 写入本地文件
    test.mjs:85
    mkdirSync(path.join(SKILLS, 'market-skill'), { recursive: true })
  • 读取本地文件
    test.mjs:105
    check('directory gone', !existsSync(path.join(SKILLS, 'smoke-test-skill')))
  • 读取本地文件
    test.mjs:119
    const crlfDisk = readFileSync(path.join(SKILLS, 'smoke-crlf', 'SKILL.md'), 'utf8')
  • 读取本地文件
    test.mjs:145
    check('empty references dir pruned', !existsSync(path.join(SKILLS, 'smoke-test-skill', 'references')))
  • 读取本地文件
    test.mjs:152
    const dollarDisk = readFileSync(path.join(SKILLS, 'smoke-test-skill', 'SKILL.md'), 'utf8')
  • 删除本地文件递归
    test.mjs:167
    rmSync(PROJECT, { recursive: true, force: true })
  • 写入本地文件
    test.mjs:168
    mkdirSync(NESTED, { recursive: true })
  • 写入本地文件
    test.mjs:169
    mkdirSync(path.join(GIT_ROOT, '.git'), { recursive: true })
  • 写入本地文件
    test.mjs:178
    mkdirSync(noGitDir, { recursive: true })
  • 删除本地文件递归
    test.mjs:181
    rmSync(noGitDir, { recursive: true, force: true })
  • 删除本地文件递归
    test.mjs:182
    rmSync(PROJECT, { recursive: true, force: true })
  • 删除本地文件
    test.mjs:249
    rmSync(path.join(SKILLS, 'flat-skill.md'), { force: true })
  • 删除本地文件递归
    test.mjs:266
    rmSync(SANDBOX, { recursive: true, force: true })
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 运行时创建技能
  • 修补与删除技能
  • 热重载与删除防护

DSH 插件:由智能体管理的过程记忆——skill_manage 工具让智能体在运行时写入、打补丁、禁用和删除自己的技能(用户 + 项目范围),支持热重载和分层删除防护。

README

由 DeepSeek 最新模型翻译生成
dsh-skill-manage npm version License: MIT Awesome DSH Plugin 一个 DSH (DeepSeek Harness) 插件,为智能体赋予程序性记忆:一个 skill_manage 工具,用于编写自己的技能——创建、修补、禁用、删除——并带有分层删除保护。它构建在 skill-filesystem 的热重载监听器之上,因此在会话中途创建的技能可在同一会话中立即使用,无需重启。 与 dsh-auto-memory 搭配使用可实现声明式记忆:后者记住事实(日志、笔记、偏好),而本插件记住如何做事(工作流、陷阱、流程)。 它新增了什么 skill_manage 工具——动作:create / patch / edit / delete / disable / enable / pin / unpin / write_file / remove_file / list - 两种作用域——scope: 'user'(默认,~/.dsh/skills,适用于所有工作区)或 scope: 'project'(/.dsh/skills,仅限当前工作区)。项目根目录的解析方式与 harness 自身的技能查找完全一致:从会话 cwd 向上查找到最近的 .git,若找不到则回退到 cwd 本身。list 会在同一张表中显示两种作用域。
展开完整文档(README 剩余 1 节)
dsh-skill-manage

npm version
License: MIT
Awesome DSH Plugin

一个 DSH (DeepSeek Harness) 插件,为智能体赋予程序性记忆:一个 skill_manage 工具,用于编写自己的技能——创建、修补、禁用、删除——并带有分层删除保护。它构建在 skill-filesystem 的热重载监听器之上,因此在会话中途创建的技能可在同一会话中立即使用,无需重启。

与 dsh-auto-memory 搭配使用可实现声明式记忆:后者记住事实(日志、笔记、偏好),而本插件记住如何做事(工作流、陷阱、流程)。

它新增了什么

skill_manage 工具——动作:create / patch / edit / delete / disable / enable / pin / unpin / write_file / remove_file / list

- 两种作用域——scope: 'user'(默认,~/.dsh/skills,适用于所有工作区)或 scope: 'project'(/.dsh/skills,仅限当前工作区)。项目根目录的解析方式与 harness 自身的技能查找完全一致:从会话 cwd 向上查找到最近的 .git,若找不到则回退到 cwd 本身。list 会在同一张表中显示两种作用域。
- 两种磁盘布局——目录式技能(//SKILL.md,即 create 写入的形式)和单文件技能(/.md),与 skill-filesystem 监听器实际加载的两种布局相匹配。list 会显示 layout 标志;单文件技能会拒绝支持文件相关操作。
- 禁用/启用(可逆)——切换 SKILL.md frontmatter 中的 disable-model-invocation,这正是 harness 技能目录过滤所依据的键(isModelInvocable)。禁用会在不触碰内容的情况下将技能从模型目录中隐藏;启用则恢复它。对于季节性技能或脱离上下文的技能,优先使用 disable 而非 delete。
- 固定/取消固定(可逆)——切换删除保护所读取的同一个 pinned frontmatter 标志。被固定的技能无法通过 skill_manage 删除(仍允许 patch/edit);请固定那些必须在清理中幸存的技能。
- 触发纪律(英文,静态系统提示词部分,缓存稳定):当复杂任务成功完成(5 次以上工具调用)、错误被克服、用户纠正的方法被证明有效,或用户要求记住某个流程时,创建技能;当技能遇到未覆盖的陷阱时,立即修补。
- 删除保护:
- 只有带有 created_by: agent frontmatter 标记的技能才可删除——市场/用户技能会被拒绝
- pinned: true frontmatter 会阻止删除(仍允许 patch/edit)
- 路径限制在解析后的技能根目录内;符号链接的技能目录会被拒绝
- 名称漂移保护:patch/edit 无法静默重命名技能
- 校验:名称正则 + 长度,frontmatter 要求包含 name + description,description ≤1024 字符,SKILL.md ≤100k 字符,支持文件 ≤1 MiB,支持路径限定在 references/ templates/ scripts/ assets/ 内
- 原子写入(临时文件 + 重命名),因此监听器永远不会看到写入一半的 SKILL.md
- CRLF 安全的 frontmatter 解析

安装

方式 A — 通过 dsh plugin(推荐;自动处理下面两个步骤):

dsh plugin --profile web add dsh-skill-manage

方式 B — 手动 npm 安装,在你的 DSH profile 目录中(例如 ~/.dsh/profiles/web):

1. 添加依赖
npm install dsh-skill-manage # 或:pnpm add dsh-skill-manage

2. 在 package.json → dsh.profile.bundles 中注册该 bundle:
"dsh": { "profile": { "bundles": [ ..., "dsh-skill-manage" ] } }

3. 重启 dsh web

该插件无需配置。日志行 [dsh-skill-manage] ready 确认其已加载。

从源码安装(本地链接) — 用于开发:

在你的 DSH profile 目录中(例如 ~/.dsh/profiles/web)
1. package.json 依赖: "dsh-skill-manage": "link:/abs/path/to/dsh-skill-manage"
2. dsh.profile.bundles:追加 "dsh-skill-manage"
pnpm install
3. 重启 dsh web

开发与测试

node test.mjs # 守卫级冒烟测试(73 个用例,沙箱化 DSH_HOME)
node loadtest.mjs # 宿主形态契约 + 真实往返(设置 DSH_HOME 以将其沙箱化)

CI 在每次 push/PR 时运行两者(.github/workflows/ci.yml)。

v0 已知限制

- 嵌套分类目录(///SKILL.md)不会被列出或操作 — harness 监听器也不会加载它们(它只加载 //SKILL.md 和 /.md)
- frontmatter 中不支持 YAML 流式集合(tags: [a, b] 会保持为原始字符串)
- 项目作用域假设每个会话只有一个根(会话 cwd 的 git 根)

许可证

MIT
预览分享卡片长什么样 ↓fuxin123z/dsh-skill-manage
分享 · DeepSeek Harness Hub
fuxin123z/dsh-skill-manage

让智能体在运行时创建、修补和删除自己的技能

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部