# 架构设计
> 本文面向要改插件源码、接宿主契约或维护本仓库的人。普通使用请看 [README](../README.zh-CN.md) 的快速开始。
## 为什么是纯技能插件
DSH 宿主把"产品想法 → 可评审原型"所需的一切执行能力都交给了模型与会话工具链(shell、浏览器、图像生成、本地 dev server)——插件层**没有可注册的模型工具、没有客户端模块**,唯一能做且该做的事是把方法论变成技能。纯技能形态意味着:
- **零宿主改动**:cordis 插件组隔离挂载(`cordis.patch.yml` 的 `isolate: productDesign`),一个故障不会拖垮宿主;
- **随装随卸**:`install.ps1` / `-Uninstall` 对称,卸载后不留技能、不留状态;
- **技能面即合约**:10 个技能全部经隔离 `dsh-skill-filesystem` provider 发现,模型面与宿主包解耦;
- 与 [dsh-plugin-task-coordinator](https://github.com/Kayungko/dsh-plugin-task-coordinator) 同源挂载模式——那边是「六工具 + 一个 supervisor 技能」,这边是「零工具 + 十个技能」,隔离 provider 的先例与降级策略完全一致。
## 挂载拓扑
```mermaid
flowchart LR
host["DSH Desktop
cordis 内核"]
subgraph plugin["dsh-plugin-product-design · 隔离插件组"]
direction TB
index["index.mjs
cordis 入口 · 装配"]
skills["skills.mjs
隔离技能挂载(动态 import)"]
provider["dsh-skill-filesystem
providerName: 'product-design'
includeDefaultRoots: false"]
subgraph content["纯内容层(零代码依赖)"]
direction LR
sk["skills/
10 个技能(1 入口 + 9 pd-*)"]
ref["references/
4 个共享规则"]
tpl["templates/ + scripts/
Vite starter · bootstrap"]
end
index -->|"fire-and-forget"| skills --> provider --> sk
end
catalog["会话技能目录
热加载 · 不遮蔽 · 随卸载消失"]
host -->|"ctx.provide / ctx.plugin"| index
provider -.->|"技能发现"| catalog
classDef host fill:#1E293B,stroke:#64748B,color:#F8FAFC,stroke-width:2px;
classDef wiring fill:#0F172A,stroke:#38BDF8,color:#F8FAFC,stroke-width:2px;
classDef core fill:#064E3B,stroke:#34D399,color:#ECFDF5,stroke-width:3px;
classDef target fill:#1E293B,stroke:#F59E0B,color:#F8FAFC,stroke-width:3px;
class host host;
class index,skills wiring;
class provider core;
class sk,ref,tpl,catalog target;
```
> 图注:`skills/`、`references/`、`templates/`、`scripts/` 是纯内容目录——没有任何运行时代码依赖,技能正文以 `$` 引用互相路由,共享规则被技能按需加载。
分层约束:
- **`index.mjs`**:唯一装配层。`apply(ctx, input)` 只做两件事——`ctx.provide('productDesign', { version, enabled })` 与 fire-and-forget 调用 `mountProductDesignSkills(ctx)`;`enabled: false` 时只 provide 不挂载;
- **`skills.mjs`**:对 `@deepseek-ai/dsh-skill-filesystem` 用**动态 import**,provider 配置三件套 `providerName: 'product-design'`(永不与 DSH 的 `filesystem` 冲突)/ `includeDefaultRoots: false` / `customSkillDirs: [skills/]`(只见本包技能);
- **纯内容层**:技能与规则是 Markdown + 随附脚本(`skills/user-context/scripts/` 的 Node 脚本经 `npm run check` 语法覆盖),不参与 cordis 装配。
## 降级策略
技能是伴侣,不是契约——`mountProductDesignSkills` 是 fire-and-forget:
1. `@deepseek-ai/dsh-skill-filesystem` 动态 import 失败 → 降级为一条 warning,bundle 照常 provide;
2. `ctx.plugin(...)` 挂载失败 → 同样只打 warning;
3. `enabled: false` → 记录 info 后直接返回,不挂载。
装配顺序即优先级:先 `ctx.provide`(描述符必然存在),后技能挂载(可降级)。宿主没有 skill-filesystem 包时,插件**安静地变成无技能状态**,而不是把整个 bundle 拖崩。
## 路由拓扑(技能面)
用户只看见 `/product-design`。入口技能加载后分析需求并路由到 9 个 `pd-*` 子技能(`user-invocable: false`,模型可见、命令列表隐藏);子技能正文以 `$product-design` 反向引用路由。闸门类技能(`pd-get-context` / `pd-design-qa`)是工作流契约的执行点,详见 [PROTOCOL.md §3](PROTOCOL.md)。
## 相关文档
- [PROTOCOL.md](PROTOCOL.md) — 工作流闸门与主机契约实测参考(注入面、技能挂载契约、能力边界、验证记录)
- [../skills/](../skills/) — 10 个技能正文(模型实际读的就是它们)
- [CHANGELOG](../CHANGELOG.md) — 版本更新日志