dsh-skill-managers

DSH PLUGIN记忆与知识

仓库 mrdhira/dsh-skill-managers

记忆与知识 L4 · 沙盒安装通过 安全审查:低风险 可信度:银 可安装插件
安装这个插件

dsh-skill-managers 是 mrdhira 维护的 记忆与知识 类 DSH 可安装插件, 仓库为 mrdhira/dsh-skill-managers,许可证 MIT。 下面按「装什么、怎么装、验没验过、跑起来要注意什么」逐项列出。

一句话选型结论

按资料字段整理

dsh-skill-managers 是记忆与知识类的 DSH 可安装插件,验证等级 L4 · 沙盒安装通过,安全审查为低风险,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类记忆与知识 收录类型可安装插件 验证等级L4 · 沙盒安装通过 安全审查低风险
验证等级 L4 L4 · 沙盒安装通过
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-10-17 创建于 2026-10-16
README 13.8 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:mrdhira/dsh-skill-managers
  1. 1
    确认版本与运行环境

    仓库没有标注兼容版本与 Node.js 要求,先确认你的 DSH 版本能装,再继续。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本未标注版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

记忆与知识
字段来自项目仓库与公开索引,中文说明由本站标注

适用场景

文件读写联网搜索

上游标签

developer-toolsdshdsh-pluginelectronsidebarskill-discoveryskillstypescript

验证等级与安全审查

L4 · 沙盒安装通过
自动化流程结论,不是人工审核
验证等级L4 · 沙盒安装通过安装命令在隔离沙盒内真实执行成功,无依赖错误
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度银综合仓库活跃度与验证结果

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L4:在沙盒里真实装过,依赖能装上,不是纸面声明。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在记忆与知识场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-skill-managers当前 L4 · 沙盒安装通过 低风险 0 未标注 有
ruflo L3 · 安装规范通过 低风险 7.4 万 未标注 无
OpenViking L3 · 安装规范通过 低风险 3.9 万 未标注 无
WeKnora L4 · 沙盒安装通过 低风险 3.3 万 未标注 有
distilly L4 · 沙盒安装通过 低风险 2.5 万 未标注 有
EverOS L4 · 沙盒安装通过 低风险 1.3 万 未标注 有

仓库档案

记忆与知识
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方mrdhira仓库 dsh-skill-managers · 默认分支 main
分类记忆与知识knowledge
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言未标注仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-10-16 · 2026-10-17最后推送 2026-10-17
本站收录2026-10-30首次进入本站目录的时间

README 全文

13.8 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-skill-managers

A Skills page for the DSH Web GUI — its own sidebar entry beside Plugins, listing every skill
DSH can see, grouped All · Global · Workspaces, with search, copy-command, per-skill origin, and
the roots DSH discovers skills from.

Why

The page exists because DSH shows a cold session almost none of your skills, and the reason is
structural rather than a bug.

The client reaches skills through skills/list — a session-addressed Remote. DSH deliberately
keeps filesystem discovery out of the host layer:

# dsh-web-app/cordis.patch.yml
# the base host `skill-filesystem` row is disabled here (presets own local discovery)
- id: skill-filesystem
disabled: true

So ~/.dsh/skills and /.dsh/skills exist only inside a live agent's preset scope. A
cold session falls back to the global layer, which carries no filesystem provider:

// dsh-api-session-controller/lib/types/skill-catalog.js
const scoped = live === undefined ? undefined : presets?.serviceFor(live, 'skills');
const skillRegistry = scoped ?? this.ctx.get('skills');   // ← cold session

The first version of this page therefore showed four pathless entries — three Office skills plus a
plugin-registered one — and nothing from ~/.dsh/skills.

The fix is not to view per session. It is to register a global provider that scans the roots
itself. Because the catalog falls back to the global layer, every session then sees the complete set,
and the browser half is free to present categories rather than sessions. The session remains only as
transport.

Quick Start

The plugin installs into your DSH profile by link — it is not published to npm, so the clone is
the source. Both routes end with a restart.

Option A — the script

git clone https://github.com/mrdhira/dsh-skill-managers.git ~/.dsh/plugins/dsh-skill-managers
cd ~/.dsh/plugins/dsh-skill-managers
./install.sh                 # builds, registers in your profile, runs pnpm install

It accepts --profile to target a profile other than ~/.dsh/profiles/desktop, --check to
report what would change without writing anything, and --remove to unregister.

Option B — the manual steps

1. Clone it somewhere stable (this path becomes your install path):

git clone https://github.com/mrdhira/dsh-skill-managers.git ~/.dsh/plugins/dsh-skill-managers
cd ~/.dsh/plugins/dsh-skill-managers

2. Build it. pnpm install runs the prepare script, which builds lib/** — the part DSH
actually loads. It is generated; never hand-edit it.

pnpm install

3. Register it with your profile — the dependency and the bundle name, with an absolute path:

{
"dependencies": {
"dsh-skill-managers": "link:/Users//.dsh/plugins/dsh-skill-managers"
},
"dsh": {
"profile": {
"bundles": [
"dsh-skill-managers"
]
}
}
}

4. Install the link, then restart DSH:

cd ~/.dsh/profiles/desktop && pnpm install

Nothing needs adding to cordis.patch.yml: the bundle declares its own Loader row.

> Restart, don't reload. The host half loads once per app process, so a host-side change needs a
> full quit and reopen (⌘Q, then reopen). A page reload does not pick it up. A client-side (UI)
> change needs the bundle toggled in the plugin manager.

Verify it is really working

A Skills entry should appear in the sidebar beside Plugins, listing your skills. If it does
not:

  • lib/v1/index.js exists — if not, pnpm install did not finish building;
  • the profile's package.json names dsh-skill-managers in both dependencies and
    dsh.profile.bundles;
  • DSH was restarted after installing.

Two ways to see it clearly:

# the host half answers with its Loader identity
node -e "import('./lib/v1/index.js').then(m => console.log(m.name))"   # dsh-skill-managers

# what the page will list, straight from the roots (no DSH needed)
find ~/.dsh/skills ~/.agents/skills -maxdepth 2 -name SKILL.md 2>/dev/null

Configure

There is nothing to configure. The plugin reads the catalog the host already serves through the
existing skills/list Remote, and scans the roots below on its own. No settings, no patch fields —
its whole surface is the page.

What it scans, ranked to mirror @deepseek-ai/dsh-skill-filesystem so a duplicate name resolves the
same way it does inside a preset:

Rank Root Source
100 /.dsh/skills project-dsh
200 /.agents/skills project-agents
400 ~/.dsh/skills user-dsh
500 ~/.agents/skills user-agents
600 shipped with the app bundled (app providers)

Workspaces come from the live workspaces service, so a new workspace appears without a code change
or a restart.

How it Works

The host half registers one global skill provider that scans the roots above. The browser half
renders the catalog through two slot contributions under the key skills: a sidebar.panellist
entry (the sidebar item, drawing between Plugins at 0 and Automation tasks at 10), and a main
panel that receives its services through inject.

┌ Skills ─────────────────────────────────── [ search ]  [ Refresh ]
│ 17 skills · 4 in a workspace
│
│  All 17   Global 13   Workspaces 4
│
│  WORKSPACE · default-workspace                    4
│  workspace  /caveman                                    [ Copy ]
│  Terse caveman voice: answer first, fluff gone.         ▶ show path
│
│  GLOBAL                                          13
│  global  /ponytail                                      [ Copy ]
│  Forces the laziest solution that actually works.       ▶ show path
│
│  BUNDLED                                          3
│  bundled  /office-docx                                  [ Copy ]
└──────────────────────────────────────────────────────────────────
Category What it shows
All Everything the provider found, grouped by origin
Global ~/.dsh/skills, ~/.agents/skills, bundled, and other non-project roots
Workspaces Skills under each registered workspace's .dsh/skills / .agents/skills

Origins

skills/list returns only { name, path?, description, whenToUse?, modelInvocable } — source,
provider and resourceBase are stripped. Origin is therefore derived from the path, with one
honest exception: a skill whose provider supplies no path (bundled Office, or a skills.register()
call) is labelled bundled rather than implying an error.

Label Matched when
workspace the path is under a registered workspace
global the path contains /.dsh/skills/ or /.agents/skills/
bundled no path, or a shipped root (dsh-agent-preset/skills, office-skills)
other anywhere else

Requirements

  • DSH with the Web GUI, and a profile you can edit (~/.dsh/profiles//).
  • Node.js 22+ and pnpm to build from source. The built artifact needs nothing extra at
    runtime.

Development

pnpm install        # deps + build (prepare)
pnpm build          # src/** -> lib/v1/**
pnpm typecheck      # three projects: host, browser half, tests
pnpm test           # builds first, then runs the suite (25 tests)
src/host/index.ts     the global skill provider that scans the discovery roots -> lib/v1/index.js
src/client/index.cts  sidebar entry, page, categories, catalog fetch          -> lib/v1/client.js
types/dsh.d.ts        observed (not published) DSH contract declarations
test/host.test.ts     provider coverage against real temp trees
test/client.test.ts   jsdom + React coverage of the page
test/harness.ts       the shared jsdom realm and mount helpers
test/build.test.ts    the freshness gate: artifacts exist, mirror src, are not stale
build.mjs             esbuild: host ESM unbundled, client CJS + loader handshake
cordis.patch.yml      the one Loader row the bundle contributes

src/client/index.cts is CommonJS to both esbuild and tsc (.cts), because the loader's factory
returns module.exports; build.mjs wraps it in the window.__ModuleLoader__.load({…}) handshake.
src/host/index.ts is ESM for the Loader.

Build before you test. The tests import the generated lib/**, so a run against a stale build is
green and wrong. pnpm test builds for you via pretest.

Testing and Validations

25 tests across four files. The host half is exercised against real temp trees — it builds a
directory layout on disk, points DSH_HOME at it, and asserts what the provider returns — because
the provider's whole job is reading the filesystem. The browser half mounts the real bundle under
jsdom by evaluating the file through a stub window.__ModuleLoader__, the same path the browser
takes.

What the suite proves beyond "the code runs":

  • the freshness gate (build.test.ts): both halves have artifacts, no artifact predates its
    source, the entrypoints main/exports name exist, no generated file imports outside the package,
    and the client bundle carries a build id naming the package and version. That gate's absence is how
    a sibling plugin shipped tests that validated stale bytes.
  • non-vacuity: five mutation probes, each failing only its own test — workspace rank 400 → 999;
    inverted disable-model-invocation; pathless skills classified global instead of bundled; a
    source touched without a rebuild; a built artifact deleted.
  • memory discipline: the suite runs through scripts/guard.mjs, which watches the whole process
    tree and kills it past the cap (exit 124 — bisect, never raise it). One jsdom realm is shared
    across mounts rather than rebuilt per test, because a realm is megabytes of native state.

Measured on Node v24: the full suite peaks around 190 MB under a 1 GB limit.

Contributing

One author: Dhira Wigata. Every commit is authored and committed by him, and CI re-checks the
whole history for a single identity and for machine-attribution trailers — so --no-verify locally
does not get a commit past CI. Signed-off-by: is fine. See AGENTS.md for the gates a
change must pass: build, typecheck across three projects, and the suite.

Issues and pull requests are welcome.

What it looks like

The page as it opens, at the width the app actually gives it: DSH's own computeColumns() resolves a
1440×900 window to a 280px sidebar and a 1160px centre column, and that is the canvas below. The
page then centres its own 900px column inside it. Every colour is one of the app's theme tokens.

light dark

The same page after a real click on Global and on a skill's show path toggle — the filtered
view and the expanded row, rendered by the component rather than staged for the shot.

light dark

All four come from scripts/capture-panel.mts, which renders the real bundle through
test/harness.ts — the same path test/client.test.ts takes, including its fake skills Remote —
injects the real stylesheet the bundle itself ships, and resolves the --dsw-* tokens out of the
installed app.asar. Nothing is mocked and no colour is hand-picked. Run it with:

node ~/.dsh/scripts/guard/guard.mjs --limit-mb 2560 -- \
node --max-old-space-size=384 scripts/capture-panel.mts

The discovery flow

The table under Configure is the ranking; this is the path a skill takes to reach the
page. It is worth a diagram because there genuinely are two entry points — this plugin's global
provider and the app's own bundled ones — and because "which root wins" is a question the page's
Global / Workspaces tabs are the visible half of.

flowchart TD
subgraph scan["the global provider this plugin registers"]
A["workspace .dsh/skillsrank 100 · project-dsh"]
B["workspace .agents/skillsrank 200 · project-agents"]
C["~/.dsh/skillsrank 400 · user-dsh"]
D["~/.agents/skillsrank 500 · user-agents"]
end
E["the app's own providersbundled Office · plugin skills.register"]
A --> M["candidates merged at the global layer"]
B --> M
C --> M
D --> M
E --> M
M --> N["skills/list for the session"]
N --> O{"retained session?else newest ordinary one"}
O --> P["All · Global · Workspacesorigin derived from the path"]
  • A cold session now sees the same catalog as a live one. The catalog read falls back to the
    global layer, and this provider is registered there, so the four pathless entries the page used to
    show are joined by everything on disk. The session is only transport.
  • Workspaces are read live from the workspaceRegistry, so a workspace added in the app appears
    with no code change and no restart; each contributes both of its roots at ranks 100 and 200.
  • Project beats user on a duplicate name. The ranks mirror
    @deepseek-ai/dsh-skill-filesystem so a name resolves here the same way it does inside a preset.
  • Bundled skills never enter this scan. They arrive from the app's own global providers, which is
    why a skill with no path is labelled bundled rather than treated as an error.
  • Origins are derived, not reported. skills/list strips source and provider, so the page
    classifies by path — see Origins.

LICENSE

MIT © Dhira Wigata

常见问题

6 问
答案由本站依据条目字段整理,不引用上游原文
dsh-skill-managers 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:mrdhira/dsh-skill-managers` 即可。

dsh-skill-managers 的验证等级是什么意思?

L4 · 沙盒安装通过。安装命令在隔离沙盒内真实执行成功,无依赖错误

dsh-skill-managers 安全吗?

低风险。

dsh-skill-managers 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-skill-managers 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

记忆与知识
按星标排序,可作替代方案

ruflo

ruflo

L3 · 安装规范通过 7.4 万 星

OpenViking

OpenViking

面向 DeepSeek Harness 的 OpenViking 记忆与上下文插件:pre-step 自动召回与画像注入、会话捕获、`vik

L3 · 安装规范通过 3.9 万 星

WeKnora

WeKnora

把 WeKnora 知识库接入 dsh 的四个只读工具:列出知识库、混合检索原文片段、按顺序还原单篇文档,以及直接取用 WeKnora 自己

L4 · 沙盒安装通过 3.3 万 星

distilly

distilly

Distilly — Distill how they think into reusable Skills for any Agent o

L4 · 沙盒安装通过 2.5 万 星

EverOS

EverOS

L4 · 沙盒安装通过 1.3 万 星

MemOS

MemOS

L4 · 沙盒安装通过 1.2 万 星

mrdhira 的其它插件

2 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 —。