@teamix-evo/skills 0.3.0 → 0.5.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 +7 -3
- package/manifest.json +63 -46
- package/package.json +3 -3
- package/src/teamix-evo-code-opentrek/SKILL.md +94 -0
- package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/api-layering.md +8 -5
- package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/checklist.md +4 -2
- package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/error-and-loading.md +38 -25
- package/src/teamix-evo-code-opentrek/file-structure.md +282 -0
- package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/forms-and-validation.md +14 -12
- package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/reuse-first.md +27 -17
- package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/routing-and-codesplit.md +23 -21
- package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/testing.md +32 -28
- package/src/teamix-evo-code-uni-manager/SKILL.md +97 -0
- package/src/teamix-evo-code-uni-manager/api-layering.md +372 -0
- package/src/teamix-evo-code-uni-manager/checklist.md +195 -0
- package/src/teamix-evo-code-uni-manager/error-and-loading.md +391 -0
- package/src/teamix-evo-code-uni-manager/file-structure.md +341 -0
- package/src/teamix-evo-code-uni-manager/forms-and-validation.md +461 -0
- package/src/teamix-evo-code-uni-manager/reuse-first.md +190 -0
- package/src/teamix-evo-code-uni-manager/routing-and-codesplit.md +452 -0
- package/src/teamix-evo-code-uni-manager/testing.md +398 -0
- package/src/teamix-evo-design-opentrek/SKILL.md +64 -0
- package/src/teamix-evo-design-opentrek/boundaries.md +533 -0
- package/src/teamix-evo-design-opentrek/brand.md +154 -0
- package/src/teamix-evo-design-opentrek/checklist.md +85 -0
- package/src/teamix-evo-design-opentrek/components.md +294 -0
- package/src/teamix-evo-design-opentrek/flows.md +51 -0
- package/src/teamix-evo-design-opentrek/foundations.md +274 -0
- package/src/teamix-evo-design-opentrek/generation-flow.md +243 -0
- package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +96 -0
- package/src/teamix-evo-design-opentrek/patterns/dashboard.md +33 -0
- package/src/teamix-evo-design-opentrek/patterns/detail-page.md +203 -0
- package/src/teamix-evo-design-opentrek/patterns/form-page.md +292 -0
- package/src/teamix-evo-design-opentrek/patterns/list-page.md +367 -0
- package/src/teamix-evo-design-opentrek/patterns/page-types.md +159 -0
- package/src/teamix-evo-design-opentrek/patterns/sidebar.md +122 -0
- package/src/teamix-evo-design-opentrek/philosophy.md +98 -0
- package/src/teamix-evo-design-opentrek/rules/README.md +39 -0
- package/src/teamix-evo-design-opentrek/rules/boundaries.rules.json +391 -0
- package/src/teamix-evo-design-uni-manager/SKILL.md +64 -0
- package/src/teamix-evo-design-uni-manager/boundaries.md +567 -0
- package/src/teamix-evo-design-uni-manager/brand.md +202 -0
- package/src/teamix-evo-design-uni-manager/checklist.md +115 -0
- package/src/teamix-evo-design-uni-manager/components.md +257 -0
- package/src/teamix-evo-design-uni-manager/flows.md +63 -0
- package/src/teamix-evo-design-uni-manager/foundations.md +261 -0
- package/src/teamix-evo-design-uni-manager/generation-flow.md +230 -0
- package/src/teamix-evo-design-uni-manager/patterns/dashboard.md +97 -0
- package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +253 -0
- package/src/teamix-evo-design-uni-manager/patterns/form-page.md +366 -0
- package/src/teamix-evo-design-uni-manager/patterns/list-page.md +389 -0
- package/src/teamix-evo-design-uni-manager/patterns/page-types.md +167 -0
- package/src/teamix-evo-design-uni-manager/philosophy.md +108 -0
- package/src/teamix-evo-design-uni-manager/rules/README.md +49 -0
- package/src/teamix-evo-design-uni-manager/rules/boundaries.rules.json +418 -0
- package/src/teamix-evo-manage/SKILL.md +289 -0
- package/skills/teamix-evo-coding-conventions/SKILL.md +0 -92
- package/skills/teamix-evo-coding-conventions/file-structure.md +0 -273
- package/skills/teamix-evo-design-rules/SKILL.md +0 -86
- package/skills/teamix-evo-design-rules/boundaries.md +0 -89
- package/skills/teamix-evo-design-rules/checklist.md +0 -108
- package/skills/teamix-evo-design-rules/generation-flow.md +0 -142
- package/skills/teamix-evo-design-rules/prompts/page-design.md +0 -148
- package/skills/teamix-evo-design-rules-opentrek/SKILL.md +0 -48
- package/skills/teamix-evo-design-rules-opentrek/brand-rules.md +0 -74
- package/skills/teamix-evo-design-rules-uni-manager/SKILL.md +0 -51
- package/skills/teamix-evo-design-rules-uni-manager/ai-scenarios.md +0 -51
- package/skills/teamix-evo-design-rules-uni-manager/command-center.md +0 -108
- package/skills/teamix-evo-design-rules-uni-manager/danger-ops.md +0 -87
- package/skills/teamix-evo-manage/SKILL.md +0 -178
- package/skills/teamix-evo-ui-upgrade/SKILL.md +0 -75
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# 设计哲学 · OpenTrek
|
|
2
|
+
|
|
3
|
+
> ⚠️ **何时读本文件**: [generation-flow.md](./generation-flow.md) Step 1 强制要求读取。本文件建立"为什么这么做"的认知基础,是后续所有决策的裁判依据。
|
|
4
|
+
|
|
5
|
+
> 回答**"为什么这么做"**。具体规则见 [boundaries.md](./boundaries.md) / [foundations.md](./foundations.md)。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 我们是谁
|
|
10
|
+
|
|
11
|
+
OpenTrek 是面向**云资源管理 / 企业级控制台**的设计语言。用户是工程师、运维、IT 管理员 —— 每天数百次重复操作、对失误代价敏感、对花哨视觉无感。
|
|
12
|
+
|
|
13
|
+
**核心主张**:让复杂系统变得可管理,而非让简单事物变得复杂。
|
|
14
|
+
|
|
15
|
+
**三条不可让步的底层信念**:
|
|
16
|
+
|
|
17
|
+
1. 设计是降低认知负荷的手段,不是展示创意的舞台
|
|
18
|
+
2. 每一个视觉元素必须承载功能价值或信息语义
|
|
19
|
+
3. 一致性优先于创新性 — "惊喜"在严肃工具中是反模式
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 2. 四大设计原则(按优先级降序)
|
|
24
|
+
|
|
25
|
+
冲突时裁决顺序:**Safety > Predictability > Clarity > Efficiency**。
|
|
26
|
+
|
|
27
|
+
### P1 · Safety — 安全防护(最高优先级)
|
|
28
|
+
|
|
29
|
+
> 关键资源操作必须有防护栏。
|
|
30
|
+
|
|
31
|
+
- 危险操作(删除 / 停止)二次确认 → `AlertDialog variant="destructive"`
|
|
32
|
+
- 表单未保存离开提示 → `beforeunload`
|
|
33
|
+
- 无权限操作隐藏或禁用 → `usePermission`
|
|
34
|
+
- 尽可能提供撤销 / 回收站
|
|
35
|
+
|
|
36
|
+
**评判**:一次误操作的最大损失是否被框定在可恢复的范围内?
|
|
37
|
+
|
|
38
|
+
### P2 · Predictability — 可预期性
|
|
39
|
+
|
|
40
|
+
> 用户不应该猜测"点击这个会发生什么"。
|
|
41
|
+
|
|
42
|
+
- 同类操作使用同样的交互模式(页面类型规则统一)
|
|
43
|
+
- 同类型操作出现在固定位置(Zone Map)
|
|
44
|
+
- 操作后 ≤ 200ms 给出反馈
|
|
45
|
+
- 页面间跳转关系可预知(面包屑 + 返回按钮 + URL 语义)
|
|
46
|
+
|
|
47
|
+
**评判**:用户在 A 页面学会的操作,能否无障碍迁移到 B 页面?
|
|
48
|
+
|
|
49
|
+
### P3 · Clarity — 清晰优先
|
|
50
|
+
|
|
51
|
+
> 界面的首要职责是传递信息,不是展示装饰。
|
|
52
|
+
|
|
53
|
+
- 文字对比度 ≥ 4.5:1(WCAG AA) — 走 `text-foreground` on `bg-background`
|
|
54
|
+
- 状态语义 = **颜色 + 图标 + 文字**三重传达 — `Badge variant` + Icon + Label
|
|
55
|
+
- 主操作入口在视觉焦点区域(左上 / 右上) — `ActionToolbar` 布局规则
|
|
56
|
+
- 3 级信息层级:标题 / 正文 / 辅助
|
|
57
|
+
|
|
58
|
+
**评判**:新用户是否能在 3 秒内理解当前页面的核心目的?
|
|
59
|
+
|
|
60
|
+
### P4 · Efficiency — 效率至上
|
|
61
|
+
|
|
62
|
+
> 运维人员每天面对数百次重复操作,减少一次点击就是减少一次出错机会。
|
|
63
|
+
|
|
64
|
+
- 高频操作 ≤ 2 次点击可达
|
|
65
|
+
- 支持多选 + 批量操作 → `BulkActionBar` + Checkbox 列
|
|
66
|
+
- 列表页必须提供搜索入口 → `SearchCombo` / `QueryFilter`
|
|
67
|
+
- 筛选条件持久化(URL Params + localStorage)
|
|
68
|
+
|
|
69
|
+
**评判**:完成核心任务的步骤数是否为同类产品最少?
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 3. 原则冲突示例
|
|
74
|
+
|
|
75
|
+
| 场景 | 候选 | 选 | 理由 |
|
|
76
|
+
| ------------------------ | -------------------------------------------------- | --- | -------------------------------- |
|
|
77
|
+
| 删除按钮要不要二次确认? | A. 直接删除(效率)<br>B. AlertDialog 确认(安全) | B | Safety > Efficiency |
|
|
78
|
+
| 创建按钮浮动还是固定? | A. 跟随滚动浮动(醒目)<br>B. 固定右下角(一致) | B | Predictability > Clarity |
|
|
79
|
+
| 状态用什么表达? | A. 仅颜色(简洁)<br>B. 颜色 + 图标 + 文字 | B | Clarity > Efficiency(视觉简洁) |
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 4. 决策框架(套用顺序)
|
|
84
|
+
|
|
85
|
+
1. Safety > Predictability > Clarity > Efficiency
|
|
86
|
+
2. 业务正确性 > 视觉美观
|
|
87
|
+
3. 一致性 > 创新性
|
|
88
|
+
4. 可访问性 > 视觉丰富度
|
|
89
|
+
5. 性能 > 动效丰富度
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
文件分工:
|
|
94
|
+
|
|
95
|
+
- **philosophy.md** — 为什么
|
|
96
|
+
- **boundaries.md** — 不能做什么
|
|
97
|
+
- **foundations.md** — 用什么 token
|
|
98
|
+
- **patterns/** — 具体页面怎么搭
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# rules/ — boundaries.md ↔ eslint-config 元数据桥
|
|
2
|
+
|
|
3
|
+
本目录是 **结构化元数据**,不是规则实现。它把:
|
|
4
|
+
|
|
5
|
+
1. `boundaries.md` 中的 38 条人类可读硬约束(F/FF/S/C/I 五组)
|
|
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) |
|
|
18
|
+
| `group` | `forbidden` / `form` / `style` / `component` / `icon` |
|
|
19
|
+
| `rule` | 一句话规则陈述(与 boundaries.md 章节标题保持一致) |
|
|
20
|
+
| `severity` | `ERROR` 必须修复 / `WARN` 建议修复 |
|
|
21
|
+
| `scope` | `global` 或具体组件名(如 `Dialog`、`Button`) |
|
|
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` 通过
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./rules.schema.json",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"source": "boundaries.md",
|
|
5
|
+
"rules": [
|
|
6
|
+
{
|
|
7
|
+
"id": "F1",
|
|
8
|
+
"group": "forbidden",
|
|
9
|
+
"rule": "禁止硬编码色值",
|
|
10
|
+
"severity": "ERROR",
|
|
11
|
+
"scope": "global",
|
|
12
|
+
"lintRule": "teamix-evo/no-color-literal",
|
|
13
|
+
"boundaryAnchor": "boundaries.md#error-f1--禁止硬编码色值",
|
|
14
|
+
"status": "active"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "F2",
|
|
18
|
+
"group": "forbidden",
|
|
19
|
+
"rule": "禁止硬编码尺寸",
|
|
20
|
+
"severity": "ERROR",
|
|
21
|
+
"scope": "global",
|
|
22
|
+
"lintRule": "teamix-evo/no-arbitrary-tw-value",
|
|
23
|
+
"boundaryAnchor": "boundaries.md#error-f2--禁止硬编码尺寸",
|
|
24
|
+
"status": "active"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "F3",
|
|
28
|
+
"group": "forbidden",
|
|
29
|
+
"rule": "禁止按组件新增重复语义变量",
|
|
30
|
+
"severity": "ERROR",
|
|
31
|
+
"scope": "global",
|
|
32
|
+
"lintRule": null,
|
|
33
|
+
"boundaryAnchor": "boundaries.md#error-f3--禁止按组件新增重复语义变量",
|
|
34
|
+
"status": "active"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "F4",
|
|
38
|
+
"group": "forbidden",
|
|
39
|
+
"rule": "禁止页头添加底色或下边框",
|
|
40
|
+
"severity": "ERROR",
|
|
41
|
+
"scope": "PageHeader",
|
|
42
|
+
"lintRule": null,
|
|
43
|
+
"boundaryAnchor": "boundaries.md#error-f4--禁止页头添加底色或下边框--scope-pageheader",
|
|
44
|
+
"status": "active"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "F5",
|
|
48
|
+
"group": "forbidden",
|
|
49
|
+
"rule": "outline 按钮禁止使用 border-input",
|
|
50
|
+
"severity": "ERROR",
|
|
51
|
+
"scope": "Button",
|
|
52
|
+
"lintRule": null,
|
|
53
|
+
"boundaryAnchor": "boundaries.md#error-f5--outline-按钮禁止使用-border-input--scope-button",
|
|
54
|
+
"status": "active"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "F6",
|
|
58
|
+
"group": "forbidden",
|
|
59
|
+
"rule": "禁止直接写 font-size: 12px",
|
|
60
|
+
"severity": "ERROR",
|
|
61
|
+
"scope": "global",
|
|
62
|
+
"lintRule": "teamix-evo/no-arbitrary-tw-value",
|
|
63
|
+
"boundaryAnchor": "boundaries.md#error-f6--禁止直接写-font-size-12px",
|
|
64
|
+
"status": "active"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "F7",
|
|
68
|
+
"group": "forbidden",
|
|
69
|
+
"rule": "语义间距必须走 CSS 变量",
|
|
70
|
+
"severity": "ERROR",
|
|
71
|
+
"scope": "global",
|
|
72
|
+
"lintRule": "teamix-evo/no-arbitrary-tw-value",
|
|
73
|
+
"boundaryAnchor": "boundaries.md#error-f7--语义间距必须走-css-变量",
|
|
74
|
+
"status": "active"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "F8",
|
|
78
|
+
"group": "forbidden",
|
|
79
|
+
"rule": "禁止在 DialogTitle 中加图标",
|
|
80
|
+
"severity": "ERROR",
|
|
81
|
+
"scope": "Dialog",
|
|
82
|
+
"lintRule": null,
|
|
83
|
+
"boundaryAnchor": "boundaries.md#error-f8--禁止在-dialogtitle-中加图标--scope-dialog",
|
|
84
|
+
"status": "active"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "F9",
|
|
88
|
+
"group": "forbidden",
|
|
89
|
+
"rule": "弹窗确定按钮禁止加 disabled 禁用态",
|
|
90
|
+
"severity": "ERROR",
|
|
91
|
+
"scope": "Dialog",
|
|
92
|
+
"lintRule": null,
|
|
93
|
+
"boundaryAnchor": "boundaries.md#error-f9--弹窗确定按钮禁止加-disabled-禁用态--scope-dialog",
|
|
94
|
+
"status": "active"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "F10",
|
|
98
|
+
"group": "forbidden",
|
|
99
|
+
"rule": "hover 时禁止将 boxShadow 设为 undefined",
|
|
100
|
+
"severity": "WARN",
|
|
101
|
+
"scope": "HoverCard",
|
|
102
|
+
"lintRule": null,
|
|
103
|
+
"boundaryAnchor": "boundaries.md#warn-f10--hover-时禁止将-boxshadow-设为-undefined--scope-hovercard",
|
|
104
|
+
"status": "active"
|
|
105
|
+
},
|
|
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
|
+
{
|
|
149
|
+
"id": "S1",
|
|
150
|
+
"group": "style",
|
|
151
|
+
"rule": "className 仅用于布局,不用于覆盖组件颜色/字体",
|
|
152
|
+
"severity": "ERROR",
|
|
153
|
+
"scope": "global",
|
|
154
|
+
"lintRule": "teamix-evo/no-color-literal",
|
|
155
|
+
"boundaryAnchor": "boundaries.md#error-s1--classname-仅用于布局不用于覆盖组件颜色--字体",
|
|
156
|
+
"status": "active"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "S2",
|
|
160
|
+
"group": "style",
|
|
161
|
+
"rule": "不用 space-x-* / space-y-*,改用 flex + gap-*",
|
|
162
|
+
"severity": "ERROR",
|
|
163
|
+
"scope": "global",
|
|
164
|
+
"lintRule": "teamix-evo/prefer-gap-over-space",
|
|
165
|
+
"boundaryAnchor": "boundaries.md#error-s2--不用-space-x---space-y--改用-flex--gap-",
|
|
166
|
+
"status": "active"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"id": "S3",
|
|
170
|
+
"group": "style",
|
|
171
|
+
"rule": "等宽高用 size-*,不用 w-* h-*",
|
|
172
|
+
"severity": "WARN",
|
|
173
|
+
"scope": "global",
|
|
174
|
+
"lintRule": null,
|
|
175
|
+
"boundaryAnchor": "boundaries.md#warn-s3--等宽高用-size-不用-w--h-",
|
|
176
|
+
"status": "active"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"id": "S4",
|
|
180
|
+
"group": "style",
|
|
181
|
+
"rule": "用 truncate 简写文本截断",
|
|
182
|
+
"severity": "WARN",
|
|
183
|
+
"scope": "global",
|
|
184
|
+
"lintRule": null,
|
|
185
|
+
"boundaryAnchor": "boundaries.md#warn-s4--用-truncate-简写文本截断",
|
|
186
|
+
"status": "active"
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"id": "S5",
|
|
190
|
+
"group": "style",
|
|
191
|
+
"rule": "不用手动 dark: 颜色覆盖,用语义 token",
|
|
192
|
+
"severity": "ERROR",
|
|
193
|
+
"scope": "global",
|
|
194
|
+
"lintRule": "teamix-evo/no-manual-dark-classnames",
|
|
195
|
+
"boundaryAnchor": "boundaries.md#error-s5--不用手动-dark-颜色覆盖用语义-token",
|
|
196
|
+
"status": "active"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"id": "S6",
|
|
200
|
+
"group": "style",
|
|
201
|
+
"rule": "用 cn() 处理条件类名,不用模板字符串三元",
|
|
202
|
+
"severity": "ERROR",
|
|
203
|
+
"scope": "global",
|
|
204
|
+
"lintRule": null,
|
|
205
|
+
"boundaryAnchor": "boundaries.md#error-s6--用-cn-处理条件类名不用模板字符串三元",
|
|
206
|
+
"status": "active"
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"id": "S7",
|
|
210
|
+
"group": "style",
|
|
211
|
+
"rule": "overlay 组件不手动设置 z-index",
|
|
212
|
+
"severity": "ERROR",
|
|
213
|
+
"scope": "global",
|
|
214
|
+
"lintRule": null,
|
|
215
|
+
"boundaryAnchor": "boundaries.md#error-s7--overlay-组件不手动设置-z-index",
|
|
216
|
+
"status": "active"
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"id": "S8",
|
|
220
|
+
"group": "style",
|
|
221
|
+
"rule": "不用原始色值表示状态",
|
|
222
|
+
"severity": "ERROR",
|
|
223
|
+
"scope": "global",
|
|
224
|
+
"lintRule": "teamix-evo/no-raw-color-scale",
|
|
225
|
+
"boundaryAnchor": "boundaries.md#error-s8--不用原始色值表示状态",
|
|
226
|
+
"status": "active"
|
|
227
|
+
},
|
|
228
|
+
|
|
229
|
+
{
|
|
230
|
+
"id": "C1",
|
|
231
|
+
"group": "component",
|
|
232
|
+
"rule": "Item 必须在 Group 内",
|
|
233
|
+
"severity": "ERROR",
|
|
234
|
+
"scope": "Select|DropdownMenu|Command|Menubar|ContextMenu",
|
|
235
|
+
"lintRule": null,
|
|
236
|
+
"boundaryAnchor": "boundaries.md#error-c1--item-必须在-group-内",
|
|
237
|
+
"status": "active"
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"id": "C2",
|
|
241
|
+
"group": "component",
|
|
242
|
+
"rule": "Dialog / Sheet / Drawer 必须有 Title",
|
|
243
|
+
"severity": "ERROR",
|
|
244
|
+
"scope": "Dialog|Sheet|Drawer",
|
|
245
|
+
"lintRule": "teamix-evo/dialog-must-have-title",
|
|
246
|
+
"boundaryAnchor": "boundaries.md#error-c2--dialog--sheet--drawer-必须有-title",
|
|
247
|
+
"status": "active"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"id": "C3",
|
|
251
|
+
"group": "component",
|
|
252
|
+
"rule": "Card 用完整结构",
|
|
253
|
+
"severity": "WARN",
|
|
254
|
+
"scope": "Card",
|
|
255
|
+
"lintRule": null,
|
|
256
|
+
"boundaryAnchor": "boundaries.md#warn-c3--card-用完整结构",
|
|
257
|
+
"status": "active"
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"id": "C4",
|
|
261
|
+
"group": "component",
|
|
262
|
+
"rule": "Button 用 Spinner + disabled 组合表达 loading",
|
|
263
|
+
"severity": "ERROR",
|
|
264
|
+
"scope": "Button",
|
|
265
|
+
"lintRule": null,
|
|
266
|
+
"boundaryAnchor": "boundaries.md#error-c4--button-用-spinner--disabled-组合表达-loading",
|
|
267
|
+
"status": "active"
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"id": "C5",
|
|
271
|
+
"group": "component",
|
|
272
|
+
"rule": "TabsTrigger 必须在 TabsList 内",
|
|
273
|
+
"severity": "ERROR",
|
|
274
|
+
"scope": "Tabs",
|
|
275
|
+
"lintRule": null,
|
|
276
|
+
"boundaryAnchor": "boundaries.md#error-c5--tabstrigger-必须在-tabslist-内",
|
|
277
|
+
"status": "active"
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"id": "C6",
|
|
281
|
+
"group": "component",
|
|
282
|
+
"rule": "Avatar 必须有 AvatarFallback",
|
|
283
|
+
"severity": "WARN",
|
|
284
|
+
"scope": "Avatar",
|
|
285
|
+
"lintRule": null,
|
|
286
|
+
"boundaryAnchor": "boundaries.md#warn-c6--avatar-必须有-avatarfallback",
|
|
287
|
+
"status": "active"
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"id": "C7",
|
|
291
|
+
"group": "component",
|
|
292
|
+
"rule": "提示用 Alert,不用自定义 div",
|
|
293
|
+
"severity": "WARN",
|
|
294
|
+
"scope": "global",
|
|
295
|
+
"lintRule": "teamix-evo/no-raw-color-scale",
|
|
296
|
+
"boundaryAnchor": "boundaries.md#warn-c7--提示用-alert不用自定义-div",
|
|
297
|
+
"status": "active"
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"id": "C8",
|
|
301
|
+
"group": "component",
|
|
302
|
+
"rule": "空状态用 Empty 组件",
|
|
303
|
+
"severity": "WARN",
|
|
304
|
+
"scope": "global",
|
|
305
|
+
"lintRule": null,
|
|
306
|
+
"boundaryAnchor": "boundaries.md#warn-c8--空状态用-empty-组件",
|
|
307
|
+
"status": "active"
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"id": "C9",
|
|
311
|
+
"group": "component",
|
|
312
|
+
"rule": "Toast 用 sonner",
|
|
313
|
+
"severity": "WARN",
|
|
314
|
+
"scope": "global",
|
|
315
|
+
"lintRule": null,
|
|
316
|
+
"boundaryAnchor": "boundaries.md#warn-c9--toast-用-sonner",
|
|
317
|
+
"status": "active"
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"id": "C10",
|
|
321
|
+
"group": "component",
|
|
322
|
+
"rule": "分隔线用 Separator",
|
|
323
|
+
"severity": "WARN",
|
|
324
|
+
"scope": "global",
|
|
325
|
+
"lintRule": null,
|
|
326
|
+
"boundaryAnchor": "boundaries.md#warn-c10--分隔线用-separator",
|
|
327
|
+
"status": "active"
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
"id": "C11",
|
|
331
|
+
"group": "component",
|
|
332
|
+
"rule": "加载占位用 Skeleton",
|
|
333
|
+
"severity": "WARN",
|
|
334
|
+
"scope": "global",
|
|
335
|
+
"lintRule": "teamix-evo/no-raw-color-scale",
|
|
336
|
+
"boundaryAnchor": "boundaries.md#warn-c11--加载占位用-skeleton",
|
|
337
|
+
"status": "active"
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
"id": "C12",
|
|
341
|
+
"group": "component",
|
|
342
|
+
"rule": "标签/状态用 Badge",
|
|
343
|
+
"severity": "WARN",
|
|
344
|
+
"scope": "global",
|
|
345
|
+
"lintRule": "teamix-evo/no-raw-color-scale",
|
|
346
|
+
"boundaryAnchor": "boundaries.md#warn-c12--标签--状态用-badge",
|
|
347
|
+
"status": "active"
|
|
348
|
+
},
|
|
349
|
+
|
|
350
|
+
{
|
|
351
|
+
"id": "I1",
|
|
352
|
+
"group": "icon",
|
|
353
|
+
"rule": "按钮内图标用 data-icon 属性定位",
|
|
354
|
+
"severity": "ERROR",
|
|
355
|
+
"scope": "Button",
|
|
356
|
+
"lintRule": null,
|
|
357
|
+
"boundaryAnchor": "boundaries.md#error-i1--按钮内图标用-data-icon-属性定位",
|
|
358
|
+
"status": "active"
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
"id": "I2",
|
|
362
|
+
"group": "icon",
|
|
363
|
+
"rule": "组件内图标不设尺寸类",
|
|
364
|
+
"severity": "ERROR",
|
|
365
|
+
"scope": "Button|DropdownMenuItem|Alert|Sidebar",
|
|
366
|
+
"lintRule": null,
|
|
367
|
+
"boundaryAnchor": "boundaries.md#error-i2--组件内图标不设尺寸类",
|
|
368
|
+
"status": "active"
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"id": "I3",
|
|
372
|
+
"group": "icon",
|
|
373
|
+
"rule": "图标作为组件对象传递",
|
|
374
|
+
"severity": "ERROR",
|
|
375
|
+
"scope": "global",
|
|
376
|
+
"lintRule": null,
|
|
377
|
+
"boundaryAnchor": "boundaries.md#error-i3--图标作为组件对象传递",
|
|
378
|
+
"status": "active"
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"id": "I4",
|
|
382
|
+
"group": "icon",
|
|
383
|
+
"rule": "按项目配置的 iconLibrary 导入",
|
|
384
|
+
"severity": "ERROR",
|
|
385
|
+
"scope": "global",
|
|
386
|
+
"lintRule": "teamix-evo/icon-from-lucide",
|
|
387
|
+
"boundaryAnchor": "boundaries.md#error-i4--按项目配置的-iconlibrary-导入",
|
|
388
|
+
"status": "active"
|
|
389
|
+
}
|
|
390
|
+
]
|
|
391
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: teamix-evo-design-uni-manager
|
|
3
|
+
description: |
|
|
4
|
+
Apply Uni-Manager design system rules (philosophy, patterns, page-types, brand tone/voice, visual foundations) when AI generates or reviews a full UI screen / page in a Uni-Manager-variant project (专有云 / 混合云 / 云管平台 / hybrid cloud console).
|
|
5
|
+
TRIGGER when: user asks to "新建 / 优化 / 重构 一个页面"、"做一个列表页 / 详情页 / 表单页 / 仪表盘 / 控制台首页"、"create / review / refactor a page、screen、dashboard、console、admin template"; intent involves layout structure, page-level information density, or multi-component composition for hybrid-cloud / multi-tenant / multi-region scenarios; file write under `src/pages/**` or `src/templates/**`.
|
|
6
|
+
SKIP: single-component edits like "加个按钮"、"改 input 的 label"; pure tokens/theme overrides; pure code refactor with no visual change; teamix-evo lifecycle commands (defer to teamix-evo-manage).
|
|
7
|
+
Coordinates with: teamix-evo-code-uni-manager (run alongside when the screen also creates new files).
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# teamix-evo-design-uni-manager
|
|
11
|
+
|
|
12
|
+
> Uni-Manager 设计体系 — 面向 **专有云 / 混合云 / 多租户管控平台** 的现代设计语言。
|
|
13
|
+
> 高信息密度、强一致性、可枚举可审计;视觉以 hybridcloud 蓝(B50 #0064C8)+ 锐利圆角(2px / 4px)为锚。
|
|
14
|
+
>
|
|
15
|
+
> 本技能是 **完整自包含** 的 Uni-Manager 设计规则(非 overlay over OpenTrek)。
|
|
16
|
+
> Token 具体值请参照 `@teamix-evo/tokens/variants/uni-manager/theme.css` 中的 CSS 变量,组件详细 API 通过 MCP `get_component_meta` 按需查询。
|
|
17
|
+
|
|
18
|
+
<!-- teamix-evo:managed:start id="core" -->
|
|
19
|
+
|
|
20
|
+
## ⚠️ 执行协议(MANDATORY — 跳步即失败)
|
|
21
|
+
|
|
22
|
+
收到页面相关请求时,**必须先识别意图,再进入对应的唯一执行路径**。不允许跳过路径中的任何步骤。
|
|
23
|
+
|
|
24
|
+
### 意图路由
|
|
25
|
+
|
|
26
|
+
| 意图 | 识别关键词 | 唯一执行路径 |
|
|
27
|
+
| -------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------- |
|
|
28
|
+
| **生成** | "生成" / "创建" / "新建" / "设计一个" / "做一个" / "起一个控制台" | **必须完整执行** [generation-flow.md](./generation-flow.md) §1 六步门控 |
|
|
29
|
+
| **翻新** | "改造" / "升级" / "翻新" / "对齐规范" / "重新生成" | **必须完整执行** [generation-flow.md](./generation-flow.md) §2 翻新路径 |
|
|
30
|
+
| **验证** | "检查" / "验证" / "评估" / "是否符合规范" | **必须完整执行** [generation-flow.md](./generation-flow.md) §3 验证路径 |
|
|
31
|
+
| **查询** | "token" / "色值" / "间距" / "组件尺寸" / "圆角" | → [foundations.md](./foundations.md)(MCP `tokens_*` 工具规划中) |
|
|
32
|
+
|
|
33
|
+
### 不可跳过的前置读取
|
|
34
|
+
|
|
35
|
+
无论哪种意图,进入 generation-flow.md 后**每个 Step 都有明确的 MUST READ 文件清单**。AI 不得凭"已有知识"跳过任何文件读取 — 每次任务必须重新读取,因为文件内容可能已更新。
|
|
36
|
+
|
|
37
|
+
### 禁止行为
|
|
38
|
+
|
|
39
|
+
- ❌ 跳过 generation-flow.md 直接写代码
|
|
40
|
+
- ❌ 只读 patterns/\*.md 不读 philosophy.md / boundaries.md / foundations.md
|
|
41
|
+
- ❌ 选择性读取("这个文件我已经知道内容了")
|
|
42
|
+
- ❌ 把 SKILL.md 文件索引当作"我可以只挑一个读"的菜单
|
|
43
|
+
|
|
44
|
+
## 文件索引
|
|
45
|
+
|
|
46
|
+
| 文件 | 职责 |
|
|
47
|
+
| ------------------------------------------------------------ | ---------------------------------------------------------------------------- |
|
|
48
|
+
| [philosophy.md](./philosophy.md) | 设计哲学 + 四大原则 + 方法论(专有云一致性) |
|
|
49
|
+
| [generation-flow.md](./generation-flow.md) | AI 六步生成/翻新/验证流程 |
|
|
50
|
+
| [boundaries.md](./boundaries.md) | 硬约束:F/FF/S/C/I + UM 共 41+ 条规则([ERROR]/[WARN]) |
|
|
51
|
+
| [checklist.md](./checklist.md) | 12+ 项自检清单(含 hybridcloud 圆角 / 一致性三件套) |
|
|
52
|
+
| [foundations.md](./foundations.md) | hybridcloud Token 用法 + 排版 + 8 档间距 + 色彩 + 锐利圆角 + 4 级阴影 + 动效 |
|
|
53
|
+
| [components.md](./components.md) | 组件选型决策树 + 双层架构索引 + 组合规则(um-topbar 实物归属) |
|
|
54
|
+
| [patterns/page-types.md](./patterns/page-types.md) | 5 种页面类型 + Console Home + 一致性三件套 |
|
|
55
|
+
| [patterns/list-page.md](./patterns/list-page.md) | 列表页模式(多租户 / 多区域筛选) |
|
|
56
|
+
| [patterns/detail-page.md](./patterns/detail-page.md) | 详情页模式(资源详情 / 跨云资源关联) |
|
|
57
|
+
| [patterns/form-page.md](./patterns/form-page.md) | 表单页模式(含 wizard / Drawer 内联表单) |
|
|
58
|
+
| [patterns/dashboard.md](./patterns/dashboard.md) | Dashboard / Console Home(StatCard / Chart 标准结构) |
|
|
59
|
+
| [flows.md](./flows.md) | 5 条核心用户旅程 + 上下文切换(租户/项目/区域) |
|
|
60
|
+
| [brand.md](./brand.md) | Uni-Manager 品牌调性 + 文案语气 + 正反例(B50 + 锐利风) |
|
|
61
|
+
| [rules/README.md](./rules/README.md) | boundaries.md ↔ eslint-config 元数据桥说明 |
|
|
62
|
+
| [rules/boundaries.rules.json](./rules/boundaries.rules.json) | 41+ 条规则的结构化索引 |
|
|
63
|
+
|
|
64
|
+
<!-- teamix-evo:managed:end -->
|