@captain_z/zsk-skills 0.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.md +263 -0
- package/bundles.yaml +104 -0
- package/design-handoff/.gitkeep +0 -0
- package/design-handoff/figma-to-code/SKILL.md +265 -0
- package/design-handoff/ue-mcp/SKILL.md +184 -0
- package/frontend/.gitkeep +0 -0
- package/frontend/a11y-web/SKILL.md +169 -0
- package/frontend/api-contract-ts/SKILL.md +275 -0
- package/frontend/css-bem/SKILL.md +268 -0
- package/frontend/design-frontend/SKILL.md +163 -0
- package/frontend/dor-dod-frontend/SKILL.md +114 -0
- package/frontend/feature-tasks-frontend/SKILL.md +246 -0
- package/frontend/i18n/SKILL.md +296 -0
- package/frontend/nfr-web/SKILL.md +258 -0
- package/frontend/performance-web/SKILL.md +299 -0
- package/frontend/react-components/SKILL.md +211 -0
- package/frontend/react-naming/SKILL.md +224 -0
- package/frontend/review-frontend/SKILL.md +126 -0
- package/frontend/security-web/SKILL.md +286 -0
- package/frontend/spec-frontend/SKILL.md +141 -0
- package/frontend/testing-web/SKILL.md +252 -0
- package/frontend/typescript/SKILL.md +219 -0
- package/meta/.gitkeep +0 -0
- package/meta/philosophy/SKILL.md +221 -0
- package/package.json +24 -0
- package/quality/.gitkeep +0 -0
- package/quality/a11y-principles/SKILL.md +155 -0
- package/quality/code-hygiene/SKILL.md +126 -0
- package/quality/release/SKILL.md +209 -0
- package/quality/security-owasp/SKILL.md +157 -0
- package/quality/testing-pyramid/SKILL.md +173 -0
- package/sdlc/.gitkeep +0 -0
- package/sdlc/archive/SKILL.md +267 -0
- package/sdlc/bugfix/SKILL.md +181 -0
- package/sdlc/bugfix-tasks/SKILL.md +232 -0
- package/sdlc/coding/SKILL.md +177 -0
- package/sdlc/design/SKILL.md +299 -0
- package/sdlc/dor-dod/SKILL.md +120 -0
- package/sdlc/feature/SKILL.md +162 -0
- package/sdlc/proposal/SKILL.md +271 -0
- package/sdlc/refactor/SKILL.md +220 -0
- package/sdlc/refactor-tasks/SKILL.md +265 -0
- package/sdlc/reviewing/SKILL.md +197 -0
- package/sdlc/spec/SKILL.md +235 -0
- package/sdlc/task/SKILL.md +116 -0
- package/sdlc/task-evidence/SKILL.md +178 -0
- package/sdlc/task-structure/SKILL.md +153 -0
- package/sdlc/task-tracking/SKILL.md +192 -0
- package/sdlc/verify/SKILL.md +181 -0
- package/system/.gitkeep +0 -0
- package/system/adr/SKILL.md +169 -0
- package/system/architecture/SKILL.md +182 -0
- package/system/glossary/SKILL.md +141 -0
- package/system/nfr-baseline/SKILL.md +156 -0
- package/system/project-constraints-template/SKILL.md +241 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zsk:css-bem
|
|
3
|
+
description: Frontend CSS / Less / Sass / CSS Modules / Tailwind discipline —
|
|
4
|
+
scheme detection, BEM naming (Block__Element--Modifier), nesting depth (≤3
|
|
5
|
+
layers), token usage rules (no hardcoded color/spacing), scope isolation,
|
|
6
|
+
responsive breakpoints, and !important prohibition.
|
|
7
|
+
category: standard
|
|
8
|
+
domain: frontend
|
|
9
|
+
tier: optional
|
|
10
|
+
related:
|
|
11
|
+
- ../react-naming/SKILL.md
|
|
12
|
+
- ../../design-handoff/figma-to-code/SKILL.md
|
|
13
|
+
triggers:
|
|
14
|
+
- CSS scheme detection
|
|
15
|
+
- BEM naming
|
|
16
|
+
- Less nesting
|
|
17
|
+
- design token
|
|
18
|
+
- style scope
|
|
19
|
+
- no important
|
|
20
|
+
- responsive breakpoints
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# CSS / BEM · 样式纪律
|
|
24
|
+
|
|
25
|
+
> **范围**:CSS / Less / Sass / CSS Modules / Tailwind / CSS-in-JS 场景下的样式纪律
|
|
26
|
+
> **前置**:**写样式前必须先检测项目 CSS 方案**,严格跟随,不混用
|
|
27
|
+
|
|
28
|
+
## 1. 方案检测(第一条纪律)
|
|
29
|
+
|
|
30
|
+
### 检测表
|
|
31
|
+
|
|
32
|
+
| 线索 | 判定方案 |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| `package.json` 含 `less` + `.less` 文件 | **Less** |
|
|
35
|
+
| `package.json` 含 `sass` / `.scss` | **Sass / SCSS** |
|
|
36
|
+
| 存在 `*.module.css` / `*.module.less` | **CSS Modules** |
|
|
37
|
+
| `tailwind.config.*` 存在 + JSX 类名以 `tw-` 或 utility 为主 | **Tailwind** |
|
|
38
|
+
| `package.json` 含 `styled-components` / `@emotion/*` | **CSS-in-JS** |
|
|
39
|
+
| 仅 `.css` 无预处理 | **原生 CSS** |
|
|
40
|
+
| `vanilla-extract.config.*` / `.css.ts` | **Vanilla Extract** |
|
|
41
|
+
|
|
42
|
+
### 检测结果记录
|
|
43
|
+
|
|
44
|
+
项目选型填入 `SYSTEM-SPEC.md` 的"样式方案"条目。本 skill 的示例默认 **Less + BEM**,其他方案等价替换语法。
|
|
45
|
+
|
|
46
|
+
### 禁用
|
|
47
|
+
|
|
48
|
+
- ❌ Less 项目里写 Sass `@mixin` / `@include`
|
|
49
|
+
- ❌ Tailwind 项目里又额外写一套 BEM 类
|
|
50
|
+
- ❌ CSS Modules 项目里手写全局 class(除非显式 `:global()`)
|
|
51
|
+
- ❌ 同文件混用 CSS-in-JS 与外部样式表
|
|
52
|
+
|
|
53
|
+
## 2. BEM 命名(Block · Element · Modifier)
|
|
54
|
+
|
|
55
|
+
### 结构
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
.block { ... } // 块
|
|
59
|
+
.block__element { ... } // 元素
|
|
60
|
+
.block--modifier { ... } // 块修饰符
|
|
61
|
+
.block__element--mod { ... } // 元素修饰符
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 命名规则
|
|
65
|
+
|
|
66
|
+
- Block / Element / Modifier 每段用小写 + `-` 连接(`user-card`、`feature-tree__node-title`)
|
|
67
|
+
- 不嵌套 Element(`block__el1__el2` 是错误 — 改为 `block__el2` 或重新设计 block)
|
|
68
|
+
- Modifier 表达状态 / 变体(`--primary`、`--is-active`、`--size-large`)
|
|
69
|
+
|
|
70
|
+
### 示例
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<div class="user-card user-card--selected">
|
|
74
|
+
<img class="user-card__avatar" />
|
|
75
|
+
<div class="user-card__body">
|
|
76
|
+
<h3 class="user-card__name">Alice</h3>
|
|
77
|
+
<span class="user-card__name user-card__name--muted">alice@x.com</span>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
```less
|
|
83
|
+
.user-card {
|
|
84
|
+
display: flex;
|
|
85
|
+
padding: @spacing-md;
|
|
86
|
+
|
|
87
|
+
&--selected {
|
|
88
|
+
background: @color-primary-bg;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
&__avatar {
|
|
92
|
+
width: 40px; height: 40px;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
&__name {
|
|
96
|
+
font-weight: 500;
|
|
97
|
+
|
|
98
|
+
&--muted {
|
|
99
|
+
color: @color-text-muted;
|
|
100
|
+
font-weight: 400;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 3. 嵌套纪律(Less / Sass)
|
|
107
|
+
|
|
108
|
+
### 硬上限:**≤ 3 层**
|
|
109
|
+
|
|
110
|
+
```less
|
|
111
|
+
// ✅ 3 层以内
|
|
112
|
+
.user-card {
|
|
113
|
+
&__body {
|
|
114
|
+
&__title { ... }
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// ❌ 4 层以上 — 重新设计
|
|
119
|
+
.user-card {
|
|
120
|
+
.layout {
|
|
121
|
+
.row {
|
|
122
|
+
.col {
|
|
123
|
+
.title { ... }
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 禁用
|
|
131
|
+
|
|
132
|
+
- ❌ 层层嵌套复刻 DOM 结构(选择器脆弱 + 权重过高)
|
|
133
|
+
- ❌ 用 `& > div > span` 这类**位置依赖**选择器
|
|
134
|
+
- ❌ 用标签选择器(`div` / `span`)做样式载体 — 加 BEM 类
|
|
135
|
+
|
|
136
|
+
## 4. 设计 token 纪律
|
|
137
|
+
|
|
138
|
+
### 硬规则:禁止硬编码以下值
|
|
139
|
+
|
|
140
|
+
| 值 | 来源 |
|
|
141
|
+
| --- | --- |
|
|
142
|
+
| 颜色 | `@color-*` / `var(--color-*)` / 设计 token 文件 |
|
|
143
|
+
| 间距 | `@spacing-*` / token |
|
|
144
|
+
| 字号 / 行高 | `@font-size-*` / `@line-height-*` |
|
|
145
|
+
| 圆角 | `@border-radius-*` |
|
|
146
|
+
| 阴影 | `@shadow-*` |
|
|
147
|
+
| 动效时长 | `@motion-duration-*` |
|
|
148
|
+
| z-index | `@z-index-*`(避免层级混乱) |
|
|
149
|
+
|
|
150
|
+
### 允许硬编码
|
|
151
|
+
|
|
152
|
+
- 一次性数值(`width: 1px` 分隔线、`margin: 0` 清零)
|
|
153
|
+
- 组件内私有几何(`flex-basis: 280px` 的栅格列宽 — 写注释说明来源)
|
|
154
|
+
|
|
155
|
+
### token 来源
|
|
156
|
+
|
|
157
|
+
- 设计系统(Ant Design / Tailwind / 自研)→ 引入 token 文件
|
|
158
|
+
- Figma → 见 [`design-handoff/figma-to-code`](../../design-handoff/figma-to-code/SKILL.md) 的 token 映射
|
|
159
|
+
|
|
160
|
+
## 5. 作用域隔离
|
|
161
|
+
|
|
162
|
+
### CSS Modules(推荐)
|
|
163
|
+
|
|
164
|
+
```less
|
|
165
|
+
// UserCard.module.less
|
|
166
|
+
.card { ... }
|
|
167
|
+
.body { ... }
|
|
168
|
+
|
|
169
|
+
// UserCard.tsx
|
|
170
|
+
import s from './UserCard.module.less';
|
|
171
|
+
<div className={s.card}><div className={s.body}/></div>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
类名自动哈希化,天然隔离。
|
|
175
|
+
|
|
176
|
+
### 全局样式的使用原则
|
|
177
|
+
|
|
178
|
+
- 仅用于:重置 (reset.css) / 主题 token (vars.less) / 字体 (fonts.css)
|
|
179
|
+
- 业务模块**不允许**写全局 class
|
|
180
|
+
|
|
181
|
+
### BEM + Less 的隔离
|
|
182
|
+
|
|
183
|
+
即使不用 CSS Modules,BEM 的 block 前缀已提供命名空间(`.user-card__*` 唯一)。
|
|
184
|
+
|
|
185
|
+
## 6. !important 禁用
|
|
186
|
+
|
|
187
|
+
### 禁用
|
|
188
|
+
|
|
189
|
+
- ❌ 业务代码使用 `!important`
|
|
190
|
+
- ❌ 用 `!important` 覆盖第三方组件库(改用组件库提供的 theme 机制 / token)
|
|
191
|
+
|
|
192
|
+
### 允许(罕见)
|
|
193
|
+
|
|
194
|
+
- 第三方不可改的样式覆盖(必须在该行上方注释说明"此处覆盖 XX 库默认样式,因为 YY")
|
|
195
|
+
- 即使允许也必须集中到一个 `overrides.less` 文件
|
|
196
|
+
|
|
197
|
+
## 7. 响应式断点
|
|
198
|
+
|
|
199
|
+
断点**统一从 token 引**,不散落在各模块:
|
|
200
|
+
|
|
201
|
+
```less
|
|
202
|
+
// tokens/breakpoints.less
|
|
203
|
+
@bp-xs: 480px;
|
|
204
|
+
@bp-sm: 768px;
|
|
205
|
+
@bp-md: 1024px;
|
|
206
|
+
@bp-lg: 1280px;
|
|
207
|
+
@bp-xl: 1536px;
|
|
208
|
+
|
|
209
|
+
// 使用
|
|
210
|
+
.layout {
|
|
211
|
+
display: block;
|
|
212
|
+
|
|
213
|
+
@media (min-width: @bp-md) {
|
|
214
|
+
display: grid;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### 策略
|
|
220
|
+
|
|
221
|
+
- **Mobile-first**:默认写移动端样式,`min-width` 向上叠加
|
|
222
|
+
- **避免 `max-width` 向下覆盖**(除非必要)
|
|
223
|
+
- **不允许组件内自定义断点**(违反统一性)
|
|
224
|
+
|
|
225
|
+
## 8. 跨方案语法速查
|
|
226
|
+
|
|
227
|
+
| 能力 | Less | Sass | CSS Modules | Tailwind | CSS-in-JS |
|
|
228
|
+
| --- | --- | --- | --- | --- | --- |
|
|
229
|
+
| 变量 | `@var` | `$var` | CSS 自定义属性 `var(--x)` | 配置 `theme.colors` | JS 对象 |
|
|
230
|
+
| 嵌套 | `&` | `&` | `&`(需 PostCSS 插件)| 无(平铺 utility) | 模板字符串嵌套 |
|
|
231
|
+
| mixin | `.mixin()` | `@mixin` + `@include` | 组合 `composes` | `@apply` | 函数 |
|
|
232
|
+
| 条件 | `when` guard | `@if` | JS 侧 | JSX 侧 | JS 侧 |
|
|
233
|
+
| 作用域 | BEM 前缀 | BEM 前缀 | 自动哈希 | 全局 utility | 自动作用域 |
|
|
234
|
+
|
|
235
|
+
无论方案,**命名纪律(BEM 精神:block · element · modifier)、token 纪律、嵌套限制**都适用。
|
|
236
|
+
|
|
237
|
+
## 9. 组件样式目录
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
UserCard/
|
|
241
|
+
├── index.tsx
|
|
242
|
+
├── UserCard.module.less // 样式文件贴组件目录
|
|
243
|
+
├── styles.less // 若不用 CSS Modules
|
|
244
|
+
└── ...
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
- 每个组件一个样式文件(不跨组件共享样式文件)
|
|
248
|
+
- 公用片段(`.truncate` / `.visually-hidden`)抽到 `utilities.less`
|
|
249
|
+
|
|
250
|
+
## 反模式(禁止)
|
|
251
|
+
|
|
252
|
+
- ❌ 硬编码颜色 / 间距 / 字号(应用 token)
|
|
253
|
+
- ❌ `!important` 绕过样式冲突
|
|
254
|
+
- ❌ 4 层以上嵌套
|
|
255
|
+
- ❌ 标签选择器 + 位置选择器堆叠(`.x > div:nth-child(3)`)
|
|
256
|
+
- ❌ BEM Element 嵌套(`block__el1__el2`)
|
|
257
|
+
- ❌ 全局写业务样式
|
|
258
|
+
- ❌ 断点散落在模块
|
|
259
|
+
|
|
260
|
+
## 质量门禁
|
|
261
|
+
|
|
262
|
+
- [ ] 项目 CSS 方案已在 `SYSTEM-SPEC.md` 声明
|
|
263
|
+
- [ ] 新增 / 修改样式符合 BEM
|
|
264
|
+
- [ ] 嵌套 ≤ 3 层
|
|
265
|
+
- [ ] 无硬编码 color / spacing / font-size / radius(或有 ADR 豁免)
|
|
266
|
+
- [ ] 无 `!important`(或集中在 overrides 文件 + 注释)
|
|
267
|
+
- [ ] 断点引自 token
|
|
268
|
+
- [ ] stylelint 零 error
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zsk:design-frontend
|
|
3
|
+
description: Frontend module design.md authoring — adds Props/state/event
|
|
4
|
+
implementation mapping, UE-state-to-structure mapping, Figma-to-implementation
|
|
5
|
+
mapping, performance budget (Core Web Vitals), ErrorBoundary placement.
|
|
6
|
+
Extends the generic zsk:design framework.
|
|
7
|
+
category: stage
|
|
8
|
+
domain: frontend
|
|
9
|
+
tier: optional
|
|
10
|
+
stage: 3
|
|
11
|
+
variants:
|
|
12
|
+
- feature
|
|
13
|
+
- bugfix
|
|
14
|
+
- refactor
|
|
15
|
+
related:
|
|
16
|
+
- ../../sdlc/design/SKILL.md
|
|
17
|
+
- ../spec-frontend/SKILL.md
|
|
18
|
+
- ../performance-web/SKILL.md
|
|
19
|
+
- ../nfr-web/SKILL.md
|
|
20
|
+
- ../react-components/SKILL.md
|
|
21
|
+
- ../../design-handoff/figma-to-code/SKILL.md
|
|
22
|
+
triggers:
|
|
23
|
+
- frontend design
|
|
24
|
+
- Props implementation mapping
|
|
25
|
+
- UE state to structure
|
|
26
|
+
- Figma to implementation
|
|
27
|
+
- frontend performance budget
|
|
28
|
+
- ErrorBoundary placement
|
|
29
|
+
- Core Web Vitals budget
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Stage 3: Design · Frontend 补丁
|
|
33
|
+
|
|
34
|
+
> **用途**:当模块是**前端组件 / 页面**时,在 [`zsk:design`](../../sdlc/design/SKILL.md) 通用骨架上追加的实现映射
|
|
35
|
+
> **范围**:Props 映射、UE 状态 → 结构、Figma → 实现、性能预算 (CWV)、ErrorBoundary
|
|
36
|
+
|
|
37
|
+
## 追加章节
|
|
38
|
+
|
|
39
|
+
### A. Props / 状态 / 事件实现映射
|
|
40
|
+
|
|
41
|
+
Spec 的每个公开 Props 必须说明:
|
|
42
|
+
- 由哪个文件消费
|
|
43
|
+
- 是否进入内部 state
|
|
44
|
+
- 是否触发 service 调用
|
|
45
|
+
- 是否影响样式或视觉状态
|
|
46
|
+
|
|
47
|
+
```md
|
|
48
|
+
## Props / 状态 / 事件实现映射
|
|
49
|
+
|
|
50
|
+
| 契约项 | 落点文件 | 内部状态 / 副作用 | 说明 |
|
|
51
|
+
| --- | --- | --- | --- |
|
|
52
|
+
| `data` | `index.tsx` | 归一化后进 state | 通过 useMemo 派生扁平树 |
|
|
53
|
+
| `selectedId` | `index.tsx` | 受控 + 内部回显 | 外部未传时用内部 state |
|
|
54
|
+
| `onSelect` | `{module}View.tsx` | 事件上报 | 透传 node 数据 |
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### B. UE 状态映射到结构
|
|
58
|
+
|
|
59
|
+
Spec 的每个 UE 状态必须说明**由哪个容器 / class / 分支渲染**:
|
|
60
|
+
|
|
61
|
+
```md
|
|
62
|
+
## UE 状态映射
|
|
63
|
+
|
|
64
|
+
| 状态 | 实现方式 | 落点文件 |
|
|
65
|
+
| --- | --- | --- |
|
|
66
|
+
| `loading` | `<Skeleton>` 或 `<Spinner>` | `index.tsx` 顶部条件渲染 |
|
|
67
|
+
| `empty` | `<EmptyState>` 组件 | `components/EmptyState.tsx` |
|
|
68
|
+
| `error` | `<ErrorFallback>` 或 toast | `index.tsx` + ErrorBoundary |
|
|
69
|
+
| `hover` | `.{module}__node:hover` | `styles.less` |
|
|
70
|
+
| `focus-visible` | `.{module}__node:focus-visible` | `styles.less` |
|
|
71
|
+
| `selected` | `.{module}__node--selected` | `styles.less` + className 逻辑 |
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### C. Figma / UE / MCP 到实现映射
|
|
75
|
+
|
|
76
|
+
```md
|
|
77
|
+
## Figma → 实现映射
|
|
78
|
+
|
|
79
|
+
| Figma 节点 / 区域 | 文件 / 样式 | 说明 |
|
|
80
|
+
| --- | --- | --- |
|
|
81
|
+
| search-input frame | `components/Search.tsx` + `.{module}__search` | 500ms 防抖(批注要求) |
|
|
82
|
+
| node-list frame | `components/NodeList.tsx` + `.{module}__list` | 虚拟滚动 |
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**原则**:引用 `docs/{module}/ue-mcp.md` 的命名映射表([`zsk:figma-to-code`](../../design-handoff/figma-to-code/SKILL.md) Step 4 产物),不重复。
|
|
86
|
+
|
|
87
|
+
### D. 性能预算(Core Web Vitals)
|
|
88
|
+
|
|
89
|
+
继承 [`frontend/nfr-web`](../nfr-web/SKILL.md) 的系统基线,模块级可加严:
|
|
90
|
+
|
|
91
|
+
```md
|
|
92
|
+
## 性能预算
|
|
93
|
+
|
|
94
|
+
| 指标 | 系统基线 | 本模块 | 测量方式 | 超限处理 |
|
|
95
|
+
| --- | --- | --- | --- | --- |
|
|
96
|
+
| LCP(首屏) | < 2.5s | < 2.0s | Lighthouse CI | 有 ADR 豁免 |
|
|
97
|
+
| INP | < 200ms | < 100ms | Web Vitals | |
|
|
98
|
+
| CLS | < 0.1 | < 0.05 | Web Vitals | |
|
|
99
|
+
| 单 chunk(gzip) | < 500KB | < 300KB | Bundle Analyzer | |
|
|
100
|
+
| 首屏请求数 | ≤ 6 | ≤ 4 | Network tab | |
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
详细策略见 [`frontend/performance-web`](../performance-web/SKILL.md)。
|
|
104
|
+
|
|
105
|
+
### E. ErrorBoundary 位置
|
|
106
|
+
|
|
107
|
+
- 模块入口必须包 `ErrorBoundary`(见 [`frontend/react-components`](../react-components/SKILL.md))
|
|
108
|
+
- 错误边界只捕获 render 期错误;async 错误用 try/catch + 显式 UI
|
|
109
|
+
- 降级 UI 必须可交互(至少"重试"/"返回")
|
|
110
|
+
|
|
111
|
+
```md
|
|
112
|
+
## ErrorBoundary 设计
|
|
113
|
+
|
|
114
|
+
- 位置:`index.tsx` 外层包裹
|
|
115
|
+
- 降级 UI:`components/ErrorFallback.tsx`
|
|
116
|
+
- 上报:接入 `{{config.stack.error_reporter}}`
|
|
117
|
+
- 重试机制:降级 UI 含"重试"按钮,reset state
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### F. 观测性接入(前端补丁)
|
|
121
|
+
|
|
122
|
+
| 事件 | 位置 | 上报字段 |
|
|
123
|
+
| --- | --- | --- |
|
|
124
|
+
| `{module}_view` | `index.tsx` useEffect | userId / moduleId |
|
|
125
|
+
| `{module}_select` | `onSelect` 回调 | userId / nodeId |
|
|
126
|
+
| `{module}_search` | Search onChange 防抖后 | userId / query |
|
|
127
|
+
| `{module}_error` | ErrorBoundary | userId / err.message / componentStack |
|
|
128
|
+
|
|
129
|
+
埋点基线见 [`system/nfr-baseline`](../../system/nfr-baseline/SKILL.md) 的第 6 类。
|
|
130
|
+
|
|
131
|
+
## Frontend Feature design 完整结构
|
|
132
|
+
|
|
133
|
+
1. 模块映射 _(zsk:design)_
|
|
134
|
+
2. 当前实现 _(zsk:design)_
|
|
135
|
+
3. 架构决策 ADR _(zsk:design)_
|
|
136
|
+
4. 上下文 / 时序图 _(zsk:design)_
|
|
137
|
+
5. 文件职责与分层 _(zsk:design)_
|
|
138
|
+
6. 目录架构 _(zsk:design)_
|
|
139
|
+
7. FR 实现映射 _(zsk:design)_
|
|
140
|
+
8. NFR 实现映射 _(zsk:design)_
|
|
141
|
+
9. **Props / 状态 / 事件映射**(本文件 A)
|
|
142
|
+
10. **UE 状态映射**(本文件 B)
|
|
143
|
+
11. **Figma → 实现映射**(本文件 C)
|
|
144
|
+
12. API / 数据流 _(zsk:design)_
|
|
145
|
+
13. 错误处理与降级 + **ErrorBoundary**(本文件 E)
|
|
146
|
+
14. 回滚与迁移 _(zsk:design)_
|
|
147
|
+
15. **观测性接入**(本文件 F)
|
|
148
|
+
16. **性能预算 CWV**(本文件 D)
|
|
149
|
+
17. 安全考虑 _(zsk:design)_
|
|
150
|
+
18. 测试方案 _(zsk:design)_
|
|
151
|
+
19. 风险与权衡 _(zsk:design)_
|
|
152
|
+
20. 变更文件清单 _(zsk:design)_
|
|
153
|
+
|
|
154
|
+
## 质量门禁(前端补丁)
|
|
155
|
+
|
|
156
|
+
- [ ] Props / UE 状态全部映射到文件
|
|
157
|
+
- [ ] Figma → 实现映射表与 `ue-mcp.md` 一致
|
|
158
|
+
- [ ] 性能预算量化(LCP / INP / CLS / bundle)
|
|
159
|
+
- [ ] ErrorBoundary 位置明确 + 降级 UI 可交互
|
|
160
|
+
- [ ] 观测性埋点已声明
|
|
161
|
+
- [ ] 未新增 Spec 未声明的行为
|
|
162
|
+
|
|
163
|
+
> 通用 design 门禁(ADR / C4 图 / FR 落点)见 [`zsk:design`](../../sdlc/design/SKILL.md)
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zsk:dor-dod-frontend
|
|
3
|
+
description: Frontend-specific DoR/DoD for SDLC stage transitions —
|
|
4
|
+
frontend-specific rows on top of the generic checklist. Covers UE state matrix
|
|
5
|
+
completeness, ue-mcp.md registration, visual regression, three-language i18n
|
|
6
|
+
sync, a11y (keyboard/aria/focus), frontend NFR (CWV) evidence.
|
|
7
|
+
category: resource
|
|
8
|
+
domain: frontend
|
|
9
|
+
tier: optional
|
|
10
|
+
variants:
|
|
11
|
+
- feature
|
|
12
|
+
- bugfix
|
|
13
|
+
- refactor
|
|
14
|
+
related:
|
|
15
|
+
- ../../sdlc/dor-dod/SKILL.md
|
|
16
|
+
- ../spec-frontend/SKILL.md
|
|
17
|
+
- ../design-frontend/SKILL.md
|
|
18
|
+
- ../nfr-web/SKILL.md
|
|
19
|
+
- ../a11y-web/SKILL.md
|
|
20
|
+
- ../i18n/SKILL.md
|
|
21
|
+
- ../../design-handoff/ue-mcp/SKILL.md
|
|
22
|
+
triggers:
|
|
23
|
+
- frontend DoR DoD
|
|
24
|
+
- frontend definition of ready done
|
|
25
|
+
- UE matrix gate
|
|
26
|
+
- visual regression gate
|
|
27
|
+
- three language sync gate
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# DoR & DoD · Frontend 补丁
|
|
31
|
+
|
|
32
|
+
> **用途**:在 [`zsk:dor-dod`](../../sdlc/dor-dod/SKILL.md) 通用清单上追加的前端专属条款
|
|
33
|
+
> **范围**:UE 状态矩阵、ue-mcp.md、视觉回归、i18n 三语、a11y、NFR-Web
|
|
34
|
+
|
|
35
|
+
## DoR(前端补丁)— 启动前门禁
|
|
36
|
+
|
|
37
|
+
### Feature 专用(前端)
|
|
38
|
+
|
|
39
|
+
- [ ] `{{config.paths.api_contracts}}` 已对齐后端(后端契约目录)
|
|
40
|
+
- [ ] `ue-mcp.md` 已登记(有 Figma 输入时)或明确"无设计交付"降级
|
|
41
|
+
- [ ] **UE 状态矩阵覆盖**:loading / empty / error / hover / focus / focus-visible / selected(必填)+ 组件特有状态
|
|
42
|
+
- [ ] **Props / Event Contract** 在 [`zsk:spec-frontend`](../spec-frontend/SKILL.md) A 节完整
|
|
43
|
+
- [ ] **受控 / 非受控边界**已声明
|
|
44
|
+
- [ ] **Frontend NFR 六类**(性能 / a11y / 安全 / i18n / 兼容性 / 可观测性)全覆盖(见 [`frontend/nfr-web`](../nfr-web/SKILL.md))
|
|
45
|
+
- [ ] 三语(`{{config.i18n.languages}}`)清单已明确
|
|
46
|
+
|
|
47
|
+
### Bugfix 专用(前端)
|
|
48
|
+
|
|
49
|
+
- [ ] MCVE 可在浏览器复现(录屏 / 步骤)
|
|
50
|
+
- [ ] 受影响契约项(FR / NFR / AC 编号)已列出
|
|
51
|
+
- [ ] 是否涉及 visual / a11y / i18n 受影响已评估
|
|
52
|
+
|
|
53
|
+
### Refactor 专用(前端)
|
|
54
|
+
|
|
55
|
+
- [ ] 视觉基线已留档(截图 / Chromatic snapshots)
|
|
56
|
+
- [ ] 性能基线已留档(Lighthouse / Bundle size)
|
|
57
|
+
- [ ] 对外契约(Props / Events / API)保留清单完整
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## DoD(前端补丁)— 关闭前门禁
|
|
62
|
+
|
|
63
|
+
### 通用(前端)
|
|
64
|
+
|
|
65
|
+
- [ ] **视觉回归**对照完成或差异已记录(截图 / Chromatic diff)
|
|
66
|
+
- [ ] **i18n 三语同步验证**(在同一 commit;语言清单 `{{config.i18n.languages}}`)
|
|
67
|
+
- [ ] **a11y 核对**(键盘 / aria / 焦点;axe-core 零 critical)
|
|
68
|
+
- [ ] **NFR 六类全部有证据**:
|
|
69
|
+
- 性能(Lighthouse 报告)
|
|
70
|
+
- a11y(axe 报告)
|
|
71
|
+
- 安全(依赖扫描报告)
|
|
72
|
+
- i18n(三语 diff 截图)
|
|
73
|
+
- 兼容性(浏览器矩阵截图)
|
|
74
|
+
- 可观测性(埋点样本)
|
|
75
|
+
|
|
76
|
+
### Feature 专用(前端)
|
|
77
|
+
|
|
78
|
+
- [ ] 所有 UE 状态(loading / empty / error / hover / focus-visible / selected / disabled)视觉 + 行为均已验证
|
|
79
|
+
- [ ] 包体积增量 < 10%(或有 ADR 豁免)
|
|
80
|
+
- [ ] Core Web Vitals 达标:LCP / INP / CLS(见 [`frontend/nfr-web`](../nfr-web/SKILL.md))
|
|
81
|
+
|
|
82
|
+
### Bugfix 专用(前端)
|
|
83
|
+
|
|
84
|
+
- [ ] 原浏览器复现步骤 → 不再复现(截图 / 录屏对照 before/after)
|
|
85
|
+
- [ ] 相邻 UE 状态未回归(hover → selected 等邻项)
|
|
86
|
+
- [ ] a11y / i18n / 性能路径未受影响(若相关)
|
|
87
|
+
|
|
88
|
+
### Refactor 专用(前端)
|
|
89
|
+
|
|
90
|
+
- [ ] **视觉回归零差异**(硬门禁)
|
|
91
|
+
- [ ] Lighthouse 评分不回退
|
|
92
|
+
- [ ] **包体积变化 ≤ ±2%**(硬门禁)
|
|
93
|
+
- [ ] 对外 Props / Events / API 清单零变化(有对照表)
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Exit Criteria(前端补丁)
|
|
98
|
+
|
|
99
|
+
前端模块在 `zsk:dor-dod` 的通用出口条件基础上,各阶段出口还要满足:
|
|
100
|
+
|
|
101
|
+
| 阶段 | 前端专项 |
|
|
102
|
+
| --- | --- |
|
|
103
|
+
| spec → design | UE 状态矩阵 + Props Contract + NFR 六类已定 |
|
|
104
|
+
| design → coding | Props / UE / Figma 映射表完整;性能预算量化 |
|
|
105
|
+
| coding → reviewing | 三语 i18n 同 commit + axe-core 零 critical + 视觉对照存在 |
|
|
106
|
+
| verify → archive | 视觉回归对照归档 + CWV 达标证据 + 浏览器矩阵截图 |
|
|
107
|
+
|
|
108
|
+
## 反模式(前端专属)
|
|
109
|
+
|
|
110
|
+
- ❌ "等代码出来再截图"(视觉基线必须先有)
|
|
111
|
+
- ❌ "先中文后补 i18n"(i18n 必须同 commit)
|
|
112
|
+
- ❌ "UE 状态实现了再写矩阵"(Spec 阶段必须已定矩阵)
|
|
113
|
+
- ❌ "性能预算后面看情况"(Design 阶段必须量化)
|
|
114
|
+
- ❌ "a11y 最后统一过一遍"(一开始就满足,不留技术债)
|