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

能力按需加载包 glentao-dev/dsh-capability-pack

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

按任务检索技能与连接器,用到才加载,避免撑爆上下文

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 11 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 76 处,展示前 57 条)
  • 写入本地文件
    index.js:31
    mkdirSync(STATE_DIR, { recursive: true });
  • 写入本地文件
    index.js:32
    writeFileSync(join(STATE_DIR, 'loaded.json'), JSON.stringify({
  • 读取本地文件
    index.js:64
    try { return JSON.parse(readFileSync(file, 'utf8')); } catch { return fallback; }
  • 写入本地文件
    index.js:69
    mkdirSync(dirname(file), { recursive: true });
  • 写入本地文件
    index.js:70
    writeFileSync(file, JSON.stringify(value, null, 2), 'utf8');
  • 读取本地文件
    index.js:83
    boot.safeMode = existsSync(SAFE_MODE_FLAG);
  • 读取本地文件
    index.js:213
    const entry = candidates.find((c) => existsSync(c.path))
  • 读取本地文件
    index.js:214
    ?? candidates.flatMap((c) => (c.altPaths ?? []).map((p) => ({ ...c, path: p }))).find((c) => existsSync(c.path));
  • 读取本地文件
    index.js:221
    preview = readFileSync(existsSync(file) ? file : done.path, 'utf8')
  • 读取本地文件
    index.js:221
    preview = readFileSync(existsSync(file) ? file : done.path, 'utf8')
  • 删除本地文件
    index.js:547
    try { rmSync(join(STATE_DIR, 'apply-failed.json'), { force: true }); } catch { }
  • 写入本地文件
    index.js:558
    mkdirSync(STATE_DIR, { recursive: true });
  • 写入本地文件
    index.js:559
    writeFileSync(join(STATE_DIR, 'apply-failed.json'), JSON.stringify({
  • 发起网络请求
    client.js:181
    const res = await fetch(url, { headers: { accept: 'application/json' } });
  • 发起网络请求
    client.js:188
    const res = await fetch(API.action, {
  • 写入剪贴板
    client.js:199
    try { await navigator.clipboard.writeText(text); return true; } catch {
  • 读取本地文件
    servers/dsh-fs-mcp.mjs:37
    const rows = readdirSync(dir, { withFileTypes: true }).slice(0, 500).map((e) => ({
  • 读取本地文件
    servers/dsh-fs-mcp.mjs:59
    const st = statSync(file);
  • 读取本地文件
    servers/dsh-fs-mcp.mjs:61
    const text = readFileSync(file, 'utf8').slice(0, Math.min(Number(maxChars) || 40000, 200000));
  • 读取本地文件
    servers/dsh-fs-mcp.mjs:65
    sha256: createHash('sha256').update(readFileSync(file)).digest('hex').slice(0, 16),
  • 写入本地文件
    servers/dsh-fs-mcp.mjs:84
    writeFileSync(file, String(content ?? ''), 'utf8');
  • 读取本地文件
    servers/dsh-fs-mcp.mjs:99
    const st = statSync(p);
  • 读取本地文件
    servers/dsh-fs-mcp.mjs:112
    try { return statSync(p).size; } catch { return undefined; }
  • 读取本地文件
    lib/indexer.mjs:34
    const st = statSync(file);
  • 读取本地文件
    lib/indexer.mjs:35
    if (st.size > limit) return readFileSync(file).subarray(0, limit).toString('utf8');
  • 读取本地文件
    lib/indexer.mjs:36
    return readFileSync(file, 'utf8');
  • 读取本地文件
    lib/indexer.mjs:76
    try { entries = readdirSync(dir, { withFileTypes: true }); } catch { return; }
  • 读取本地文件
    lib/indexer.mjs:82
    if (existsSync(skill)) out.push(skill);
  • 读取本地文件
    lib/indexer.mjs:93
    try { entries = readdirSync(root, { withFileTypes: true }); } catch { return out; }
  • 写入本地文件
    lib/indexer.mjs:237
    mkdirSync(STATE_DIR, { recursive: true });
  • 写入本地文件
    lib/indexer.mjs:238
    writeFileSync(INDEX_FILE, JSON.stringify(index, null, 2), 'utf8');
  • 写入本地文件
    lib/indexer.mjs:242
    writeFileSync(INDEX_TSV, tsv + '\n', 'utf8');
  • 写入本地文件
    lib/indexer.mjs:293
    mkdirSync(STATE_DIR, { recursive: true });
  • 读取本地文件
    lib/skills.mjs:10
    try { return JSON.parse(readFileSync(LEDGER, 'utf8')); } catch { return {}; }
  • 写入本地文件
    lib/skills.mjs:14
    mkdirSync(STATE_DIR, { recursive: true });
  • 写入本地文件
    lib/skills.mjs:15
    writeFileSync(LEDGER, JSON.stringify(data, null, 2), 'utf8');
  • 读取本地文件
    lib/skills.mjs:43
    if (!existsSync(src)) throw new Error(`技能路径不存在:${src}`);
  • 写入本地文件
    lib/skills.mjs:48
    mkdirSync(USER_SKILLS, { recursive: true });
  • 读取本地文件
    lib/skills.mjs:52
    if (existsSync(target) && !known && !force) {
  • 删除本地文件递归
    lib/skills.mjs:58
    try { rmSync(target, { recursive: true, force: true }); } catch { }
  • 写入本地文件
    lib/skills.mjs:61
    writeFileSync(join(target, INSTALL_MARKER), JSON.stringify({
  • 删除本地文件递归
    lib/skills.mjs:83
    try { rmSync(rec.target, { recursive: true, force: true }); } catch (e) {
  • 读取本地文件
    lib/skills.mjs:98
    present: existsSync(rec.target),
  • 读取本地文件
    lib/skills.mjs:105
    try { files = readdirSync(USER_SKILLS, { withFileTypes: true }); } catch { return { skills: 0, chars: 0 }; }
  • 读取本地文件
    lib/skills.mjs:110
    if (!p.toLowerCase().endsWith('.md') || !existsSync(p)) continue;
  • 读取本地文件
    lib/mcp.mjs:51
    try { raw = JSON.parse(readFileSync(MCP_REGISTRY_FILE, 'utf8')); } catch { }
  • 写入本地文件
    lib/mcp.mjs:61
    mkdirSync(dirname(MCP_REGISTRY_FILE), { recursive: true });
  • 写入本地文件
    lib/mcp.mjs:62
    writeFileSync(MCP_REGISTRY_FILE, JSON.stringify({ version: 1, servers }, null, 2), 'utf8');
  • 执行外部命令来自配置/变量
    lib/mcp.mjs:81
    this.child = spawn(command, args, {
  • 发起网络请求
    lib/mcp.mjs:103
    const init = await this.request('initialize', {
  • 发起网络请求
    lib/mcp.mjs:175
    const res = await this.request('tools/list', cursor ? { cursor } : {});
  • 发起网络请求
    lib/mcp.mjs:184
    return this.request('tools/call', { name, arguments: args ?? {} });
  • 发起网络请求
    lib/mcp.mjs:188
    try { return (await this.request('resources/list', {}))?.resources ?? []; } catch { return []; }
  • 发起网络请求
    lib/mcp.mjs:214
    const res = await fetch(this.server.url, {
  • 发起网络请求
    lib/mcp.mjs:241
    await fetch(this.server.url, {
  • 读取本地文件
    lib/mcp.mjs:366
    export function registryExists() { return existsSync(MCP_REGISTRY_FILE); }
  • 写入本地文件
    lib/mcp.mjs:367
    export function ensureRegistryDir() { mkdirSync(dirname(MCP_REGISTRY_FILE), { recursive: true }); }
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 工作台:专家、技能、连接器,支持懒加载和启动安全防护

README

由 DeepSeek 最新模型翻译生成
DSH 能力中心(dsh-capability-pack) 把 DSH 的技能和 MCP 连接器从「启动即预载」改成「提问时检索、需要时加载」,并给启动过程加一层防崩溃守卫。装完可以直接打包带走,在别的 DSH 上用同一条命令安装。 1. 它解决什么问题 | 现状 | 后果 | 本包的做法 | | 技能目录只发现顶层 SKILL.md,市场里几千个技能要么全装、要么看不见 | 全装 → catalog 撑爆上下文;不装 → 明明有却用不上 | 索引全部技能(名字+描述),按任务检索,命中后才把那个目录装进顶层 | | dsh-mcp-client 在插件激活时连服务器并注册全部工具 | 一个 150 工具的服务器约 13 万 token,小窗口模型首轮就 400 | 改成 mcp 工具按需连接:不调用 = 0 进程、0 schema、0 token | | 插件行解析不到包 / 语法错 / 重复 id | 启动报错甚至界面起不来 | doctor 静态体检 + 一键隔离;连续 2 次启动未完成自动落安全模式标记 | | 功能重复:三套 Python MCP 原型 + 聚合器 | 改一处要改三处 | 合并成一个零依赖 servers/dsh-fs-mcp.mjs + 懒加载桥 | 实测数字(本机 2026-10-24)
展开完整文档(README 剩余 1 节)
DSH 能力中心(dsh-capability-pack)

把 DSH 的技能和 MCP 连接器从「启动即预载」改成「提问时检索、需要时加载」,并给启动过程加一层防崩溃守卫。装完可以直接打包带走,在别的 DSH 上用同一条命令安装。

1. 它解决什么问题

| 现状 | 后果 | 本包的做法 |
| 技能目录只发现顶层 SKILL.md,市场里几千个技能要么全装、要么看不见 | 全装 → catalog 撑爆上下文;不装 → 明明有却用不上 | 索引全部技能(名字+描述),按任务检索,命中后才把那个目录装进顶层 |
| dsh-mcp-client 在插件激活时连服务器并注册全部工具 | 一个 150 工具的服务器约 13 万 token,小窗口模型首轮就 400 | 改成 mcp 工具按需连接:不调用 = 0 进程、0 schema、0 token |
| 插件行解析不到包 / 语法错 / 重复 id | 启动报错甚至界面起不来 | doctor 静态体检 + 一键隔离;连续 2 次启动未完成自动落安全模式标记 |
| 功能重复:三套 Python MCP 原型 + 聚合器 | 改一处要改三处 | 合并成一个零依赖 servers/dsh-fs-mcp.mjs + 懒加载桥 |

实测数字(本机 2026-10-24)

- 索引:3439 个技能,已加载 50,可按需加载 3389;
- 工具 schema 常驻开销:2 个工具 / 1434 字符 / 约 600 tokens(合并前 8 个工具约 1600 tokens);
- 未调用任何连接器时,MCP 进程数 0;
- 索引构建 1.5 – 4 秒,之后界面读取为毫秒级(磁盘索引 + 内存缓存)。

2. 安装

从 GitHub 安装(推荐给别的机器)

git clone https://github.com/glentao-dev/dsh-capability-pack.git
cd dsh-capability-pack
node tools/install.mjs --profile desktop

安装脚本会:先导入本机 WorkBuddy 目录(有的话)→ 复制包体 → 登记 dsh.profile.bundles → 更新 pnpm-lock.yaml(DSH 只认 lockfile 里的模块映射,漏了这步插件会被静默跳过)→ 重建索引 → 跑一次启动体检。装完重启 DSH。

从压缩包安装(另一台机器没有 git 时)

解压后进入 dsh-capability-pack/
node tools/install.mjs --profile desktop

--profile 省略时读环境变量 DSH_PROFILE,再退回 desktop。
脚本会:复制包到 <profile>/vendor/ 与 node_modules/ → 在 package.json 登记依赖与 dsh.profile.bundles → 追加一行 Loader 入口 → 重建索引 → 跑体检。幂等,重复执行安全。

装完重启 DSH。

通过 DSH 插件管理器(git 源)

plugin_manager action=install_bundle
target=github:glentao-dev/dsh-capability-pack

pnpm 支持 git spec,装完同样需要重启。npm 包发布后也可以直接用
dsh-capability-pack@<dsh 版本>。

从本工作区直接安装(开发时)

node dsh-capability-pack/tools/install.mjs --profile desktop

卸载

node tools/uninstall.mjs --profile desktop # 保留状态与已装载技能
node tools/uninstall.mjs --profile desktop --keep-state

3. 怎么用

3.1 模型侧:两个工具

capability action=search|load|unload|report|health
mcp action=list|tools|call

典型链路:

capability action=search query="pptx 生成" → - [skill] ppt-implement:智能 PPT 生成助手… → capability action=load name=ppt-implement capability action=load name=ppt-implement → 已加载 …/skills/ppt-implement(返回 SKILL.md 开头 30 行) skill name=ppt-implement # 用 DSH 原生 skill 工具真正读全文并执行

mcp action=list # 看有哪些连接器(不启动进程) mcp action=tools server=fs # 首次调用才 spawn,列出工具名/必填参数 mcp action=call server=fs tool=fs_read arguments={"path":"README.md"}

设计原则:检索结果永远给出下一步动作,模型不需要猜。

3.2 界面侧:工作台(六页)

输入框上方出现「工作台 已加载/总数」按钮,点开是:

| 页 | 内容 | 数据来源 |
| 首页 | 「DSH,我帮你」+ 办公/开发/设计三档场景 + 8 张提示词卡片,点一下复制到剪贴板 | 内置文案 |
| 专家 | 从本机 WorkBuddy 导入的 448 位专家 / 15 个分类:分类卡片 + 筛选 + 搜索,点「召唤」复制该专家的开场提示词;下方同时列出 DSH 智能体预设 | /capability-pack/experts + index.json presets |
| 技能 | 搜索 + 列表;未加载点「加载」,本插件装的点「卸载」 | index.json skills |
| 连接器 | MCP 注册表,可「启用/停用」(停用会立刻回收进程) | index.json mcp |
| 定时 | 6 张定时任务模板,点一下复制「帮我创建定时任务…」指令 | 内置文案 + 模型 schedule_create |
| 资料 | 只读浏览工作区:目录树 + 文本预览(≤200KB) | /capability-pack/files、/file |

数据走 GET /capability-pack/index.json,动作走 POST /capability-pack/action。
整个面板包在 ErrorBoundary 里:即使渲染抛错也只会让按钮消失,不会白屏。

3.3 命令行

node tools/build-index.mjs [--workspace DIR] [--quiet] # 重建索引
node tools/doctor.mjs check [--profile p] [--json] [--fix] # 启动体检;--fix 隔离坏行
node tools/doctor.mjs safe-mode on|off|status # 安全模式
node tools/verify-live.mjs [--wait 60] # 重启后确认插件真的生效
node tools/import-workbuddy.mjs # 导入本机 WorkBuddy 的专家/技能目录
node tools/validate-tools.mjs # 工具 schema 预检(错一条插件就起不来)
node tools/audit-tools.mjs [--json] # 谁在占工具列表 / 哪些功能重叠
node tools/install.mjs / uninstall.mjs / pack.mjs

重启后先跑这一条,比翻日志快:

$ node tools/verify-live.mjs
[1] HTTP 路由 ok 路由可达(HTTP 200) [2] 索引数据 ok 索引非空 · 技能 3439 · 已加载 50 [3] 启动守卫 ok 上次启动已标记为成功 [4] 安装登记 ok 依赖 / bundles / Loader 行 / node_modules 齐全结论:能力中心已生效。

4. 启动防崩溃

三件事配合:

1. doctor 静态体检:解析 profile 与 home 两层 cordis.patch.yml,对每个生效的插件行做包解析 → 入口存在性 → ESM/CJS 语法检查(复制成 .mjs 再 node --check,避免 .js 被当 CJS 误报),并检查 serverName 重复。--fix 把有问题的行追加 disabled: true(带备份 + 隔离清单)。
2. 安全模式:doctor safe-mode on 写 ~/.dsh/state/capability-pack/safe-mode.flag; Loader 行里 disabled: !!js "process.env.DSH_SAFE_MODE === '1'" 会整行跳过。
bin/dsh-safe.cmd(或 bin/dsh-safe.ps1)检测到标记就设 DSH_SAFE_MODE=1 再启动 —— 界面一定能起来。
3. 崩溃计数:插件 apply 时写 boot.json(本次启动时间),30 秒后仍存活即写 lastCleanAt。
下次若发现「上次启动没有正常结束」,crashCount++;连续 2 次就自动写安全模式标记。

本机第一次跑 doctor check 就抓到两行真实坏配置(dsh-vision-router、@michengai/dsh-agency-agents 在 profile 里没有安装),已隔离并记录到 ~/.dsh/state/capability-pack/quarantine.json。

4.5 数据从哪来:本机 WorkBuddy

能力中心的「专家」和一部分「技能」不是编的,是从本机已装的 WorkBuddy 目录里读出来的(全程离线):

| WorkBuddy 文件 | 内容 | 我们用在哪 |
| ~/.workbuddy/app/cache/experts/manifest.json | 448 位专家、15 个分类、职业/标签/开场提示词 | 工作台 → 专家页 |
| ~/.workbuddy/.skill-list-cache.json | 已装技能清单(名称/描述/SKILL.md 路径) | 工作台 → 技能页(带 WB 标记) |
| ~/.workbuddy/skills/*/SKILL.md | 技能正文 | capability action=load 复制进 DSH 技能根后即可被 skill 工具加载 |

node tools/import-workbuddy.mjs # 生成 data/workbuddy-catalog.json(约 290 KB)
node tools/build-index.mjs # 让技能索引包含 WB 技能

WorkBuddy 没装 / 没启动过时:脚本会输出「没读到专家清单」,其余功能照常。
专家头像在 WorkBuddy 里是远端资源,这里不热链,改用「首字母 + 分类色」的方块。

5. 目录结构

dsh-capability-pack/
├── index.js Host 插件:2 个工具 + 2 条路由 + 启动守卫 ├── client.js Client 插件:工作台六页面板(原生 React,无外部依赖) ├── cordis.patch.yml bundle 的 Loader 行(带安全模式条件) ├── package.json dsh.bundle.patch + dsh.client 声明 ├── lib/ │ ├── paths.mjs 全部路径常量(DSH_HOME / 技能根 / 状态目录) │ ├── indexer.mjs 扫技能根、解析 frontmatter、去重、检索打分 │ ├── skills.mjs 装载/卸载技能(带 ledger,拒绝删别人的技能) │ └── mcp.mjs 懒加载 MCP 桥:stdio(含 Content-Length 帧)+ Streamable HTTP ├── servers/ │ └── dsh-fs-mcp.mjs 零依赖 MCP 文件服务器(合并了原来的三套 Python 原型) ├── tools/ │ ├── build-index.mjs CLI 建索引 │ ├── doctor.mjs 启动体检 / 隔离 / 安全模式 │ ├── install.mjs 安装(幂等) │ ├── uninstall.mjs 卸载 │ ├── verify-live.mjs 运行时自检(HTTP/索引/守卫/登记四层) │ ├── import-workbuddy.mjs 导入本机 WorkBuddy 的 448 位专家 + 技能清单 │ ├── validate-tools.mjs 工具 schema 预检(additionalProperties 等硬规则) │ ├── audit-tools.mjs 工具面审计:谁占了工具列表、哪些功能重叠 │ └── pack.mjs 打 zip(自带 ZIP 写入器,不依赖 7z/PowerShell) ├── data/mcp-servers.example.json ├── data/workbuddy-catalog.json WorkBuddy 专家/技能目录(import 生成) ├── docs/protocol-spec.md MCP 协议速查 ├── docs/plugin-audit.md 工具面审计结论与整合建议(含可回滚命令) ├── bin/dsh-safe.cmd|ps1 安全模式启动器 ├── locale/{zh,en}.json 插件标题/描述(插件管理器显示) ├── icon.svg └── manifest.json 组件清单与安装效果说明

6. 数据文件(都在 ~/.dsh/state/capability-pack/)

| 文件 | 作用 |
| index.json | 能力索引(技能/预设/连接器 + counts) |
| index.tsv | 同一份数据的制表符版,方便 rg |
| mcp-servers.json | MCP 注册表(这是唯一需要手填的文件) |
| installed.json | 本插件装载过的技能账本(卸载只认这个) |
| boot.json | 启动守卫:尝试次数、连续未完成次数、最近正常时间 |
| safe-mode.flag | 安全模式标记(存在即跳过本插件) |
| quarantine.json | doctor 隔离清单 |

7. 安全边界

- 只删自己装的:unload 只处理 installed.json 里登记、且路径仍在技能根之内的目录;用户自己的技能一律拒绝。
- MCP 服务器受根目录限制:dsh-fs-mcp.mjs 所有路径必须落在 DSH_FS_MCP_ROOT 内,越界直接报错(自检覆盖了这条)。
- 技能名净化:safeSkillName 去掉路径分隔符与 ..,不会写到技能根之外。
- 不改别人的配置:只追加自己的行;--fix 与安装都先写 .bak- 备份。
- HTTP 路由只读+白名单动作:install-skill / remove-skill / toggle-mcp / rebuild-index,无任意命令执行。

8. 已知限制

- 专家只做「召唤」(复制开场提示词),不做运行时人设注入:DSH 的“专家”等价物是智能体预设,要真正换人设得在「设置 → 智能体预设」切换;把 WorkBuddy 的 448 个 agent 逐个改写成 DSH 预设不现实。
- 工具 schema 有硬规则:每个 object 必须显式 additionalProperties,否则整块插件激活失败(实测踩过)。改完 schema 先跑 node tools/validate-tools.mjs 再重启。
- 界面渲染未在真实会话里验证:本包是在同一台机上用假 ctx 跑通 Host 全部动作、并把 /capability-pack/ 路由处理跑通;Client 面板要重启 DSH 后由浏览器加载 client.js 才能看到。重启后若按钮不出现,先看 ~/.dsh/logs 里 capability-pack 的 slot 注册告警。
- 索引构建 1.5–4 秒(3400+ 个 SKILL.md 读 frontmatter)。放在启动后 3 秒后台执行,不阻塞启动;界面读的是磁盘索引,所以不受影响。
- MCP Streamable HTTP 只实现请求-响应,未处理服务器主动推送的 notification;stdio 是主路径。
- 未做增量索引:新增技能后要么等下次启动后台重建,要么点界面右上角刷新(rebuild-index)或跑 CLI。
- DSH 只按 pnpm-lock.yaml 建立模块映射:只写 file: 依赖而不更新 lockfile 的包会被静默跳过 (表现:patch 里能看到行,但模块从未被 import,日志无提示)。tools/install.mjs 现在会自动跑一次 pnpm install --prefer-offline --ignore-scripts 补 lockfile;跑不了时会打印手动命令。
tools/verify-live.mjs 的 [3] 插件加载痕迹 就是用来抓这个坑的。
- 依赖登记用 file::安装会往 profile package.json 写 "dsh-capability-pack": "file:./vendor/dsh-capability-pack"。
正常情况这不会触发联网安装。若某台机器的 DSH 在启动时抱怨 profile 依赖不一致,把这一行删掉即可 —— node_modules/dsh-capability-pack 与 dsh.profile.bundles 里的名字仍然能让插件加载。

9. 排错

界面/工具没出现
node tools/doctor.mjs check --profile desktop
tail -50 ~/.dsh/logs/.log | grep capability-pack

启动异常 → 安全模式起来再说
node tools/doctor.mjs safe-mode on
bin\dsh-safe.cmd

索引不对
node tools/build-index.mjs --workspace "C:\Users\<你>\Documents\deepseek-harness\default-workspace"

界面报 HTTP 404(路由没挂上) Get-Content "$env:USERPROFILE/.dsh/state/capability-pack/routes.json" {"registered":true,"reason":"ctx.inject"} ← 正常 {"registered":false,"reason":"..."} ← 原因就写在 reason 里

连接器连不上 mcp action=list includeTools=true # 会尝试启动并回报工具数(0 = 起不来)

GitHub 上没有这个包的发布页;分发靠 node tools/pack.mjs 生成的 zip。
预览分享卡片长什么样 ↓glentao-dev/dsh-capability-pack
分享 · DeepSeek Harness Hub
glentao-dev/dsh-capability-pack

按任务检索技能与连接器,用到才加载,避免撑爆上下文

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