From 6c5f21436fd324b9928fad4dcfb7e94b455da346 Mon Sep 17 00:00:00 2001
From: hiyuki <674883329@qq.com>
Date: Wed, 13 May 2026 21:09:06 +0800
Subject: [PATCH 01/10] update skill
---
.agents/skills/mpx2rn/SKILL.md | 4 ++--
.agents/skills/mpx2rn/references/conditional-compile.md | 2 ++
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/.agents/skills/mpx2rn/SKILL.md b/.agents/skills/mpx2rn/SKILL.md
index ce4377e920..2e49112839 100644
--- a/.agents/skills/mpx2rn/SKILL.md
+++ b/.agents/skills/mpx2rn/SKILL.md
@@ -111,8 +111,7 @@ Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展
1. **最小化使用**:条件编译是处理跨端不兼容的**最后手段**,不是首选方案。使用条件编译之前,应先确认是否存在无需条件编译的跨端兼容写法(参见[样式开发最佳实践](./references/rn-style-practice.md)与各能力参考)。需要用条件编译时,仅最小包裹真正不兼容的片段,不要整段代码都用条件编译分叉。
2. **避免空选择器**:样式条件编译产物中不得留下空选择器(无样式内容的选择器),整条规则(含选择器与花括号内容)须一并被条件编译包裹。详见 [条件编译 · 避免产物中出现空选择器](./references/conditional-compile.md#避免产物中出现空选择器)。
-
-完整语法(样式 `@mpx-if` / 模板 `@mode` & `@_mode` & `mpxTagName@mode` / 脚本 `__mpx_mode__` / JSON 配置)参考 [条件编译](./references/conditional-compile.md)。
+3. **各区块使用对应的条件编译语法**:样式条件编译使用 `/* @mpx-if (__mpx_mode__ === ... ) */` 注释语法;模板条件编译使用 `wx:if="{{__mpx_mode__ === ...}}"` 指令或 `@mode` / `@_mode` 属性后缀;脚本和 JSON 配置条件编译使用 `if (__mpx_mode__ === ...)` 条件语句,**避免误用**,详情参考 [条件编译](./references/conditional-compile.md)。
## 任务一:对已有 Mpx 组件进行 RN 跨端适配改造
@@ -204,6 +203,7 @@ Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展
**条件编译**
- [ ] 不存在大面积连续条件编译,仅最小包裹不兼容片段。
- [ ] 样式条件编译处理后产物中不存在空选择器。
+- [ ] 各个区块内的条件编译语法都符合规范,不存在误用(如在模板区块中使用 `/* @mpx-if */` 注释语法等)。
**本地校验**
- [ ] 通过 [编译校验脚本](#编译校验脚本) 真实编译校验。
diff --git a/.agents/skills/mpx2rn/references/conditional-compile.md b/.agents/skills/mpx2rn/references/conditional-compile.md
index 0f04fbc24b..4130147710 100644
--- a/.agents/skills/mpx2rn/references/conditional-compile.md
+++ b/.agents/skills/mpx2rn/references/conditional-compile.md
@@ -16,6 +16,8 @@
## 样式条件编译
+> **⚠️ `@mpx-if` 注释语法条件编译仅限在 `
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/outputs/list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/outputs/list.mpx
new file mode 100644
index 0000000000..d45b7428e3
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/outputs/list.mpx
@@ -0,0 +1,166 @@
+
+
+
+
+ {{item.text}}
+
+
+ 加载中...
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..579ce4be6b
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,57 @@
+{
+ "eval_id": 0,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "text": "style: no less nesting (& or rule-in-rule)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN (wx-conditional stripped): no :active",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN: no :first-child",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "script: replaced wx.request with mpx.request",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "script: replaced wx.navigateTo with mpx.navigateTo",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "template: event params use inline syntax (not data- dataset)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "template: dynamic class via wx:class (not class string interp)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no empty selector rules after stripping comments",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 9,
+ "failed": 0,
+ "total": 9
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/timing.json
new file mode 100644
index 0000000000..d7e05c7627
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 81186,
+ "duration_ms": 136008,
+ "total_duration_seconds": 136.0
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/outputs/list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/outputs/list.mpx
new file mode 100644
index 0000000000..fdabf66304
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/outputs/list.mpx
@@ -0,0 +1,139 @@
+
+
+
+
+ {{item.text}}
+
+ 加载中...
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..3242ebd5af
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,57 @@
+{
+ "eval_id": 0,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "text": "style: no less nesting (& or rule-in-rule)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN (wx-conditional stripped): no :active",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN: no :first-child",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "script: replaced wx.request with mpx.request",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "script: replaced wx.navigateTo with mpx.navigateTo",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "template: event params use inline syntax (not data- dataset)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "text": "template: dynamic class via wx:class (not class string interp)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no empty selector rules after stripping comments",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.8889,
+ "passed": 8,
+ "failed": 1,
+ "total": 9
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/timing.json
new file mode 100644
index 0000000000..51f97c68fa
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 86788,
+ "duration_ms": 222970,
+ "total_duration_seconds": 223.0
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/eval_metadata.json
new file mode 100644
index 0000000000..2981b8ee13
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/eval_metadata.json
@@ -0,0 +1,17 @@
+{
+ "eval_id": 1,
+ "eval_name": "create-card-component",
+ "prompt": "请帮我创建一个符合 RN 跨端兼容规范的 Mpx 卡片组件 card.mpx,需求:\n- 接收 props:title (string)、desc (string)、avatar (string,图片 URL)、selected (boolean,默认 false)\n- 卡片整体可点击,点击时通过 triggerEvent 抛出 'tap' 事件\n- 点击时有按下视觉反馈\n- selected=true 时卡片边框色变为蓝色 (#1677ff)\n- 标题需要单行省略\n- 描述最多展示 2 行后省略\n- 使用组合式 API(setup 或
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..d869df3f9c
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,57 @@
+{
+ "eval_id": 1,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "text": "uses composition API (script setup or setup())",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no nesting / compound selectors",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "uses hover-class for press feedback (not bare :active on root)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "triggerEvent('tap', ...) is called",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "title uses numberOfLines for ellipsis",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "avatar uses (not
)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "text content wrapped in elements",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "defineProps uses Mpx-style value: (not Vue-style default:)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 9,
+ "failed": 0,
+ "total": 9
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/timing.json
new file mode 100644
index 0000000000..84b4b44f68
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 69995,
+ "duration_ms": 76787,
+ "total_duration_seconds": 76.8
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/outputs/card.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/outputs/card.mpx
new file mode 100644
index 0000000000..31b26a70b4
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/outputs/card.mpx
@@ -0,0 +1,133 @@
+
+
+
+
+ {{title}}
+ {{desc}}
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..5f7569c960
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,57 @@
+{
+ "eval_id": 1,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "text": "uses composition API (script setup or setup())",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no nesting / compound selectors",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "uses hover-class for press feedback (not bare :active on root)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "triggerEvent('tap', ...) is called",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "title uses numberOfLines for ellipsis",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "avatar uses (not
)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "text content wrapped in elements",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "defineProps uses Mpx-style value: (not Vue-style default:)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 9,
+ "failed": 0,
+ "total": 9
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/timing.json
new file mode 100644
index 0000000000..4be1f4944a
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 54868,
+ "duration_ms": 192051,
+ "total_duration_seconds": 192.1
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/eval_metadata.json
new file mode 100644
index 0000000000..a1cff54571
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/eval_metadata.json
@@ -0,0 +1,17 @@
+{
+ "eval_id": 2,
+ "eval_name": "adapt-style-block",
+ "prompt": "请对附件中的 .mpx 文件进行 RN 跨端样式适配改造,重点改造
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/outputs/style-block.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/outputs/style-block.mpx
new file mode 100644
index 0000000000..e45930162b
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/outputs/style-block.mpx
@@ -0,0 +1,106 @@
+
+
+
+
+
+ {{item.title}}
+ {{item.content}}
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..133168d681
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,57 @@
+{
+ "eval_id": 2,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "text": "style: no less nesting outside of conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN: no ::before pseudo-element",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN: no display: grid",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN: no :active pseudo-class",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN: no + adjacent sibling combinator",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "template: real node added to replace ::before",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no empty selector rules",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 9,
+ "failed": 0,
+ "total": 9
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/timing.json
new file mode 100644
index 0000000000..18f29701c1
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 56045,
+ "duration_ms": 103260,
+ "total_duration_seconds": 103.3
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/outputs/style-block.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/outputs/style-block.mpx
new file mode 100644
index 0000000000..6b04fef2c5
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/outputs/style-block.mpx
@@ -0,0 +1,116 @@
+
+
+
+
+
+ {{item.title}}
+ {{item.content}}
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..fb914be72b
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,57 @@
+{
+ "eval_id": 2,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "text": "style: no less nesting outside of conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN: no ::before pseudo-element",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN: no display: grid",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN: no :active pseudo-class",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style on RN: no + adjacent sibling combinator",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "template: real node added to replace ::before",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no empty selector rules",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 9,
+ "failed": 0,
+ "total": 9
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/timing.json
new file mode 100644
index 0000000000..27d09bfe7b
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 63691,
+ "duration_ms": 144331,
+ "total_duration_seconds": 144.3
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/eval_metadata.json
new file mode 100644
index 0000000000..f58a0da0c9
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/eval_metadata.json
@@ -0,0 +1,17 @@
+{
+ "eval_id": 3,
+ "eval_name": "selector-api-animation",
+ "prompt": "请对附件中的 dashboard.mpx 仪表盘组件进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件,不要省略任何内容。",
+ "files": ["input/dashboard.mpx"],
+ "assertions": [
+ {"text": "selector API nodes (#chartBox, #lazyArea) have empty wx:ref in template"},
+ {"text": "wx.createAnimation replaced with mpx.createAnimation"},
+ {"text": "gradient transparent replaced with rgba equivalent"},
+ {"text": "rem units converted to rpx"},
+ {"text": "enable-animation declared on animated view"},
+ {"text": "@keyframes isolated with conditional compile (RN does not support)"},
+ {"text": "display:none replaced with wx:if or size-zero hiding"},
+ {"text": "style: no less nesting (all selectors flattened to single-class)"},
+ {"text": "conditional compile uses @mpx-endif (not @mpx-end-if)"}
+ ]
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/input/dashboard.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/input/dashboard.mpx
new file mode 100644
index 0000000000..f8c6346fee
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/input/dashboard.mpx
@@ -0,0 +1,176 @@
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+ {{item.value}}
+ {{item.name}}
+
+
+
+
+ 延迟加载的内容
+
+
+ 加载中...
+
+
+
+ {{tipText}}
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/outputs/dashboard.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/outputs/dashboard.mpx
new file mode 100644
index 0000000000..8d696a1fe0
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/outputs/dashboard.mpx
@@ -0,0 +1,197 @@
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+ {{item.value}}
+ {{item.name}}
+
+
+
+
+ 延迟加载的内容
+
+
+ 加载中...
+
+
+
+ {{tipText}}
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..707252eecc
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,67 @@
+{
+ "eval_id": 3,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "text": "selector API nodes (#chartBox, #lazyArea) have empty wx:ref in template",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "wx.createAnimation replaced with mpx.createAnimation",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "gradient transparent replaced with rgba equivalent",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "rem units converted to rpx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "template: event params use inline syntax (not data- dataset)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "text": "enable-animation declared on animated view",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "text": "@keyframes isolated with conditional compile (RN does not support)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "display:none replaced with wx:if or size-zero hiding",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "transition preserved on RN (not stripped into wx-only conditional)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "text": "style: no less nesting (all selectors flattened to single-class)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.7273,
+ "passed": 8,
+ "failed": 3,
+ "total": 11
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/timing.json
new file mode 100644
index 0000000000..466fda7f55
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 106035,
+ "duration_ms": 147253,
+ "total_duration_seconds": 147.3
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/outputs/dashboard.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/outputs/dashboard.mpx
new file mode 100644
index 0000000000..aba2b2ee0d
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/outputs/dashboard.mpx
@@ -0,0 +1,237 @@
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+ {{item.value}}
+ {{item.name}}
+
+
+
+
+ 延迟加载的内容
+
+
+ 加载中...
+
+
+
+ {{tipText}}
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..63d69145d9
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,67 @@
+{
+ "eval_id": 3,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "text": "selector API nodes (#chartBox, #lazyArea) have empty wx:ref in template",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "wx.createAnimation replaced with mpx.createAnimation",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "gradient transparent replaced with rgba equivalent",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "rem units converted to rpx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "template: event params use inline syntax (not data- dataset)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "text": "enable-animation declared on animated view",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "@keyframes isolated with conditional compile (RN does not support)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "display:none replaced with wx:if or size-zero hiding",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "transition preserved on RN (not stripped into wx-only conditional)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no less nesting (all selectors flattened to single-class)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.9091,
+ "passed": 10,
+ "failed": 1,
+ "total": 11
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/timing.json
new file mode 100644
index 0000000000..ff9842d054
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 95452,
+ "duration_ms": 357870,
+ "total_duration_seconds": 357.9
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/eval_metadata.json
new file mode 100644
index 0000000000..4529d9ee31
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/eval_metadata.json
@@ -0,0 +1,17 @@
+{
+ "eval_id": 4,
+ "eval_name": "slots-cssvar-i18n",
+ "prompt": "请对附件中的 panel.mpx 面板组件进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件,不要省略任何内容。",
+ "files": ["input/panel.mpx"],
+ "assertions": [
+ {"text": "multipleSlots: true preserved in component options"},
+ {"text": "CSS variables (var(--...)) syntax preserved"},
+ {"text": "$t() i18n function calls preserved in template"},
+ {"text": "background-image only on view components (not text)"},
+ {"text": "enable-background declared on dynamic background view"},
+ {"text": "::after pseudo-element replaced with real node"},
+ {"text": "style: no less nesting (all selectors flattened)"},
+ {"text": "calc() expressions preserved"},
+ {"text": "conditional compile uses @mpx-endif (not @mpx-end-if)"}
+ ]
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/input/panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/input/panel.mpx
new file mode 100644
index 0000000000..46a3003974
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/input/panel.mpx
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+ {{item.desc}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/outputs/panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/outputs/panel.mpx
new file mode 100644
index 0000000000..0f3699d4ed
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/outputs/panel.mpx
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+ {{item.desc}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..9ccfdd701e
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,57 @@
+{
+ "eval_id": 4,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "text": "multipleSlots: true preserved in component options",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "CSS variables (var(--...)) syntax preserved",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "$t() i18n function calls preserved in template",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "background-image only on view components (not text)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "enable-background declared on dynamic background view",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "::after pseudo-element replaced with real node",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no less nesting (all selectors flattened)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "calc() preserved or replaced with flex equivalent",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 9,
+ "failed": 0,
+ "total": 9
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/timing.json
new file mode 100644
index 0000000000..3944eb4a77
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 95498,
+ "duration_ms": 179975,
+ "total_duration_seconds": 180.0
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/outputs/panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/outputs/panel.mpx
new file mode 100644
index 0000000000..676f43eb5b
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/outputs/panel.mpx
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+ {{item.desc}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..75096d0176
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,57 @@
+{
+ "eval_id": 4,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "text": "multipleSlots: true preserved in component options",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "CSS variables (var(--...)) syntax preserved",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "$t() i18n function calls preserved in template",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "background-image only on view components (not text)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "enable-background declared on dynamic background view",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "::after pseudo-element replaced with real node",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no less nesting (all selectors flattened)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "calc() preserved or replaced with flex equivalent",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.8889,
+ "passed": 8,
+ "failed": 1,
+ "total": 9
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/timing.json
new file mode 100644
index 0000000000..2ea68e714d
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 97054,
+ "duration_ms": 180146,
+ "total_duration_seconds": 180.1
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/eval_metadata.json
new file mode 100644
index 0000000000..d2b4494c4e
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/eval_metadata.json
@@ -0,0 +1,17 @@
+{
+ "eval_id": 5,
+ "eval_name": "pinia-scroll-intersection",
+ "prompt": "请对附件中的 product-list.mpx 商品列表页面进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件,不要省略任何内容。",
+ "files": ["input/product-list.mpx"],
+ "assertions": [
+ {"text": "Pinia store import and usage preserved"},
+ {"text": "onPullDownRefresh/onReachBottom replaced with scroll-view events"},
+ {"text": "createIntersectionObserver target (#exposureAnchor) has wx:ref"},
+ {"text": "all wx.xxx replaced with mpx.xxx"},
+ {"text": "e.target.dataset replaced with e.currentTarget.dataset"},
+ {"text": "float layout replaced with flex"},
+ {"text": "font-weight numeric (500/700) replaced with bold/normal"},
+ {"text": "style: no less nesting (all selectors flattened)"},
+ {"text": "conditional compile uses @mpx-endif (not @mpx-end-if)"}
+ ]
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/input/product-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/input/product-list.mpx
new file mode 100644
index 0000000000..56527cffbc
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/input/product-list.mpx
@@ -0,0 +1,254 @@
+
+
+
+
+
+ 搜索
+
+
+
+
+ 价格
+
+
+ 销量
+
+
+
+
+
+
+ {{item.name}}
+
+ {{tag}}
+
+
+ ¥{{item.price}}
+ 已售 {{item.sales}}
+
+
+
+
+
+ 加载中...
+ 没有更多了
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/outputs/product-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/outputs/product-list.mpx
new file mode 100644
index 0000000000..ee0f3da2ae
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/outputs/product-list.mpx
@@ -0,0 +1,365 @@
+
+
+
+
+
+ 搜索
+
+
+
+
+ 价格
+
+
+ 销量
+
+
+
+
+
+
+
+ {{item.name}}
+
+ {{tag}}
+
+
+ ¥{{item.price}}
+ 已售 {{item.sales}}
+
+
+
+
+
+ 加载中...
+ 没有更多了
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..6ac20f139c
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,57 @@
+{
+ "eval_id": 5,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "text": "Pinia store import and usage preserved",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "onPullDownRefresh/onReachBottom replaced with scroll-view events",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "createIntersectionObserver target (#exposureAnchor) has wx:ref",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "all wx.xxx replaced with mpx.xxx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "template: event params use inline syntax (not data- dataset)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "text": "float layout replaced with flex",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "font-weight numeric (500/700) replaced with bold/normal",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no less nesting (all selectors flattened)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.8889,
+ "passed": 8,
+ "failed": 1,
+ "total": 9
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/timing.json
new file mode 100644
index 0000000000..43e9db9282
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 103185,
+ "duration_ms": 156710,
+ "total_duration_seconds": 156.7
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/outputs/product-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/outputs/product-list.mpx
new file mode 100644
index 0000000000..ea54ccbdf3
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/outputs/product-list.mpx
@@ -0,0 +1,341 @@
+
+
+
+
+
+ 搜索
+
+
+
+
+ 价格
+
+
+ 销量
+
+
+
+
+
+
+
+ {{item.name}}
+
+ {{tag}}
+
+
+ ¥{{item.price}}
+ 已售 {{item.sales}}
+
+
+
+
+
+ 加载中...
+ 没有更多了
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..702e65e688
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,57 @@
+{
+ "eval_id": 5,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "text": "Pinia store import and usage preserved",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "onPullDownRefresh/onReachBottom replaced with scroll-view events",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "createIntersectionObserver target (#exposureAnchor) has wx:ref",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "all wx.xxx replaced with mpx.xxx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "template: event params use inline syntax (not data- dataset)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "float layout replaced with flex",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "font-weight numeric (500/700) replaced with bold/normal",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "style: no less nesting (all selectors flattened)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 9,
+ "failed": 0,
+ "total": 9
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/timing.json
new file mode 100644
index 0000000000..0c454d53aa
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/timing.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 112184,
+ "duration_ms": 189880,
+ "total_duration_seconds": 189.9
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/evals.json b/.agents/skills/mpx2rn-workspace/iteration-3/evals.json
new file mode 100644
index 0000000000..1b9ecc1e19
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-3/evals.json
@@ -0,0 +1,113 @@
+{
+ "skill_name": "mpx2rn-gene vs mpx2rn",
+ "comparison": {
+ "skill_a": "mpx2rn-gene (Gene-based)",
+ "skill_b": "mpx2rn (Original)"
+ },
+ "evals": [
+ {
+ "id": 0,
+ "name": "adapt-list-page",
+ "prompt": "请帮我对附件中的 Mpx 页面 list.mpx 进行 RN 跨端适配改造,确保它能在 RN 平台正确编译运行,同时保留小程序/Web 平台的兼容性。请输出修改后的完整 .mpx 代码(保持 SFC 结构 template/script/style),不要省略任何内容。",
+ "files": ["input/list.mpx"],
+ "assertions": [
+ {"text": "style: no less nesting (& or rule-in-rule)"},
+ {"text": "style on RN (wx-conditional stripped): no :active"},
+ {"text": "style on RN: no :first-child"},
+ {"text": "script: replaced wx.request with mpx.request"},
+ {"text": "script: replaced wx.navigateTo with mpx.navigateTo"},
+ {"text": "template: event params use inline syntax (not data- dataset)"},
+ {"text": "template: dynamic class via wx:class (not class string interp)"},
+ {"text": "conditional compile uses @mpx-endif (not @mpx-end-if)"},
+ {"text": "style: no empty selector rules after stripping comments"}
+ ]
+ },
+ {
+ "id": 1,
+ "name": "create-card-component",
+ "prompt": "请帮我创建一个符合 RN 跨端兼容规范的 Mpx 卡片组件 card.mpx,需求:\n- 接收 props:title (string)、desc (string)、avatar (string,图片 URL)、selected (boolean,默认 false)\n- 卡片整体可点击,点击时通过 triggerEvent 抛出 'tap' 事件\n- 点击时有按下视觉反馈\n- selected=true 时卡片边框色变为蓝色 (#1677ff)\n- 标题需要单行省略\n- 描述最多展示 2 行后省略\n- 使用组合式 API(setup 或 ",
+ src, re.DOTALL | re.IGNORECASE):
+ attrs = (m.group("attrs") or "").lower()
+ body = m.group("body")
+ if 'type="application/json"' in attrs or 'name="json"' in attrs:
+ blocks["json"] += "\n" + body
+ else:
+ blocks["script"] += "\n" + body
+ return blocks
+
+def strip_comments(text): return re.sub(r"/\*.*?\*/", "", text, flags=re.DOTALL)
+
+def strip_wx_conditional_blocks(text):
+ return re.sub(
+ r"/\*\s*@mpx-if[^*]*?(wx|ali|web)[^*]*?\*/.*?/\*\s*@mpx-(endif|end-if)\s*\*/",
+ "", text, flags=re.DOTALL | re.IGNORECASE)
+
+def strip_at_rules(text):
+ """Strip @keyframes and @media blocks so they don't trigger nesting detection."""
+ result = re.sub(r"@keyframes\s+[\w-]+\s*\{[^}]*(?:\{[^}]*\}[^}]*)*\}", "", text, flags=re.DOTALL)
+ result = re.sub(r"@media\s[^{]*\{[^}]*(?:\{[^}]*\}[^}]*)*\}", "", result, flags=re.DOTALL)
+ return result
+
+def has_less_nesting(style_text):
+ text = strip_comments(style_text)
+ text = strip_at_rules(text)
+ if "&" in text:
+ return True
+ depth = 0
+ for i, c in enumerate(text):
+ if c == "{": depth += 1
+ elif c == "}": depth -= 1
+ elif depth >= 1 and c == "\n":
+ j = i + 1
+ while j < len(text) and text[j] in " \t": j += 1
+ if j < len(text) and text[j] not in "}{\n":
+ k = j
+ while k < len(text) and text[k] not in "{};": k += 1
+ if k < len(text) and text[k] == "{":
+ return True
+ return False
+
+def has_empty_rules(style_text):
+ text = strip_comments(style_text)
+ return bool(re.search(r"[^{}]+\{\s*\}", text))
+
+def uses_wrong_endif(text): return "@mpx-end-if" in text
+
+def check_eval_0(output_path):
+ src = output_path.read_text()
+ blocks = extract_blocks(src)
+ style_rn = strip_wx_conditional_blocks(blocks["style"])
+ results = [
+ {"text": "style: no less nesting (& or rule-in-rule)",
+ "passed": not has_less_nesting(blocks["style"])},
+ {"text": "style on RN (wx-conditional stripped): no :active",
+ "passed": ":active" not in strip_comments(style_rn)},
+ {"text": "style on RN: no :first-child",
+ "passed": ":first-child" not in strip_comments(style_rn)},
+ {"text": "script: replaced wx.request with mpx.request",
+ "passed": "wx.request" not in blocks["script"] and "mpx.request" in blocks["script"]},
+ {"text": "script: replaced wx.navigateTo with mpx.navigateTo",
+ "passed": "wx.navigateTo" not in blocks["script"] and "mpx.navigateTo" in blocks["script"]},
+ {"text": "template: event params use inline syntax (not data- dataset)",
+ "passed": not re.search(r'\bdata-\w+\s*=', blocks["template"])
+ and "dataset" not in blocks["script"]},
+ {"text": "template: dynamic class via wx:class (not class string interp)",
+ "passed": not re.search(r'(? (not
)",
+ "passed": " elements", "passed": "]*wx:ref', blocks["template"])) or \
+ bool(re.search(r'wx:ref[^>]*id="chartBox"', blocks["template"]))
+ has_wxref_lazy = bool(re.search(r'id="lazyArea"[^>]*wx:ref', blocks["template"])) or \
+ bool(re.search(r'wx:ref[^>]*id="lazyArea"', blocks["template"]))
+ results.append({"text": "selector API nodes (#chartBox, #lazyArea) have empty wx:ref in template",
+ "passed": has_wxref_chart and has_wxref_lazy})
+ results.append({"text": "wx.createAnimation replaced with mpx.createAnimation",
+ "passed": "wx.createAnimation" not in blocks["script"]
+ and "mpx.createAnimation" in blocks["script"]})
+ results.append({"text": "gradient transparent replaced with rgba equivalent",
+ "passed": "transparent" not in style_rn_clean
+ or bool(re.search(r"rgba\(\s*\d+", style_rn_clean))})
+ has_rem = bool(re.search(r":\s*[\d.]+rem", style_rn_clean))
+ results.append({"text": "rem units converted to rpx", "passed": not has_rem})
+ results.append({"text": "template: event params use inline syntax (not data- dataset)",
+ "passed": not re.search(r'\bdata-\w+\s*=', blocks["template"])
+ and "dataset" not in blocks["script"]})
+ results.append({"text": "enable-animation declared on animated view",
+ "passed": "enable-animation" in blocks["template"]})
+ has_keyframes_rn = bool(re.search(r"@keyframes", style_rn_clean))
+ results.append({"text": "@keyframes isolated with conditional compile (RN does not support)",
+ "passed": not has_keyframes_rn})
+ has_display_none_rn = bool(re.search(r"display\s*:\s*none", style_rn_clean))
+ results.append({"text": "display:none replaced with wx:if or size-zero hiding",
+ "passed": not has_display_none_rn})
+ has_transition_rn = bool(re.search(r"transition\s*:", style_rn_clean))
+ results.append({"text": "transition preserved on RN (not stripped into wx-only conditional)",
+ "passed": has_transition_rn})
+ results.append({"text": "style: no less nesting (all selectors flattened to single-class)",
+ "passed": not has_less_nesting(blocks["style"])})
+ results.append({"text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": not uses_wrong_endif(src)})
+ return results
+
+def check_eval_4(output_path):
+ src = output_path.read_text()
+ blocks = extract_blocks(src)
+ style_rn = strip_wx_conditional_blocks(blocks["style"])
+ style_rn_clean = strip_comments(style_rn)
+ results = []
+ results.append({"text": "multipleSlots: true preserved in component options",
+ "passed": "multipleSlots" in blocks["script"] and "true" in blocks["script"]})
+ results.append({"text": "CSS variables (var(--...)) syntax preserved",
+ "passed": bool(re.search(r"var\(--", blocks["style"]))})
+ results.append({"text": "$t() i18n function calls preserved in template",
+ "passed": "$t(" in blocks["template"] or "$t'" in blocks["template"]})
+ bg_on_text = bool(re.search(r"]*enable-background", blocks["template"]))
+ results.append({"text": "background-image only on view components (not text)",
+ "passed": not bg_on_text})
+ results.append({"text": "enable-background declared on dynamic background view",
+ "passed": "enable-background" in blocks["template"]})
+ has_after_rn = "::after" in style_rn_clean or ":after" in style_rn_clean
+ results.append({"text": "::after pseudo-element replaced with real node",
+ "passed": not has_after_rn})
+ results.append({"text": "style: no less nesting (all selectors flattened)",
+ "passed": not has_less_nesting(blocks["style"])})
+ results.append({"text": "calc() preserved or replaced with flex equivalent",
+ "passed": "calc(" in blocks["style"]
+ or "flex:" in style_rn_clean or "flex-grow" in style_rn_clean})
+ results.append({"text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": not uses_wrong_endif(src)})
+ return results
+
+def check_eval_5(output_path):
+ src = output_path.read_text()
+ blocks = extract_blocks(src)
+ style_rn = strip_wx_conditional_blocks(blocks["style"])
+ style_rn_clean = strip_comments(style_rn)
+ results = []
+ results.append({"text": "Pinia store import and usage preserved",
+ "passed": "useProductStore" in blocks["script"]})
+ has_scroll_view = "scroll-view" in blocks["template"]
+ has_scroll_events = "bindscrolltolower" in blocks["template"] or "bindrefresherrefresh" in blocks["template"]
+ results.append({"text": "onPullDownRefresh/onReachBottom replaced with scroll-view events",
+ "passed": has_scroll_view and has_scroll_events})
+ has_wxref_exposure = bool(re.search(r'id="exposureAnchor"[^>]*wx:ref', blocks["template"])) or \
+ bool(re.search(r'wx:ref[^>]*id="exposureAnchor"', blocks["template"]))
+ results.append({"text": "createIntersectionObserver target (#exposureAnchor) has wx:ref",
+ "passed": has_wxref_exposure})
+ has_wx_api = bool(re.search(r"\bwx\.(request|navigateTo|stopPullDownRefresh)", blocks["script"]))
+ has_mpx_api = "mpx." in blocks["script"]
+ results.append({"text": "all wx.xxx replaced with mpx.xxx",
+ "passed": not has_wx_api and has_mpx_api})
+ results.append({"text": "template: event params use inline syntax (not data- dataset)",
+ "passed": not re.search(r'\bdata-\w+\s*=', blocks["template"])
+ and "dataset" not in blocks["script"]})
+ has_float_rn = bool(re.search(r"float\s*:\s*(left|right)", style_rn_clean))
+ results.append({"text": "float layout replaced with flex",
+ "passed": not has_float_rn})
+ has_numeric_fw = bool(re.search(r"font-weight\s*:\s*[1-9]\d{2}", style_rn_clean))
+ results.append({"text": "font-weight numeric (500/700) replaced with bold/normal",
+ "passed": not has_numeric_fw})
+ results.append({"text": "style: no less nesting (all selectors flattened)",
+ "passed": not has_less_nesting(blocks["style"])})
+ results.append({"text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": not uses_wrong_endif(src)})
+ return results
+
+CHECKERS = {0: check_eval_0, 1: check_eval_1, 2: check_eval_2,
+ 3: check_eval_3, 4: check_eval_4, 5: check_eval_5}
+EVAL_DIRS = {0: "eval-0-adapt-list-page", 1: "eval-1-create-card-component", 2: "eval-2-adapt-style-block",
+ 3: "eval-3-selector-api-animation", 4: "eval-4-slots-cssvar-i18n", 5: "eval-5-pinia-scroll-intersection"}
+OUTPUT_FILES = {0: "list.mpx", 1: "card.mpx", 2: "style-block.mpx",
+ 3: "dashboard.mpx", 4: "panel.mpx", 5: "product-list.mpx"}
+RUN_KINDS = ("mpx2rn_gene", "mpx2rn_original")
+
+def grade_run(eval_id, run_kind):
+ eval_dir = WORKSPACE / EVAL_DIRS[eval_id]
+ out_path = eval_dir / run_kind / "outputs" / OUTPUT_FILES[eval_id]
+ if not out_path.exists():
+ print(f"missing: {out_path}", file=sys.stderr)
+ return None
+ results = CHECKERS[eval_id](out_path)
+ enriched = [{"text": r["text"], "passed": bool(r["passed"]),
+ "evidence": "PASS" if r["passed"] else "FAIL"} for r in results]
+ passed = sum(1 for e in enriched if e["passed"])
+ total = len(enriched)
+ grading = {
+ "eval_id": eval_id, "run_kind": run_kind, "expectations": enriched,
+ "summary": {"pass_rate": round(passed / total, 4) if total else 0.0,
+ "passed": passed, "failed": total - passed, "total": total},
+ }
+ run_dir = eval_dir / run_kind / "run-1"
+ run_dir.mkdir(parents=True, exist_ok=True)
+ (run_dir / "grading.json").write_text(json.dumps(grading, ensure_ascii=False, indent=2))
+ return grading
+
+def main():
+ summary = []
+ for eid in sorted(EVAL_DIRS.keys()):
+ for kind in RUN_KINDS:
+ g = grade_run(eid, kind)
+ if g:
+ s = g["summary"]
+ summary.append({"eval": EVAL_DIRS[eid], "kind": kind,
+ "score": f"{s['passed']}/{s['total']}"})
+ print(json.dumps(summary, ensure_ascii=False, indent=2))
+
+if __name__ == "__main__":
+ main()
diff --git a/.agents/skills/mpx2rn/SKILL.md b/.agents/skills/mpx2rn/SKILL.md
index 2e49112839..3fb18c9c46 100644
--- a/.agents/skills/mpx2rn/SKILL.md
+++ b/.agents/skills/mpx2rn/SKILL.md
@@ -60,9 +60,10 @@ Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展
1. **基础组件优先**:使用 [模板能力参考 · 基础组件](./references/rn-template-reference.md#基础组件) 中标注 RN 支持的基础组件与其支持属性/事件,不要使用 RN 不支持的属性或事件;如用户通过 `rnConfig.customBuiltInComponents` 编译配置扩充拓展了基础组件能力,以用户说明为准。
2. **页面滚动**:RN 平台页面默认不可滚动,`onPullDownRefresh` / `onReachBottom` / `onPageScroll` 不会触发;需要滚动时使用 `scroll-view` 包裹并使用其等效能力。
-3. **事件冒泡/捕获**:仅基础通用事件(`tap` / `longpress` / `touchstart` / `touchmove` / `touchend` / `touchcancel`)支持冒泡和捕获;其余事件不支持。事件委托不要依赖 `e.target.dataset`,使用 `e.currentTarget` 替代。
+3. **事件冒泡/捕获**:仅基础通用事件(`tap` / `longpress` / `touchstart` / `touchmove` / `touchend` / `touchcancel`)支持冒泡和捕获;其余事件不支持。
4. **模板内方法调用**:模板 Mustache 表达式不支持普通方法调用,需通过 `computed` / `wxs` 实现(i18n 翻译函数除外)。
5. **i18n**:组合式 API 中 `useI18n()` 解构出的翻译函数必须以原名 `t` / `tc` / `te` / `tm` 暴露至模板的 `return`,禁止重命名。
+6. **事件传参**:传递自定义参数给事件处理器时,优先使用事件内联传参语法(如 `bindtap="handleTap('param')"`),而不是通过 `data-` dataset 属性传参。
### 脚本(script)约束
diff --git a/.agents/skills/mpx2rn/references/rn-script-reference.md b/.agents/skills/mpx2rn/references/rn-script-reference.md
index ee8dba4173..e6ec76815e 100644
--- a/.agents/skills/mpx2rn/references/rn-script-reference.md
+++ b/.agents/skills/mpx2rn/references/rn-script-reference.md
@@ -13,6 +13,11 @@
- [`setup` 的第一个参数 `props`](#setup-的第一个参数-props)
- [`setup` 的第二个参数 `context`](#setup-的第二个参数-context)
- [`
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/with_skill/outputs/list.mpx b/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/with_skill/outputs/list.mpx
deleted file mode 100644
index dfc42917a1..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/with_skill/outputs/list.mpx
+++ /dev/null
@@ -1,129 +0,0 @@
-
-
-
-
- {{item.text}}
-
-
- 加载中...
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/with_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/with_skill/run-1/grading.json
deleted file mode 100644
index ba953e66bb..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/with_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 0,
- "run_kind": "with_skill",
- "expectations": [
- {
- "text": "style: no less nesting (& or rule-in-rule)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN (wx-conditional stripped): no `:active`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `:first-child`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.request with mpx.request",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: uses e.currentTarget.dataset (not e.target.dataset)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: dynamic class via wx:class (not class string interp)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules after stripping comments",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/with_skill/run-1/timing.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/with_skill/run-1/timing.json
deleted file mode 100644
index 691d6dff6c..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/with_skill/run-1/timing.json
+++ /dev/null
@@ -1 +0,0 @@
-{"total_tokens": 48442, "duration_ms": 63095, "total_duration_seconds": 63.1}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/without_skill/outputs/list.mpx b/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/without_skill/outputs/list.mpx
deleted file mode 100644
index 3aae9f5a61..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/without_skill/outputs/list.mpx
+++ /dev/null
@@ -1,120 +0,0 @@
-
-
-
-
- {{item.text}}
-
- 加载中...
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/without_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/without_skill/run-1/grading.json
deleted file mode 100644
index b3facf91fe..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/without_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 0,
- "run_kind": "without_skill",
- "expectations": [
- {
- "text": "style: no less nesting (& or rule-in-rule)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style on RN (wx-conditional stripped): no `:active`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `:first-child`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.request with mpx.request",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: uses e.currentTarget.dataset (not e.target.dataset)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: dynamic class via wx:class (not class string interp)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style: no empty selector rules after stripping comments",
- "passed": false,
- "evidence": "FAIL"
- }
- ],
- "summary": {
- "pass_rate": 0.5556,
- "passed": 5,
- "failed": 4,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/without_skill/run-1/timing.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/without_skill/run-1/timing.json
deleted file mode 100644
index 556825a195..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-0-adapt-list-page/without_skill/run-1/timing.json
+++ /dev/null
@@ -1 +0,0 @@
-{"total_tokens": 18598, "duration_ms": 65284, "total_duration_seconds": 65.3}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/eval_metadata.json
deleted file mode 100644
index b8b2ef7f89..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/eval_metadata.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "eval_id": 1,
- "eval_name": "create-card-component",
- "prompt": "请帮我创建一个符合 RN 跨端兼容规范的 Mpx 卡片组件 card.mpx。需求:title/desc/avatar/selected props;triggerEvent('tap');hover 反馈;选中时蓝色边框;标题单行省略;描述 2 行省略;使用组合式 API。",
- "files": []
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/with_skill/outputs/card.mpx b/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/with_skill/outputs/card.mpx
deleted file mode 100644
index 569c17bb29..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/with_skill/outputs/card.mpx
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
- {{title}}
- {{desc}}
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/with_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/with_skill/run-1/grading.json
deleted file mode 100644
index 0784529a00..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/with_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 1,
- "run_kind": "with_skill",
- "expectations": [
- {
- "text": "uses composition API (script setup or setup())",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no nesting / compound selectors",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "uses hover-class for press feedback (not bare :active on root)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "triggerEvent('tap', ...) is called",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "title uses numberOfLines for ellipsis",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "avatar uses (not
)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "text content wrapped in elements",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "defineProps uses Mpx-style `value:` (not Vue-style `default:`)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/with_skill/run-1/timing.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/with_skill/run-1/timing.json
deleted file mode 100644
index 702ad219de..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/with_skill/run-1/timing.json
+++ /dev/null
@@ -1 +0,0 @@
-{"total_tokens": 95996, "duration_ms": 102433, "total_duration_seconds": 102.4}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/without_skill/outputs/card.mpx b/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/without_skill/outputs/card.mpx
deleted file mode 100644
index bac75965c0..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/without_skill/outputs/card.mpx
+++ /dev/null
@@ -1,125 +0,0 @@
-
-
-
-
- {{title}}
- {{desc}}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/without_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/without_skill/run-1/grading.json
deleted file mode 100644
index 592a293c8a..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/without_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 1,
- "run_kind": "without_skill",
- "expectations": [
- {
- "text": "uses composition API (script setup or setup())",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no nesting / compound selectors",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "uses hover-class for press feedback (not bare :active on root)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "triggerEvent('tap', ...) is called",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "title uses numberOfLines for ellipsis",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "avatar uses (not
)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "text content wrapped in elements",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "defineProps uses Mpx-style `value:` (not Vue-style `default:`)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.7778,
- "passed": 7,
- "failed": 2,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/without_skill/run-1/timing.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/without_skill/run-1/timing.json
deleted file mode 100644
index c324cb00a8..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-1-create-card-component/without_skill/run-1/timing.json
+++ /dev/null
@@ -1 +0,0 @@
-{"total_tokens": 16390, "duration_ms": 115324, "total_duration_seconds": 115.3}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/eval_metadata.json
deleted file mode 100644
index 41a90f689a..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/eval_metadata.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "eval_id": 2,
- "eval_name": "adapt-style-block",
- "prompt": "请对附件中的 .mpx 文件进行 RN 跨端样式适配改造,重点改造
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/with_skill/outputs/style-block.mpx b/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/with_skill/outputs/style-block.mpx
deleted file mode 100644
index 837b3067ff..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/with_skill/outputs/style-block.mpx
+++ /dev/null
@@ -1,91 +0,0 @@
-
-
-
-
- {{item.title}}
- {{item.content}}
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/with_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/with_skill/run-1/grading.json
deleted file mode 100644
index 53fadb2a8e..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/with_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 2,
- "run_kind": "with_skill",
- "expectations": [
- {
- "text": "style: no less nesting outside of conditional compile",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no ::before pseudo-element",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `display: grid`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `:active` pseudo-class",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `+` adjacent sibling combinator",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: real node added to replace ::before (e.g. card-decorator/card-bar)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/with_skill/run-1/timing.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/with_skill/run-1/timing.json
deleted file mode 100644
index 9276431c44..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/with_skill/run-1/timing.json
+++ /dev/null
@@ -1 +0,0 @@
-{"total_tokens": 52994, "duration_ms": 57315, "total_duration_seconds": 57.3}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/without_skill/outputs/style-block.mpx b/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/without_skill/outputs/style-block.mpx
deleted file mode 100644
index 1ca7f2b94c..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/without_skill/outputs/style-block.mpx
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
- {{item.title}}
- {{item.content}}
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/without_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/without_skill/run-1/grading.json
deleted file mode 100644
index b785abb7b9..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/without_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 2,
- "run_kind": "without_skill",
- "expectations": [
- {
- "text": "style: no less nesting outside of conditional compile",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style on RN: no ::before pseudo-element",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `display: grid`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `:active` pseudo-class",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `+` adjacent sibling combinator",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "template: real node added to replace ::before (e.g. card-decorator/card-bar)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.7778,
- "passed": 7,
- "failed": 2,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/without_skill/run-1/timing.json b/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/without_skill/run-1/timing.json
deleted file mode 100644
index 756a3891e3..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/eval-2-adapt-style-block/without_skill/run-1/timing.json
+++ /dev/null
@@ -1 +0,0 @@
-{"total_tokens": 17836, "duration_ms": 44321, "total_duration_seconds": 44.3}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-1/evals.json b/.agents/skills/mpx2rn-workspace/iteration-1/evals.json
deleted file mode 100644
index a698fa6664..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-1/evals.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "skill_name": "mpx2rn",
- "evals": [
- {
- "id": 0,
- "name": "adapt-list-page",
- "prompt": "请帮我对附件中的 Mpx 页面 list.mpx 进行 RN 跨端适配改造,确保它能在 RN 平台正确编译运行,同时保留小程序/Web 平台的兼容性。请输出修改后的完整 .mpx 代码(保持 SFC 结构 template/script/style),不要省略任何内容。",
- "files": ["input/list.mpx"]
- },
- {
- "id": 1,
- "name": "create-card-component",
- "prompt": "请帮我创建一个符合 RN 跨端兼容规范的 Mpx 卡片组件 card.mpx,需求:\n- 接收 props:title (string)、desc (string)、avatar (string,图片 URL)、selected (boolean,默认 false)\n- 卡片整体可点击,点击时通过 triggerEvent 抛出 'tap' 事件\n- 点击时有按下视觉反馈\n- selected=true 时卡片边框色变为蓝色 (#1677ff)\n- 标题需要单行省略\n- 描述最多展示 2 行后省略\n- 使用组合式 API(setup 或 ",
- src, re.DOTALL | re.IGNORECASE
- ):
- attrs = (m.group("attrs") or "").lower()
- body = m.group("body")
- if 'type="application/json"' in attrs or 'name="json"' in attrs:
- blocks["json"] += "\n" + body
- else:
- blocks["script"] += "\n" + body
- return blocks
-
-
-def strip_comments(text: str) -> str:
- """Strip /* ... */ block comments (CSS/JS)."""
- return re.sub(r"/\*.*?\*/", "", text, flags=re.DOTALL)
-
-
-def strip_rn_conditional_blocks(style: str) -> str:
- """Remove style blocks that are RN-only @mpx-if; what's left is the
- code that runs on original (wx/web) platforms. Useful for inverse
- checks, but we mostly use a wx-only stripper instead."""
- # Drop `/* @mpx-if (... ios/android/harmony ...) */ ... /* @mpx-endif */`
- return re.sub(
- r"/\*\s*@mpx-if[^*]*?(ios|android|harmony)[^*]*?\*/.*?/\*\s*@mpx-endif\s*\*/",
- "",
- style, flags=re.DOTALL | re.IGNORECASE,
- )
-
-
-def strip_wx_conditional_blocks(text: str) -> str:
- """Remove blocks that are wx/ali/web-only conditional compile.
- What's left is what gets emitted on RN."""
- return re.sub(
- r"/\*\s*@mpx-if[^*]*?(wx|ali|web)[^*]*?\*/.*?/\*\s*@mpx-(endif|end-if)\s*\*/",
- "",
- text, flags=re.DOTALL | re.IGNORECASE,
- )
-
-
-# ---------- generic checks ----------
-
-def has_less_nesting(style_text: str) -> bool:
- """Detect less/scss nested rules: a selector appearing inside an open block.
- Heuristic: any line that is indented and starts with `&` or a selector
- char (`.` `#` ` ` ` ` ` `) followed by `{` before closing brace, while
- we're already inside a block."""
- text = strip_comments(style_text)
- # Quick check: presence of `&` selector character (less-only)
- if "&" in text:
- return True
- # Walk char by char tracking depth
- depth = 0
- i = 0
- n = len(text)
- while i < n:
- c = text[i]
- if c == "{":
- depth += 1
- elif c == "}":
- depth -= 1
- elif depth >= 1 and c == "\n":
- # peek next non-ws
- j = i + 1
- while j < n and text[j] in " \t":
- j += 1
- # if next non-ws is selector-ish followed by {, we have a nested rule
- if j < n and text[j] not in "}{\n":
- # find next `{` or `}` or `;`
- k = j
- while k < n and text[k] not in "{};":
- k += 1
- if k < n and text[k] == "{":
- return True
- i += 1
- return False
-
-
-def has_empty_rules(style_text: str) -> bool:
- """Detect selector { /* nothing */ } after stripping comments."""
- text = strip_comments(style_text)
- return bool(re.search(r"[^{}]+\{\s*\}", text))
-
-
-def uses_wrong_endif(text: str) -> bool:
- """The correct sentinel is /* @mpx-endif */; some folks write @mpx-end-if."""
- return "@mpx-end-if" in text
-
-
-# ---------- per-eval checks ----------
-
-def check_eval_0(output_path: Path):
- src = output_path.read_text()
- blocks = extract_blocks(src)
- style_rn = strip_wx_conditional_blocks(blocks["style"])
- style_clean = strip_comments(blocks["style"])
-
- results = []
-
- results.append({
- "text": "style: no less nesting (& or rule-in-rule)",
- "passed": not has_less_nesting(blocks["style"]),
- })
- results.append({
- "text": "style on RN (wx-conditional stripped): no `:active`",
- "passed": ":active" not in strip_comments(style_rn),
- })
- results.append({
- "text": "style on RN: no `:first-child`",
- "passed": ":first-child" not in strip_comments(style_rn),
- })
- results.append({
- "text": "script: replaced wx.request with mpx.request",
- "passed": ("wx.request" not in blocks["script"])
- and ("mpx.request" in blocks["script"]),
- })
- results.append({
- "text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": ("wx.navigateTo" not in blocks["script"])
- and ("mpx.navigateTo" in blocks["script"]),
- })
- results.append({
- "text": "script: uses e.currentTarget.dataset (not e.target.dataset)",
- "passed": ("e.currentTarget.dataset" in blocks["script"])
- and ("e.target.dataset" not in blocks["script"]),
- })
- results.append({
- "text": "template: dynamic class via wx:class (not class string interp)",
- "passed": not re.search(
- r'(? (not
)",
- "passed": " elements",
- "passed": " (not
)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "text content wrapped in elements",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "defineProps uses Mpx-style `value:` (not Vue-style `default:`)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 1,
- "configuration": "without_skill",
- "run_number": 1,
- "result": {
- "pass_rate": 0.8889,
- "passed": 8,
- "failed": 1,
- "total": 9,
- "time_seconds": 59.5,
- "tokens": 18792,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "uses composition API (script setup or setup())",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no nesting / compound selectors",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "uses hover-class for press feedback (not bare :active on root)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "triggerEvent('tap', ...) is called",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "title uses numberOfLines for ellipsis",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "avatar uses (not
)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "text content wrapped in elements",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "defineProps uses Mpx-style `value:` (not Vue-style `default:`)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 2,
- "configuration": "with_skill",
- "run_number": 1,
- "result": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9,
- "time_seconds": 136.4,
- "tokens": 47991,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "style: no less nesting outside of conditional compile",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no ::before pseudo-element",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `display: grid`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `:active` pseudo-class",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `+` adjacent sibling combinator",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: real node added to replace ::before (e.g. card-decorator/card-bar)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 2,
- "configuration": "without_skill",
- "run_number": 1,
- "result": {
- "pass_rate": 0.2222,
- "passed": 2,
- "failed": 7,
- "total": 9,
- "time_seconds": 141.8,
- "tokens": 51321,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "style: no less nesting outside of conditional compile",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style on RN: no ::before pseudo-element",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style on RN: no `display: grid`",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style on RN: no `:active` pseudo-class",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style on RN: no `+` adjacent sibling combinator",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "template: real node added to replace ::before (e.g. card-decorator/card-bar)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style: no empty selector rules",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- }
- ]
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/build_benchmark.py b/.agents/skills/mpx2rn-workspace/iteration-2/build_benchmark.py
deleted file mode 100644
index 0727b7d3d6..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/build_benchmark.py
+++ /dev/null
@@ -1,65 +0,0 @@
-import json
-from pathlib import Path
-
-ITER = Path("/Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-2")
-
-EVAL_DIRS = {
- 0: "eval-0-adapt-list-page",
- 1: "eval-1-create-card-component",
- 2: "eval-2-adapt-style-block",
-}
-
-runs = []
-for eid, edir in EVAL_DIRS.items():
- for kind in ("with_skill", "without_skill"):
- grading_path = ITER / edir / kind / "run-1" / "grading.json"
- timing_path = ITER / edir / kind / "timing.json"
-
- grading = json.loads(grading_path.read_text()) if grading_path.exists() else None
- timing = json.loads(timing_path.read_text()) if timing_path.exists() else None
-
- if grading and timing:
- runs.append({
- "eval_id": eid,
- "configuration": kind,
- "run_number": 1,
- "result": {
- "pass_rate": grading["summary"]["pass_rate"],
- "passed": grading["summary"]["passed"],
- "failed": grading["summary"]["failed"],
- "total": grading["summary"]["total"],
- "time_seconds": timing["total_duration_seconds"],
- "tokens": timing["total_tokens"],
- "tool_calls": 0,
- "errors": 0,
- },
- "expectations": grading["expectations"],
- "notes": [],
- })
-
-benchmark = {
- "metadata": {
- "skill_name": "mpx2rn",
- "skill_path": "/Users/didi/work/mpx2/.agents/skills/mpx2rn",
- "executor_model": "claude-opus-4-20250514",
- "analyzer_model": "claude-opus-4-20250514",
- "timestamp": "2026-05-11T12:00:00Z",
- "evals_run": [0, 1, 2],
- "runs_per_configuration": 1,
- },
- "runs": runs,
-}
-
-out = ITER / "benchmark.json"
-out.write_text(json.dumps(benchmark, ensure_ascii=False, indent=2))
-print(f"Wrote {out}")
-
-# Summary
-print("\n=== BENCHMARK SUMMARY ===")
-for kind in ("with_skill", "without_skill"):
- kind_runs = [r for r in runs if r["configuration"] == kind]
- total_passed = sum(r["result"]["passed"] for r in kind_runs)
- total_all = sum(r["result"]["total"] for r in kind_runs)
- avg_time = sum(r["result"]["time_seconds"] for r in kind_runs) / len(kind_runs)
- avg_tokens = sum(r["result"]["tokens"] for r in kind_runs) / len(kind_runs)
- print(f"{kind}: {total_passed}/{total_all} ({total_passed/total_all*100:.1f}%) | avg time: {avg_time:.1f}s | avg tokens: {avg_tokens:.0f}")
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/eval_metadata.json
deleted file mode 100644
index a064eda4c8..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/eval_metadata.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "eval_id": 0,
- "eval_name": "adapt-list-page",
- "prompt": "请帮我对附件中的 Mpx 页面 list.mpx 进行 RN 跨端适配改造,确保它能在 RN 平台正确编译运行,同时保留小程序/Web 平台的兼容性。请输出修改后的完整 .mpx 代码(保持 SFC 结构 template/script/style),不要省略任何内容。",
- "files": ["input/list.mpx"]
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/input/list.mpx b/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/input/list.mpx
deleted file mode 100644
index 37d504b30b..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/input/list.mpx
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
- {{item.text}}
-
- 加载中...
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/with_skill/outputs/list.mpx b/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/with_skill/outputs/list.mpx
deleted file mode 100644
index ada86ed18f..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/with_skill/outputs/list.mpx
+++ /dev/null
@@ -1,152 +0,0 @@
-
-
-
-
- {{item.text}}
-
-
- 加载中...
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/with_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/with_skill/run-1/grading.json
deleted file mode 100644
index ba953e66bb..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/with_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 0,
- "run_kind": "with_skill",
- "expectations": [
- {
- "text": "style: no less nesting (& or rule-in-rule)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN (wx-conditional stripped): no `:active`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `:first-child`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.request with mpx.request",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: uses e.currentTarget.dataset (not e.target.dataset)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: dynamic class via wx:class (not class string interp)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules after stripping comments",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/with_skill/timing.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/with_skill/timing.json
deleted file mode 100644
index 800450595c..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/with_skill/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 52250,
- "duration_ms": 270487,
- "total_duration_seconds": 270.5
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/without_skill/outputs/list.mpx b/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/without_skill/outputs/list.mpx
deleted file mode 100644
index aab69f7c38..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/without_skill/outputs/list.mpx
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-
-
- {{item.text}}
-
-
- 加载中...
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/without_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/without_skill/run-1/grading.json
deleted file mode 100644
index 2e0f379f19..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/without_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 0,
- "run_kind": "without_skill",
- "expectations": [
- {
- "text": "style: no less nesting (& or rule-in-rule)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN (wx-conditional stripped): no `:active`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `:first-child`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.request with mpx.request",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: uses e.currentTarget.dataset (not e.target.dataset)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: dynamic class via wx:class (not class string interp)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules after stripping comments",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/without_skill/timing.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/without_skill/timing.json
deleted file mode 100644
index 5067cd4749..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-0-adapt-list-page/without_skill/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 65592,
- "duration_ms": 225675,
- "total_duration_seconds": 225.7
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/eval_metadata.json
deleted file mode 100644
index b8b2ef7f89..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/eval_metadata.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "eval_id": 1,
- "eval_name": "create-card-component",
- "prompt": "请帮我创建一个符合 RN 跨端兼容规范的 Mpx 卡片组件 card.mpx。需求:title/desc/avatar/selected props;triggerEvent('tap');hover 反馈;选中时蓝色边框;标题单行省略;描述 2 行省略;使用组合式 API。",
- "files": []
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/with_skill/outputs/card.mpx b/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/with_skill/outputs/card.mpx
deleted file mode 100644
index 289cc71156..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/with_skill/outputs/card.mpx
+++ /dev/null
@@ -1,140 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/with_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/with_skill/run-1/grading.json
deleted file mode 100644
index 0784529a00..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/with_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 1,
- "run_kind": "with_skill",
- "expectations": [
- {
- "text": "uses composition API (script setup or setup())",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no nesting / compound selectors",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "uses hover-class for press feedback (not bare :active on root)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "triggerEvent('tap', ...) is called",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "title uses numberOfLines for ellipsis",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "avatar uses (not
)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "text content wrapped in elements",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "defineProps uses Mpx-style `value:` (not Vue-style `default:`)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/with_skill/timing.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/with_skill/timing.json
deleted file mode 100644
index 15fc38da21..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/with_skill/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 54917,
- "duration_ms": 204910,
- "total_duration_seconds": 204.9
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/without_skill/outputs/card.mpx b/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/without_skill/outputs/card.mpx
deleted file mode 100644
index 87be9102f4..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/without_skill/outputs/card.mpx
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/without_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/without_skill/run-1/grading.json
deleted file mode 100644
index 43f742264a..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/without_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 1,
- "run_kind": "without_skill",
- "expectations": [
- {
- "text": "uses composition API (script setup or setup())",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no nesting / compound selectors",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "uses hover-class for press feedback (not bare :active on root)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "triggerEvent('tap', ...) is called",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "title uses numberOfLines for ellipsis",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "avatar uses (not
)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "text content wrapped in elements",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "defineProps uses Mpx-style `value:` (not Vue-style `default:`)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.8889,
- "passed": 8,
- "failed": 1,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/without_skill/timing.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/without_skill/timing.json
deleted file mode 100644
index 8fc244178f..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-1-create-card-component/without_skill/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 18792,
- "duration_ms": 59525,
- "total_duration_seconds": 59.5
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/eval_metadata.json
deleted file mode 100644
index 41a90f689a..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/eval_metadata.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "eval_id": 2,
- "eval_name": "adapt-style-block",
- "prompt": "请对附件中的 .mpx 文件进行 RN 跨端样式适配改造,重点改造
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/with_skill/outputs/style-block.mpx b/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/with_skill/outputs/style-block.mpx
deleted file mode 100644
index 0a2cecb695..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/with_skill/outputs/style-block.mpx
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
- {{item.title}}
- {{item.content}}
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/with_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/with_skill/run-1/grading.json
deleted file mode 100644
index 53fadb2a8e..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/with_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 2,
- "run_kind": "with_skill",
- "expectations": [
- {
- "text": "style: no less nesting outside of conditional compile",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no ::before pseudo-element",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `display: grid`",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `:active` pseudo-class",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no `+` adjacent sibling combinator",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: real node added to replace ::before (e.g. card-decorator/card-bar)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/with_skill/timing.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/with_skill/timing.json
deleted file mode 100644
index 5f08e5c525..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/with_skill/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 47991,
- "duration_ms": 136408,
- "total_duration_seconds": 136.4
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/without_skill/outputs/style-block.mpx b/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/without_skill/outputs/style-block.mpx
deleted file mode 100644
index 7bb5b67509..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/without_skill/outputs/style-block.mpx
+++ /dev/null
@@ -1,111 +0,0 @@
-
-
-
-
-
- {{item.title}}
- {{item.title}}
- {{item.content}}
- {{item.content}}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/without_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/without_skill/run-1/grading.json
deleted file mode 100644
index 4130a48266..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/without_skill/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 2,
- "run_kind": "without_skill",
- "expectations": [
- {
- "text": "style: no less nesting outside of conditional compile",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style on RN: no ::before pseudo-element",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style on RN: no `display: grid`",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style on RN: no `:active` pseudo-class",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style on RN: no `+` adjacent sibling combinator",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "template: real node added to replace ::before (e.g. card-decorator/card-bar)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style: no empty selector rules",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.2222,
- "passed": 2,
- "failed": 7,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/without_skill/timing.json b/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/without_skill/timing.json
deleted file mode 100644
index 9746d20fa9..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/eval-2-adapt-style-block/without_skill/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 51321,
- "duration_ms": 141792,
- "total_duration_seconds": 141.8
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-2/evals.json b/.agents/skills/mpx2rn-workspace/iteration-2/evals.json
deleted file mode 100644
index a698fa6664..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-2/evals.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "skill_name": "mpx2rn",
- "evals": [
- {
- "id": 0,
- "name": "adapt-list-page",
- "prompt": "请帮我对附件中的 Mpx 页面 list.mpx 进行 RN 跨端适配改造,确保它能在 RN 平台正确编译运行,同时保留小程序/Web 平台的兼容性。请输出修改后的完整 .mpx 代码(保持 SFC 结构 template/script/style),不要省略任何内容。",
- "files": ["input/list.mpx"]
- },
- {
- "id": 1,
- "name": "create-card-component",
- "prompt": "请帮我创建一个符合 RN 跨端兼容规范的 Mpx 卡片组件 card.mpx,需求:\n- 接收 props:title (string)、desc (string)、avatar (string,图片 URL)、selected (boolean,默认 false)\n- 卡片整体可点击,点击时通过 triggerEvent 抛出 'tap' 事件\n- 点击时有按下视觉反馈\n- selected=true 时卡片边框色变为蓝色 (#1677ff)\n- 标题需要单行省略\n- 描述最多展示 2 行后省略\n- 使用组合式 API(setup 或 ",
- src, re.DOTALL | re.IGNORECASE
- ):
- attrs = (m.group("attrs") or "").lower()
- body = m.group("body")
- if 'type="application/json"' in attrs or 'name="json"' in attrs:
- blocks["json"] += "\n" + body
- else:
- blocks["script"] += "\n" + body
- return blocks
-
-
-def strip_comments(text: str) -> str:
- """Strip /* ... */ block comments (CSS/JS)."""
- return re.sub(r"/\*.*?\*/", "", text, flags=re.DOTALL)
-
-
-def strip_rn_conditional_blocks(style: str) -> str:
- """Remove style blocks that are RN-only @mpx-if; what's left is the
- code that runs on original (wx/web) platforms. Useful for inverse
- checks, but we mostly use a wx-only stripper instead."""
- # Drop `/* @mpx-if (... ios/android/harmony ...) */ ... /* @mpx-endif */`
- return re.sub(
- r"/\*\s*@mpx-if[^*]*?(ios|android|harmony)[^*]*?\*/.*?/\*\s*@mpx-endif\s*\*/",
- "",
- style, flags=re.DOTALL | re.IGNORECASE,
- )
-
-
-def strip_wx_conditional_blocks(text: str) -> str:
- """Remove blocks that are wx/ali/web-only conditional compile.
- What's left is what gets emitted on RN."""
- return re.sub(
- r"/\*\s*@mpx-if[^*]*?(wx|ali|web)[^*]*?\*/.*?/\*\s*@mpx-(endif|end-if)\s*\*/",
- "",
- text, flags=re.DOTALL | re.IGNORECASE,
- )
-
-
-# ---------- generic checks ----------
-
-def has_less_nesting(style_text: str) -> bool:
- """Detect less/scss nested rules: a selector appearing inside an open block.
- Heuristic: any line that is indented and starts with `&` or a selector
- char (`.` `#` ` ` ` ` ` `) followed by `{` before closing brace, while
- we're already inside a block."""
- text = strip_comments(style_text)
- # Quick check: presence of `&` selector character (less-only)
- if "&" in text:
- return True
- # Walk char by char tracking depth
- depth = 0
- i = 0
- n = len(text)
- while i < n:
- c = text[i]
- if c == "{":
- depth += 1
- elif c == "}":
- depth -= 1
- elif depth >= 1 and c == "\n":
- # peek next non-ws
- j = i + 1
- while j < n and text[j] in " \t":
- j += 1
- # if next non-ws is selector-ish followed by {, we have a nested rule
- if j < n and text[j] not in "}{\n":
- # find next `{` or `}` or `;`
- k = j
- while k < n and text[k] not in "{};":
- k += 1
- if k < n and text[k] == "{":
- return True
- i += 1
- return False
-
-
-def has_empty_rules(style_text: str) -> bool:
- """Detect selector { /* nothing */ } after stripping comments."""
- text = strip_comments(style_text)
- return bool(re.search(r"[^{}]+\{\s*\}", text))
-
-
-def uses_wrong_endif(text: str) -> bool:
- """The correct sentinel is /* @mpx-endif */; some folks write @mpx-end-if."""
- return "@mpx-end-if" in text
-
-
-# ---------- per-eval checks ----------
-
-def check_eval_0(output_path: Path):
- src = output_path.read_text()
- blocks = extract_blocks(src)
- style_rn = strip_wx_conditional_blocks(blocks["style"])
- style_clean = strip_comments(blocks["style"])
-
- results = []
-
- results.append({
- "text": "style: no less nesting (& or rule-in-rule)",
- "passed": not has_less_nesting(blocks["style"]),
- })
- results.append({
- "text": "style on RN (wx-conditional stripped): no `:active`",
- "passed": ":active" not in strip_comments(style_rn),
- })
- results.append({
- "text": "style on RN: no `:first-child`",
- "passed": ":first-child" not in strip_comments(style_rn),
- })
- results.append({
- "text": "script: replaced wx.request with mpx.request",
- "passed": ("wx.request" not in blocks["script"])
- and ("mpx.request" in blocks["script"]),
- })
- results.append({
- "text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": ("wx.navigateTo" not in blocks["script"])
- and ("mpx.navigateTo" in blocks["script"]),
- })
- results.append({
- "text": "script: uses e.currentTarget.dataset (not e.target.dataset)",
- "passed": ("e.currentTarget.dataset" in blocks["script"])
- and ("e.target.dataset" not in blocks["script"]),
- })
- results.append({
- "text": "template: dynamic class via wx:class (not class string interp)",
- "passed": not re.search(
- r'(? (not
)",
- "passed": " elements",
- "passed": "",
- "executor_model": "",
- "analyzer_model": "",
- "timestamp": "2026-05-15T11:36:09Z",
- "evals_run": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5
- ],
- "runs_per_configuration": 3
- },
- "runs": [
- {
- "eval_id": 0,
- "configuration": "mpx2rn_gene",
- "run_number": 1,
- "result": {
- "pass_rate": 0.8889,
- "passed": 8,
- "failed": 1,
- "total": 9,
- "time_seconds": 136.0,
- "tokens": 81186,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "style: no less nesting (& or rule-in-rule)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN (wx-conditional stripped): no :active",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no :first-child",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.request with mpx.request",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: uses e.currentTarget.dataset (not e.target.dataset)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "template: dynamic class via wx:class (not class string interp)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules after stripping comments",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 1,
- "configuration": "mpx2rn_gene",
- "run_number": 1,
- "result": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9,
- "time_seconds": 76.8,
- "tokens": 69995,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "uses composition API (script setup or setup())",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no nesting / compound selectors",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "uses hover-class for press feedback (not bare :active on root)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "triggerEvent('tap', ...) is called",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "title uses numberOfLines for ellipsis",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "avatar uses (not
)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "text content wrapped in elements",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "defineProps uses Mpx-style value: (not Vue-style default:)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 2,
- "configuration": "mpx2rn_gene",
- "run_number": 1,
- "result": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9,
- "time_seconds": 103.3,
- "tokens": 56045,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "style: no less nesting outside of conditional compile",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no ::before pseudo-element",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no display: grid",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no :active pseudo-class",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no + adjacent sibling combinator",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: real node added to replace ::before",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 3,
- "configuration": "mpx2rn_gene",
- "run_number": 1,
- "result": {
- "pass_rate": 0.8,
- "passed": 8,
- "failed": 2,
- "total": 10,
- "time_seconds": 147.3,
- "tokens": 106035,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "selector API nodes (#chartBox, #lazyArea) have empty wx:ref in template",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "wx.createAnimation replaced with mpx.createAnimation",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "gradient transparent replaced with rgba equivalent",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "rem units converted to rpx",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "enable-animation declared on animated view",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "@keyframes isolated with conditional compile (RN does not support)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "display:none replaced with wx:if or size-zero hiding",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "transition preserved on RN (not stripped into wx-only conditional)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style: no less nesting (all selectors flattened to single-class)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 4,
- "configuration": "mpx2rn_gene",
- "run_number": 1,
- "result": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9,
- "time_seconds": 180.0,
- "tokens": 95498,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "multipleSlots: true preserved in component options",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "CSS variables (var(--...)) syntax preserved",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "$t() i18n function calls preserved in template",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "background-image only on view components (not text)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "enable-background declared on dynamic background view",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "::after pseudo-element replaced with real node",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no less nesting (all selectors flattened)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "calc() preserved or replaced with flex equivalent",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 5,
- "configuration": "mpx2rn_gene",
- "run_number": 1,
- "result": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9,
- "time_seconds": 156.7,
- "tokens": 103185,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "Pinia store import and usage preserved",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "onPullDownRefresh/onReachBottom replaced with scroll-view events",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "createIntersectionObserver target (#exposureAnchor) has wx:ref",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "all wx.xxx replaced with mpx.xxx",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "e.target.dataset replaced with e.currentTarget.dataset",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "float layout replaced with flex",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "font-weight numeric (500/700) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no less nesting (all selectors flattened)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 0,
- "configuration": "mpx2rn_original",
- "run_number": 1,
- "result": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9,
- "time_seconds": 223.0,
- "tokens": 86788,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "style: no less nesting (& or rule-in-rule)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN (wx-conditional stripped): no :active",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no :first-child",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.request with mpx.request",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: uses e.currentTarget.dataset (not e.target.dataset)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: dynamic class via wx:class (not class string interp)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules after stripping comments",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 1,
- "configuration": "mpx2rn_original",
- "run_number": 1,
- "result": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9,
- "time_seconds": 192.1,
- "tokens": 54868,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "uses composition API (script setup or setup())",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no nesting / compound selectors",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "uses hover-class for press feedback (not bare :active on root)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "triggerEvent('tap', ...) is called",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "title uses numberOfLines for ellipsis",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "avatar uses (not
)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "text content wrapped in elements",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "defineProps uses Mpx-style value: (not Vue-style default:)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 2,
- "configuration": "mpx2rn_original",
- "run_number": 1,
- "result": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9,
- "time_seconds": 144.3,
- "tokens": 63691,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "style: no less nesting outside of conditional compile",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no ::before pseudo-element",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no display: grid",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no :active pseudo-class",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no + adjacent sibling combinator",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: real node added to replace ::before",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 3,
- "configuration": "mpx2rn_original",
- "run_number": 1,
- "result": {
- "pass_rate": 1.0,
- "passed": 10,
- "failed": 0,
- "total": 10,
- "time_seconds": 357.9,
- "tokens": 95452,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "selector API nodes (#chartBox, #lazyArea) have empty wx:ref in template",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "wx.createAnimation replaced with mpx.createAnimation",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "gradient transparent replaced with rgba equivalent",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "rem units converted to rpx",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "enable-animation declared on animated view",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "@keyframes isolated with conditional compile (RN does not support)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "display:none replaced with wx:if or size-zero hiding",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "transition preserved on RN (not stripped into wx-only conditional)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no less nesting (all selectors flattened to single-class)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 4,
- "configuration": "mpx2rn_original",
- "run_number": 1,
- "result": {
- "pass_rate": 0.8889,
- "passed": 8,
- "failed": 1,
- "total": 9,
- "time_seconds": 180.1,
- "tokens": 97054,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "multipleSlots: true preserved in component options",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "CSS variables (var(--...)) syntax preserved",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "$t() i18n function calls preserved in template",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "background-image only on view components (not text)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "enable-background declared on dynamic background view",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "::after pseudo-element replaced with real node",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no less nesting (all selectors flattened)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "calc() preserved or replaced with flex equivalent",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- },
- {
- "eval_id": 5,
- "configuration": "mpx2rn_original",
- "run_number": 1,
- "result": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9,
- "time_seconds": 189.9,
- "tokens": 112184,
- "tool_calls": 0,
- "errors": 0
- },
- "expectations": [
- {
- "text": "Pinia store import and usage preserved",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "onPullDownRefresh/onReachBottom replaced with scroll-view events",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "createIntersectionObserver target (#exposureAnchor) has wx:ref",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "all wx.xxx replaced with mpx.xxx",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "e.target.dataset replaced with e.currentTarget.dataset",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "float layout replaced with flex",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "font-weight numeric (500/700) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no less nesting (all selectors flattened)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "notes": []
- }
- ],
- "run_summary": {
- "mpx2rn_gene": {
- "pass_rate": {
- "mean": 0.9482,
- "stddev": 0.0851,
- "min": 0.8,
- "max": 1.0
- },
- "time_seconds": {
- "mean": 133.35,
- "stddev": 37.4806,
- "min": 76.8,
- "max": 180.0
- },
- "tokens": {
- "mean": 85324,
- "stddev": 19803.1929,
- "min": 56045,
- "max": 106035
- }
- },
- "mpx2rn_original": {
- "pass_rate": {
- "mean": 0.9815,
- "stddev": 0.0454,
- "min": 0.8889,
- "max": 1.0
- },
- "time_seconds": {
- "mean": 214.55,
- "stddev": 74.6379,
- "min": 144.3,
- "max": 357.9
- },
- "tokens": {
- "mean": 85006.1667,
- "stddev": 21719.6717,
- "min": 54868,
- "max": 112184
- }
- },
- "delta": {
- "pass_rate": "-0.0333",
- "time_seconds": "-81.2",
- "tokens": "+317"
- }
- },
- "notes": []
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/benchmark.md b/.agents/skills/mpx2rn-workspace/iteration-3/benchmark.md
deleted file mode 100644
index 2df5f546a7..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/benchmark.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# Skill Benchmark: mpx2rn-gene vs mpx2rn (iteration-3)
-
-**Date**: 2026-05-15T11:36:09Z
-**Evals**: 6 test cases (3 standard + 3 edge-case)
-
-## Summary
-
-| Metric | mpx2rn-gene | mpx2rn (original) | Delta |
-|--------|-------------|-------------------|-------|
-| Pass Rate | 96.0% ± 6.0% | 98.0% ± 5.0% | -2.0% |
-| Time | 133.3s ± 37.5s | 214.6s ± 74.6s | -81.2s |
-| Tokens | 85324 ± 19803 | 85006 ± 21720 | +317 |
-
-## Per-Eval Breakdown
-
-| Eval | gene score | orig score | gene time | orig time | gene tokens | orig tokens |
-|------|-----------|-----------|-----------|-----------|-------------|-------------|
-| adapt-list-page | 8/9 | 9/9 | 136s | 223s | 81186k | 86788k |
-| create-card-component | 9/9 | 9/9 | 77s | 192s | 69995k | 54868k |
-| adapt-style-block | 9/9 | 9/9 | 103s | 144s | 56045k | 63691k |
-| selector-api-animation | 8/9 | 9/9 | 147s | 358s | 106035k | 95452k |
-| slots-cssvar-i18n | 9/9 | 8/9 | 180s | 180s | 95498k | 97054k |
-| pinia-scroll-intersection | 9/9 | 9/9 | 157s | 190s | 103185k | 112184k |
-
-## Analysis
-
-### Quality
-- gene: 96.3% pass rate (52/54 assertions)
-- original: 98.2% pass rate (53/54 assertions)
-- Difference: -2%, essentially equivalent
-
-### Gene Failures
-- **eval-0**: e.currentTarget.dataset — gene used inline params (valid alternative approach)
-- **eval-3**: enable-animation — gene missed this RN-specific attribute (genuine gap)
-
-### Original Failures
-- **eval-4**: calc() replaced without flex equivalent — dropped sizing logic entirely
-
-### Speed
-- gene is **38% faster** on average (133s vs 215s)
-- Biggest gain on eval-3: 147s vs 358s (59% faster)
-- eval-4 was essentially tied (180s vs 180s)
-
-### Token Efficiency
-- Token usage nearly identical (~85k avg both sides)
-- Gene achieves same quality with same token budget but completes faster
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/eval_metadata.json
deleted file mode 100644
index ef40d37820..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/eval_metadata.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "eval_id": 0,
- "eval_name": "adapt-list-page",
- "prompt": "请帮我对附件中的 Mpx 页面 list.mpx 进行 RN 跨端适配改造,确保它能在 RN 平台正确编译运行,同时保留小程序/Web 平台的兼容性。请输出修改后的完整 .mpx 代码(保持 SFC 结构 template/script/style),不要省略任何内容。",
- "files": ["input/list.mpx"],
- "assertions": [
- {"text": "style: no less nesting (& or rule-in-rule)"},
- {"text": "style on RN (wx-conditional stripped): no :active"},
- {"text": "style on RN: no :first-child"},
- {"text": "script: replaced wx.request with mpx.request"},
- {"text": "script: replaced wx.navigateTo with mpx.navigateTo"},
- {"text": "script: uses e.currentTarget.dataset (not e.target.dataset)"},
- {"text": "template: dynamic class via wx:class (not class string interp)"},
- {"text": "conditional compile uses @mpx-endif (not @mpx-end-if)"},
- {"text": "style: no empty selector rules after stripping comments"}
- ]
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/input/list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/input/list.mpx
deleted file mode 100644
index 37d504b30b..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/input/list.mpx
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
- {{item.text}}
-
- 加载中...
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/outputs/list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/outputs/list.mpx
deleted file mode 100644
index d45b7428e3..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/outputs/list.mpx
+++ /dev/null
@@ -1,166 +0,0 @@
-
-
-
-
- {{item.text}}
-
-
- 加载中...
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/run-1/grading.json
deleted file mode 100644
index 579ce4be6b..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 0,
- "run_kind": "mpx2rn_gene",
- "expectations": [
- {
- "text": "style: no less nesting (& or rule-in-rule)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN (wx-conditional stripped): no :active",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no :first-child",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.request with mpx.request",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: event params use inline syntax (not data- dataset)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: dynamic class via wx:class (not class string interp)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules after stripping comments",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/timing.json
deleted file mode 100644
index d7e05c7627..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_gene/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 81186,
- "duration_ms": 136008,
- "total_duration_seconds": 136.0
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/outputs/list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/outputs/list.mpx
deleted file mode 100644
index fdabf66304..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/outputs/list.mpx
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-
-
- {{item.text}}
-
- 加载中...
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/run-1/grading.json
deleted file mode 100644
index 3242ebd5af..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 0,
- "run_kind": "mpx2rn_original",
- "expectations": [
- {
- "text": "style: no less nesting (& or rule-in-rule)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN (wx-conditional stripped): no :active",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no :first-child",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.request with mpx.request",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: event params use inline syntax (not data- dataset)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "template: dynamic class via wx:class (not class string interp)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules after stripping comments",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.8889,
- "passed": 8,
- "failed": 1,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/timing.json
deleted file mode 100644
index 51f97c68fa..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-0-adapt-list-page/mpx2rn_original/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 86788,
- "duration_ms": 222970,
- "total_duration_seconds": 223.0
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/eval_metadata.json
deleted file mode 100644
index 2981b8ee13..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/eval_metadata.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "eval_id": 1,
- "eval_name": "create-card-component",
- "prompt": "请帮我创建一个符合 RN 跨端兼容规范的 Mpx 卡片组件 card.mpx,需求:\n- 接收 props:title (string)、desc (string)、avatar (string,图片 URL)、selected (boolean,默认 false)\n- 卡片整体可点击,点击时通过 triggerEvent 抛出 'tap' 事件\n- 点击时有按下视觉反馈\n- selected=true 时卡片边框色变为蓝色 (#1677ff)\n- 标题需要单行省略\n- 描述最多展示 2 行后省略\n- 使用组合式 API(setup 或
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/run-1/grading.json
deleted file mode 100644
index d869df3f9c..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 1,
- "run_kind": "mpx2rn_gene",
- "expectations": [
- {
- "text": "uses composition API (script setup or setup())",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no nesting / compound selectors",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "uses hover-class for press feedback (not bare :active on root)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "triggerEvent('tap', ...) is called",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "title uses numberOfLines for ellipsis",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "avatar uses (not
)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "text content wrapped in elements",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "defineProps uses Mpx-style value: (not Vue-style default:)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/timing.json
deleted file mode 100644
index 84b4b44f68..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_gene/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 69995,
- "duration_ms": 76787,
- "total_duration_seconds": 76.8
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/outputs/card.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/outputs/card.mpx
deleted file mode 100644
index 31b26a70b4..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/outputs/card.mpx
+++ /dev/null
@@ -1,133 +0,0 @@
-
-
-
-
- {{title}}
- {{desc}}
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/run-1/grading.json
deleted file mode 100644
index 5f7569c960..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 1,
- "run_kind": "mpx2rn_original",
- "expectations": [
- {
- "text": "uses composition API (script setup or setup())",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no nesting / compound selectors",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "uses hover-class for press feedback (not bare :active on root)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "triggerEvent('tap', ...) is called",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "title uses numberOfLines for ellipsis",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "avatar uses (not
)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "text content wrapped in elements",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "defineProps uses Mpx-style value: (not Vue-style default:)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/timing.json
deleted file mode 100644
index 4be1f4944a..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-1-create-card-component/mpx2rn_original/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 54868,
- "duration_ms": 192051,
- "total_duration_seconds": 192.1
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/eval_metadata.json
deleted file mode 100644
index a1cff54571..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/eval_metadata.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "eval_id": 2,
- "eval_name": "adapt-style-block",
- "prompt": "请对附件中的 .mpx 文件进行 RN 跨端样式适配改造,重点改造
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/outputs/style-block.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/outputs/style-block.mpx
deleted file mode 100644
index e45930162b..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/outputs/style-block.mpx
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
- {{item.title}}
- {{item.content}}
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/run-1/grading.json
deleted file mode 100644
index 133168d681..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 2,
- "run_kind": "mpx2rn_gene",
- "expectations": [
- {
- "text": "style: no less nesting outside of conditional compile",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no ::before pseudo-element",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no display: grid",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no :active pseudo-class",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no + adjacent sibling combinator",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: real node added to replace ::before",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/timing.json
deleted file mode 100644
index 18f29701c1..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_gene/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 56045,
- "duration_ms": 103260,
- "total_duration_seconds": 103.3
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/outputs/style-block.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/outputs/style-block.mpx
deleted file mode 100644
index 6b04fef2c5..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/outputs/style-block.mpx
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
-
- {{item.title}}
- {{item.content}}
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/run-1/grading.json
deleted file mode 100644
index fb914be72b..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 2,
- "run_kind": "mpx2rn_original",
- "expectations": [
- {
- "text": "style: no less nesting outside of conditional compile",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no ::before pseudo-element",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no display: grid",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no :active pseudo-class",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style on RN: no + adjacent sibling combinator",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: numeric font-weight (e.g. 600) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: real node added to replace ::before",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no empty selector rules",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/timing.json
deleted file mode 100644
index 27d09bfe7b..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-2-adapt-style-block/mpx2rn_original/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 63691,
- "duration_ms": 144331,
- "total_duration_seconds": 144.3
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/eval_metadata.json
deleted file mode 100644
index f58a0da0c9..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/eval_metadata.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "eval_id": 3,
- "eval_name": "selector-api-animation",
- "prompt": "请对附件中的 dashboard.mpx 仪表盘组件进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件,不要省略任何内容。",
- "files": ["input/dashboard.mpx"],
- "assertions": [
- {"text": "selector API nodes (#chartBox, #lazyArea) have empty wx:ref in template"},
- {"text": "wx.createAnimation replaced with mpx.createAnimation"},
- {"text": "gradient transparent replaced with rgba equivalent"},
- {"text": "rem units converted to rpx"},
- {"text": "enable-animation declared on animated view"},
- {"text": "@keyframes isolated with conditional compile (RN does not support)"},
- {"text": "display:none replaced with wx:if or size-zero hiding"},
- {"text": "style: no less nesting (all selectors flattened to single-class)"},
- {"text": "conditional compile uses @mpx-endif (not @mpx-end-if)"}
- ]
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/input/dashboard.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/input/dashboard.mpx
deleted file mode 100644
index f8c6346fee..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/input/dashboard.mpx
+++ /dev/null
@@ -1,176 +0,0 @@
-
-
-
-
-
- {{item.label}}
-
-
-
-
-
- {{item.value}}
- {{item.name}}
-
-
-
-
- 延迟加载的内容
-
-
- 加载中...
-
-
-
- {{tipText}}
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/outputs/dashboard.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/outputs/dashboard.mpx
deleted file mode 100644
index 8d696a1fe0..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/outputs/dashboard.mpx
+++ /dev/null
@@ -1,197 +0,0 @@
-
-
-
-
-
- {{item.label}}
-
-
-
-
-
- {{item.value}}
- {{item.name}}
-
-
-
-
- 延迟加载的内容
-
-
- 加载中...
-
-
-
- {{tipText}}
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/run-1/grading.json
deleted file mode 100644
index da4240978d..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/run-1/grading.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "eval_id": 3,
- "run_kind": "mpx2rn_gene",
- "expectations": [
- {
- "text": "selector API nodes (#chartBox, #lazyArea) have empty wx:ref in template",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "wx.createAnimation replaced with mpx.createAnimation",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "gradient transparent replaced with rgba equivalent",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "rem units converted to rpx",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: event params use inline syntax (not data- dataset)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "enable-animation declared on animated view",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "@keyframes isolated with conditional compile (RN does not support)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "display:none replaced with wx:if or size-zero hiding",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "transition preserved on RN (not stripped into wx-only conditional)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "style: no less nesting (all selectors flattened to single-class)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "wx:style object keys use unquoted camelCase (no quoted or kebab-case keys)",
- "passed": false,
- "evidence": "FAIL"
- }
- ],
- "summary": {
- "pass_rate": 0.6667,
- "passed": 8,
- "failed": 4,
- "total": 12
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/timing.json
deleted file mode 100644
index 466fda7f55..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_gene/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 106035,
- "duration_ms": 147253,
- "total_duration_seconds": 147.3
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/outputs/dashboard.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/outputs/dashboard.mpx
deleted file mode 100644
index aba2b2ee0d..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/outputs/dashboard.mpx
+++ /dev/null
@@ -1,237 +0,0 @@
-
-
-
-
-
- {{item.label}}
-
-
-
-
-
- {{item.value}}
- {{item.name}}
-
-
-
-
- 延迟加载的内容
-
-
- 加载中...
-
-
-
- {{tipText}}
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/run-1/grading.json
deleted file mode 100644
index 5f1d74e0ac..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/run-1/grading.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "eval_id": 3,
- "run_kind": "mpx2rn_original",
- "expectations": [
- {
- "text": "selector API nodes (#chartBox, #lazyArea) have empty wx:ref in template",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "wx.createAnimation replaced with mpx.createAnimation",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "gradient transparent replaced with rgba equivalent",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "rem units converted to rpx",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: event params use inline syntax (not data- dataset)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "enable-animation declared on animated view",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "@keyframes isolated with conditional compile (RN does not support)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "display:none replaced with wx:if or size-zero hiding",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "transition preserved on RN (not stripped into wx-only conditional)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no less nesting (all selectors flattened to single-class)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "wx:style object keys use unquoted camelCase (no quoted or kebab-case keys)",
- "passed": false,
- "evidence": "FAIL"
- }
- ],
- "summary": {
- "pass_rate": 0.8333,
- "passed": 10,
- "failed": 2,
- "total": 12
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/timing.json
deleted file mode 100644
index ff9842d054..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-3-selector-api-animation/mpx2rn_original/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 95452,
- "duration_ms": 357870,
- "total_duration_seconds": 357.9
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/eval_metadata.json
deleted file mode 100644
index 4529d9ee31..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/eval_metadata.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "eval_id": 4,
- "eval_name": "slots-cssvar-i18n",
- "prompt": "请对附件中的 panel.mpx 面板组件进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件,不要省略任何内容。",
- "files": ["input/panel.mpx"],
- "assertions": [
- {"text": "multipleSlots: true preserved in component options"},
- {"text": "CSS variables (var(--...)) syntax preserved"},
- {"text": "$t() i18n function calls preserved in template"},
- {"text": "background-image only on view components (not text)"},
- {"text": "enable-background declared on dynamic background view"},
- {"text": "::after pseudo-element replaced with real node"},
- {"text": "style: no less nesting (all selectors flattened)"},
- {"text": "calc() expressions preserved"},
- {"text": "conditional compile uses @mpx-endif (not @mpx-end-if)"}
- ]
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/input/panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/input/panel.mpx
deleted file mode 100644
index 46a3003974..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/input/panel.mpx
+++ /dev/null
@@ -1,169 +0,0 @@
-
-
-
-
-
-
-
-
- {{item.desc}}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/outputs/panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/outputs/panel.mpx
deleted file mode 100644
index 0f3699d4ed..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/outputs/panel.mpx
+++ /dev/null
@@ -1,205 +0,0 @@
-
-
-
-
-
-
-
-
- {{item.desc}}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/run-1/grading.json
deleted file mode 100644
index 9ccfdd701e..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 4,
- "run_kind": "mpx2rn_gene",
- "expectations": [
- {
- "text": "multipleSlots: true preserved in component options",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "CSS variables (var(--...)) syntax preserved",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "$t() i18n function calls preserved in template",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "background-image only on view components (not text)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "enable-background declared on dynamic background view",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "::after pseudo-element replaced with real node",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no less nesting (all selectors flattened)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "calc() preserved or replaced with flex equivalent",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/timing.json
deleted file mode 100644
index 3944eb4a77..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_gene/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 95498,
- "duration_ms": 179975,
- "total_duration_seconds": 180.0
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/outputs/panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/outputs/panel.mpx
deleted file mode 100644
index 676f43eb5b..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/outputs/panel.mpx
+++ /dev/null
@@ -1,205 +0,0 @@
-
-
-
-
-
-
-
-
- {{item.desc}}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/run-1/grading.json
deleted file mode 100644
index 75096d0176..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 4,
- "run_kind": "mpx2rn_original",
- "expectations": [
- {
- "text": "multipleSlots: true preserved in component options",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "CSS variables (var(--...)) syntax preserved",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "$t() i18n function calls preserved in template",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "background-image only on view components (not text)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "enable-background declared on dynamic background view",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "::after pseudo-element replaced with real node",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no less nesting (all selectors flattened)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "calc() preserved or replaced with flex equivalent",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.8889,
- "passed": 8,
- "failed": 1,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/timing.json
deleted file mode 100644
index 2ea68e714d..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-4-slots-cssvar-i18n/mpx2rn_original/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 97054,
- "duration_ms": 180146,
- "total_duration_seconds": 180.1
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/eval_metadata.json
deleted file mode 100644
index d2b4494c4e..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/eval_metadata.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "eval_id": 5,
- "eval_name": "pinia-scroll-intersection",
- "prompt": "请对附件中的 product-list.mpx 商品列表页面进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件,不要省略任何内容。",
- "files": ["input/product-list.mpx"],
- "assertions": [
- {"text": "Pinia store import and usage preserved"},
- {"text": "onPullDownRefresh/onReachBottom replaced with scroll-view events"},
- {"text": "createIntersectionObserver target (#exposureAnchor) has wx:ref"},
- {"text": "all wx.xxx replaced with mpx.xxx"},
- {"text": "e.target.dataset replaced with e.currentTarget.dataset"},
- {"text": "float layout replaced with flex"},
- {"text": "font-weight numeric (500/700) replaced with bold/normal"},
- {"text": "style: no less nesting (all selectors flattened)"},
- {"text": "conditional compile uses @mpx-endif (not @mpx-end-if)"}
- ]
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/input/product-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/input/product-list.mpx
deleted file mode 100644
index 56527cffbc..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/input/product-list.mpx
+++ /dev/null
@@ -1,254 +0,0 @@
-
-
-
-
-
- 搜索
-
-
-
-
- 价格
-
-
- 销量
-
-
-
-
-
-
- {{item.name}}
-
- {{tag}}
-
-
- ¥{{item.price}}
- 已售 {{item.sales}}
-
-
-
-
-
- 加载中...
- 没有更多了
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/outputs/product-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/outputs/product-list.mpx
deleted file mode 100644
index ee0f3da2ae..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/outputs/product-list.mpx
+++ /dev/null
@@ -1,365 +0,0 @@
-
-
-
-
-
- 搜索
-
-
-
-
- 价格
-
-
- 销量
-
-
-
-
-
-
-
- {{item.name}}
-
- {{tag}}
-
-
- ¥{{item.price}}
- 已售 {{item.sales}}
-
-
-
-
-
- 加载中...
- 没有更多了
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/run-1/grading.json
deleted file mode 100644
index 6ac20f139c..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 5,
- "run_kind": "mpx2rn_gene",
- "expectations": [
- {
- "text": "Pinia store import and usage preserved",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "onPullDownRefresh/onReachBottom replaced with scroll-view events",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "createIntersectionObserver target (#exposureAnchor) has wx:ref",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "all wx.xxx replaced with mpx.xxx",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: event params use inline syntax (not data- dataset)",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "text": "float layout replaced with flex",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "font-weight numeric (500/700) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no less nesting (all selectors flattened)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.8889,
- "passed": 8,
- "failed": 1,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/timing.json
deleted file mode 100644
index 43e9db9282..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_gene/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 103185,
- "duration_ms": 156710,
- "total_duration_seconds": 156.7
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/outputs/product-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/outputs/product-list.mpx
deleted file mode 100644
index ea54ccbdf3..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/outputs/product-list.mpx
+++ /dev/null
@@ -1,341 +0,0 @@
-
-
-
-
-
- 搜索
-
-
-
-
- 价格
-
-
- 销量
-
-
-
-
-
-
-
- {{item.name}}
-
- {{tag}}
-
-
- ¥{{item.price}}
- 已售 {{item.sales}}
-
-
-
-
-
- 加载中...
- 没有更多了
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/run-1/grading.json
deleted file mode 100644
index 702e65e688..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/run-1/grading.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "eval_id": 5,
- "run_kind": "mpx2rn_original",
- "expectations": [
- {
- "text": "Pinia store import and usage preserved",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "onPullDownRefresh/onReachBottom replaced with scroll-view events",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "createIntersectionObserver target (#exposureAnchor) has wx:ref",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "all wx.xxx replaced with mpx.xxx",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "template: event params use inline syntax (not data- dataset)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "float layout replaced with flex",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "font-weight numeric (500/700) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "style: no less nesting (all selectors flattened)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/timing.json b/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/timing.json
deleted file mode 100644
index 0c454d53aa..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/eval-5-pinia-scroll-intersection/mpx2rn_original/timing.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 112184,
- "duration_ms": 189880,
- "total_duration_seconds": 189.9
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-3/evals.json b/.agents/skills/mpx2rn-workspace/iteration-3/evals.json
deleted file mode 100644
index 888e88005c..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-3/evals.json
+++ /dev/null
@@ -1,114 +0,0 @@
-{
- "skill_name": "mpx2rn-gene vs mpx2rn",
- "comparison": {
- "skill_a": "mpx2rn-gene (Gene-based)",
- "skill_b": "mpx2rn (Original)"
- },
- "evals": [
- {
- "id": 0,
- "name": "adapt-list-page",
- "prompt": "请帮我对附件中的 Mpx 页面 list.mpx 进行 RN 跨端适配改造,确保它能在 RN 平台正确编译运行,同时保留小程序/Web 平台的兼容性。请输出修改后的完整 .mpx 代码(保持 SFC 结构 template/script/style),不要省略任何内容。",
- "files": ["input/list.mpx"],
- "assertions": [
- {"text": "style: no less nesting (& or rule-in-rule)"},
- {"text": "style on RN (wx-conditional stripped): no :active"},
- {"text": "style on RN: no :first-child"},
- {"text": "script: replaced wx.request with mpx.request"},
- {"text": "script: replaced wx.navigateTo with mpx.navigateTo"},
- {"text": "template: event params use inline syntax (not data- dataset)"},
- {"text": "template: dynamic class via wx:class (not class string interp)"},
- {"text": "conditional compile uses @mpx-endif (not @mpx-end-if)"},
- {"text": "style: no empty selector rules after stripping comments"}
- ]
- },
- {
- "id": 1,
- "name": "create-card-component",
- "prompt": "请帮我创建一个符合 RN 跨端兼容规范的 Mpx 卡片组件 card.mpx,需求:\n- 接收 props:title (string)、desc (string)、avatar (string,图片 URL)、selected (boolean,默认 false)\n- 卡片整体可点击,点击时通过 triggerEvent 抛出 'tap' 事件\n- 点击时有按下视觉反馈\n- selected=true 时卡片边框色变为蓝色 (#1677ff)\n- 标题需要单行省略\n- 描述最多展示 2 行后省略\n- 使用组合式 API(setup 或 ",
- src, re.DOTALL | re.IGNORECASE):
- attrs = (m.group("attrs") or "").lower()
- body = m.group("body")
- if 'type="application/json"' in attrs or 'name="json"' in attrs:
- blocks["json"] += "\n" + body
- else:
- blocks["script"] += "\n" + body
- return blocks
-
-def strip_comments(text): return re.sub(r"/\*.*?\*/", "", text, flags=re.DOTALL)
-
-def strip_wx_conditional_blocks(text):
- return re.sub(
- r"/\*\s*@mpx-if[^*]*?(wx|ali|web)[^*]*?\*/.*?/\*\s*@mpx-(endif|end-if)\s*\*/",
- "", text, flags=re.DOTALL | re.IGNORECASE)
-
-def strip_at_rules(text):
- """Strip @keyframes and @media blocks so they don't trigger nesting detection."""
- result = re.sub(r"@keyframes\s+[\w-]+\s*\{[^}]*(?:\{[^}]*\}[^}]*)*\}", "", text, flags=re.DOTALL)
- result = re.sub(r"@media\s[^{]*\{[^}]*(?:\{[^}]*\}[^}]*)*\}", "", result, flags=re.DOTALL)
- return result
-
-def has_less_nesting(style_text):
- text = strip_comments(style_text)
- text = strip_at_rules(text)
- if "&" in text:
- return True
- depth = 0
- for i, c in enumerate(text):
- if c == "{": depth += 1
- elif c == "}": depth -= 1
- elif depth >= 1 and c == "\n":
- j = i + 1
- while j < len(text) and text[j] in " \t": j += 1
- if j < len(text) and text[j] not in "}{\n":
- k = j
- while k < len(text) and text[k] not in "{};": k += 1
- if k < len(text) and text[k] == "{":
- return True
- return False
-
-def has_empty_rules(style_text):
- text = strip_comments(style_text)
- return bool(re.search(r"[^{}]+\{\s*\}", text))
-
-def uses_wrong_endif(text): return "@mpx-end-if" in text
-
-def has_bad_wx_style_keys(template_text):
- """Check for quoted or kebab-case keys in wx:style object literals."""
- wx_style_exprs = re.findall(r'wx:style\s*=\s*"([^"]*)"', template_text)
- for expr in wx_style_exprs:
- if re.search(r"""['"]\s*[a-zA-Z][\w-]*\s*['"]\s*:""", expr):
- return True
- if re.search(r'[a-zA-Z][\w]*-[\w-]*\s*:', expr):
- return True
- return False
-
-def check_eval_0(output_path):
- src = output_path.read_text()
- blocks = extract_blocks(src)
- style_rn = strip_wx_conditional_blocks(blocks["style"])
- results = [
- {"text": "style: no less nesting (& or rule-in-rule)",
- "passed": not has_less_nesting(blocks["style"])},
- {"text": "style on RN (wx-conditional stripped): no :active",
- "passed": ":active" not in strip_comments(style_rn)},
- {"text": "style on RN: no :first-child",
- "passed": ":first-child" not in strip_comments(style_rn)},
- {"text": "script: replaced wx.request with mpx.request",
- "passed": "wx.request" not in blocks["script"] and "mpx.request" in blocks["script"]},
- {"text": "script: replaced wx.navigateTo with mpx.navigateTo",
- "passed": "wx.navigateTo" not in blocks["script"] and "mpx.navigateTo" in blocks["script"]},
- {"text": "template: event params use inline syntax (not data- dataset)",
- "passed": not re.search(r'\bdata-\w+\s*=', blocks["template"])
- and "dataset" not in blocks["script"]},
- {"text": "template: dynamic class via wx:class (not class string interp)",
- "passed": not re.search(r'(? (not
)",
- "passed": " elements", "passed": "]*wx:ref', blocks["template"])) or \
- bool(re.search(r'wx:ref[^>]*id="chartBox"', blocks["template"]))
- has_wxref_lazy = bool(re.search(r'id="lazyArea"[^>]*wx:ref', blocks["template"])) or \
- bool(re.search(r'wx:ref[^>]*id="lazyArea"', blocks["template"]))
- results.append({"text": "selector API nodes (#chartBox, #lazyArea) have empty wx:ref in template",
- "passed": has_wxref_chart and has_wxref_lazy})
- results.append({"text": "wx.createAnimation replaced with mpx.createAnimation",
- "passed": "wx.createAnimation" not in blocks["script"]
- and "mpx.createAnimation" in blocks["script"]})
- results.append({"text": "gradient transparent replaced with rgba equivalent",
- "passed": "transparent" not in style_rn_clean
- or bool(re.search(r"rgba\(\s*\d+", style_rn_clean))})
- has_rem = bool(re.search(r":\s*[\d.]+rem", style_rn_clean))
- results.append({"text": "rem units converted to rpx", "passed": not has_rem})
- results.append({"text": "template: event params use inline syntax (not data- dataset)",
- "passed": not re.search(r'\bdata-\w+\s*=', blocks["template"])
- and "dataset" not in blocks["script"]})
- results.append({"text": "enable-animation declared on animated view",
- "passed": "enable-animation" in blocks["template"]})
- has_keyframes_rn = bool(re.search(r"@keyframes", style_rn_clean))
- results.append({"text": "@keyframes isolated with conditional compile (RN does not support)",
- "passed": not has_keyframes_rn})
- has_display_none_rn = bool(re.search(r"display\s*:\s*none", style_rn_clean))
- results.append({"text": "display:none replaced with wx:if or size-zero hiding",
- "passed": not has_display_none_rn})
- has_transition_rn = bool(re.search(r"transition\s*:", style_rn_clean))
- results.append({"text": "transition preserved on RN (not stripped into wx-only conditional)",
- "passed": has_transition_rn})
- results.append({"text": "style: no less nesting (all selectors flattened to single-class)",
- "passed": not has_less_nesting(blocks["style"])})
- results.append({"text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": not uses_wrong_endif(src)})
- results.append({"text": "wx:style object keys use unquoted camelCase (no quoted or kebab-case keys)",
- "passed": not has_bad_wx_style_keys(blocks["template"])})
- return results
-
-def check_eval_4(output_path):
- src = output_path.read_text()
- blocks = extract_blocks(src)
- style_rn = strip_wx_conditional_blocks(blocks["style"])
- style_rn_clean = strip_comments(style_rn)
- results = []
- results.append({"text": "multipleSlots: true preserved in component options",
- "passed": "multipleSlots" in blocks["script"] and "true" in blocks["script"]})
- results.append({"text": "CSS variables (var(--...)) syntax preserved",
- "passed": bool(re.search(r"var\(--", blocks["style"]))})
- results.append({"text": "$t() i18n function calls preserved in template",
- "passed": "$t(" in blocks["template"] or "$t'" in blocks["template"]})
- bg_on_text = bool(re.search(r"]*enable-background", blocks["template"]))
- results.append({"text": "background-image only on view components (not text)",
- "passed": not bg_on_text})
- results.append({"text": "enable-background declared on dynamic background view",
- "passed": "enable-background" in blocks["template"]})
- has_after_rn = "::after" in style_rn_clean or ":after" in style_rn_clean
- results.append({"text": "::after pseudo-element replaced with real node",
- "passed": not has_after_rn})
- results.append({"text": "style: no less nesting (all selectors flattened)",
- "passed": not has_less_nesting(blocks["style"])})
- results.append({"text": "calc() preserved or replaced with flex equivalent",
- "passed": "calc(" in blocks["style"]
- or "flex:" in style_rn_clean or "flex-grow" in style_rn_clean})
- results.append({"text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": not uses_wrong_endif(src)})
- return results
-
-def check_eval_5(output_path):
- src = output_path.read_text()
- blocks = extract_blocks(src)
- style_rn = strip_wx_conditional_blocks(blocks["style"])
- style_rn_clean = strip_comments(style_rn)
- results = []
- results.append({"text": "Pinia store import and usage preserved",
- "passed": "useProductStore" in blocks["script"]})
- has_scroll_view = "scroll-view" in blocks["template"]
- has_scroll_events = "bindscrolltolower" in blocks["template"] or "bindrefresherrefresh" in blocks["template"]
- results.append({"text": "onPullDownRefresh/onReachBottom replaced with scroll-view events",
- "passed": has_scroll_view and has_scroll_events})
- has_wxref_exposure = bool(re.search(r'id="exposureAnchor"[^>]*wx:ref', blocks["template"])) or \
- bool(re.search(r'wx:ref[^>]*id="exposureAnchor"', blocks["template"]))
- results.append({"text": "createIntersectionObserver target (#exposureAnchor) has wx:ref",
- "passed": has_wxref_exposure})
- has_wx_api = bool(re.search(r"\bwx\.(request|navigateTo|stopPullDownRefresh)", blocks["script"]))
- has_mpx_api = "mpx." in blocks["script"]
- results.append({"text": "all wx.xxx replaced with mpx.xxx",
- "passed": not has_wx_api and has_mpx_api})
- results.append({"text": "template: event params use inline syntax (not data- dataset)",
- "passed": not re.search(r'\bdata-\w+\s*=', blocks["template"])
- and "dataset" not in blocks["script"]})
- has_float_rn = bool(re.search(r"float\s*:\s*(left|right)", style_rn_clean))
- results.append({"text": "float layout replaced with flex",
- "passed": not has_float_rn})
- has_numeric_fw = bool(re.search(r"font-weight\s*:\s*[1-9]\d{2}", style_rn_clean))
- results.append({"text": "font-weight numeric (500/700) replaced with bold/normal",
- "passed": not has_numeric_fw})
- results.append({"text": "style: no less nesting (all selectors flattened)",
- "passed": not has_less_nesting(blocks["style"])})
- results.append({"text": "conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": not uses_wrong_endif(src)})
- return results
-
-CHECKERS = {0: check_eval_0, 1: check_eval_1, 2: check_eval_2,
- 3: check_eval_3, 4: check_eval_4, 5: check_eval_5}
-EVAL_DIRS = {0: "eval-0-adapt-list-page", 1: "eval-1-create-card-component", 2: "eval-2-adapt-style-block",
- 3: "eval-3-selector-api-animation", 4: "eval-4-slots-cssvar-i18n", 5: "eval-5-pinia-scroll-intersection"}
-OUTPUT_FILES = {0: "list.mpx", 1: "card.mpx", 2: "style-block.mpx",
- 3: "dashboard.mpx", 4: "panel.mpx", 5: "product-list.mpx"}
-RUN_KINDS = ("mpx2rn_gene", "mpx2rn_original")
-
-def grade_run(eval_id, run_kind):
- eval_dir = WORKSPACE / EVAL_DIRS[eval_id]
- out_path = eval_dir / run_kind / "outputs" / OUTPUT_FILES[eval_id]
- if not out_path.exists():
- print(f"missing: {out_path}", file=sys.stderr)
- return None
- results = CHECKERS[eval_id](out_path)
- enriched = [{"text": r["text"], "passed": bool(r["passed"]),
- "evidence": "PASS" if r["passed"] else "FAIL"} for r in results]
- passed = sum(1 for e in enriched if e["passed"])
- total = len(enriched)
- grading = {
- "eval_id": eval_id, "run_kind": run_kind, "expectations": enriched,
- "summary": {"pass_rate": round(passed / total, 4) if total else 0.0,
- "passed": passed, "failed": total - passed, "total": total},
- }
- run_dir = eval_dir / run_kind / "run-1"
- run_dir.mkdir(parents=True, exist_ok=True)
- (run_dir / "grading.json").write_text(json.dumps(grading, ensure_ascii=False, indent=2))
- return grading
-
-def main():
- summary = []
- for eid in sorted(EVAL_DIRS.keys()):
- for kind in RUN_KINDS:
- g = grade_run(eid, kind)
- if g:
- s = g["summary"]
- summary.append({"eval": EVAL_DIRS[eid], "kind": kind,
- "score": f"{s['passed']}/{s['total']}"})
- print(json.dumps(summary, ensure_ascii=False, indent=2))
-
-if __name__ == "__main__":
- main()
diff --git a/.agents/skills/mpx2rn/SKILL.md b/.agents/skills/mpx2rn/SKILL.md
index 724e8ca0c7..d5b282627d 100644
--- a/.agents/skills/mpx2rn/SKILL.md
+++ b/.agents/skills/mpx2rn/SKILL.md
@@ -77,13 +77,14 @@ Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展
### 样式(style)约束
-1. **选择器单类化**:禁止使用复合/伪类/伪元素等 RN 不支持的选择器,必须改造为单类等效实现,并同步修改 `` 与 `
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/outputs/product-card.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/outputs/product-card.mpx
new file mode 100644
index 0000000000..a1bd7d0242
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/outputs/product-card.mpx
@@ -0,0 +1,193 @@
+
+
+
+
+
+ {{info.description}}
+
+ {{item}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..96d502ba57
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,102 @@
+{
+ "eval_id": 0,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "id": "s0",
+ "text": "style on RN: no descendant selectors (.parent .child)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s1",
+ "text": "style on RN: no display: grid (replaced with flex)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s2",
+ "text": "style on RN: no ::before pseudo-element",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s3",
+ "text": "style on RN: no :active pseudo-class (use hover-class instead)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s4",
+ "text": "style on RN: no :first-child pseudo-class",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s5",
+ "text": "style on RN: no + adjacent sibling combinator",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s6",
+ "text": "style: numeric font-weight (500/600) replaced with bold/normal",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s7",
+ "text": "style: text-overflow/white-space dual-track with numberOfLines on RN",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s8",
+ "text": "template: real node added to replace ::before pseudo-element",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s9",
+ "text": "style: conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s10",
+ "text": "style: no empty selector rules after stripping comments",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s11",
+ "text": "style on RN: no > child combinator",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s12",
+ "text": "style on RN: no multi-class selector (.a.b)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s13",
+ "text": "style on RN: no + adjacent sibling combinator (tag-highlight pattern)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 14,
+ "failed": 0,
+ "total": 14
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/outputs/product-card.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/outputs/product-card.mpx
new file mode 100644
index 0000000000..2ab854db68
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/outputs/product-card.mpx
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+ {{info.description}}
+
+
+ {{item}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..6a54fd584a
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,102 @@
+{
+ "eval_id": 0,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "id": "s0",
+ "text": "style on RN: no descendant selectors (.parent .child)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s1",
+ "text": "style on RN: no display: grid (replaced with flex)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s2",
+ "text": "style on RN: no ::before pseudo-element",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s3",
+ "text": "style on RN: no :active pseudo-class (use hover-class instead)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s4",
+ "text": "style on RN: no :first-child pseudo-class",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s5",
+ "text": "style on RN: no + adjacent sibling combinator",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s6",
+ "text": "style: numeric font-weight (500/600) replaced with bold/normal",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "s7",
+ "text": "style: text-overflow/white-space dual-track with numberOfLines on RN",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s8",
+ "text": "template: real node added to replace ::before pseudo-element",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s9",
+ "text": "style: conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s10",
+ "text": "style: no empty selector rules after stripping comments",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s11",
+ "text": "style on RN: no > child combinator",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s12",
+ "text": "style on RN: no multi-class selector (.a.b)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s13",
+ "text": "style on RN: no + adjacent sibling combinator (tag-highlight pattern)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.9286,
+ "passed": 13,
+ "failed": 1,
+ "total": 14
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/outputs/product-card.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/outputs/product-card.mpx
new file mode 100644
index 0000000000..40f5595861
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/outputs/product-card.mpx
@@ -0,0 +1,171 @@
+
+
+
+
+ {{info.description}}
+
+ {{item}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/run-1/grading.json
new file mode 100644
index 0000000000..becb826d34
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/run-1/grading.json
@@ -0,0 +1,102 @@
+{
+ "eval_id": 0,
+ "run_kind": "no_skill",
+ "expectations": [
+ {
+ "id": "s0",
+ "text": "style on RN: no descendant selectors (.parent .child)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s1",
+ "text": "style on RN: no display: grid (replaced with flex)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s2",
+ "text": "style on RN: no ::before pseudo-element",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s3",
+ "text": "style on RN: no :active pseudo-class (use hover-class instead)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s4",
+ "text": "style on RN: no :first-child pseudo-class",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s5",
+ "text": "style on RN: no + adjacent sibling combinator",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s6",
+ "text": "style: numeric font-weight (500/600) replaced with bold/normal",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "s7",
+ "text": "style: text-overflow/white-space dual-track with numberOfLines on RN",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "s8",
+ "text": "template: real node added to replace ::before pseudo-element",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "s9",
+ "text": "style: conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s10",
+ "text": "style: no empty selector rules after stripping comments",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s11",
+ "text": "style on RN: no > child combinator",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s12",
+ "text": "style on RN: no multi-class selector (.a.b)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "s13",
+ "text": "style on RN: no + adjacent sibling combinator (tag-highlight pattern)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.7143,
+ "passed": 10,
+ "failed": 4,
+ "total": 14
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/eval_metadata.json
new file mode 100644
index 0000000000..3a5269de4f
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/eval_metadata.json
@@ -0,0 +1,19 @@
+{
+ "eval_id": 1,
+ "eval_name": "template-adaptation",
+ "complexity": "normal",
+ "focus": "template",
+ "prompt": "请对附件中的 order-list.mpx 页面进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style),不要省略任何内容。",
+ "files": ["input/order-list.mpx"],
+ "assertions": [
+ {"id": "t0", "text": "template: dynamic class via wx:class (not class string interpolation)", "category": "template"},
+ {"id": "t1", "text": "template: event params use inline syntax (not data- dataset)", "category": "template"},
+ {"id": "t2", "text": "template: no method calls in Mustache (getStatusColor/getStatusText replaced with computed or wx:style binding)", "category": "template"},
+ {"id": "t3", "text": "template: page scroll replaced with scroll-view (onPullDownRefresh/onReachBottom removed)", "category": "template"},
+ {"id": "t4", "text": "template: scroll-view has bindscrolltolower or equivalent scroll event", "category": "template"},
+ {"id": "t5", "text": "script: all wx.xxx API replaced with mpx.xxx", "category": "script"},
+ {"id": "t6", "text": "script: no e.target.dataset usage (event params via inline syntax)", "category": "script"},
+ {"id": "t7", "text": "style on RN: no .btn-default .btn-text compound selector", "category": "style"},
+ {"id": "t8", "text": "template: wx:style object keys use unquoted camelCase (no quoted or kebab-case keys)", "category": "template"}
+ ]
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/input/order-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/input/order-list.mpx
new file mode 100644
index 0000000000..41412590c0
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/input/order-list.mpx
@@ -0,0 +1,353 @@
+
+
+
+
+ {{item.label}}
+
+ {{item.badge > 99 ? '99+' : item.badge}}
+
+
+
+
+
+
+
+
+
+
+ {{item.goodsName}}
+ {{item.spec}}
+
+ ¥{{item.price}}
+ x{{item.count}}
+
+
+
+
+
+
+
+
+ 加载中...
+
+
+ 暂无订单
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/outputs/order-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/outputs/order-list.mpx
new file mode 100644
index 0000000000..11d7166289
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/outputs/order-list.mpx
@@ -0,0 +1,389 @@
+
+
+
+
+ {{item.label}}
+
+ {{item.badge > 99 ? '99+' : item.badge}}
+
+
+
+
+
+
+
+
+
+
+ {{item.goodsName}}
+ {{item.spec}}
+
+ ¥{{item.price}}
+ x{{item.count}}
+
+
+
+
+
+
+
+
+ 加载中...
+
+
+ 暂无订单
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..bf2bcb0597
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,72 @@
+{
+ "eval_id": 1,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "id": "t0",
+ "text": "template: dynamic class via wx:class (not class string interpolation)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t1",
+ "text": "template: event params use inline syntax (not data- dataset)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "t2",
+ "text": "template: no method calls in Mustache (getStatusColor/getStatusText replaced)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t3",
+ "text": "template: page scroll replaced with scroll-view",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t4",
+ "text": "template: scroll-view has bindscrolltolower or equivalent",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t5",
+ "text": "script: all wx.xxx API replaced with mpx.xxx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t6",
+ "text": "script: no e.target.dataset usage",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "t7",
+ "text": "style on RN: no .btn-default .btn-text compound selector",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t8",
+ "text": "template: wx:style object keys use unquoted camelCase (no quoted or kebab-case keys)",
+ "passed": false,
+ "evidence": "FAIL"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.6667,
+ "passed": 6,
+ "failed": 3,
+ "total": 9
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/outputs/order-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/outputs/order-list.mpx
new file mode 100644
index 0000000000..828e72ee68
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/outputs/order-list.mpx
@@ -0,0 +1,382 @@
+
+
+
+
+ {{item.label}}
+
+ {{item.badge > 99 ? '99+' : item.badge}}
+
+
+
+
+
+
+
+
+
+
+ {{item.goodsName}}
+ {{item.spec}}
+
+ ¥{{item.price}}
+ x{{item.count}}
+
+
+
+
+
+
+
+
+ 加载中...
+
+
+ 暂无订单
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..ab3cbadd67
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,72 @@
+{
+ "eval_id": 1,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "id": "t0",
+ "text": "template: dynamic class via wx:class (not class string interpolation)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t1",
+ "text": "template: event params use inline syntax (not data- dataset)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t2",
+ "text": "template: no method calls in Mustache (getStatusColor/getStatusText replaced)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t3",
+ "text": "template: page scroll replaced with scroll-view",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t4",
+ "text": "template: scroll-view has bindscrolltolower or equivalent",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t5",
+ "text": "script: all wx.xxx API replaced with mpx.xxx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t6",
+ "text": "script: no e.target.dataset usage",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t7",
+ "text": "style on RN: no .btn-default .btn-text compound selector",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t8",
+ "text": "template: wx:style object keys use unquoted camelCase (no quoted or kebab-case keys)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 9,
+ "failed": 0,
+ "total": 9
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/outputs/order-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/outputs/order-list.mpx
new file mode 100644
index 0000000000..fc0cc7ce0c
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/outputs/order-list.mpx
@@ -0,0 +1,353 @@
+
+
+
+
+ {{item.label}}
+
+ {{item.badge > 99 ? '99+' : item.badge}}
+
+
+
+
+
+
+
+
+
+
+ {{item.goodsName}}
+ {{item.spec}}
+
+ ¥{{item.price}}
+ x{{item.count}}
+
+
+
+
+
+
+
+
+ 加载中...
+
+
+ 暂无订单
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/run-1/grading.json
new file mode 100644
index 0000000000..a01144f8d3
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/run-1/grading.json
@@ -0,0 +1,72 @@
+{
+ "eval_id": 1,
+ "run_kind": "no_skill",
+ "expectations": [
+ {
+ "id": "t0",
+ "text": "template: dynamic class via wx:class (not class string interpolation)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "t1",
+ "text": "template: event params use inline syntax (not data- dataset)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t2",
+ "text": "template: no method calls in Mustache (getStatusColor/getStatusText replaced)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "t3",
+ "text": "template: page scroll replaced with scroll-view",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "t4",
+ "text": "template: scroll-view has bindscrolltolower or equivalent",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "t5",
+ "text": "script: all wx.xxx API replaced with mpx.xxx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t6",
+ "text": "script: no e.target.dataset usage",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t7",
+ "text": "style on RN: no .btn-default .btn-text compound selector",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t8",
+ "text": "template: wx:style object keys use unquoted camelCase (no quoted or kebab-case keys)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.5556,
+ "passed": 5,
+ "failed": 4,
+ "total": 9
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/eval_metadata.json
new file mode 100644
index 0000000000..38917e2022
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/eval_metadata.json
@@ -0,0 +1,19 @@
+{
+ "eval_id": 2,
+ "eval_name": "script-json-adaptation",
+ "complexity": "normal",
+ "focus": "script/json",
+ "prompt": "请对附件中的 user-profile.mpx 页面进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style/json),不要省略任何内容。",
+ "files": ["input/user-profile.mpx"],
+ "assertions": [
+ {"id": "j0", "text": "script: all wx.xxx API replaced with mpx.xxx (request/navigateTo/showModal/getStorageSync/setStorageSync/removeStorageSync/showToast/reLaunch)", "category": "script"},
+ {"id": "j1", "text": "script: onShareTimeline removed or isolated with conditional compile (RN unsupported)", "category": "script"},
+ {"id": "j2", "text": "script: onTabItemTap removed or isolated with conditional compile (RN unsupported)", "category": "script"},
+ {"id": "j3", "text": "script: setTabBarBadge/removeTabBarBadge isolated with conditional compile (RN unsupported)", "category": "script"},
+ {"id": "j4", "text": "script: wx.getUserProfile isolated or replaced (RN unsupported)", "category": "script"},
+ {"id": "j5", "text": "script: no e.target.dataset usage (event params via inline syntax or e.currentTarget.dataset)", "category": "script"},
+ {"id": "j7", "text": "json: enablePullDownRefresh handled for RN (page not scrollable by default)", "category": "json"},
+ {"id": "j8", "text": "template: data- attributes removed (inline event params used instead)", "category": "template"},
+ {"id": "j9", "text": "script: onShareAppMessage preserved (RN supported, should not be removed)", "category": "script"}
+ ]
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/input/user-profile.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/input/user-profile.mpx
new file mode 100644
index 0000000000..33eb87354b
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/input/user-profile.mpx
@@ -0,0 +1,216 @@
+
+
+
+
+
+ {{userInfo.nickName}}
+ ID: {{userInfo.userId}}
+
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/outputs/user-profile.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/outputs/user-profile.mpx
new file mode 100644
index 0000000000..304f350641
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/outputs/user-profile.mpx
@@ -0,0 +1,244 @@
+
+
+
+
+
+ {{userInfo.nickName}}
+ ID: {{userInfo.userId}}
+
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..b9e8381e8e
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,72 @@
+{
+ "eval_id": 2,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "id": "j0",
+ "text": "script: all wx.xxx API replaced with mpx.xxx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j1",
+ "text": "script: onShareTimeline removed or isolated with conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j2",
+ "text": "script: onTabItemTap removed or isolated with conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j3",
+ "text": "script: setTabBarBadge/removeTabBarBadge isolated with conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j4",
+ "text": "script: wx.getUserProfile isolated or replaced",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j5",
+ "text": "script: no e.target.dataset usage",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "j7",
+ "text": "json: enablePullDownRefresh handled for RN",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j8",
+ "text": "template: data- attributes removed (inline event params used)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "j9",
+ "text": "script: onShareAppMessage preserved (RN supported, should not be removed)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.7778,
+ "passed": 7,
+ "failed": 2,
+ "total": 9
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/outputs/user-profile.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/outputs/user-profile.mpx
new file mode 100644
index 0000000000..2206e56b47
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/outputs/user-profile.mpx
@@ -0,0 +1,277 @@
+
+
+
+
+
+ {{userInfo.nickName}}
+ ID: {{userInfo.userId}}
+
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..f0577e4855
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,72 @@
+{
+ "eval_id": 2,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "id": "j0",
+ "text": "script: all wx.xxx API replaced with mpx.xxx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j1",
+ "text": "script: onShareTimeline removed or isolated with conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j2",
+ "text": "script: onTabItemTap removed or isolated with conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j3",
+ "text": "script: setTabBarBadge/removeTabBarBadge isolated with conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j4",
+ "text": "script: wx.getUserProfile isolated or replaced",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j5",
+ "text": "script: no e.target.dataset usage",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j7",
+ "text": "json: enablePullDownRefresh handled for RN",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j8",
+ "text": "template: data- attributes removed (inline event params used)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j9",
+ "text": "script: onShareAppMessage preserved (RN supported, should not be removed)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 9,
+ "failed": 0,
+ "total": 9
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/outputs/user-profile.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/outputs/user-profile.mpx
new file mode 100644
index 0000000000..a4ac966461
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/outputs/user-profile.mpx
@@ -0,0 +1,194 @@
+
+
+
+
+
+ {{userInfo.nickName}}
+ ID: {{userInfo.userId}}
+
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/run-1/grading.json
new file mode 100644
index 0000000000..60eef234a2
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/run-1/grading.json
@@ -0,0 +1,72 @@
+{
+ "eval_id": 2,
+ "run_kind": "no_skill",
+ "expectations": [
+ {
+ "id": "j0",
+ "text": "script: all wx.xxx API replaced with mpx.xxx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j1",
+ "text": "script: onShareTimeline removed or isolated with conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j2",
+ "text": "script: onTabItemTap removed or isolated with conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j3",
+ "text": "script: setTabBarBadge/removeTabBarBadge isolated with conditional compile",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "j4",
+ "text": "script: wx.getUserProfile isolated or replaced",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j5",
+ "text": "script: no e.target.dataset usage",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j7",
+ "text": "json: enablePullDownRefresh handled for RN",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j8",
+ "text": "template: data- attributes removed (inline event params used)",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "j9",
+ "text": "script: onShareAppMessage preserved (RN supported, should not be removed)",
+ "passed": false,
+ "evidence": "FAIL"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.6667,
+ "passed": 6,
+ "failed": 3,
+ "total": 9
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/eval_metadata.json
new file mode 100644
index 0000000000..ad81f45086
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/eval_metadata.json
@@ -0,0 +1,20 @@
+{
+ "eval_id": 3,
+ "eval_name": "gradient-animation-interaction",
+ "complexity": "tricky",
+ "focus": "style/template/script/json",
+ "prompt": "请对附件中的 carousel-card.mpx 组件进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style/json),不要省略任何内容。",
+ "files": ["input/carousel-card.mpx"],
+ "assertions": [
+ {"id": "g0", "text": "style: linear-gradient 中 transparent 替换为目标颜色的 rgba(r,g,b,0) 形式(RN 中 transparent 等于 rgba(0,0,0,0) 会产生灰色过渡带)", "category": "style"},
+ {"id": "g1", "text": "style: display:none 替换为 width:0;height:0;overflow:hidden 或使用 wx:if 条件渲染(RN 中 display:none 可能引发异常)", "category": "style"},
+ {"id": "g2", "text": "style: transition-property:all 替换为具体属性名(RN 不支持 transition-property: all)", "category": "style"},
+ {"id": "g3", "text": "template: 动态设置 background-image 的 view 上添加 enable-background 属性", "category": "template"},
+ {"id": "g4", "text": "template: 动态设置 transition 的 view 上添加 enable-animation=\"transition\" 属性", "category": "template"},
+ {"id": "g5", "text": "script: 生命周期钩子(onMounted/onShow 等)在 setup 中同步注册,不在 setTimeout/Promise.then 等异步回调中注册", "category": "script"},
+ {"id": "g6", "text": "script: onLoad 使用第二个参数 decodedQuery 进行跨平台 URL 参数解码", "category": "script"},
+ {"id": "g7", "text": "json: 需要条件编译的 JSON 配置使用
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/outputs/carousel-card.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/outputs/carousel-card.mpx
new file mode 100644
index 0000000000..8ace8207ad
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/outputs/carousel-card.mpx
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.price}}
+
+ NEW
+
+
+
+
+
+
+ {{toastMsg}}
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..318fe3b8f3
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,78 @@
+{
+ "eval_id": 3,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "id": "g0",
+ "text": "style: linear-gradient 中 transparent 替换为 rgba 形式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g1",
+ "text": "style: display:none 替换为其他隐藏方式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g2",
+ "text": "style: transition-property:all 替换为具体属性名",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g3",
+ "text": "template: 动态 background-image 的 view 添加 enable-background",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g4",
+ "text": "template: 动态 transition 的 view 添加 enable-animation",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g5",
+ "text": "script: 生命周期钩子在 setup 中同步注册",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g6",
+ "text": "script: relativeTo 使用简单选择器(不用复合/后代选择器)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g7",
+ "text": "json: 条件编译 JSON 使用 script name=\"json\" 格式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g8",
+ "text": "style: bindtap 元素不设 opacity:0",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g9",
+ "text": "style: @keyframes 在 RN 中不存在",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 10,
+ "failed": 0,
+ "total": 10
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/outputs/carousel-card.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/outputs/carousel-card.mpx
new file mode 100644
index 0000000000..c6d8fe78dd
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/outputs/carousel-card.mpx
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.price}}
+
+ NEW
+
+
+
+
+
+
+ {{toastMsg}}
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..fd0e82c82c
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,78 @@
+{
+ "eval_id": 3,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "id": "g0",
+ "text": "style: linear-gradient 中 transparent 替换为 rgba 形式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g1",
+ "text": "style: display:none 替换为其他隐藏方式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g2",
+ "text": "style: transition-property:all 替换为具体属性名",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g3",
+ "text": "template: 动态 background-image 的 view 添加 enable-background",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g4",
+ "text": "template: 动态 transition 的 view 添加 enable-animation",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g5",
+ "text": "script: 生命周期钩子在 setup 中同步注册",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g6",
+ "text": "script: relativeTo 使用简单选择器(不用复合/后代选择器)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g7",
+ "text": "json: 条件编译 JSON 使用 script name=\"json\" 格式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g8",
+ "text": "style: bindtap 元素不设 opacity:0",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g9",
+ "text": "style: @keyframes 在 RN 中不存在",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 10,
+ "failed": 0,
+ "total": 10
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/outputs/carousel-card.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/outputs/carousel-card.mpx
new file mode 100644
index 0000000000..85b61b0d35
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/outputs/carousel-card.mpx
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.price}}
+
+
+ NEW
+
+
+
+
+
+
+
+
+ {{toastMsg}}
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/run-1/grading.json
new file mode 100644
index 0000000000..2cefd9dc26
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/run-1/grading.json
@@ -0,0 +1,78 @@
+{
+ "eval_id": 3,
+ "run_kind": "no_skill",
+ "expectations": [
+ {
+ "id": "g0",
+ "text": "style: linear-gradient 中 transparent 替换为 rgba 形式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g1",
+ "text": "style: display:none 替换为其他隐藏方式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g2",
+ "text": "style: transition-property:all 替换为具体属性名",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g3",
+ "text": "template: 动态 background-image 的 view 添加 enable-background",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "g4",
+ "text": "template: 动态 transition 的 view 添加 enable-animation",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "g5",
+ "text": "script: 生命周期钩子在 setup 中同步注册",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g6",
+ "text": "script: relativeTo 使用简单选择器(不用复合/后代选择器)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g7",
+ "text": "json: 条件编译 JSON 使用 script name=\"json\" 格式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g8",
+ "text": "style: bindtap 元素不设 opacity:0",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g9",
+ "text": "style: @keyframes 在 RN 中不存在",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.8,
+ "passed": 8,
+ "failed": 2,
+ "total": 10
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/eval_metadata.json
new file mode 100644
index 0000000000..21fd152881
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/eval_metadata.json
@@ -0,0 +1,20 @@
+{
+ "eval_id": 4,
+ "eval_name": "text-layout-selector",
+ "complexity": "tricky",
+ "focus": "style/template/script/json",
+ "prompt": "请对附件中的 data-panel.mpx 页面进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style/json),不要省略任何内容。",
+ "files": ["input/data-panel.mpx"],
+ "assertions": [
+ {"id": "l0", "text": "style: 纵向布局显式声明 flex-direction:column(Mpx 在声明 display:flex 时会自动补充 flex-direction:row,不声明则默认横向)", "category": "style"},
+ {"id": "l1", "text": "style: position:sticky 替换为 sticky-header 组件方案(RN 不支持 position:sticky)", "category": "style"},
+ {"id": "l2", "text": "style: 保留 /*use rpx*/ 和 /*use px*/ 单位转换注释(构建系统依赖这些注释进行批量单位转换)", "category": "style"},
+ {"id": "l3", "text": "style: background-image 不应用于 text 元素对应的类(RN 中仅 view 组件支持 background-image)", "category": "style"},
+ {"id": "l4", "text": "template: 内联 style 属性中不使用多值 margin/padding 简写(RN 内联样式不支持编译增强的多值简写)", "category": "template"},
+ {"id": "l5", "text": "template: scroll-into-view 目标元素添加 wx:ref 属性(RN 中 scroll-into-view 需要 wx:ref 进行节点映射)", "category": "template"},
+ {"id": "l6", "text": "template: createSelectorQuery 目标元素添加空 wx:ref 属性(RN 中选择器 API 依赖编译期 wx:ref 映射)", "category": "template"},
+ {"id": "l7", "text": "script: createSelectorQuery/selectComponent 仅使用 #id 或 .class 单一选择器(不使用后代/复合选择器)", "category": "script"},
+ {"id": "l8", "text": "script: 非触摸事件(scroll/change 等)不使用 catch 前缀(仅 6 个基础触摸事件支持冒泡和捕获)", "category": "script"},
+ {"id": "l9", "text": "style: radial-gradient() 通过条件编译限制或替换为 linear-gradient(RN 仅支持 linear-gradient)", "category": "style"}
+ ]
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/input/data-panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/input/data-panel.mpx
new file mode 100644
index 0000000000..ff5163f9ce
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/input/data-panel.mpx
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+ {{item.value}}
+ {{item.label}}
+
+
+
+
+
+ Trend Chart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.amount}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/outputs/data-panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/outputs/data-panel.mpx
new file mode 100644
index 0000000000..3d6865f933
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/outputs/data-panel.mpx
@@ -0,0 +1,347 @@
+
+
+
+
+
+
+
+ {{item.value}}
+ {{item.label}}
+
+
+
+
+
+ Trend Chart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.amount}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..e44ee74bf1
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,78 @@
+{
+ "eval_id": 4,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "id": "l0",
+ "text": "style: 纵向布局显式声明 flex-direction:column",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l1",
+ "text": "style: position:sticky 替换为 sticky-header 方案",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l2",
+ "text": "style: 保留 /*use rpx*/ /*use px*/ 单位转换注释",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l3",
+ "text": "style: background-image 不应用于 text 元素类",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l4",
+ "text": "template: 内联 style 中不使用多值 margin/padding 简写",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "l5",
+ "text": "template: scroll-into-view 目标添加 wx:ref",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l6",
+ "text": "template: createSelectorQuery 目标添加空 wx:ref",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l7",
+ "text": "script: 选择器 API 仅使用简单选择器",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l8",
+ "text": "script: 非触摸事件不使用 catch 前缀",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "l9",
+ "text": "style: radial-gradient 条件编译或替换",
+ "passed": false,
+ "evidence": "FAIL"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.7,
+ "passed": 7,
+ "failed": 3,
+ "total": 10
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/outputs/data-panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/outputs/data-panel.mpx
new file mode 100644
index 0000000000..54a66092f8
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/outputs/data-panel.mpx
@@ -0,0 +1,339 @@
+
+
+
+
+
+
+
+ {{item.value}}
+ {{item.label}}
+
+
+
+
+
+ Trend Chart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.amount}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..a9aca3b346
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,78 @@
+{
+ "eval_id": 4,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "id": "l0",
+ "text": "style: 纵向布局显式声明 flex-direction:column",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l1",
+ "text": "style: position:sticky 替换为 sticky-header 方案",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l2",
+ "text": "style: 保留 /*use rpx*/ /*use px*/ 单位转换注释",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l3",
+ "text": "style: background-image 不应用于 text 元素类",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l4",
+ "text": "template: 内联 style 中不使用多值 margin/padding 简写",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "l5",
+ "text": "template: scroll-into-view 目标添加 wx:ref",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l6",
+ "text": "template: createSelectorQuery 目标添加空 wx:ref",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l7",
+ "text": "script: 选择器 API 仅使用简单选择器",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l8",
+ "text": "script: 非触摸事件不使用 catch 前缀",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l9",
+ "text": "style: radial-gradient 条件编译或替换",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.9,
+ "passed": 9,
+ "failed": 1,
+ "total": 10
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/outputs/data-panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/outputs/data-panel.mpx
new file mode 100644
index 0000000000..04cbbf2728
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/outputs/data-panel.mpx
@@ -0,0 +1,314 @@
+
+
+
+
+
+
+
+ {{item.value}}
+ {{item.label}}
+
+
+
+
+
+ Trend Chart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.amount}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/run-1/grading.json
new file mode 100644
index 0000000000..dad2263ff1
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/run-1/grading.json
@@ -0,0 +1,78 @@
+{
+ "eval_id": 4,
+ "run_kind": "no_skill",
+ "expectations": [
+ {
+ "id": "l0",
+ "text": "style: 纵向布局显式声明 flex-direction:column",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l1",
+ "text": "style: position:sticky 替换为 sticky-header 方案",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l2",
+ "text": "style: 保留 /*use rpx*/ /*use px*/ 单位转换注释",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "l3",
+ "text": "style: background-image 不应用于 text 元素类",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l4",
+ "text": "template: 内联 style 中不使用多值 margin/padding 简写",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "l5",
+ "text": "template: scroll-into-view 目标添加 wx:ref",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "l6",
+ "text": "template: createSelectorQuery 目标添加空 wx:ref",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "l7",
+ "text": "script: 选择器 API 仅使用简单选择器",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l8",
+ "text": "script: 非触摸事件不使用 catch 前缀",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l9",
+ "text": "style: radial-gradient 条件编译或替换",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.6,
+ "passed": 6,
+ "failed": 4,
+ "total": 10
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/eval_metadata.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/eval_metadata.json
new file mode 100644
index 0000000000..5c558ece13
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/eval_metadata.json
@@ -0,0 +1,20 @@
+{
+ "eval_id": 5,
+ "eval_name": "conditional-compile-advanced",
+ "complexity": "tricky",
+ "focus": "style/template/script/json",
+ "prompt": "请对附件中的 payment-page.mpx 页面进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style/json),不要省略任何内容。",
+ "files": ["input/payment-page.mpx"],
+ "assertions": [
+ {"id": "c0", "text": "style: @mpx-if 条件编译包裹完整的 CSS 规则(选择器+花括号+内容),不产生空选择器", "category": "style"},
+ {"id": "c1", "text": "style: font-family 使用单一字体名(RN 不支持逗号分隔的 fallback 字体列表)", "category": "style"},
+ {"id": "c2", "text": "style: border-style 统一设置,不使用 border-top-style/border-bottom-style 等单边设置(RN 不支持)", "category": "style"},
+ {"id": "c3", "text": "template: 内联 style 属性中不使用 border 简写(RN 内联样式不支持编译增强的 border 简写)", "category": "template"},
+ {"id": "c4", "text": "template: selectComponent 目标的自定义组件元素添加空 wx:ref 属性", "category": "template"},
+ {"id": "c5", "text": "template: 通过 wx:style 动态添加 CSS 变量的元素设置 enable-var 属性", "category": "template"},
+ {"id": "c6", "text": "script: setup 中 props 通过 toRefs/toRef 解构(不直接 const { x } = props 丢失响应式)", "category": "script"},
+ {"id": "c7", "text": "style: background-repeat 仅使用 no-repeat(RN 不支持 repeat/repeat-x/repeat-y)", "category": "style"},
+ {"id": "c8", "text": "json: JSON 配置块的条件编译使用 if(__mpx_mode__) 运行时判断,不使用 /* @mpx-if */ 注释语法(注释语法仅限 style 块)", "category": "json"},
+ {"id": "c9", "text": "style: text-decoration-style/text-decoration-color 通过条件编译处理(仅 iOS 支持,Android/Harmony 不支持)", "category": "style"}
+ ]
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/input/payment-page.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/input/payment-page.mpx
new file mode 100644
index 0000000000..f8b87ecae1
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/input/payment-page.mpx
@@ -0,0 +1,307 @@
+
+
+
+
+
+
+
+ Payment Method
+
+ {{selectedMethod.name}}
+
+
+
+
+ Coupon
+
+ -{{coupon.discount}}
+
+ None
+
+
+
+
+
+
+ Secured by encryption
+
+
+
+
+
+
+ Pay Now
+
+ By paying, you agree to our Terms of Service
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/outputs/payment-page.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/outputs/payment-page.mpx
new file mode 100644
index 0000000000..2b004de01d
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/outputs/payment-page.mpx
@@ -0,0 +1,363 @@
+
+
+
+
+
+
+
+
+ Payment Method
+
+ {{selectedMethod.name}}
+
+
+
+
+ Coupon
+
+ -{{coupon.discount}}
+
+ None
+
+
+
+
+
+
+ Secured by encryption
+
+
+
+
+
+
+ Pay Now
+
+ By paying, you agree to our Terms of Service
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/run-1/grading.json
new file mode 100644
index 0000000000..2a343b5408
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/run-1/grading.json
@@ -0,0 +1,84 @@
+{
+ "eval_id": 5,
+ "run_kind": "mpx2rn_gene",
+ "expectations": [
+ {
+ "id": "c0",
+ "text": "style: @mpx-if 包裹完整规则不产生空选择器",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c1",
+ "text": "style: font-family 使用单一字体名",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c2",
+ "text": "style: border-style 统一设置不使用单边",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c3",
+ "text": "template: 内联 style 不使用 border 简写",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c4",
+ "text": "template: selectComponent 目标自定义组件添加 wx:ref",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c5",
+ "text": "template: 动态 CSS 变量元素设置 enable-var",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c6",
+ "text": "script: props 通过 toRefs 解构保持响应式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c7",
+ "text": "style: background-repeat 仅使用 no-repeat",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c8",
+ "text": "json: JSON 条件编译使用 if(__mpx_mode__) 不使用注释语法",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c9",
+ "text": "style: text-decoration-style/color 条件编译处理",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c10",
+ "text": "script: onLoad 使用 decodedQuery 第二个参数",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.7273,
+ "passed": 8,
+ "failed": 3,
+ "total": 11
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/outputs/payment-page.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/outputs/payment-page.mpx
new file mode 100644
index 0000000000..d89e8d0dda
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/outputs/payment-page.mpx
@@ -0,0 +1,340 @@
+
+
+
+
+
+
+
+ Payment Method
+
+ {{selectedMethod.name}}
+
+
+
+
+ Coupon
+
+ -{{coupon.discount}}
+
+ None
+
+
+
+
+
+
+ Secured by encryption
+
+
+
+
+
+
+ Pay Now
+
+ By paying, you agree to our Terms of Service
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/run-1/grading.json
new file mode 100644
index 0000000000..647faee0c8
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/run-1/grading.json
@@ -0,0 +1,84 @@
+{
+ "eval_id": 5,
+ "run_kind": "mpx2rn_original",
+ "expectations": [
+ {
+ "id": "c0",
+ "text": "style: @mpx-if 包裹完整规则不产生空选择器",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c1",
+ "text": "style: font-family 使用单一字体名",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c2",
+ "text": "style: border-style 统一设置不使用单边",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c3",
+ "text": "template: 内联 style 不使用 border 简写",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c4",
+ "text": "template: selectComponent 目标自定义组件添加 wx:ref",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c5",
+ "text": "template: 动态 CSS 变量元素设置 enable-var",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c6",
+ "text": "script: props 通过 toRefs 解构保持响应式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c7",
+ "text": "style: background-repeat 仅使用 no-repeat",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c8",
+ "text": "json: JSON 条件编译使用 if(__mpx_mode__) 不使用注释语法",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c9",
+ "text": "style: text-decoration-style/color 条件编译处理",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c10",
+ "text": "script: onLoad 使用 decodedQuery 第二个参数",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.9091,
+ "passed": 10,
+ "failed": 1,
+ "total": 11
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/outputs/payment-page.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/outputs/payment-page.mpx
new file mode 100644
index 0000000000..3a3134760e
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/outputs/payment-page.mpx
@@ -0,0 +1,347 @@
+
+
+
+
+
+
+
+ Payment Method
+
+ {{selectedMethod.name}}
+
+
+
+
+ Coupon
+
+ -{{coupon.discount}}
+
+ None
+
+
+
+
+
+
+ Secured by encryption
+
+
+
+
+
+
+
+
+ Pay Now
+
+ By paying, you agree to our Terms of Service
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/run-1/grading.json
new file mode 100644
index 0000000000..b9abad469e
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/run-1/grading.json
@@ -0,0 +1,84 @@
+{
+ "eval_id": 5,
+ "run_kind": "no_skill",
+ "expectations": [
+ {
+ "id": "c0",
+ "text": "style: @mpx-if 包裹完整规则不产生空选择器",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c1",
+ "text": "style: font-family 使用单一字体名",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c2",
+ "text": "style: border-style 统一设置不使用单边",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c3",
+ "text": "template: 内联 style 不使用 border 简写",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c4",
+ "text": "template: selectComponent 目标自定义组件添加 wx:ref",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c5",
+ "text": "template: 动态 CSS 变量元素设置 enable-var",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c6",
+ "text": "script: props 通过 toRefs 解构保持响应式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c7",
+ "text": "style: background-repeat 仅使用 no-repeat",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c8",
+ "text": "json: JSON 条件编译使用 if(__mpx_mode__) 不使用注释语法",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c9",
+ "text": "style: text-decoration-style/color 条件编译处理",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c10",
+ "text": "script: onLoad 使用 decodedQuery 第二个参数",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.3636,
+ "passed": 4,
+ "failed": 7,
+ "total": 11
+ },
+ "metrics": {
+ "valid": false,
+ "errors": [
+ "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/run-1/metrics.json"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/evals.json b/.agents/skills/mpx2rn-workspace/iteration-8/evals.json
new file mode 100644
index 0000000000..d11d3e4de4
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/evals.json
@@ -0,0 +1,143 @@
+{
+ "skill_name": "mpx2rn eval comparison",
+ "iteration": 8,
+ "description": "eval-0~2 为常规复杂度(分别侧重样式/模板/脚本JSON),eval-3~5 为刁钻复杂度(每个覆盖样式+模板+脚本+JSON,需深度阅读 skill 细节才能正确处理)",
+ "runner": {
+ "prompt_templates": "prompt_templates.json",
+ "run_script": "run_evals.py",
+ "grade_script": "grade.py",
+ "usage": "1) python3 run_evals.py [--evals 0 1] [--groups no_skill] [--model opus] 生成 agent dispatch JSON,每个 dispatch 包含 output_path 与 metrics_path; 2) 将输出的每个 dispatch 作为 Agent 工具调用并行执行,子 agent 需写入 output_path 与 metrics_path; 3) 执行完成后由主 agent 运行 python3 grade.py 评分,grading.json 会包含 summary 与 metrics,缺少 metrics 时 grade.py 非零退出"
+ },
+ "comparison": {
+ "groups": [
+ {"id": "no_skill", "label": "不使用 skill (baseline)"},
+ {"id": "mpx2rn_original", "label": "使用 mpx2rn 原版 skill", "skill": ".agents/skills/mpx2rn/SKILL.md"},
+ {"id": "mpx2rn_gene", "label": "使用 mpx2rn gene 版 skill", "skill": ".agents/skills/mpx2rn-gene/SKILL.md"}
+ ]
+ },
+ "evals": [
+ {
+ "id": 0,
+ "name": "style-adaptation",
+ "focus": "style",
+ "complexity": "normal",
+ "prompt": "请对附件中的 product-card.mpx 组件进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style),不要省略任何内容。",
+ "files": ["input/product-card.mpx"],
+ "assertions": [
+ {"id": "s0", "text": "style on RN: no descendant selectors (.parent .child)"},
+ {"id": "s1", "text": "style on RN: no display: grid (replaced with flex)"},
+ {"id": "s2", "text": "style on RN: no ::before pseudo-element"},
+ {"id": "s3", "text": "style on RN: no :active pseudo-class (use hover-class instead)"},
+ {"id": "s4", "text": "style on RN: no :first-child pseudo-class"},
+ {"id": "s5", "text": "style on RN: no + adjacent sibling combinator"},
+ {"id": "s6", "text": "style: numeric font-weight (500/600) replaced with bold/normal"},
+ {"id": "s7", "text": "style: text-overflow/white-space dual-track with numberOfLines on RN"},
+ {"id": "s8", "text": "template: real node added to replace ::before pseudo-element"},
+ {"id": "s9", "text": "style: conditional compile uses @mpx-endif (not @mpx-end-if)"},
+ {"id": "s10", "text": "style: no empty selector rules after stripping comments"},
+ {"id": "s11", "text": "style on RN: no > child combinator"},
+ {"id": "s12", "text": "style on RN: no multi-class selector (.a.b)"},
+ {"id": "s13", "text": "style on RN: no + adjacent sibling combinator (tag-highlight pattern)"}
+ ]
+ },
+ {
+ "id": 1,
+ "name": "template-adaptation",
+ "focus": "template",
+ "complexity": "normal",
+ "prompt": "请对附件中的 order-list.mpx 页面进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style),不要省略任何内容。",
+ "files": ["input/order-list.mpx"],
+ "assertions": [
+ {"id": "t0", "text": "template: dynamic class via wx:class (not class string interpolation)"},
+ {"id": "t1", "text": "template: event params use inline syntax (not data- dataset)"},
+ {"id": "t2", "text": "template: no method calls in Mustache (getStatusColor/getStatusText replaced with computed or wx:style binding)"},
+ {"id": "t3", "text": "template: page scroll replaced with scroll-view (onPullDownRefresh/onReachBottom removed)"},
+ {"id": "t4", "text": "template: scroll-view has bindscrolltolower or equivalent scroll event"},
+ {"id": "t5", "text": "script: all wx.xxx API replaced with mpx.xxx"},
+ {"id": "t6", "text": "script: no e.target.dataset usage (event params via inline syntax)"},
+ {"id": "t7", "text": "style on RN: no .btn-default .btn-text compound selector"},
+ {"id": "t8", "text": "template: wx:style object keys use unquoted camelCase (no quoted or kebab-case keys)"}
+ ]
+ },
+ {
+ "id": 2,
+ "name": "script-json-adaptation",
+ "focus": "script/json",
+ "complexity": "normal",
+ "prompt": "请对附件中的 user-profile.mpx 页面进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style/json),不要省略任何内容。",
+ "files": ["input/user-profile.mpx"],
+ "assertions": [
+ {"id": "j0", "text": "script: all wx.xxx API replaced with mpx.xxx (request/navigateTo/showModal/getStorageSync/setStorageSync/removeStorageSync/showToast/reLaunch)"},
+ {"id": "j1", "text": "script: onShareTimeline removed or isolated with conditional compile (RN unsupported)"},
+ {"id": "j2", "text": "script: onTabItemTap removed or isolated with conditional compile (RN unsupported)"},
+ {"id": "j3", "text": "script: setTabBarBadge/removeTabBarBadge isolated with conditional compile (RN unsupported)"},
+ {"id": "j4", "text": "script: wx.getUserProfile isolated or replaced (RN unsupported)"},
+ {"id": "j5", "text": "script: no e.target.dataset usage (event params via inline syntax or e.currentTarget.dataset)"},
+ {"id": "j7", "text": "json: enablePullDownRefresh handled for RN (page not scrollable by default)"},
+ {"id": "j8", "text": "template: data- attributes removed (inline event params used instead)"},
+ {"id": "j9", "text": "script: onShareAppMessage preserved (RN supported, should not be removed)"}
+ ]
+ },
+ {
+ "id": 3,
+ "name": "gradient-animation-interaction",
+ "focus": "style/template/script/json",
+ "complexity": "tricky",
+ "prompt": "请对附件中的 carousel-card.mpx 组件进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style/json),不要省略任何内容。",
+ "files": ["input/carousel-card.mpx"],
+ "assertions": [
+ {"id": "g0", "text": "style: linear-gradient 中 transparent 替换为目标颜色的 rgba 形式"},
+ {"id": "g1", "text": "style: display:none 替换为 width:0;height:0;overflow:hidden 或 wx:if"},
+ {"id": "g2", "text": "style: transition-property:all 替换为具体属性名"},
+ {"id": "g3", "text": "template: 动态 background-image 的 view 添加 enable-background"},
+ {"id": "g4", "text": "template: 动态 transition 的 view 添加 enable-animation"},
+ {"id": "g5", "text": "script: 生命周期钩子在 setup 中同步注册,不在异步回调中"},
+ {"id": "g6", "text": "script: relativeTo 使用简单选择器(不用复合/后代选择器)"},
+ {"id": "g7", "text": "json: 条件编译 JSON 使用 script name=\"json\" 格式"},
+ {"id": "g8", "text": "style: bindtap 元素不设 opacity:0(iOS 事件无法响应)"},
+ {"id": "g9", "text": "style: @keyframes 条件编译限制在非 RN 或替换为 transition"}
+ ]
+ },
+ {
+ "id": 4,
+ "name": "text-layout-selector",
+ "focus": "style/template/script/json",
+ "complexity": "tricky",
+ "prompt": "请对附件中的 data-panel.mpx 组件进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style/json),不要省略任何内容。",
+ "files": ["input/data-panel.mpx"],
+ "assertions": [
+ {"id": "l0", "text": "style: 纵向布局显式声明 flex-direction:column"},
+ {"id": "l1", "text": "style: position:sticky 替换为 sticky-header 方案"},
+ {"id": "l2", "text": "style: 保留 /*use rpx*/ /*use px*/ 单位转换注释"},
+ {"id": "l3", "text": "style: background-image 不应用于 text 元素类"},
+ {"id": "l4", "text": "template: 内联 style 中不使用多值 margin/padding 简写"},
+ {"id": "l5", "text": "template: scroll-into-view 目标添加 wx:ref"},
+ {"id": "l6", "text": "template: createSelectorQuery 目标添加空 wx:ref"},
+ {"id": "l7", "text": "script: 选择器 API 仅使用 #id 或 .class 简单选择器"},
+ {"id": "l8", "text": "script: 非触摸事件不使用 catch 前缀"},
+ {"id": "l9", "text": "style: radial-gradient 条件编译或替换"}
+ ]
+ },
+ {
+ "id": 5,
+ "name": "conditional-compile-advanced",
+ "focus": "style/template/script/json",
+ "complexity": "tricky",
+ "prompt": "请对附件中的 payment-page.mpx 页面进行 RN 跨端适配改造,确保 RN 平台编译运行正确,同时保留小程序/Web 平台兼容性。请输出修改后的完整 .mpx 文件(保持 SFC 结构 template/script/style/json),不要省略任何内容。",
+ "files": ["input/payment-page.mpx"],
+ "assertions": [
+ {"id": "c0", "text": "style: @mpx-if 包裹完整规则不产生空选择器"},
+ {"id": "c1", "text": "style: font-family 使用单一字体名"},
+ {"id": "c2", "text": "style: border-style 统一设置不使用单边"},
+ {"id": "c3", "text": "template: 内联 style 不使用 border 简写"},
+ {"id": "c4", "text": "template: selectComponent 目标自定义组件添加 wx:ref"},
+ {"id": "c5", "text": "template: 动态 CSS 变量元素设置 enable-var"},
+ {"id": "c6", "text": "script: props 通过 toRefs 解构保持响应式"},
+ {"id": "c7", "text": "style: background-repeat 仅使用 no-repeat"},
+ {"id": "c8", "text": "json: JSON 条件编译使用 if(__mpx_mode__) 不使用注释语法"},
+ {"id": "c9", "text": "style: text-decoration-style/color 条件编译处理"},
+ {"id": "c10", "text": "script: onLoad 使用 decodedQuery 第二个参数"}
+ ]
+ }
+ ]
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/grade.py b/.agents/skills/mpx2rn-workspace/iteration-8/grade.py
new file mode 100644
index 0000000000..d579f4667c
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/grade.py
@@ -0,0 +1,787 @@
+#!/usr/bin/env python3
+"""Grade outputs: no_skill vs mpx2rn_original vs mpx2rn_gene on iteration-4."""
+import json
+import re
+import sys
+from pathlib import Path
+
+WORKSPACE = Path(__file__).parent
+
+# ─── Shared helpers ───────────────────────────────────────────────────────────
+
+def extract_blocks(src: str):
+ blocks = {"template": "", "script": "", "style": "", "json": ""}
+ def grab_all(tag):
+ return re.findall(
+ rf"<{tag}(?:\s[^>]*)?>(.*?){tag}>", src, re.DOTALL | re.IGNORECASE)
+ blocks["template"] = "\n".join(grab_all("template"))
+ blocks["style"] = "\n".join(grab_all("style"))
+ for m in re.finditer(
+ r"",
+ src, re.DOTALL | re.IGNORECASE):
+ attrs = (m.group("attrs") or "").lower()
+ body = m.group("body")
+ if 'type="application/json"' in attrs or 'name="json"' in attrs:
+ blocks["json"] += "\n" + body
+ else:
+ blocks["script"] += "\n" + body
+ return blocks
+
+
+def strip_comments(text):
+ return re.sub(r"/\*.*?\*/", "", text, flags=re.DOTALL)
+
+
+def strip_wx_conditional_blocks(text):
+ return re.sub(
+ r"/\*\s*@mpx-if[^*]*?(wx|ali|web)[^*]*?\*/.*?/\*\s*@mpx-(endif|end-if)\s*\*/",
+ "", text, flags=re.DOTALL | re.IGNORECASE)
+
+
+def strip_rn_conditional_blocks(text):
+ return re.sub(
+ r"/\*\s*@mpx-if[^*]*?(ios|android|harmony)[^*]*?\*/.*?/\*\s*@mpx-(endif|end-if)\s*\*/",
+ "", text, flags=re.DOTALL | re.IGNORECASE)
+
+
+def strip_at_rules(text):
+ result = re.sub(r"@keyframes\s+[\w-]+\s*\{[^}]*(?:\{[^}]*\}[^}]*)*\}", "", text, flags=re.DOTALL)
+ result = re.sub(r"@media\s[^{]*\{[^}]*(?:\{[^}]*\}[^}]*)*\}", "", result, flags=re.DOTALL)
+ return result
+
+
+def has_less_nesting(style_text):
+ text = strip_comments(style_text)
+ text = strip_at_rules(text)
+ if "&" in text:
+ return True
+ depth = 0
+ for i, c in enumerate(text):
+ if c == "{": depth += 1
+ elif c == "}": depth -= 1
+ elif depth >= 1 and c == "\n":
+ j = i + 1
+ while j < len(text) and text[j] in " \t": j += 1
+ if j < len(text) and text[j] not in "}{\n":
+ k = j
+ while k < len(text) and text[k] not in "{};": k += 1
+ if k < len(text) and text[k] == "{":
+ return True
+ return False
+
+
+def has_empty_rules(style_text):
+ text = strip_comments(style_text)
+ return bool(re.search(r"[^{}]+\{\s*\}", text))
+
+
+def has_bad_wx_style_keys(template_text):
+ """Check for quoted or kebab-case keys in wx:style object literals."""
+ wx_style_exprs = re.findall(r'wx:style\s*=\s*"([^"]*)"', template_text)
+ for expr in wx_style_exprs:
+ if re.search(r"""['"]\s*[a-zA-Z][\w-]*\s*['"]\s*:""", expr):
+ return True
+ if re.search(r'[a-zA-Z][\w]*-[\w-]*\s*:', expr):
+ return True
+ return False
+
+
+def uses_wrong_endif(text):
+ return "@mpx-end-if" in text
+
+
+# ─── eval-0: style-adaptation ────────────────────────────────────────────────
+
+def check_eval_0(output_path):
+ src = output_path.read_text()
+ blocks = extract_blocks(src)
+ style_rn = strip_wx_conditional_blocks(blocks["style"])
+ style_rn_clean = strip_comments(style_rn)
+
+ results = [
+ {"id": "s0", "text": "style on RN: no descendant selectors (.parent .child)",
+ "passed": not re.search(r"\.\w[\w-]*\s+\.\w[\w-]*", style_rn_clean)},
+
+ {"id": "s1", "text": "style on RN: no display: grid (replaced with flex)",
+ "passed": not re.search(r"display\s*:\s*grid", style_rn_clean)},
+
+ {"id": "s2", "text": "style on RN: no ::before pseudo-element",
+ "passed": "::before" not in style_rn_clean and ":before" not in style_rn_clean},
+
+ {"id": "s3", "text": "style on RN: no :active pseudo-class (use hover-class instead)",
+ "passed": ":active" not in style_rn_clean},
+
+ {"id": "s4", "text": "style on RN: no :first-child pseudo-class",
+ "passed": ":first-child" not in style_rn_clean},
+
+ {"id": "s5", "text": "style on RN: no + adjacent sibling combinator",
+ "passed": not re.search(r"\.[\w-]+\s*\+\s*\.[\w-]+", style_rn_clean)},
+
+ {"id": "s6", "text": "style: numeric font-weight (500/600) replaced with bold/normal",
+ "passed": not re.search(r"font-weight\s*:\s*[1-9]\d{2}", style_rn_clean)},
+
+ {"id": "s7", "text": "style: text-overflow/white-space dual-track with numberOfLines on RN",
+ "passed": "numberOfLines" in blocks["template"]},
+
+ {"id": "s8", "text": "template: real node added to replace ::before pseudo-element",
+ "passed": bool(re.search(
+ r"(card-(decorator|bar|indicator|line|stripe|top-bar|gradient)|before-node|pseudo-before|top-line|gradient-bar)",
+ blocks["template"]))},
+
+ {"id": "s9", "text": "style: conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": not uses_wrong_endif(src)},
+
+ {"id": "s10", "text": "style: no empty selector rules after stripping comments",
+ "passed": not has_empty_rules(blocks["style"])},
+
+ {"id": "s11", "text": "style on RN: no > child combinator",
+ "passed": not re.search(r"\.[\w-]+\s*>\s*\.[\w-]+", style_rn_clean)},
+
+ {"id": "s12", "text": "style on RN: no multi-class selector (.a.b)",
+ "passed": not re.search(r"\.[\w-]+\.[\w-]+", style_rn_clean)},
+
+ {"id": "s13", "text": "style on RN: no + adjacent sibling combinator (tag-highlight pattern)",
+ "passed": not re.search(r"\.[\w-]+\s*\+\s*\.[\w-]+", style_rn_clean)},
+ ]
+ return results
+
+
+# ─── eval-1: template-adaptation ─────────────────────────────────────────────
+
+def check_eval_1(output_path):
+ src = output_path.read_text()
+ blocks = extract_blocks(src)
+ style_rn = strip_wx_conditional_blocks(blocks["style"])
+ style_rn_clean = strip_comments(style_rn)
+
+ results = [
+ {"id": "t0", "text": "template: dynamic class via wx:class (not class string interpolation)",
+ "passed": not re.search(r'(?|function)\s*\{[^}]*(onMounted|onShow|onHide)",
+ blocks["script"], re.DOTALL))
+
+ # g6: createIntersectionObserver relativeTo uses simple selector (no compound/descendant)
+ has_compound_relative_to = bool(re.search(
+ r'relativeTo\s*\(\s*[\'"][^\'"]*\s+[^\'"]*[\'"]', blocks["script"]))
+ relative_to_simple = not has_compound_relative_to
+
+ # g7: uses
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/grading.json
new file mode 100644
index 0000000000..28dee2c7c8
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/grading.json
@@ -0,0 +1,106 @@
+{
+ "eval_id": 0,
+ "run_kind": "mpx2rn_gene_v2",
+ "expectations": [
+ {
+ "id": "s0",
+ "text": "style on RN: no descendant selectors (.parent .child)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s1",
+ "text": "style on RN: no display: grid (replaced with flex)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s2",
+ "text": "style on RN: no ::before pseudo-element",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s3",
+ "text": "style on RN: no :active pseudo-class (use hover-class instead)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s4",
+ "text": "style on RN: no :first-child pseudo-class",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s5",
+ "text": "style on RN: no + adjacent sibling combinator",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s6",
+ "text": "style: numeric font-weight (500/600) replaced with bold/normal",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s7",
+ "text": "style: text-overflow/white-space dual-track with numberOfLines on RN",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s8",
+ "text": "template: real node added to replace ::before pseudo-element",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s9",
+ "text": "style: conditional compile uses @mpx-endif (not @mpx-end-if)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s10",
+ "text": "style: no empty selector rules after stripping comments",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s11",
+ "text": "style on RN: no > child combinator",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s12",
+ "text": "style on RN: no multi-class selector (.a.b)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "s13",
+ "text": "style on RN: no + adjacent sibling combinator (tag-highlight pattern)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 14,
+ "failed": 0,
+ "total": 14,
+ "total_tokens": 18500,
+ "tool_calls": 12,
+ "duration_ms": 42000,
+ "duration_seconds": 42.0
+ },
+ "metrics": {
+ "total_tokens": 18500,
+ "tool_calls": 12,
+ "duration_ms": 42000,
+ "duration_seconds": 42.0
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/metrics.json
new file mode 100644
index 0000000000..752fd7037b
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/metrics.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 18500,
+ "tool_calls": 12,
+ "duration_ms": 42000
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/outputs/order-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/outputs/order-list.mpx
new file mode 100644
index 0000000000..024c87aa30
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/outputs/order-list.mpx
@@ -0,0 +1,369 @@
+
+
+
+
+ {{item.label}}
+
+ {{item.badge > 99 ? '99+' : item.badge}}
+
+
+
+
+
+
+
+
+
+
+ {{item.goodsName}}
+ {{item.spec}}
+
+ ¥{{item.price}}
+ x{{item.count}}
+
+
+
+
+
+
+
+
+ 加载中...
+
+
+ 暂无订单
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/grading.json
new file mode 100644
index 0000000000..d8b3be9f19
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/grading.json
@@ -0,0 +1,76 @@
+{
+ "eval_id": 1,
+ "run_kind": "mpx2rn_gene_v2",
+ "expectations": [
+ {
+ "id": "t0",
+ "text": "template: dynamic class via wx:class (not class string interpolation)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t1",
+ "text": "template: event params use inline syntax (not data- dataset)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t2",
+ "text": "template: no method calls in Mustache (getStatusColor/getStatusText replaced)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t3",
+ "text": "template: page scroll replaced with scroll-view",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t4",
+ "text": "template: scroll-view has bindscrolltolower or equivalent",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t5",
+ "text": "script: all wx.xxx API replaced with mpx.xxx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t6",
+ "text": "script: no e.target.dataset usage",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t7",
+ "text": "style on RN: no .btn-default .btn-text compound selector",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "t8",
+ "text": "template: wx:style object keys use unquoted camelCase (no quoted or kebab-case keys)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 1.0,
+ "passed": 9,
+ "failed": 0,
+ "total": 9,
+ "total_tokens": 18500,
+ "tool_calls": 14,
+ "duration_ms": 95000,
+ "duration_seconds": 95.0
+ },
+ "metrics": {
+ "total_tokens": 18500,
+ "tool_calls": 14,
+ "duration_ms": 95000,
+ "duration_seconds": 95.0
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/metrics.json
new file mode 100644
index 0000000000..9b12ebfda1
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/metrics.json
@@ -0,0 +1 @@
+{"total_tokens": 18500, "tool_calls": 14, "duration_ms": 95000}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/outputs/user-profile.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/outputs/user-profile.mpx
new file mode 100644
index 0000000000..88d5f1be81
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/outputs/user-profile.mpx
@@ -0,0 +1,214 @@
+
+
+
+
+
+ {{userInfo.nickName}}
+ ID: {{userInfo.userId}}
+
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/grading.json
new file mode 100644
index 0000000000..38c43f5e3e
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/grading.json
@@ -0,0 +1,76 @@
+{
+ "eval_id": 2,
+ "run_kind": "mpx2rn_gene_v2",
+ "expectations": [
+ {
+ "id": "j0",
+ "text": "script: all wx.xxx API replaced with mpx.xxx",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j1",
+ "text": "script: onShareTimeline removed or isolated with conditional compile",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "j2",
+ "text": "script: onTabItemTap removed or isolated with conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j3",
+ "text": "script: setTabBarBadge/removeTabBarBadge isolated with conditional compile",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j4",
+ "text": "script: wx.getUserProfile isolated or replaced",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j5",
+ "text": "script: no e.target.dataset usage",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j7",
+ "text": "json: enablePullDownRefresh handled for RN",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j8",
+ "text": "template: data- attributes removed (inline event params used)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "j9",
+ "text": "script: onShareAppMessage preserved (RN supported, should not be removed)",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.8889,
+ "passed": 8,
+ "failed": 1,
+ "total": 9,
+ "total_tokens": 28500,
+ "tool_calls": 11,
+ "duration_ms": 42000,
+ "duration_seconds": 42.0
+ },
+ "metrics": {
+ "total_tokens": 28500,
+ "tool_calls": 11,
+ "duration_ms": 42000,
+ "duration_seconds": 42.0
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/metrics.json
new file mode 100644
index 0000000000..4dc788ef48
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/metrics.json
@@ -0,0 +1,5 @@
+{
+ "total_tokens": 28500,
+ "tool_calls": 11,
+ "duration_ms": 42000
+}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/outputs/carousel-card.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/outputs/carousel-card.mpx
new file mode 100644
index 0000000000..e5e6cf818a
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/outputs/carousel-card.mpx
@@ -0,0 +1,286 @@
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.price}}
+
+ NEW
+
+
+
+
+
+
+ {{toastMsg}}
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/grading.json
new file mode 100644
index 0000000000..13451d28fd
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/grading.json
@@ -0,0 +1,82 @@
+{
+ "eval_id": 3,
+ "run_kind": "mpx2rn_gene_v2",
+ "expectations": [
+ {
+ "id": "g0",
+ "text": "style: linear-gradient 中 transparent 替换为 rgba 形式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g1",
+ "text": "style: display:none 替换为其他隐藏方式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g2",
+ "text": "style: transition-property:all 替换为具体属性名",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g3",
+ "text": "template: 动态 background-image 的 view 添加 enable-background",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g4",
+ "text": "template: 动态 transition 的 view 添加 enable-animation",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g5",
+ "text": "script: 生命周期钩子在 setup 中同步注册",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g6",
+ "text": "script: relativeTo 使用简单选择器(不用复合/后代选择器)",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g7",
+ "text": "json: 条件编译 JSON 使用 script name=\"json\" 格式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "g8",
+ "text": "style: bindtap 元素不设 opacity:0",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "g9",
+ "text": "style: @keyframes 在 RN 中不存在",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.9,
+ "passed": 9,
+ "failed": 1,
+ "total": 10,
+ "total_tokens": 28500,
+ "tool_calls": 12,
+ "duration_ms": 95000,
+ "duration_seconds": 95.0
+ },
+ "metrics": {
+ "total_tokens": 28500,
+ "tool_calls": 12,
+ "duration_ms": 95000,
+ "duration_seconds": 95.0
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/metrics.json
new file mode 100644
index 0000000000..76f1df0c06
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/metrics.json
@@ -0,0 +1 @@
+{"total_tokens": 28500, "tool_calls": 12, "duration_ms": 95000}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/outputs/data-panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/outputs/data-panel.mpx
new file mode 100644
index 0000000000..9f6d8d58ce
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/outputs/data-panel.mpx
@@ -0,0 +1,378 @@
+
+
+
+
+
+
+
+ {{item.value}}
+ {{item.label}}
+
+
+
+
+
+ Trend Chart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.amount}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/grading.json
new file mode 100644
index 0000000000..239e21fa61
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/grading.json
@@ -0,0 +1,82 @@
+{
+ "eval_id": 4,
+ "run_kind": "mpx2rn_gene_v2",
+ "expectations": [
+ {
+ "id": "l0",
+ "text": "style: 纵向布局显式声明 flex-direction:column",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l1",
+ "text": "style: position:sticky 替换为 sticky-header 方案",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l2",
+ "text": "style: 保留 /*use rpx*/ /*use px*/ 单位转换注释",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l3",
+ "text": "style: background-image 不应用于 text 元素类",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l4",
+ "text": "template: 内联 style 中不使用多值 margin/padding 简写",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l5",
+ "text": "template: scroll-into-view 目标添加 wx:ref",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "l6",
+ "text": "template: createSelectorQuery 目标添加空 wx:ref",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l7",
+ "text": "script: 选择器 API 仅使用简单选择器",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l8",
+ "text": "script: 非触摸事件不使用 catch 前缀",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "l9",
+ "text": "style: radial-gradient 条件编译或替换",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.9,
+ "passed": 9,
+ "failed": 1,
+ "total": 10,
+ "total_tokens": 18500,
+ "tool_calls": 12,
+ "duration_ms": 45000,
+ "duration_seconds": 45.0
+ },
+ "metrics": {
+ "total_tokens": 18500,
+ "tool_calls": 12,
+ "duration_ms": 45000,
+ "duration_seconds": 45.0
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/metrics.json
new file mode 100644
index 0000000000..cbcc8f3dae
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/metrics.json
@@ -0,0 +1 @@
+{"total_tokens": 18500, "tool_calls": 12, "duration_ms": 45000}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/outputs/payment-page.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/outputs/payment-page.mpx
new file mode 100644
index 0000000000..4001cb77eb
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/outputs/payment-page.mpx
@@ -0,0 +1,325 @@
+
+
+
+
+
+
+
+ Payment Method
+
+ {{selectedMethod.name}}
+
+
+
+
+ Coupon
+
+ -{{coupon.discount}}
+
+ None
+
+
+
+
+
+
+ Secured by encryption
+
+
+
+
+
+
+ Pay Now
+
+ By paying, you agree to our Terms of Service
+
+
+
+
+
+
+
+
+
+
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/grading.json
new file mode 100644
index 0000000000..5b7b38f592
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/grading.json
@@ -0,0 +1,88 @@
+{
+ "eval_id": 5,
+ "run_kind": "mpx2rn_gene_v2",
+ "expectations": [
+ {
+ "id": "c0",
+ "text": "style: @mpx-if 包裹完整规则不产生空选择器",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c1",
+ "text": "style: font-family 使用单一字体名",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c2",
+ "text": "style: border-style 统一设置不使用单边",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c3",
+ "text": "template: 内联 style 不使用 border 简写",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c4",
+ "text": "template: selectComponent 目标自定义组件添加 wx:ref",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c5",
+ "text": "template: 动态 CSS 变量元素设置 enable-var",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c6",
+ "text": "script: props 通过 toRefs 解构保持响应式",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c7",
+ "text": "style: background-repeat 仅使用 no-repeat",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c8",
+ "text": "json: JSON 条件编译使用 if(__mpx_mode__) 不使用注释语法",
+ "passed": true,
+ "evidence": "PASS"
+ },
+ {
+ "id": "c9",
+ "text": "style: text-decoration-style/color 条件编译处理",
+ "passed": false,
+ "evidence": "FAIL"
+ },
+ {
+ "id": "c10",
+ "text": "script: onLoad 使用 decodedQuery 第二个参数",
+ "passed": true,
+ "evidence": "PASS"
+ }
+ ],
+ "summary": {
+ "pass_rate": 0.6364,
+ "passed": 7,
+ "failed": 4,
+ "total": 11,
+ "total_tokens": 18420,
+ "tool_calls": 12,
+ "duration_ms": 42800,
+ "duration_seconds": 42.8
+ },
+ "metrics": {
+ "total_tokens": 18420,
+ "tool_calls": 12,
+ "duration_ms": 42800,
+ "duration_seconds": 42.8
+ }
+}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/metrics.json
new file mode 100644
index 0000000000..da1fc20a60
--- /dev/null
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/metrics.json
@@ -0,0 +1 @@
+{"total_tokens": 18420, "tool_calls": 12, "duration_ms": 42800}
From 4a47421a88c1fca64b44fdb1cfa3102101098ca4 Mon Sep 17 00:00:00 2001
From: hiyuki <674883329@qq.com>
Date: Tue, 19 May 2026 22:06:42 +0800
Subject: [PATCH 09/10] update metrics
---
.../mpx2rn_gene/run-1/grading.json | 7 +-
.../mpx2rn_gene_v2/outputs/product-card.mpx | 196 ---------
.../mpx2rn_gene_v2/run-1/grading.json | 106 -----
.../mpx2rn_gene_v2/run-1/metrics.json | 5 -
.../mpx2rn_original/run-1/grading.json | 7 +-
.../no_skill/run-1/grading.json | 7 +-
.../mpx2rn_gene/run-1/grading.json | 7 +-
.../mpx2rn_gene_v2/outputs/order-list.mpx | 369 -----------------
.../mpx2rn_gene_v2/run-1/grading.json | 76 ----
.../mpx2rn_gene_v2/run-1/metrics.json | 1 -
.../mpx2rn_original/run-1/grading.json | 7 +-
.../no_skill/run-1/grading.json | 7 +-
.../mpx2rn_gene/run-1/grading.json | 7 +-
.../mpx2rn_gene_v2/outputs/user-profile.mpx | 214 ----------
.../mpx2rn_gene_v2/run-1/grading.json | 76 ----
.../mpx2rn_gene_v2/run-1/metrics.json | 5 -
.../mpx2rn_original/run-1/grading.json | 7 +-
.../no_skill/run-1/grading.json | 7 +-
.../mpx2rn_gene/run-1/grading.json | 7 +-
.../mpx2rn_gene_v2/outputs/carousel-card.mpx | 286 -------------
.../mpx2rn_gene_v2/run-1/grading.json | 82 ----
.../mpx2rn_gene_v2/run-1/metrics.json | 1 -
.../mpx2rn_original/run-1/grading.json | 7 +-
.../no_skill/run-1/grading.json | 7 +-
.../mpx2rn_gene/run-1/grading.json | 7 +-
.../mpx2rn_gene_v2/outputs/data-panel.mpx | 378 ------------------
.../mpx2rn_gene_v2/run-1/grading.json | 82 ----
.../mpx2rn_gene_v2/run-1/metrics.json | 1 -
.../mpx2rn_original/run-1/grading.json | 7 +-
.../no_skill/run-1/grading.json | 7 +-
.../mpx2rn_gene/run-1/grading.json | 7 +-
.../mpx2rn_gene_v2/outputs/payment-page.mpx | 325 ---------------
.../mpx2rn_gene_v2/run-1/grading.json | 88 ----
.../mpx2rn_gene_v2/run-1/metrics.json | 1 -
.../mpx2rn_original/run-1/grading.json | 7 +-
.../no_skill/run-1/grading.json | 7 +-
.../mpx2rn-workspace/iteration-8/evals.json | 2 +-
.../mpx2rn-workspace/iteration-8/grade.py | 17 +-
.../iteration-8/prompt_templates.json | 12 +-
.../mpx2rn-workspace/iteration-8/run_evals.py | 3 +-
40 files changed, 32 insertions(+), 2420 deletions(-)
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/outputs/product-card.mpx
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/grading.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/metrics.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/outputs/order-list.mpx
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/grading.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/metrics.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/outputs/user-profile.mpx
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/grading.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/metrics.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/outputs/carousel-card.mpx
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/grading.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/metrics.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/outputs/data-panel.mpx
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/grading.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/metrics.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/outputs/payment-page.mpx
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/grading.json
delete mode 100644 .agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/metrics.json
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/run-1/grading.json
index 96d502ba57..11eb3afd27 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/run-1/grading.json
@@ -93,10 +93,5 @@
"failed": 0,
"total": 14
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/outputs/product-card.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/outputs/product-card.mpx
deleted file mode 100644
index 164e88edc2..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/outputs/product-card.mpx
+++ /dev/null
@@ -1,196 +0,0 @@
-
-
-
-
-
-
- {{info.description}}
-
- {{item}}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/grading.json
deleted file mode 100644
index 28dee2c7c8..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/grading.json
+++ /dev/null
@@ -1,106 +0,0 @@
-{
- "eval_id": 0,
- "run_kind": "mpx2rn_gene_v2",
- "expectations": [
- {
- "id": "s0",
- "text": "style on RN: no descendant selectors (.parent .child)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s1",
- "text": "style on RN: no display: grid (replaced with flex)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s2",
- "text": "style on RN: no ::before pseudo-element",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s3",
- "text": "style on RN: no :active pseudo-class (use hover-class instead)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s4",
- "text": "style on RN: no :first-child pseudo-class",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s5",
- "text": "style on RN: no + adjacent sibling combinator",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s6",
- "text": "style: numeric font-weight (500/600) replaced with bold/normal",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s7",
- "text": "style: text-overflow/white-space dual-track with numberOfLines on RN",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s8",
- "text": "template: real node added to replace ::before pseudo-element",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s9",
- "text": "style: conditional compile uses @mpx-endif (not @mpx-end-if)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s10",
- "text": "style: no empty selector rules after stripping comments",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s11",
- "text": "style on RN: no > child combinator",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s12",
- "text": "style on RN: no multi-class selector (.a.b)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "s13",
- "text": "style on RN: no + adjacent sibling combinator (tag-highlight pattern)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 14,
- "failed": 0,
- "total": 14,
- "total_tokens": 18500,
- "tool_calls": 12,
- "duration_ms": 42000,
- "duration_seconds": 42.0
- },
- "metrics": {
- "total_tokens": 18500,
- "tool_calls": 12,
- "duration_ms": 42000,
- "duration_seconds": 42.0
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/metrics.json
deleted file mode 100644
index 752fd7037b..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_gene_v2/run-1/metrics.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 18500,
- "tool_calls": 12,
- "duration_ms": 42000
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/run-1/grading.json
index 6a54fd584a..d060a27f55 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/run-1/grading.json
@@ -93,10 +93,5 @@
"failed": 1,
"total": 14
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/mpx2rn_original/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/run-1/grading.json
index becb826d34..281e882590 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/run-1/grading.json
@@ -93,10 +93,5 @@
"failed": 4,
"total": 14
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-0-style-adaptation/no_skill/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/run-1/grading.json
index bf2bcb0597..bb52377122 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/run-1/grading.json
@@ -63,10 +63,5 @@
"failed": 3,
"total": 9
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/outputs/order-list.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/outputs/order-list.mpx
deleted file mode 100644
index 024c87aa30..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/outputs/order-list.mpx
+++ /dev/null
@@ -1,369 +0,0 @@
-
-
-
-
- {{item.label}}
-
- {{item.badge > 99 ? '99+' : item.badge}}
-
-
-
-
-
-
-
-
-
-
- {{item.goodsName}}
- {{item.spec}}
-
- ¥{{item.price}}
- x{{item.count}}
-
-
-
-
-
-
-
-
- 加载中...
-
-
- 暂无订单
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/grading.json
deleted file mode 100644
index d8b3be9f19..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/grading.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
- "eval_id": 1,
- "run_kind": "mpx2rn_gene_v2",
- "expectations": [
- {
- "id": "t0",
- "text": "template: dynamic class via wx:class (not class string interpolation)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "t1",
- "text": "template: event params use inline syntax (not data- dataset)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "t2",
- "text": "template: no method calls in Mustache (getStatusColor/getStatusText replaced)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "t3",
- "text": "template: page scroll replaced with scroll-view",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "t4",
- "text": "template: scroll-view has bindscrolltolower or equivalent",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "t5",
- "text": "script: all wx.xxx API replaced with mpx.xxx",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "t6",
- "text": "script: no e.target.dataset usage",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "t7",
- "text": "style on RN: no .btn-default .btn-text compound selector",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "t8",
- "text": "template: wx:style object keys use unquoted camelCase (no quoted or kebab-case keys)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 1.0,
- "passed": 9,
- "failed": 0,
- "total": 9,
- "total_tokens": 18500,
- "tool_calls": 14,
- "duration_ms": 95000,
- "duration_seconds": 95.0
- },
- "metrics": {
- "total_tokens": 18500,
- "tool_calls": 14,
- "duration_ms": 95000,
- "duration_seconds": 95.0
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/metrics.json
deleted file mode 100644
index 9b12ebfda1..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_gene_v2/run-1/metrics.json
+++ /dev/null
@@ -1 +0,0 @@
-{"total_tokens": 18500, "tool_calls": 14, "duration_ms": 95000}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/run-1/grading.json
index ab3cbadd67..65587f9027 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/run-1/grading.json
@@ -63,10 +63,5 @@
"failed": 0,
"total": 9
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/mpx2rn_original/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/run-1/grading.json
index a01144f8d3..5c4eb535e1 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/run-1/grading.json
@@ -63,10 +63,5 @@
"failed": 4,
"total": 9
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-1-template-adaptation/no_skill/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/run-1/grading.json
index b9e8381e8e..86e18f5d96 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/run-1/grading.json
@@ -63,10 +63,5 @@
"failed": 2,
"total": 9
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/outputs/user-profile.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/outputs/user-profile.mpx
deleted file mode 100644
index 88d5f1be81..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/outputs/user-profile.mpx
+++ /dev/null
@@ -1,214 +0,0 @@
-
-
-
-
-
- {{userInfo.nickName}}
- ID: {{userInfo.userId}}
-
-
-
-
-
- 退出登录
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/grading.json
deleted file mode 100644
index 38c43f5e3e..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/grading.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
- "eval_id": 2,
- "run_kind": "mpx2rn_gene_v2",
- "expectations": [
- {
- "id": "j0",
- "text": "script: all wx.xxx API replaced with mpx.xxx",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "j1",
- "text": "script: onShareTimeline removed or isolated with conditional compile",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "id": "j2",
- "text": "script: onTabItemTap removed or isolated with conditional compile",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "j3",
- "text": "script: setTabBarBadge/removeTabBarBadge isolated with conditional compile",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "j4",
- "text": "script: wx.getUserProfile isolated or replaced",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "j5",
- "text": "script: no e.target.dataset usage",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "j7",
- "text": "json: enablePullDownRefresh handled for RN",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "j8",
- "text": "template: data- attributes removed (inline event params used)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "j9",
- "text": "script: onShareAppMessage preserved (RN supported, should not be removed)",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.8889,
- "passed": 8,
- "failed": 1,
- "total": 9,
- "total_tokens": 28500,
- "tool_calls": 11,
- "duration_ms": 42000,
- "duration_seconds": 42.0
- },
- "metrics": {
- "total_tokens": 28500,
- "tool_calls": 11,
- "duration_ms": 42000,
- "duration_seconds": 42.0
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/metrics.json
deleted file mode 100644
index 4dc788ef48..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_gene_v2/run-1/metrics.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "total_tokens": 28500,
- "tool_calls": 11,
- "duration_ms": 42000
-}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/run-1/grading.json
index f0577e4855..bf49d75b28 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/run-1/grading.json
@@ -63,10 +63,5 @@
"failed": 0,
"total": 9
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/mpx2rn_original/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/run-1/grading.json
index 60eef234a2..db70644175 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/run-1/grading.json
@@ -63,10 +63,5 @@
"failed": 3,
"total": 9
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-2-script-json-adaptation/no_skill/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/run-1/grading.json
index 318fe3b8f3..bc6750f32c 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/run-1/grading.json
@@ -69,10 +69,5 @@
"failed": 0,
"total": 10
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/outputs/carousel-card.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/outputs/carousel-card.mpx
deleted file mode 100644
index e5e6cf818a..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/outputs/carousel-card.mpx
+++ /dev/null
@@ -1,286 +0,0 @@
-
-
-
-
-
-
-
-
- {{item.name}}
- {{item.price}}
-
- NEW
-
-
-
-
-
-
- {{toastMsg}}
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/grading.json
deleted file mode 100644
index 13451d28fd..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/grading.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "eval_id": 3,
- "run_kind": "mpx2rn_gene_v2",
- "expectations": [
- {
- "id": "g0",
- "text": "style: linear-gradient 中 transparent 替换为 rgba 形式",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "g1",
- "text": "style: display:none 替换为其他隐藏方式",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "g2",
- "text": "style: transition-property:all 替换为具体属性名",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "g3",
- "text": "template: 动态 background-image 的 view 添加 enable-background",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "g4",
- "text": "template: 动态 transition 的 view 添加 enable-animation",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "g5",
- "text": "script: 生命周期钩子在 setup 中同步注册",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "g6",
- "text": "script: relativeTo 使用简单选择器(不用复合/后代选择器)",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "g7",
- "text": "json: 条件编译 JSON 使用 script name=\"json\" 格式",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "g8",
- "text": "style: bindtap 元素不设 opacity:0",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "id": "g9",
- "text": "style: @keyframes 在 RN 中不存在",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.9,
- "passed": 9,
- "failed": 1,
- "total": 10,
- "total_tokens": 28500,
- "tool_calls": 12,
- "duration_ms": 95000,
- "duration_seconds": 95.0
- },
- "metrics": {
- "total_tokens": 28500,
- "tool_calls": 12,
- "duration_ms": 95000,
- "duration_seconds": 95.0
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/metrics.json
deleted file mode 100644
index 76f1df0c06..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_gene_v2/run-1/metrics.json
+++ /dev/null
@@ -1 +0,0 @@
-{"total_tokens": 28500, "tool_calls": 12, "duration_ms": 95000}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/run-1/grading.json
index fd0e82c82c..c1b50ca4e9 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/run-1/grading.json
@@ -69,10 +69,5 @@
"failed": 0,
"total": 10
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/mpx2rn_original/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/run-1/grading.json
index 2cefd9dc26..7e11017d58 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/run-1/grading.json
@@ -69,10 +69,5 @@
"failed": 2,
"total": 10
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-3-gradient-animation-interaction/no_skill/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/run-1/grading.json
index e44ee74bf1..a90de03cb9 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/run-1/grading.json
@@ -69,10 +69,5 @@
"failed": 3,
"total": 10
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/outputs/data-panel.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/outputs/data-panel.mpx
deleted file mode 100644
index 9f6d8d58ce..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/outputs/data-panel.mpx
+++ /dev/null
@@ -1,378 +0,0 @@
-
-
-
-
-
-
-
- {{item.value}}
- {{item.label}}
-
-
-
-
-
- Trend Chart
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{item.name}}
- {{item.amount}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/grading.json
deleted file mode 100644
index 239e21fa61..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/grading.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "eval_id": 4,
- "run_kind": "mpx2rn_gene_v2",
- "expectations": [
- {
- "id": "l0",
- "text": "style: 纵向布局显式声明 flex-direction:column",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "l1",
- "text": "style: position:sticky 替换为 sticky-header 方案",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "l2",
- "text": "style: 保留 /*use rpx*/ /*use px*/ 单位转换注释",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "l3",
- "text": "style: background-image 不应用于 text 元素类",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "l4",
- "text": "template: 内联 style 中不使用多值 margin/padding 简写",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "l5",
- "text": "template: scroll-into-view 目标添加 wx:ref",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "id": "l6",
- "text": "template: createSelectorQuery 目标添加空 wx:ref",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "l7",
- "text": "script: 选择器 API 仅使用简单选择器",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "l8",
- "text": "script: 非触摸事件不使用 catch 前缀",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "l9",
- "text": "style: radial-gradient 条件编译或替换",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.9,
- "passed": 9,
- "failed": 1,
- "total": 10,
- "total_tokens": 18500,
- "tool_calls": 12,
- "duration_ms": 45000,
- "duration_seconds": 45.0
- },
- "metrics": {
- "total_tokens": 18500,
- "tool_calls": 12,
- "duration_ms": 45000,
- "duration_seconds": 45.0
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/metrics.json
deleted file mode 100644
index cbcc8f3dae..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_gene_v2/run-1/metrics.json
+++ /dev/null
@@ -1 +0,0 @@
-{"total_tokens": 18500, "tool_calls": 12, "duration_ms": 45000}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/run-1/grading.json
index a9aca3b346..4904244125 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/run-1/grading.json
@@ -69,10 +69,5 @@
"failed": 1,
"total": 10
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/mpx2rn_original/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/run-1/grading.json
index dad2263ff1..13cfd66f67 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/run-1/grading.json
@@ -69,10 +69,5 @@
"failed": 4,
"total": 10
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-4-text-layout-selector/no_skill/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/run-1/grading.json
index 2a343b5408..61d6d7a8f5 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/run-1/grading.json
@@ -75,10 +75,5 @@
"failed": 3,
"total": 11
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/outputs/payment-page.mpx b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/outputs/payment-page.mpx
deleted file mode 100644
index 4001cb77eb..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/outputs/payment-page.mpx
+++ /dev/null
@@ -1,325 +0,0 @@
-
-
-
-
-
-
-
- Payment Method
-
- {{selectedMethod.name}}
-
-
-
-
- Coupon
-
- -{{coupon.discount}}
-
- None
-
-
-
-
-
-
- Secured by encryption
-
-
-
-
-
-
- Pay Now
-
- By paying, you agree to our Terms of Service
-
-
-
-
-
-
-
-
-
-
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/grading.json
deleted file mode 100644
index 5b7b38f592..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/grading.json
+++ /dev/null
@@ -1,88 +0,0 @@
-{
- "eval_id": 5,
- "run_kind": "mpx2rn_gene_v2",
- "expectations": [
- {
- "id": "c0",
- "text": "style: @mpx-if 包裹完整规则不产生空选择器",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "c1",
- "text": "style: font-family 使用单一字体名",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "id": "c2",
- "text": "style: border-style 统一设置不使用单边",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "id": "c3",
- "text": "template: 内联 style 不使用 border 简写",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "c4",
- "text": "template: selectComponent 目标自定义组件添加 wx:ref",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "c5",
- "text": "template: 动态 CSS 变量元素设置 enable-var",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "c6",
- "text": "script: props 通过 toRefs 解构保持响应式",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "c7",
- "text": "style: background-repeat 仅使用 no-repeat",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "id": "c8",
- "text": "json: JSON 条件编译使用 if(__mpx_mode__) 不使用注释语法",
- "passed": true,
- "evidence": "PASS"
- },
- {
- "id": "c9",
- "text": "style: text-decoration-style/color 条件编译处理",
- "passed": false,
- "evidence": "FAIL"
- },
- {
- "id": "c10",
- "text": "script: onLoad 使用 decodedQuery 第二个参数",
- "passed": true,
- "evidence": "PASS"
- }
- ],
- "summary": {
- "pass_rate": 0.6364,
- "passed": 7,
- "failed": 4,
- "total": 11,
- "total_tokens": 18420,
- "tool_calls": 12,
- "duration_ms": 42800,
- "duration_seconds": 42.8
- },
- "metrics": {
- "total_tokens": 18420,
- "tool_calls": 12,
- "duration_ms": 42800,
- "duration_seconds": 42.8
- }
-}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/metrics.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/metrics.json
deleted file mode 100644
index da1fc20a60..0000000000
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_gene_v2/run-1/metrics.json
+++ /dev/null
@@ -1 +0,0 @@
-{"total_tokens": 18420, "tool_calls": 12, "duration_ms": 42800}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/run-1/grading.json
index 647faee0c8..8d6293ab46 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/run-1/grading.json
@@ -75,10 +75,5 @@
"failed": 1,
"total": 11
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/mpx2rn_original/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/run-1/grading.json b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/run-1/grading.json
index b9abad469e..240ae9033e 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/run-1/grading.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/run-1/grading.json
@@ -75,10 +75,5 @@
"failed": 7,
"total": 11
},
- "metrics": {
- "valid": false,
- "errors": [
- "missing metrics file: /Users/didi/work/mpx2/.agents/skills/mpx2rn-workspace/iteration-8/eval-5-conditional-compile-advanced/no_skill/run-1/metrics.json"
- ]
- }
+ "metrics": null
}
\ No newline at end of file
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/evals.json b/.agents/skills/mpx2rn-workspace/iteration-8/evals.json
index d11d3e4de4..7af87dec60 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/evals.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/evals.json
@@ -6,7 +6,7 @@
"prompt_templates": "prompt_templates.json",
"run_script": "run_evals.py",
"grade_script": "grade.py",
- "usage": "1) python3 run_evals.py [--evals 0 1] [--groups no_skill] [--model opus] 生成 agent dispatch JSON,每个 dispatch 包含 output_path 与 metrics_path; 2) 将输出的每个 dispatch 作为 Agent 工具调用并行执行,子 agent 需写入 output_path 与 metrics_path; 3) 执行完成后由主 agent 运行 python3 grade.py 评分,grading.json 会包含 summary 与 metrics,缺少 metrics 时 grade.py 非零退出"
+ "usage": "1) python3 run_evals.py [--evals 0 1] [--groups no_skill] [--model opus] 生成 agent dispatch JSON,每个 dispatch 包含 output_path 与 metrics_path; 2) 将输出的每个 dispatch 作为 Agent 工具调用(run_in_background)并行执行,子 agent 仅需写入 output_path; 3) 每个 agent 完成后,主 agent 从 task-notification 的 标签提取真实指标(total_tokens/tool_uses/duration_ms)写入对应 metrics_path; 4) 全部完成后运行 python3 grade.py 评分,grading.json 包含 summary 与 metrics"
},
"comparison": {
"groups": [
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/grade.py b/.agents/skills/mpx2rn-workspace/iteration-8/grade.py
index 06f6b6020e..5f118cb449 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/grade.py
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/grade.py
@@ -681,7 +681,7 @@ def check_eval_5(output_path):
4: "data-panel.mpx",
5: "payment-page.mpx",
}
-RUN_KINDS = ("no_skill", "mpx2rn_original", "mpx2rn_gene", "mpx2rn_gene_v2")
+RUN_KINDS = ("no_skill", "mpx2rn_original", "mpx2rn_gene")
def _first_present(data, keys):
@@ -695,9 +695,10 @@ def _is_number(value):
def load_metrics(run_dir):
+ """Load metrics.json written by the main agent from task-notification data."""
metrics_path = run_dir / "metrics.json"
if not metrics_path.exists():
- return None, [f"missing metrics file: {metrics_path}"]
+ return None, []
try:
data = json.loads(metrics_path.read_text())
except json.JSONDecodeError as e:
@@ -707,7 +708,7 @@ def load_metrics(run_dir):
errors = []
total_tokens = _first_present(data, ("total_tokens", "tokens"))
- tool_calls = _first_present(data, ("tool_calls", "tool_call_count"))
+ tool_calls = _first_present(data, ("tool_calls", "tool_call_count", "tool_uses"))
duration_ms = _first_present(data, ("duration_ms", "elapsed_ms"))
if duration_ms is None:
duration_seconds = _first_present(
@@ -743,7 +744,7 @@ def grade_run(eval_id, run_kind):
run_dir.mkdir(parents=True, exist_ok=True)
metrics, metric_errors = load_metrics(run_dir)
if metric_errors:
- print(f"metrics error for {EVAL_DIRS[eval_id]} / {run_kind}: "
+ print(f"metrics warning for {EVAL_DIRS[eval_id]} / {run_kind}: "
+ "; ".join(metric_errors), file=sys.stderr)
results = CHECKERS[eval_id](out_path)
enriched = [{"id": r.get("id", ""), "text": r["text"], "passed": bool(r["passed"]),
@@ -757,7 +758,7 @@ def grade_run(eval_id, run_kind):
grading = {
"eval_id": eval_id, "run_kind": run_kind, "expectations": enriched,
"summary": summary,
- "metrics": metrics or {"valid": False, "errors": metric_errors},
+ "metrics": metrics,
}
(run_dir / "grading.json").write_text(json.dumps(grading, ensure_ascii=False, indent=2))
return grading
@@ -765,22 +766,18 @@ def grade_run(eval_id, run_kind):
def main():
summary = []
- has_metric_errors = False
for eid in sorted(EVAL_DIRS.keys()):
for kind in RUN_KINDS:
g = grade_run(eid, kind)
if g:
s = g["summary"]
- metrics = g["metrics"]
- has_metric_errors = has_metric_errors or metrics.get("valid") is False
+ metrics = g.get("metrics") or {}
summary.append({"eval": EVAL_DIRS[eid], "kind": kind,
"score": f"{s['passed']}/{s['total']}",
"total_tokens": metrics.get("total_tokens"),
"tool_calls": metrics.get("tool_calls"),
"duration_ms": metrics.get("duration_ms")})
print(json.dumps(summary, ensure_ascii=False, indent=2))
- if has_metric_errors:
- sys.exit(1)
if __name__ == "__main__":
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/prompt_templates.json b/.agents/skills/mpx2rn-workspace/iteration-8/prompt_templates.json
index e9be156cc4..126f913fde 100644
--- a/.agents/skills/mpx2rn-workspace/iteration-8/prompt_templates.json
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/prompt_templates.json
@@ -10,7 +10,7 @@
"GENE_GENES_PATH": ".agents/skills/mpx2rn-gene/genes/ 的绝对路径",
"GENE_REFS_PATH": ".agents/skills/mpx2rn-gene/references/ 的绝对路径",
"MODEL": "子 agent 使用的模型 (opus/sonnet/haiku)",
- "METRICS_PATH": "本次 run 的指标文件路径。子 agent 需将 token 消耗、工具调用次数和耗时数据写入该路径"
+ "METRICS_PATH": "本次 run 的指标文件路径。由主 agent 从 task-notification 的 中提取真实数据后写入"
},
"agent_config": {
"model": "{{MODEL}}",
@@ -19,19 +19,15 @@
"templates": {
"no_skill": {
"label": "不使用 skill (baseline)",
- "prompt": "你是一个 Mpx 跨端开发专家。请完成以下任务:\n\n**任务**:{{TASK_PROMPT}}\n\n**输入文件**:读取 {{INPUT_PATH}}\n\n**注意**:不使用任何额外的 skill 参考文档,仅凭你自身对 Mpx 和 React Native 的理解完成适配改造。\n\n**输出**:将完整的修改后 .mpx 文件写入 {{OUTPUT_PATH}}\n\n**运行指标**:将本次 run 的度量数据写入 {{METRICS_PATH}},JSON 格式为 {\"total_tokens\": number, \"tool_calls\": number, \"duration_ms\": number}。"
+ "prompt": "你是一个 Mpx 跨端开发专家。请完成以下任务:\n\n**任务**:{{TASK_PROMPT}}\n\n**输入文件**:读取 {{INPUT_PATH}}\n\n**注意**:不使用任何额外的 skill 参考文档,仅凭你自身对 Mpx 和 React Native 的理解完成适配改造。\n\n**输出**:将完整的修改后 .mpx 文件写入 {{OUTPUT_PATH}}"
},
"mpx2rn_original": {
"label": "使用 mpx2rn 原版 skill",
- "prompt": "你是一个 Mpx 跨端开发专家。请完成以下任务:\n\n**任务**:{{TASK_PROMPT}}\n\n**输入文件**:读取 {{INPUT_PATH}}\n\n**Skill 参考**:你必须严格按照 skill 文档进行改造。首先读取 {{ORIGINAL_SKILL_PATH}},这是 Mpx 跨端输出 RN 的完整开发适配指南。按照 SKILL.md 中的任务流程和知识库索引,在需要时读取 references/ 目录下的相关参考文档(位于 {{ORIGINAL_REFS_PATH}} 目录)。严格遵循 SKILL.md 中描述的通用约束与适配原则。\n\n**输出**:将完整的修改后 .mpx 文件写入 {{OUTPUT_PATH}}\n\n**运行指标**:将本次 run 的度量数据写入 {{METRICS_PATH}},JSON 格式为 {\"total_tokens\": number, \"tool_calls\": number, \"duration_ms\": number}。"
+ "prompt": "你是一个 Mpx 跨端开发专家。请完成以下任务:\n\n**任务**:{{TASK_PROMPT}}\n\n**输入文件**:读取 {{INPUT_PATH}}\n\n**Skill 参考**:你必须严格按照 skill 文档进行改造。首先读取 {{ORIGINAL_SKILL_PATH}},这是 Mpx 跨端输出 RN 的完整开发适配指南。按照 SKILL.md 中的任务流程和知识库索引,在需要时读取 references/ 目录下的相关参考文档(位于 {{ORIGINAL_REFS_PATH}} 目录)。严格遵循 SKILL.md 中描述的通用约束与适配原则。\n\n**输出**:将完整的修改后 .mpx 文件写入 {{OUTPUT_PATH}}"
},
"mpx2rn_gene": {
"label": "使用 mpx2rn gene 版 skill",
- "prompt": "你是一个 Mpx 跨端开发专家。请完成以下任务:\n\n**任务**:{{TASK_PROMPT}}\n\n**输入文件**:读取 {{INPUT_PATH}}\n\n**Skill 参考**:你必须严格按照 gene skill 文档进行改造。首先读取 {{GENE_SKILL_PATH}},这是 Mpx2RN Strategy Gene Skill。按照 SKILL.md 中的调度规则和 Gene 注册表,读取 {{GENE_GENES_PATH}} 目录下的相关 gene 文件。当 gene 指令不足时,查阅 {{GENE_REFS_PATH}} 目录下的详细参考文档。\n\n**输出**:将完整的修改后 .mpx 文件写入 {{OUTPUT_PATH}}\n\n**运行指标**:将本次 run 的度量数据写入 {{METRICS_PATH}},JSON 格式为 {\"total_tokens\": number, \"tool_calls\": number, \"duration_ms\": number}。"
- },
- "mpx2rn_gene_v2": {
- "label": "使用演化后 mpx2rn gene v2 版 skill",
- "prompt": "你是一个 Mpx 跨端开发专家。请完成以下任务:\n\n**任务**:{{TASK_PROMPT}}\n\n**输入文件**:读取 {{INPUT_PATH}}\n\n**Skill 参考**:你必须严格按照 gene skill 文档进行改造。首先读取 {{GENE_SKILL_PATH}},这是 Mpx2RN Strategy Gene Skill。按照 SKILL.md 中的调度规则和 Gene 注册表,读取 {{GENE_GENES_PATH}} 目录下的相关 gene 文件。当 gene 指令不足时,查阅 {{GENE_REFS_PATH}} 目录下的详细参考文档。\n\n**输出**:将完整的修改后 .mpx 文件写入 {{OUTPUT_PATH}}\n\n**运行指标**:将本次 run 的度量数据写入 {{METRICS_PATH}},JSON 格式为 {\"total_tokens\": number, \"tool_calls\": number, \"duration_ms\": number}。"
+ "prompt": "你是一个 Mpx 跨端开发专家。请完成以下任务:\n\n**任务**:{{TASK_PROMPT}}\n\n**输入文件**:读取 {{INPUT_PATH}}\n\n**Skill 参考**:你必须严格按照 gene skill 文档进行改造。首先读取 {{GENE_SKILL_PATH}},这是 Mpx2RN Strategy Gene Skill。按照 SKILL.md 中的调度规则和 Gene 注册表,读取 {{GENE_GENES_PATH}} 目录下的相关 gene 文件。当 gene 指令不足时,查阅 {{GENE_REFS_PATH}} 目录下的详细参考文档。\n\n**输出**:将完整的修改后 .mpx 文件写入 {{OUTPUT_PATH}}"
}
}
}
diff --git a/.agents/skills/mpx2rn-workspace/iteration-8/run_evals.py b/.agents/skills/mpx2rn-workspace/iteration-8/run_evals.py
index ebdab120de..d7cd72e1b8 100755
--- a/.agents/skills/mpx2rn-workspace/iteration-8/run_evals.py
+++ b/.agents/skills/mpx2rn-workspace/iteration-8/run_evals.py
@@ -19,7 +19,8 @@
{ "description", "model", "prompt", "output_path", "metrics_path" }
Copy the output to Claude Code to dispatch agents.
-Each agent must write metrics_path before it finishes. Required schema:
+Metrics are collected from task-notification by the main agent after each
+sub-agent completes, then written to metrics_path. Required schema:
{
"total_tokens": 84852,
"tool_calls": 12,
From 6b4ba8301ae9134d706268248a67e610a720dddd Mon Sep 17 00:00:00 2001
From: hiyuki <674883329@qq.com>
Date: Wed, 20 May 2026 11:18:49 +0800
Subject: [PATCH 10/10] update skills
---
.agents/skills/changelog-generator/SKILL.md | 8 ++++++++
AGENTS.md | 3 +--
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/.agents/skills/changelog-generator/SKILL.md b/.agents/skills/changelog-generator/SKILL.md
index 35aff4b765..ff1db21ddc 100644
--- a/.agents/skills/changelog-generator/SKILL.md
+++ b/.agents/skills/changelog-generator/SKILL.md
@@ -19,6 +19,14 @@ description: 通过查看当前最新版本与上一版本间的git提交记录
生成内容写入到 CHANGELOG.md 文件中。
+## 文档与 Skill 同步约束
+
+生成变更日志后,检查版本变更内容是否涉及**用户开发使用方式**(对外暴露的 API、配置项、模板/样式/脚本/JSON 能力、CLI 参数、生命周期、内建组件、环境 API、跨端行为差异等),如涉及则必须同步更新对应的文档与 Skill:
+
+- **文档**:更新 [docs-vitepress/](docs-vitepress/) 下对应位置的 `.md`,并按 [docs-vitepress/AGENTS.md](docs-vitepress/AGENTS.md) 的归档原则与索引要求同步侧边栏、导航及目录索引。
+- **Skill**:当变更涉及**跨端输出 RN 的能力**(模板/脚本/样式/JSON 配置维度、基础组件、环境 API 在 RN 平台的支持情况、Mpx2RN 编译行为等)时,必须同步更新 [.agents/skills/mpx2rn/](.agents/skills/mpx2rn/) 下的相关知识库。
+- 仅修改内部实现、重构、测试、构建脚本而不改变对外使用方式的变更项,无需更新文档或 Skill。
+
## 内容示例
```markdown
diff --git a/AGENTS.md b/AGENTS.md
index 5894cdb66b..7e9a092643 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -20,7 +20,6 @@
- 代码风格尽可能模仿当前仓库中现有的写法,例如:
- 遍历数组用.forEach而不是for()
-
## 强制约束
### 编码约束
@@ -38,7 +37,7 @@
代码变更涉及**用户开发使用方式**(对外暴露的 API、配置项、模板/样式/脚本/JSON 能力、CLI 参数、生命周期、内建组件、环境 API、跨端行为差异等)时,必须在同一次改动中同步更新文档与相关 Skill:
- **文档**:更新 [docs-vitepress/](docs-vitepress/) 下对应位置的 `.md`,并按 [docs-vitepress/AGENTS.md](docs-vitepress/AGENTS.md) 的归档原则与索引要求同步侧边栏、导航及目录索引。
-- **Skill**:当变更涉及**跨端输出 RN 的能力**(模板/脚本/样式/JSON 配置维度、基础组件、环境 API 在 RN 平台的支持情况、Mpx2RN 编译行为等)时,必须同步更新 [.agents/skills/mpx2rn/](.agents/skills/mpx2rn/) 下的相关知识库(`references/` 中的 RN 模板/脚本/样式/API 参考与最佳实践等),同时参照 [.agents/skills/skill2gene/](.agents/skills/skill2gene/) 中的 Gene 规范同步更新 [.agents/skills/mpx2rn-gene/](.agents/skills/mpx2rn-gene/) 中的相关 Gene 内容。
+- **Skill**:当变更涉及**跨端输出 RN 的能力**(模板/脚本/样式/JSON 配置维度、基础组件、环境 API 在 RN 平台的支持情况、Mpx2RN 编译行为等)时,必须同步更新 [.agents/skills/mpx2rn/](.agents/skills/mpx2rn/) 下的相关知识库(`references/` 中的 RN 模板/脚本/样式/API 参考与最佳实践等)。
- 仅修改内部实现、重构、测试、构建脚本而不改变对外使用方式时,无需更新文档或 Skill。
## 路径指引