dsh-armory 1.10.0 → 2.1.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 +63 -13
- package/README.md +77 -21
- package/docs/mcp-market-design.md +62 -0
- package/docs/prd-awesome-dsh-plugins.md +105 -0
- package/docs/prd-workbuddy-parity.md +128 -0
- package/docs/system-design-awesome.md +269 -0
- package/docs/system_design.md +530 -0
- package/docs/workbuddy-market-gap-analysis.md +197 -0
- package/lib/client.js +2179 -159
- package/lib/expert-market.js +13 -2
- package/lib/index.js +361 -7
- package/lib/mcp-oauth.js +806 -0
- package/lib/typert.js +26 -0
- package/lib/wb-auth-rules.js +128 -0
- package/lib/wb-awesome-market.js +721 -0
- package/lib/wb-install-state.js +151 -0
- package/lib/wb-market.js +213 -8
- package/lib/wb-plugin-market.js +291 -0
- package/lib/wb-registry.js +224 -0
- package/lib/whats-new.js +54 -0
- package/package.json +2 -2
package/README.en.md
CHANGED
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
[中文](README.md) | English
|
|
4
4
|
|
|
5
|
-
> **The all-in-one control board for DeepSeek Harness**: MCP servers · Skills · Experts · tool-usage ledger ·
|
|
6
|
-
> This project is a fork of [Imzl-zl/dsh-mcp-manager-ui](https://github.com/Imzl-zl/dsh-mcp-manager-ui) (MIT),
|
|
7
|
-
> upgraded from a pure MCP panel into a **
|
|
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
|
+
> 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.
|
|
8
|
+
>
|
|
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).
|
|
8
11
|
|
|
9
12
|
<p align="center">
|
|
10
13
|
<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>
|
|
@@ -35,17 +38,19 @@ Restart DSH, then open **Skills · MCP · Experts** from the global panel list a
|
|
|
35
38
|
| Installing skills means hunting for `SKILL.md` repos everywhere | **Direct markets**: SkillHub (190k+ skills), WorkBuddy connectors (316), 47 first-party-verified built-ins — search, filter, one-click install with per-file sha256 verification |
|
|
36
39
|
| Every MCP's tool descriptions eat context tokens; zero-use tools sit there for free | **Tool Tailor**: scans local session logs for call counts / errors / latency per tool; prune dead tools with one click |
|
|
37
40
|
| Migrating from Claude/Cursor/VS Code means copying config by hand | Detects local configs from 11 clients and imports them with a preview |
|
|
41
|
+
| OAuth-protected or key-protected servers and plugins just fail, with no hint why | **Plugin market** (CodeBuddy official + DSH community list) with per-entry source and installability, **one-click MCP OAuth** (RFC 9728 → 8414 → 7591 → 7636 PKCE → 8707, three callback fallbacks ending at "paste a token"), and a **credential prompt before install** that fills `${...}` placeholders so the server works on first connect |
|
|
38
42
|
|
|
39
43
|
|
|
40
|
-
A **unified board** for DeepSeek Harness (Web and desktop):
|
|
44
|
+
A **unified board** for DeepSeek Harness (Web and desktop): six top-level tabs — **MCP**, **Skill**, **Expert**, **Plugins**, **Tool Tailor** and **Market** — reachable from the global panel list at the top of the sidebar or the floating button. The panel floats above the session — **it never interrupts an ongoing conversation**.
|
|
41
45
|
|
|
42
46
|
| Tab | Manages |
|
|
43
47
|
|---|---|
|
|
44
48
|
| **MCP** | MCP servers: connection status, tool list, enable/disable, import, market install |
|
|
45
|
-
| **Skill** | Skills: enable/disable of `SKILL.md` folders, source directories, session audit scan |
|
|
49
|
+
| **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 |
|
|
46
50
|
| **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` |
|
|
51
|
+
| **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** |
|
|
47
52
|
| **Tool Tailor** | Per-tool call counts, error rates, latency and context-token cost from local session logs; 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 |
|
|
48
|
-
| **Market** |
|
|
53
|
+
| **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` |
|
|
49
54
|
|
|
50
55
|
> The Skill panel reads DSH's custom skill directory (default `~/.agents/skills`): each skill is a folder with a `SKILL.md`,
|
|
51
56
|
> whose frontmatter declares the invocation policy (`disable-model-invocation` / `user-invocable`).
|
|
@@ -53,19 +58,45 @@ A **unified board** for DeepSeek Harness (Web and desktop): five top-level tabs
|
|
|
53
58
|
|
|
54
59
|
## Screenshots
|
|
55
60
|
|
|
56
|
-
|
|
61
|
+
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:
|
|
57
62
|
|
|
58
|
-
|
|
63
|
+
### MCP — global board
|
|
59
64
|
|
|
60
|
-
|
|
65
|
+
Global / per-project scope tabs, inline enable/disable toggles; global and project servers may share a name while staying independent:
|
|
61
66
|
|
|
62
|
-

|
|
63
68
|
|
|
64
|
-
###
|
|
69
|
+
### MCP — connection details
|
|
65
70
|
|
|
66
|
-
|
|
71
|
+
Transport, connection parameters, call timeout and config source at a glance; below is the server's registered tool list (170 here — expand any row for its full input JSON Schema):
|
|
67
72
|
|
|
68
|
-

|
|
74
|
+
|
|
75
|
+
### Tool Tailor — tool-usage ledger
|
|
76
|
+
|
|
77
|
+
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
|
+
|
|
79
|
+

|
|
80
|
+
|
|
81
|
+
### Experts — summoned list
|
|
82
|
+
|
|
83
|
+
One card per summoned expert / expert team: bundled skills, details, dismiss; team experts expose a "roster" block in the detail dialog (each member's duty and persona file path):
|
|
84
|
+
|
|
85
|
+

|
|
86
|
+
|
|
87
|
+
### Market — three direct sources
|
|
88
|
+
|
|
89
|
+
Connectors (official WorkBuddy distribution, 316 entries; installable ones are labeled "install", CLI-based / token-dependent ones honestly show "view only" with the reason):
|
|
90
|
+
|
|
91
|
+

|
|
92
|
+
|
|
93
|
+
Skills (public SkillHub API, 190k+ skills; search + sort + pagination, installed ones show an "installed" badge with one-click uninstall):
|
|
94
|
+
|
|
95
|
+

|
|
96
|
+
|
|
97
|
+
Experts (WorkBuddy expert center, 429 experts / 15 industries; category filter + keyword search, "summon" straight from the card):
|
|
98
|
+
|
|
99
|
+

|
|
69
100
|
|
|
70
101
|
## Features (MCP board)
|
|
71
102
|
|
|
@@ -90,6 +121,25 @@ A **unified board** for DeepSeek Harness (Web and desktop): five top-level tabs
|
|
|
90
121
|
- **Most-recently-used first**: entries you just used float to the top with a "recent" badge, the rest keep their original order; the recency pool holds 40 entries
|
|
91
122
|
- **Experts attach / swap / detach at any time**: click one to take over the current session (including one already mid-conversation), click another to replace it, click the chip's × to drop it. It affects **only that session** — no tool catalog changes, nothing persisted
|
|
92
123
|
- **What you see is what's active**: once an expert is attached, the session header shows the expert that is **actually in effect** (the host's "preset chosen at session creation" label steps aside while an expert is attached); the header badge, the composer chip and the menu stay in sync within the same frame after attach / swap / detach
|
|
124
|
+
- **Plugins page (new in 2.0.0)**: three sources in one searchable, filterable directory, each entry labelled with its source and whether it can be installed —
|
|
125
|
+
- **Built-in**: components shipped with the DSH host; display-only
|
|
126
|
+
- **CodeBuddy official**: ZIP distribution, manifests parsed from `.codebuddy-plugin/marketplace.json` and `external_plugins/<name>/.codebuddy-plugin/plugin.json` (`MAX_ZIP_BYTES = 64MB`, ETag-cached)
|
|
127
|
+
- **DSH community**: the `awesome-dsh-plugins` list (a single bare-JSON file, 5000+ entries, jsdelivr primary → fastly fallback), slimmed to `SLIM_MAX_BYTES = 3MB` before caching
|
|
128
|
+
- **Installing** goes through the host's `pluginManager.installBundle`, and **the host must be restarted** for the plugin to load. A missing `pluginManager`, an entry with no npm package name, and an entry with no repository each produce a specific message instead of failing silently
|
|
129
|
+
- **One-click MCP OAuth (new in 2.0.0)**: `@deepseek-ai/dsh-mcp-client` accepts only `requestInit.headers` and has no authProvider, so OAuth has to complete **before** install — this plugin runs the flow and writes `authorization: Bearer <token>` into the patch headers, then refreshes it —
|
|
130
|
+
- Implements **RFC 9728** (protected-resource metadata) → **RFC 8414** (authorization-server metadata) → **RFC 7591** (dynamic client registration) → **RFC 7636 PKCE** (S256 only) → **RFC 8707** (`resource` parameter)
|
|
131
|
+
- **Three callback fallbacks**: a local `127.0.0.1:<random port>/callback` captures the code automatically (the common case) → when the registered client only accepts a custom scheme, it asks for the full callback URL to be pasted → otherwise it falls back to "paste an access token"
|
|
132
|
+
- A 401 from the server pops the "Authorize {server}" dialog and opens the browser for you
|
|
133
|
+
- **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
|
|
134
|
+
- **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
|
|
135
|
+
- **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". The board stays read-only (the host only exposes `listSkills` / `skillDetail`)
|
|
136
|
+
- **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
|
|
137
|
+
- **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
|
|
138
|
+
- **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) —
|
|
139
|
+
- **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
|
|
140
|
+
- **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
|
|
141
|
+
- **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
|
|
142
|
+
- **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
|
|
93
143
|
- 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
|
|
94
144
|
- Follows the DSH dark/light theme and adapts to narrow/mobile widths
|
|
95
145
|
- 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
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
中文 | [English](README.en.md)
|
|
4
4
|
|
|
5
|
-
> **DeepSeek Harness 的一体化管理看板**:MCP 服务器 · 技能 · 专家 · 工具使用账本 ·
|
|
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
|
+
>
|
|
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)。
|
|
8
11
|
|
|
9
12
|
<p align="center">
|
|
10
13
|
<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>
|
|
@@ -35,22 +38,51 @@ dsh plugin --profile web add github:2026heshao/dsh-armory
|
|
|
35
38
|
| 装技能要去各处翻 `SKILL.md` 仓库 | **市场直连**:SkillHub 19 万+ 技能、WorkBuddy 316 个连接器、47 个一手核实的内置服务,搜索/筛选/一键安装,逐文件 sha256 校验 |
|
|
36
39
|
| 每个 MCP 的工具描述都在吃上下文 token,零调用的工具白白占位 | **工具裁缝**:扫描本机会话日志统计每个工具的调用/错误/延迟,死工具清单一键禁用 |
|
|
37
40
|
| 从 Claude/Cursor/VS Code 迁移要逐条抄配置 | 自动检出 11 种客户端的本机配置,预览后一键导入 |
|
|
41
|
+
| 插件散在宿主自带、CodeBuddy 官方、社区清单三处,格式与可装性各不相同 | **插件页**:三个来源并进一个可搜索目录并标明可装性,安装统一走宿主 `pluginManager`,装完明确提示需重启 |
|
|
42
|
+
| 远端 MCP 要 OAuth,而官方 client 只认静态 headers,只能手搓 token | **一键授权**:按 RFC 9728/8414/7591/7636/8707 走完发现 → 注册 → PKCE → 回调 → 换 token,回调通道三级降级(loopback / 粘贴回调地址 / 手贴 token),到期自动刷新 |
|
|
43
|
+
| 装过的连接器、插件,过几天忘了是从哪来的 | **安装状态账本**:`~/.dsh/armory/install-state.json` 记录每条的来源市场,市场页可跨页筛出已安装项,并把「本插件装的」与「别处手动配的」分开 |
|
|
38
44
|
|
|
39
45
|
## 界面预览
|
|
40
46
|
|
|
41
|
-
|
|
47
|
+
看板五个主要分类页各一张(Windows 桌面端实拍,浅色主题)。2.0.0 新增的「插件」页与 OAuth 授权流程暂无截图:
|
|
48
|
+
|
|
49
|
+
### MCP — 全局管理面板
|
|
50
|
+
|
|
51
|
+
全局 / 项目双作用域切换,行内启停;全局与各项目之间可以同名共存、各自独立连接:
|
|
52
|
+
|
|
53
|
+

|
|
54
|
+
|
|
55
|
+
### MCP — 连接详情
|
|
56
|
+
|
|
57
|
+
传输方式、连接参数、调用超时、配置来源一目了然,下方是该服务器注册的工具清单(本例 170 个,展开可看完整输入 JSON Schema):
|
|
58
|
+
|
|
59
|
+

|
|
60
|
+
|
|
61
|
+
### 工具裁缝 — 工具使用账本
|
|
42
62
|
|
|
43
|
-
|
|
63
|
+
30 天窗口四张指标卡(调用总次数 / 出现过的工具 / 零调用 MCP 工具 / 整体错误率),逐工具列出调用、错误、错误率、Schema 上下文税与最后使用时间,底部常驻裁缝建议。默认显示全部工具与真实调用次数,需要时点「只看零调用(N)」收窄:
|
|
44
64
|
|
|
45
|
-
|
|
65
|
+

|
|
46
66
|
|
|
47
|
-
|
|
67
|
+
### 专家 — 已召唤清单
|
|
48
68
|
|
|
49
|
-
|
|
69
|
+
每个召唤的专家 / 专家团一张卡片:绑定技能、详情、送还;团队型专家在详情弹层里有「团队编制」区块(每位成员的职责与人设路径):
|
|
50
70
|
|
|
51
|
-

|
|
52
72
|
|
|
53
|
-
|
|
73
|
+
### 市场 — 三处直连
|
|
74
|
+
|
|
75
|
+
连接器(WorkBuddy 官方分发 316 个;可安装的标「可安装」,CLI 型 / 需 token 注入的如实标「仅展示」并给出原因):
|
|
76
|
+
|
|
77
|
+

|
|
78
|
+
|
|
79
|
+
技能(SkillHub 公开 API,19 万+ 技能;搜索 + 排序 + 分页,已装的标「已安装」可一键卸载):
|
|
80
|
+
|
|
81
|
+

|
|
82
|
+
|
|
83
|
+
专家(WorkBuddy 专家中心 429 位 / 15 个行业;分类筛选 + 关键词搜索,卡片直接「召唤」):
|
|
84
|
+
|
|
85
|
+

|
|
54
86
|
|
|
55
87
|
## 功能
|
|
56
88
|
|
|
@@ -80,6 +112,25 @@ dsh plugin --profile web add github:2026heshao/dsh-armory
|
|
|
80
112
|
- **最近使用置顶**:刚用过的条目自动排到最前并带「最近」标记,其余保持原有顺序;最近使用记录池 40 条
|
|
81
113
|
- **专家随时挂 / 换 / 摘**:点一个专家即接管当前会话(包括已经聊了一半的),再点别的直接替换,点 chip 的 × 立刻取消;**只影响这一个会话**,不动工具目录、不写任何持久化配置
|
|
82
114
|
- **显示与实效一致**:挂专家后,会话标题栏显示的始终是**当前真正生效**的专家(宿主那条「会话创建时的预设」标签在挂载期间自动让位);三处显示(标题栏徽章、输入框 chip、菜单)挂/换/摘后同帧同步
|
|
115
|
+
- **插件市场(2.0.0 新增)**:新增「插件」页,把三类来源并进一个可搜索、可筛选的目录,每条标明来源与可装性——
|
|
116
|
+
- **官方**:DSH 宿主自带组件,随宿主分发,不可单独安装(仅展示)
|
|
117
|
+
- **CodeBuddy 官方**:ZIP 分发,解析 `.codebuddy-plugin/marketplace.json` 与 `external_plugins/<name>/.codebuddy-plugin/plugin.json`(`MAX_ZIP_BYTES = 64MB`,ETag 命中不重下)
|
|
118
|
+
- **DSH 社区**:`awesome-dsh-plugins` 社区清单(单文件裸 JSON、五千余条,jsdelivr 主源 → fastly 备源),拉取后瘦身到 `SLIM_MAX_BYTES = 3MB` 再落缓存
|
|
119
|
+
- **安装**:统一走宿主 `pluginManager.installBundle` 拉取落盘,**装完需重启 DSH 宿主才生效**;宿主无 `pluginManager` / 条目无 npm 包名 / 无 repository 三种情况各自给出明确文案,不静默失败
|
|
120
|
+
- **MCP OAuth 一键授权(2.0.0 新增)**:官方 `@deepseek-ai/dsh-mcp-client` 的 transport 只认 `requestInit.headers`、没有 authProvider,所以 OAuth 必须在**安装前**由本插件跑完,把 `authorization: Bearer <token>` 静态写进 patch 的 headers,此后由本模块负责刷新——
|
|
121
|
+
- 按 **RFC 9728**(受保护资源元数据)→ **RFC 8414**(授权服务器元数据)→ **RFC 7591**(动态客户端注册)→ **RFC 7636 PKCE**(只发 S256)→ **RFC 8707**(`resource` 参数)逐条实现
|
|
122
|
+
- 回调通道**三级降级**:本地 `127.0.0.1:<随机端口>/callback` 自动收 code(主流实现)→ DCR 只接受自定义 scheme 时提示「粘贴完整回调地址」→ 都不通则直接「粘贴访问令牌」
|
|
123
|
+
- 服务器返回 401 时自动弹出「授权 {服务器}」对话框并打开浏览器,无需用户先去找入口
|
|
124
|
+
- **安装凭据引导(2.0.0 新增)**:安装前扫 `mcpServers` 里的 `${...}` 占位符,弹「填写 {连接器} 的凭据」逐槽填写后「带凭据安装」;留空表示稍后自行补全,装完提示「另有 N 个占位符未填写,配置里保留原样」;无占位符的连接器直接放行
|
|
125
|
+
- **安装状态账本(2.0.0 新增)**:`~/.dsh/armory/install-state.json`(`INSTALL_STATE_VERSION = 1`)记录每条连接器 / 技能 / 插件的 `source {marketplace, url, kind}`,市场页据此支持**跨页**筛出已安装项(技能侧仍只筛当前页,两处文案分别说明),并把「本插件装的」与「别处手动配的」分开;登记失败不影响安装,只补一句提示
|
|
126
|
+
- **技能看板分类(2.0.0 新增)**:技能按 **编程开发 / 设计与创作 / 文档办公 / 效率与自动化 / 开发运维 / 未分类** 六类归置,网格与列表双视图可切、可按分类过滤,常驻「显示 N / M 个 skill」;详情新增所属分类、来源目录、文件位置,可一键「复制 SKILL.md 路径」「复制 @会话引用」。看板仍是只读的(宿主只提供 `listSkills` / `skillDetail`)
|
|
127
|
+
- **多市场注册表(2.0.0 新增)**:市场源不再硬编码,落 `~/.dsh/armory/marketplaces.json`(`REGISTRY_VERSION = 1`),缺失或损坏回落内置默认项、首读即落盘,支持增删改;写盘一律 staging + rename 原子替换
|
|
128
|
+
- **社区目录秒开(2.0.0 新增)**:上次成功的精简清单镜像进浏览器 `localStorage`(7 天 / 4MB 上限,超配额保留旧快照),首屏先渲染快照再被真实结果静默替换(0 网络 0 IPC);源不可达时明说「显示的是本地缓存」而非给空列表
|
|
129
|
+
- **社区 README 预览(2.1.0 新增)**:点开「插件 → DSH 社区」任意卡片,即就地拉取并渲染该仓库 README(标题 / 段落 / 列表 / 表格 / 代码块 / 引用,含 `<p align="center"><img …>` 横幅)——
|
|
130
|
+
- **按需、只取一次**:README 不进目录的瘦身缓存,点开才拉;按 `README.md` / `readme.md` / `Readme.md` / `README.MD` / `README.markdown` / `README_EN.md` 顺序试;仓库填的是 npm 包名时,先问 `registry.npmjs.org` 取 `repository`,拿到再去 GitHub 取原文
|
|
131
|
+
- **限额与缓存**:单次 20s 超时、正文 16 万字符上限(超了截断并在界面标注);取到后按「仓库或 npm 包名」落盘缓存 7 天,同一插件再点秒开,断网 / 限流 / 仓库被删回落缓存并标明「这是缓存」
|
|
132
|
+
- **图片与安全**:`http(s)` 图片过 `wsrv.nl` 只读代理(`output=webp&q=72&w=880`,仅对白名单主机生效),相对路径按仓库地址还原成绝对 URL、还原不了就跳过;正文由自写解析器生成 React 元素,**不碰 `dangerouslySetInnerHTML`**,`javascript:` / `data:` / `vbscript:` 伪协议链接一律降级成纯文本
|
|
133
|
+
- **社区目录与更新探测修正(2.1.0)**:秒开快照不再顶掉真实目录(此前快照一渲染真实结果就被丢弃,目录于是一直停在旧快照);更新探测与目录改走同一条源链(先问这份缓存实际来自哪个源、再兜底其余源,首个拿到 ETag 的源胜出),修掉「主源不通的机器上目录能开、点检查更新却每次 `probe-failed`」
|
|
83
134
|
|
|
84
135
|
## 安装
|
|
85
136
|
|
|
@@ -196,27 +247,32 @@ dsh plugin --profile web remove dsh-armory
|
|
|
196
247
|
## 开发
|
|
197
248
|
|
|
198
249
|
```sh
|
|
199
|
-
npm install --no-save yaml@2
|
|
200
|
-
npm test # 全
|
|
250
|
+
npm install --no-save yaml@2 eslint@9 # 测试与风格检查的唯一裸依赖(运行依赖全部由宿主提供)
|
|
251
|
+
npm test # 全 33 套件(与 CI / 发版门槛同一条)
|
|
252
|
+
npm run lint # ESLint:no-undef / no-unused-vars / no-empty 等
|
|
201
253
|
npm run test:e2e # 可选:用宿主补丁算法验证专家预设进入组合树
|
|
202
254
|
dsh --profile web --dump-config # 看 profile 的有效配置
|
|
203
255
|
dsh web # 起 Web 做真实操作验证
|
|
204
256
|
```
|
|
205
257
|
|
|
206
|
-
`npm test` 跑的是 `test/run-all.mjs`,依次执行
|
|
258
|
+
`npm test` 跑的是 `test/run-all.mjs`,依次执行 **33** 个独立套件(各自是独立 node 进程,任一非零退出即整体失败)。套件是显式白名单而非 `node --test` 自动发现——`test/` 下还有带副作用的迁移脚本与需要宿主模块的端到端脚本,自动发现会误跑。
|
|
207
259
|
|
|
208
|
-
| 套件 | 覆盖 |
|
|
209
|
-
| --- | --- |
|
|
210
|
-
|
|
|
211
|
-
| `
|
|
212
|
-
| `
|
|
213
|
-
| `team-bridge
|
|
214
|
-
| `verify-install-info
|
|
215
|
-
| `
|
|
260
|
+
| 分组 | 套件 | 覆盖 |
|
|
261
|
+
| --- | --- | --- |
|
|
262
|
+
| 账本与配置层 | `tool-ledger` `mcp-config` | 工具账本的 zstd/缓存/尺寸闸门;MCP 配置归一化与 patch 往返 |
|
|
263
|
+
| 契约与入口 | `contract-consistency` `client-entry` `host-import-sources` | 面板可调方法必须在 typert 声明 / client 契约数组 / 宿主方法集三处同时存在;三个入口「全关」不可表达;VS Code `${input:}` 降级 |
|
|
264
|
+
| 客户端质量 | `client-i18n` `i18n-coverage` `error-boundary-copy` `persona-truncate` `tailor-window` | 中文皆包 `t()`;en-US 字典双向差集;崩溃详情可复制;persona 4000 预览阈值;工具裁缝时间窗四档 |
|
|
265
|
+
| 专家与团队 | `run-expert-manual` `session-persona` `team-bridge` `expert-card-actions` `recent-sort-regression` | 专家市场写链(真网目录 + 人设 + patch 往返,33 条断言);会话级挂/换/摘;团队桥接;卡片按钮真值表;「最近使用」排序 |
|
|
266
|
+
| 升级与安装真机 | `upgrade-plan` `verify-install-info` `verify-host-installinfo` `teardown-residue` | 一键升级判据(本地安装 / 来源未知一律不写);真 profile 数据下的来源判定(profile 不存在自行 SKIP);teardown 残留诊断 |
|
|
267
|
+
| 市场与安装链(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 鉴权闸;顶部安装浮层跨卸载可见 |
|
|
268
|
+
| 社区与前端护栏(2.1.0) | `awesome-readme` `no-conditional-hooks` | README 仓库解析(npm / GitHub URL 归一);解析器渲染结构与 `javascript:` / `data:` 伪链接拦截;组件内禁止条件调用 Hook(React #310) |
|
|
269
|
+
| 回归护栏 | `readme-images` `bugfix-armory` | README 配图不回退(引用可解析 + `screenshots.json` 与 README 一致 + 旧图名不得复活);市场入口强制选中与看板页重复让位 |
|
|
216
270
|
|
|
217
271
|
本机存在 `~/.dsh/profiles/desktop/cordis.patch.yml` 时,`run-expert-manual.mjs` 会追加一组真实 profile 往返断言,没有则记 `SKIP`。
|
|
218
272
|
|
|
219
|
-
|
|
273
|
+
> `auth-gate-regression.mjs` 的被测对象是**运行时副本**(`~/.dsh/profiles/desktop/node_modules/dsh-armory/lib/`),开工前做 SHA256 哈希预检,不符即中止。
|
|
274
|
+
|
|
275
|
+
CI(`.github/workflows/ci.yml`)与发版门槛(`.github/workflows/release.yml`)跑同两条命令:`npm run lint` + `npm test`,两处口径不许分叉。`release.yml` 另外校验 tag / `package.json` / `lib/whats-new.js` / `.github/release-notes/v<version>.md` 四者版本一致,才 `npm publish` 并建 GitHub Release;发版流程见 [安装与升级](docs/installation.md#发布流程维护者)。
|
|
220
276
|
|
|
221
277
|
> 本机若没有 `yaml`,`npm test` 会以 `ERR_MODULE_NOT_FOUND` 退出——`test/loader.mjs` 会先试标准解析,失败才回退开发机的 profile 副本(`~/.dsh/profiles/desktop/node_modules`),所以干净环境必须先装依赖。
|
|
222
278
|
|
|
@@ -553,3 +553,65 @@ font-family: var(--dsw-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace
|
|
|
553
553
|
- **别名层用 `--mcp-*` 收口**,市场 UI 复用同一批,不另起一套。
|
|
554
554
|
|
|
555
555
|
> 📌 本节与第八节只是**结论摘要**。规则正文(为什么挂 `body`、四条官方 spec 的判据从哪来、令牌存在性怎么查)以 `docs/design.md` 为准,避免两处各自演化。
|
|
556
|
+
|
|
557
|
+
---
|
|
558
|
+
|
|
559
|
+
## 十二、认证:401 连接器怎么装(OAuth 已落地)
|
|
560
|
+
|
|
561
|
+
这一节补的是前面几节没覆盖的一类条目:**能连通、但必须有凭据**。316 条连接器里 `auth_mode=token` 73 条、`auth_mode=oauth` 8 条,另各 12+1 条 server-side / oneid-token。它们的共同表现是 `initialize` 直接 **HTTP 401**,而不是超时或 DNS 失败——这正是第五节探测里必须单独拎出来的一类状态。
|
|
562
|
+
|
|
563
|
+
### 探测的三种结果,不是两种
|
|
564
|
+
|
|
565
|
+
第五节那张表只有 `ok`,对需要授权的服务器永远是 `false`,会被误分类成「挂了」。实现上拆成三态(`lib/wb-market.js` 的 `probeServerAuthorization`):
|
|
566
|
+
|
|
567
|
+
| 结果 | 判据 | 面板语义 |
|
|
568
|
+
|---|---|---|
|
|
569
|
+
| `{ authorized: true, status }` | 2xx | 可用 |
|
|
570
|
+
| `{ authorized: false, needsAuth: true, status, wwwAuthenticate, resourceMetadata }` | 401 / 403 | **需要授权** → 走引导,不报错 |
|
|
571
|
+
| `{ authorized: true, error: "probe-unreachable" }` | fetch 抛错 / 8s 超时 | 不可达,与授权无关 |
|
|
572
|
+
|
|
573
|
+
**关键决策:401 不 `throw`。** 旧实现把它包装成「该服务器要求鉴权凭据,DSH 无法自动注入;请改用 WorkBuddy」——一句话同时做了两件错事:把可恢复状态当致命错误、并把用户推向另一个产品。现在 401 只是一条数据,由 UI 决定下一步。
|
|
574
|
+
|
|
575
|
+
### 为什么在插件侧做,而不是等宿主补
|
|
576
|
+
|
|
577
|
+
DSH 核心在 `app.asar` 内不可改。但 OAuth 全链路是**纯 HTTP + 一个本地监听**,插件侧完全能做,不需要宿主任何配合。这条边界划清了,"等宿主支持"就不是理由。
|
|
578
|
+
|
|
579
|
+
### 四段 RFC,每段都有真实坑
|
|
580
|
+
|
|
581
|
+
| 步骤 | 做什么 | 实测踩到的坑 |
|
|
582
|
+
|---|---|---|
|
|
583
|
+
| **RFC 9728** 资源元数据 | 从 `WWW-Authenticate: Bearer resource_metadata="..."` 拿资源元数据地址,取得 `authorization_servers` | well-known 有**路径级**(`<resource-path>/.well-known/oauth-protected-resource`)与**根级**两种。westock-mcp 路径级 404、根级 200 —— 必须回落,不能只试一个 |
|
|
584
|
+
| **RFC 8414** AS 元数据 | `/.well-known/oauth-authorization-server`,取 `authorization_endpoint` / `token_endpoint` / `registration_endpoint` / `scopes_supported` | `token_endpoint_auth_methods_supported` 里没有 `none` 就说明必须机密客户端(带 client_secret),插件侧做不到 → 明确失败,别硬试 |
|
|
585
|
+
| **RFC 7591** 动态注册 | 公共客户端注册,拿 `client_id` | **最大的坑**:`redirect_uris` 白名单常常只收自家 scheme 模板。westock-mcp 只接受 `workbuddy://workbuddy/mcp/connector:<name>/oauth/callback`,loopback 一律 400。更阴的是错误 body 里 `<` `>` 被 JSON 转义成**字面** `\u003c` `\u003e`,正则按 `<...>` 匹配会直接漏掉 —— 必须先 unescape 再替换占位符,否则会拿一个含字面 `\u003cname\u003e` 的 URL 去重试,永远 400 |
|
|
586
|
+
| **RFC 7636** PKCE | `S256` | `code_challenge_methods_supported` 没列 `S256` 就别降级 `plain`,直接判不支持 |
|
|
587
|
+
|
|
588
|
+
### 回调的两条路
|
|
589
|
+
|
|
590
|
+
1. **loopback**(默认):监听 `127.0.0.1` 随机端口,浏览器授权后直接收 `code` 换 token。用户体验最好,一次点击。
|
|
591
|
+
2. **手动回传**(降级):服务端只认自定义 scheme 时,callback 无法被本地 HTTP 收到 —— 面板展示授权链接 + 「粘贴完整回调地址」输入框,用户手动贴回来,再从 URL 解析 `code`。同一套 `submitCallback` 处理,只是入口不同。
|
|
592
|
+
|
|
593
|
+
两条路都要留「直接粘贴 access token」的兜底:有些服务端的授权页只对官方客户端开放,用户却能从别处拿到 token。
|
|
594
|
+
|
|
595
|
+
### token 存哪、怎么注入
|
|
596
|
+
|
|
597
|
+
- 落盘 `(DSH_HOME || ~/.dsh)/armory-oauth/<sha256(serverUrl)[:32]>.json`,`mode: 0o600`。
|
|
598
|
+
- **不写进 `mcp.json`**:那个文件会被用户分享、同步、贴进 issue。凭据单独存,配置里只留引用关系。
|
|
599
|
+
- 装前由 `injectStoredOAuthTokens` 把 `Authorization: Bearer <token>` 注入到 http 型 server 的 headers,**再**探测;探测因此直接 2xx,安装流程不需要感知 OAuth 存在。
|
|
600
|
+
- 过期自动 refresh(`grant_type=refresh_token`);无 `refresh_token` 时返回「需要重新授权」,而不是静默 401。
|
|
601
|
+
|
|
602
|
+
### 安全边界
|
|
603
|
+
|
|
604
|
+
- token 文件权限 `0o600`;面板只显示是否已授权,不回显完整 token。
|
|
605
|
+
- 授权引导的错误文案**只拼服务器名**(`连接器需要授权:<name>、<name>`),不拼 URL、不拼 token。旧版把完整 URL 抛给用户,URL 带 query 时会把凭据一起泄进日志。
|
|
606
|
+
- 只信任连接器**自己声明**的授权服务器,不做跨域发现、不跟随到第三方 AS。
|
|
607
|
+
|
|
608
|
+
### 仍未做
|
|
609
|
+
|
|
610
|
+
- **server-side(12 条)**:需要闭源代理,插件侧无解,只在安装时标注「需自备凭据」。
|
|
611
|
+
- **oneid-token(1 条)**:绑定 WB 账号登录态,不做。
|
|
612
|
+
- token 文件加密(当前靠文件权限)、多账号隔离 —— 与 X1/X9 同源,属定位外。
|
|
613
|
+
- 非公共客户端(`token_endpoint_auth_methods_supported` 无 `none`)的服务端:需要用户自备 `client_id`/`client_secret`,尚未提供输入口。
|
|
614
|
+
|
|
615
|
+
### 回归
|
|
616
|
+
|
|
617
|
+
接口约定落在 `test/auth-gate-regression.mjs`(6 节:三态探测、可装性、PKCE/元数据解析、token 生命周期、装饰器与 RPC 契约、静态锚点),不联网、不依赖部署状态。
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# PRD:dsh-armory 接入 awesome-dsh-plugins 插件市场(增量 PRD)
|
|
2
|
+
|
|
3
|
+
> 档位:简单 PRD | 语言:中文 | 版本:v1.1(2026-10-20,Alice;v1.1 并入用户三项拍板:unverified 不进缓存 / 默认序 stars 降序 / skill 类插件市场承接)
|
|
4
|
+
> 上游源:`dshworks/awesome-dsh-plugins` 仓库 `data/plugins.json`(13,400,935 字节)+ `data/schema.json`(6,370 字节),updated=2026-10-19。
|
|
5
|
+
> 本 PRD 只写需求与验收口径,不写实现方案(架构决策归架构师)。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 项目信息
|
|
10
|
+
|
|
11
|
+
- **Language**: 中文 | **Programming Language**: 纯 JavaScript(Node ≥ 22.15,ESM,零新依赖)| **Project Name**: `dsh_armory_awesome_dsh_plugins`
|
|
12
|
+
- **原始需求复述**(用户原话 m03157): 「你看能不能把这个插件市场链接到github上的awesome-dsh-plugins列表,让其全部变为dsh的插件」
|
|
13
|
+
- **合理解读**: awesome-dsh-plugins 是 DSH(DeepSeek Harness)宿主生态的插件目录(20,769 条),与现有 codebuddy 源(WorkBuddy/Cordis 生态,zip 包 206 条插件)**不是同一运行时**。「全部变为 dsh 的插件」= 在 dsh-armory 面板新增「DSH 社区插件」市场视图,让用户可浏览并一键安装这些条目到 DSH 宿主。
|
|
14
|
+
- **与 prd-workbuddy-parity.md 的关系**: 全新增量功能,不改动既有 P0 范围(R1–R3)与 Non-Goals(X1–X9 继续有效);需求编号自 R11 续编,可复用该 PRD 已建立的机制(R10 排序范式、ETag 更新探测思路、restartNotice)。
|
|
15
|
+
- **网络实测基线**(本机 2026-10-20): jsdelivr ✅ / fastly.jsdelivr ✅ / api.github.com ✅;raw.githubusercontent.com ❌、github.com 直连 ❌ 超时——**安装与拉取主路径必须避开 github.com 直连**。
|
|
16
|
+
- **并行事项**: 现有「目录投影漏 repository」「installPlugin 假成功」两处 bug 由其他工程师修复中,本 PRD 不以其为前置依赖,验收按修复后的正常行为口径。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2. 产品定义
|
|
21
|
+
|
|
22
|
+
### Product Goals(3 个正交目标)
|
|
23
|
+
|
|
24
|
+
1. **内容接入**: 将 awesome-dsh-plugins 作为第二个插件市场源接入 dsh-armory;P0 收录口径 = status=verified ∧ 带 npm 字段(两集合分别 20,264 / 6,404 条,交集落地时实测,量级 ≈ 6 千条),实现浏览/搜索/一键安装到 DSH 宿主。
|
|
25
|
+
2. **大数据可用性**: 13.4MB 全量目录经「一次全量拉取 → 运行时瘦身过滤 → 本地瘦身影射缓存」后压缩到 ≈ 1.5–2MB,面板分页/搜索/筛选全部本地即时响应,永不渲染全量。
|
|
26
|
+
3. **弱网可靠性**: CDN 多源容错(jsdelivr → fastly → api.github.com 兜底)+ 本地缓存降级;在 github.com 直连不可达的实测网络下,浏览与安装主路径(npm spec)不受阻。
|
|
27
|
+
|
|
28
|
+
### User Stories(5 个)
|
|
29
|
+
|
|
30
|
+
1. As a DSH 用户, I want 在 armory 插件面板里浏览并搜索 awesome-dsh-plugins 的 verified 插件, so that 不必自己去翻 13.4MB 的原始列表找插件。
|
|
31
|
+
2. As a DSH 用户, I want 一键安装 npm 可装的插件(`npm:<name>`), so that 不用手敲命令行安装。
|
|
32
|
+
3. As a DSH 用户, I want 看到分类/标签/stars/官方标识/「验证于 dsh x.y.z」徽章, so that 快速判断插件质量与 DSH 版本适配。
|
|
33
|
+
4. As a DSH 用户, I want 断网或全源不可达时仍能浏览上次缓存的目录, so that 弱网只限制安装、不阻塞浏览。
|
|
34
|
+
5. As a DSH 用户, I want broken 条目不可见不可装、unverified 有明确标注, so that 不误装坏插件。
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 3. 技术规范
|
|
39
|
+
|
|
40
|
+
### 3.1 全局约束(继承 parity PRD)
|
|
41
|
+
|
|
42
|
+
- 零新依赖;新增 Host Remote 方法必须 `lib/index.js` / `lib/typert.js` / `lib/client.js` 三处同步;缓存与状态写 `~/.dsh`。
|
|
43
|
+
- X 约束继承:**无常驻定时器**(X4,联网仅懒触发一次性探测);**不代填凭据**(X9 不涉,awesome 数据无凭据字段);**安装成功必须出现「需重启 DSH 宿主」提示**(沿用现有 restartNotice)。
|
|
44
|
+
- 架构决策点(仅陈述需求):awesome 源为**裸 JSON**(非 zip、无 `.codebuddy-plugin/marketplace.json` 结构),现有 `wb-plugin-market.js` zip 管线不适用,**需新增 JSON 读取器**;源注册(`~/.dsh/armory/marketplaces.json` + `wb-registry.js`)的 kind 语义如何扩展由架构师定。
|
|
45
|
+
|
|
46
|
+
### 3.2 Requirements Pool
|
|
47
|
+
|
|
48
|
+
> 优先级:P0 = 本迭代必做,P1 = Should,P2 = Could。编号 R11 起续编,与 parity PRD 的 R1–R10 不冲突。
|
|
49
|
+
|
|
50
|
+
#### P0
|
|
51
|
+
|
|
52
|
+
- **R11|must:DSH 插件源接入 + 数据瘦身口径(数据规模策略,本 PRD 最重要决策)**
|
|
53
|
+
- 口径:**一次全量拉取 `data/plugins.json`(13.4MB,CDN 单文件)→ 运行时过滤 status=verified ∧ npm 存在 → 瘦身影射落盘本地缓存**;瘦身影射字段 = name / repo / npm / description(截断)/ category / status / tags / stars / official / verifiedAgainst / lastVerified;预估 ≈ 6 千条 × ~200–300B ≈ **1.5–2MB**(验收上限 3MB)。面板只读瘦身缓存,本地分页(≤50 条/页)+ 搜索。不做 category 限制(category 仅作筛选维度;skill 类去向已拍板,见 R20)。
|
|
54
|
+
- 落选备选及理由:分类聚合 + 懒加载(交互复杂、全局搜索体验差);每次拉全量直渲染(13.4MB 内存与渲染不可接受)。
|
|
55
|
+
- **源关系(与现有 codebuddy 源)**: **并列视图、不合并混排**——两者运行时(DSH 宿主 vs Cordis)、数据格式(裸 JSON vs zip+plugin.json)、安装链路均不同,合并列表加来源徽章会让用户无法判断装的是哪边的东西。
|
|
56
|
+
- 验收:must——面板可浏览/搜索/分页该瘦身子集;断网重开后缓存仍可浏览;缓存文件 ≤ 3MB。
|
|
57
|
+
- **R12|must:安装 spec 推导(npm 主路径)**
|
|
58
|
+
- npm 字段存在 → `npm:<name>`(优先级最高,实测网络下唯一高成功率路径);走现有宿主 `pluginManager.installBundle(spec, {})` 双参通道;安装成功后出现醒目持久的「需重启 DSH 宿主后生效」提示。
|
|
59
|
+
- 验收:must——任选 1 条 npm 插件安装成功且出现重启提示,重启宿主后生效。
|
|
60
|
+
- **R13|must:分类与筛选**
|
|
61
|
+
- category 5 类(plugin 19,968 / skill 694 / bundle 102 / tool 3 / theme 2)chips 单选筛选;tags 17 枚举(ui/terminal/agents/memory/models/vision/capabilities/channels/notifications/usage/observability/marketplace/devtools/safety/knowledge/interop/fun)多选下拉;搜索框与「只看已安装」复用现有面板控件。
|
|
62
|
+
- 验收:must——筛选与搜索结果正确、本地即时响应;skill/theme/tool 类条目正常展示。
|
|
63
|
+
- **R14|must:CDN 多源容错与降级**
|
|
64
|
+
- 拉取顺序:jsdelivr → fastly.jsdelivr → api.github.com(兜底;其能否承载 13.4MB 单文件由架构师验证,见 OQ2)。失败原因复用现有五枚举 reason 思路扩展(如 no-source / all-sources-failed / stale-cache)。
|
|
65
|
+
- 降级表现:全源失败且无缓存 → 空态「源不可达,稍后重试」;全源失败但有缓存 → 正常列表 + 顶部「目录已过期(上次更新 YYYY-MM-DD)」提示。
|
|
66
|
+
- 验收:must——屏蔽首源后自动切换次源成功;全源失败时两种降级表现均正确。
|
|
67
|
+
- **R15|must:懒触发更新探测(X4 继承)**
|
|
68
|
+
- 仅在打开 DSH 插件视图或手动刷新时执行一次性条件探测(复用 `wbPluginUpdateCheck` 的 ETag 五枚举思路);上游更新 → 顶部更新提示,用户确认后拉取并重瘦身。无常驻定时器、不静默更新。
|
|
69
|
+
- 验收:must——上游更新后再次打开面板出现更新提示,确认后目录刷新为最新。
|
|
70
|
+
|
|
71
|
+
#### P1
|
|
72
|
+
|
|
73
|
+
- **R16|should:github 直装路径扩展(依赖 OQ1/OQ6)**
|
|
74
|
+
- 无 npm 的 verified 条目 → `github:owner/repo#ref`;monorepo path 条目(`github:owner/repo#ref:path` 形态)在宿主支持度实测确认前**一律不可装**,卡片标注「暂不支持安装」。
|
|
75
|
+
- 边界:实测网络 github.com 直连不可达,该路径安装可能失败,必须给出明确失败原因(不得复用假成功行为)。
|
|
76
|
+
- 验收:should——网络允许时至少 1 条无 npm 插件安装成功;path 条目不可装但有标注;安装失败有明确错误。
|
|
77
|
+
- **R17|should:质量信号透出与状态策略**
|
|
78
|
+
- broken(102 条)**永不进瘦身缓存,任何视图不可见不可装**;unverified(403 条)**不进缓存**(✅ 用户已拍板 2026-10-20,安全优先,不再考虑展示标注方案);official=true → 「官方」徽章、featured → 「精选」徽章;卡片显示 stars 与「✓ verified(dsh <verifiedAgainst>)」小徽章,详情页补 lastVerified。
|
|
79
|
+
- 验收:should——徽章与验证信息正确展示;broken 在任何筛选/搜索组合下不出现。
|
|
80
|
+
- **R18|should:排序(复用 parity R10 范式)**
|
|
81
|
+
- 按 stars / added(最新收录)/ 名称本地排序;**默认序 = stars 降序**(✅ 用户已拍板 2026-10-20;featured/official 只做徽章展示,不参与默认序)。
|
|
82
|
+
- 验收:should——排序切换后列表正确重排。
|
|
83
|
+
|
|
84
|
+
#### P2
|
|
85
|
+
|
|
86
|
+
- **R19|could:详情增强** —— evidence 链接、pushedAt / added / starsUpdated / repo 链接全量展示。验收:could——详情字段完整、链接可一键复制。
|
|
87
|
+
- **R20|已拍板(✅ 2026-10-20):skill 类由插件市场承接** —— 694 条 skill 类条目保留在 DSH 社区插件视图,不引流技能市场;用 category=skill chips 筛选区分。验收:skill 条目在插件视图可浏览可筛选,技能市场不重复收录。
|
|
88
|
+
|
|
89
|
+
### 3.3 UI Design Draft(文字描述)
|
|
90
|
+
|
|
91
|
+
- **入口**: 市场「插件」子 tab 顶部新增来源切换——「CodeBuddy 官方(206)|DSH 社区(awesome)」,并列视图、默认 CodeBuddy,用户选择本地记忆。
|
|
92
|
+
- **工具行**(DSH 视图): 搜索框(复用)+ category chips(5 类)+ tags 多选下拉(17 枚举)+ 「只看已安装」开关(复用)+ 排序下拉(R18)。
|
|
93
|
+
- **卡片**: 名称 + description 一行截断 + category 徽章 + tags(≤2)+ stars + 「✓ verified (dsh 0.2.x)」徽章(示意)+ 官方/精选徽章 + 右下「安装」按钮;path 条目按钮替换为灰置「暂不支持安装」。
|
|
94
|
+
- **详情弹层**: 完整 description、repo、npm 包名、category/tags、stars、pushedAt/added/lastVerified/verifiedAgainst、「安装」按钮。
|
|
95
|
+
- **安装按钮状态机**: 未安装[安装] → 安装中[disabled+转圈] → 成功[已安装 ✓ + 顶部持久「需重启 DSH 宿主」提示条] / 失败[红色错误 + 可重试]。
|
|
96
|
+
- **容错表现**: 首载骨架屏;全源失败且有缓存 → 列表 + 「目录已过期(上次更新 YYYY-MM-DD)」提示条;无缓存 → 空态引导重试。
|
|
97
|
+
|
|
98
|
+
### 3.4 Open Questions(需架构师/用户拍板)
|
|
99
|
+
|
|
100
|
+
1. **monorepo path 条目**: `github:owner/repo#ref:path` 形态的宿主 installBundle 支持度未验证——需架构师选 1 个真实条目实测后解锁 R16。
|
|
101
|
+
2. **13MB 源缓存策略**: 复用 ETag 条件请求(推荐,避免每次重拉 13.4MB)vs 每次全量拉取后瘦身覆盖;上游 CDN 是否输出稳定 ETag 需实测。api.github.com 兜底对 13.4MB 单文件的可行性(Contents API 有体积上限)也需验证。
|
|
102
|
+
3. **unverified 403 条**: ✅ 已拍板(2026-10-20)——**不进缓存**(安全优先);broken 102 条按「直接不进缓存」写入本 PRD。
|
|
103
|
+
4. **默认排序**: ✅ 已拍板(2026-10-20)——**stars 降序**为默认序;featured/official 仅作徽章展示,不参与默认序。
|
|
104
|
+
5. **skill 类 694 条去向**: ✅ 已拍板(2026-10-20)——**插件市场承接**,category=skill 筛选区分,不引流技能市场。
|
|
105
|
+
6. **无 npm 条目的 ref 取值**: 默认分支、固定 tag,还是与 verifiedAgainst 版本映射——影响 R16 spec 的正确性。
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# PRD:dsh-armory WorkBuddy 市场对标(增量 PRD)
|
|
2
|
+
|
|
3
|
+
> 档位:简单 PRD | 语言:中文 | 版本:v1.0(2026-10-20,Alice)
|
|
4
|
+
> 唯一权威输入:`docs/workbuddy-market-gap-analysis.md`。本 PRD 只写「要在 dsh-armory 上新增/修改什么」,不重复报告论证过程。
|
|
5
|
+
> 范围 = 报告第三节差距清单(G1–G11)+ 第五节落地顺序(三批推进);排除项 X1–X9 全部列为 Non-Goals,禁止进入需求池。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 项目信息
|
|
10
|
+
|
|
11
|
+
- **Language**: 中文(与用户语言一致)
|
|
12
|
+
- **Programming Language**: 纯 JavaScript(无构建步骤、无 TypeScript、无 UI 框架),Node ≥ 22.15,ESM。
|
|
13
|
+
- UI:`lib/client.js` 内手写 Web 面板(注入 DSH Web GUI)
|
|
14
|
+
- 市场数据层:`lib/wb-market.js`(WB 连接器/技能)、`lib/wb-zip.js`(zip 下载解压,零新依赖)、`lib/expert-market.js`(专家)
|
|
15
|
+
- Host Remote 契约三件套:`lib/index.js` + `lib/typert.js` + `lib/client.js`(新增 Remote 方法必须三处同步,漏一处会静默 404)
|
|
16
|
+
- **Project Name**: `dsh_armory_workbuddy_parity`
|
|
17
|
+
- **原始需求复述**: 对标 WorkBuddy 市场体系(已卸载,数据目录 `C:\Users\LENOVO\.workbuddy`),在 dsh-armory 现有「市场」标签页(连接器/技能/内置 MCP 三类)之上,按差距报告结论补齐**当前技术条件下可实现**的差距:三批推进(正确性补丁 → 市场扩展 → 基础设施),并明确不做的边界(X1–X9)。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 2. 产品定义
|
|
22
|
+
|
|
23
|
+
### Product Goals
|
|
24
|
+
|
|
25
|
+
1. **正确性优先**:修复连接器「残缺安装」——解析 `auth_injection_rules`,让 tencent-docs / ima-mcp 等连接器装完即真正可用(G2),同时把已有连接器数据(visible_in 标签、示例问法、版本)利用起来(G3/G5)。
|
|
26
|
+
2. **补齐最大内容品类与可用性**:新增「插件」市场子 tab(依托多市场注册表接入 codebuddy-plugins-official,150+ 插件,一次装齐技能+命令+钩子+MCP 组合包),并以「令牌引导安装」解锁 80+ 条需认证连接器(G7/G1/G10/G4)。
|
|
27
|
+
3. **建立可管理的基础设施**:本地安装状态与来源锁可查可筛、目录打开时自动保鲜提示、列表排序对齐技能侧体验(G6/G9/G8/G11)。
|
|
28
|
+
|
|
29
|
+
### User Stories
|
|
30
|
+
|
|
31
|
+
1. **As a** DSH 用户, **I want** 在 armory 里浏览并安装 codebuddy-plugins-official 的插件(如官方 docx/pptx 技能包、security-scan), **so that** 一次装齐「技能+命令+钩子+MCP」组合包,而不必逐个装 MCP 或技能。
|
|
32
|
+
2. **As a** DSH 用户, **I want** 安装 tencent-docs / ima-mcp 等连接器时自动应用其 token 注入规则, **so that** 装完即可用,而不是残缺安装后手工补 token。
|
|
33
|
+
3. **As a** DSH 用户, **I want** 安装 auth_mode=token 的连接器前自行填入令牌, **so that** 80+ 条需认证连接器在 armory 里真正可用。
|
|
34
|
+
4. **As a** DSH 用户, **I want** 看到连接器的部署/档位标签、版本与示例问法, **so that** 快速判断哪些连接器适合我,并直接复制示例 prompt 试用。
|
|
35
|
+
5. **As a** DSH 用户, **I want** 在列表中看到哪些连接器/插件已安装并按状态全量筛选, **so that** 避免重复安装、便于管理已装内容。
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 3. 技术规范
|
|
40
|
+
|
|
41
|
+
### 3.1 全局技术约束
|
|
42
|
+
|
|
43
|
+
- **零新依赖**贯穿全程(zip 下载解压继续走 `lib/wb-zip.js`)。
|
|
44
|
+
- 新增 Host Remote 方法必须 `lib/index.js` / `lib/typert.js` / `lib/client.js` **三处同步**,漏一处静默 404。
|
|
45
|
+
- 注册表与本地状态文件均写入 `~/.dsh`(armory 已有该目录写入能力)。
|
|
46
|
+
- 批次顺序与依赖:批次一独立先行;批次二内 G1 依赖 G7(不为插件源硬编码 URL)、G10 内嵌于 G1;批次三内 G6 与 G9 共用同一份本地状态文件设计。
|
|
47
|
+
|
|
48
|
+
### 3.2 Requirements Pool
|
|
49
|
+
|
|
50
|
+
> 优先级:P0 = Must have(本迭代必做),P1 = Should have,P2 = Could have。每条映射差距编号与批次。
|
|
51
|
+
|
|
52
|
+
#### P0 —— 批次一:正确性补丁(1 次小迭代,零新依赖,风险最低)
|
|
53
|
+
|
|
54
|
+
- **R1|G2|批次一|must:解析并应用 `auth_injection_rules`**
|
|
55
|
+
- 解析 connectors.json 顶层 `auth_injection_rules`(已证实 2 条:tencent-docs、ima-mcp,均双 token);安装/预览时应用到作用域合并逻辑,或在预览/安装界面明示「该连接器需要 N 个 token」。
|
|
56
|
+
- **验收标准**:must——预览界面能显示注入规则条数与用途;安装 tencent-docs 后 profile 的 mcpServers 配置不再残缺(含 token 占位或注入说明),配合 R7 可完成完整认证配置。
|
|
57
|
+
- **R2|G3|批次一|must:`visible_in` 标签展示 + 本地筛选**
|
|
58
|
+
- 每条连接器解析 `visible_in` 数组(internal / iOA / plan:ultimate / plan:exclusive / selfhosted / cloudhosted),卡片与详情展示标签;筛选栏支持按标签本地过滤。
|
|
59
|
+
- **边界**:只做数据标签展示 + 本地筛选,**不做**渠道/档位准入逻辑(X2);无 `visible_in` 的条目正常默认展示。
|
|
60
|
+
- **验收标准**:must——含 visible_in 的条目显示标签;按标签筛选结果正确;不含标签条目不受影响。
|
|
61
|
+
- **R3|G5|批次一|must:连接器元数据增强(examples 优先)**
|
|
62
|
+
- 解析并展示 `examples_zh` / `examples_en`(可一键复制的示例问法)、`version`、`minWorkbuddyVersion`(版本仅作元数据新鲜度提示)。
|
|
63
|
+
- **验收标准**:must——连接器详情可见中英示例问法并可一键复制、可见 version;could——zip 内 `icons/` 图标利用为可选加分项,不阻塞验收。
|
|
64
|
+
|
|
65
|
+
#### P1 —— 批次二:市场扩展(核心增量)
|
|
66
|
+
|
|
67
|
+
- **R4|G7|批次二|must:多市场注册表**
|
|
68
|
+
- 借鉴 WB `known_marketplaces.json` schema(每项:manifestName / type(zip/directory)/ source / autoUpdate / isBuiltIn),把连接器源从硬编码单 URL 改为注册表配置(存 `~/.dsh`);G1 插件源直接接入注册表,不再新增硬编码 URL。
|
|
69
|
+
- **验收标准**:must——连接器源可在注册表中配置并生效;新增一个市场源无需改代码。
|
|
70
|
+
- **R5|G1|批次二|must:插件市场子 tab**
|
|
71
|
+
- 新增「插件」子 tab:经 R4 注册表下载 codebuddy-plugins-official zip → 解析 marketplace.json → 列表/详情展示组成(skills / commands / agents / hooks / mcpServers / lspServers 数量或清单)、category / keywords / author → 安装经既有宿主通道 `remote.pluginManager.installBundle(targetSpec, {})`(严格双参调用,注意 `lib/client.js:3577` 已记录的踩坑注释)。
|
|
72
|
+
- **边界与必写提示**:① 安装成功后**必须明确提示「需重启 DSH 宿主才生效」**(宿主 installBundle 机制决定,是与 WB「装完即用」唯一无法抹平的差距,提示须醒目持久);② `lspServers` 字段仅展示、不承诺安装后生效(X7);③ oauth/oneid 相关连接器不代登录、仅标注(X3)。
|
|
73
|
+
- **验收标准**:must——150+ 插件可浏览可搜索;至少 1 个插件(如官方 docx 包)安装成功且出现重启提示,重启宿主后生效。
|
|
74
|
+
- **R6|G10|批次二|must(随 R5):插件依赖提示**
|
|
75
|
+
- 解析插件条目的依赖声明,安装前提示依赖清单,用户确认后一并安装(marketplace.json 中 dependencies 的具体表达形式在解析真实 zip 时确认,见 Open Questions)。
|
|
76
|
+
- **验收标准**:must——安装含依赖的插件(如 security-scan 类)时先列出依赖并需确认;无依赖插件不弹确认。
|
|
77
|
+
- **R7|G4|批次二|must:令牌引导安装**
|
|
78
|
+
- 针对已证实存在的 73 条 auth_mode=token + 8 条 oauth 连接器(现仅拦截不引导:`lib/wb-market.js:128-129` 拒装、`:166` authMode 仅透传展示):安装前弹出令牌输入 → 替换 mcpServers 的 env/header 占位符 → 写入 profile mcpServers;并按 auth_mode 区分「可自填 token」与「oauth/oneid 不支持代注入、需自备凭据」的标注。
|
|
79
|
+
- **边界**:只做**用户自填简单 token**(env/header 占位符替换);WB 的 mcp-oauth / oneid-token 双 token 代注入机制整条链路**不做**(X9)。
|
|
80
|
+
- **验收标准**:must——任选 1 条 auth_mode=token 连接器,输入令牌安装后认证可用;oauth 连接器显示明确的「不支持代注入」标注而非静默拒装。
|
|
81
|
+
|
|
82
|
+
#### P2 —— 批次三:基础设施
|
|
83
|
+
|
|
84
|
+
- **R8|G6+G9|批次二→批次三|must:连接器/插件已安装状态 + 来源锁(同一份本地状态文件)**
|
|
85
|
+
- 安装连接器/插件时同步写一份本地状态文件(存 `~/.dsh`):scope / installPath / version / dependencies / installedAt / lastUpdated + 上游来源锁(来源市场、版本,参考 WB `upstream-skills-lock.json` 机制,字段细节实现前补查);列表支持「已安装」**全量**筛选(非当前页,对齐技能侧 `skillOnlyInstalled` 但做得更完整)。
|
|
86
|
+
- **验收标准**:must——安装后状态文件可查(含来源版本);「已安装」筛选在全量范围内正确;could——卸载/更新时同步维护该文件为加分项。
|
|
87
|
+
- **R9|G8|批次三|should:懒触发 ETag 更新检查**
|
|
88
|
+
- 打开市场页时后台比对上游 ETag(复用 `lib/wb-market.js:83` 既有 ETag 缓存),有更新则提示,由用户手动确认更新。
|
|
89
|
+
- **边界**:不做静默 autoUpdate、不做常驻定时器(X4)。
|
|
90
|
+
- **验收标准**:should——上游目录变更后再次打开市场页出现更新提示;确认后目录刷新为最新。
|
|
91
|
+
- **R10|G11|批次三|could:连接器/内置目录排序**
|
|
92
|
+
- 本地排序(如按名称 / auth_mode / type),对齐技能侧已有排序体验;因 WB 本体 UI 无排序证据,仅作体验补全、不作为对标宣传点。
|
|
93
|
+
- **验收标准**:could——排序切换后列表正确重排。
|
|
94
|
+
|
|
95
|
+
### 3.3 UI Design Draft
|
|
96
|
+
|
|
97
|
+
- **市场 tab 顶部**:现有「连接器 / 技能 / 内置 MCP」子 tab 增加「**插件**」(第四个子 tab)。
|
|
98
|
+
- **连接器子 tab**:
|
|
99
|
+
- 卡片:名称 + 现有信息之外,新增标签行(`visible_in` 标签以小徽章展示,如 `selfhosted`、`plan:ultimate`)、版本号(v1.0.1)与 auth_mode 标注(如 `token`)。
|
|
100
|
+
- 筛选栏(现有搜索/分页旁):新增「已安装」开关(全量筛选)+ `visible_in` 标签多选筛选 + 排序下拉(R10)。
|
|
101
|
+
- 详情/预览面板:新增「示例问法」区块(中文/英文并列或切换,每条带一键复制按钮);新增注入规则提示行(「该连接器需要 N 个 token」及用途说明)。
|
|
102
|
+
- **令牌输入弹窗**(R7):模态弹窗,列出该连接器全部 env/header 占位符(键名 + 用途说明),每行一个输入框(内容遮罩显示);底部「确认安装 / 取消」。oauth/oneid 条目的弹窗改为说明页:标注「需自备凭据,DSH 不支持代登录」。
|
|
103
|
+
- **插件子 tab**(R5/R6):
|
|
104
|
+
- 列表:插件名 + author + category/keywords 标签 + 组成 chips(如 `skills×3`、`commands×5`、`hooks×2`、`MCP×1`、`LSP(仅展示)`);支持搜索。
|
|
105
|
+
- 详情面板:完整组成清单、依赖清单、keywords/author;「安装」按钮。
|
|
106
|
+
- **重启提示**:安装成功 toast 之外,页面顶部出现醒目持久提示条「已安装,需重启 DSH 宿主后生效」,直到用户重启前不消失;lspServers 条目旁固定标注「仅展示,DSH 暂不托管 LSP」。
|
|
107
|
+
- **更新提示**(R9):检测到上游更新时,市场页顶部出现轻量提示条「目录有更新」,点击确认后刷新;无更新时无感知。
|
|
108
|
+
|
|
109
|
+
### 3.4 Open Questions
|
|
110
|
+
|
|
111
|
+
1. **插件市场源与注册表已实测确认**(2026-10-20 主理人核查):注册表文件实为 `C:\Users\LENOVO\.workbuddy\plugins\known_marketplaces.json`(7 个市场,schema:manifestName / type(zip|directory) / source{path,url} / installLocation / description / lastUpdated / autoUpdate / isBuiltIn)。`codebuddy-plugins-official` 源 = `https://download.codebuddy.cn/plugin-marketplace/codebuddy-plugins-official-4b9366ac-f7e5-4cef-b60a-99a5229ce2b2.zip`;其 zip 内清单在 `.codebuddy-plugin\marketplace.json`(非根目录),插件条目在 `external_plugins\<plugin>\.codebuddy-plugin\plugin.json`(实测含 name/description/author/repository/homepage/license 字段,未见 dependencies 字段——条目级依赖表达形式以清单文件实测为准)。R4/R5 按此实现。
|
|
112
|
+
2. **auth_injection_rules 结构已实测**(同日核查):connectors.json 顶层键 = ["name","description","owner","auth_injection_rules","connectors"];规则条目 = {id, when:{active_in:[...]}, applies_to_connectors:[...], requires_connected_connectors:[...], timing:"request", inject:[{from_connector, token_type:"mcp-oauth"|"oneid-token", header, value_template:"Bearer ${access_token}"}]},实测仅 2 条(tencent-docs-dual-token、ima-mcp-dual-token),均为代注入机制 → 归 X9 Non-Goals。R1 相应收窄为:**解析该数组并在预览/详情展示「存在 N 条 token 注入规则(依赖 WB 账号体系,DSH 不代注入)」提示**,不实现注入逻辑;connector 条目实测键 = id,name,name_en,description,description_zh,description_en,source,auth_mode,type,examples_zh,examples_en,visible_in,与 R2/R3 字段完全吻合。
|
|
113
|
+
3. **marketplace.json 条目级 dependencies 的具体表达形式待解析真实 zip 时确认**(插件间依赖已在 WB `installed_plugins.json` v2 中证实存在,影响 R6 的解析实现)。
|
|
114
|
+
4. **`upstream-skills-lock.json` 字段级结构未逐项验证**(文件存在于 WB 数据目录、28971 字节),R8 的来源锁字段可在实现前参照该文件对齐。
|
|
115
|
+
|
|
116
|
+
### 3.5 Non-Goals(排除项 X1–X9,禁止进入需求池)
|
|
117
|
+
|
|
118
|
+
| # | 排除项 | 一句话理由 |
|
|
119
|
+
|---|---|---|
|
|
120
|
+
| X1 | 多账号隔离(WB 的 5 个 user-uuid 目录) | DSH 宿主无多账号概念,armory 是单用户本地工具,`~/.dsh` 单命名空间与宿主会话模型冲突 |
|
|
121
|
+
| X2 | `visible_in` 的渠道/档位准入逻辑(iOA 渠道、付费档位控制) | armory 不是分发渠道方;G3 只做数据标签展示与本地筛选 |
|
|
122
|
+
| X3 | server-side / oauth / oneid-token 连接器的服务端代登录 | 依赖 WB 闭源客户端与账号服务,DSH 侧无对应服务端;极限是安装时按 auth_mode 标注 |
|
|
123
|
+
| X4 | WB 式静默自动更新(autoUpdate) | 静默改写用户环境风险高;G8 只做「检查 + 提示」 |
|
|
124
|
+
| X5 | WB 内置市场内容搬运 | 内容嵌在闭源本体运行时内;armory 专家市场已独立实现同类能力 |
|
|
125
|
+
| X6 | tabbit-browser 第三方浏览器技能市场 | 强绑定 tabbit 生态运行时,DSH 侧有独立浏览器技能体系 |
|
|
126
|
+
| X7 | `lspServers` 的 DSH 原生 LSP 托管 | DSH 宿主无 LSP 托管运行时;G1 中仅展示该字段、不承诺生效 |
|
|
127
|
+
| X8 | 企微技能包(wecom-unified)市场 | 强绑定企业微信场景;仅其「技能锁」工程机制纳入 G9 |
|
|
128
|
+
| X9 | WB 的 mcp-oauth / oneid-token 双 token 代注入机制 | 依赖 WB 账号体系与闭源服务端;G4 只做用户自填简单 token |
|