@teamix-evo/skills 0.11.0 → 0.11.1

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.
@@ -0,0 +1,318 @@
1
+ # OpenTrek 标准列表页业务规则
2
+
3
+ > 路由自 [standard-list.md](./standard-list.md)
4
+ > 本文件基于 OpenTrek DEV 平台实际页面截图沉淀,定义 DataTable 标准列表页的页面级组合规则。
5
+ > 所有 UI 组件引用均指向 `packages/ui/src/components/`,开发时必须从该路径导入。
6
+ > 通用列表规则(padding/操作列/状态-操作模式)见 [../SKILL.md](../SKILL.md) §5-§7。
7
+
8
+ ---
9
+
10
+ ## 1. 页面模式速查表
11
+
12
+ | 模式 ID | 名称 | 典型页面 | 核心结构 |
13
+ |---------|------|----------|----------|
14
+ | **OT-STD-1** | Tab 导航标准列表 | 上架CoWorker / 内置资产 / 评测集 / 评测任务 / 元数据管理 | Tabs + ActionToolbar + DataTable + Pagination |
15
+ | **OT-STD-2** | 简单标准列表 | 操作记录 / Trace追踪 | ActionToolbar + DataTable + Pagination(无 Tabs) |
16
+ | **OT-STD-3** | 查询面板标准列表 | 内置服务 > 模型接入 | QueryPanel(可折叠) + ActionToolbar(简化) + DataTable + Pagination |
17
+
18
+ ---
19
+
20
+ ## 2. OT-STD-1:Tab 导航标准列表
21
+
22
+ > 典型页面:上架CoWorker(数字员工/知识库/Skills/模型服务上架)、内置资产(内置Skills/内置评测集/内置评估器)、评测集(空间/内置)、评测任务(独立任务/自动化任务)、元数据管理(Skills标签/知识库元数据)
23
+
24
+ ### 布局骨架
25
+
26
+ ```
27
+ ┌─ PageShell (components/page-shell) ──────────────────────────────────────┐
28
+ │ sidebar: Sidebar (components/sidebar) │
29
+ │ children: │
30
+ │ ┌─ ContentCard (components/card → Card + CardContent) ──────────────┐ │
31
+ │ │ PageHeader (components/page-header → PageHeader + PageHeaderHeading)│ │
32
+ │ │ 标题: "上架CoWorker" / "内置资产" / "评测集" / "元数据管理" │ │
33
+ │ │ │ │
34
+ │ │ Tabs (components/tabs → Tabs + TabsList[variant='line'] + TabsTrigger)│ │
35
+ │ │ [数字员工上架 | 知识库上架 | Skills上架 | 模型服务上架] │ │
36
+ │ │ [内置Skills | 内置评测集 | 内置评估器] │ │
37
+ │ │ │ │
38
+ │ │ TabsContent: │ │
39
+ │ │ ActionToolbar (flex, nowrap): │ │
40
+ │ │ .left-actions: │ │
41
+ │ │ Button (variant='default', color='primary') "+ 上架模型" │ │
42
+ │ │ .search-combo (margin-left: 20px): │ │
43
+ │ │ Input placeholder="搜索模型服务展示名称" │ │
44
+ │ │ .right-tools: │ │
45
+ │ │ [Select "全部类型 ▼"] *可选 │ │
46
+ │ │ [ToggleGroup 状态筛选] *可选 │ │
47
+ │ │ │ │
48
+ │ │ DataTable (components/data-table): │ │
49
+ │ │ thead: 列标题行 │ │
50
+ │ │ tbody: 数据行 × N │ │
51
+ │ │ │ │
52
+ │ │ Pagination (components/pagination): │ │
53
+ │ │ 共 50 条 每页显示: [10 ▼] [‹] [1] [2] [3] [4] [5] [›] │ │
54
+ │ └────────────────────────────────────────────────────────────────────┘ │
55
+ └──────────────────────────────────────────────────────────────────────────┘
56
+ ```
57
+
58
+ ### Tab 行为规范
59
+
60
+ | 规则 | 说明 |
61
+ |------|------|
62
+ | variant | `TabsList` 使用 `variant='line'`(下划线样式),禁止使用 `default`/`card` |
63
+ | 位置 | Tabs 紧接 PageHeader 下方,ActionToolbar 之上 |
64
+ | 切换行为 | 切换 Tab 时重置 DataTable 数据和分页到第 1 页 |
65
+ | 独立配置 | 每个 TabsContent 拥有独立的 ActionToolbar + DataTable + Pagination |
66
+ | 只读 Tab | 内置/公共数据 Tab 可隐藏创建按钮,仅保留搜索 |
67
+
68
+ ### 读写权限差异
69
+
70
+ | Tab 类型 | 创建按钮 | 操作列 | 示例 |
71
+ |----------|----------|--------|------|
72
+ | 空间/可编辑 | ✅ 显示 | 详情 + 编辑 + 删除 | 空间评测集 |
73
+ | 内置/只读 | ❌ 隐藏 | 仅"详情" | 内置评测集 |
74
+
75
+ ---
76
+
77
+ ## 3. OT-STD-2:简单标准列表
78
+
79
+ > 典型页面:操作记录、Trace追踪(审计/日志类页面,无 Tabs)
80
+
81
+ ### 布局骨架
82
+
83
+ ```
84
+ ┌─ PageShell ──────────────────────────────────────────────────────────────┐
85
+ │ sidebar: Sidebar │
86
+ │ ┌─ ContentCard ──────────────────────────────────────────────────────┐ │
87
+ │ │ PageHeader: "操作记录" / "Trace追踪" │ │
88
+ │ │ │ │
89
+ │ │ ActionToolbar (flex, nowrap): │ │
90
+ │ │ .left-actions: │ │
91
+ │ │ [Button (primary)] "回流评测集" *如有特殊操作 │ │
92
+ │ │ 筛选组合 (多个筛选控件并排): │ │
93
+ │ │ [Select "全部菜单 ▼"] [Select "最近7天 ▼"] │ │
94
+ │ │ [Input "请输入"] [🔍] [DateRangePicker "开始日期 - 结束日期 📅"] │ │
95
+ │ │ .search-combo: │ │
96
+ │ │ Input placeholder="搜索操作项、操作人..." │ │
97
+ │ │ │ │
98
+ │ │ DataTable + Pagination │ │
99
+ │ └────────────────────────────────────────────────────────────────────┘ │
100
+ └──────────────────────────────────────────────────────────────────────────┘
101
+ ```
102
+
103
+ ### 与 OT-STD-1 差异
104
+
105
+ | 维度 | OT-STD-1 | OT-STD-2 |
106
+ |------|----------|----------|
107
+ | Tabs | ✅ 必需 | ❌ 无 |
108
+ | 创建按钮 | 通常有 | 通常无(只读日志) |
109
+ | 筛选复杂度 | SearchCombo + 0-1 个 Select | 多筛选控件组合(Select + Input + DateRange) |
110
+ | 典型场景 | CRUD 管理 | 审计/日志/追踪 |
111
+
112
+ ---
113
+
114
+ ## 4. OT-STD-3:查询面板标准列表
115
+
116
+ > 典型页面:内置服务 > 模型接入(筛选条件 ≥ 3 个,使用持久化查询面板)
117
+
118
+ ### 布局骨架
119
+
120
+ ```
121
+ ┌─ PageShell ──────────────────────────────────────────────────────────────┐
122
+ │ sidebar: Sidebar │
123
+ │ ┌─ ContentCard ──────────────────────────────────────────────────────┐ │
124
+ │ │ PageHeader: "内置服务" │ │
125
+ │ │ Tabs: [沙箱管理 | 消息渠道管理 | 数据源管理 | 模型接入] │ │
126
+ │ │ │ │
127
+ │ │ QueryPanel (bordered card, padding 16px): │ │
128
+ │ │ ┌────────────────────────────────────────────────────────┐ │ │
129
+ │ │ │ [Input] [Input] [Input] [Input] [Select "全部 ▼"] │ │ │
130
+ │ │ │ [🔍查询] [↻重置] [∧折叠] │ │ │
131
+ │ │ └────────────────────────────────────────────────────────┘ │ │
132
+ │ │ │ │
133
+ │ │ ActionToolbar (简化): │ │
134
+ │ │ .left-actions: Button (primary) "+ 接入模型" │ │
135
+ │ │ │ │
136
+ │ │ DataTable + Pagination │ │
137
+ │ └────────────────────────────────────────────────────────────────────┘ │
138
+ └──────────────────────────────────────────────────────────────────────────┘
139
+ ```
140
+
141
+ ### QueryPanel 规范
142
+
143
+ | 规则 | 说明 |
144
+ |------|------|
145
+ | 容器 | 灰色背景面板(`bg-muted/50`),rounded-lg,padding 16px 20px |
146
+ | 布局 | 输入项一行排列,每行最多 5 个控件,grid 或 flex wrap |
147
+ | 操作按钮 | 行尾对齐:[查询(primary)] [重置(outline)] [折叠(ghost)] |
148
+ | 折叠行为 | 点击"折叠"收起面板仅保留简要描述或完全隐藏;点击"展开"恢复 |
149
+ | 位置 | Tabs 下方、ActionToolbar 上方 |
150
+ | 与 §8.4 差异 | §8.4 通过 ActionToolbar 内"高级筛选"按钮触发;OT-STD-3 为始终可见面板 |
151
+
152
+ ---
153
+
154
+ ## 5. ActionToolbar 变体矩阵
155
+
156
+ | 变体 | 结构 | 典型页面 |
157
+ |------|------|----------|
158
+ | **A: Primary + Search + Select** | `[+创建] [SearchInput🔍] [Select▼]` | 上架CoWorker > 模型服务上架 |
159
+ | **B: Primary + Desc + Search(右)** | `[+新建] "说明文本..." [SearchInput🔍→右侧]` | 元数据管理 > Skills标签 |
160
+ | **C: Primary + Search + StatusToggle(右)** | `[+新建] [SearchInput🔍] ‖ [全部│成功│失败│进行中│终止│排队中]` | 评测任务 > 独立任务 |
161
+ | **D: Primary + Multi-filter** | `[回流评测集] [Select▼] [Select▼] [Input🔍] [DateRange📅]` | Trace追踪 |
162
+ | **E: Search-only** | `[SearchInput🔍]` | 评测集 > 内置评测集(只读) |
163
+ | **F: Primary + Search** | `[+新建] [SearchInput🔍]` | 评测集 > 空间评测集 |
164
+
165
+ ### 变体 B: 说明文本规范
166
+
167
+ - 位置:紧跟 Primary 按钮右侧,字体 `text-sm text-muted-foreground`
168
+ - 不可交互,仅作为页面用途说明
169
+ - Search 使用 `margin-left: auto` 推到右侧
170
+
171
+ ### 变体 C: StatusToggle 规范
172
+
173
+ - 组件:`components/toggle-group` → `ToggleGroup`(type='single') + `ToggleGroupItem`
174
+ - 位置:`.right-tools` 内,`margin-left: auto` 推到右侧
175
+ - 选中态:`variant='outline'`,选中项高亮(`bg-primary text-primary-foreground` 或底部指示线)
176
+ - 选项来源:业务状态枚举 + "全部"(默认选中)
177
+ - 交互:切换后立即筛选 DataTable,重置分页到第 1 页
178
+
179
+ ### 变体 D: 多筛选组合规范
180
+
181
+ - 筛选控件直接并排在 ActionToolbar 中(非独立 QueryPanel)
182
+ - 适用条件:筛选项 2-4 个且均为简单控件(Select/Input/DateRange)
183
+ - 间距:控件间 gap = 8px
184
+ - DateRangePicker:`components/date-picker` → `DateRangePicker`,格式 "YYYY-MM-DD"
185
+
186
+ ---
187
+
188
+ ## 6. 列数据类型规范
189
+
190
+ | 类型 ID | 显示形式 | 组件/样式 | 示例 |
191
+ |---------|----------|-----------|------|
192
+ | **text** | 普通文本 | `text-sm` | "数据处理"、"admin" |
193
+ | **bold-link** | 加粗可点击文本 | `font-medium text-primary cursor-pointer` | 通用问答评测集 |
194
+ | **mono-code** | 等宽字体 ID | `font-mono text-sm` | bK5nP7qR2t、tr_2026yiea2mqu |
195
+ | **subtitle** | 主文本 + 灰色副标题 | 主: `text-sm`; 副: `text-xs text-muted-foreground` | qwen3.6-plus ↵ 阿里云百炼 |
196
+ | **status-dot** | 圆点 + 状态文本 | `Badge`(variant='dot') 或自定义: `●` 8px + 文本 | ● 启用 |
197
+ | **status-badge** | 彩色圆角徽章 | `Tag`(variant='status', status='success/warning/info/default') | 成功(绿) / 进行中(蓝) / 排队中(灰) |
198
+ | **count-icon** | 数字+单位+信息图标 | `text-sm` + `Tooltip` 包裹的 ⓘ 图标 | 13个 ⓘ |
199
+ | **user-format** | 姓名 (username) | `text-sm`: "姓名" + `text-muted-foreground`: "(username)" | 张明 (zhangming) |
200
+ | **datetime** | 日期时间 | `text-sm tabular-nums` | 2024-08-05 10:00:00 |
201
+ | **json-preview** | JSON 内容截断 | `font-mono text-xs truncate max-w-[400px]` | {"message":{"text":"..."}} |
202
+ | **action-link** | 操作链接(蓝色) | `text-primary cursor-pointer text-sm` | 操作日志 / Span分析 |
203
+ | **destructive-link** | 危险操作链接(红色) | `text-destructive cursor-pointer text-sm` | 删除 |
204
+
205
+ ---
206
+
207
+ ## 7. 操作列模式
208
+
209
+ | 模式 | 操作项 | 适用场景 | 示例页面 |
210
+ |------|--------|----------|----------|
211
+ | **单操作-危险** | `删除`(red) | 仅删除权限 | 上架CoWorker > 模型服务 |
212
+ | **单操作-链接** | `操作日志`(blue) / `Span分析`(blue) | 审计/追踪类 | 操作记录 / Trace追踪 |
213
+ | **双操作** | `编辑` + `删除`(red) | 简单 CRUD | 元数据管理 > Skills标签 |
214
+ | **三操作** | `详情` + `编辑` + `删除`(red) | 完整 CRUD | 内置资产、空间评测集 |
215
+ | **三操作-状态** | `查看` + `编辑` + `停用`(blue) | 含状态切换 | 内置服务 > 模型接入 |
216
+ | **状态驱动** | 操作随行状态变化 | 异步任务管理 | 评测任务 |
217
+ | **只读** | `详情`(blue) | 内置/共享数据 | 内置评测集 |
218
+
219
+ ### 状态驱动操作矩阵(评测任务示例)
220
+
221
+ | 行状态 | 可用操作 | 说明 |
222
+ |--------|----------|------|
223
+ | 成功 | 详情 + 评测报告 + 删除(red) | 完成态,支持查看报告和清理 |
224
+ | 进行中 | 详情 + 终止 | 运行态,支持中断 |
225
+ | 排队中 | 详情 + 终止 | 等待态,支持取消 |
226
+ | 失败 | 详情 + 删除(red) | 异常态,支持查看和清理 |
227
+
228
+ ---
229
+
230
+ ## 8. 分页模式
231
+
232
+ | 模式 | 结构 | 适用场景 |
233
+ |------|------|----------|
234
+ | **标准分页** | `共 N 条 每页显示: [10▼] [‹] [1] [2] [3] [4] [5] [›]` | 数据量 ≤ 100 页 |
235
+ | **省略分页** | `共 N 条 每页显示: [10▼] [‹] [1] [2] ... [50] [›]` | 数据量 > 5 页,中间用省略号 |
236
+ | **隐藏分页** | 不显示 Pagination | 数据量 ≤ 1 页(默认每页条数) |
237
+
238
+ ### 省略规则
239
+
240
+ - 总页数 ≤ 7:全部显示,无省略
241
+ - 总页数 > 7:显示首页 + 当前页±1 + 末页,中间用 `...` 省略
242
+ - 省略号不可点击,仅作视觉占位
243
+
244
+ ---
245
+
246
+ ## 9. Checkbox 批量操作(评测任务模式)
247
+
248
+ | 规则 | 说明 |
249
+ |------|------|
250
+ | 触发 | DataTable 首列为 Checkbox 列 |
251
+ | 表头 Checkbox | 三态:未选(空) / 半选(横线) / 全选(勾选) |
252
+ | 行 Checkbox | 二态:未选 / 选中 |
253
+ | 选中行高亮 | `bg-muted/50` 背景 |
254
+ | 适用模式 | 仅 OT-STD-1 且有批量操作需求时启用 |
255
+
256
+ > 批量操作栏行为详见 [standard-list.md](./standard-list.md) §5。
257
+
258
+ ---
259
+
260
+ ## 10. 页面级组件清单
261
+
262
+ | 区域 | UI 组件库引用 | 用途 |
263
+ |------|--------------|------|
264
+ | 页面框架 | `components/page-shell` → `PageShell` | L1 级页面壳 |
265
+ | 侧边导航 | `components/sidebar` → `Sidebar` + `SidebarContent` + `SidebarMenu` | 左侧导航 |
266
+ | 白卡容器 | `components/card` → `Card` + `CardContent` | 内容区白色容器 |
267
+ | 页面标题 | `components/page-header` → `PageHeader` + `PageHeaderHeading` | 标题 18px/500 |
268
+ | Tab 切换 | `components/tabs` → `Tabs` + `TabsList`(variant='line') + `TabsTrigger` + `TabsContent` | 子视图切换 |
269
+ | 主操作按钮 | `components/button` → `Button`(variant='default', color='primary') | "+ 新建XXX" |
270
+ | 搜索输入 | `components/input` → `Input` | 搜索框 |
271
+ | 下拉筛选 | `components/select` → `Select` + `SelectTrigger` + `SelectContent` + `SelectItem` | 下拉选择 |
272
+ | 状态筛选 | `components/toggle-group` → `ToggleGroup`(type='single') + `ToggleGroupItem` | 状态切换筛选 |
273
+ | 日期范围 | `components/date-picker` → `DateRangePicker` | 日期区间筛选 |
274
+ | 数据表格 | `components/data-table` → `DataTable` | 数据展示 |
275
+ | 复选框 | `components/checkbox` → `Checkbox` | 行选择/批量操作 |
276
+ | 分页 | `components/pagination` → `Pagination` + `PaginationContent` + `PaginationItem` | 底部分页 |
277
+ | 状态标签 | `components/tag` → `Tag`(variant='status') | 状态展示 |
278
+ | 状态徽章 | `components/badge` → `Badge` | 状态圆点 |
279
+ | 提示 | `components/tooltip` → `Tooltip` + `TooltipTrigger` + `TooltipContent` | 列标题 ⓘ 说明 |
280
+ | 确认弹窗 | `components/alert-dialog` → `AlertDialog` | 删除确认 |
281
+ | 提示消息 | `components/sonner` → `toast` | 操作反馈 |
282
+
283
+ ---
284
+
285
+ ## 11. 页面映射表(截图 → 模式)
286
+
287
+ | 页面名称 | 模式 | Toolbar 变体 | 操作列模式 | 特殊列类型 |
288
+ |----------|------|-------------|-----------|-----------|
289
+ | 上架CoWorker > 模型服务上架 | OT-STD-1 | A | 单操作-危险 | subtitle |
290
+ | 元数据管理 > Skills标签 | OT-STD-1 | B | 双操作 | count-icon |
291
+ | 内置服务 > 模型接入 | OT-STD-3 | QueryPanel | 三操作-状态 | status-dot |
292
+ | 内置资产 > 内置评测集 | OT-STD-1 | F | 三操作 | bold-link, mono-code |
293
+ | 操作记录 | OT-STD-2 | D(简化) | 单操作-链接 | user-format |
294
+ | Trace追踪 | OT-STD-2 | D | 单操作-链接 | mono-code, json-preview |
295
+ | 评测任务 > 独立任务 | OT-STD-1 | C | 状态驱动 | status-badge, checkbox |
296
+ | 评测集 > 内置评测集 | OT-STD-1 | E | 只读 | bold-link |
297
+ | 评测集 > 空间评测集 | OT-STD-1 | F | 三操作 | bold-link |
298
+
299
+ ---
300
+
301
+ ## 12. 验证清单
302
+
303
+ | 验证项 | 检查点 | 目标 |
304
+ |--------|--------|------|
305
+ | 模式匹配 | 页面结构与模式 ID(OT-STD-1/2/3)一致 | 100% |
306
+ | Tab variant | 使用 `variant='line'`,非 default | 正确 |
307
+ | Tab 切换 | 切换时重置 DataTable + 分页 | 正确 |
308
+ | 只读 Tab | 内置数据 Tab 无创建按钮,操作列仅"详情" | 正确 |
309
+ | Toolbar 变体 | 变体结构与矩阵匹配(§5) | 正确 |
310
+ | StatusToggle | ToggleGroup(type='single'),选中即筛选 | 正确 |
311
+ | QueryPanel | 折叠/展开正常,查询/重置功能完整 | 正确 |
312
+ | 列数据类型 | 列渲染方式与类型规范(§6)一致 | 正确 |
313
+ | 操作列模式 | 操作项与模式矩阵(§7)匹配 | 正确 |
314
+ | 状态驱动操作 | 不同行状态显示不同操作项 | 正确 |
315
+ | 分页省略 | 总页数 > 7 时正确使用省略号 | 正确 |
316
+ | 组件引用 | 所有组件从 `packages/ui/src/components/` 导入 | 100% |
317
+ | 危险操作样式 | "删除"链接使用 `text-destructive` | 正确 |
318
+ | 说明文本 | 变体 B 的说明文本使用 `text-muted-foreground` | 正确 |
@@ -2,25 +2,18 @@
2
2
 
3
3
  > ⚠️ **Prerequisites**: 你必须已在 [generation-flow.md](../generation-flow.md) Step 2 确认页面类型为 **Dashboard**,并由 Step 3 引导到这里。
4
4
 
5
- > AI 实操路径:Step 2(页面类型识别)判定为 Dashboard 后,本文档接管。生成频次低于 ListPage / FormPage / DetailPage,当前为最小规范,后续按 list-page.md / form-page.md 体例扩充。
5
+ > **完整规范已迁移**:本文件为索引概览,完整生成规范见 [`../pages/dashboard-page/SKILL.md`](../pages/dashboard-page/SKILL.md)。
6
+ > OpenTrek 业务规则见 [`../pages/dashboard-page/patterns/dashboard-opentrek.md`](../pages/dashboard-page/patterns/dashboard-opentrek.md)。
6
7
 
7
8
  ---
8
9
 
9
- ## 1. 标准结构
10
-
11
- ```text
12
- ┌────────────────────────────────────────────┐
13
- PageHeader: 概览 [今日 ▼] [刷新] │
14
- ├────────────────────────────────────────────┤
15
- ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
16
- │ │订单数│ │待办数│ │成交额│ │完成率│ ← StatCards
17
- │ │ 1024 │ │ 3 │ │¥12.3K│ │ 68% │ │
18
- │ └──────┘ └──────┘ └──────┘ └──────┘ │
19
- ├────────────────────────────────────────────┤
20
- │ 业务趋势 最近异常 │
21
- │ [Chart 折线图] [Timeline] │
22
- └────────────────────────────────────────────┘
23
- ```
10
+ ## 1. 子类型速查
11
+
12
+ | 子类型ID | 识别关键词 | 核心组件 |
13
+ |----------|-----------|----------|
14
+ | overview | "概览"/"总览"/"监控首页"/"仪表板"/"指标监控" | TimeToolbar + StatCardRow + ChartPanel(multi) |
15
+ | metric-detail | "观测"/"明细指标"/"性能监控" | Breadcrumb + FilterBar + ChartGrid |
16
+ | realtime | "实时"/"实时监控" | TimeToolbar + LiveChart + AlertTimeline |
24
17
 
25
18
  ---
26
19
 
@@ -508,7 +508,33 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
508
508
 
509
509
  #### Phase A · 信息收集
510
510
 
511
- 1. **询问旧项目路径**向用户索取旧项目的**绝对路径**(`<old-path>`)。可选附加:旧项目运行后的可访问 URL(用于后续截图 / 功能比对)。
511
+ 1. **询问三轨材料**一次性向用户索取迁移所需的三轨材料:
512
+
513
+ a. **旧项目源码路径** — 旧项目的**绝对路径**(`<old-path>`)
514
+ b. **Repo-wiki** — 旧项目的 repo-wiki(路径或确认已生成)
515
+ c. **页面截图目录** — 用户预先准备的页面截图目录路径
516
+
517
+ 向用户提示截图准备建议话术:
518
+
519
+ > "请使用默认浏览器访问待迁移项目 URL,对所有页面以及页面的弹窗、抽屉进行截图,按页面路由为文件夹名字落地,并提供该截图位置目录。"
520
+
521
+ 截图目录结构建议(用户通过 Qoder 工作区截图存放):
522
+
523
+ ```
524
+ <screenshots-dir>/
525
+ ├── home/
526
+ │ ├── default.png
527
+ │ └── dialog-create.png
528
+ ├── list/
529
+ │ ├── default.png
530
+ │ ├── drawer-detail.png
531
+ │ └── dialog-delete.png
532
+ └── settings/
533
+ └── default.png
534
+ ```
535
+
536
+ > ⚠️ **AI 不执行截图操作**。截图由用户在 Qoder 工作区自行完成并提供目录路径。AI 仅使用用户提供的截图作为视觉参考。
537
+
512
538
  2. **检测 repo-wiki** — 检查 `<old-path>/.qoder/repowiki/` 是否存在且非空:
513
539
  - 存在 → 进入步骤 3。
514
540
  - 不存在 → 告知用户:"旧项目尚未生成 repo-wiki,请先在旧项目目录使用 Qoder 生成 repo-wiki,完成后告诉我。"等待用户确认后重检。
@@ -523,11 +549,14 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
523
549
 
524
550
  > 不一次性读完全部内容(token 预算有限)。先读概览 + 路由,后续按需深入。
525
551
 
526
- 4. **补充读取**(若 repo-wiki 不完整)— 直接读旧项目的:
552
+ 4. **检测截图目录** 检查用户提供的截图目录是否存在且非空:
553
+ - 存在且含截图 → 记录路径,进入步骤 5。
554
+ - 不存在或为空 → 告知用户截图目录不可用,请先按建议完成截图后再继续。
555
+ 5. **补充读取**(若 repo-wiki 不完整)— 直接读旧项目的:
527
556
  - `package.json`(依赖 / scripts)
528
557
  - 路由配置文件(`src/routes/`、`src/router/`、`pages/` 目录等)
529
558
  - 目录结构(`ls src/`)
530
- 5. **识别旧项目技术栈** — 从依赖和代码判断,记录以下维度:
559
+ 6. **识别旧项目技术栈** — 从依赖和代码判断,记录以下维度:
531
560
  - UI 框架(antd / element-ui / arco-design / mui / naive-ui / 自研)
532
561
  - 路由方案(react-router / vue-router / next.js / umi)
533
562
  - 状态管理(redux / mobx / zustand / pinia / vuex)
@@ -545,27 +574,27 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
545
574
 
546
575
  1. **Token 映射查表** — 每迁移一个页面前,必须先读取 `.teamix-evo/migrate-token-mapping.md`,所有旧项目 CSS 变量按实际像素值映射为新项目 Tailwind class。禁止根据变量名称“猜测”对应关系。
547
576
  2. **skill 门控** — 写代码前必须已加载 `teamix-evo-manage`、`teamix-evo-code-{variant}`、`teamix-evo-design-{variant}` 三个 skill(路径见关键文件索引)。
548
- 3. **三轨齐备** — 进入任何页面实现前必须 wiki + 源码 + 截图全部就绪。
577
+ 3. **三轨齐备** — 进入任何页面实现前必须源码 + repo-wiki + 截图全部确认就绪(截图由用户预先准备,AI 只做确认)。
549
578
  4. **Token 合法性自检** — 写完代码后扫描所有 Tailwind class,确认在新项目有效。
550
579
  5. **新架构骨架层检查** — 迁移不仅是“翻译旧代码”,还必须“适配新架构的标准模式”。新架构有一套完整的页面骨架层级(`PageShell → OpPageContainer → PageHeader → 内容`),这些组件在旧项目中完全不存在(旧项目用自定义 `<h1>`、内联样式或散落 CSS 实现),三轨对照不会发现它们。必须主动查阅 design skill 和 biz-ui 组件的 JSDoc 获取标准骨架用法:
551
580
  - **Layout 层**:检查 `src/components/biz-ui/` 是否存在页面容器组件(如 `OpPageContainer`),在 `<Outlet />` 外统一包裹,使所有页面自动获得容器效果
552
581
  - **每页面层**:检查容器组件的 JSDoc / 源码中是否定义了标配的子组件模式(如 `header={<PageHeader>...</PageHeader>}` 是每页标配),必须按规范使用而非省略
553
582
 
554
- ## ❄️ 冷启动恢复指南(上下文丢失 / 新会话接手时执行)
583
+ # ❄️ 冷启动恢复指南(上下文丢失 / 新会话接手时执行)
555
584
 
556
- 如果你是一个新会话被要求“继续迁移”,按以下顺序恢复上下文:
585
+ 如果你是一个新会话被要求"继续迁移",按以下顺序恢复上下文:
557
586
 
558
587
  1. 读取本文件 `.teamix-evo/migrate-plan.md` — 获取进度、元数据、执行规则
559
588
  2. 读取 `.teamix-evo/migrate-token-mapping.md` — 加载 token 映射表
560
589
  3. 加载三个 skill(路径见下方「关键文件索引」):
561
- - **Manage skill** — 包含完整的迁移执行协议(三轨采集流程、逐条实现步骤、验证流程)
590
+ - **Manage skill** — 包含完整的迁移执行协议(三轨确认流程、逐条实现步骤、验证流程)
562
591
  - **Code skill** — 代码规范门控(reuse-first / file-structure / api-layering)
563
592
  - **Design skill** — 设计/布局规范(视觉还原、栅格、组件组合)
564
593
  4. 查看 Progress 区块 — 找到 **Current phase** 所指的 Phase,在该 Phase 中定位第一个未完成的 `[ ]` 条目(不要回头处理更早 Phase 中被 pilot 模式有意推迟的条目)
565
- 5. 执行三轨采集对当前页面补全 wiki + 源码 + 截图
594
+ 5. 确认三轨材料对当前页面确认源码 + repo-wiki + 截图三轨就绪(截图目录见 Metadata → Screenshots dir)
566
595
  6. 开始实现 — 从第一个未完成条目继续
567
596
 
568
- > 注:若不确定旧项目是否仍在运行,先尝试访问 Source URL。超时则降级为两轨模式并标注。
597
+ > 注:截图由用户预先准备完成,AI 无需执行截图操作。若截图目录中缺少当前页面截图,暂停并请用户补充。
569
598
 
570
599
  ## 关键文件索引
571
600
 
@@ -573,7 +602,7 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
573
602
  | ------------ | --------------------------------------------------------- | ------------------------------ |
574
603
  | 迁移计划 | `.teamix-evo/migrate-plan.md` | 进度跟踪 + 执行规则(本文件) |
575
604
  | Token 映射表 | `.teamix-evo/migrate-token-mapping.md` | CSS 变量 → Tailwind class 映射 |
576
- | 截图目录 | `.teamix-evo/migrate-screenshots/` | 每页截图参考 |
605
+ | 截图目录 | 见 Metadata → Screenshots dir | 用户提供的页面截图目录 |
577
606
  | Manage skill | `.teamix-evo/skills/teamix-evo-manage/SKILL.md` | 迁移执行协议(场景 6) |
578
607
  | Code skill | `.teamix-evo/skills/teamix-evo-code-{variant}/SKILL.md` | 代码规范门控 |
579
608
  | Design skill | `.teamix-evo/skills/teamix-evo-design-{variant}/SKILL.md` | 设计/布局规范 |
@@ -598,7 +627,7 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
598
627
  - **Target variant**: <当前项目 variant>
599
628
  - **Generated**: <ISO 时间戳>
600
629
  - **Old stack**: <框架> + <UI 库> + <路由> + <HTTP 客户端> + <状态管理>
601
- - **Source URL**: <用户提供的运行地址,可选>
630
+ - **Screenshots dir**: <用户提供的截图目录绝对路径>
602
631
 
603
632
  ## Component Mapping (AI via MCP find_components 动态生成)
604
633
 
@@ -611,7 +640,7 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
611
640
  - [ ] **清理脚手架示例页面** — 删除 `create-teamix-evo` 生成的 demo 页面(`src/pages/home/`、`src/pages/list/`、`src/pages/detail/`、`src/pages/form/` 等)及关联的 services / hooks / types / routes 条目
612
641
  [ ] **Layout(吸顶 + 左导 + 页面容器)** — ❗ 优先级最高。全局壳重构:吸顶 Header、左侧边栏 Sidebar、面包屑、内容区布局。先保证通用性内容正确,再进入具体页面。
613
642
 
614
- > Layout 也需要截图参考:使用 Source URL 对旧项目的吸顶和左导截图,存入 `.teamix-evo/migrate-screenshots/layout/`(`header.png` + `sidebar.png`),作为视觉还原参考。
643
+ > Layout 也需要截图参考:确认用户截图目录中 `layout/` 文件夹是否包含吸顶和左导截图(`header.png` + `sidebar.png`),作为视觉还原参考。若缺失,提示用户补充。
615
644
 
616
645
  > ⚠️ **新架构骨架层检查**:新架构的页面骨架是 `PageShell → OpPageContainer → PageHeader → 内容`,旧项目不会有这些抽象。必须主动检查 biz-ui 组件源码和 JSDoc 获取标准用法:
617
646
  >
@@ -700,15 +729,15 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
700
729
  #### Phase C · 执行
701
730
 
702
731
  9. **读取当前进度** — 读 `.teamix-evo/migrate-plan.md` 顶部 Progress 区块。若 Status 为 `done` → 告知用户迁移已全部完成。否则找到第一个未完成(`[ ]`)的条目。
703
- 10. **三轨采集(每页开发前必做)**进入一个页面的开发前,必须先收集三轨信息:
704
- a. **Wiki 轨**:读旧项目 repo-wiki 中该页面相关的描述(功能说明、业务规则、数据流)
705
- b. **源码轨**:读旧项目该页面的全部源文件(页面组件 + 子组件 + 页面内弹窗 Dialog / 抽屉 Drawer / 确认框等)
706
- c. **截图轨**:检查 `.teamix-evo/migrate-screenshots/<page-name>/` 是否已有该页面截图。
732
+ 10. **三轨确认(每页开发前必做)**进入一个页面的开发前,必须确认三轨材料均已就绪:
733
+ a. **源码轨**:读旧项目该页面的全部源文件(页面组件 + 子组件 + 页面内弹窗 Dialog / 抽屉 Drawer / 确认框等)
734
+ b. **Wiki 轨**:读旧项目 repo-wiki 中该页面相关的描述(功能说明、业务规则、数据流)
735
+ c. **截图轨**:检查用户提供的截图目录中 `<screenshots-dir>/<page-route>/` 是否已有该页面截图。
707
736
 
708
737
  - **已有截图** → 直接读取作为视觉参考。
709
- - **无截图**使用 Phase A 中用户提供的 Source URL,通过浏览器访问该页面并截图存入固定路径。
738
+ - **截图缺失**暂停并告知用户:"<页面名> 缺少截图,请补充后告诉我。"等待用户补充后继续。
710
739
 
711
- **截图存放约定**:所有截图存放在 `.teamix-evo/migrate-screenshots/<page-name>/` 目录下,文件名约定:
740
+ **截图存放约定**:用户在 Qoder 工作区预先准备,按页面路由为文件夹名,存放在用户提供的截图目录下。文件名约定:
712
741
 
713
742
  - `default.png` — 页面默认态
714
743
  - `dialog-<名称>.png` — 弹窗打开态
@@ -722,11 +751,11 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
722
751
  - 页面内所有抽屉(Drawer / Sheet)的打开态
723
752
  - 关键交互状态(空态 / 加载态 / 错误态,若能触发)
724
753
 
725
- > **为什么固定路径**:因为迁移工作通常跨多个会话。截图存在固定位置,新会话可直接读取作为视觉参考,无需再次启动旧项目截图。
754
+ > **AI 不执行截图**:截图由用户在迁移开始前通过 Qoder 工作区一次性完成(访问旧项目所有页面、弹窗、抽屉截图),迁移过程中 AI 仅读取已有截图作为视觉参考。
726
755
 
727
- > ⚠️ **硬约束:三轨齐备方可动手。** AI 必须在 wiki、源码、截图三轨全部采集完成后,才能开始该页面的实现。**AI 不得自行跳过截图轨**——只有用户明确要求「跳过截图」或旧项目确实无法访问(超时 / 报错)时,才可降级为两轨模式,并标注"⚠️ 无截图参考,视觉还原需用户人工校对"。
756
+ > ⚠️ **硬约束:三轨齐备方可动手。** AI 必须在源码、wiki、截图三轨全部确认就绪后,才能开始该页面的实现。**AI 不得自行跳过截图轨**——只有用户明确要求「跳过截图」时,才可降级为两轨模式,并标注"⚠️ 无截图参考,视觉还原需用户人工校对"。
728
757
 
729
- 三轨齐备后,向用户确认:"已采集完 <页面名> wiki、源码、截图,开始实现?"用户确认后才动手。
758
+ 三轨确认后,向用户确认:"<页面名> 的源码、repo-wiki、截图三轨已确认就绪,开始实现?"用户确认后才动手。
730
759
 
731
760
  11. **逐条实现** — 对每个 checklist 条目:
732
761
  a. 通过 MCP `find_components` / `get_component_meta` 查询可用组件
@@ -756,8 +785,8 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
756
785
  - review 全部通过后,将 Status 更新为 `done`
757
786
  14. **会话恢复** — 若 AI 进入新会话:
758
787
  - 读 `.teamix-evo/migrate-plan.md` — 文件顶部包含「冷启动恢复指南」,按其 6 步顺序恢复上下文
759
- - `.teamix-evo/migrate-screenshots/` 目录,确认已有哪些页面的截图可作为视觉参考
760
- - `in-progress` → 定位第一个 `[ ]` 条目,从断点处继续;若当前页面已有截图,直接读取作为参考,无需重新截图
788
+ - 读截图目录(Metadata Screenshots dir),确认已有哪些页面的截图可作为视觉参考
789
+ - `in-progress` → 定位第一个 `[ ]` 条目,确认三轨材料(源码 + wiki + 截图)就绪后从断点处继续
761
790
  - `review` → 进入 Phase D review 流程
762
791
  - `done` → 告知用户迁移已完成
763
792
 
@@ -774,6 +803,7 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
774
803
  | 情况 | 处理 |
775
804
  | ------------------------------------ | ------------------------------------------------------------------------------ |
776
805
  | repo-wiki 不存在 | 提示用户先在旧项目执行 repo-wiki 生成命令 |
806
+ | 截图目录为空或缺少页面截图 | 暂停并提示用户补充截图,不得跳过或自行执行截图 |
777
807
  | repo-wiki 不完整(缺路由/API 等) | 直接读旧项目源码补充(路由配置 / package.json / 目录结构) |
778
808
  | 旧项目是 Vue / Angular(非 React) | 正常分析,概念映射无框架壁垒(路由 → 路由、组件 → 组件),新项目统一生成 React |
779
809
  | 旧项目是 monorepo | 让用户指定具体 package 路径作为 `<old-path>` |
@@ -1,60 +0,0 @@
1
- # 操作列规范
2
-
3
- > 适用于 standard-list, l2-sidebar-list, expandable-list, drawer-list 子类型。
4
-
5
- ## 操作列结构
6
-
7
- 操作列包含 3 个主要操作 + 1 个"更多"入口, 以分隔线区分:
8
-
9
- | 元素 | 样式 | 条件 | 禁用样式 |
10
- |------|------|------|---------|
11
- | 主操作(管理/查看) | 链接样式 | 始终可用 | — |
12
- | 分隔线 | \| | — | — |
13
- | 次要操作(远程连接等) | 文字按钮 | 特定状态时 disabled | `opacity: 0.45; pointer-events: none` |
14
- | 分隔线 | \| | — | — |
15
- | 状态操作(实例状态▾) | 下拉按钮 | 特定状态时 disabled | `opacity: 0.45; pointer-events: none` |
16
- | 分隔线 | \| | — | — |
17
- | 更多操作 | "..."下拉菜单 | 始终可用 | — |
18
-
19
- ## 操作列行为
20
-
21
- | 操作 | 触发方式 | 前置条件 | 二次确认 | 目标页面/组件 | 返回行为 |
22
- |------|----------|---------|---------|-------------|----------|
23
- | 查看/管理 | 点击链接 | 无 | 否 | DetailPage (引用 pages/detail-page/) | 返回列表页, 保持筛选+分页状态 |
24
- | 编辑 | 点击按钮 | 无 | 否 | FormPage (引用 pages/form-page/) 或 Sheet | 保存成功后返回列表页, Sonner "保存成功" |
25
- | 删除 | 点击按钮 | 实例已停止 | 是 (Dialog确认) | Dialog确认弹窗 | 确认后刷新列表, Sonner "删除成功" |
26
- | 更多 | Dropdown | 无 | 否 | 下拉菜单 | 选择操作 |
27
-
28
- ## 禁用样式
29
-
30
- 所有 disabled 元素统一样式:
31
- ```css
32
- opacity: 0.45;
33
- pointer-events: none;
34
- ```
35
-
36
- ## 水平对齐【硬约束】
37
-
38
- 操作列位于表格末列,**表头与表体均需显式 `text-align: left`**,使「操作」标题与操作列左侧第一个字段(如「详情」链接)左边缘对齐:
39
-
40
- ```css
41
- .data-table .col-action {
42
- width: 140px;
43
- text-align: left;
44
- position: sticky; right: 0;
45
- background: hsl(var(--card));
46
- }
47
- /* 显式兑底,避免浏览器默认样式覆盖 */
48
- .data-table thead th.col-action { background: hsl(var(--gray-bg)); text-align: left; }
49
- .data-table tbody td.col-action { text-align: left; }
50
- ```
51
-
52
- ### 禁止项
53
-
54
- - ❌ 禁止只在 `.col-action` 上设 `text-align: left` 而不在 `thead th.col-action` / `tbody td.col-action` 重复声明(部分浏览器下会被覆盖)
55
- - ❌ 禁止表头「操作」与表体操作内容对齐方式不一致
56
- - ❌ 禁止操作列内容居中
57
-
58
- ### 验证
59
-
60
- 表头「操作」左边缘 X = 表体「详情」链接左边缘 X。
@@ -1,51 +0,0 @@
1
- # 状态-操作模式规范
2
-
3
- > 适用于所有产品线的列表页。
4
- > 本产品特有状态机定义见 `products/{产品}/states.json`。
5
-
6
- ## 元规则
7
-
8
- | 规则 | 说明 |
9
- |------|------|
10
- | 每个状态必须定义操作可用性 | 明确标注每个操作在该状态下是否可用 |
11
- | 禁用操作必须使用统一样式 | `opacity: 0.45; pointer-events: none` |
12
- | 混合状态时批量操作按钮禁用 | 不同状态的行选中时,hover 提示不可用原因 |
13
- | 异步操作必须提供反馈 | Sonner 提示 + 列表刷新机制 |
14
- | 操作确认按影响级别分级 | 一级(可逆直接执行) / 二级(影响状态Dialog确认) / 三级(不可逆输入确认) |
15
-
16
- ## 异步操作处理(通用)
17
-
18
- | 操作类型 | 触发后行为 | 反馈方式 | 列表刷新 |
19
- |---------|-----------|---------|---------|
20
- | 状态变更操作 | 异步任务, 不阻塞 | Sonner "操作已提交" | 轮询状态或任务完成通知 |
21
- | 删除操作 | 异步任务 | Sonner "删除已提交" | 移除对应行或刷新列表 |
22
- | 批量操作 | 异步任务 | Sonner "批量操作已提交, 共N条" | 轮询状态 |
23
- | 创建操作 | 同步跳转 | 跳转 FormPage | 创建成功后返回列表 |
24
-
25
- ## 操作确认规范(通用)
26
-
27
- | 确认级别 | 确认方式 | 适用操作 |
28
- |---------|---------|---------|
29
- | 一级 (可逆) | 无确认, 直接执行 | 查看、编辑、远程连接 |
30
- | 二级 (影响状态) | Dialog确认弹窗 | 启动、停止、重启等状态变更 |
31
- | 三级 (不可逆) | Dialog + 输入确认文本 | 删除 (需输入确认文本) |
32
-
33
- ## 页面间导航交互(通用)
34
-
35
- | 来源操作 | 目标页面 | 导航方式 | 返回/交互约定 |
36
- |---------|---------|---------|-------------|
37
- | 操作列"管理/查看" | 详情页 (DetailPage) | 页面跳转 | Breadcrumb+PageHeader提供返回入口; 返回后保持列表筛选+分页 |
38
- | 操作列"编辑" | 表单页 (FormPage) 或 Sheet | 页面跳转/侧滑 | 保存后返回列表, Sonner 提示结果; 取消返回列表 |
39
- | 创建操作 | 创建页 (FormPage) | 页面跳转 | 创建成功/取消后返回列表 |
40
- | 搜索执行 | 当前列表页(刷新数据) | 数据刷新 | 保持分页在第1页 |
41
- | 筛选条件变更 | 当前列表页(刷新数据) | 数据刷新 | 重置到第1页, 保持筛选条件 |
42
-
43
- ## 反馈机制(通用)
44
-
45
- | 场景 | 反馈类型 | 持续时间 | 说明 |
46
- |------|---------|---------|------|
47
- | 操作成功 | Sonner 成功提示 | 3s | "操作成功" |
48
- | 操作失败 | Sonner 错误提示 | 5s | 含错误原因 |
49
- | 异步任务 | 通知中心 + Sonner | 持久 | 任务完成时通知 |
50
- | 加载中 | 表格行 Skeleton / Spinner | 至加载完成 | 首次加载/筛选加载 |
51
- | 空数据 | Empty | 持久 | 含创建引导按钮 |