@teamix-evo/skills 0.10.2 → 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.
@@ -490,11 +490,11 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
490
490
 
491
491
  **触发**:用户说"卸载 teamix-evo / remove the design system"。
492
492
 
493
- | 范围 | 命令 |
494
- | --------------------------------------------- | ------------------------------------------------------------------- |
495
- | Tokens | `npx teamix-evo tokens uninstall [-y] [--keep-files] [--purge]` |
496
- | Skills | `npx teamix-evo skills uninstall [-y]` |
497
- | (UI 不提供卸载,组件源码用户拥有 → 用户手动删) | |
493
+ | 范围 | 命令 |
494
+ | --------------------------------------------- | --------------------------------------------------------------- |
495
+ | Tokens | `npx teamix-evo tokens uninstall [-y] [--keep-files] [--purge]` |
496
+ | Skills | `npx teamix-evo skills uninstall [-y]` |
497
+ | (UI 不提供卸载,组件源码用户拥有 → 用户手动删) | |
498
498
 
499
499
  `tokens uninstall` 默认保留 `frozen` + `managed` 文件以保护用户编辑;`--keep-files` 完全保留物理文件只清 manifest;`--purge` 连 `frozen` 文件也删除。
500
500
 
@@ -508,11 +508,38 @@ 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,完成后告诉我。"等待用户确认后重检。
515
541
  3. **读取 repo-wiki** — 增量读取 `<old-path>/.qoder/repowiki/` 目录内容。优先读中文版(`repowiki/zh/`),其次英文版(`repowiki/en/`)。按文件名语义识别:
542
+
516
543
  - 项目总览 / 概述
517
544
  - 目录结构 / 模块划分
518
545
  - 页面 / 路由清单
@@ -521,11 +548,15 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
521
548
  - 依赖清单
522
549
 
523
550
  > 不一次性读完全部内容(token 预算有限)。先读概览 + 路由,后续按需深入。
524
- 4. **补充读取**(若 repo-wiki 不完整)— 直接读旧项目的:
551
+
552
+ 4. **检测截图目录** — 检查用户提供的截图目录是否存在且非空:
553
+ - 存在且含截图 → 记录路径,进入步骤 5。
554
+ - 不存在或为空 → 告知用户截图目录不可用,请先按建议完成截图后再继续。
555
+ 5. **补充读取**(若 repo-wiki 不完整)— 直接读旧项目的:
525
556
  - `package.json`(依赖 / scripts)
526
557
  - 路由配置文件(`src/routes/`、`src/router/`、`pages/` 目录等)
527
558
  - 目录结构(`ls src/`)
528
- 5. **识别旧项目技术栈** — 从依赖和代码判断,记录以下维度:
559
+ 6. **识别旧项目技术栈** — 从依赖和代码判断,记录以下维度:
529
560
  - UI 框架(antd / element-ui / arco-design / mui / naive-ui / 自研)
530
561
  - 路由方案(react-router / vue-router / next.js / umi)
531
562
  - 状态管理(redux / mobx / zustand / pinia / vuex)
@@ -536,84 +567,214 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
536
567
 
537
568
  6. **生成迁移计划文件** — 写入 `.teamix-evo/migrate-plan.md`,格式如下:
538
569
 
539
- ```markdown
570
+ ````markdown
540
571
  # Migration Plan
541
572
 
573
+ ## ❗ 执行规则(每次读取本文件时必须重新确认)
574
+
575
+ 1. **Token 映射查表** — 每迁移一个页面前,必须先读取 `.teamix-evo/migrate-token-mapping.md`,所有旧项目 CSS 变量按实际像素值映射为新项目 Tailwind class。禁止根据变量名称“猜测”对应关系。
576
+ 2. **skill 门控** — 写代码前必须已加载 `teamix-evo-manage`、`teamix-evo-code-{variant}`、`teamix-evo-design-{variant}` 三个 skill(路径见关键文件索引)。
577
+ 3. **三轨齐备** — 进入任何页面实现前必须源码 + repo-wiki + 截图全部确认就绪(截图由用户预先准备,AI 只做确认)。
578
+ 4. **Token 合法性自检** — 写完代码后扫描所有 Tailwind class,确认在新项目有效。
579
+ 5. **新架构骨架层检查** — 迁移不仅是“翻译旧代码”,还必须“适配新架构的标准模式”。新架构有一套完整的页面骨架层级(`PageShell → OpPageContainer → PageHeader → 内容`),这些组件在旧项目中完全不存在(旧项目用自定义 `<h1>`、内联样式或散落 CSS 实现),三轨对照不会发现它们。必须主动查阅 design skill 和 biz-ui 组件的 JSDoc 获取标准骨架用法:
580
+ - **Layout 层**:检查 `src/components/biz-ui/` 是否存在页面容器组件(如 `OpPageContainer`),在 `<Outlet />` 外统一包裹,使所有页面自动获得容器效果
581
+ - **每页面层**:检查容器组件的 JSDoc / 源码中是否定义了标配的子组件模式(如 `header={<PageHeader>...</PageHeader>}` 是每页标配),必须按规范使用而非省略
582
+
583
+ # ❄️ 冷启动恢复指南(上下文丢失 / 新会话接手时执行)
584
+
585
+ 如果你是一个新会话被要求"继续迁移",按以下顺序恢复上下文:
586
+
587
+ 1. 读取本文件 `.teamix-evo/migrate-plan.md` — 获取进度、元数据、执行规则
588
+ 2. 读取 `.teamix-evo/migrate-token-mapping.md` — 加载 token 映射表
589
+ 3. 加载三个 skill(路径见下方「关键文件索引」):
590
+ - **Manage skill** — 包含完整的迁移执行协议(三轨确认流程、逐条实现步骤、验证流程)
591
+ - **Code skill** — 代码规范门控(reuse-first / file-structure / api-layering)
592
+ - **Design skill** — 设计/布局规范(视觉还原、栅格、组件组合)
593
+ 4. 查看 Progress 区块 — 找到 **Current phase** 所指的 Phase,在该 Phase 中定位第一个未完成的 `[ ]` 条目(不要回头处理更早 Phase 中被 pilot 模式有意推迟的条目)
594
+ 5. 确认三轨材料 — 对当前页面确认源码 + repo-wiki + 截图三轨就绪(截图目录见 Metadata → Screenshots dir)
595
+ 6. 开始实现 — 从第一个未完成条目继续
596
+
597
+ > 注:截图由用户预先准备完成,AI 无需执行截图操作。若截图目录中缺少当前页面截图,暂停并请用户补充。
598
+
599
+ ## 关键文件索引
600
+
601
+ | 文件 | 路径 | 用途 |
602
+ | ------------ | --------------------------------------------------------- | ------------------------------ |
603
+ | 迁移计划 | `.teamix-evo/migrate-plan.md` | 进度跟踪 + 执行规则(本文件) |
604
+ | Token 映射表 | `.teamix-evo/migrate-token-mapping.md` | CSS 变量 → Tailwind class 映射 |
605
+ | 截图目录 | 见 Metadata → Screenshots dir | 用户提供的页面截图目录 |
606
+ | Manage skill | `.teamix-evo/skills/teamix-evo-manage/SKILL.md` | 迁移执行协议(场景 6) |
607
+ | Code skill | `.teamix-evo/skills/teamix-evo-code-{variant}/SKILL.md` | 代码规范门控 |
608
+ | Design skill | `.teamix-evo/skills/teamix-evo-design-{variant}/SKILL.md` | 设计/布局规范 |
609
+ | 旧项目源码 | 见 Metadata → Source | 源码轨参考 |
610
+ | 旧项目 Wiki | 见 Metadata → Source 同级 `repo-wiki/` | Wiki 轨参考 |
611
+
612
+ > ℹ️ `{variant}` 请替换为 Metadata 中的 **Target variant** 值(如 `opentrek` 或 `uni-manager`)。实际生成时会自动填入真实值。
613
+
542
614
  ## Progress
615
+
543
616
  - **Status**: in-progress
617
+ - **Mode**: <full | pilot>
618
+ - **Pilot pages**: <页面名列表,仅 pilot 模式填写>
619
+ - **Pilot 说明**: <pilot 模式下仅执行上述 Phase 涉及的条目。更早 Phase 中标 `[ ]` 的条目是有意推迟到 pilot 验证通过后再补的,当前不需要处理>
544
620
  - **Completed**: 0 / <总条目数>
545
621
  - **Current phase**: Phase 0 — Global Infrastructure
546
622
  - **Last updated**: <ISO 时间戳>
547
623
 
548
624
  ## Metadata
625
+
549
626
  - **Source**: <旧项目绝对路径>
550
627
  - **Target variant**: <当前项目 variant>
551
628
  - **Generated**: <ISO 时间戳>
552
629
  - **Old stack**: <框架> + <UI 库> + <路由> + <HTTP 客户端> + <状态管理>
553
- - **Source URL**: <用户提供的运行地址,可选>
630
+ - **Screenshots dir**: <用户提供的截图目录绝对路径>
554
631
 
555
632
  ## Component Mapping (AI via MCP find_components 动态生成)
556
633
 
557
634
  | Old | New (teamix-evo) | Notes |
558
- |-----|-------------------|-------|
559
- | ... | ... | ... |
635
+ | --- | ---------------- | ----- |
636
+ | ... | ... | ... |
560
637
 
561
638
  ## Phase 0: Global Infrastructure
562
639
 
563
- - [ ] **Routing**路由结构搭建
640
+ - [ ] **清理脚手架示例页面**删除 `create-teamix-evo` 生成的 demo 页面(`src/pages/home/`、`src/pages/list/`、`src/pages/detail/`、`src/pages/form/` 等)及关联的 services / hooks / types / routes 条目
641
+ [ ] **Layout(吸顶 + 左导 + 页面容器)** — ❗ 优先级最高。全局壳重构:吸顶 Header、左侧边栏 Sidebar、面包屑、内容区布局。先保证通用性内容正确,再进入具体页面。
642
+
643
+ > Layout 也需要截图参考:确认用户截图目录中 `layout/` 文件夹是否包含吸顶和左导截图(`header.png` + `sidebar.png`),作为视觉还原参考。若缺失,提示用户补充。
644
+
645
+ > ⚠️ **新架构骨架层检查**:新架构的页面骨架是 `PageShell → OpPageContainer → PageHeader → 内容`,旧项目不会有这些抽象。必须主动检查 biz-ui 组件源码和 JSDoc 获取标准用法:
646
+ >
647
+ > - Layout 层:`<Outlet />` 外套 `OpPageContainer`(灰底白卡)
648
+ > - 每页面层:`OpPageContainer` 的 `header` prop 传入 `<PageHeader>`(页面标题 + Tabs 等)
649
+ > - 这些信息三轨对照找不到,只能从 design skill 和 biz-ui 组件 JSDoc 中获取
650
+
651
+ - [ ] **静态资源迁移** — 将旧项目的静态资源(图片 / 视频 / 动效 / 字体 / SVG / 音频等)拷贝到新项目对应目录(如 `public/` 或 `src/assets/`),保持相对引用路径一致
652
+ - [ ] **Routing** — 路由结构搭建(基于旧项目路由表重建)
564
653
  - [ ] **API client** — HTTP 客户端 + 拦截器
565
654
  - [ ] **Auth** — 鉴权流程
566
- - [ ] **Layout** — 全局壳(导航 / 侧边栏 / 面包屑)
567
655
  - [ ] **Global state** — 全局状态管理
568
- - [ ] **Theme**主题对齐(tokens.overrides.css)
656
+ - [ ] **Theme & 全局 CSS 基线** 对比旧项目的全局样式(body / html / :root),将以下配置对齐到新项目:
657
+
658
+ - 字体族(font-family)— 若旧项目使用自定义字体(如 Geist / Inter),需引入字体文件并配置 @font-face
659
+ - 字体平滑(-webkit-font-smoothing: antialiased)
660
+ - 字体特性(font-feature-settings)
661
+ - 基础行高、字号、颜色
662
+ - 其他全局 reset 样式
663
+ - tokens.overrides.css 主题变量覆盖
664
+
665
+ > 这些全局 CSS 影响所有页面的视觉表现,必须在进入具体页面迁移前完成。直接沿用旧项目的配置,无需询问用户。完成后在进度汇报中简要记录已对齐的项目(如“已对齐字体族 Geist Variable、antialiased、font-feature-settings”),通知用户即可。
666
+
667
+ - [ ] **Token 映射表** — 提取旧项目所有 CSS 变量 / design tokens,解析其实际值,建立与新项目 Tailwind class 的映射表,并写入 `.teamix-evo/migrate-token-mapping.md`。示例:
668
+
669
+ ```markdown
670
+ | 旧项目 Token | 实际值 | 新项目 Tailwind Class |
671
+ | ---------------- | ------- | ------------------------- |
672
+ | --font-size-base | 12px | text-xs |
673
+ | --font-size-lg | 14px | text-sm |
674
+ | --font-size-xl | 16px | text-base |
675
+ | --font-size-2xl | 18px | text-lg |
676
+ | --color-primary | #1677ff | text-primary / bg-primary |
677
+ | --border-radius | 4px | rounded |
678
+ | --spacing-sm | 8px | gap-2 / p-2 |
679
+ ```
680
+
681
+ 映射表必须覆盖以下维度:
682
+
683
+ - **字号** — 所有 font-size 变量
684
+ - **间距** — spacing / padding / margin / gap 变量
685
+ - **圆角** — border-radius 变量
686
+ - **颜色** — 旧项目自定义色值变量(如 `--color-data-8`、`--color-brand-3`)→ 检查新项目 `tokens.theme.css` 中是否存在对应 utility。若不存在,标注为「❗ 无对应」并建议替代方案(如用最接近的语义色或 CSS 变量内联)
687
+ - **阴影** — box-shadow 变量
688
+
689
+ > ⚠️ **硬约束:禁止按名称猜测映射。** AI 必须解析旧项目 CSS 变量的实际像素值,再映射到新项目对应的 Tailwind class。例如 `--font-size-lg = 14px` 应映射为 `text-sm`(而不是名称相似的 `text-lg`)。
690
+ > 后续 Phase C 逐页实现时,所有涉及旧 token 的代码必须查询此表来确定正确的 Tailwind class,不得凭名称直觉映射。
691
+ > 对于映射表中标注为「❗ 无对应」的 token,在写代码时必须使用替代方案,不得直接复制旧项目的 class 名。
569
692
 
570
693
  ## Phase 1: <页面名> (complexity: <simple|medium|complex>)
571
694
 
695
+ > ⚠️ 执行前检查:① 已读取 `migrate-token-mapping.md` ② 已加载 manage/code/design skill(见关键文件索引) ③ 三轨已采集
696
+
572
697
  - Route: `<路由路径>`
573
698
  - [ ] **<子任务>** — <描述> (<使用组件>)
574
699
  - [ ] **API integration** — <接口列表>
575
700
 
576
701
  ## Phase N: ...
577
- ```
702
+ ````
578
703
 
579
- **组件映射生成规则**:通过 MCP `find_components` / `list_components` 查询 teamix-evo 注册表,逐个匹配旧项目使用的 UI 组件,动态填写映射表。
704
+ **组件映射生成规则**:通过 MCP `find_components` / `list_components` 查询 teamix-evo 注册表,逐个匹配旧项目使用的 UI 组件,动态填写映射表。
580
705
 
581
706
  7. **展示计划摘要** — 向用户复述:
707
+
582
708
  - 总页面数
583
709
  - 按复杂度分布(简单 / 中等 / 复杂)
584
710
  - 建议执行顺序
585
711
  - 询问用户是否调整顺序、跳过某些页面、或补充遗漏页面
586
712
 
713
+ 8. **确认迁移节奏** — 向用户提问:
714
+
715
+ > “您希望先迁移几个页面验证效果,还是直接开始全量迁移?”
716
+
717
+ - **先验证(推荐)**:用户选择 1–3 个代表性页面(建议包含一个简单页 + 一个复杂页),先做完这几个让用户检验代码质量、视觉还原度、组件映射质量后再继续剩余页面
718
+ - **全量迁移**:按计划顺序逐页执行,每完成一个 Phase 后向用户汇报
719
+
720
+ 在 `migrate-plan.md` 顶部 Progress 区块记录用户选择:
721
+
722
+ - `Mode: pilot` + `Pilot pages: <页面名列表>` — 验证模式,仅执行指定页面
723
+ - `Mode: full` — 全量模式
724
+
725
+ > pilot 模式完成后,向用户确认:“验证页面已完成,是否继续迁移剩余页面?”用户确认后将 Mode 改为 `full` 并继续。
726
+
587
727
  > Phase B → Phase C 之间**必须**有用户的明确确认(go-ahead)。
588
728
 
589
729
  #### Phase C · 执行
590
730
 
591
- 8. **读取当前进度** — 读 `.teamix-evo/migrate-plan.md` 顶部 Progress 区块。若 Status 为 `done` → 告知用户迁移已全部完成。否则找到第一个未完成(`[ ]`)的条目。
592
- 9. **三轨采集(每页开发前必做)**进入一个页面的开发前,必须先收集三轨信息:
593
- a. **Wiki 轨**:读旧项目 repo-wiki 中该页面相关的描述(功能说明、业务规则、数据流)
594
- b. **源码轨**:读旧项目该页面的全部源文件(页面组件 + 子组件 + 页面内弹窗 Dialog / 抽屉 Drawer / 确认框等)
595
- c. **截图轨**:通过浏览器访问旧项目运行地址,对该页面进行截图。截图范围须覆盖:
596
- - 页面默认态(列表 / 表单 / 详情等主视图)
597
- - 页面内所有弹窗(Dialog / Modal)的打开态
598
- - 页面内所有抽屉(Drawer / Sheet)的打开态
599
- - 关键交互状态(空态 / 加载态 / 错误态,若能触发)
731
+ 9. **读取当前进度** — 读 `.teamix-evo/migrate-plan.md` 顶部 Progress 区块。若 Status 为 `done` → 告知用户迁移已全部完成。否则找到第一个未完成(`[ ]`)的条目。
732
+ 10. **三轨确认(每页开发前必做)**进入一个页面的开发前,必须确认三轨材料均已就绪:
733
+ a. **源码轨**:读旧项目该页面的全部源文件(页面组件 + 子组件 + 页面内弹窗 Dialog / 抽屉 Drawer / 确认框等)
734
+ b. **Wiki 轨**:读旧项目 repo-wiki 中该页面相关的描述(功能说明、业务规则、数据流)
735
+ c. **截图轨**:检查用户提供的截图目录中 `<screenshots-dir>/<page-route>/` 是否已有该页面截图。
736
+
737
+ - **已有截图** 直接读取作为视觉参考。
738
+ - **截图缺失** 暂停并告知用户:"<页面名> 缺少截图,请补充后告诉我。"等待用户补充后继续。
739
+
740
+ **截图存放约定**:用户在 Qoder 工作区预先准备,按页面路由为文件夹名,存放在用户提供的截图目录下。文件名约定:
741
+
742
+ - `default.png` — 页面默认态
743
+ - `dialog-<名称>.png` — 弹窗打开态
744
+ - `drawer-<名称>.png` — 抽屉打开态
745
+ - `state-empty.png` / `state-loading.png` / `state-error.png` — 特殊状态
746
+
747
+ 截图范围须覆盖:
748
+
749
+ - 页面默认态(列表 / 表单 / 详情等主视图)
750
+ - 页面内所有弹窗(Dialog / Modal)的打开态
751
+ - 页面内所有抽屉(Drawer / Sheet)的打开态
752
+ - 关键交互状态(空态 / 加载态 / 错误态,若能触发)
753
+
754
+ > **AI 不执行截图**:截图由用户在迁移开始前通过 Qoder 工作区一次性完成(访问旧项目所有页面、弹窗、抽屉截图),迁移过程中 AI 仅读取已有截图作为视觉参考。
755
+
756
+ > ⚠️ **硬约束:三轨齐备方可动手。** AI 必须在源码、wiki、截图三轨全部确认就绪后,才能开始该页面的实现。**AI 不得自行跳过截图轨**——只有用户明确要求「跳过截图」时,才可降级为两轨模式,并标注"⚠️ 无截图参考,视觉还原需用户人工校对"。
600
757
 
601
- > 三轨齐备后,向用户确认:"已采集完 <页面名> wiki、源码、截图,开始实现?"用户确认后才动手。若截图不可用(旧项目未运行),告知用户并以 wiki + 源码两轨继续,标注"无截图参考,视觉还原需用户人工校对"。
758
+ 三轨确认后,向用户确认:"<页面名> 的源码、repo-wiki、截图三轨已确认就绪,开始实现?"用户确认后才动手。
602
759
 
603
- 10. **逐条实现** — 对每个 checklist 条目:
760
+ 11. **逐条实现** — 对每个 checklist 条目:
604
761
  a. 通过 MCP `find_components` / `get_component_meta` 查询可用组件
605
- b. 遵循 `teamix-evo-code-<variant>` skill 规范生成代码(reuse-first / file-structure / api-layering)
606
- c. 遵循 `teamix-evo-design-<variant>` skill 规范处理页面布局,参照截图还原视觉
607
- d. 完成后更新 `.teamix-evo/migrate-plan.md`:将对应条目标记为 `[x]`,同步更新顶部 Progress(Completed 计数 + Current phase + Last updated)
608
- e. 向用户汇报进度,格式:`✅ <条目名> 完成(<已完成数>/<总数>)| 当前阶段:<Phase 名>`
609
- 11. **验证**每完成一个页面后:
762
+ b. **加载 code/design skill** — 必须先读取 `teamix-evo-code-{variant}` `teamix-evo-design-{variant}` SKILL.md 全文,激活其门控流程。**禁止未读取就开始写代码**。若当前会话已经读取过且上下文未丢失,可跳过重复读取
763
+ c. 遵循 `teamix-evo-code-{variant}` skill 规范生成代码(reuse-first / file-structure / api-layering)
764
+ d. 遵循 `teamix-evo-design-{variant}` skill 规范处理页面布局,参照截图还原视觉
765
+ e. **Token 映射查表** 写代码时遇到旧项目的 CSS 变量 / class,必须查询 `.teamix-evo/migrate-token-mapping.md` 确定正确的 Tailwind class,禁止凭名称直觉映射
766
+ f. **静态资源处理**实现过程中若发现页面引用了图片 / 视频 / 动效 / 字体等资源,必须从旧项目对应路径拷贝到新项目,**禁止仅报告“缺少资源”而不动手拷贝**
767
+ g. **Token 合法性自检** — 写完代码后,扫描本次生成的所有 Tailwind class,确认每个都在新项目 `tokens.theme.css` 中有对应变量或是 Tailwind 标准 utility。若发现无效 class(如 `bg-data-8` 在新项目不存在),必须立即替换为有效的替代方案
768
+ h. 完成后更新 `.teamix-evo/migrate-plan.md`:将对应条目标记为 `[x]`,同步更新顶部 Progress(Completed 计数 + Current phase + Last updated)
769
+ i. 向用户汇报进度,格式:`✅ <条目名> 完成(<已完成数>/<总数>)| 当前阶段:<Phase 名>`
770
+ 12. **验证** — 每完成一个页面后:
610
771
  - 列出该页面的功能检查点(从旧代码提取的关键交互:CRUD / 筛选 / 分页 / 权限 / 弹窗流程等)
611
772
  - 若有截图,建议用户对比新旧页面视觉差异
612
773
  - 跑 `pnpm typecheck` 确认零类型错误
613
774
 
614
775
  #### Phase D · 全量 Review
615
776
 
616
- 12. **全部页面完成后** — 当 Progress 中 Completed 等于总条目数时:
777
+ 13. **全部页面完成后** — 当 Progress 中 Completed 等于总条目数时:
617
778
  - 将 Status 更新为 `review`
618
779
  - 向用户提示:"所有页面已迁移完成,建议进行一轮整体 review。是否现在开始?"
619
780
  - 用户确认后,逐页面列出 review 检查点:
@@ -622,38 +783,43 @@ npx teamix-evo ui promote-to-biz --staging-dir <path> # 指定 staging 目录
622
783
  - 路由可达性(所有页面是否串通)
623
784
  - 全局一致性(Layout / 导航 / 权限守卫是否统一)
624
785
  - review 全部通过后,将 Status 更新为 `done`
625
- 13. **会话恢复** — 若 AI 进入新会话:
626
- - 读 `.teamix-evo/migrate-plan.md` 顶部 Progress 区块快速获取整体进度(Status / Completed / Current phase)
627
- - `in-progress`定位第一个 `[ ]` 条目,从断点处继续
786
+ 14. **会话恢复** — 若 AI 进入新会话:
787
+ - 读 `.teamix-evo/migrate-plan.md` 文件顶部包含「冷启动恢复指南」,按其 6 步顺序恢复上下文
788
+ - 读截图目录(MetadataScreenshots dir),确认已有哪些页面的截图可作为视觉参考
789
+ - `in-progress` → 定位第一个 `[ ]` 条目,确认三轨材料(源码 + wiki + 截图)就绪后从断点处继续
628
790
  - `review` → 进入 Phase D review 流程
629
791
  - `done` → 告知用户迁移已完成
630
792
 
631
793
  ### 身份划分清单
632
794
 
633
795
  - **AI(本 skill — manage)**:询问路径 → 检测 repo-wiki → 生成/管理 `migrate-plan.md` → 进度追踪 → 会话恢复定位。
634
- - **AI(`teamix-evo-code-<variant>`)**:生成每页实际代码时遵循 reuse-first / file-structure / api-layering 规范。Phase C 执行时自动应用。
635
- - **AI(`teamix-evo-design-<variant>`)**:页面级布局 / 视觉设计决策。迁移新页面时并行参考。
796
+ - **AI(`teamix-evo-code-{variant}`)**:生成每页实际代码时遵循 reuse-first / file-structure / api-layering 规范。Phase C 执行时自动应用。
797
+ - **AI(`teamix-evo-design-{variant}`)**:页面级布局 / 视觉设计决策。迁移新页面时并行参考。
636
798
  - **用户**:提供旧项目路径 / 确认 repo-wiki 已生成 / 审核迁移计划 / 可选提供运行 URL / 确认每页实现结果。
637
799
  - **CLI**:无新命令。执行阶段复用 `teamix-evo ui add <id>`(若发现有未安装的 UI 组件需要补装)。
638
800
 
639
801
  ### 边缘情况
640
802
 
641
- | 情况 | 处理 |
642
- | ---- | ---- |
643
- | repo-wiki 不存在 | 提示用户先在旧项目执行 repo-wiki 生成命令 |
644
- | repo-wiki 不完整(缺路由/API 等) | 直接读旧项目源码补充(路由配置 / package.json / 目录结构) |
645
- | 旧项目是 Vue / Angular(非 React) | 正常分析,概念映射无框架壁垒(路由→路由、组件→组件),新项目统一生成 React |
646
- | 旧项目是 monorepo | 让用户指定具体 package 路径作为 `<old-path>` |
647
- | 页面极复杂(>500 行、多子路由) | 拆为多个 checklist 子条目,标记 complexity: complex |
648
- | `.teamix-evo/migrate-plan.md` 已存在 | 询问用户三选一:(a) 恢复进度继续、(b) 重新生成(覆盖)、(c) 查看当前计划 |
649
- | 新项目已有部分页面 | 跳过已存在的页面,或标记为 verify-only |
650
- | token 预算不足以完成全部分析 | 停止读取,基于已有信息生成部分计划,标注"后续会话补充" |
803
+ | 情况 | 处理 |
804
+ | ------------------------------------ | ------------------------------------------------------------------------------ |
805
+ | repo-wiki 不存在 | 提示用户先在旧项目执行 repo-wiki 生成命令 |
806
+ | 截图目录为空或缺少页面截图 | 暂停并提示用户补充截图,不得跳过或自行执行截图 |
807
+ | repo-wiki 不完整(缺路由/API 等) | 直接读旧项目源码补充(路由配置 / package.json / 目录结构) |
808
+ | 旧项目是 Vue / Angular(非 React) | 正常分析,概念映射无框架壁垒(路由 路由、组件 组件),新项目统一生成 React |
809
+ | 旧项目是 monorepo | 让用户指定具体 package 路径作为 `<old-path>` |
810
+ | 页面极复杂(>500 行、多子路由) | 拆为多个 checklist 子条目,标记 complexity: complex |
811
+ | `.teamix-evo/migrate-plan.md` 已存在 | 询问用户三选一:(a) 恢复进度继续、(b) 重新生成(覆盖)、(c) 查看当前计划 |
812
+ | 新项目已有部分页面 | 跳过已存在的页面,或标记为 verify-only |
813
+ | token 预算不足以完成全部分析 | 停止读取,基于已有信息生成部分计划,标注"后续会话补充" |
651
814
 
652
815
  ### 不要
653
816
 
654
817
  - **不要**在无 repo-wiki 且源码量大时一次性读完全部文件 — 分批按需读取。
655
818
  - **不要**跳过 Phase B 直接写代码 — 必须先生成 `migrate-plan.md` 让用户审核确认。
656
819
  - **不要**复制旧项目的组件源码到新项目 — 走 reuse-first 查 `@teamix-evo/ui` 注册表匹配。
820
+ - **但可以修改业务组件(biz-ui)** — `src/components/biz-ui/` 下的组件(如 `op-sidebar`、`page-header`、`op-layout` 等)是 `frozen` 策略,用户拥有所有权。当现有业务组件无法满足迁移需求(缺少 slot、不支持某布局、缺少交互能力)时,AI **应当直接修改 biz-ui 组件源码**,而不是在页面层面 hack。修改前告知用户“当前 biz-ui 组件 <X> 不支持 <能力>,我将直接增强它”。
821
+ - ✅ 可修改:`src/components/biz-ui/**`(用户拥有,frozen)
822
+ - ❌ 不可修改:`src/components/ui/**`(teamix-evo 接管,需走 `ui upgrade`)
657
823
  - **不要**搬迁旧项目的样式体系(CSS-in-JS / less / sass / antd theme) — 新项目用 design tokens + Tailwind v4。
658
824
  - **不要**原样搬入旧 node_modules 依赖 — 仅迁移业务必需的第三方库(如图表库、富文本编辑器)。
659
825
  - **不要**在用户未确认计划前开始实现。
@@ -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 | 持久 | 含创建引导按钮 |
@@ -1,94 +0,0 @@
1
- # 高级筛选列表页 (advanced-filter)
2
-
3
- > 路由自 `../SKILL.md`
4
- > 布局模式: 模式D+ (高级筛选)
5
- > 核心差异: 可展开的高级筛选面板 + 多条件组合
6
-
7
- ## 1. 布局骨架
8
-
9
- ```
10
- ┌──────────┬──────────────────────────────────────────────┤
11
- │ Sidebar │ PageHeader: 标题(18px/medium) [描述*] │
12
- │ │ ───────────────────────── │
13
- │ │ ActionToolbar: [创建] + [全部▼][输入...]🔍 [高级筛选▾]│
14
- │ │ ───────────────────────── │
15
- │ │ ┌─── AdvancedFilterPanel ───────────────┐ │
16
- │ │ │ 条件1: [Select] [Input] │ │
17
- │ │ │ 条件2: [Select] [Input] │ │
18
- │ │ │ 条件3: [Select] [Input] │ │
19
- │ │ │ [确认] [清空] │ │
20
- │ │ └───────────────────────────────────────┘ │
21
- │ │ ───────────────────────── │
22
- │ │ DataTable (固定列: 左选择框+ID, 右操作) │
23
- │ │ ───────────────────────── │
24
- │ │ BulkActionBar (选中时内嵌显示) │
25
- │ │ ───────────────────────── │
26
- │ │ Pagination │
27
- └──────────┴──────────────────────────────────────────────┘
28
- ```
29
-
30
- ## 2. 核心差异
31
-
32
- | 维度 | 标准列表 | 高级筛选列表 |
33
- |------|----------|-------------|
34
- | 筛选方式 | SearchCombo | **SearchCombo + AdvancedFilterPanel** |
35
- | 筛选条件数 | 1个维度 | **多条件组合(通常2-5个)** |
36
- | AdvancedFilterPanel | 无 | **必需** |
37
- | FilterTag | 可选 | **必需**(展示已选条件) |
38
-
39
- ## 3. AdvancedFilterPanel 交互规范
40
-
41
- | 交互 | 行为 |
42
- |------|------|
43
- | 打开面板 | 点击"高级筛选"按钮,展开面板 |
44
- | 关闭面板 | 收起面板,恢复基础 SearchCombo |
45
- | 添加条件 | 点击"添加条件",新增一行筛选条件 |
46
- | 删除条件 | 点击条件行右侧 ×,移除该条件 |
47
- | 条件间关系 | **AND 关系**(所有条件同时生效) |
48
- | 确认筛选 | 点击"确认",应用所有条件,刷新列表 |
49
- | 清空筛选 | 点击"清空",清除所有条件 |
50
- | 面板位置 | ActionToolbar 下方,DataTable 上方 |
51
-
52
- ## 4. FilterTag 管理
53
-
54
- - 已选筛选项以 **FilterTag** 形式展示在 ActionToolbar 区域
55
- - 每个 FilterTag 可单独移除(点击 ×)
56
- - 筛选条件清空后,FilterTag 区域隐藏(display: none)
57
- - 高级筛选条件的 FilterTag 支持"清空全部"操作
58
-
59
- ## 5. 引用共享规则
60
-
61
- | 共享规则 | 路径 | 说明 |
62
- |----------|------|------|
63
- | 表格列元规则 | `../_shared/column-meta-rules.md` | 列元规则(显隐/拖拽/排序)
64
- | 产品列定义 | `products/{产品}/columns.json` | 具体列名/宽度/类型 |
65
- | 操作列规范 | `../_shared/action-column-spec.md` | 操作列结构、行为 |
66
- | 状态-操作模式 | `../_shared/state-action-pattern.md` | 状态驱动操作元规则
67
- | 产品状态机 | `products/{产品}/states.json` | 具体状态/操作可用性 |
68
-
69
- > DataTable、BulkActionBar、Pagination、ActionToolbar(不含高级筛选按钮)等组件及交互行为与标准列表页一致,不再重复。
70
-
71
- ## 6. 与 PageContainer 模式对照
72
-
73
- > 布局模式定义见 `../../../rules/layout-rules.json`
74
-
75
- 高级筛选列表使用 **模式D+**:
76
- ```
77
- PageContainer → ContentWrapper → PageHeader + ActionToolbar + AdvancedFilterPanel(可展开) + DataTable + BulkActionBar + Pagination
78
- ```
79
-
80
- - "高级筛选"按钮位于 ActionToolbar 右侧
81
- - 展开后显示多条件组合面板(条件1/2/3 + 确认/清空)
82
- - 收起后恢复基础 SearchCombo
83
-
84
- ## 7. 验证清单
85
-
86
- > 通用检查项见 `../../../docs/validation-workflow.md` 验证清单。此处仅列出本模式差异项。
87
-
88
- | 验证项 | 检查点 | 目标 |
89
- |--------|--------|------|
90
- | AdvancedFilterPanel | 展开/收起正常 | 正确 |
91
- | 多条件组合 | AND 关系 | 正确 |
92
- | 条件添加/删除 | 增删条件行正常 | 正确 |
93
- | 确认/清空 | 确认后刷新,清空后恢复 | 正确 |
94
- | FilterTag | 展示已选条件,可单独移除 | 正确 |