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

军械库管理面板 Qian-Ning/prompt-skill-armory

DeepSeek Harnessv0.11.0
Qian-Ning52 天前有提交已提供中文文档扫描:高危

面向 DeepSeek Harness 的社区插件 / 管理中枢 — 提示词、技能、MCP…

40.1/100
综合分
16
GitHub 星标
79
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add prompt-skill-armory
npm 源 · prompt-skill-armory 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · ui
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 52 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包prompt-skill-armory @ 0.11.0
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 16:37:44

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

安装时即执行脚本读写/删除本地文件发起外部网络请求
查看扫描证据(共 245 处,展示前 113 条)
  • 读取本地文件
    cli.cjs:37
    if (!existsSync(settingsPath)) return
  • 读取本地文件
    cli.cjs:38
    const size = readFileSync(settingsPath, 'utf8').length
  • 读取本地文件
    cli.cjs:50
    if (existsSync(join(BUNDLED, 'switchblade', 'package.json'))) {
  • 读取本地文件
    cli.cjs:53
    if (existsSync(join(BUNDLED, 'client-ui-switchblade', 'package.json'))) {
  • 读取本地文件
    cli.cjs:61
    if (!existsSync(profilesDir)) return []
  • 读取本地文件
    cli.cjs:63
    for (const name of readdirSync(profilesDir)) {
  • 写入本地文件
    cli.cjs:76
    if (!existsSync(profilesDir)) mkdirSync(profilesDir, { recursive: true })
  • 写入本地文件
    cli.cjs:84
    mkdirSync(join(dir, 'node_modules'), { recursive: true })
  • 写入本地文件
    cli.cjs:87
    writeFileSync(manifestPath, JSON.stringify({
  • 写入本地文件
    cli.cjs:105
    mkdirSync(scopedDir, { recursive: true })
  • 删除本地文件递归
    cli.cjs:106
    rmSync(dest, { recursive: true, force: true })
  • 写入本地文件
    cli.cjs:120
    writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`)
  • 写入本地文件
    cli.cjs:164
    writeFileSync(patchPath, `${base}${canonical}`)
  • 删除本地文件递归
    cli.cjs:174
    rmSync(dest, { recursive: true, force: true })
  • 删除本地文件
    cli.cjs:214
    rmSync(patchPath, { force: true })
  • 删除本地文件递归
    cli.cjs:240
    if (existsSync(p)) { rmSync(p, { recursive: true, force: true }); console.log(` ✓ removed ${p}`) }
  • 发起网络请求
    packages/client-ui-switchblade/lib/client.js:440
    const res = await fetch("/api/switchblade-wallpaper/upload", {
  • 发起网络请求
    packages/client-ui-switchblade/lib/client.js:509
    const b = await (await fetch("/api/armory/sessions")).json();
  • 发起网络请求
    packages/client-ui-switchblade/lib/client.js:517
    const b = await (await fetch("/api/armory/export", {
  • 发起网络请求
    packages/client-ui-switchblade/lib/client.js:534
    const r = await fetch(`/api/armory/export/${name}`);
  • 发起网络请求
    packages/client-ui-switchblade/lib/client.js:552
    const b = await (await fetch("/api/armory/delete", {
  • 发起网络请求
    packages/client-ui-switchblade/lib/client.js:569
    const b = await (await fetch("/api/armory/version")).json();
  • 读取本地文件
    packages/switchblade/lib/commands.js:78
    const content = await readFile(join(process.cwd(), ".dsh", "skills", `${source}.md`), "utf8");
  • 写入本地文件
    packages/switchblade/lib/commands.js:120
    await writeFile(destination, patch, "utf8");
  • 读取本地文件
    packages/switchblade/lib/commands.js:134
    const text = await readFile(path, "utf8");
  • 读取本地文件
    packages/switchblade/lib/commands.mjs:78
    const content = await readFile(join(process.cwd(), ".dsh", "skills", `${source}.md`), "utf8");
  • 写入本地文件
    packages/switchblade/lib/commands.mjs:120
    await writeFile(destination, patch, "utf8");
  • 读取本地文件
    packages/switchblade/lib/commands.mjs:134
    const text = await readFile(path, "utf8");
  • 读取本地文件
    packages/switchblade/lib/index.js:87
    const content = await readFile(join(process.cwd(), ".dsh", "skills", `${source}.md`), "utf8");
  • 写入本地文件
    packages/switchblade/lib/index.js:129
    await writeFile(destination, patch, "utf8");
  • 读取本地文件
    packages/switchblade/lib/index.js:143
    const text = await readFile(path, "utf8");
  • 读取本地文件
    packages/switchblade/lib/index.js:499
    const sessions = JSON.parse(await readFile(join(STORAGES_ROOT, "session_projcache.json"), "utf8")).tables?.sessions ?? {};
  • 读取本地文件
    packages/switchblade/lib/index.js:514
    return JSON.parse(await readFile(join(STORAGES_ROOT, "workspace.json"), "utf8")).tables?.workspaces ?? {};
  • 读取本地文件
    packages/switchblade/lib/index.js:523
    const sessions = JSON.parse(await readFile(join(STORAGES_ROOT, "session_projcache.json"), "utf8")).tables?.sessions ?? {};
  • 读取本地文件
    packages/switchblade/lib/index.js:540
    const buf = await readFile(join(sdir, "session.jsonl.zstd"));
  • 删除本地文件
    packages/switchblade/lib/index.js:921
    await rm(dir, {
  • 写入本地文件
    packages/switchblade/lib/index.js:944
    if (changed) await writeFile(indexPath, JSON.stringify(raw, null, 2));
  • 写入本地文件
    packages/switchblade/lib/index.js:967
    if (changed) await writeFile(wsPath, JSON.stringify(raw, null, 2));
  • 写入本地文件
    packages/switchblade/lib/index.js:975
    await mkdir(EXPORT_ROOT, { recursive: true });
  • 写入本地文件
    packages/switchblade/lib/index.js:978
    await mkdir(tmp, { recursive: true });
  • 写入本地文件
    packages/switchblade/lib/index.js:1005
    await mkdir(dst, { recursive: true });
  • 删除本地文件
    packages/switchblade/lib/index.js:1033
    await rm(tmp, {
  • 删除本地文件
    packages/switchblade/lib/index.js:1161
    await rm(tmp, {
  • 请求外部主机registry.npmjs.org
    packages/switchblade/lib/index.js:1301
    latest: (await (await fetch("https://registry.npmjs.org/prompt-skill-armory/latest")).json()).version ?? ""
  • 发起网络请求
    packages/switchblade/lib/index.js:1301
    latest: (await (await fetch("https://registry.npmjs.org/prompt-skill-armory/latest")).json()).version ?? ""
  • 删除本地文件
    packages/switchblade/lib/index.js:1404
    await rm(zipPath, { force: true });
  • 读取本地文件
    packages/switchblade/lib/index.mjs:84
    const content = await readFile(join(process.cwd(), ".dsh", "skills", `${source}.md`), "utf8");
  • 写入本地文件
    packages/switchblade/lib/index.mjs:126
    await writeFile(destination, patch, "utf8");
  • 读取本地文件
    packages/switchblade/lib/index.mjs:140
    const text = await readFile(path, "utf8");
  • 写入本地文件
    packages/switchblade/lib/index.mjs:735
    await mkdir(root, { recursive: true });
  • 读取本地文件
    packages/switchblade/lib/index.mjs:745
    const md = await readFile(join(sourceDir, "SKILL.md"), "utf8").catch(() => void 0) ?? await readFile(sourceDir, "utf8").catch(() => void 0);
  • 写入本地文件
    packages/switchblade/lib/index.mjs:759
    await mkdir(root, { recursive: true });
  • 写入本地文件
    packages/switchblade/lib/index.mjs:761
    await writeFile(target, content, "utf8");
  • 写入本地文件
    packages/switchblade/lib/index.mjs:813
    await mkdir(root, { recursive: true });
  • 写入本地文件
    packages/switchblade/lib/index.mjs:815
    await mkdir(temp, { recursive: true });
  • 读取本地文件
    packages/switchblade/lib/index.mjs:843
    const md = await readFile(join(target, "SKILL.md"), "utf8").catch(() => void 0);
  • 读取本地文件
    packages/switchblade/lib/index.mjs:849
    const flat = await readFile(src, "utf8").catch(() => void 0);
  • 读取本地文件
    packages/switchblade/lib/switchblade.js:300
    const sessions = JSON.parse(await readFile(join(STORAGES_ROOT, "session_projcache.json"), "utf8")).tables?.sessions ?? {};
  • 读取本地文件
    packages/switchblade/lib/switchblade.js:315
    return JSON.parse(await readFile(join(STORAGES_ROOT, "workspace.json"), "utf8")).tables?.workspaces ?? {};
  • 读取本地文件
    packages/switchblade/lib/switchblade.js:324
    const sessions = JSON.parse(await readFile(join(STORAGES_ROOT, "session_projcache.json"), "utf8")).tables?.sessions ?? {};
  • 读取本地文件
    packages/switchblade/lib/switchblade.js:341
    const buf = await readFile(join(sdir, "session.jsonl.zstd"));
  • 读取本地文件
    packages/switchblade/lib/switchblade.js:383
    const projects = await readdir(SESSIONS_ROOT).catch(() => []);
  • 读取本地文件
    packages/switchblade/lib/switchblade.js:386
    const ps = await stat(pdir).catch(() => void 0);
  • 删除本地文件
    packages/switchblade/lib/switchblade.js:722
    await rm(dir, {
  • 写入本地文件
    packages/switchblade/lib/switchblade.js:745
    if (changed) await writeFile(indexPath, JSON.stringify(raw, null, 2));
  • 写入本地文件
    packages/switchblade/lib/switchblade.js:768
    if (changed) await writeFile(wsPath, JSON.stringify(raw, null, 2));
  • 写入本地文件
    packages/switchblade/lib/switchblade.js:776
    await mkdir(EXPORT_ROOT, { recursive: true });
  • 写入本地文件
    packages/switchblade/lib/switchblade.js:779
    await mkdir(tmp, { recursive: true });
  • 写入本地文件
    packages/switchblade/lib/switchblade.js:806
    await mkdir(dst, { recursive: true });
  • 写入本地文件
    packages/switchblade/lib/switchblade.js:826
    await writeFile(join(tmp, "manifest.json"), JSON.stringify({
  • 删除本地文件
    packages/switchblade/lib/switchblade.js:834
    await rm(tmp, {
  • 删除本地文件
    packages/switchblade/lib/switchblade.js:962
    await rm(tmp, {
  • 请求外部主机registry.npmjs.org
    packages/switchblade/lib/switchblade.js:1102
    latest: (await (await fetch("https://registry.npmjs.org/prompt-skill-armory/latest")).json()).version ?? ""
  • 发起网络请求
    packages/switchblade/lib/switchblade.js:1102
    latest: (await (await fetch("https://registry.npmjs.org/prompt-skill-armory/latest")).json()).version ?? ""
  • 删除本地文件
    packages/switchblade/lib/switchblade.js:1205
    await rm(zipPath, { force: true });
  • 写入本地文件
    packages/switchblade/lib/switchblade.mjs:536
    await mkdir(root, { recursive: true });
  • 写入本地文件
    packages/switchblade/lib/switchblade.mjs:560
    await mkdir(root, { recursive: true });
  • 写入本地文件
    packages/switchblade/lib/switchblade.mjs:562
    await writeFile(target, content, "utf8");
  • 写入本地文件
    packages/switchblade/lib/switchblade.mjs:614
    await mkdir(root, { recursive: true });
  • 写入本地文件
    packages/switchblade/lib/switchblade.mjs:616
    await mkdir(temp, { recursive: true });
  • 读取本地文件
    packages/switchblade/src/commands.ts:83
    const content = await readFile(join(process.cwd(), '.dsh', 'skills', `${source}.md`), 'utf8')
  • 写入本地文件
    packages/switchblade/src/commands.ts:123
    await writeFile(destination, patch, 'utf8')
  • 读取本地文件
    packages/switchblade/src/commands.ts:137
    const text = await readFile(path, 'utf8')
  • 读取本地文件
    packages/switchblade/src/conversations.ts:87
    const raw = JSON.parse(await readFile(join(STORAGES_ROOT, 'session_projcache.json'), 'utf8')) as {
  • 读取本地文件
    packages/switchblade/src/conversations.ts:112
    const raw = JSON.parse(await readFile(join(STORAGES_ROOT, 'workspace.json'), 'utf8')) as {
  • 读取本地文件
    packages/switchblade/src/conversations.ts:123
    const raw = JSON.parse(await readFile(join(STORAGES_ROOT, 'session_projcache.json'), 'utf8')) as {
  • 读取本地文件
    packages/switchblade/src/conversations.ts:142
    const buf = await readFile(join(sdir, 'session.jsonl.zstd'))
  • 读取本地文件
    packages/switchblade/src/conversations.ts:184
    const projects = await readdir(SESSIONS_ROOT).catch(() => [] as string[])
  • 读取本地文件
    packages/switchblade/src/conversations.ts:187
    const ps = await stat(pdir).catch(() => undefined)
  • 删除本地文件递归
    packages/switchblade/src/conversations.ts:484
    await rm(dir, { recursive: true, force: true })
  • 写入本地文件
    packages/switchblade/src/conversations.ts:502
    if (changed) await writeFile(indexPath, JSON.stringify(raw, null, 2))
  • 写入本地文件
    packages/switchblade/src/conversations.ts:527
    if (changed) await writeFile(wsPath, JSON.stringify(raw, null, 2))
  • 写入本地文件
    packages/switchblade/src/conversations.ts:534
    await mkdir(EXPORT_ROOT, { recursive: true })
  • 写入本地文件
    packages/switchblade/src/conversations.ts:537
    await mkdir(tmp, { recursive: true })
  • 写入本地文件
    packages/switchblade/src/conversations.ts:564
    await mkdir(dst, { recursive: true })
  • 写入本地文件
    packages/switchblade/src/conversations.ts:587
    await writeFile(join(tmp, 'manifest.json'), JSON.stringify({
  • 删除本地文件递归
    packages/switchblade/src/conversations.ts:596
    await rm(tmp, { recursive: true, force: true })
  • 删除本地文件递归
    packages/switchblade/src/conversations.ts:723
    await rm(tmp, { recursive: true, force: true })
  • 请求外部主机registry.npmjs.org
    packages/switchblade/src/conversations.ts:787
    const r = await fetch('https://registry.npmjs.org/prompt-skill-armory/latest')
  • 发起网络请求
    packages/switchblade/src/conversations.ts:787
    const r = await fetch('https://registry.npmjs.org/prompt-skill-armory/latest')
  • 删除本地文件
    packages/switchblade/src/conversations.ts:840
    await rm(zipPath, { force: true })
  • 写入本地文件
    packages/switchblade/src/switchblade.ts:90
    mkdir(dir, { recursive: true }).catch(() => {})
  • 写入本地文件
    packages/switchblade/src/switchblade.ts:585
    await mkdir(root, { recursive: true })
  • 读取本地文件
    packages/switchblade/src/switchblade.ts:594
    const md = await readFile(join(sourceDir, 'SKILL.md'), 'utf8').catch(() => undefined)
  • 读取本地文件
    packages/switchblade/src/switchblade.ts:595
    ?? await readFile(sourceDir, 'utf8').catch(() => undefined)
  • 写入本地文件
    packages/switchblade/src/switchblade.ts:610
    await mkdir(root, { recursive: true })
  • 写入本地文件
    packages/switchblade/src/switchblade.ts:613
    await writeFile(target, content, 'utf8')
  • 写入本地文件
    packages/switchblade/src/switchblade.ts:666
    await mkdir(root, { recursive: true })
  • 写入本地文件
    packages/switchblade/src/switchblade.ts:669
    await mkdir(temp, { recursive: true })
  • 读取本地文件
    packages/switchblade/src/switchblade.ts:678
    const entries = await readdir(temp)
  • 读取本地文件
    packages/switchblade/src/switchblade.ts:692
    const md = await readFile(skillMd, 'utf8').catch(() => undefined)
  • 读取本地文件
    packages/switchblade/src/switchblade.ts:699
    const flat = await readFile(src, 'utf8').catch(() => undefined)
  • 读取本地文件
    packages/switchblade/src/switchblade.ts:926
    if (!existsSync(dir)) { jsonResponse(res, 404, { ok: false }); return }
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
涉及外部主机:registry.npmjs.org

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

6 张 · 点击查看大图

功能亮点

  • 管理提示词
  • 管理技能
  • 管理MCP工具

管理 DeepSeek Harness 的提示词、技能、MCP 工具和壁纸

README

由 DeepSeek 最新模型翻译生成
Armory 面向 DeepSeek Harness 的社区插件 / 管理中枢 — 提示词、技能、MCP 工具服务器、智能体预设、全局壁纸与特效,一站式管理面板。 包名 / 仓库:prompt-skill-armory · GitHub 中文 · English Armory 管理面板 ✦ Armory v0.11.0 ┌─────────┬─────────┬─────┬────────────┬──────┬──────┐ │ 提示词 │ 技能 │ MCP │ Wallpaper │ 对话 │ 统计 │ │ 全局注入 │ 合并管理 │ 连接 │ 壁纸·特效 │ 导入 │ 用量 │ └─────────┴─────────┴─────┴────────────┴──────┴──────┘ 📑 目录 - 🚀 快速开始 - 🎯 适配目标 · Supported upstreams - ✨ 功能 - 🖥️ 平台支持 - 🔄 一键更新 - 🗑️ 卸载 - 🏗️ 架构 - 📦 包含的包 - 🗂️ 仓库结构 - 🛠️ 开发 - ❓ FAQ - 📚 文档 - 🤝 贡献 / 官方合入 - 📄 许可 - 🔗 友情链接 · Friends 🎯 适配目标 · Supported upstreams
展开完整文档(README 剩余 1 节)
Armory

面向 DeepSeek Harness 的社区插件 / 管理中枢 — 提示词、技能、MCP 工具服务器、智能体预设、全局壁纸与特效,一站式管理面板。

包名 / 仓库:prompt-skill-armory · GitHub

中文 · English

Armory 管理面板

✦ Armory v0.11.0
┌─────────┬─────────┬─────┬────────────┬──────┬──────┐
│ 提示词 │ 技能 │ MCP │ Wallpaper │ 对话 │ 统计 │ │ 全局注入 │ 合并管理 │ 连接 │ 壁纸·特效 │ 导入 │ 用量 │ └─────────┴─────────┴─────┴────────────┴──────┴──────┘

📑 目录

- 🚀 快速开始
- 🎯 适配目标 · Supported upstreams
- ✨ 功能
- 🖥️ 平台支持
- 🔄 一键更新
- 🗑️ 卸载
- 🏗️ 架构
- 📦 包含的包
- 🗂️ 仓库结构
- 🛠️ 开发
- ❓ FAQ
- 📚 文档
- 🤝 贡献 / 官方合入
- 📄 许可
- 🔗 友情链接 · Friends

🎯 适配目标 · Supported upstreams

Armory 是 DeepSeek Harness 的插件,专为以下两个官方仓库构建与测试:

| 上游 | 对应环境 | 仓库 |
| DeepSeek Harness | dsh web 网页端运行时 | <https://github.com/deepseek-ai/deepseek-harness> |
| DSH Desktop | 桌面客户端 | <https://github.com/anywhere-labs/dsh-desktop> |

⚠️ 请使用上述官方仓库的构建(或其保持兼容的派生版)。 其他 fork / 魔改版本的内部接口可能不同,导致面板无法挂载、设置不生效、命令缺失,甚至让客户端进入恢复模式——那不是本插件的 bug。安装或反馈前请先确认你的运行时来自以上两个出处。

🚀 快速开始

安装

npx prompt-skill-armory

卸载:

npx prompt-skill-armory uninstall

安装器自动完成:

1. 定位 DSH home
2. 确保 web + desktop profile 存在
3. 安装两个插件包(Host + Web 面板)
4. 配置 Host bundle
5. 挂载面板(profile cordis.patch.yml)
6. 体检 settings(防 4MB 膨胀)

启动

cd deepseek-harness
pnpm run build
pnpm dsh web

(或直接重启 DSH Desktop 客户端。)

打开 设置 → Armory(书图标)。

要求:已安装 DeepSeek Harness 运行时(dsh web 或桌面客户端)。插件是 DSH 的插件,不打包运行时本身。

✨ 功能

- 提示词(全局生效) — 增删改查、启用/停用、设默认。启用后经 ctx.systemPrompt.section 注入每个智能体的系统提示词。
- 技能(合并管理) — 一个列表:面板安装的(编辑/开关/卸载)+ 本地扫描的(托管),带调用提示 /name。
- 技能安装方式
- 手动填写
- .md 文件选择
- 会话内命令:/armory-skill-dir <dir>、/armory-install-zip <zip>
- MCP 工具服务器 — 添加/编辑/移除 stdio 或 HTTP 的 MCP 服务器,启用即自动连接,每台展示运行状态与工具列表,支持「测试」连接。
- Wallpaper(全局壁纸与特效) — 本地上传图片/视频(字节存盘,settings 只存 id 不膨胀)或填图片 URL;透明度/遮罩/玻璃/模糊/铺法实时可调;web 与桌面客户端分别设置。
- 输入栏提示行样式 — 为 composer 下方提示与统计行单独设启用/颜色/字号/渐变色。
- 对话导入 / 导出 — 勾选多个会话导出为 zip(含附件与工作区),另一台机器导入即可还原;列表显示对话标题、项目与时间;支持真实删除(删目录 + 清索引)。
- 使用统计(cc-switch 风格) — 时间范围筛选(全部/30天/7天/今天);输入/输出/缓存读/缓存写 Token、缓存命中率、成本估算;请求日志(时间/项目/输入输出/缓存/成本/用时/首字/状态);Provider(项目)统计与模型统计;SVG 双轴趋势图(今天按 24 小时分段)。
- 中英双语 UI(简体中文 / English)。
- 设置侧边栏书图标。

🖥️ 平台支持

| 环境 | 面板 | /armory 命令 |
| dsh web(deepseek-ai/deepseek-harness) | ✅ | ✅ |
| DSH Desktop 客户端(anywhere-labs/dsh-desktop) | ✅ | ✅ |

通过 profile 组合实现(安装器把面板挂进每个 profile 的 cordis.patch.yml)——无需 fork 客户端。

🔄 一键更新

插件面板每次打开会自动查询 npm 上 prompt-skill-armory 的最新版本;发现新版本时顶部显示横幅:

有新版本 vX.Y.Z(当前 v0.11.0) [一键更新]

点击「一键更新」→ Host 端运行官方安装器原地重装 → 提示「更新完成,请重启客户端生效」。

🗑️ 卸载

npx prompt-skill-armory uninstall

移除两个插件包、Host bundle、面板挂载,并清理壁纸/导出目录(提示词/技能配置保留在 settings.yaml,可手动删 switchblade 命名空间彻底清除)。

🧰 在聊天中使用技能

在输入框打 / + 技能名:

/code-review
/mission-keeper

技能体被注入,agent 按它执行。modelInvocable 的技能模型也可自主调用。

🏗️ 架构

┌──────────────────────────────────────────────────────┐
│ DSH 运行时 │ │ │ │ ┌─────────────┐ RPC/connection ┌─────────────┐ │ │ │ Web 面板 │◄──────────────────►│ Host 服务 │ │ │ │ ui-switchblade│ api.skills.* │ switchblade │ │ │ │ (settings) │ api.settings.* │ (bundle) │ │ │ │ │ /api/armory/* │ + routes │ │ │ └─────────────┘ └──────┬──────┘ │ │ │ │ │ ctx.systemPrompt.section│ │ ctx.skills.register │ │ /api/armory/* (对话/统计 │ │ 壁纸上传/更新/卸载) │ └──────────────────────────────────────────────────────┘

- Host 服务(switchblade bundle)持有提示词/技能/预设的 CRUD 与持久化,通过 ctx.systemPrompt.section 全局注入、ctx.skills.register 注册技能;并注册 /api/armory/ 路由(对话导入导出、会话删除、使用统计、壁纸上传、版本检查、一键更新)。
- Web 面板(ui-switchblade)通过 connection RPC 调用 Host(api.skills.list、api.settings.mutate/describe)与 /api/armory/ 路由,不直接碰 DSH 内部。
- 安装器把两者通过 profile 组合装进 DSH——web 和 desktop 共用同一套机制。

📦 包含的包

| 包 | 作用 |
| prompt-skill-armory | npm 安装器(CLI,含卸载) |
| @deepseek-ai/dsh-switchblade | Host 服务(提示词/技能/命令/MCP/壁纸/对话/统计 + 路由) |
| @deepseek-ai/dsh-client-ui-switchblade | Web 面板(六 tab:提示词/技能/MCP/Wallpaper/对话/统计) |

🗂️ 仓库结构

prompt-skill-armory/
├── cli.cjs # 一键安装/卸载 CLI ├── package.json # npm 安装器包 ├── packages/ # 构建好的插件(lib+src+manifest) │ ├── switchblade/ # @deepseek-ai/dsh-switchblade (Host) │ └── client-ui-switchblade/ # @deepseek-ai/dsh-client-ui-switchblade (Web) ├── plugin-src/ # 插件源码镜像 ├── scripts/build-shipped.mjs # 从 DSH checkout 同步构建产物 ├── demo/demo.html # UI 预览(mock 数据) ├── docs/preview/ # 面板真实截图 ├── README.md # 本文(中文)· README.en.md 英文版 ├── UPSTREAM.md # 官方合入指南 ├── CHANGELOG.md # 版本历史 ├── PUBLISHING.md # 发布指南 ├── TESTING.md # 测试指南 ├── LICENSE # MIT └── .github/workflows/ci.yml # CI 质量门禁

🛠️ 开发

改源码后重建发布包:

node scripts/build-shipped.mjs <path-to-deepseek-harness>

版本更新三处同步:

1. packages/*/package.json version
2. ARMORY_VERSION(面板常量)
3. CHANGELOG.md

然后重建 client bundle 让版本徽章更新。

❓ FAQ

Q: 为什么我的客户端侧边栏图标是齿轮而不是书? A: 桌面客户端打包版的 SettingsRoot 硬编码了图标映射。通过 npm 安装器的 profile 组合,面板能正常工作,但书图标需要官方合入(见 UPSTREAM.md)。

Q: 会话导入后另一台机器看不到? A: 导入成功后需要重启 DSH 客户端让其重新扫描会话列表;若目标项目路径不同,在导入前填写「目标项目 key」(形如 --C-Users-xxx--)以归入正确项目。

Q: 统计里的成本准确吗? A: 成本是估算(内置单价 × token:输入 $0.3/M、输出 $1.2/M、缓存读 $0.03/M、缓存写 $0.6/M),不是真实账单。

Q: 会不会影响我已有的配置/会话? A: 不会。插件只新增 switchblade settings 命名空间,不动其他配置。安装器还会体检 settings,防止膨胀。

Q: 支持离线安装吗? A: 可以。把 npm 包拷到目标机器,npm install <tarball> 即可;或用 file: 安装本地构建产物(见 TESTING.md)。

Q: 技能从哪里来? A: 三种:手动填写、.md 文件选择、会话内 /armory-skill-dir(目录)或 /armory-install-zip(zip)。安装后统一进「技能」tab 管理。

📚 文档

| 文档 | 说明 |
| README.en.md | 英文版自述 |
| TESTING.md | 本地功能测试(无需发布) |
| PUBLISHING.md | 发布新版本指南 |
| UPSTREAM.md | 官方合入指南(书图标 PR) |
| CHANGELOG.md | 完整版本历史 |

🤝 贡献 / 官方合入

见 UPSTREAM.md —— 如何让面板原生内置进 deepseek-ai/deepseek-harness 与 anywhere-labs/dsh-desktop(客户端侧边栏书图标)。

📄 许可

MIT

🔗 友情链接 · Friends

- LINUX DO — 技术社区 · LINUX DO community
预览分享卡片长什么样 ↓Qian-Ning/prompt-skill-armory
分享 · DeepSeek Harness Hub
Qian-Ning/prompt-skill-armory

面向 DeepSeek Harness 的社区插件 / 管理中枢 — 提示词、技能、MCP…

这是你的仓库?认领条目

回到顶部