@teamix-evo/skills 0.12.0 → 0.13.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 +1 -1
- package/manifest.json +11 -28
- package/package.json +2 -2
- package/src/teamix-evo-code-opentrek/SKILL.md +13 -13
- package/src/teamix-evo-code-opentrek/api-layering.md +53 -44
- package/src/teamix-evo-code-opentrek/checklist.md +24 -24
- package/src/teamix-evo-code-opentrek/file-structure.md +55 -36
- package/src/teamix-evo-code-opentrek/forms-and-validation.md +17 -16
- package/src/teamix-evo-code-opentrek/reuse-first.md +6 -9
- package/src/teamix-evo-code-opentrek/testing.md +14 -14
- package/src/teamix-evo-code-uni-manager/SKILL.md +15 -15
- package/src/teamix-evo-code-uni-manager/api-layering.md +74 -58
- package/src/teamix-evo-code-uni-manager/checklist.md +28 -28
- package/src/teamix-evo-code-uni-manager/error-and-loading.md +2 -2
- package/src/teamix-evo-code-uni-manager/file-structure.md +77 -62
- package/src/teamix-evo-code-uni-manager/forms-and-validation.md +17 -15
- package/src/teamix-evo-code-uni-manager/reuse-first.md +7 -10
- package/src/teamix-evo-code-uni-manager/routing-and-codesplit.md +1 -1
- package/src/teamix-evo-code-uni-manager/testing.md +37 -37
- package/src/teamix-evo-design-opentrek/SKILL.md +41 -20
- package/src/teamix-evo-design-opentrek/boundaries.md +1 -1
- package/src/teamix-evo-design-opentrek/checklist.md +5 -5
- package/src/teamix-evo-design-opentrek/components.md +19 -19
- package/src/teamix-evo-design-opentrek/examples/standard-card-list.html +1 -1
- package/src/teamix-evo-design-opentrek/examples/standard-table-list.html +1 -1
- package/src/teamix-evo-design-opentrek/foundations.md +17 -17
- package/src/teamix-evo-design-opentrek/pages/dashboard-page/SKILL.md +18 -19
- package/src/teamix-evo-design-opentrek/pages/dashboard-page/patterns/dashboard-opentrek.md +6 -6
- package/src/teamix-evo-design-opentrek/pages/detail-page/SKILL.md +24 -25
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/api-doc-detail.md +3 -7
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/comparison-detail.md +3 -7
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/monitor-detail.md +3 -7
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/resource-detail.md +10 -10
- package/src/teamix-evo-design-opentrek/pages/form-page/SKILL.md +26 -27
- package/src/teamix-evo-design-opentrek/pages/list-page/SKILL.md +35 -36
- package/src/teamix-evo-design-opentrek/pages/list-page/_shared/item-card-spec.md +41 -32
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/card-list-opentrek.md +10 -10
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/card-list.md +23 -23
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/standard-list-opentrek.md +8 -8
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/standard-list.md +8 -8
- package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +2 -2
- package/src/teamix-evo-design-opentrek/patterns/dashboard.md +1 -1
- package/src/teamix-evo-design-opentrek/patterns/detail-page.md +9 -9
- package/src/teamix-evo-design-opentrek/patterns/form-page.md +6 -6
- package/src/teamix-evo-design-opentrek/patterns/list-page.md +9 -9
- package/src/teamix-evo-design-opentrek/patterns/page-types.md +3 -3
- package/src/teamix-evo-design-opentrek/principles.md +541 -0
- package/src/teamix-evo-design-opentrek/rules/common-components.json +206 -76
- package/src/teamix-evo-design-opentrek/rules/component-specs.json +2 -2
- package/src/teamix-evo-design-opentrek/rules/design-tokens.css +223 -218
- package/src/teamix-evo-design-opentrek/rules/design-tokens.json +10 -32
- package/src/teamix-evo-design-opentrek/rules/page-frame.json +197 -193
- package/src/teamix-evo-design-opentrek/{generation-flow.md → workflow.md} +141 -22
- package/src/teamix-evo-design-uni-manager/SKILL.md +30 -6
- package/src/teamix-evo-design-uni-manager/boundaries.md +2 -2
- package/src/teamix-evo-design-uni-manager/brand.md +1 -1
- package/src/teamix-evo-design-uni-manager/checklist.md +2 -2
- package/src/teamix-evo-design-uni-manager/components.md +11 -11
- package/src/teamix-evo-design-uni-manager/foundations.md +7 -7
- package/src/teamix-evo-design-uni-manager/generation-flow.md +3 -3
- package/src/teamix-evo-manage/SKILL.md +111 -709
- package/src/teamix-evo-manage/init.md +98 -0
- package/src/teamix-evo-manage/migrate.md +100 -0
- package/src/teamix-evo-manage/rearchitect-capture-guide.md +174 -0
- package/src/teamix-evo-manage/rearchitect.md +373 -0
- package/src/teamix-evo-manage/update-component-staging.md +188 -0
- package/src/teamix-evo-manage/update-token-rename.md +126 -0
- package/src/teamix-evo-manage/update-token-treatment.md +116 -0
- package/src/teamix-evo-manage/update.md +213 -0
- package/src/teamix-evo-design-opentrek/brand.md +0 -154
- package/src/teamix-evo-design-opentrek/pages/list-page/_shared/search-combo-spec.md +0 -194
- package/src/teamix-evo-design-opentrek/philosophy.md +0 -98
- package/src/teamix-evo-design-opentrek/rules/README.md +0 -39
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_AGENT RUNTIME.svg +0 -1
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI GATEWAY.svg +0 -1
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI STUDIO.svg +0 -1
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_DEV-2.svg +0 -1
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_LOGO.svg +0 -1
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_OPS.svg +0 -1
- package/src/teamix-evo-design-opentrek/rules/layout-rules.json +0 -218
- package/src/teamix-evo-design-opentrek/rules/page-header-spec.md +0 -123
- package/src/teamix-evo-design-opentrek/rules/sidebar-spec.md +0 -217
- package/src/teamix-evo-upgrade/SKILL.md +0 -431
- /package/src/teamix-evo-design-opentrek/{rules/boundaries.rules.json → boundaries.json} +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Init (初始化 Teamix Evo 套件)
|
|
2
|
+
|
|
3
|
+
> **前置条件**:空目录(或仅含 `.git`、`.gitignore`、`.vscode` 等可忽略文件)。
|
|
4
|
+
> 含 `package.json` 或其他项目文件的目录视为非空,会被 `assertCommandPrecondition` 拒绝并建议正确命令(`npm init -y` 过的目录需加 `--force`)。
|
|
5
|
+
|
|
6
|
+
单一命令完成从空目录到可运行工程的全流程:**脚手架生成 → 套件 init pipeline**。
|
|
7
|
+
|
|
8
|
+
## 触发
|
|
9
|
+
|
|
10
|
+
用户说"初始化一个项目 / 工程 / 新建项目"等意图。
|
|
11
|
+
|
|
12
|
+
## 步骤
|
|
13
|
+
|
|
14
|
+
### 1. 确定 variant
|
|
15
|
+
|
|
16
|
+
若用户未指明 variant,列出可选项让用户选(`AskUserQuestion`):
|
|
17
|
+
|
|
18
|
+
- **OpenTrek**(`opentrek`):AI 副驾驶 / 通用中后台
|
|
19
|
+
- **Uni-Manager**(`uni-manager`):云资源管理(大屏 / 拓扑 / 7 类 AI 场景)
|
|
20
|
+
|
|
21
|
+
### 2. 确定目录
|
|
22
|
+
|
|
23
|
+
- 用户指定了项目名 → `./<project-name>`
|
|
24
|
+
- 用户说"当前目录" → `.`(需确认当前为空目录)
|
|
25
|
+
- 未明确 → 询问用户
|
|
26
|
+
|
|
27
|
+
### 3. 执行初始化
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx teamix-evo@latest init --variant <name> -y
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**一条命令完成所有工作**,流程分两个阶段:
|
|
34
|
+
|
|
35
|
+
#### 阶段 A:脚手架生成(空目录时自动触发)
|
|
36
|
+
|
|
37
|
+
| 步骤 | 产物 |
|
|
38
|
+
| ---- | ------------------------------------------------ |
|
|
39
|
+
| 1 | Vite + React + TS scaffold(base template 复制) |
|
|
40
|
+
| 2 | variant overlay(变体专属配置覆盖) |
|
|
41
|
+
| 3 | package.json merge(合并依赖) |
|
|
42
|
+
| 4 | 依赖安装(`pnpm install` / `npm install`) |
|
|
43
|
+
| 5 | git init |
|
|
44
|
+
|
|
45
|
+
#### 阶段 B:套件 init pipeline(8 步流水线)
|
|
46
|
+
|
|
47
|
+
| # | 步骤 | 关键 | 行为 |
|
|
48
|
+
| --- | ---------- | ---- | -------------------------------------------------------------------------------------- |
|
|
49
|
+
| 1 | tokens | ✓ | 写 `tokens/`,顺带装 design skill;旧路径单文件命中 `migrate` 策略时自动提层迁移 |
|
|
50
|
+
| 2 | skills | ✓ | 项目级装 `teamix-evo-code-<variant>`(manage 全局装一次,design 由 step 1 顺带) |
|
|
51
|
+
| 3 | agents-md | – | 生成根 `AGENTS.md`,managed-region 可重生 |
|
|
52
|
+
| 4 | ui-init | ✓ | 写 `components.json` + `packages.ui` 配置 |
|
|
53
|
+
| 5 | ui-add | – | 装全量 UI 组件源码(overwrite 模式) |
|
|
54
|
+
| 6 | biz-ui-add | – | 装当前 variant 下全量业务组件(无可用则 skip) |
|
|
55
|
+
| 7 | lint | – | `runLintInit`(ESLint + Stylelint) |
|
|
56
|
+
| 8 | gitignore | – | 追加 teamix-evo runtime 规则到 `.gitignore` |
|
|
57
|
+
|
|
58
|
+
> 关键步骤失败 → 后续关键步骤短路成 `skip(aborted)`;非关键步骤失败不阻断整体。
|
|
59
|
+
|
|
60
|
+
#### CLI 选项
|
|
61
|
+
|
|
62
|
+
| 选项 | 说明 |
|
|
63
|
+
| ------------------ | ----------------------------- |
|
|
64
|
+
| `--variant <name>` | tokens variant |
|
|
65
|
+
| `-y, --yes` | 跳过交互,使用推荐默认值 |
|
|
66
|
+
| `--pm <name>` | 包管理器:pnpm / npm / yarn |
|
|
67
|
+
| `--no-git` | 跳过 git init |
|
|
68
|
+
| `--no-install` | 跳过依赖安装 |
|
|
69
|
+
| `--dry-run` | 只输出执行计划,不写任何文件 |
|
|
70
|
+
| `--force` | 跳过前置检查,强制执行 |
|
|
71
|
+
|
|
72
|
+
### 4. 提交 init 产出(必做)
|
|
73
|
+
|
|
74
|
+
init 会生成大量文件(tokens / skills / ui 组件 / lint 配置等),**必须立刻 commit**:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
git add .
|
|
78
|
+
git commit -m "chore: init teamix-evo (<variant>)"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 5. 验证
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
pnpm dev # 立刻可跑
|
|
85
|
+
pnpm typecheck # 验证零类型错误
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 6. 全局 entry skill
|
|
89
|
+
|
|
90
|
+
若 `~/.qoder/skills/teamix-evo-manage` 不存在,提示用户装全局 manage skill:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npx teamix-evo@latest skills add teamix-evo-manage --scope global -y
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Partial(部分完成)状态恢复
|
|
97
|
+
|
|
98
|
+
CLI 在 partial 状态会打印"恢复指引"面板:失败步骤名、错误信息、已完成步骤、建议命令。**修好原因后直接重跑 `teamix-evo init`** —— 每个 sub-step 幂等,已落地的会 `already-initialized` 短路,从断点处续接。
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Migrate (shadcn 项目迁移为 Teamix Evo 套件)
|
|
2
|
+
|
|
3
|
+
> **前置条件**:当前目录是 shadcn 项目(有 `package.json` + `components.json`,无 `.teamix-evo/`)。
|
|
4
|
+
> 非 shadcn 工程执行时被 `assertCommandPrecondition` 拒绝并建议正确命令。
|
|
5
|
+
|
|
6
|
+
## 触发
|
|
7
|
+
|
|
8
|
+
用户表达"迁移 shadcn 到 teamix-evo / migrate / 把 shadcn 转成 teamix-evo / 升级 shadcn 项目"等关键词。
|
|
9
|
+
|
|
10
|
+
## 前置检查
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npx teamix-evo@latest migrate # 前置检查 + 引导
|
|
14
|
+
npx teamix-evo@latest migrate --json # JSON 格式报告(供 AI 消费)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
CLI 仅做前置检查(项目状态识别 + shadcn 工程确认),**实际迁移由 AI skill 驱动**。
|
|
18
|
+
|
|
19
|
+
## 迁移流程(AI 引导)
|
|
20
|
+
|
|
21
|
+
### 1. 分析 shadcn 项目结构
|
|
22
|
+
|
|
23
|
+
读取并分析:
|
|
24
|
+
|
|
25
|
+
- `components.json`:registry URL、aliases、style 配置
|
|
26
|
+
- `package.json`:已安装的 shadcn 相关依赖
|
|
27
|
+
- `src/components/ui/`:已安装的 shadcn 组件列表
|
|
28
|
+
- Tailwind 配置:v3(`tailwind.config.*`)还是 v4(`@import "tailwindcss"`)
|
|
29
|
+
- 现有配置文件:ESLint、Stylelint 等
|
|
30
|
+
|
|
31
|
+
### 2. 确定目标 variant
|
|
32
|
+
|
|
33
|
+
让用户选择 tokens variant(同 init 流程):
|
|
34
|
+
|
|
35
|
+
- **OpenTrek**(`opentrek`):AI 副驾驶 / 通用中后台
|
|
36
|
+
- **Uni-Manager**(`uni-manager`):云资源管理
|
|
37
|
+
|
|
38
|
+
### 3. 生成迁移计划
|
|
39
|
+
|
|
40
|
+
基于分析结果生成迁移计划,包括:
|
|
41
|
+
|
|
42
|
+
| 阶段 | 内容 |
|
|
43
|
+
| ------------ | ---------------------------------------------------------- |
|
|
44
|
+
| tokens 注入 | 写入 `tokens/` 目录,配置 design tokens |
|
|
45
|
+
| config 转换 | `components.json` → `.teamix-evo/config.json` |
|
|
46
|
+
| 组件映射 | shadcn 组件 → teamix-evo 对应组件的映射关系 |
|
|
47
|
+
| skills 安装 | 项目级 skill 安装 |
|
|
48
|
+
| AGENTS.md | 生成根 `AGENTS.md` |
|
|
49
|
+
| lint 配置 | ESLint + Stylelint 配置 |
|
|
50
|
+
|
|
51
|
+
### 4. 逐步执行迁移
|
|
52
|
+
|
|
53
|
+
按计划逐步执行,每步征求用户确认:
|
|
54
|
+
|
|
55
|
+
1. **tokens 注入**:`npx teamix-evo@latest tokens init --variant <name>`
|
|
56
|
+
2. **skills 安装**:`npx teamix-evo@latest skills init`
|
|
57
|
+
3. **AGENTS.md 生成**:init pipeline 中的 agents-md 步骤
|
|
58
|
+
4. **UI 配置迁移**:`npx teamix-evo@latest ui init`(转换 aliases、配置)
|
|
59
|
+
5. **组件对齐**:`npx teamix-evo@latest ui add` 安装 teamix-evo 版组件,与现有 shadcn 组件建立映射
|
|
60
|
+
6. **lint 配置**:`npx teamix-evo@latest lint init`
|
|
61
|
+
|
|
62
|
+
### 5. 验证
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pnpm typecheck # 类型检查
|
|
66
|
+
pnpm dev # 启动验证
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 6. 提交
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
git add .
|
|
73
|
+
git commit -m "chore: migrate from shadcn to teamix-evo (<variant>)"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 各资源的迁移处理方式
|
|
77
|
+
|
|
78
|
+
| 资源 | 迁移行为 | 说明 |
|
|
79
|
+
| --- | --- | --- |
|
|
80
|
+
| tokens | `tokens init --variant <name>` 全新生成 | 覆盖或新建 `tokens/` 目录 |
|
|
81
|
+
| skills | `skills init` 全新安装 | 按 variant + scope 自举 |
|
|
82
|
+
| AGENTS.md | init pipeline 全新生成 | managed 区段 + 用户自由编辑区 |
|
|
83
|
+
| config.json | 从 `components.json` 转换生成 | shadcn aliases → teamix-evo config |
|
|
84
|
+
| manifest.json | 全新生成 | 记录已安装资源 ledger |
|
|
85
|
+
| lint | `lint init` 生成配置 | 检测现有 ESLint/Stylelint 配置,按冲突策略处理(merge/backup-overwrite/skip/overwrite) |
|
|
86
|
+
| ui 组件 | `ui init` + `ui add` | 建立 shadcn→teamix-evo 组件映射 |
|
|
87
|
+
|
|
88
|
+
**lint 冲突处理**:shadcn 项目通常已有 ESLint 配置。`lint init` 会检测现有配置文件并提供冲突策略选项:
|
|
89
|
+
|
|
90
|
+
- `merge`:备份现有文件,写入 teamix-evo 模板,AI 引导用户合并自定义规则
|
|
91
|
+
- `backup-overwrite`:备份后直接覆写
|
|
92
|
+
- `skip`:保留用户现有配置不动
|
|
93
|
+
- `overwrite`:直接覆写(不备份)
|
|
94
|
+
|
|
95
|
+
## 注意事项
|
|
96
|
+
|
|
97
|
+
- **不破坏现有功能**:迁移过程中现有 shadcn 组件保持可用,逐步替换。
|
|
98
|
+
- **components.json 保留**:迁移完成后 `components.json` 不删除(可能有其他工具依赖),但 teamix-evo 以 `.teamix-evo/config.json` 为准。
|
|
99
|
+
- **自定义组件**:用户对 shadcn 组件的自定义修改需要在 AI 引导下手动迁移到 teamix-evo 体系。
|
|
100
|
+
- **迁移完成后**:项目状态变为 `teamix-evo`,后续使用 `teamix-evo update` 保持更新。
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# 迁移三轨材料准备指南
|
|
2
|
+
|
|
3
|
+
迁移流程依赖三轨材料:**源码** + **repo-wiki** + **页面截图**。本文件说明 repo-wiki 和截图的工具与操作方式。
|
|
4
|
+
|
|
5
|
+
## 1. Repo-wiki 准备(Qoder 客户端内置功能)
|
|
6
|
+
|
|
7
|
+
Repo-wiki 是 **Qoder 客户端**的内置功能,无需额外安装。
|
|
8
|
+
|
|
9
|
+
**操作步骤:**
|
|
10
|
+
|
|
11
|
+
1. 在 **Qoder 客户端**中打开旧项目目录
|
|
12
|
+
2. 使用 Qoder 内置的 repowiki 功能生成项目文档
|
|
13
|
+
3. 产物位于 `<old-path>/.qoder/repowiki/`(含中/英文版)
|
|
14
|
+
|
|
15
|
+
**AI 引导话术:**
|
|
16
|
+
|
|
17
|
+
> "请在 Qoder 客户端中打开旧项目目录,使用内置 repowiki 功能生成项目文档。完成后告诉我,我会自动读取 `<old-path>/.qoder/repowiki/` 下的内容。"
|
|
18
|
+
|
|
19
|
+
## 2. 页面截图准备(Qoderwork 客户端)
|
|
20
|
+
|
|
21
|
+
页面截图通过 **Qoderwork 客户端**完成。Qoderwork 内置浏览器截图能力,支持逐页面批量截图。
|
|
22
|
+
|
|
23
|
+
**操作步骤:**
|
|
24
|
+
|
|
25
|
+
1. 在 **Qoderwork 客户端**中打开旧项目的运行 URL
|
|
26
|
+
2. 逐页面访问,对每个页面的以下状态进行截图:
|
|
27
|
+
- 页面默认态(列表 / 表单 / 详情等主视图)
|
|
28
|
+
- 页面内所有弹窗(Dialog / Modal)的打开态
|
|
29
|
+
- 页面内所有抽屉(Drawer / Sheet)的打开态
|
|
30
|
+
- 关键交互状态(空态 / 加载态 / 错误态,若能触发)
|
|
31
|
+
3. 按页面路由建文件夹,存放到统一截图目录
|
|
32
|
+
|
|
33
|
+
**AI 引导话术:**
|
|
34
|
+
|
|
35
|
+
> "请在 Qoderwork 客户端中打开待迁移项目 URL,对所有页面及页面内的弹窗、抽屉进行截图,按页面路由为文件夹名落地,完成后提供截图目录路径。"
|
|
36
|
+
|
|
37
|
+
### 截图目录结构约定
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
<screenshots-dir>/
|
|
41
|
+
├── home/
|
|
42
|
+
│ ├── default.png
|
|
43
|
+
│ └── dialog-create.png
|
|
44
|
+
├── list/
|
|
45
|
+
│ ├── default.png
|
|
46
|
+
│ ├── drawer-detail.png
|
|
47
|
+
│ └── dialog-delete.png
|
|
48
|
+
├── settings/
|
|
49
|
+
│ └── default.png
|
|
50
|
+
└── _aside/ # 左导航专项(可选)
|
|
51
|
+
├── sidebar-top.png
|
|
52
|
+
├── sidebar-bottom.png
|
|
53
|
+
└── sidebar-collapsed.png
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 文件命名约定
|
|
57
|
+
|
|
58
|
+
| 文件名 | 含义 |
|
|
59
|
+
| --- | --- |
|
|
60
|
+
| `default.png` | 页面默认态(整页截图) |
|
|
61
|
+
| `dialog-<名称>.png` | 弹窗(Dialog / Modal)打开态 |
|
|
62
|
+
| `drawer-<名称>.png` | 抽屉(Drawer / Sheet)打开态 |
|
|
63
|
+
| `state-empty.png` | 空态 |
|
|
64
|
+
| `state-loading.png` | 加载态 |
|
|
65
|
+
| `state-error.png` | 错误态 |
|
|
66
|
+
| `tab-<n>-<名称>.png` | Tab / Radio 切换态 |
|
|
67
|
+
| `row-action-menu.png` | 表格行内操作菜单展开态 |
|
|
68
|
+
|
|
69
|
+
## 3. 进阶:Playwright 自动化批量截图
|
|
70
|
+
|
|
71
|
+
适用于内网控制台(Fusion / Next-design 风格)的大规模页面截图场景。当页面数量多(>20 页)且手动截图效率低时,AI 应根据下方流程和 DOM 知识**自行生成** Playwright 脚本,针对目标站点定制。
|
|
72
|
+
|
|
73
|
+
### 环境准备
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
pip3 install playwright && python3 -m playwright install chromium
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
脚本需从用户处获取三项配置:
|
|
80
|
+
|
|
81
|
+
| 配置项 | 说明 |
|
|
82
|
+
| --- | --- |
|
|
83
|
+
| 代理地址 | 内网控制台通常需要 HTTP 代理才能访问 |
|
|
84
|
+
| 目标站点 URL | 待截图的控制台首页地址 |
|
|
85
|
+
| 登录凭证 | 用户名/密码(用于 Playwright 自动登录) |
|
|
86
|
+
|
|
87
|
+
截图输出到 `<project>/.teamix-evo/migrate-screenshots/`,按路由建子目录。
|
|
88
|
+
|
|
89
|
+
### 截图流程(6 阶段)
|
|
90
|
+
|
|
91
|
+
AI 生成的脚本应覆盖以下 6 个阶段,可拆为独立脚本或合并为一个:
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
阶段 1 · 登录探路
|
|
95
|
+
→ Playwright 打开目标站点,完成登录,持久化 storage_state(cookie/session)
|
|
96
|
+
→ 遍历左导航,抽取所有路由路径,落地为 routes.json
|
|
97
|
+
|
|
98
|
+
阶段 2 · EULA / 首次弹窗处理
|
|
99
|
+
→ 检测并关闭产品使用须知、隐私协议等首次弹窗,持久化到 storage_state
|
|
100
|
+
|
|
101
|
+
阶段 3 · 一期:逐路由默认页 + 主按钮触发态
|
|
102
|
+
→ 遍历 routes.json,每个路由截整页默认态
|
|
103
|
+
→ 检测页面顶部操作按钮(按安全策略过滤),逐个点击并截图触发态
|
|
104
|
+
|
|
105
|
+
阶段 4 · 二期:深度截图
|
|
106
|
+
→ 列表页 tab / radio-group 切换态
|
|
107
|
+
→ 表格行内 More 菜单展开 + 每个安全菜单项的结果
|
|
108
|
+
→ Dialog/Drawer 内部 tab 切换态
|
|
109
|
+
|
|
110
|
+
阶段 5 · 三期:左导专项
|
|
111
|
+
→ 左导滚动到顶/底、整侧栏截图、折叠态、用户菜单弹出
|
|
112
|
+
|
|
113
|
+
阶段 6 · 汇总
|
|
114
|
+
→ 生成 README.md 索引所有截图,按路由分组
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 文件命名前缀约定
|
|
118
|
+
|
|
119
|
+
| 前缀 | 含义 |
|
|
120
|
+
| --- | --- |
|
|
121
|
+
| `01-default.png` | 默认页(整页 `full_page=True`) |
|
|
122
|
+
| `02..0N-{btn}.png` | 顶部主按钮触发态(后缀 `dialog` 或 `subpage`) |
|
|
123
|
+
| `20-tab-{n}-{name}.png` | 列表页 tab / radio-group 切换态 |
|
|
124
|
+
| `30-row-action-menu.png` | 表格首行 More 菜单展开 |
|
|
125
|
+
| `31-row-{n}-{item}.png` | 行 More 菜单内每个安全项的结果 |
|
|
126
|
+
| `40-{btn}-tab-{n}-{tab}.png` | Dialog/Drawer 内部 tab 切换态 |
|
|
127
|
+
| `_aside/01..05-sidebar-*.png` | 左导专项(top/bottom/full/collapsed/user-menu) |
|
|
128
|
+
|
|
129
|
+
### 按钮安全策略
|
|
130
|
+
|
|
131
|
+
自动截图时严格区分安全按钮和危险按钮:
|
|
132
|
+
|
|
133
|
+
**白名单(可点击):** 新建、创建、添加、导入、上传、配置、详情、克隆、绑定、扩缩容、新增版本 — 打开表单/弹窗类
|
|
134
|
+
|
|
135
|
+
**黑名单(禁止点击):** 删除、停止、释放、提交、确认、保存、搜索、导出、重置 — 有副作用类
|
|
136
|
+
|
|
137
|
+
按钮文本长度 >16 字的跳过(通常是状态/帮助文案,不是操作按钮)。
|
|
138
|
+
|
|
139
|
+
### Dialog vs Subpage 判断
|
|
140
|
+
|
|
141
|
+
点击按钮后检测 overlay 容器判断结果类型:
|
|
142
|
+
|
|
143
|
+
| 检测选择器 | 判定 | 后续动作 |
|
|
144
|
+
| --- | --- | --- |
|
|
145
|
+
| `.next-overlay-wrapper.opened` / `.ant-modal-wrap` / `[role=dialog]` / `.ant-drawer-open` | **弹窗** | 截图 → ESC 关闭 |
|
|
146
|
+
| 以上均未检测到 | **子页面** | 整页截图 → `safe_goto` 导航回列表页 |
|
|
147
|
+
|
|
148
|
+
### DOM 选择器参考(Fusion / Next-design)
|
|
149
|
+
|
|
150
|
+
实际内网控制台多为 Fusion/Next-design 体系,**非 antd**。关键选择器:
|
|
151
|
+
|
|
152
|
+
| 元素 | 选择器 |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| Tab 激活项 | `.next-tabs-tab.active` |
|
|
155
|
+
| 行内 More 按钮 | `.next-menu-btn` |
|
|
156
|
+
| 菜单项(含禁用检测) | `.next-menu-item` / `.next-menu-item.next-disabled` |
|
|
157
|
+
| Radio 组 | `.next-radio-group label.next-radio-button` |
|
|
158
|
+
| Dialog 容器 | `.next-overlay-wrapper.opened` 内 `.next-dialog` / `.next-drawer` |
|
|
159
|
+
| 左导结构 | `.ot-sidebar.fixed` → `.ot-sidebar-inner` → `header` / `body`(scrollable) / `footer` |
|
|
160
|
+
| 用户菜单触发 | `.ot-sidebar-footer-more-btn`(底部 admin 行 ⋮) |
|
|
161
|
+
|
|
162
|
+
### 关键避坑
|
|
163
|
+
|
|
164
|
+
| 问题 | 解法 |
|
|
165
|
+
| --- | --- |
|
|
166
|
+
| 内网直连超时 | 走 HTTP 代理:`browser.launch(proxy={"server": PROXY})` + `--ignore-certificate-errors` |
|
|
167
|
+
| `goto` 偶发 `ERR_CONNECTION_RESET` | 所有 `goto` 包 retry(3 次) |
|
|
168
|
+
| EULA 弹窗遮挡 | 阶段 2 处理:检测并关闭弹窗,通过 `storage_state` 持久化关闭状态 |
|
|
169
|
+
| 行内 More 菜单 JS `el.click()` 不触发 overlay | 必须用 Playwright `locator(...).click(timeout=3000)` 真实点击 |
|
|
170
|
+
| 左导整侧栏截图 | JS 解 body 的 `maxHeight/overflow`,`.ot-sidebar` 设 `position: absolute` 解 fixed,`set_viewport_size` 到 `scrollHeight+40`,再 `locator('.ot-sidebar').screenshot()` |
|
|
171
|
+
| 左导用户菜单截图 | 必须 fresh page(避开折叠 toggle 后 footer 结构变化) |
|
|
172
|
+
| 整页 vs 弹层截图 | 默认 `full_page=True`;dialog/drawer 场景 `full=not visible`(只截首屏遮罩区域) |
|
|
173
|
+
| 多步表单 Drawer | 仅截首步(点下一步常因表单未填被拦截) |
|
|
174
|
+
| 无数据页 | 行级 More 菜单需至少一行数据,无数据页无 `30-`/`31-` 文件属正常 |
|