@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,49 @@
1
+ # rules/ — boundaries.md ↔ eslint-config 元数据桥(uni-manager)
2
+
3
+ 本目录是 **结构化元数据**,不是规则实现。它把:
4
+
5
+ 1. `boundaries.md` 中的 41 条人类可读硬约束(F/FF/S/C/I 五组共 38 条 + uni-manager 专属 UM1/UM2/UM3 三条)
6
+ 2. `packages/eslint-config/src/rules/` 中的 9 条已实现 lint 规则
7
+ 3. AI 在生成代码时可读的 JSON 索引
8
+
9
+ 用一张表对齐起来,防止三者飘移。
10
+
11
+ ## boundaries.rules.json
12
+
13
+ 每条规则包含:
14
+
15
+ | 字段 | 说明 |
16
+ | ---------------- | -------------------------------------------------------------------------------- |
17
+ | `id` | 在 boundaries.md 中的编号(F1-F10 / FF1-FF4 / S1-S8 / C1-C12 / I1-I4 / UM1-UM3) |
18
+ | `group` | `forbidden` / `form` / `style` / `component` / `icon` / `uni-manager` |
19
+ | `rule` | 一句话规则陈述(与 boundaries.md 章节标题保持一致) |
20
+ | `severity` | `ERROR` 必须修复 / `WARN` 建议修复 |
21
+ | `scope` | `global` 或具体组件名(如 `Dialog`、`Button`、`um-topbar`) |
22
+ | `lintRule` | 对应的 eslint 规则名(`teamix-evo/<name>`);`null` 表示无 lint 覆盖,靠人工评审 |
23
+ | `boundaryAnchor` | 指向 boundaries.md 章节锚点;validate-skills 会校验存在性 |
24
+ | `status` | `active` / `deprecated` |
25
+
26
+ ## 双向校验(由 `pnpm validate` 触发)
27
+
28
+ `scripts/validate-skills.ts` 在校验 manifest 之后会额外检查:
29
+
30
+ 1. **JSON schema 合法** — 每条 rule 满足上表必填字段
31
+ 2. **boundaryAnchor 存在性** — 每条 rule 的 `boundaryAnchor` 必须能在 `boundaries.md` 中 grep 到对应的章节
32
+ 3. **eslint 双向对齐** — `packages/eslint-config/src/rules/` 中每条已实现的 rule 必须在本 JSON 中有 `lintRule: "teamix-evo/<name>"` 的条目;反过来,JSON 中每条 `lintRule != null` 的条目必须能在 eslint-config 中找到对应文件
33
+
34
+ ## 新增 boundary 规则的工序
35
+
36
+ 1. 在 `boundaries.md` 中加章节(`[ERROR]` / `[WARN]` 前缀 + 编号)
37
+ 2. 在 `boundaries.rules.json` 加对应条目
38
+ 3. 如需 lint 自动化:在 `packages/eslint-config/src/rules/` 加 ts 实现;`lintRule` 填规则名
39
+ 4. 跑 `pnpm --filter @teamix-evo/skills validate` 通过
40
+
41
+ ## uni-manager 专属约束(UM 组)
42
+
43
+ UM1 / UM2 / UM3 是 uni-manager **独有的硬约束**,对应"一致性三件套":
44
+
45
+ - **UM1** — 全局 topbar 必须使用 `um-topbar` 实物,禁止自建
46
+ - **UM2** — PageHeader 必须保持一致性结构(标题 24px / 面包屑紧贴 / 操作右对齐)
47
+ - **UM3** — 跨云资源列表与详情必须标注 CloudBadge
48
+
49
+ 它们通过 `scope: "uni-manager"` 与基础 38 条解耦,复制到 OpenTrek 时自动失效。
@@ -0,0 +1,418 @@
1
+ {
2
+ "$schema": "./rules.schema.json",
3
+ "version": "1.0.0",
4
+ "source": "boundaries.md",
5
+ "variant": "uni-manager",
6
+ "rules": [
7
+ {
8
+ "id": "F1",
9
+ "group": "forbidden",
10
+ "rule": "禁止硬编码色值",
11
+ "severity": "ERROR",
12
+ "scope": "global",
13
+ "lintRule": "teamix-evo/no-color-literal",
14
+ "boundaryAnchor": "boundaries.md#error-f1--禁止硬编码色值",
15
+ "status": "active"
16
+ },
17
+ {
18
+ "id": "F2",
19
+ "group": "forbidden",
20
+ "rule": "禁止硬编码尺寸",
21
+ "severity": "ERROR",
22
+ "scope": "global",
23
+ "lintRule": "teamix-evo/no-arbitrary-tw-value",
24
+ "boundaryAnchor": "boundaries.md#error-f2--禁止硬编码尺寸",
25
+ "status": "active"
26
+ },
27
+ {
28
+ "id": "F3",
29
+ "group": "forbidden",
30
+ "rule": "禁止按组件新增重复语义变量",
31
+ "severity": "ERROR",
32
+ "scope": "global",
33
+ "lintRule": null,
34
+ "boundaryAnchor": "boundaries.md#error-f3--禁止按组件新增重复语义变量",
35
+ "status": "active"
36
+ },
37
+ {
38
+ "id": "F4",
39
+ "group": "forbidden",
40
+ "rule": "禁止页头添加底色或下边框",
41
+ "severity": "ERROR",
42
+ "scope": "PageHeader",
43
+ "lintRule": null,
44
+ "boundaryAnchor": "boundaries.md#error-f4--禁止页头添加底色或下边框--scope-pageheader",
45
+ "status": "active"
46
+ },
47
+ {
48
+ "id": "F5",
49
+ "group": "forbidden",
50
+ "rule": "outline 按钮禁止使用 border-input",
51
+ "severity": "ERROR",
52
+ "scope": "Button",
53
+ "lintRule": null,
54
+ "boundaryAnchor": "boundaries.md#error-f5--outline-按钮禁止使用-border-input--scope-button",
55
+ "status": "active"
56
+ },
57
+ {
58
+ "id": "F6",
59
+ "group": "forbidden",
60
+ "rule": "禁止直接写 font-size: 12px",
61
+ "severity": "ERROR",
62
+ "scope": "global",
63
+ "lintRule": "teamix-evo/no-arbitrary-tw-value",
64
+ "boundaryAnchor": "boundaries.md#error-f6--禁止直接写-font-size-12px",
65
+ "status": "active"
66
+ },
67
+ {
68
+ "id": "F7",
69
+ "group": "forbidden",
70
+ "rule": "语义间距必须走 CSS 变量",
71
+ "severity": "ERROR",
72
+ "scope": "global",
73
+ "lintRule": "teamix-evo/no-arbitrary-tw-value",
74
+ "boundaryAnchor": "boundaries.md#error-f7--语义间距必须走-css-变量",
75
+ "status": "active"
76
+ },
77
+ {
78
+ "id": "F8",
79
+ "group": "forbidden",
80
+ "rule": "禁止在 DialogTitle 中加图标",
81
+ "severity": "ERROR",
82
+ "scope": "Dialog",
83
+ "lintRule": null,
84
+ "boundaryAnchor": "boundaries.md#error-f8--禁止在-dialogtitle-中加图标--scope-dialog",
85
+ "status": "active"
86
+ },
87
+ {
88
+ "id": "F9",
89
+ "group": "forbidden",
90
+ "rule": "弹窗确定按钮禁止加 disabled 禁用态",
91
+ "severity": "ERROR",
92
+ "scope": "Dialog",
93
+ "lintRule": null,
94
+ "boundaryAnchor": "boundaries.md#error-f9--弹窗确定按钮禁止加-disabled-禁用态--scope-dialog",
95
+ "status": "active"
96
+ },
97
+ {
98
+ "id": "F10",
99
+ "group": "forbidden",
100
+ "rule": "hover 时禁止将 boxShadow 设为 undefined",
101
+ "severity": "WARN",
102
+ "scope": "HoverCard",
103
+ "lintRule": null,
104
+ "boundaryAnchor": "boundaries.md#warn-f10--hover-时禁止将-boxshadow-设为-undefined--scope-hovercard",
105
+ "status": "active"
106
+ },
107
+ {
108
+ "id": "FF1",
109
+ "group": "form",
110
+ "rule": "禁止用色块表达表单状态",
111
+ "severity": "ERROR",
112
+ "scope": "Form",
113
+ "lintRule": "teamix-evo/no-raw-color-scale",
114
+ "boundaryAnchor": "boundaries.md#error-ff1--禁止用色块表达表单状态--scope-form",
115
+ "status": "active"
116
+ },
117
+ {
118
+ "id": "FF2",
119
+ "group": "form",
120
+ "rule": "Card 不嵌套 Card",
121
+ "severity": "WARN",
122
+ "scope": "Form",
123
+ "lintRule": null,
124
+ "boundaryAnchor": "boundaries.md#warn-ff2--card-不嵌套-card--scope-form",
125
+ "status": "active"
126
+ },
127
+ {
128
+ "id": "FF3",
129
+ "group": "form",
130
+ "rule": "错误信息禁止暴露技术栈痕迹",
131
+ "severity": "ERROR",
132
+ "scope": "Form",
133
+ "lintRule": null,
134
+ "boundaryAnchor": "boundaries.md#error-ff3--错误信息禁止暴露技术栈痕迹--scope-form",
135
+ "status": "active"
136
+ },
137
+ {
138
+ "id": "FF4",
139
+ "group": "form",
140
+ "rule": "必填用红色 * 星号,放标签后空格",
141
+ "severity": "WARN",
142
+ "scope": "Form",
143
+ "lintRule": null,
144
+ "boundaryAnchor": "boundaries.md#warn-ff4--必填用红色--星号放标签后空格--scope-form",
145
+ "status": "active"
146
+ },
147
+ {
148
+ "id": "S1",
149
+ "group": "style",
150
+ "rule": "className 仅用于布局,不用于覆盖组件颜色/字体",
151
+ "severity": "ERROR",
152
+ "scope": "global",
153
+ "lintRule": "teamix-evo/no-color-literal",
154
+ "boundaryAnchor": "boundaries.md#error-s1--classname-仅用于布局不用于覆盖组件颜色--字体",
155
+ "status": "active"
156
+ },
157
+ {
158
+ "id": "S2",
159
+ "group": "style",
160
+ "rule": "不用 space-x-* / space-y-*,改用 flex + gap-*",
161
+ "severity": "ERROR",
162
+ "scope": "global",
163
+ "lintRule": "teamix-evo/prefer-gap-over-space",
164
+ "boundaryAnchor": "boundaries.md#error-s2--不用-space-x---space-y--改用-flex--gap-",
165
+ "status": "active"
166
+ },
167
+ {
168
+ "id": "S3",
169
+ "group": "style",
170
+ "rule": "等宽高用 size-*,不用 w-* h-*",
171
+ "severity": "WARN",
172
+ "scope": "global",
173
+ "lintRule": null,
174
+ "boundaryAnchor": "boundaries.md#warn-s3--等宽高用-size-不用-w--h-",
175
+ "status": "active"
176
+ },
177
+ {
178
+ "id": "S4",
179
+ "group": "style",
180
+ "rule": "用 truncate 简写文本截断",
181
+ "severity": "WARN",
182
+ "scope": "global",
183
+ "lintRule": null,
184
+ "boundaryAnchor": "boundaries.md#warn-s4--用-truncate-简写文本截断",
185
+ "status": "active"
186
+ },
187
+ {
188
+ "id": "S5",
189
+ "group": "style",
190
+ "rule": "不用手动 dark: 颜色覆盖,用语义 token",
191
+ "severity": "ERROR",
192
+ "scope": "global",
193
+ "lintRule": "teamix-evo/no-manual-dark-classnames",
194
+ "boundaryAnchor": "boundaries.md#error-s5--不用手动-dark-颜色覆盖用语义-token",
195
+ "status": "active"
196
+ },
197
+ {
198
+ "id": "S6",
199
+ "group": "style",
200
+ "rule": "用 cn() 处理条件类名,不用模板字符串三元",
201
+ "severity": "ERROR",
202
+ "scope": "global",
203
+ "lintRule": null,
204
+ "boundaryAnchor": "boundaries.md#error-s6--用-cn-处理条件类名不用模板字符串三元",
205
+ "status": "active"
206
+ },
207
+ {
208
+ "id": "S7",
209
+ "group": "style",
210
+ "rule": "overlay 组件不手动设置 z-index",
211
+ "severity": "ERROR",
212
+ "scope": "global",
213
+ "lintRule": null,
214
+ "boundaryAnchor": "boundaries.md#error-s7--overlay-组件不手动设置-z-index",
215
+ "status": "active"
216
+ },
217
+ {
218
+ "id": "S8",
219
+ "group": "style",
220
+ "rule": "不用原始色值表示状态",
221
+ "severity": "ERROR",
222
+ "scope": "global",
223
+ "lintRule": "teamix-evo/no-raw-color-scale",
224
+ "boundaryAnchor": "boundaries.md#error-s8--不用原始色值表示状态",
225
+ "status": "active"
226
+ },
227
+ {
228
+ "id": "C1",
229
+ "group": "component",
230
+ "rule": "Item 必须在 Group 内",
231
+ "severity": "ERROR",
232
+ "scope": "Select|DropdownMenu|Command|Menubar|ContextMenu",
233
+ "lintRule": null,
234
+ "boundaryAnchor": "boundaries.md#error-c1--item-必须在-group-内",
235
+ "status": "active"
236
+ },
237
+ {
238
+ "id": "C2",
239
+ "group": "component",
240
+ "rule": "Dialog / Sheet / Drawer 必须有 Title",
241
+ "severity": "ERROR",
242
+ "scope": "Dialog|Sheet|Drawer",
243
+ "lintRule": "teamix-evo/dialog-must-have-title",
244
+ "boundaryAnchor": "boundaries.md#error-c2--dialog--sheet--drawer-必须有-title",
245
+ "status": "active"
246
+ },
247
+ {
248
+ "id": "C3",
249
+ "group": "component",
250
+ "rule": "Card 用完整结构",
251
+ "severity": "WARN",
252
+ "scope": "Card",
253
+ "lintRule": null,
254
+ "boundaryAnchor": "boundaries.md#warn-c3--card-用完整结构",
255
+ "status": "active"
256
+ },
257
+ {
258
+ "id": "C4",
259
+ "group": "component",
260
+ "rule": "Button 用 Spinner + disabled 组合表达 loading",
261
+ "severity": "ERROR",
262
+ "scope": "Button",
263
+ "lintRule": null,
264
+ "boundaryAnchor": "boundaries.md#error-c4--button-用-spinner--disabled-组合表达-loading",
265
+ "status": "active"
266
+ },
267
+ {
268
+ "id": "C5",
269
+ "group": "component",
270
+ "rule": "TabsTrigger 必须在 TabsList 内",
271
+ "severity": "ERROR",
272
+ "scope": "Tabs",
273
+ "lintRule": null,
274
+ "boundaryAnchor": "boundaries.md#error-c5--tabstrigger-必须在-tabslist-内",
275
+ "status": "active"
276
+ },
277
+ {
278
+ "id": "C6",
279
+ "group": "component",
280
+ "rule": "Avatar 必须有 AvatarFallback",
281
+ "severity": "WARN",
282
+ "scope": "Avatar",
283
+ "lintRule": null,
284
+ "boundaryAnchor": "boundaries.md#warn-c6--avatar-必须有-avatarfallback",
285
+ "status": "active"
286
+ },
287
+ {
288
+ "id": "C7",
289
+ "group": "component",
290
+ "rule": "提示用 Alert,不用自定义 div",
291
+ "severity": "WARN",
292
+ "scope": "global",
293
+ "lintRule": "teamix-evo/no-raw-color-scale",
294
+ "boundaryAnchor": "boundaries.md#warn-c7--提示用-alert不用自定义-div",
295
+ "status": "active"
296
+ },
297
+ {
298
+ "id": "C8",
299
+ "group": "component",
300
+ "rule": "空状态用 Empty 组件",
301
+ "severity": "WARN",
302
+ "scope": "global",
303
+ "lintRule": null,
304
+ "boundaryAnchor": "boundaries.md#warn-c8--空状态用-empty-组件",
305
+ "status": "active"
306
+ },
307
+ {
308
+ "id": "C9",
309
+ "group": "component",
310
+ "rule": "Toast 用 sonner",
311
+ "severity": "WARN",
312
+ "scope": "global",
313
+ "lintRule": null,
314
+ "boundaryAnchor": "boundaries.md#warn-c9--toast-用-sonner",
315
+ "status": "active"
316
+ },
317
+ {
318
+ "id": "C10",
319
+ "group": "component",
320
+ "rule": "分隔线用 Separator",
321
+ "severity": "WARN",
322
+ "scope": "global",
323
+ "lintRule": null,
324
+ "boundaryAnchor": "boundaries.md#warn-c10--分隔线用-separator",
325
+ "status": "active"
326
+ },
327
+ {
328
+ "id": "C11",
329
+ "group": "component",
330
+ "rule": "加载占位用 Skeleton",
331
+ "severity": "WARN",
332
+ "scope": "global",
333
+ "lintRule": "teamix-evo/no-raw-color-scale",
334
+ "boundaryAnchor": "boundaries.md#warn-c11--加载占位用-skeleton",
335
+ "status": "active"
336
+ },
337
+ {
338
+ "id": "C12",
339
+ "group": "component",
340
+ "rule": "标签/状态用 Badge",
341
+ "severity": "WARN",
342
+ "scope": "global",
343
+ "lintRule": "teamix-evo/no-raw-color-scale",
344
+ "boundaryAnchor": "boundaries.md#warn-c12--标签--状态用-badge",
345
+ "status": "active"
346
+ },
347
+ {
348
+ "id": "I1",
349
+ "group": "icon",
350
+ "rule": "按钮内图标用 data-icon 属性定位",
351
+ "severity": "ERROR",
352
+ "scope": "Button",
353
+ "lintRule": null,
354
+ "boundaryAnchor": "boundaries.md#error-i1--按钮内图标用-data-icon-属性定位",
355
+ "status": "active"
356
+ },
357
+ {
358
+ "id": "I2",
359
+ "group": "icon",
360
+ "rule": "组件内图标不设尺寸类",
361
+ "severity": "ERROR",
362
+ "scope": "Button|DropdownMenuItem|Alert|Sidebar",
363
+ "lintRule": null,
364
+ "boundaryAnchor": "boundaries.md#error-i2--组件内图标不设尺寸类",
365
+ "status": "active"
366
+ },
367
+ {
368
+ "id": "I3",
369
+ "group": "icon",
370
+ "rule": "图标作为组件对象传递",
371
+ "severity": "ERROR",
372
+ "scope": "global",
373
+ "lintRule": null,
374
+ "boundaryAnchor": "boundaries.md#error-i3--图标作为组件对象传递",
375
+ "status": "active"
376
+ },
377
+ {
378
+ "id": "I4",
379
+ "group": "icon",
380
+ "rule": "按项目配置的 iconLibrary 导入",
381
+ "severity": "ERROR",
382
+ "scope": "global",
383
+ "lintRule": "teamix-evo/icon-from-lucide",
384
+ "boundaryAnchor": "boundaries.md#error-i4--按项目配置的-iconlibrary-导入",
385
+ "status": "active"
386
+ },
387
+ {
388
+ "id": "UM1",
389
+ "group": "component",
390
+ "rule": "全局 topbar 必须使用 um-topbar 实物",
391
+ "severity": "ERROR",
392
+ "scope": "uni-manager",
393
+ "lintRule": null,
394
+ "boundaryAnchor": "boundaries.md#error-um1--全局-topbar-必须使用-um-topbar-实物--scope-uni-manager",
395
+ "status": "active"
396
+ },
397
+ {
398
+ "id": "UM2",
399
+ "group": "component",
400
+ "rule": "PageHeader 必须保持一致性结构",
401
+ "severity": "ERROR",
402
+ "scope": "uni-manager",
403
+ "lintRule": null,
404
+ "boundaryAnchor": "boundaries.md#error-um2--pageheader-必须保持一致性结构--scope-uni-manager",
405
+ "status": "active"
406
+ },
407
+ {
408
+ "id": "UM3",
409
+ "group": "component",
410
+ "rule": "跨云资源列表与详情必须标注 CloudBadge",
411
+ "severity": "ERROR",
412
+ "scope": "uni-manager",
413
+ "lintRule": null,
414
+ "boundaryAnchor": "boundaries.md#error-um3--跨云资源列表与详情必须标注-cloudbadge--scope-uni-manager",
415
+ "status": "active"
416
+ }
417
+ ]
418
+ }