dsh-armory 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +16 -6
- package/README.md +21 -7
- package/lib/client.js +1656 -111
- package/lib/index.js +54 -10
- package/lib/mcp-oauth.js +1 -1
- package/lib/skill-remove.js +125 -0
- package/lib/suites-registry.js +179 -0
- package/lib/tool-ledger.js +180 -11
- package/lib/typert.js +11 -0
- package/lib/wb-awesome-market.js +305 -37
- package/lib/wb-install-state.js +1 -1
- package/lib/wb-market.js +44 -21
- package/lib/wb-registry.js +1 -1
- package/lib/whats-new.js +46 -0
- package/lib/workspace-runtime.js +1 -1
- package/package.json +2 -2
- package/docs/chunk-split-feasibility.md +0 -153
- package/docs/host-proposal-mcp-teardown.md +0 -184
- package/docs/host-proposal-skill-toggle.md +0 -166
- package/docs/prd-awesome-dsh-plugins.md +0 -105
- package/docs/prd-workbuddy-parity.md +0 -128
- package/docs/system-design-awesome.md +0 -269
- package/docs/system_design.md +0 -530
- package/docs/workbuddy-market-gap-analysis.md +0 -197
package/README.en.md
CHANGED
|
@@ -4,9 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
> **The all-in-one control board for DeepSeek Harness**: MCP servers · Skills · Experts · Plugins · tool-usage ledger · four markets (WorkBuddy connectors ×316 / curated built-ins ×47 / SkillHub skills ×190k+ / WorkBuddy experts ×429, plus CodeBuddy official plugins and the DSH community list), with browsing, search, one-click install and one-click summon.
|
|
6
6
|
> This project is a fork of [Imzl-zl/dsh-mcp-manager-ui](https://github.com/Imzl-zl/dsh-mcp-manager-ui) (MIT, the original covered MCP only); this repo is [2026heshao/dsh-armory](https://github.com/2026heshao/dsh-armory),
|
|
7
|
-
> upgraded from a pure MCP panel into a **MCP + Skills + Experts + Plugins + Markets + Tool Tailor** board.
|
|
7
|
+
> upgraded from a pure MCP panel into a **MCP + Skills (with custom suites) + Experts + Plugins + Markets + Tool Tailor** board.
|
|
8
8
|
>
|
|
9
9
|
> **New in v2.0.0**: a Plugins page with three sources, one-click MCP OAuth authorization, credential prompts before install, an install-state ledger, and six categories for the skill board. See the [changelog](.github/release-notes/v2.0.0.md).
|
|
10
|
+
> **New in v2.1.0**: community plugins now render their README in place (fetched on demand, cached to disk for 7 days, `javascript:` pseudo-links downgraded to plain text), and two long-standing traps are fixed — the instant-open snapshot no longer shadows the real list, and update probing no longer reports failures on machines where the primary source is unreachable. See the [changelog](.github/release-notes/v2.1.0.md).
|
|
11
|
+
> **New in v2.2.0**: bundle skills into custom suites and expand the whole set as `/name` tokens from the composer menu; uninstall installed skills from the board (with source/path guards) and watch counts refresh live after market installs; the Tool Tailor gains a sampled "wire tax" trend so you can tell whether a registry change actually took effect; SkillHub's downloads sort falls back to in-page sorting because the upstream hangs. See the [changelog](.github/release-notes/v2.2.0.md).
|
|
10
12
|
|
|
11
13
|
<p align="center">
|
|
12
14
|
<a href="https://github.com/2026heshao/dsh-armory/stargazers"><img src="https://img.shields.io/github/stars/2026heshao/dsh-armory?style=social" alt="stars"></a>
|
|
@@ -48,7 +50,7 @@ A **unified board** for DeepSeek Harness (Web and desktop): six top-level tabs
|
|
|
48
50
|
| **Skill** | Skills: enable/disable of `SKILL.md` folders, source directories, session audit scan, six categories (dev / design & creative / docs & office / productivity / ops / uncategorised), grid or list view |
|
|
49
51
|
| **Expert** | WorkBuddy expert directory (429 experts / 15 industries, including 53 expert **teams**): browse, search, and "summon" one into a new session as an independent agent preset. Team experts summon with their full roster — member personas are materialised locally and the lead is handed a runtime bridge that maps WorkBuddy's `TeamCreate` / `Agent(name=…)` onto DSH's `subagent` |
|
|
50
52
|
| **Plugins** | Three sources in one searchable directory: DSH built-ins (shipped with the host, display-only), CodeBuddy official (ZIP distribution, manifest parsed from `marketplace.json` / `plugin.json`), DSH community (`awesome-dsh-plugins`). Install goes through the host's `pluginManager.installBundle` and **needs a host restart to take effect** |
|
|
51
|
-
| **Tool Tailor** | Per-tool call counts, error rates
|
|
53
|
+
| **Tool Tailor** | Per-tool call counts, error rates and context-token cost from local session logs, plus a daily **wire-tax** trend sampled from the tool list actually sent to the model (`request/header`) and compared with the registry snapshot; dead tools shown inline and prunable. Shows **all tools with their real call counts by default** — toggle "zero-call only (N)" to narrow. A persistent "showing N/M tools" read-out makes the filter state unmistakable |
|
|
52
54
|
| **Market** | Four sub-tabs: WorkBuddy connectors (316), curated built-ins (47), SkillHub skills (190k+), WorkBuddy experts (429) — browse, search, one-click install. Installed state is remembered across pages in `~/.dsh/armory/install-state.json` |
|
|
53
55
|
|
|
54
56
|
> The Skill panel reads DSH's custom skill directory (default `~/.agents/skills`): each skill is a folder with a `SKILL.md`,
|
|
@@ -57,7 +59,7 @@ A **unified board** for DeepSeek Harness (Web and desktop): six top-level tabs
|
|
|
57
59
|
|
|
58
60
|
## Screenshots
|
|
59
61
|
|
|
60
|
-
One shot per main board tab (captured on the Windows desktop app, light theme). The v2.0.0 Plugins page
|
|
62
|
+
One shot per main board tab (captured on the Windows desktop app, light theme). The v2.0.0 Plugins page, the OAuth flow and the v2.1.0 README preview are not pictured yet:
|
|
61
63
|
|
|
62
64
|
### MCP — global board
|
|
63
65
|
|
|
@@ -73,7 +75,7 @@ Transport, connection parameters, call timeout and config source at a glance; be
|
|
|
73
75
|
|
|
74
76
|
### Tool Tailor — tool-usage ledger
|
|
75
77
|
|
|
76
|
-
Four metric cards for the 30-day window (total calls / tools seen / zero-call MCP tools / overall error rate), one row per tool with calls, errors, error rate, Schema context tax and last use, and a persistent tailor suggestion at the bottom. Shows all tools with real call counts by default; "zero-call only (N)" narrows the view:
|
|
78
|
+
Four metric cards for the 30-day window (total calls / tools seen / zero-call MCP tools / overall error rate), one row per tool with calls, errors, error rate, Schema context tax and last use, and a persistent tailor suggestion at the bottom. Shows all tools with real call counts by default; "zero-call only (N)" narrows the view. Below the cards sits a **second trend**: the tool list actually sent to the model in every request (`request/header`), sampled per day, together with "how many times that list changed inside the window" and the timestamp of the latest one. When local logs are shorter than the selected window, the note bar says so plainly ("window N days, calls I could read span only M days"), so "this number hasn't moved in days" is attributable on screen instead of looking like a broken ledger:
|
|
77
79
|
|
|
78
80
|

|
|
79
81
|
|
|
@@ -107,7 +109,7 @@ Experts (WorkBuddy expert center, 429 experts / 15 industries; category filter +
|
|
|
107
109
|
- **MCP market**: 47 services across 10 categories, each verified against first-party sources. Search-first, with category and "keyless only" filters, sorting, and one-click install from the card. Already-configured entries are detected and skipped, never overwritten
|
|
108
110
|
- **WB Market (direct installs)**: a third board tab with two markets in one place —
|
|
109
111
|
- **Connectors (MCP)**: reads the official WorkBuddy distribution ZIP (`static.workbuddy.cn`, the same source the WorkBuddy desktop app uses) on demand — 316 connectors, 242 installable (mostly streamable-http), while 74 CLI-based or WorkBuddy-token-dependent ones are honestly labeled "view only" with the reason. Installing = merging the connector's `mcpServers` into your MCP config through the same pipeline as "Import JSON" (admission, duplicate skip, entry-id reservation), in either global or project scope. The ZIP is ETag-cached under `~/.dsh/wb-market/` and decompressed with Node's built-in zlib — **zero new runtime dependencies**
|
|
110
|
-
- **Skills (SkillHub)**: reads the public SkillHub API (`api.skillhub.cn`, 190k+ skills) with keyword search, four sort orders, and pagination; details include publisher verification and security-scan status. Installing = downloading file-by-file, verifying each against the manifest's sha256, and writing into `~/.agents/skills/` (the same discovery scope as the official skill subsystem) — effective immediately. Installed skills show an "installed" badge, support one-click uninstall, and reinstalling updates them
|
|
112
|
+
- **Skills (SkillHub)**: reads the public SkillHub API (`api.skillhub.cn`, 190k+ skills) with keyword search, four sort orders, and pagination; details include publisher verification and security-scan status. Installing = downloading file-by-file, verifying each against the manifest's sha256, and writing into `~/.agents/skills/` (the same discovery scope as the official skill subsystem) — effective immediately. Installed skills show an "installed" badge, support one-click uninstall, and reinstalling updates them. After an install or uninstall the **Skill** tab's count badge and board list realign with the new set immediately — no tab switch or panel reopen needed. Downloads sorting is now done **within the current page** (the upstream `sortBy=downloads` hangs), while the other sorts still go remote; each request gives up after 15s and reports a localized error
|
|
111
113
|
- Skills belong to their respective authors. Both upstreams are third-party interfaces whose fields may change; the panel carries a persistent note saying so
|
|
112
114
|
- **Experts (direct, 1.9.0)** — a dedicated board tab (the sidebar entry is renamed **Skills · MCP · Experts**):
|
|
113
115
|
- **Directory**: reads the official WorkBuddy expert center distribution (`expert_center.json`, 429 experts / 15 industries, ETag-cached under `~/.dsh/wb-market/experts/`) with category filter, keyword search, and a detail dialog (persona, bundled skills, sample prompts) before you summon
|
|
@@ -131,9 +133,17 @@ Experts (WorkBuddy expert center, 429 experts / 15 industries; category filter +
|
|
|
131
133
|
- A 401 from the server pops the "Authorize {server}" dialog and opens the browser for you
|
|
132
134
|
- **Credential prompts before install (new in 2.0.0)**: scans `mcpServers` for `${...}` placeholders, opens "Fill in {connector}'s credentials", and installs with them; leaving a field blank means "I'll do it later" and the panel says "N placeholders left as-is". Connectors with no placeholders install straight through
|
|
133
135
|
- **Install-state ledger (new in 2.0.0)**: `~/.dsh/armory/install-state.json` (`INSTALL_STATE_VERSION = 1`) records each connector / skill / plugin's `source {marketplace, url, kind}`, so the market can filter installed entries **across pages** and distinguishes "installed by this plugin" from "configured by hand elsewhere". A failed registration never blocks the install
|
|
134
|
-
- **Skill board categories (new in 2.0.0)**: skills are grouped into **dev / design & creation / docs & office / productivity & automation / ops / uncategorised**, with grid and list views, a category filter and a persistent "showing N/M skills" line. Details add the category, source directory and file location, with one-click "copy SKILL.md path" and "copy @session reference"
|
|
136
|
+
- **Skill board categories (new in 2.0.0)**: skills are grouped into **dev / design & creation / docs & office / productivity & automation / ops / uncategorised**, with grid and list views, a category filter and a persistent "showing N/M skills" line. Details add the category, source directory and file location, with one-click "copy SKILL.md path" and "copy @session reference"
|
|
137
|
+
- **Skill uninstall (new in 2.2.0)**: skills in user-level / project-level directories can be deleted from the detail pane (inline second confirmation, **permanent, no undo**), while skills shipped with DSH, registered at runtime, or living in custom directories stay read-only and say so. The host only exposes read endpoints, so removal is handled by this plugin's `removeSkill`: source allowlist → strict root containment → parent-directory realpath → symlinks unlinked without touching their targets → the folder must contain `SKILL.md` and stay under the root
|
|
138
|
+
- **Live skill-set refresh (new in 2.2.0)**: installing or uninstalling from the market, and uninstalling from the board, all broadcast on a module-level change bus. The top **Skill** badge and the board list subscribe to the same bus and re-read the truth, with a sequence guard on the badge fetch so rapid toggles cannot roll the number back. The new set is reflected immediately — no tab switch or panel reopen
|
|
139
|
+
- **Custom suites (new in 2.2.0)**: bundle skills you use together. The **Suites** button in the Skill board toolbar opens a manager: pick skills on the left, arrange them on the right (click **+** or drag one in, drag to reorder, delete with an inline confirmation), and one save overwrites the whole set into `~/.dsh/armory/suites.json` (staging + atomic rename; invalid input is rejected without touching the file). The composer's Skills submenu shows a suite group at the top — one click expands the suite in member order into multiple `/name` tokens in the draft. Limits: 100 suites, 40 members each; members count individually toward "recently used" rather than the suite name
|
|
135
140
|
- **Marketplace registry (new in 2.0.0)**: market sources are no longer hard-coded — they live in `~/.dsh/armory/marketplaces.json` (`REGISTRY_VERSION = 1`), fall back to the built-in defaults when missing or corrupt, persist on first read, and can be added / edited / removed. Writes are staging + atomic rename
|
|
136
141
|
- **Instant community list (new in 2.0.0)**: the last successful slim list is mirrored into `localStorage` (7 days / 4MB cap, older snapshot kept on quota errors), so the first paint renders the snapshot before the real result silently replaces it (zero network, zero IPC). When no source is reachable it says "showing the local cache" instead of an empty list
|
|
142
|
+
- **Community README preview (new in 2.1.0)**: click any card under Plugins → DSH community and the plugin fetches and renders that repository's README in place (headings, paragraphs, lists, tables, code blocks, quotes, and `<p align="center"><img …>` banners) —
|
|
143
|
+
- **On demand, fetched once**: the README is deliberately kept out of the slim directory cache and only fetched when you open a card; it tries `README.md` / `readme.md` / `Readme.md` / `README.MD` / `README.markdown` / `README_EN.md` in that order, and when the repository field holds an npm package name it asks `registry.npmjs.org` for `repository` first, then fetches the raw text from GitHub
|
|
144
|
+
- **Limits and cache**: 20s per fetch, 160k characters of body (truncated and labelled when longer); successful reads are cached to disk per repository / npm name for 7 days, so reopening the same plugin is instant, and when the network is down / rate-limited / the repository is gone it falls back to the cache and says so
|
|
145
|
+
- **Images and safety**: `http(s)` images go through the read-only `wsrv.nl` proxy (`output=webp&q=72&w=880`, allow-listed hosts only); relative paths are resolved against the repository URL and skipped when they cannot be; the body is turned into React elements by a small hand-written parser — **never `dangerouslySetInnerHTML`** — and `javascript:` / `data:` / `vbscript:` pseudo-links are downgraded to plain text
|
|
146
|
+
- **Community directory and update-probe fixes (2.1.0)**: the instant-open snapshot no longer shadows the real list (previously the real result was dropped once the snapshot painted, leaving the directory stuck on the old snapshot), and update probing now follows the same source chain as the directory itself (it asks the source the cache actually came from, then falls back to the others, first ETag wins) — fixing the "directory opens but every update check says `probe-failed`" trap on machines where the primary source is unreachable
|
|
137
147
|
- Import MCP configuration from other clients installed on this machine: Claude Code, Codex (`config.toml`), OpenCode (including `.jsonc`), pi, Claude Desktop, Cursor, Windsurf, VS Code, Gemini CLI, Roo Code, and the cross-tool shared config. Everything is previewed before writing, with "merge" and "replace" modes
|
|
138
148
|
- Follows the DSH dark/light theme and adapts to narrow/mobile widths
|
|
139
149
|
- Update notice and **one-click upgrade**: a dismissible banner when a newer release exists (at most one check per day; disable with `DSH_ARMORY_DISABLE_UPDATE_CHECK`). Nothing happens until you press Upgrade — it **never auto-updates**; the upgrade itself is executed by DSH's official pluginManager, which handles version checks and rollback. Local dev copies installed via `link:` / `file:` / `github:` get no button (it would replace your link with an npm package)
|
package/README.md
CHANGED
|
@@ -4,9 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
> **DeepSeek Harness 的一体化管理看板**:MCP 服务器 · 技能 · 专家 · 插件 · 工具使用账本 · 四大市场(WorkBuddy 连接器 316 个 / 内置精选 47 个 / SkillHub 技能 19 万+ / WorkBuddy 专家 429 位 / CodeBuddy 官方插件 + DSH 社区清单),浏览、搜索、一键安装、一键召唤。
|
|
6
6
|
> 本项目 fork 并改写自 [Imzl-zl/dsh-mcp-manager-ui](https://github.com/Imzl-zl/dsh-mcp-manager-ui)(MIT,原项目仅 MCP 管理),现仓库为 [2026heshao/dsh-armory](https://github.com/2026heshao/dsh-armory),
|
|
7
|
-
> 从纯 MCP 管理面板升级为 **MCP +
|
|
7
|
+
> 从纯 MCP 管理面板升级为 **MCP + 技能(含自定义套件)+ 专家 + 插件 + 市场 + 工具账本** 看板。
|
|
8
8
|
>
|
|
9
9
|
> **v2.0.0 起**:新增「插件」页(三个来源)、MCP OAuth 一键授权、安装凭据引导、安装状态账本、技能看板六大分类。详见 [更新日志](.github/release-notes/v2.0.0.md)。
|
|
10
|
+
> **v2.1.0 起**:社区插件点开即可就地读 README(按需拉取 + 7 天落盘缓存 + `javascript:` 伪协议链接降级),并修掉「秒开快照顶掉真实目录」「更新探测误报失败」两处。详见 [更新日志](.github/release-notes/v2.1.0.md)。
|
|
11
|
+
> **v2.2.0 起**:技能可以打包成「自定义套件」,召唤菜单点一次即展开为整组 `/name`;Skill 看板支持卸载已安装技能,市场装 / 卸后角标与列表实时刷新;工具裁缝新增按天采样的「真实下发税」趋势,能直接看出改注册表有没有生效;SkillHub 下载量排序改为页内本地排序,修掉上游挂起导致的空白。详见 [更新日志](.github/release-notes/v2.2.0.md)。
|
|
10
12
|
|
|
11
13
|
<p align="center">
|
|
12
14
|
<a href="https://github.com/2026heshao/dsh-armory/stargazers"><img src="https://img.shields.io/github/stars/2026heshao/dsh-armory?style=social" alt="stars"></a>
|
|
@@ -59,7 +61,7 @@ dsh plugin --profile web add github:2026heshao/dsh-armory
|
|
|
59
61
|
|
|
60
62
|
### 工具裁缝 — 工具使用账本
|
|
61
63
|
|
|
62
|
-
30 天窗口四张指标卡(调用总次数 / 出现过的工具 / 零调用 MCP 工具 / 整体错误率),逐工具列出调用、错误、错误率、Schema 上下文税与最后使用时间,底部常驻裁缝建议。默认显示全部工具与真实调用次数,需要时点「只看零调用(N
|
|
64
|
+
30 天窗口四张指标卡(调用总次数 / 出现过的工具 / 零调用 MCP 工具 / 整体错误率),逐工具列出调用、错误、错误率、Schema 上下文税与最后使用时间,底部常驻裁缝建议。默认显示全部工具与真实调用次数,需要时点「只看零调用(N)」收窄。指标卡下方是**第二条趋势**:按天采样日志里每次请求真实下发的工具清单(`request/header`)并算出它的税,同时给出「窗口内下发清单变过几次」和最近一次的时间;说明栏还会在本机日志短于所选窗口时直接印出「窗口 N 天,读到的调用记录只跨 M 天」,让「数字几天没变」这件事在屏幕上就能归因:
|
|
63
65
|
|
|
64
66
|

|
|
65
67
|
|
|
@@ -95,10 +97,10 @@ dsh plugin --profile web add github:2026heshao/dsh-armory
|
|
|
95
97
|
- 跟随 DSH 深色/浅色主题,适配窄屏与移动宽度
|
|
96
98
|
- 更新提示与**一键升级**:有新版时在面板顶部显示可关闭的提示条(每天最多查一次,可用 `DSH_ARMORY_DISABLE_UPDATE_CHECK` 关闭)。点了「升级」才动,**不会自动升级**;升级由 DSH 官方的 pluginManager 执行,装完提示重启宿主生效。用 `link:` / `file:` / `github:` 装的本地开发副本不给按钮(那会把链接换成 npm 包)
|
|
97
99
|
- **升级后主动说一次变了什么**:版本变了后第一次打开面板弹一张小卡片,列出本次更新内容,并指路新功能在哪(例如「入口」开关在面板右上角);确认一次后不再提示,不联网、不发任何数据
|
|
98
|
-
- **工具裁缝**(1.7.0
|
|
100
|
+
- **工具裁缝**(1.7.0 新增):扫描本机会话日志(解析 `tool/call` / `tool/result` / `request/header` 三类事件,不读消息正文),统计每个工具近 7/30/90 天的调用次数、错误率与最后使用时间;上下文税给**两个口径**——按当前注册表估算的 Schema 快照(它是 Schema 长度的纯函数,只有改动注册表才会变),以及按天采样 `request/header` 得到的每轮真实下发清单税,两者差额非零时说明栏指出「改了没生效 / 线上下发的比注册表多」;窗口内零调用的 MCP 工具自动进「死工具清单」,行内可一键禁用/启用对应服务器(复用官方写链,随时可恢复)。**默认显示全部工具与真实调用次数**,零调用的行以底色标出;想只看死工具时点「只看零调用(N)」切换。顶部说明栏常驻回显「显示 N/M 个工具」,避免筛选态被误读成「所有计数都是 0」;本机日志覆盖不足窗口天数、或有条目缺时间戳(`undatedCalls`)时也在这里显形,不再静默。账本缓存行只读(「清空缓存」按钮已删——实测既不回收空间也不修任何事)。全程只读,多帧 zstd 日志逐帧解析、个别帧损坏跳过不中断
|
|
99
101
|
- **WB 市场(直连安装,1.8.0 新增)**:看板第四个分类,两个市场一处浏览——
|
|
100
102
|
- **连接器(MCP)**:直读 WorkBuddy 官方分发 ZIP(`static.workbuddy.cn`,与 WorkBuddy 桌面端同一数据源),316 个连接器按需解析;可安装的 242 个(streamable-http 为主),CLI 型 / 需 WorkBuddy token 注入的 74 个如实标注「仅展示」并给出原因。安装 = 把该连接器的 `mcpServers` 合并写入 MCP 配置,与「导入 JSON」同一链路(准入、同名跳过、entry id 预留一致),全局与项目作用域都可选;ZIP 按 ETag 缓存在 `~/.dsh/wb-market/`,解压用 Node 内置 zlib,**零新增运行时依赖**
|
|
101
|
-
- **技能(SkillHub)**:直读 SkillHub 公开 API(`api.skillhub.cn`,19 万+ 技能),支持搜索(`keyword`)、排序(下载/安装/星标/评分)、分页;详情含发布方认证与安全扫描状态。安装 = 逐文件下载并按清单 sha256 校验后写入 `~/.agents/skills/`(与官方 skill
|
|
103
|
+
- **技能(SkillHub)**:直读 SkillHub 公开 API(`api.skillhub.cn`,19 万+ 技能),支持搜索(`keyword`)、排序(下载/安装/星标/评分)、分页;详情含发布方认证与安全扫描状态。安装 = 逐文件下载并按清单 sha256 校验后写入 `~/.agents/skills/`(与官方 skill 子系统同一发现范围),装完即刻生效;已装的显示「已安装」,可一键卸载、重装即更新。下载量排序在**当前页内**本地完成(上游 `sortBy=downloads` 现在会挂起),其余排序照常走远程;单次请求 15 秒超时,超时文案已中文化
|
|
102
104
|
- 技能版权归原作者所有;两个均为第三方接口,字段可能随上游改版变化(面板顶部有常驻说明)
|
|
103
105
|
- **专家直连(1.9.0 新增,体验对齐 WorkBuddy 专家中心)**:看板独立分类「专家」(侧栏入口同步更名「技能 · MCP · 专家」)——
|
|
104
106
|
- **目录**:直读 WorkBuddy 专家中心官方分发(`expert_center.json`,429 位专家 / 15 个行业分类,ETag 缓存在 `~/.dsh/wb-market/experts/`),分类筛选 + 关键词搜索 + 详情弹层(召唤前看人设正文、捆绑技能、试试这样问)
|
|
@@ -122,9 +124,17 @@ dsh plugin --profile web add github:2026heshao/dsh-armory
|
|
|
122
124
|
- 服务器返回 401 时自动弹出「授权 {服务器}」对话框并打开浏览器,无需用户先去找入口
|
|
123
125
|
- **安装凭据引导(2.0.0 新增)**:安装前扫 `mcpServers` 里的 `${...}` 占位符,弹「填写 {连接器} 的凭据」逐槽填写后「带凭据安装」;留空表示稍后自行补全,装完提示「另有 N 个占位符未填写,配置里保留原样」;无占位符的连接器直接放行
|
|
124
126
|
- **安装状态账本(2.0.0 新增)**:`~/.dsh/armory/install-state.json`(`INSTALL_STATE_VERSION = 1`)记录每条连接器 / 技能 / 插件的 `source {marketplace, url, kind}`,市场页据此支持**跨页**筛出已安装项(技能侧仍只筛当前页,两处文案分别说明),并把「本插件装的」与「别处手动配的」分开;登记失败不影响安装,只补一句提示
|
|
125
|
-
- **技能看板分类(2.0.0 新增)**:技能按 **编程开发 / 设计与创作 / 文档办公 / 效率与自动化 / 开发运维 / 未分类** 六类归置,网格与列表双视图可切、可按分类过滤,常驻「显示 N / M 个 skill」;详情新增所属分类、来源目录、文件位置,可一键「复制 SKILL.md 路径」「复制
|
|
127
|
+
- **技能看板分类(2.0.0 新增)**:技能按 **编程开发 / 设计与创作 / 文档办公 / 效率与自动化 / 开发运维 / 未分类** 六类归置,网格与列表双视图可切、可按分类过滤,常驻「显示 N / M 个 skill」;详情新增所属分类、来源目录、文件位置,可一键「复制 SKILL.md 路径」「复制 @会话引用」
|
|
128
|
+
- **技能卸载(2.2.0 新增)**:用户级 / 项目级目录里的 skill 可在详情里直接卸载(就地二次确认、**永久删除且不可撤销**);随 DSH 分发、运行时注册与自定义目录的 skill 只读,并说明不在可卸载范围内。宿主本身只提供读取接口,卸载由本插件的 `removeSkill` 完成:来源白名单 → 根目录严格包含性 → 父目录 realpath → 符号链接只 unlink 不碰目标 → 目录必须含 `SKILL.md` 且在根内
|
|
129
|
+
- **技能集合实时刷新(2.2.0 新增)**:市场安装 / 卸载技能、看板自己卸载,三处都会向模块级变更总线广播;顶部 **Skill** 数量角标与看板列表订阅同一条总线,各自重读真值,角标重取带序号守卫,快速连点也不会被乱序回包回滚。装完 / 卸完立刻对新集合,不必切页或重开面板
|
|
130
|
+
- **自定义套件(2.2.0 新增)**:把常一起用的 skill 打包成「套件」——Skill 看板工具栏的「套件」打开管理窗,左侧挑技能、右侧编排(点 **+** 或拖入添加,拖拽排序,删除就地二次确认),一次保存即整集合覆盖落盘到 `~/.dsh/armory/suites.json`(staging + rename 原子写,坏数据拒绝且原文件不动)。输入框召唤菜单的「技能」子菜单顶部会出现套件分组,点一次就按成员顺序把多个 `/name` 一并插进草稿。上限 100 个套件 / 每套 40 个成员;成员按各自的技能名进「最近使用」,不会把套件名记成一条孤立记录
|
|
126
131
|
- **多市场注册表(2.0.0 新增)**:市场源不再硬编码,落 `~/.dsh/armory/marketplaces.json`(`REGISTRY_VERSION = 1`),缺失或损坏回落内置默认项、首读即落盘,支持增删改;写盘一律 staging + rename 原子替换
|
|
127
132
|
- **社区目录秒开(2.0.0 新增)**:上次成功的精简清单镜像进浏览器 `localStorage`(7 天 / 4MB 上限,超配额保留旧快照),首屏先渲染快照再被真实结果静默替换(0 网络 0 IPC);源不可达时明说「显示的是本地缓存」而非给空列表
|
|
133
|
+
- **社区 README 预览(2.1.0 新增)**:点开「插件 → DSH 社区」任意卡片,即就地拉取并渲染该仓库 README(标题 / 段落 / 列表 / 表格 / 代码块 / 引用,含 `<p align="center"><img …>` 横幅)——
|
|
134
|
+
- **按需、只取一次**:README 不进目录的瘦身缓存,点开才拉;按 `README.md` / `readme.md` / `Readme.md` / `README.MD` / `README.markdown` / `README_EN.md` 顺序试;仓库填的是 npm 包名时,先问 `registry.npmjs.org` 取 `repository`,拿到再去 GitHub 取原文
|
|
135
|
+
- **限额与缓存**:单次 20s 超时、正文 16 万字符上限(超了截断并在界面标注);取到后按「仓库或 npm 包名」落盘缓存 7 天,同一插件再点秒开,断网 / 限流 / 仓库被删回落缓存并标明「这是缓存」
|
|
136
|
+
- **图片与安全**:`http(s)` 图片过 `wsrv.nl` 只读代理(`output=webp&q=72&w=880`,仅对白名单主机生效),相对路径按仓库地址还原成绝对 URL、还原不了就跳过;正文由自写解析器生成 React 元素,**不碰 `dangerouslySetInnerHTML`**,`javascript:` / `data:` / `vbscript:` 伪协议链接一律降级成纯文本
|
|
137
|
+
- **社区目录与更新探测修正(2.1.0)**:秒开快照不再顶掉真实目录(此前快照一渲染真实结果就被丢弃,目录于是一直停在旧快照);更新探测与目录改走同一条源链(先问这份缓存实际来自哪个源、再兜底其余源,首个拿到 ETag 的源胜出),修掉「主源不通的机器上目录能开、点检查更新却每次 `probe-failed`」
|
|
128
138
|
|
|
129
139
|
## 安装
|
|
130
140
|
|
|
@@ -242,23 +252,27 @@ dsh plugin --profile web remove dsh-armory
|
|
|
242
252
|
|
|
243
253
|
```sh
|
|
244
254
|
npm install --no-save yaml@2 eslint@9 # 测试与风格检查的唯一裸依赖(运行依赖全部由宿主提供)
|
|
245
|
-
npm test # 全
|
|
255
|
+
npm test # 全 40 套件(与 CI / 发版门槛同一条)
|
|
246
256
|
npm run lint # ESLint:no-undef / no-unused-vars / no-empty 等
|
|
247
257
|
npm run test:e2e # 可选:用宿主补丁算法验证专家预设进入组合树
|
|
248
258
|
dsh --profile web --dump-config # 看 profile 的有效配置
|
|
249
259
|
dsh web # 起 Web 做真实操作验证
|
|
250
260
|
```
|
|
251
261
|
|
|
252
|
-
`npm test` 跑的是 `test/run-all.mjs`,依次执行 **
|
|
262
|
+
`npm test` 跑的是 `test/run-all.mjs`,依次执行 **40** 个独立套件(各自是独立 node 进程,任一非零退出即整体失败)。套件是显式白名单而非 `node --test` 自动发现——`test/` 下还有带副作用的迁移脚本与需要宿主模块的端到端脚本,自动发现会误跑。
|
|
253
263
|
|
|
254
264
|
| 分组 | 套件 | 覆盖 |
|
|
255
265
|
| --- | --- | --- |
|
|
256
266
|
| 账本与配置层 | `tool-ledger` `mcp-config` | 工具账本的 zstd/缓存/尺寸闸门;MCP 配置归一化与 patch 往返 |
|
|
257
267
|
| 契约与入口 | `contract-consistency` `client-entry` `host-import-sources` | 面板可调方法必须在 typert 声明 / client 契约数组 / 宿主方法集三处同时存在;三个入口「全关」不可表达;VS Code `${input:}` 降级 |
|
|
258
268
|
| 客户端质量 | `client-i18n` `i18n-coverage` `error-boundary-copy` `persona-truncate` `tailor-window` | 中文皆包 `t()`;en-US 字典双向差集;崩溃详情可复制;persona 4000 预览阈值;工具裁缝时间窗四档 |
|
|
269
|
+
| 工具裁缝趋势(2.2.0) | `tailor-timeline` `tailor-tax-ui` `tailor-cache-line` | 真实下发税的时间维度与跨度归因(无线上数据必须为 null 而非 0);裁缝新字段在界面上的接线(vm 真跑源码片段);账本缓存行只剩读数(「清空缓存」按钮已删,钉住不许复活) |
|
|
270
|
+
| 自定义套件(2.2.0) | `suites-registry` `suites-client` | 整集合覆盖 / 幂等 / 拒绝与截断两态;id 归属契约(保存后不分裂)、引用套件展开为多个 `/name`、三级写通道降级 |
|
|
271
|
+
| 技能集合(2.2.0) | `skill-remove` `skill-refresh` | 卸载来源白名单与路径边界(根自身 / `..` 穿越 / 跨来源根 / 符号链接只删链接);装 / 卸后角标与看板实时刷新、乱序回包守卫 |
|
|
259
272
|
| 专家与团队 | `run-expert-manual` `session-persona` `team-bridge` `expert-card-actions` `recent-sort-regression` | 专家市场写链(真网目录 + 人设 + patch 往返,33 条断言);会话级挂/换/摘;团队桥接;卡片按钮真值表;「最近使用」排序 |
|
|
260
273
|
| 升级与安装真机 | `upgrade-plan` `verify-install-info` `verify-host-installinfo` `teardown-residue` | 一键升级判据(本地安装 / 来源未知一律不写);真 profile 数据下的来源判定(profile 不存在自行 SKIP);teardown 残留诊断 |
|
|
261
274
|
| 市场与安装链(2.0.0) | `wb-registry` `wb-install-state` `wb-auth-rules` `wb-connector-meta` `wb-plugin-market` `wb-awesome-market` `wb-install-flow` `wb-update-hint` `auth-gate-regression` `install-toast` | 多市场注册表原子写;安装状态与来源锁;令牌槽扫描与注入规则;连接器 R1/R2/R3 投影;插件清单嵌套解析;awesome 过滤/瘦身/304/双源切换;令牌替换写链;R9 更新探测五枚举;装前 401 鉴权闸;顶部安装浮层跨卸载可见 |
|
|
275
|
+
| 社区与前端护栏(2.1.0) | `awesome-readme` `no-conditional-hooks` | README 仓库解析(npm / GitHub URL 归一);解析器渲染结构与 `javascript:` / `data:` 伪链接拦截;组件内禁止条件调用 Hook(React #310) |
|
|
262
276
|
| 回归护栏 | `readme-images` `bugfix-armory` | README 配图不回退(引用可解析 + `screenshots.json` 与 README 一致 + 旧图名不得复活);市场入口强制选中与看板页重复让位 |
|
|
263
277
|
|
|
264
278
|
本机存在 `~/.dsh/profiles/desktop/cordis.patch.yml` 时,`run-expert-manual.mjs` 会追加一组真实 profile 往返断言,没有则记 `SKIP`。
|