@teamix-evo/skills 0.2.0 → 0.4.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.
Files changed (56) hide show
  1. package/README.md +18 -8
  2. package/_template/SKILL.md.hbs +14 -1
  3. package/manifest.json +79 -6
  4. package/package.json +7 -3
  5. package/src/teamix-evo-code-opentrek/SKILL.md +92 -0
  6. package/src/teamix-evo-code-opentrek/api-layering.md +225 -0
  7. package/src/teamix-evo-code-opentrek/checklist.md +173 -0
  8. package/src/teamix-evo-code-opentrek/error-and-loading.md +269 -0
  9. package/src/teamix-evo-code-opentrek/file-structure.md +273 -0
  10. package/src/teamix-evo-code-opentrek/forms-and-validation.md +220 -0
  11. package/src/teamix-evo-code-opentrek/reuse-first.md +130 -0
  12. package/src/teamix-evo-code-opentrek/routing-and-codesplit.md +298 -0
  13. package/src/teamix-evo-code-opentrek/testing.md +313 -0
  14. package/src/teamix-evo-code-uni-manager/SKILL.md +95 -0
  15. package/src/teamix-evo-code-uni-manager/api-layering.md +370 -0
  16. package/src/teamix-evo-code-uni-manager/checklist.md +193 -0
  17. package/src/teamix-evo-code-uni-manager/error-and-loading.md +389 -0
  18. package/src/teamix-evo-code-uni-manager/file-structure.md +339 -0
  19. package/src/teamix-evo-code-uni-manager/forms-and-validation.md +459 -0
  20. package/src/teamix-evo-code-uni-manager/reuse-first.md +188 -0
  21. package/src/teamix-evo-code-uni-manager/routing-and-codesplit.md +450 -0
  22. package/src/teamix-evo-code-uni-manager/testing.md +396 -0
  23. package/src/teamix-evo-design-opentrek/SKILL.md +71 -0
  24. package/src/teamix-evo-design-opentrek/boundaries.md +513 -0
  25. package/src/teamix-evo-design-opentrek/brand.md +154 -0
  26. package/src/teamix-evo-design-opentrek/checklist.md +83 -0
  27. package/src/teamix-evo-design-opentrek/components.md +245 -0
  28. package/src/teamix-evo-design-opentrek/flows.md +51 -0
  29. package/src/teamix-evo-design-opentrek/foundations.md +271 -0
  30. package/src/teamix-evo-design-opentrek/generation-flow.md +185 -0
  31. package/src/teamix-evo-design-opentrek/patterns/dashboard.md +31 -0
  32. package/src/teamix-evo-design-opentrek/patterns/detail-page.md +202 -0
  33. package/src/teamix-evo-design-opentrek/patterns/form-page.md +289 -0
  34. package/src/teamix-evo-design-opentrek/patterns/list-page.md +334 -0
  35. package/src/teamix-evo-design-opentrek/patterns/page-types.md +154 -0
  36. package/src/teamix-evo-design-opentrek/philosophy.md +96 -0
  37. package/src/teamix-evo-design-opentrek/rules/README.md +39 -0
  38. package/src/teamix-evo-design-opentrek/rules/boundaries.rules.json +391 -0
  39. package/src/teamix-evo-design-uni-manager/SKILL.md +73 -0
  40. package/src/teamix-evo-design-uni-manager/boundaries.md +564 -0
  41. package/src/teamix-evo-design-uni-manager/brand.md +202 -0
  42. package/src/teamix-evo-design-uni-manager/checklist.md +115 -0
  43. package/src/teamix-evo-design-uni-manager/components.md +254 -0
  44. package/src/teamix-evo-design-uni-manager/flows.md +63 -0
  45. package/src/teamix-evo-design-uni-manager/foundations.md +258 -0
  46. package/src/teamix-evo-design-uni-manager/generation-flow.md +194 -0
  47. package/src/teamix-evo-design-uni-manager/patterns/dashboard.md +95 -0
  48. package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +224 -0
  49. package/src/teamix-evo-design-uni-manager/patterns/form-page.md +329 -0
  50. package/src/teamix-evo-design-uni-manager/patterns/list-page.md +356 -0
  51. package/src/teamix-evo-design-uni-manager/patterns/page-types.md +165 -0
  52. package/src/teamix-evo-design-uni-manager/philosophy.md +106 -0
  53. package/src/teamix-evo-design-uni-manager/rules/README.md +49 -0
  54. package/src/teamix-evo-design-uni-manager/rules/boundaries.rules.json +418 -0
  55. package/src/teamix-evo-manage/SKILL.md +281 -0
  56. package/skills/teamix-evo-manage/SKILL.md +0 -138
@@ -0,0 +1,185 @@
1
+ # 生成 / 翻新 / 验证流程
2
+
3
+ > AI 在执行页面级任务时,按本文件的门控顺序执行。每一步都有明确的输入输出,跳步会导致结果不可控。
4
+
5
+ ---
6
+
7
+ ## 1. 生成路径(六步门控)
8
+
9
+ 适用关键词:**"生成 / 创建 / 新建 / 设计一个 / 做一个"**。
10
+
11
+ ```
12
+ Step 1 需求确认 → Step 2 类型识别 → Step 3 子类型 + 布局
13
+
14
+ Step 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
15
+ ```
16
+
17
+ ### Step 1 · 最小 quorum + 默认值
18
+
19
+ **只有两个信息缺一不可**(最小 quorum,缺则反问):
20
+
21
+ - [ ] **页面类型**:ListPage / DetailPage / FormPage / Dashboard / Dialog(缺则按 Step 2 决策树推断)
22
+ - [ ] **资源实体**:要操作的对象是什么(订单 / 实例 / 用户 / ……)
23
+
24
+ **其他信息全部走默认值,先生成再细化**(避免连环反问让用户失去耐心):
25
+
26
+ | 维度 | 默认 | 何时升级 |
27
+ | ---------- | ----------------------------------------------------- | ------------------------------------- |
28
+ | 业务领域 | 资源管理 | 用户明确说"工作流 / 报表"等 |
29
+ | 用户角色 | 业务管理员 | 涉及审计 / 审批 / 平台运维等敏感角色 |
30
+ | 核心动作 | CRUD(增 / 删 / 改 / 查 + 列表) | 明确出现"批量 / 审批 / 导出"等关键词 |
31
+ | 入口路径 | 从同名菜单进入,无外部跳转 | 明确说"从 X 跳到 Y" |
32
+ | 子类型 | ListPage→standard / FormPage→single-page / 其余各 1 | 用户提到 wizard / drawer / tabbed 等 |
33
+
34
+ **反问触发条件**(只有以下情况反问,否则直接出方案):
35
+
36
+ 1. 页面类型与资源实体均无法从需求中推断
37
+ 2. 用户描述与默认值明显冲突(如"我要做一个数据看板"但又说"列表")
38
+
39
+ **输出**:页面类型 + 资源实体 + 一句话场景假设("假设是业务管理员的订单 CRUD 列表,如有偏差请指正")。
40
+
41
+ ### Step 2 · 页面类型识别
42
+
43
+ 根据 [patterns/page-types.md](./patterns/page-types.md) §决策树匹配类型:
44
+
45
+ ```
46
+ 页面内容是什么?
47
+ ├─ 多条结构化数据 → ListPage
48
+ ├─ 单个记录详情 → DetailPage
49
+ ├─ 用户输入数据 → FormPage
50
+ ├─ 数据可视化/统计 → Dashboard
51
+ └─ 二次确认 / 快速操作 → Dialog/Sheet
52
+ ```
53
+
54
+ **输出**:页面类型 ID(`ListPage` / `DetailPage` / ...)。
55
+
56
+ ### Step 3 · 子类型识别 + 布局选择
57
+
58
+ 根据页面类型读取对应 `patterns/{type}-page.md`:
59
+
60
+ - 列表页 6 种子类型:`standard / pure-card / standard-card / drawer / expandable / l2-sidebar / advanced-filter`
61
+ - 详情页 2 种子类型:`tabbed / single-section`
62
+ - 表单页 3 种子类型:`single-page / wizard / drawer-form`
63
+
64
+ **输出**:子类型 ID + 区域骨架(参照 [patterns/page-types.md](./patterns/page-types.md) §Zone Map)。
65
+
66
+ ### Step 4 · 组件挑选
67
+
68
+ 读 [components.md](./components.md) §选型决策树确定组件集:
69
+
70
+ 1. 优先使用 `@teamix-evo/ui` 注册表中的稳定组件
71
+ 2. 通过 MCP `list_components(status: "stable")` 查可用列表
72
+ 3. 通过 MCP `get_component_meta(id)` 查具体 Props/Examples
73
+ 4. 复合场景按 [components.md](./components.md) §组合规则装配
74
+
75
+ **输出**:组件清单 + 每个组件的关键 Props。
76
+
77
+ ### Step 5 · 视觉填充(Token 绑定)
78
+
79
+ 读 [foundations.md](./foundations.md),所有色彩、间距、字号、圆角、阴影、动效**必须**使用 Token:
80
+
81
+ | 维度 | Token 入口 |
82
+ | ---- | ---------------------------------------------------------------------------- |
83
+ | 色彩 | `bg-primary` / `text-foreground` / `border-border` / `text-muted-foreground` |
84
+ | 间距 | Tailwind 4px 网格刻度(`gap-2`/`gap-4`/`p-6` 等) |
85
+ | 字号 | `text-xs` / `text-sm` / `text-base` / `text-lg` |
86
+ | 圆角 | `rounded-md` / `rounded-lg` / `rounded-full` |
87
+ | 阴影 | `shadow-sm` / `shadow-md` / `shadow-lg` |
88
+ | 动效 | `duration-150` / `duration-300` / `transition-colors` |
89
+
90
+ **禁止**:硬编码 hex 色值、`#xxx` rgb()、内联 `style={{ ... }}`、`text-emerald-600` 等原始色。
91
+
92
+ **输出**:含 Token 引用的可执行代码 / HTML。
93
+
94
+ ### Step 6 · 自检
95
+
96
+ 对照 [checklist.md](./checklist.md) 10 项逐项验证:
97
+
98
+ - 通过 → 输出最终代码
99
+ - 不通过 → 回到对应失败项的步骤修正后重新自检
100
+
101
+ **输出**:合规代码 + 自检报告。
102
+
103
+ ---
104
+
105
+ ## 2. 翻新路径
106
+
107
+ 适用关键词:**"改造 / 升级 / 翻新 / 对齐规范 / 重新生成"**。
108
+
109
+ ```
110
+ 1. 读取目标页面源码
111
+ 2. 扫描违规项(按 boundaries.md F1-F10 + S1-S8)
112
+ 3. 生成 old → new 替换清单
113
+ - 硬编码色值 → CSS Token 变量
114
+ - space-y-* → flex + gap-*
115
+ - w-N h-N (等值) → size-N
116
+ - 自定义 dark: 覆盖 → 语义 token
117
+ 4. 对照 components.md 检查组件选型是否合理(如自定义 div 改 Empty / Skeleton / Badge)
118
+ 5. 应用替换 + 输出变更报告
119
+ ```
120
+
121
+ **输出**:翻新后代码 + 变更报告(每项替换的 old → new + 引用的规则 ID)。
122
+
123
+ ---
124
+
125
+ ## 3. 验证路径
126
+
127
+ 适用关键词:**"检查 / 验证 / 评估 / 是否符合规范"**。
128
+
129
+ ```
130
+ 1. 读取目标页面源码
131
+ 2. 逐条对照 boundaries.md
132
+ - F1-F10(禁止项)
133
+ - S1-S8(样式规则)
134
+ - C1-C12(组件结构规则)
135
+ 3. 对照 checklist.md 10 项自检
136
+ 4. 输出验证报告
137
+ ```
138
+
139
+ **报告格式**:
140
+
141
+ ```markdown
142
+ ## 验证报告
143
+
144
+ ### ❌ 违规项(N)
145
+
146
+ - F1 第 12 行:硬编码 `#333333` → 应改为 `text-foreground`
147
+ - S2 第 23 行:使用 `space-y-4` → 应改为 `flex flex-col gap-4`
148
+ - C2 第 45 行:DialogContent 缺失 DialogTitle
149
+
150
+ ### ⚠️ 建议项(M)
151
+
152
+ - ...
153
+
154
+ ### ✅ 合规项(K)
155
+
156
+ - ...
157
+ ```
158
+
159
+ ---
160
+
161
+ ## 4. 子任务退出条件
162
+
163
+ | 任务类型 | 何时停止生成 |
164
+ | -------- | --------------------------------- |
165
+ | 生成 | Step 6 自检全部通过 |
166
+ | 翻新 | 替换清单为空 + 重新对照无违规 |
167
+ | 验证 | 报告完整列出所有违规项 + 修复建议 |
168
+
169
+ ---
170
+
171
+ ## 5. 与 code-opentrek skill 的协作
172
+
173
+ 页面级任务通常**两个 skill 同时触发**。Design skill 决定"长什么样",Code skill 决定"怎么落地":
174
+
175
+ | 决策点 | 由谁主导 |
176
+ | ------------------------ | -------------------------------------------------------------------------------------- |
177
+ | 页面骨架 / Zone 划分 | design |
178
+ | 组件选型 | design |
179
+ | Token 绑定 / 视觉规则 | design |
180
+ | 文件放置位置 | code([file-structure.md](../teamix-evo-code-opentrek/file-structure.md)) |
181
+ | import 路径 / reuse 策略 | code([reuse-first.md](../teamix-evo-code-opentrek/reuse-first.md)) |
182
+ | API / services 层 | code([api-layering.md](../teamix-evo-code-opentrek/api-layering.md)) |
183
+ | 表单实现细节 | code([forms-and-validation.md](../teamix-evo-code-opentrek/forms-and-validation.md)) |
184
+
185
+ 冲突时按 ADR 0018 AI 上下文路由约定:design 决定"做什么",code 决定"怎么做"。
@@ -0,0 +1,31 @@
1
+ # Dashboard — 数据概览与监控页
2
+
3
+ > AI 实操路径:Step 2(页面类型识别)判定为 Dashboard 后,本文档接管。生成频次低于 ListPage / FormPage / DetailPage,当前为最小规范,后续按 list-page.md / form-page.md 体例扩充。
4
+
5
+ ---
6
+
7
+ ## 1. 标准结构
8
+
9
+ ```text
10
+ ┌────────────────────────────────────────────┐
11
+ │ PageHeader: 概览 [今日 ▼] [刷新] │
12
+ ├────────────────────────────────────────────┤
13
+ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
14
+ │ │订单数│ │待办数│ │成交额│ │完成率│ ← StatCards
15
+ │ │ 1024 │ │ 3 │ │¥12.3K│ │ 68% │ │
16
+ │ └──────┘ └──────┘ └──────┘ └──────┘ │
17
+ ├────────────────────────────────────────────┤
18
+ │ 业务趋势 最近异常 │
19
+ │ [Chart 折线图] [Timeline] │
20
+ └────────────────────────────────────────────┘
21
+ ```
22
+
23
+ ---
24
+
25
+ ## 2. 设计要点
26
+
27
+ - 关键指标用 `text-3xl font-bold`,与上一周期对比用 `+/-` 配 `chart-*` 色
28
+ - 时间范围切换持久化到 URL params
29
+ - 图表色彩按 `chart-1` `chart-2` `chart-3` ... 顺序消费,**禁止**任意 hex
30
+ - StatCard 数量:4 (1×4) / 6 (2×3) / 8 (2×4);超过 8 改用 ListPage
31
+ - 不要在 Dashboard 内放可编辑表单 — 跳转 FormPage
@@ -0,0 +1,202 @@
1
+ # Detail Page — 详情页模式
2
+
3
+ > **触发**:用户描述含"详情/查看/信息/概览"。
4
+ > **核心特征**:单条记录的只读展示 + DescriptionList + 操作按钮。
5
+ > **页面级别**:L2(面包屑模式 PageHeader,自动继承 Sidebar)。
6
+
7
+ ---
8
+
9
+ ## 1. 子类型识别
10
+
11
+ | 子类型 | 关键词 | 差异特征 |
12
+ | ------------ | ------------------------ | ------------------------------------------ |
13
+ | **标准详情** | "详情"/"基本信息" | PageHeader + DescriptionList + 操作按钮 |
14
+ | **资源详情** | "实例详情"/"资源"/"监控" | InfoCard + MonitorPanel + Tabs(关联资源) |
15
+ | **概览型** | "概览"/"总览" | StatCard + Chart + DescriptionList |
16
+ | **流程型** | "审批"/"流程"/"记录" | Steps + Timeline + DescriptionList |
17
+ | **对比型** | "对比"/"比较" | 双栏/多栏 DescriptionList 对照 |
18
+
19
+ ---
20
+
21
+ ## 2. 标准结构(资源详情)
22
+
23
+ ```
24
+ ┌─────────────────────────────────────────────┐
25
+ │ PageHeader(面包屑模式) │
26
+ │ 实例与镜像 > 实例列表 > 实例详情 [创建镜像]│ ← Header
27
+ │ │
28
+ │ InfoCard ─ 基本信息 │ ← 摘要区
29
+ │ 组织 | 资源集 | 创建人 | 创建时间 │
30
+ │ │
31
+ │ InfoCard ─ 监控 │
32
+ │ [CPU 使用率] [内存使用率](MonitorPanel) │
33
+ │ │
34
+ │ Tabs │ ← 分类
35
+ │ [基本信息] [监控] [云盘] [安全组] [快照] │
36
+ │ │
37
+ │ DescriptionList ─ 基本信息 │ ← 主区
38
+ │ 架构: X86 地域: cn-beijing │
39
+ │ 实例ID: i-xxx 状态: [Badge 运行中] │
40
+ │ │
41
+ │ DescriptionList ─ 配置信息 │
42
+ │ vCPU: 2 内存: 4 GiB │
43
+ └─────────────────────────────────────────────┘
44
+ ```
45
+
46
+ ## 简洁详情结构
47
+
48
+ ```
49
+ ┌─────────────────────────────────────────────┐
50
+ │ PageHeader(面包屑模式) │
51
+ │ 用户列表 > 用户详情 [编辑] [删除] │
52
+ │ │
53
+ │ DescriptionList (column: 2) │
54
+ │ 姓名: 张三 邮箱: zhangsan@example.com │
55
+ │ 角色: 管理员 状态: [Badge 启用] │
56
+ │ 创建时间: 2026-01-15 更新: 2026-04-20 │
57
+ └─────────────────────────────────────────────┘
58
+ ```
59
+
60
+ ---
61
+
62
+ ## 3. 必需组件
63
+
64
+ | 组件 | 位置 | 说明 |
65
+ | ------------------- | ---- | ------------------------------- |
66
+ | **PageHeader** | top | 面包屑模式(L2 页面)+ 操作按钮组 |
67
+ | **DescriptionList** | main | 详情页核心展示组件 |
68
+ | **DescriptionItem** | main | 描述项最小展示单元 |
69
+
70
+ **框架级**(自动继承):Sidebar、PageHeader 由 page-frame 管控。
71
+
72
+ ### 可选组件
73
+
74
+ - **InfoCard** — 顶部摘要(组织/创建人/创建时间)
75
+ - **Tabs** — 信息分多类(基本/监控/关联资源)
76
+ - **MonitorPanel** — CPU/内存/网络监控(仅资源详情)
77
+ - **Badge** — 状态指示
78
+ - **Tooltip** — 长 ID / 截断字段悬浮
79
+
80
+ ---
81
+
82
+ ## 4. DescriptionItem 字段交互
83
+
84
+ | 类型 | 触发 | 反馈 |
85
+ | -------------- | ---------- | --------------------------------- |
86
+ | 默认展示 | — | 只读文本,空值 `-` 占位 |
87
+ | 可复制 | 点 📋 图标 | 图标高亮 + Toast "已复制" |
88
+ | 可编辑(行内) | 点 ✎ 图标 | 切换为 Input |
89
+ | 链接跳转 | 点字段值 | 链接样式(VPC、安全组等关联资源) |
90
+ | 状态展示 | — | Badge + 语义色 |
91
+ | 悬浮提示 | hover | Tooltip 完整内容(截断时) |
92
+
93
+ ---
94
+
95
+ ## 5. 操作按钮规则
96
+
97
+ ### 5.1 位置
98
+
99
+ - **位置 A**:PageHeader 右侧(主操作 + 更多 Dropdown)
100
+ - **位置 B**:DescriptionItem 内(行内编辑、复制)
101
+
102
+ ### 5.2 操作分级
103
+
104
+ | 级别 | 适用 | 确认 |
105
+ | ---------------- | --------------- | --------------------- |
106
+ | 一级(可逆) | 编辑、续费/降配 | 直接执行 |
107
+ | 二级(影响状态) | 释放、创建镜像 | Dialog 确认 |
108
+ | 三级(不可逆) | 删除 | Dialog + 输入确认文本 |
109
+
110
+ ### 5.3 异步反馈
111
+
112
+ | 操作 | Toast | 页面 |
113
+ | --------------- | ------------ | --------------------- |
114
+ | 释放 / 创建镜像 | "操作已提交" | 轮询状态 |
115
+ | 删除 | "删除已提交" | 返回 ListPage 并刷新 |
116
+ | 编辑保存 | "保存成功" | 停留详情页 + 局部刷新 |
117
+
118
+ ---
119
+
120
+ ## 6. Tab 切换交互
121
+
122
+ | 场景 | 行为 |
123
+ | ---------- | ----------------------------- |
124
+ | 首次加载 | 默认激活第一个 Tab |
125
+ | Tab 切换 | 懒加载数据 + Loading |
126
+ | 无数据 Tab | 展示 Empty |
127
+ | Tab 内列表 | 含独立 Pagination |
128
+ | URL 同步 | 切换同步 URL hash,刷新可保持 |
129
+
130
+ ---
131
+
132
+ ## 7. 信息分组
133
+
134
+ - DescriptionList 按 ListSection 分组(基本信息 / 配置信息 / 网络信息)
135
+ - 每组可独立展开/收起(可选)
136
+ - 分组间用 Divider 分隔
137
+ - 每组内 DescriptionList 默认 `column: 2`,宽屏可至 4,移动端降为 1
138
+
139
+ ---
140
+
141
+ ## 8. 嵌套约束
142
+
143
+ | 父子关系 | 状态 |
144
+ | -------------------------------------------------------------------------------------------- | -------------------------------- |
145
+ | PageContainer → ContentWrapper → Card(白卡) → PageHeader / InfoCard / Tabs / DescriptionList | ALLOW |
146
+ | ContentWrapper → 业务组件(无 Card) | **FORBID** |
147
+ | Card → Card | **FORBID**(白卡单例) |
148
+ | InfoCard → DescriptionList / MonitorPanel | ALLOW |
149
+ | Tabs → TabPane → DescriptionList / DataTable | ALLOW(关联资源用 DataTable) |
150
+ | Sidebar → DescriptionList | **FORBID** |
151
+ | PageHeader → Tabs | WARN(Tab 应在 PageHeader 下方) |
152
+
153
+ ---
154
+
155
+ ## 9. 禁止项
156
+
157
+ | 禁项 | 原因 |
158
+ | -------------------------- | ------------------------------------- |
159
+ | Form 直接在主内容区 | 编辑应通过 Drawer/Dialog/FormPage |
160
+ | DataTable 在主内容区 | 关联数据应用 Tabs 子面板 |
161
+ | Chart 替代 DescriptionList | 图表属 Dashboard,监控用 MonitorPanel |
162
+ | QueryFilter | 详情页无筛选需求 |
163
+ | `hr` 分割线 | 用 Divider |
164
+
165
+ ---
166
+
167
+ ## 10. 边界情况
168
+
169
+ | 场景 | 处理 |
170
+ | ---------- | ----------------------- |
171
+ | 无数据 | Empty + 返回列表引导 |
172
+ | 加载中 | Loading 骨架屏 |
173
+ | 加载失败 | ErrorState + 重试按钮 |
174
+ | 权限不足 | 操作按钮隐藏,只读展示 |
175
+ | 资源不存在 | 跳转 404 ExceptionPage |
176
+ | 字段为空 | 展示 "-" 占位 |
177
+ | 字段过长 | 截断 + Tooltip 完整内容 |
178
+
179
+ ---
180
+
181
+ ## 11. 详情 → 列表返回约定
182
+
183
+ - 面包屑父级项点击返回 ListPage
184
+ - PageHeader 右侧可选 × 关闭按钮
185
+ - 返回后 ListPage 保持原筛选 + 分页
186
+ - 详情页编辑成功后,按业务决策:
187
+ - 留在详情页(Toast「保存成功」+ 局部刷新)
188
+ - 或返回 ListPage(Toast「保存成功」+ 列表刷新)
189
+
190
+ ---
191
+
192
+ ## 12. 详情页特有自检
193
+
194
+ - [ ] PageHeader 用面包屑模式(L2 页面)
195
+ - [ ] DescriptionList 列数:默认 2,宽屏可 4,移动端 1
196
+ - [ ] 关联资源用 Tabs 子面板(不在主区直接放 DataTable)
197
+ - [ ] Badge 用语义色(不用原色)
198
+ - [ ] 空字段用 "-" 占位
199
+ - [ ] 长字段(ID/Hash)`font-mono` + 提供复制按钮
200
+ - [ ] 操作分级正确(删除 = 输入确认)
201
+ - [ ] Tab 切换 URL hash 同步
202
+ - [ ] 边界状态完整:Empty / Loading / ErrorState / 权限不足 / 404