面向 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-armorynpm 源 · prompt-skill-armory 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · ui
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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.orgpackages/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.orgpackages/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.orgpackages/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
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Qian-Ning/prompt-skill-armory
面向 DeepSeek Harness 的社区插件 / 管理中枢 — 提示词、技能、MCP…
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这是你的仓库?认领条目