# dsh-zh-ui
[English](README.md) | 中文
DeepSeek Harness(`dsh`)插件:中文界面设计规范。包含三部分:
1. **skill `zh-ui-design`**:中文排版规则(中英文间距、全角标点、中文字体栈与回退、行高 1.6–1.8、每行 25–40 字)、反 AI 味清单,以及 "先定设计方向"的流程,以及 4 套风格预设(观测台、夜班值守、钴蓝海报、稳重可信),每套都给出完整的 CSS 变量和导航、首屏、定价卡、CTA 的组件配方。预设的文字颜色组合按 WCAG AA(4.5:1)校验过。
2. **项目规范注入**:每次组装提示词时读取当前会话工作目录下的 `DESIGN.md` 和 `design.tokens.json`,作为运行时上下文注入(不进入缓存的 system prompt)。文件不存在时不注入任何内容。
3. **工具 `zh_design_lint`**:静态扫描 HTML / CSS / SCSS / Vue / JSX / TSX / Svelte 源码和 Tailwind 类名,不渲染页面。
## zh_design_lint 规则
| 规则 | 检查内容 |
|---|---|
| `hardcoded-color` | CSS 变量定义(`--x:`)之外的字面色值,以及 Tailwind 任意色值 `bg-[#…]`。`design.tokens.json` 中出现的色值视为允许。 |
| `off-scale-px` | margin / padding / gap / font-size / border-radius / 定位属性中不在间距基数(默认 4px)倍数上的 px 值;Tailwind `p-[13px]` 等。默认允许 0、1、2,以及 token 中的 px 值。 |
| `font-family-cjk` | `font-family` 中没有任何中文字体(PingFang SC、Microsoft YaHei、Noto Sans SC 等)。`var(...)`、`inherit`、等宽字体跳过。 |
| `cjk-latin-spacing` | 页面可见文本中,汉字与英文字母或数字直接相连。 |
| `cjk-punctuation` | 汉字旁边使用半角 `, ; : ! ? .`。 |
| `cjk-line-height` | 正文选择器的无单位 `line-height` 小于 1.5(标题、按钮、价格等选择器除外);`
`/`
` 等元素上的 `leading-none/tight/snug`。 |
| `purple-gradient` | 渐变中含紫色系颜色(按色相 250°–320° 判断);Tailwind `from/via/to-purple|violet|fuchsia-*`。 |
| `emoji-icon` | 可见文本中的 emoji(`©`、`™` 等符号不算)。 |
| `heading-subtitle` | 两处及以上"标题后紧跟一句短副标题",或"小标题 + 标题 + 副标题"三件套。 |
| `filler-copy` | 套话禁用词(一站式、赋能、无缝、seamless、elevate your……)。 |
已知局限:CSS 解析基于正则,不是完整解析器;不识别颜色关键字(如 `white`);不计算对比度、点击区域、实际渲染字号,这些需要渲染页面的工具(例如 [dsh-design](https://github.com/Viger1/dsh-design) 的 `design_audit`)。
## 安装
```sh
dsh plugin --profile web add github:/dsh-zh-ui
```
本地开发时也可以用 patch 挂载构建产物:
```yaml
# extra.yml
- insert:
- id: zh-ui
name: '/absolute/path/to/dsh-zh-ui/lib/index.js'
```
```sh
dsh web --patch ./extra.yml
```
需要 Node 22 以上(`dsh` 本身的要求)。
## 配置
```yaml
- id: zh-ui
name: dsh-zh-ui
config:
registerSkill: true # 注册 zh-ui-design skill
injectProjectSpec: true # 注入 DESIGN.md / design.tokens.json
specFiles: [DESIGN.md, design.tokens.json]
maxSpecChars: 8000 # 每个文件最多注入的字符数
rules: [hardcoded-color, off-scale-px, font-family-cjk, cjk-latin-spacing, cjk-punctuation, cjk-line-height, purple-gradient, emoji-icon, heading-subtitle, filler-copy]
spacingBasePx: 4
allowedPx: [0, 1, 2]
minLineHeight: 1.5
maxFiles: 200 # 单次 lint 最多扫描的文件数
```
## 使用的 DSH 接口
- `ctx.skills.register()`:注册运行时 skill(`@deepseek-ai/dsh-skill`)
- `ctx.on('system-prompt/assemble', …)`:在组装后追加一个 runtime context 条目,与 `@deepseek-ai/dsh-working-directory` 的做法相同
- `ctx.workingDirectory.get(session)`:取会话工作目录
- `ctx.tools.register(defineTool(…))`:注册工具(`@deepseek-ai/dsh-tools`)
lint 只读取工作目录内的文件,路径解析到工作目录之外会报错。
## 开发
```sh
npm install
npm run build
npm test
```
`demo/` 中有一份 A/B 对比示例,说明见 `demo/RESULTS.md`。
## 许可证
MIT
## 参考与致谢
skill 的写法参考了以下项目的思路,文字为重新撰写,未逐字复制:
- [anthropics/skills · frontend-design](https://github.com/anthropics/skills/tree/main/skills/frontend-design)(Apache-2.0):先写设计计划再自查是否落入默认套路、"只在一处用力"、生成式页面常见特征清单、截图自评。
- [Viger1/dsh-design](https://github.com/Viger1/dsh-design) 的 design-system skill(许可证未核实):先固定色板和字号阶、一个强调色、间距网格、点击区域不等于字号。
- [SummerSec/SumSec-Skills · taste-skill](https://github.com/SummerSec/SumSec-Skills)(Apache-2.0):按产品类型推断方向、避免米色+黄铜的"高级感"默认色板、阴影带底色调、圆角统一。
- [vercel-labs/web-interface-guidelines](https://github.com/vercel-labs/web-interface-guidelines):`:focus-visible`、不用 `transition: all`、`prefers-reduced-motion`、tabular-nums、移动端 44px 点击区域。
- [ChenYiming-aaa/dsh-ui-ux-pro-max](https://github.com/ChenYiming-aaa/dsh-ui-ux-pro-max)(MIT,数据来自 nextlevelbuilder/ui-ux-pro-max-skill):按优先级排列的检查项(对比度、触控、无 emoji 图标)。