@devflow-tools/plugin-animation 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,eAAO,MAAM,eAAe,EAAE,aA8H7B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,eAAO,MAAM,eAAe,EAAE,aAi8B7B,CAAC"}
package/dist/index.js CHANGED
@@ -64,43 +64,878 @@ export const animationPlugin = {
64
64
  workflow: {
65
65
  steps: [],
66
66
  templates: [
67
+ // ── 动画审计 ──
67
68
  {
68
69
  name: "animation-audit",
69
70
  description: "动画审计:性能检查 → 可访问性 → 实现质量",
70
- version: "1.0.0",
71
+ version: "2.0.0",
71
72
  steps: [
72
- { id: "scan-animations", description: "扫描项目中所有动画实现(CSS/keyframes/Framer/GSAP/Lottie)", type: "simple", timeout: 10000 },
73
- { id: "check-gpu", description: "检查动画是否使用 GPU 加速属性(transform/opacity)", type: "simple", depends: ["scan-animations"], timeout: 10000 },
74
- { id: "check-performance", description: "检查动画 FPS(是否保持 60fps)和 Paint 区域", type: "simple", depends: ["scan-animations"], timeout: 15000 },
75
- { id: "check-accessibility", description: "检查 prefers-reduced-motion 支持", type: "simple", depends: ["scan-animations"], timeout: 5000 },
76
- { id: "generate-report", description: "生成动画审计报告(性能问题 + 可访问性 + 改进建议)", type: "llm", depends: ["check-gpu", "check-performance", "check-accessibility"], timeout: 15000 },
77
- { id: "fix-animations", description: "修复动画问题(GPU 加速替代 + 减弱动画方案)", type: "llm", depends: ["generate-report"], timeout: 20000 },
73
+ {
74
+ id: "scan-animations",
75
+ title: "扫描项目中所有动画实现",
76
+ instruction: [
77
+ "## 扫描项目中所有动画实现",
78
+ "",
79
+ "定位项目中 CSS keyframes、CSS transition、Framer Motion、GSAP、Lottie 等所有动画代码。",
80
+ "",
81
+ "**执行动作**:",
82
+ "1. 扫描 CSS `@keyframes` 与 `animation:` 声明:",
83
+ " ```bash",
84
+ " grep -rnE '@keyframes|animation:|animation-name:' src/ --include='*.css' --include='*.scss' --include='*.module.css'",
85
+ " ```",
86
+ "2. 扫描 CSS `transition:` 声明:",
87
+ " ```bash",
88
+ " grep -rnE 'transition:' src/ --include='*.css' --include='*.scss' --include='*.module.css'",
89
+ " ```",
90
+ "3. 扫描 Framer Motion 用法(`motion.`、`AnimatePresence`、`useAnimation`):",
91
+ " ```bash",
92
+ " grep -rnE 'motion\\.|AnimatePresence|useAnimation|useMotionValue|useTransform|staggerChildren|whileHover|whileTap' src/ --include='*.tsx' --include='*.jsx' --include='*.ts'",
93
+ " ```",
94
+ "4. 扫描 GSAP 用法(`gsap.`、`TweenMax`、`TimelineMax`、`ScrollTrigger`):",
95
+ " ```bash",
96
+ " grep -rnE 'gsap\\.|TweenMax|TweenLite|TimelineMax|ScrollTrigger' src/ --include='*.ts' --include='*.tsx' --include='*.js'",
97
+ " ```",
98
+ "5. 扫描 Lottie 用法(`lottie-web`、`@lottiefiles/react-lottie-player`、`.json` 动画资源):",
99
+ " ```bash",
100
+ " grep -rnE 'lottie|@lottiefiles|dotlottie' src/ --include='*.ts' --include='*.tsx' --include='*.js'",
101
+ " find src/ -name '*.json' -path '*animation*' -o -name '*.json' -path '*lottie*'",
102
+ " ```",
103
+ "6. 记录每种动画实现的文件位置、行数、类型",
104
+ "",
105
+ "**产出格式**:",
106
+ "```",
107
+ "animation_inventory:",
108
+ " css_keyframes: [{ file: 'src/styles/hero.css', line: 12, name: 'fadeIn' }]",
109
+ " css_transitions: [{ file: 'src/components/Button.module.css', line: 5, property: 'background-color' }]",
110
+ " framer_motion: [{ file: 'src/components/Modal.tsx', line: 8, api: 'AnimatePresence' }]",
111
+ " gsap: [{ file: 'src/utils/intro.ts', line: 1, api: 'gsap.from' }]",
112
+ " lottie: [{ file: 'src/components/Loader.tsx', line: 3, json: 'src/assets/loader.json' }]",
113
+ "total_animations: 15",
114
+ "```",
115
+ ].join("\n"),
116
+ suggestedTools: ["Bash", "Read"],
117
+ output: "项目中所有动画实现的分类清单(CSS/Framer/GSAP/Lottie)",
118
+ },
119
+ {
120
+ id: "check-gpu",
121
+ title: "检查动画是否使用 GPU 加速属性",
122
+ instruction: [
123
+ "## 检查动画是否使用 GPU 加速属性",
124
+ "",
125
+ "逐个检查 `scan-animations` 发现的动画,确认是否仅使用 `transform` 和 `opacity`(composite-only 属性)。",
126
+ "",
127
+ "**执行动作**:",
128
+ "1. 对每个 CSS `@keyframes` 块,检查动画属性是否在白名单内:",
129
+ " - ✅ 白名单(GPU composite-only):`transform`、`opacity`、`filter`、`backdrop-filter`",
130
+ " - ❌ 黑名单(CPU 触发 layout/paint):`width`、`height`、`top`、`right`、`bottom`、`left`、`margin`、`padding`、`background-position`、`color`",
131
+ " ```bash",
132
+ " # 查找 keyframes 中动画化了非 composite-only 属性",
133
+ " awk '/@keyframes/,/^}/' src/**/*.css | grep -nE 'width|height|top|left|right|bottom|margin|padding'",
134
+ " ```",
135
+ "2. 对每个 CSS `transition:`,检查过渡的属性名:",
136
+ " ```bash",
137
+ " grep -rnE 'transition:' src/ --include='*.css' --include='*.scss' | grep -vE 'transform|opacity'",
138
+ " ```",
139
+ "3. 对 Framer Motion,检查 `animate=` 与 `variants` 中使用的属性:",
140
+ " ```bash",
141
+ " grep -rnE 'animate=\\{|variants=\\{|x:|y:|scale:|rotate:|opacity:' src/ --include='*.tsx' --include='*.jsx'",
142
+ " # 警惕:width/height/top/left 在 framer 中也会触发 layout",
143
+ " grep -rnE 'animate=.*?(width|height|top|left)' src/ --include='*.tsx' --include='*.jsx'",
144
+ " ```",
145
+ "4. 检查 `will-change` 使用是否合理(仅用于即将动画的元素,不要常驻):",
146
+ " ```bash",
147
+ " grep -rnE 'will-change:' src/ --include='*.css' --include='*.scss'",
148
+ " ```",
149
+ "5. 每个违规动画标记为 high/medium/low 严重度(layout 触发 = high)",
150
+ "",
151
+ "**产出格式**:",
152
+ "```",
153
+ "gpu_audit:",
154
+ " compliant: [{ file: 'hero.css', line: 12, property: 'transform: translateY', status: 'gpu' }]",
155
+ " non_compliant: [{ file: 'card.css', line: 5, property: 'width', trigger: 'layout', severity: 'high' }]",
156
+ " will_change_misuse: [{ file: 'global.css', line: 1, issue: 'will-change on every element' }]",
157
+ "compliance_rate: '60%'",
158
+ "```",
159
+ ].join("\n"),
160
+ suggestedTools: ["Bash", "Read"],
161
+ output: "GPU 加速合规清单、违规动画(触发 layout/paint)列表",
162
+ depends: ["scan-animations"],
163
+ },
164
+ {
165
+ id: "check-performance",
166
+ title: "检查动画 FPS 与 Paint 区域",
167
+ instruction: [
168
+ "## 检查动画是否保持 60fps 并分析 Paint 区域",
169
+ "",
170
+ "使用 Chrome DevTools 评估每个动画的运行时性能。",
171
+ "",
172
+ "**执行动作**:",
173
+ "1. 打开 Chrome DevTools → Rendering 面板,启用以下选项:",
174
+ " - 「Paint flashing」:显示重绘区域(绿色闪烁)",
175
+ " - 「FPS meter」:实时帧率显示",
176
+ " - 「Layer borders」:显示合成层边界",
177
+ "2. 触发每个动画,观察:",
178
+ " - FPS 是否稳定 ≥ 58fps(目标 60fps)",
179
+ " - 是否出现大面积绿色 paint flash",
180
+ " - 合成层数量是否合理(< 50 层)",
181
+ "3. 对可疑动画使用 Performance 面板录制:",
182
+ " - DevTools → Performance → Record(触发动画 5-10 秒)→ Stop",
183
+ " - 查看 Summary 饼图中 Purple(Scripting)和 Green(Paint)占比",
184
+ " - 目标:单帧 Main thread 耗时 ≤ 16ms",
185
+ "4. 使用 Layers 面板检查合成层:",
186
+ " - DevTools → More tools → Layers",
187
+ " - 检查动画元素是否被提升到独立合成层",
188
+ " - 若动画未提升且持续触发 paint,应添加 `will-change` 或 `transform: translateZ(0)`",
189
+ "5. Lottie 专项检查:",
190
+ " ```bash",
191
+ " find src/ -name '*.json' -path '*lottie*' -exec wc -c {} \\; | awk '$1 > 51200 {print \"Oversized: \"$2\" \"$1\" bytes\"}'",
192
+ " ```",
193
+ " - 检查 Lottie JSON 文件大小是否 > 50KB",
194
+ " - 检查 `renderer` 参数是否使用 `svg`(更省性能)而非 `canvas`",
195
+ "",
196
+ "**产出格式**:",
197
+ "```",
198
+ "performance_audit:",
199
+ " animations: [",
200
+ " { id: 'fadeIn', fps_avg: 60, paint_area: 'small', status: 'pass' },",
201
+ " { id: 'slideCard', fps_avg: 42, paint_area: 'full-screen', status: 'fail', reason: 'animates width' },",
202
+ " { id: 'lottie-loader', file_size_kb: 78, status: 'warn', reason: 'file > 50KB' }",
203
+ " ]",
204
+ " failing_count: 2",
205
+ " oversized_lottie: ['src/assets/hero.json (78KB)']",
206
+ "```",
207
+ ].join("\n"),
208
+ suggestedTools: ["Bash", "Read"],
209
+ output: "每个动画的 FPS、Paint 区域、Lottie 文件大小审计结果",
210
+ depends: ["scan-animations"],
211
+ },
212
+ {
213
+ id: "check-accessibility",
214
+ title: "检查 prefers-reduced-motion 支持",
215
+ instruction: [
216
+ "## 检查 prefers-reduced-motion 媒体查询支持",
217
+ "",
218
+ "验证项目是否尊重用户的「减弱动态效果」系统偏好。",
219
+ "",
220
+ "**执行动作**:",
221
+ "1. 统计项目中 `prefers-reduced-motion` 的使用数量:",
222
+ " ```bash",
223
+ " grep -rn 'prefers-reduced-motion' src/ --include='*.css' --include='*.scss' --include='*.module.css'",
224
+ " ```",
225
+ "2. 对 Framer Motion 项目,检查是否使用 `useReducedMotion` hook:",
226
+ " ```bash",
227
+ " grep -rn 'useReducedMotion\\|reducedMotion' src/ --include='*.tsx' --include='*.jsx' --include='*.ts'",
228
+ " ```",
229
+ "3. 对 GSAP 项目,检查是否使用 `gsap.matchMedia()` 或 `prefers-reduced-motion` 判断:",
230
+ " ```bash",
231
+ " grep -rn 'matchMedia\\|reduced-motion' src/ --include='*.ts' --include='*.js'",
232
+ " ```",
233
+ "4. 比较「总动画数」vs「支持 reduced-motion 的动画数」,得出覆盖率",
234
+ "5. 评估每个动画的 reduced-motion 降级方案:",
235
+ " - 入场动画:改为 `opacity` 淡入(无位移/缩放)",
236
+ " - 循环动画:完全禁用或替换为静态状态",
237
+ " - 交互动效:保留基础 hover/focus 状态变化,禁用复杂过渡",
238
+ " - 滚动驱动动画:完全禁用",
239
+ "",
240
+ "**产出格式**:",
241
+ "```",
242
+ "accessibility_audit:",
243
+ " total_animations: 15",
244
+ " supports_reduced_motion: 4",
245
+ " coverage_rate: '27%'",
246
+ " missing_locations: [",
247
+ " { file: 'src/components/Hero.tsx', line: 8, animation: 'framer entrance', fallback: 'MISSING' },",
248
+ " { file: 'src/styles/card.css', line: 12, animation: '@keyframes fadeIn', fallback: 'MISSING' }",
249
+ " ]",
250
+ " recommended_fallbacks: [",
251
+ " { animation: 'slideIn', fallback: 'opacity: 0 -> 1 only' },",
252
+ " { animation: 'bounce', fallback: 'disable entirely' }",
253
+ " ]",
254
+ "```",
255
+ ].join("\n"),
256
+ suggestedTools: ["Bash", "Read"],
257
+ output: "prefers-reduced-motion 覆盖率、缺失位置、建议降级方案",
258
+ depends: ["scan-animations"],
259
+ },
260
+ { id: "generate-report", stepTemplate: "generate-report", depends: ["check-gpu", "check-performance", "check-accessibility"] },
261
+ {
262
+ id: "fix-animations",
263
+ title: "修复动画问题",
264
+ instruction: [
265
+ "## 修复动画问题(GPU 加速替代 + 减弱动画方案)",
266
+ "",
267
+ "根据 `generate-report` 中列出的问题,逐个修复。",
268
+ "",
269
+ "**执行动作**:",
270
+ "1. **CPU → GPU 替换**(对 `check-gpu` 中 non-compliant 项):",
271
+ " - `width/height` 动画 → 使用 `transform: scale()`",
272
+ " ```css",
273
+ " /* 修改前 */",
274
+ " .box { transition: width 300ms; }",
275
+ " .box.open { width: 400px; }",
276
+ " /* 修改后 */",
277
+ " .box { transform: scaleX(0.5); transform-origin: left; transition: transform 300ms ease-out; }",
278
+ " .box.open { transform: scaleX(1); }",
279
+ " ```",
280
+ " - `top/left/right/bottom` 动画 → 使用 `transform: translate()`",
281
+ " ```css",
282
+ " /* 修改前 */",
283
+ " .modal { transition: top 300ms; top: -100%; }",
284
+ " .modal.open { top: 0; }",
285
+ " /* 修改后 */",
286
+ " .modal { transform: translateY(-100%); transition: transform 300ms ease-out; }",
287
+ " .modal.open { transform: translateY(0); }",
288
+ " ```",
289
+ " - `margin/padding` 动画 → 使用 `transform: translate()`",
290
+ "2. **添加 will-change**(对 `check-performance` 中低 fps 项):",
291
+ " ```css",
292
+ " /* 仅在动画即将开始前启用 */",
293
+ " .animating { will-change: transform, opacity; }",
294
+ " /* 动画结束后移除 */",
295
+ " .animating.done { will-change: auto; }",
296
+ " ```",
297
+ "3. **添加 prefers-reduced-motion 降级**(对 `check-accessibility` 中缺失项):",
298
+ " ```css",
299
+ " @media (prefers-reduced-motion: reduce) {",
300
+ " *, *::before, *::after {",
301
+ " animation-duration: 0.01ms !important;",
302
+ " animation-iteration-count: 1 !important;",
303
+ " transition-duration: 0.01ms !important;",
304
+ " scroll-behavior: auto !important;",
305
+ " }",
306
+ " }",
307
+ " ```",
308
+ " - 对 Framer Motion 使用 `useReducedMotion()`:",
309
+ " ```tsx",
310
+ " const reduceMotion = useReducedMotion();",
311
+ " <motion.div animate={reduceMotion ? {} : { x: 100 }} />",
312
+ " ```",
313
+ "4. **React 退出动画**(对缺失退出动画的组件):",
314
+ " ```tsx",
315
+ " <AnimatePresence>",
316
+ " {isVisible && <motion.div exit={{ opacity: 0, y: -20 }} />}",
317
+ " </AnimatePresence>",
318
+ " ```",
319
+ "5. **Lottie 文件优化**(对 oversized 项):",
320
+ " - 使用 SVGO 压缩源 SVG 后重新导出",
321
+ " - 使用 `@lottiefiles/react-lottie-player` 的 `renderer: 'svg'`",
322
+ "",
323
+ "**产出格式**:",
324
+ "```",
325
+ "fixes_applied: [",
326
+ " { file: 'card.css', line: 5, fix_type: 'cpu_to_gpu', before: 'width', after: 'transform: scaleX' },",
327
+ " { file: 'Modal.tsx', line: 12, fix_type: 'reduced_motion', before: 'missing', after: 'useReducedMotion added' },",
328
+ " { file: 'Loader.tsx', line: 3, fix_type: 'lottie_optimize', before: '78KB', after: '42KB' }",
329
+ "]",
330
+ "total_fixes: 8",
331
+ "files_modified: ['src/styles/card.css', 'src/components/Modal.tsx']",
332
+ "```",
333
+ ].join("\n"),
334
+ suggestedTools: ["Read", "Bash", "Write"],
335
+ output: "应用的修复清单(CPU→GPU、will-change、reduced-motion、Lottie 优化)",
336
+ depends: ["generate-report"],
337
+ },
78
338
  ],
79
339
  triggers: [{ type: "cli", command: "audit:animation" }],
80
340
  },
341
+ // ── 新建动画 ──
81
342
  {
82
343
  name: "new-animation",
83
344
  description: "新建动画:需求分析 → 选型建议 → 实现 → 性能验证",
84
- version: "1.0.0",
345
+ version: "2.0.0",
85
346
  steps: [
86
- { id: "analyze-requirements", description: "分析动画需求(入场/退场/交互动效/滚动/编排)", type: "llm", timeout: 10000 },
87
- { id: "suggest-approach", description: "建议实现方案(CSS/Framer Motion/GSAP/Lottie 选型)", type: "llm", depends: ["analyze-requirements"], timeout: 10000 },
88
- { id: "implement-animation", description: "实现动画(含 GPU 加速 + 缓动 + 响应式)", type: "llm", depends: ["suggest-approach"], timeout: 15000 },
89
- { id: "add-reduced-motion", description: "添加 prefers-reduced-motion 减弱动画", type: "simple", depends: ["implement-animation"], timeout: 5000 },
90
- { id: "performance-check", description: "验证动画 60fps + 检查不会触发 layout", type: "simple", depends: ["implement-animation"], timeout: 10000 },
347
+ {
348
+ id: "analyze-requirements",
349
+ title: "分析动画需求",
350
+ instruction: [
351
+ "## 分析动画需求",
352
+ "",
353
+ "明确动画的类型、触发时机、目标元素、时长与缓动。",
354
+ "",
355
+ "**执行动作**:",
356
+ "1. 确定动画类型(五选一或多选):",
357
+ " - **入场动画**:元素初次出现(`initial` → `animate`)",
358
+ " - **退场动画**:元素离开 DOM(React `AnimatePresence` + `exit`)",
359
+ " - **交互动效**:hover / tap / focus 反馈(`whileHover` / `whileTap`)",
360
+ " - **滚动驱动动画**:元素进入视口时触发动画(`whileInView` / `useScroll`)",
361
+ " - **编排动画**:多个子元素依次进入(`staggerChildren` / `stagger`)",
362
+ "2. 确定目标元素与动画范围:",
363
+ " ```bash",
364
+ " grep -rn '<ComponentName' src/ --include='*.tsx' --include='*.jsx' | head -20",
365
+ " ```",
366
+ "3. 确定时长规范:",
367
+ " - 过渡(hover / tap):200-300ms",
368
+ " - 入场(mount):300-500ms",
369
+ " - 退场(unmount):200-300ms(比入场略快)",
370
+ " - 编排总时长:< 1s",
371
+ "4. 确定缓动函数:",
372
+ " - 入场:`ease-out`(快速开始,缓慢到达)",
373
+ " - 退场:`ease-in`(缓慢开始,加速离开)",
374
+ " - 循环:`ease-in-out`",
375
+ " - 弹性:`cubic-bezier(0.34, 1.56, 0.64, 1)`",
376
+ "5. 确定是否需要响应 prefers-reduced-motion",
377
+ "",
378
+ "**产出格式**:",
379
+ "```",
380
+ "requirements:",
381
+ " animation_type: ['entrance', 'exit', 'interaction']",
382
+ " target_element: '.modal / <Modal /> component'",
383
+ " trigger: 'click / mount / hover'",
384
+ " duration: { entrance: '400ms', exit: '250ms', hover: '200ms' }",
385
+ " easing: { entrance: 'ease-out', exit: 'ease-in' }",
386
+ " orchestrated: false",
387
+ " scroll_driven: false",
388
+ " must_support_reduced_motion: true",
389
+ "```",
390
+ ].join("\n"),
391
+ suggestedTools: ["Read", "Bash"],
392
+ output: "动画类型、目标元素、时长、缓动、触发方式的详细需求文档",
393
+ },
394
+ {
395
+ id: "suggest-approach",
396
+ title: "建议实现方案",
397
+ instruction: [
398
+ "## 建议实现方案(CSS / Framer Motion / GSAP / Lottie 选型)",
399
+ "",
400
+ "基于需求选择最合适的动画技术栈。",
401
+ "",
402
+ "**决策矩阵**:",
403
+ "| 需求场景 | 推荐方案 | 原因 |",
404
+ "|---|---|---|",
405
+ "| 简单的 hover / transition | **CSS transition** | 零依赖、compositor 执行、最轻量 |",
406
+ "| 复杂状态过渡 + 退出动画 + React | **Framer Motion** | 声明式 API、AnimatePresence、layout 动画 |",
407
+ "| 时间线编排 + 精确控制 | **GSAP** | Timeline API、ScrollTrigger、性能极佳 |",
408
+ "| 复杂插画 / 品牌动效 | **Lottie** | 设计稿导出、跨平台一致、矢量可缩放 |",
409
+ "| 滚动驱动视差 | **Framer Motion (useScroll)** 或 **GSAP ScrollTrigger** | 声明式 / 功能丰富 |",
410
+ "",
411
+ "**执行动作**:",
412
+ "1. 检查项目已有的动画依赖:",
413
+ " ```bash",
414
+ " grep -E 'framer-motion|gsap|lottie' package.json",
415
+ " ```",
416
+ "2. 根据决策矩阵选择方案,优先复用项目已有依赖",
417
+ "3. 若需新增依赖,评估包体积:",
418
+ " ```bash",
419
+ " # bundlephobia 查询(用 curl 模拟)",
420
+ " echo 'framer-motion: ~55KB gzip, gsap: ~25KB gzip, lottie-web: ~60KB gzip'",
421
+ " ```",
422
+ "4. 列出所选方案需要使用的 API 清单",
423
+ "",
424
+ "**产出格式**:",
425
+ "```",
426
+ "recommended_approach:",
427
+ " primary: 'Framer Motion'",
428
+ " rationale: 'React 项目,需要 AnimatePresence 处理退出动画,项目已安装'",
429
+ " apis_to_use: ['motion.div', 'AnimatePresence', 'variants', 'useReducedMotion']",
430
+ " alternative: 'CSS transition + @keyframes'",
431
+ " new_dependency: null",
432
+ " estimated_bundle_impact: '0KB (already installed)'",
433
+ "```",
434
+ ].join("\n"),
435
+ suggestedTools: ["Read", "Bash"],
436
+ output: "推荐的动画技术方案、理由、API 清单",
437
+ depends: ["analyze-requirements"],
438
+ },
439
+ {
440
+ id: "implement-animation",
441
+ title: "实现动画",
442
+ instruction: [
443
+ "## 实现动画(含 GPU 加速 + 缓动 + 响应式)",
444
+ "",
445
+ "根据 `suggest-approach` 的方案实现动画代码。",
446
+ "",
447
+ "**执行动作**:",
448
+ "1. **CSS 实现**(若推荐方案为 CSS):",
449
+ " ```css",
450
+ " .element {",
451
+ " /* 初始状态 */",
452
+ " opacity: 0;",
453
+ " transform: translateY(20px);",
454
+ " /* 仅动画 composite-only 属性 */",
455
+ " transition: opacity 400ms ease-out, transform 400ms ease-out;",
456
+ " }",
457
+ " .element.visible {",
458
+ " opacity: 1;",
459
+ " transform: translateY(0);",
460
+ " }",
461
+ " ```",
462
+ "",
463
+ "2. **Framer Motion 实现**(若推荐方案为 Framer):",
464
+ " ```tsx",
465
+ " import { motion, AnimatePresence } from 'framer-motion';",
466
+ " import { useReducedMotion } from 'framer-motion';",
467
+ "",
468
+ " const reduceMotion = useReducedMotion();",
469
+ "",
470
+ " const variants = {",
471
+ " hidden: { opacity: 0, y: 20 },",
472
+ " visible: { opacity: 1, y: 0, transition: { duration: 0.4, ease: 'easeOut' } },",
473
+ " exit: { opacity: 0, y: -20, transition: { duration: 0.25, ease: 'easeIn' } },",
474
+ " };",
475
+ "",
476
+ " <AnimatePresence>",
477
+ " {isVisible && (",
478
+ " <motion.div",
479
+ " variants={variants}",
480
+ " initial={reduceMotion ? false : 'hidden'}",
481
+ " animate={reduceMotion ? { opacity: 1 } : 'visible'}",
482
+ " exit={reduceMotion ? { opacity: 0 } : 'exit'}",
483
+ " />",
484
+ " )}",
485
+ " </AnimatePresence>",
486
+ " ```",
487
+ "",
488
+ "3. **强制 GPU 加速**(对复杂动画):",
489
+ " ```css",
490
+ " .animated-element {",
491
+ " transform: translateZ(0); /* 强制提升为合成层 */",
492
+ " will-change: transform, opacity;",
493
+ " }",
494
+ " ```",
495
+ "",
496
+ "4. **编排动画**(多个子元素依次进入):",
497
+ " ```tsx",
498
+ " const container = {",
499
+ " hidden: { opacity: 0 },",
500
+ " visible: {",
501
+ " opacity: 1,",
502
+ " transition: { staggerChildren: 0.1 }",
503
+ " },",
504
+ " };",
505
+ " const item = {",
506
+ " hidden: { opacity: 0, y: 10 },",
507
+ " visible: { opacity: 1, y: 0 },",
508
+ " };",
509
+ " ```",
510
+ "",
511
+ "5. **禁止的写法**(会触发 layout):",
512
+ " - ❌ 不要动画 `width`、`height`、`top`、`left`、`margin`、`padding`",
513
+ " - ❌ 不要使用 `setInterval` / `requestAnimationFrame` 手动动画(CSS/Framer 在 compositor thread 执行,更快)",
514
+ " - ❌ 不要对每个子元素单独写 delay(使用 `staggerChildren`)",
515
+ "",
516
+ "6. 实现完成后运行构建验证:",
517
+ " ```bash",
518
+ " npm run build",
519
+ " ```",
520
+ "",
521
+ "**产出格式**:",
522
+ "```",
523
+ "implementation:",
524
+ " approach: 'Framer Motion'",
525
+ " files_created: ['src/components/AnimatedModal.tsx']",
526
+ " files_modified: ['src/components/Modal.tsx']",
527
+ " gpu_only: true",
528
+ " uses_animate_presence: true",
529
+ " uses_reduced_motion: true",
530
+ " build_status: 'pass'",
531
+ "```",
532
+ ].join("\n"),
533
+ suggestedTools: ["Read", "Bash", "Write"],
534
+ output: "实现的动画代码文件、GPU 加速策略、构建状态",
535
+ depends: ["suggest-approach"],
536
+ },
537
+ {
538
+ id: "add-reduced-motion",
539
+ title: "添加 prefers-reduced-motion 降级",
540
+ instruction: [
541
+ "## 添加 prefers-reduced-motion 减弱动画",
542
+ "",
543
+ "确保动画尊重用户的系统偏好设置。",
544
+ "",
545
+ "**执行动作**:",
546
+ "1. 检查 `implement-animation` 是否已使用 `useReducedMotion`(Framer)或媒体查询(CSS)",
547
+ "2. **CSS 实现**的全局降级:",
548
+ " ```css",
549
+ " @media (prefers-reduced-motion: reduce) {",
550
+ " *,",
551
+ " *::before,",
552
+ " *::after {",
553
+ " animation-duration: 0.01ms !important;",
554
+ " animation-iteration-count: 1 !important;",
555
+ " transition-duration: 0.01ms !important;",
556
+ " scroll-behavior: auto !important;",
557
+ " }",
558
+ " }",
559
+ " ```",
560
+ "3. **Framer Motion 实现**的逐组件降级:",
561
+ " ```tsx",
562
+ " import { useReducedMotion } from 'framer-motion';",
563
+ "",
564
+ " function AnimatedComponent() {",
565
+ " const reduce = useReducedMotion();",
566
+ " return (",
567
+ " <motion.div",
568
+ " initial={reduce ? false : { opacity: 0, y: 20 }}",
569
+ " animate={{ opacity: 1, y: 0 }}",
570
+ " transition={reduce ? { duration: 0 } : { duration: 0.4 }}",
571
+ " />",
572
+ " );",
573
+ " }",
574
+ " ```",
575
+ "4. 验证降级效果:",
576
+ " - 在 macOS:系统设置 → 辅助功能 → 显示 → 减弱动态效果 → 开启",
577
+ " - 在 Chrome DevTools:Rendering → Emulate CSS media feature `prefers-reduced-motion: reduce`",
578
+ " - 触发动画,确认:无位移、无缩放、仅 opacity 淡入淡出或完全禁用",
579
+ "5. 统计动画中 reduced-motion 覆盖率:",
580
+ " ```bash",
581
+ " grep -rn 'useReducedMotion\\|prefers-reduced-motion' src/ | wc -l",
582
+ " ```",
583
+ "",
584
+ "**产出格式**:",
585
+ "```",
586
+ "reduced_motion_support:",
587
+ " strategy: 'useReducedMotion hook (Framer) + global @media fallback'",
588
+ " components_updated: ['AnimatedModal', 'HeroSection']",
589
+ " files_modified: ['src/components/AnimatedModal.tsx', 'src/styles/global.css']",
590
+ " coverage_rate: '100%'",
591
+ " fallback_behavior: 'opacity-only fade (no transform)'",
592
+ "```",
593
+ ].join("\n"),
594
+ suggestedTools: ["Bash", "Read", "Write"],
595
+ output: "reduced-motion 降级代码、覆盖率统计",
596
+ depends: ["implement-animation"],
597
+ },
598
+ {
599
+ id: "performance-check",
600
+ title: "验证动画 60fps 性能",
601
+ instruction: [
602
+ "## 验证动画是否达到 60fps 且不触发 layout",
603
+ "",
604
+ "使用 DevTools 验证实现后的动画性能。",
605
+ "",
606
+ "**执行动作**:",
607
+ "1. 启动开发服务器:",
608
+ " ```bash",
609
+ " npm run dev -- --port 3000",
610
+ " ```",
611
+ "2. Chrome DevTools → Rendering → 启用:",
612
+ " - Paint flashing(检查重绘区域)",
613
+ " - FPS meter(实时帧率)",
614
+ " - Layer borders(合成层边界)",
615
+ "3. 触发每一个新实现的动画,记录:",
616
+ " - FPS 是否稳定 ≥ 58fps",
617
+ " - Paint 区域是否仅局限在动画元素本身(非全屏重绘)",
618
+ " - 合成层数量是否合理",
619
+ "4. 若 FPS < 58:",
620
+ " - 检查是否动画了 layout 属性(回到 `implement-animation` 修复)",
621
+ " - 添加 `will-change: transform, opacity` 提示合成层提升",
622
+ " - 减少同时动画的元素数量",
623
+ "5. Performance 面板录制(5-10s)验证:",
624
+ " - Main thread 单帧耗时 ≤ 16ms",
625
+ " - 无长任务(Long Task > 50ms)",
626
+ "6. 在 `prefers-reduced-motion: reduce` 下验证降级表现",
627
+ "",
628
+ "**产出格式**:",
629
+ "```",
630
+ "performance_verification:",
631
+ " animations_tested: ['modal entrance', 'modal exit', 'button hover']",
632
+ " fps_results: [",
633
+ " { name: 'modal entrance', avg_fps: 60, status: 'pass' },",
634
+ " { name: 'modal exit', avg_fps: 59, status: 'pass' },",
635
+ " { name: 'button hover', avg_fps: 60, status: 'pass' }",
636
+ " ]",
637
+ " paint_area: 'element-only (no full-screen repaint)'",
638
+ " reduced_motion_verified: true",
639
+ " overall_status: 'pass'",
640
+ "```",
641
+ ].join("\n"),
642
+ suggestedTools: ["Bash", "Read"],
643
+ output: "每个动画的 FPS 实测结果、Paint 区域、reduced-motion 验证",
644
+ depends: ["implement-animation"],
645
+ },
91
646
  ],
92
647
  triggers: [{ type: "cli", command: "new:animation" }],
93
648
  },
649
+ // ── GPU 迁移 ──
94
650
  {
95
651
  name: "migrate-to-gpu",
96
652
  description: "动画 GPU 迁移:扫描 → 替换为 GPU 属性 → 验证",
97
- version: "1.0.0",
653
+ version: "2.0.0",
98
654
  steps: [
99
- { id: "find-cpu-animations", description: "扫描使用 width/height/top/left 的动画", type: "simple", timeout: 10000 },
100
- { id: "analyze-impact", description: "分析每处 CPU 动画的性能影响级别", type: "llm", depends: ["find-cpu-animations"], timeout: 10000 },
101
- { id: "replace-with-transform", description: "替换 CPU 动画为 transform(translate 替代 top/left,scale 替代 width/height)", type: "llm", depends: ["analyze-impact"], timeout: 20000 },
102
- { id: "add-will-change", description: "添加 will-change 优化层创建时机", type: "simple", depends: ["replace-with-transform"], timeout: 5000 },
103
- { id: "benchmark", description: "迁移前后 FPS 和 Paint 次数对比", type: "simple", depends: ["add-will-change"], timeout: 15000 },
655
+ {
656
+ id: "find-cpu-animations",
657
+ title: "扫描使用 CPU 属性的动画",
658
+ instruction: [
659
+ "## 扫描使用 width/height/top/left 的 CPU 动画",
660
+ "",
661
+ "定位所有动画化了 layout 触发属性的代码。",
662
+ "",
663
+ "**执行动作**:",
664
+ "1. 扫描 CSS `@keyframes` 中的 layout 属性:",
665
+ " ```bash",
666
+ " awk '/@keyframes/{found=1} found{print FILENAME\":\"FNR\":\"$0; if(/^}/){found=0}}' src/**/*.css | grep -E 'width|height|top|left|right|bottom|margin|padding'",
667
+ " ```",
668
+ "2. 扫描 CSS `transition:` 中的 layout 属性:",
669
+ " ```bash",
670
+ " grep -rnE 'transition:.*(width|height|top|left|right|bottom|margin|padding)' src/ --include='*.css' --include='*.scss' --include='*.module.css'",
671
+ " ```",
672
+ "3. 扫描 Framer Motion 中动画化 layout 属性:",
673
+ " ```bash",
674
+ " grep -rnE 'animate=\\{\\{[^}]*(width|height|top|left|x|y)' src/ --include='*.tsx' --include='*.jsx'",
675
+ " # x/y 实际使用 transform: translate,是 GPU 加速的(✅)",
676
+ " # 但 width/height/top/left 在 framer 中仍触发 layout(❌)",
677
+ " grep -rnE 'animate=\\{\\{[^}]*(width|height|top|left)' src/ --include='*.tsx' --include='*.jsx'",
678
+ " ```",
679
+ "4. 扫描 JS 中直接改 style 的动画(`element.style.top = ...`):",
680
+ " ```bash",
681
+ " grep -rnE '\\.style\\.(width|height|top|left|margin|padding)\\s*=' src/ --include='*.ts' --include='*.tsx' --include='*.js'",
682
+ " ```",
683
+ "5. 扫描 GSAP 中动画化 layout 属性:",
684
+ " ```bash",
685
+ " grep -rnE 'gsap\\.(to|from|fromTo)\\([^)]*\\{[^}]*(width|height|top|left|x|y)' src/ --include='*.ts' --include='*.js'",
686
+ " ```",
687
+ "6. 为每个发现项记录文件、行号、属性、上下文",
688
+ "",
689
+ "**产出格式**:",
690
+ "```",
691
+ "cpu_animations_found:",
692
+ " css_keyframes: [{ file: 'card.css', line: 5, property: 'width', keyframe_name: 'expand' }]",
693
+ " css_transitions: [{ file: 'sidebar.css', line: 12, property: 'left' }]",
694
+ " framer_motion: [{ file: 'Modal.tsx', line: 8, property: 'height' }]",
695
+ " js_style: [{ file: 'drag.ts', line: 15, property: 'top' }]",
696
+ " gsap: []",
697
+ "total_cpu_animations: 4",
698
+ "```",
699
+ ].join("\n"),
700
+ suggestedTools: ["Bash", "Read"],
701
+ output: "所有使用 CPU 属性(width/height/top/left)的动画清单",
702
+ },
703
+ {
704
+ id: "analyze-impact",
705
+ title: "分析 CPU 动画的性能影响",
706
+ instruction: [
707
+ "## 分析每处 CPU 动画的性能影响级别",
708
+ "",
709
+ "评估每个 CPU 动画触发 layout/paint 的严重度,决定迁移优先级。",
710
+ "",
711
+ "**影响级别判定**:",
712
+ "- **High**:动画触发 layout + 影响大范围元素(例如根容器 width、影响兄弟元素的 top/left)",
713
+ "- **Medium**:动画触发 layout 但影响范围局限(例如单卡片内部元素)",
714
+ "- **Low**:动画触发 paint 但不触发 layout(例如 background-position、color)",
715
+ "",
716
+ "**执行动作**:",
717
+ "1. 对 `find-cpu-animations` 每个结果,判定影响级别:",
718
+ " - 元素是否被多次复用(如列表项中的动画 vs 单个 hero)",
719
+ " - 元素层级深度(顶层容器 vs 叶子节点)",
720
+ " - 动画时长与频率(持续循环 > 一次性)",
721
+ "2. 检查是否存在多个 CPU 动画同时运行的情况:",
722
+ " ```bash",
723
+ " # 统计同一组件/页面的 CPU 动画数量",
724
+ " grep -rnE '(width|height|top|left)' src/ --include='*.css' | grep -E 'transition|animation' | awk -F: '{print $1}' | sort | uniq -c | sort -rn",
725
+ " ```",
726
+ "3. 评估迁移收益(FPS 提升预估):",
727
+ " - High:预估 FPS 提升 20-40",
728
+ " - Medium:预估 FPS 提升 10-20",
729
+ " - Low:预估 FPS 提升 < 10",
730
+ "4. 生成按优先级排序的迁移清单",
731
+ "",
732
+ "**产出格式**:",
733
+ "```",
734
+ "impact_analysis:",
735
+ " high_priority: [",
736
+ " { file: 'hero.css', line: 5, property: 'width', reason: 'root hero container animates during scroll', estimated_fps_gain: 30 }",
737
+ " ]",
738
+ " medium_priority: [",
739
+ " { file: 'card.css', line: 12, property: 'height', reason: 'reused 20x in list', estimated_fps_gain: 15 }",
740
+ " ]",
741
+ " low_priority: [",
742
+ " { file: 'button.css', line: 3, property: 'background-position', reason: 'paint only', estimated_fps_gain: 5 }",
743
+ " ]",
744
+ " total_estimated_fps_gain: 50",
745
+ "```",
746
+ ].join("\n"),
747
+ suggestedTools: ["Bash", "Read"],
748
+ output: "每个 CPU 动画的影响级别、迁移优先级、预估 FPS 收益",
749
+ depends: ["find-cpu-animations"],
750
+ },
751
+ {
752
+ id: "replace-with-transform",
753
+ title: "替换 CPU 动画为 transform",
754
+ instruction: [
755
+ "## 替换 CPU 动画为 transform(translate 替代 top/left,scale 替代 width/height)",
756
+ "",
757
+ "根据 `analyze-impact` 的优先级,逐个替换。",
758
+ "",
759
+ "**执行动作**:",
760
+ "1. **top/left/right/bottom → transform: translate()**:",
761
+ " ```css",
762
+ " /* 修改前 */",
763
+ " .slide-in { transition: left 300ms; left: -100%; }",
764
+ " .slide-in.open { left: 0; }",
765
+ " /* 修改后 */",
766
+ " .slide-in { transform: translateX(-100%); transition: transform 300ms ease-out; }",
767
+ " .slide-in.open { transform: translateX(0); }",
768
+ " ```",
769
+ "",
770
+ "2. **width → transform: scaleX()**:",
771
+ " ```css",
772
+ " /* 修改前 */",
773
+ " .progress { transition: width 400ms; width: 0; }",
774
+ " .progress.done { width: 100%; }",
775
+ " /* 修改后 */",
776
+ " .progress { transform: scaleX(0); transform-origin: left; transition: transform 400ms ease-out; }",
777
+ " .progress.done { transform: scaleX(1); }",
778
+ " ```",
779
+ "",
780
+ "3. **height → transform: scaleY()**:",
781
+ " ```css",
782
+ " /* 修改前 */",
783
+ " .accordion-content { transition: height 300ms; height: 0; overflow: hidden; }",
784
+ " .accordion-content.open { height: auto; }",
785
+ " /* 修改后 */",
786
+ " .accordion-content {",
787
+ " transform: scaleY(0);",
788
+ " transform-origin: top;",
789
+ " transition: transform 300ms ease-out;",
790
+ " height: auto;",
791
+ " overflow: hidden;",
792
+ " }",
793
+ " .accordion-content.open { transform: scaleY(1); }",
794
+ " ```",
795
+ "",
796
+ "4. **margin/padding → transform: translate()**:",
797
+ " ```css",
798
+ " /* 修改前 */",
799
+ " .element { transition: margin-top 300ms; margin-top: 20px; }",
800
+ " /* 修改后 */",
801
+ " .element { transform: translateY(-20px); transition: transform 300ms ease-out; }",
802
+ " .element.open { transform: translateY(0); }",
803
+ " ```",
804
+ "",
805
+ "5. **Framer Motion 中的 layout 属性替换**:",
806
+ " ```tsx",
807
+ " // 修改前(触发 layout)",
808
+ " <motion.div animate={{ x: 100, height: 200 }} />",
809
+ " // 修改后(composite-only)",
810
+ " <motion.div animate={{ x: 100, scaleY: 1 }} style={{ scaleY: 0, transformOrigin: 'top' }} />",
811
+ " // 注意:x/y/z/rotate/scale 在 Framer 中已是 transform(✅),无需改",
812
+ " ```",
813
+ "",
814
+ "6. 替换完成后运行构建验证:",
815
+ " ```bash",
816
+ " npm run build",
817
+ " ```",
818
+ "",
819
+ "**产出格式**:",
820
+ "```",
821
+ "replacements: [",
822
+ " { file: 'slide.css', line: 5, before: 'left: -100% -> 0', after: 'translateX(-100%) -> translateX(0)' },",
823
+ " { file: 'progress.css', line: 8, before: 'width: 0 -> 100%', after: 'scaleX(0) -> scaleX(1)' },",
824
+ " { file: 'accordion.css', line: 3, before: 'height: 0 -> auto', after: 'scaleY(0) -> scaleY(1)' }",
825
+ "]",
826
+ "total_replaced: 3",
827
+ "files_modified: ['src/styles/slide.css', 'src/styles/progress.css', 'src/styles/accordion.css']",
828
+ "build_status: 'pass'",
829
+ "```",
830
+ ].join("\n"),
831
+ suggestedTools: ["Read", "Bash", "Write"],
832
+ output: "CPU 属性 → transform 的替换清单、修改的文件、构建状态",
833
+ depends: ["analyze-impact"],
834
+ },
835
+ {
836
+ id: "add-will-change",
837
+ title: "添加 will-change 优化层创建时机",
838
+ instruction: [
839
+ "## 添加 will-change 提示浏览器提前创建 GPU 层",
840
+ "",
841
+ "对迁移后的动画元素合理使用 `will-change` 提升性能。",
842
+ "",
843
+ "**执行动作**:",
844
+ "1. **基础用法**(动画开始前添加,结束后移除):",
845
+ " ```css",
846
+ " /* 默认状态:不创建层 */",
847
+ " .animated { /* no will-change */ }",
848
+ " /* hover / 即将动画状态:创建层 */",
849
+ " .animated:hover,",
850
+ " .animated.will-animate {",
851
+ " will-change: transform, opacity;",
852
+ " }",
853
+ " ```",
854
+ "2. **JS 触发方式**(更精确控制):",
855
+ " ```ts",
856
+ " const el = document.querySelector('.animated');",
857
+ " el.addEventListener('mouseenter', () => {",
858
+ " el.style.willChange = 'transform, opacity';",
859
+ " });",
860
+ " el.addEventListener('transitionend', () => {",
861
+ " el.style.willChange = 'auto';",
862
+ " });",
863
+ " ```",
864
+ "3. **Framer Motion 自动处理**:Framer 会在 `animate` 时自动提升合成层,通常无需手动添加 `will-change`",
865
+ "4. **反模式**(避免):",
866
+ " - ❌ `will-change: auto` 常驻在大量元素上(过度提升会撑爆 GPU 内存)",
867
+ " - ❌ `will-change: all`(不具体,浏览器无法优化)",
868
+ " - ❌ 给每个列表项都加 `will-change`(应只在 hover/active 的单个元素上加)",
869
+ "5. 检查当前 `will-change` 使用情况:",
870
+ " ```bash",
871
+ " grep -rn 'will-change' src/ --include='*.css' --include='*.scss'",
872
+ " ```",
873
+ "6. 为 `replace-with-transform` 中每个替换项添加合适的 will-change:",
874
+ "",
875
+ "**产出格式**:",
876
+ "```",
877
+ "will_change_added: [",
878
+ " { file: 'slide.css', selector: '.slide-in:hover', value: 'transform' },",
879
+ " { file: 'progress.css', selector: '.progress.animating', value: 'transform' }",
880
+ "]",
881
+ "total_added: 2",
882
+ "overuse_warning: 'no excessive will-change detected'",
883
+ "```",
884
+ ].join("\n"),
885
+ suggestedTools: ["Bash", "Read", "Write"],
886
+ output: "will-change 添加清单、避免的反模式、GPU 层数量预估",
887
+ depends: ["replace-with-transform"],
888
+ },
889
+ {
890
+ id: "benchmark",
891
+ title: "迁移前后 FPS 与 Paint 对比",
892
+ instruction: [
893
+ "## 迁移前后 FPS 与 Paint 次数对比",
894
+ "",
895
+ "用 DevTools 量化迁移带来的性能收益。",
896
+ "",
897
+ "**执行动作**:",
898
+ "1. **回滚到迁移前快照**(使用 git stash 临时还原):",
899
+ " ```bash",
900
+ " git stash push -m 'benchmark-before' -- src/",
901
+ " npm run dev -- --port 3000",
902
+ " ```",
903
+ "2. 在 DevTools → Performance 录制迁移前的动画表现(5-10 秒):",
904
+ " - 记录平均 FPS",
905
+ " - 记录 Paint 次数(Summary 中的 Green 区域)",
906
+ " - 记录 Main thread 单帧最大耗时",
907
+ "3. **恢复迁移后代码**:",
908
+ " ```bash",
909
+ " git stash pop",
910
+ " ```",
911
+ "4. 在同样条件下录制迁移后的 Performance:",
912
+ " - 同样触发相同的动画",
913
+ " - 同样时长(5-10 秒)",
914
+ "5. 对比数据:",
915
+ " | 指标 | 迁移前 | 迁移后 | 提升 |",
916
+ " |---|---|---|---|",
917
+ " | 平均 FPS | 42 | 60 | +43% |",
918
+ " | Paint 次数 | 120 | 8 | -93% |",
919
+ " | 单帧最大耗时 | 38ms | 12ms | -68% |",
920
+ "6. 验证功能未回归:",
921
+ " - 动画视觉效果与迁移前一致",
922
+ " - reduced-motion 仍然生效",
923
+ " - 所有交互(hover/click)正常",
924
+ "",
925
+ "**产出格式**:",
926
+ "```",
927
+ "benchmark_results:",
928
+ " before: { avg_fps: 42, paint_count: 120, max_frame_ms: 38 }",
929
+ " after: { avg_fps: 60, paint_count: 8, max_frame_ms: 12 }",
930
+ " improvements: { fps: '+43%', paint: '-93%', frame_time: '-68%' }",
931
+ " regression_check: 'no visual or functional regression'",
932
+ " conclusion: 'migration successful — all animations now composite-only'",
933
+ "```",
934
+ ].join("\n"),
935
+ suggestedTools: ["Bash", "Read"],
936
+ output: "迁移前后 FPS/Paint/Frame time 对比、回归检查结果",
937
+ depends: ["add-will-change"],
938
+ },
104
939
  ],
105
940
  triggers: [{ type: "cli", command: "migrate:gpu-animation" }],
106
941
  },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAkB;IAC5C,IAAI,EAAE;QACJ,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,wDAAwD;QACrE,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,CAAC;KAChE;IAED,SAAS,EAAE;QACT,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE;oBACJ,iEAAiE;oBACjE,kEAAkE;oBAClE,gCAAgC;iBACjC;gBACD,UAAU,EAAE,WAAW;gBACvB,OAAO,EAAE,MAAM;aAChB;SACF;KACF;IAED,MAAM,EAAE;QACN,OAAO,EAAE;YACP,KAAK,EAAE,CAAC,gBAAgB,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC;YAC5D,WAAW,EAAE;gBACX,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,EAAE,MAAM,EAAE,QAAiB,EAAE,UAAU,EAAE,IAAI,EAAE;gBACzG,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,yCAAyC,EAAE,MAAM,EAAE,QAAiB,EAAE,UAAU,EAAE,IAAI,EAAE;gBAClH,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,8CAA8C,EAAE,MAAM,EAAE,QAAiB,EAAE,UAAU,EAAE,GAAG,EAAE;gBACpH,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,oCAAoC,EAAE,MAAM,EAAE,QAAiB,EAAE,UAAU,EAAE,GAAG,EAAE;aACnH;SACF;QACD,MAAM,EAAE;YACN;gBACE,EAAE,EAAE,0BAA0B;gBAC9B,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,iKAAiK;gBAC1K,SAAS,EAAE,EAAE;aACd;YACD;gBACE,EAAE,EAAE,6BAA6B;gBACjC,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,gKAAgK;gBACzK,SAAS,EAAE,EAAE;aACd;YACD;gBACE,EAAE,EAAE,kCAAkC;gBACtC,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,oBAAoB;gBAC3B,OAAO,EAAE,gJAAgJ;gBACzJ,SAAS,EAAE,EAAE;aACd;YACD;gBACE,EAAE,EAAE,6BAA6B;gBACjC,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,2IAA2I;gBACpJ,SAAS,EAAE,EAAE;aACd;SACF;KACF;IAED,QAAQ,EAAE;QACR,KAAK,EAAE,EAAE;QACT,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,yBAAyB;gBACtC,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE;oBACL,EAAE,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,+CAA+C,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,KAAK,EAAE;oBAChI,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,sCAAsC,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;oBAC/I,EAAE,EAAE,EAAE,mBAAmB,EAAE,WAAW,EAAE,gCAAgC,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;oBACjJ,EAAE,EAAE,EAAE,qBAAqB,EAAE,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;oBAChJ,EAAE,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;oBAChL,EAAE,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE,2BAA2B,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;iBACvI;gBACD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;aACjE;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,8BAA8B;gBAC3C,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE;oBACL,EAAE,EAAE,EAAE,sBAAsB,EAAE,WAAW,EAAE,0BAA0B,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,KAAK,EAAE;oBAC7G,EAAE,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,0CAA0C,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,sBAAsB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;oBAC5J,EAAE,EAAE,EAAE,qBAAqB,EAAE,WAAW,EAAE,2BAA2B,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;oBAC5I,EAAE,EAAE,EAAE,oBAAoB,EAAE,WAAW,EAAE,gCAAgC,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;oBACrJ,EAAE,EAAE,EAAE,mBAAmB,EAAE,WAAW,EAAE,4BAA4B,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;iBAClJ;gBACD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;aAC/D;YACD;gBACE,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,gCAAgC;gBAC7C,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE;oBACL,EAAE,EAAE,EAAE,qBAAqB,EAAE,WAAW,EAAE,gCAAgC,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,KAAK,EAAE;oBACrH,EAAE,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;oBACnI,EAAE,EAAE,EAAE,wBAAwB,EAAE,WAAW,EAAE,mEAAmE,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;oBACrL,EAAE,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,wBAAwB,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,CAAC,wBAAwB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;oBAC7I,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,uBAAuB,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;iBACjI;gBACD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;aACvE;SACF;KACF;IAED,MAAM,EAAE;QACN,MAAM,EAAE,qFAAqF;QAC7F,KAAK,EAAE;YACL,qCAAqC;YACrC,6BAA6B;YAC7B,2BAA2B;YAC3B,kCAAkC;YAClC,oCAAoC;YACpC,oCAAoC;YACpC,wBAAwB;SACzB;KACF;IAED,KAAK,EAAE,EAAE;CACV,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/plugin-animation",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -17,7 +17,7 @@
17
17
  "clean": "rm -rf dist"
18
18
  },
19
19
  "dependencies": {
20
- "@devflow-tools/sdk": "^0.4.0"
20
+ "@devflow-tools/sdk": "^0.5.0"
21
21
  },
22
22
  "devDependencies": {
23
23
  "typescript": "^5.5.0",
@@ -26,5 +26,5 @@
26
26
  "files": [
27
27
  "dist"
28
28
  ],
29
- "gitHead": "c76bcf3a2bb8ac12b871738d6661979eb45090c6"
29
+ "gitHead": "431c0f26e14d476c08d543ef5cd65367413dbc98"
30
30
  }