@creatoria/miniapp-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +469 -0
  2. package/dist/cli.d.ts +6 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +144 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config/defaults.d.ts +73 -0
  7. package/dist/config/defaults.d.ts.map +1 -0
  8. package/dist/config/defaults.js +118 -0
  9. package/dist/config/defaults.js.map +1 -0
  10. package/dist/config/loader.d.ts +50 -0
  11. package/dist/config/loader.d.ts.map +1 -0
  12. package/dist/config/loader.js +189 -0
  13. package/dist/config/loader.js.map +1 -0
  14. package/dist/core/element-ref.d.ts +44 -0
  15. package/dist/core/element-ref.d.ts.map +1 -0
  16. package/dist/core/element-ref.js +213 -0
  17. package/dist/core/element-ref.js.map +1 -0
  18. package/dist/core/logger.d.ts +55 -0
  19. package/dist/core/logger.d.ts.map +1 -0
  20. package/dist/core/logger.js +378 -0
  21. package/dist/core/logger.js.map +1 -0
  22. package/dist/core/output.d.ts +21 -0
  23. package/dist/core/output.d.ts.map +1 -0
  24. package/dist/core/output.js +56 -0
  25. package/dist/core/output.js.map +1 -0
  26. package/dist/core/report-generator.d.ts +24 -0
  27. package/dist/core/report-generator.d.ts.map +1 -0
  28. package/dist/core/report-generator.js +212 -0
  29. package/dist/core/report-generator.js.map +1 -0
  30. package/dist/core/session.d.ts +83 -0
  31. package/dist/core/session.d.ts.map +1 -0
  32. package/dist/core/session.js +306 -0
  33. package/dist/core/session.js.map +1 -0
  34. package/dist/core/timeout.d.ts +49 -0
  35. package/dist/core/timeout.d.ts.map +1 -0
  36. package/dist/core/timeout.js +67 -0
  37. package/dist/core/timeout.js.map +1 -0
  38. package/dist/core/tool-logger.d.ts +83 -0
  39. package/dist/core/tool-logger.d.ts.map +1 -0
  40. package/dist/core/tool-logger.js +453 -0
  41. package/dist/core/tool-logger.js.map +1 -0
  42. package/dist/core/validation.d.ts +39 -0
  43. package/dist/core/validation.d.ts.map +1 -0
  44. package/dist/core/validation.js +93 -0
  45. package/dist/core/validation.js.map +1 -0
  46. package/dist/index.d.ts +7 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +6 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/server.d.ts +7 -0
  51. package/dist/server.d.ts.map +1 -0
  52. package/dist/server.js +85 -0
  53. package/dist/server.js.map +1 -0
  54. package/dist/tools/assert.d.ts +108 -0
  55. package/dist/tools/assert.d.ts.map +1 -0
  56. package/dist/tools/assert.js +291 -0
  57. package/dist/tools/assert.js.map +1 -0
  58. package/dist/tools/automator.d.ts +45 -0
  59. package/dist/tools/automator.d.ts.map +1 -0
  60. package/dist/tools/automator.js +186 -0
  61. package/dist/tools/automator.js.map +1 -0
  62. package/dist/tools/element.d.ts +253 -0
  63. package/dist/tools/element.d.ts.map +1 -0
  64. package/dist/tools/element.js +615 -0
  65. package/dist/tools/element.js.map +1 -0
  66. package/dist/tools/index.d.ts +97 -0
  67. package/dist/tools/index.d.ts.map +1 -0
  68. package/dist/tools/index.js +1565 -0
  69. package/dist/tools/index.js.map +1 -0
  70. package/dist/tools/miniprogram.d.ts +79 -0
  71. package/dist/tools/miniprogram.d.ts.map +1 -0
  72. package/dist/tools/miniprogram.js +245 -0
  73. package/dist/tools/miniprogram.js.map +1 -0
  74. package/dist/tools/network.d.ts +65 -0
  75. package/dist/tools/network.d.ts.map +1 -0
  76. package/dist/tools/network.js +205 -0
  77. package/dist/tools/network.js.map +1 -0
  78. package/dist/tools/page.d.ts +108 -0
  79. package/dist/tools/page.d.ts.map +1 -0
  80. package/dist/tools/page.js +307 -0
  81. package/dist/tools/page.js.map +1 -0
  82. package/dist/tools/record.d.ts +86 -0
  83. package/dist/tools/record.d.ts.map +1 -0
  84. package/dist/tools/record.js +316 -0
  85. package/dist/tools/record.js.map +1 -0
  86. package/dist/tools/snapshot.d.ts +82 -0
  87. package/dist/tools/snapshot.d.ts.map +1 -0
  88. package/dist/tools/snapshot.js +258 -0
  89. package/dist/tools/snapshot.js.map +1 -0
  90. package/dist/types.d.ts +240 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +5 -0
  93. package/dist/types.js.map +1 -0
  94. package/docs/SIMPLE_USAGE.md +210 -0
  95. package/docs/api/README.md +244 -0
  96. package/docs/api/assert.md +1015 -0
  97. package/docs/api/automator.md +345 -0
  98. package/docs/api/element.md +1454 -0
  99. package/docs/api/miniprogram.md +558 -0
  100. package/docs/api/network.md +883 -0
  101. package/docs/api/page.md +909 -0
  102. package/docs/api/record.md +963 -0
  103. package/docs/api/snapshot.md +792 -0
  104. package/docs/architecture.E-Docs.md +1359 -0
  105. package/docs/architecture.F1.md +720 -0
  106. package/docs/architecture.F2.md +871 -0
  107. package/docs/architecture.F3.md +905 -0
  108. package/docs/architecture.md +90 -0
  109. package/docs/charter.A1.align.yaml +170 -0
  110. package/docs/charter.A2.align.yaml +199 -0
  111. package/docs/charter.A3.align.yaml +242 -0
  112. package/docs/charter.A4.align.yaml +227 -0
  113. package/docs/charter.B1.align.yaml +179 -0
  114. package/docs/charter.B2.align.yaml +200 -0
  115. package/docs/charter.B3.align.yaml +200 -0
  116. package/docs/charter.B4.align.yaml +188 -0
  117. package/docs/charter.C1.align.yaml +190 -0
  118. package/docs/charter.C2.align.yaml +202 -0
  119. package/docs/charter.C3.align.yaml +211 -0
  120. package/docs/charter.C4.align.yaml +263 -0
  121. package/docs/charter.C5.align.yaml +220 -0
  122. package/docs/charter.D1.align.yaml +190 -0
  123. package/docs/charter.D2.align.yaml +234 -0
  124. package/docs/charter.D3.align.yaml +206 -0
  125. package/docs/charter.E-Docs.align.yaml +294 -0
  126. package/docs/charter.F1.align.yaml +193 -0
  127. package/docs/charter.F2.align.yaml +248 -0
  128. package/docs/charter.F3.align.yaml +287 -0
  129. package/docs/charter.G.align.yaml +174 -0
  130. package/docs/charter.align.yaml +111 -0
  131. package/docs/examples/session-report-usage.md +449 -0
  132. package/docs/maintenance.md +682 -0
  133. package/docs/playwright-mcp/350/260/203/347/240/224.md +53 -0
  134. package/docs/setup-guide.md +775 -0
  135. package/docs/tasks.A1.atomize.md +296 -0
  136. package/docs/tasks.A2.atomize.md +408 -0
  137. package/docs/tasks.A3.atomize.md +564 -0
  138. package/docs/tasks.A4.atomize.md +496 -0
  139. package/docs/tasks.B1.atomize.md +352 -0
  140. package/docs/tasks.B2.atomize.md +561 -0
  141. package/docs/tasks.B3.atomize.md +508 -0
  142. package/docs/tasks.B4.atomize.md +504 -0
  143. package/docs/tasks.C1.atomize.md +540 -0
  144. package/docs/tasks.C2.atomize.md +665 -0
  145. package/docs/tasks.C3.atomize.md +745 -0
  146. package/docs/tasks.C4.atomize.md +908 -0
  147. package/docs/tasks.C5.atomize.md +755 -0
  148. package/docs/tasks.D1.atomize.md +547 -0
  149. package/docs/tasks.D2.atomize.md +619 -0
  150. package/docs/tasks.D3.atomize.md +790 -0
  151. package/docs/tasks.E-Docs.atomize.md +1204 -0
  152. package/docs/tasks.atomize.md +189 -0
  153. package/docs/troubleshooting.md +855 -0
  154. package/docs//345/256/214/346/225/264/345/256/236/347/216/260/346/226/271/346/241/210.md +155 -0
  155. package/docs//345/274/200/345/217/221/344/273/273/345/212/241/350/256/241/345/210/222.md +110 -0
  156. package/docs//345/276/256/344/277/241/345/260/217/347/250/213/345/272/217/350/207/252/345/212/250/345/214/226API/345/256/214/346/225/264/346/226/207/346/241/243.md +894 -0
  157. package/docs//345/276/256/344/277/241/345/260/217/347/250/213/345/272/217/350/207/252/345/212/250/345/214/226/345/256/214/346/225/264/346/223/215/344/275/234/346/211/213/345/206/214.md +1885 -0
  158. package/docs//346/216/245/345/217/243/346/226/271/346/241/210.md +565 -0
  159. package/docs//347/254/254/344/270/200/347/211/210/346/234/254/346/226/271/346/241/210.md +380 -0
  160. package/package.json +87 -0
@@ -0,0 +1,202 @@
1
+ # Charter: [C2] MiniProgram 工具
2
+
3
+ task_id: C2
4
+ task_name: MiniProgram 工具实现
5
+ stage: C
6
+ phase: Align (Retrospective)
7
+ created_at: "2025-10-02"
8
+ status: COMPLETED
9
+ estimated_hours: 3-4
10
+ actual_hours: 4
11
+
12
+ ## Goal (目标)
13
+
14
+ 实现 MiniProgram 级别的 6 个 MCP 工具,封装小程序导航、WX API 调用、代码执行、截图和系统信息获取功能。
15
+
16
+ **核心交付物**:
17
+ - `src/tools/miniprogram.ts` - 6 个工具实现 (330 lines)
18
+ - `tests/unit/miniprogram.test.ts` - 单元测试 (403 lines, 25 tests)
19
+ - 工具: navigate, callWx, evaluate, screenshot, getPageStack, getSystemInfo
20
+
21
+ ## Non-Goals (非目标)
22
+
23
+ - ❌ 不实现 Page 级别工具(留给 C3)
24
+ - ❌ 不实现元素查询(属于 Page 工具)
25
+ - ❌ 不实现页面数据操作(属于 Page 工具)
26
+ - ❌ 不实现复杂的导航历史管理
27
+
28
+ ## Scope (范围)
29
+
30
+ ### In Scope (包含)
31
+
32
+ 1. **navigate 工具**
33
+ - ✅ 支持 5 种导航方法:navigateTo, redirectTo, navigateBack, switchTab, reLaunch
34
+ - ✅ 支持路径参数(url, query)
35
+ - ✅ 支持返回层级(delta)
36
+ - ✅ 等待页面加载完成
37
+
38
+ 2. **callWx 工具**
39
+ - ✅ 调用微信小程序 API (wx.*)
40
+ - ✅ 支持任意参数传递
41
+ - ✅ 返回 API 执行结果
42
+ - ✅ 错误处理和日志记录
43
+
44
+ 3. **evaluate 工具**
45
+ - ✅ 在小程序环境中执行 JavaScript 代码
46
+ - ✅ 支持异步代码执行
47
+ - ✅ 返回执行结果
48
+ - ✅ 错误捕获和堆栈跟踪
49
+
50
+ 4. **screenshot 工具**
51
+ - ✅ 截取当前页面截图
52
+ - ✅ 保存到指定路径
53
+ - ✅ 返回文件路径和元数据
54
+ - ✅ 支持自动生成文件名
55
+
56
+ 5. **getPageStack 工具**
57
+ - ✅ 获取当前页面栈信息
58
+ - ✅ 返回所有页面路径
59
+ - ✅ 标识当前活动页面
60
+
61
+ 6. **getSystemInfo 工具**
62
+ - ✅ 获取设备系统信息
63
+ - ✅ 返回平台、版本、屏幕等信息
64
+ - ✅ 兼容微信 API 格式
65
+
66
+ ### Out of Scope (不包含)
67
+
68
+ - ❌ 元素查询和操作(C3/C4)
69
+ - ❌ 页面数据读写(C3)
70
+ - ❌ 断言和验证(Stage D)
71
+ - ❌ 网络 Mock(Stage F)
72
+
73
+ ## Constraints (约束)
74
+
75
+ ### Technical Constraints (技术约束)
76
+
77
+ 1. **miniprogram-automator 依赖**
78
+ - 使用 MiniProgram 实例的官方 API
79
+ - 遵循异步操作规范
80
+ - 正确处理页面加载时序
81
+
82
+ 2. **导航约束**
83
+ - navigateTo: 最多 10 层
84
+ - switchTab: 仅限 tabBar 页面
85
+ - reLaunch: 关闭所有页面
86
+ - navigateBack: 不能超过当前层级
87
+
88
+ 3. **截图约束**
89
+ - 格式: PNG
90
+ - 默认保存路径: outputDir/screenshots/
91
+ - 文件名格式: screenshot-{timestamp}.png
92
+
93
+ 4. **evaluate 约束**
94
+ - 执行环境: 小程序渲染层
95
+ - 超时时间: 30 秒
96
+ - 不支持 Node.js API
97
+
98
+ ### Business Constraints (业务约束)
99
+
100
+ 1. **导航时间**: <2 秒
101
+ 2. **API 调用时间**: <5 秒
102
+ 3. **截图时间**: <3 秒
103
+ 4. **evaluate 超时**: 30 秒
104
+
105
+ ## Success Criteria (成功标准)
106
+
107
+ ### Functional Criteria (功能标准)
108
+
109
+ - ✅ navigate 支持 5 种导航方法
110
+ - ✅ callWx 成功调用微信 API
111
+ - ✅ evaluate 执行 JS 代码并返回结果
112
+ - ✅ screenshot 生成正确的截图文件
113
+ - ✅ getPageStack 返回完整页面栈
114
+ - ✅ getSystemInfo 返回系统信息
115
+
116
+ ### Quality Criteria (质量标准)
117
+
118
+ - ✅ TypeScript 编译 0 错误
119
+ - ✅ 单元测试覆盖率 >80%
120
+ - ✅ 25 个测试用例全部通过
121
+ - ✅ 无 ESLint 错误
122
+ - ✅ JSDoc 注释完整
123
+
124
+ ### Documentation Criteria (文档标准)
125
+
126
+ - ✅ 每个工具有 zod schema 定义
127
+ - ✅ 导航方法枚举清晰
128
+ - ✅ 工具描述包含示例
129
+ - ⏳ charter.C2.align.yaml (本文档)
130
+ - ⏳ tasks.C2.atomize.md (任务卡)
131
+
132
+ ## Definition of Done (完成标准)
133
+
134
+ **代码**:
135
+ - ✅ `src/tools/miniprogram.ts` 实现完成 (330 lines)
136
+ - ✅ TypeScript 编译通过
137
+ - ✅ 6 个工具正确注册
138
+
139
+ **测试**:
140
+ - ✅ `tests/unit/miniprogram.test.ts` (403 lines)
141
+ - ✅ 25 个测试用例全部通过
142
+ - ✅ 覆盖所有导航方法
143
+ - ✅ Mock MiniProgram 实例
144
+
145
+ **文档**:
146
+ - ⏳ charter.C2.align.yaml (追溯)
147
+ - ⏳ tasks.C2.atomize.md (追溯)
148
+ - ✅ README 工具列表更新
149
+
150
+ **Git**:
151
+ - ✅ 已提交(Stage C 提交)
152
+
153
+ ## Dependencies (依赖)
154
+
155
+ **前置任务**:
156
+ - ✅ C1: Automator 工具(获取 MiniProgram 实例)
157
+ - ✅ B2: SessionStore(管理 MiniProgram 实例)
158
+
159
+ **后续任务**:
160
+ - C2 → C3 (Page 工具需要导航到页面)
161
+ - C2 → C5 (工具注册器集成)
162
+
163
+ ## Risks (风险)
164
+
165
+ ### Technical Risks (技术风险)
166
+
167
+ 1. **导航时序问题** - 🟡 中风险
168
+ - 影响:页面未加载完成就执行操作
169
+ - 缓解:使用 waitFor 等待页面稳定
170
+
171
+ 2. **callWx 参数序列化** - 🟢 已缓解
172
+ - 风险:复杂对象无法传递
173
+ - 缓解:使用 JSON 序列化
174
+
175
+ 3. **evaluate 安全性** - 🟡 中风险
176
+ - 影响:执行任意代码可能导致安全问题
177
+ - 缓解:仅在测试环境使用
178
+
179
+ ### Business Risks (业务风险)
180
+
181
+ 1. **截图文件管理** - 🟢 已缓解
182
+ - 影响:大量截图占用磁盘空间
183
+ - 缓解:用户自行清理 outputDir
184
+
185
+ ## Open Questions (未决问题)
186
+
187
+ - ❓ 是否需要支持导航历史回退?(当前仅 navigateBack)
188
+ - ❓ 是否需要限制 evaluate 可执行的代码?(当前无限制)
189
+ - ❓ 截图是否需要支持压缩和格式转换?(当前仅 PNG)
190
+
191
+ ## References (参考资料)
192
+
193
+ - `docs/微信小程序自动化完整操作手册.md` - MiniProgram API 文档
194
+ - `docs/完整实现方案.md` - 工具分层设计
195
+ - `miniprogram-automator` 官方文档
196
+ - 微信小程序 API 文档
197
+
198
+ ---
199
+
200
+ **Approval**: ✅ RETROSPECTIVE APPROVED
201
+ **Implementation**: ✅ COMPLETED
202
+ **Documentation**: ⏳ IN PROGRESS
@@ -0,0 +1,211 @@
1
+ # Charter: [C3] Page 工具
2
+
3
+ task_id: C3
4
+ task_name: Page 工具实现
5
+ stage: C
6
+ phase: Align (Retrospective)
7
+ created_at: "2025-10-02"
8
+ status: COMPLETED
9
+ estimated_hours: 3-4
10
+ actual_hours: 4
11
+
12
+ ## Goal (目标)
13
+
14
+ 实现 Page 级别的 8 个 MCP 工具,封装页面元素查询、等待、数据读写、方法调用和页面属性获取功能。
15
+
16
+ **核心交付物**:
17
+ - `src/tools/page.ts` - 8 个工具实现 (458 lines)
18
+ - `tests/unit/page.test.ts` - 单元测试 (450 lines, 27 tests)
19
+ - 工具: query, queryAll, waitFor, getData, setData, callMethod, getSize, getScrollTop
20
+
21
+ ## Non-Goals (非目标)
22
+
23
+ - ❌ 不实现元素交互操作(留给 C4)
24
+ - ❌ 不实现元素属性读取(留给 C4)
25
+ - ❌ 不实现复杂的等待条件组合
26
+ - ❌ 不实现数据变更监听
27
+
28
+ ## Scope (范围)
29
+
30
+ ### In Scope (包含)
31
+
32
+ 1. **query 工具**
33
+ - ✅ 单元素查询(selector/xpath)
34
+ - ✅ 支持 ElementRef 协议
35
+ - ✅ 支持页面路径指定
36
+ - ✅ 支持缓存和保存
37
+
38
+ 2. **queryAll 工具**
39
+ - ✅ 多元素查询
40
+ - ✅ 返回元素数组
41
+ - ✅ 支持索引访问
42
+
43
+ 3. **waitFor 工具**
44
+ - ✅ 等待元素出现
45
+ - ✅ 支持超时配置
46
+ - ✅ 支持自定义条件
47
+
48
+ 4. **getData 工具**
49
+ - ✅ 获取页面数据
50
+ - ✅ 支持路径查询(如 user.name)
51
+ - ✅ 返回完整数据或部分数据
52
+
53
+ 5. **setData 工具**
54
+ - ✅ 设置页面数据
55
+ - ✅ 支持批量更新
56
+ - ✅ 自动触发页面渲染
57
+
58
+ 6. **callMethod 工具**
59
+ - ✅ 调用页面方法
60
+ - ✅ 支持参数传递
61
+ - ✅ 返回方法结果
62
+
63
+ 7. **getSize 工具**
64
+ - ✅ 获取页面尺寸
65
+ - ✅ 返回宽度和高度
66
+
67
+ 8. **getScrollTop 工具**
68
+ - ✅ 获取页面滚动位置
69
+ - ✅ 返回垂直滚动距离
70
+
71
+ ### Out of Scope (不包含)
72
+
73
+ - ❌ 元素点击、输入等交互(C4)
74
+ - ❌ 元素属性、文本读取(C4)
75
+ - ❌ 断言和验证(Stage D)
76
+ - ❌ 页面性能监控
77
+
78
+ ## Constraints (约束)
79
+
80
+ ### Technical Constraints (技术约束)
81
+
82
+ 1. **miniprogram-automator 依赖**
83
+ - 使用 Page 实例的官方 API
84
+ - 遵循 WXML 选择器规范
85
+ - 支持 XPath 查询
86
+
87
+ 2. **ElementRef 协议**
88
+ - 支持 refId(缓存引用)
89
+ - 支持 selector(WXML 选择器)
90
+ - 支持 xpath(XPath 选择器)
91
+ - 支持 index(多元素索引)
92
+ - 支持 save(保存到缓存)
93
+
94
+ 3. **查询约束**
95
+ - selector: 支持 class, id, tag, attribute
96
+ - xpath: 完整 XPath 语法
97
+ - 超时默认: 5 秒
98
+
99
+ 4. **数据操作约束**
100
+ - setData: 自动触发页面渲染
101
+ - getData: 支持点记法路径(如 user.name)
102
+ - callMethod: 方法必须在 Page 定义中
103
+
104
+ ### Business Constraints (业务约束)
105
+
106
+ 1. **查询时间**: <2 秒
107
+ 2. **等待超时**: 默认 5 秒,可配置最大 30 秒
108
+ 3. **数据操作**: <1 秒
109
+ 4. **方法调用**: <5 秒
110
+
111
+ ## Success Criteria (成功标准)
112
+
113
+ ### Functional Criteria (功能标准)
114
+
115
+ - ✅ query 支持 selector 和 xpath
116
+ - ✅ queryAll 返回元素数组
117
+ - ✅ waitFor 等待元素出现
118
+ - ✅ getData 获取页面数据
119
+ - ✅ setData 更新页面数据
120
+ - ✅ callMethod 调用页面方法
121
+ - ✅ getSize 返回页面尺寸
122
+ - ✅ getScrollTop 返回滚动位置
123
+
124
+ ### Quality Criteria (质量标准)
125
+
126
+ - ✅ TypeScript 编译 0 错误
127
+ - ✅ 单元测试覆盖率 >80%
128
+ - ✅ 27 个测试用例全部通过
129
+ - ✅ 无 ESLint 错误
130
+ - ✅ JSDoc 注释完整
131
+
132
+ ### Documentation Criteria (文档标准)
133
+
134
+ - ✅ ElementRef 协议文档清晰
135
+ - ✅ 选择器示例完整
136
+ - ✅ 工具描述包含用法
137
+ - ⏳ charter.C3.align.yaml (本文档)
138
+ - ⏳ tasks.C3.atomize.md (任务卡)
139
+
140
+ ## Definition of Done (完成标准)
141
+
142
+ **代码**:
143
+ - ✅ `src/tools/page.ts` 实现完成 (458 lines)
144
+ - ✅ TypeScript 编译通过
145
+ - ✅ 8 个工具正确注册
146
+
147
+ **测试**:
148
+ - ✅ `tests/unit/page.test.ts` (450 lines)
149
+ - ✅ 27 个测试用例全部通过
150
+ - ✅ 覆盖 ElementRef 协议
151
+ - ✅ Mock Page 实例
152
+
153
+ **文档**:
154
+ - ⏳ charter.C3.align.yaml (追溯)
155
+ - ⏳ tasks.C3.atomize.md (追溯)
156
+ - ✅ README 工具列表更新
157
+
158
+ **Git**:
159
+ - ✅ 已提交(Stage C 提交)
160
+
161
+ ## Dependencies (依赖)
162
+
163
+ **前置任务**:
164
+ - ✅ C2: MiniProgram 工具(导航到页面)
165
+ - ✅ B2: SessionStore(管理 Page 实例)
166
+ - ✅ ElementRef 协议设计
167
+
168
+ **后续任务**:
169
+ - C3 → C4 (Element 工具需要元素引用)
170
+ - C3 → C5 (工具注册器集成)
171
+
172
+ ## Risks (风险)
173
+
174
+ ### Technical Risks (技术风险)
175
+
176
+ 1. **选择器复杂性** - 🟡 中风险
177
+ - 影响:复杂选择器可能查询失败
178
+ - 缓解:提供详细错误信息和示例
179
+
180
+ 2. **元素缓存失效** - 🟡 中风险
181
+ - 影响:页面更新后缓存的元素引用失效
182
+ - 缓解:页面变化时自动清理缓存
183
+
184
+ 3. **waitFor 超时** - 🟢 已缓解
185
+ - 风险:等待条件永不满足导致超时
186
+ - 缓解:可配置超时时间,明确错误提示
187
+
188
+ ### Business Risks (业务风险)
189
+
190
+ 1. **性能问题** - 🟢 已缓解
191
+ - 影响:频繁查询可能影响性能
192
+ - 缓解:支持元素缓存减少重复查询
193
+
194
+ ## Open Questions (未决问题)
195
+
196
+ - ❓ 是否需要支持自定义等待条件函数?(当前仅等待元素)
197
+ - ❓ 是否需要支持批量查询优化?(当前逐个查询)
198
+ - ❓ 元素缓存策略是否需要优化?(当前页面变化时清理)
199
+
200
+ ## References (参考资料)
201
+
202
+ - `docs/微信小程序自动化完整操作手册.md` - Page API 文档
203
+ - `docs/完整实现方案.md` - ElementRef 协议设计
204
+ - `miniprogram-automator` 官方文档
205
+ - WXML 选择器文档
206
+
207
+ ---
208
+
209
+ **Approval**: ✅ RETROSPECTIVE APPROVED
210
+ **Implementation**: ✅ COMPLETED
211
+ **Documentation**: ⏳ IN PROGRESS
@@ -0,0 +1,263 @@
1
+ # Charter: [C4] Element 工具完整实现
2
+
3
+ task_id: C4
4
+ task_name: Element 工具完整实现(23个工具 + 子类操作)
5
+ stage: C
6
+ phase: Align (Retrospective)
7
+ created_at: "2025-10-02"
8
+ status: COMPLETED
9
+ estimated_hours: 6-8
10
+ actual_hours: 8
11
+
12
+ ## Goal (目标)
13
+
14
+ 实现 Element 级别的完整工具集,包括 23 个核心交互工具和 6 类专用组件操作,覆盖点击、长按、触摸事件、属性读取、输入、滑动、移动等所有元素操作。
15
+
16
+ **核心交付物**:
17
+ - `src/tools/element.ts` - 23 个工具 + 子类操作 (956 lines)
18
+ - `tests/unit/element.test.ts` - 单元测试 (1104 lines, 72 tests)
19
+ - 工具分类:
20
+ - **交互操作** (7个): tap, longpress, touchstart, touchmove, touchend, input, trigger
21
+ - **属性读取** (6个): getText, getAttribute, getValue, getProperty, getStyle, getComputedStyle
22
+ - **位置尺寸** (3个): getSize, getOffset, getBoundingClientRect
23
+ - **移动滑动** (3个): swipe, moveTo, scrollTo
24
+ - **子类操作** (6类): Input, Textarea, Picker, ScrollView, Swiper, MovableView
25
+
26
+ ## Non-Goals (非目标)
27
+
28
+ - ❌ 不实现断言工具(留给 Stage D)
29
+ - ❌ 不实现录制功能(留给 Stage F)
30
+ - ❌ 不实现元素截图(属于 Page 级别)
31
+ - ❌ 不实现拖拽到其他元素(简化实现)
32
+
33
+ ## Scope (范围)
34
+
35
+ ### In Scope (包含)
36
+
37
+ #### 1. 基础交互 (7个工具)
38
+
39
+ - ✅ **tap**: 点击元素
40
+ - ✅ **longpress**: 长按元素(350ms)
41
+ - ✅ **touchstart**: 触摸开始事件
42
+ - ✅ **touchmove**: 触摸移动事件
43
+ - ✅ **touchend**: 触摸结束事件
44
+ - ✅ **input**: 输入文本
45
+ - ✅ **trigger**: 触发自定义事件
46
+
47
+ #### 2. 属性读取 (6个工具)
48
+
49
+ - ✅ **getText**: 获取元素文本内容
50
+ - ✅ **getAttribute**: 获取元素属性(支持 data-* 属性)
51
+ - ✅ **getValue**: 获取表单元素值
52
+ - ✅ **getProperty**: 获取元素属性(JavaScript 属性)
53
+ - ✅ **getStyle**: 获取元素样式
54
+ - ✅ **getComputedStyle**: 获取计算后样式
55
+
56
+ #### 3. 位置尺寸 (3个工具)
57
+
58
+ - ✅ **getSize**: 获取元素尺寸(width, height)
59
+ - ✅ **getOffset**: 获取元素偏移(left, top)
60
+ - ✅ **getBoundingClientRect**: 获取完整边界信息
61
+
62
+ #### 4. 移动滑动 (3个工具)
63
+
64
+ - ✅ **swipe**: 滑动元素(支持方向和距离)
65
+ - ✅ **moveTo**: 移动到指定位置
66
+ - ✅ **scrollTo**: 滚动到指定位置
67
+
68
+ #### 5. 专用组件操作 (6类子类工具)
69
+
70
+ **Input / Textarea**:
71
+ - ✅ input_input: 输入文本
72
+ - ✅ input_clear: 清空内容
73
+ - ✅ input_getValue: 获取值
74
+ - ✅ input_focus: 聚焦
75
+ - ✅ input_blur: 失焦
76
+
77
+ **Picker**:
78
+ - ✅ picker_select: 选择选项(支持索引/值)
79
+ - ✅ picker_getValue: 获取当前值
80
+ - ✅ picker_getRange: 获取选项列表
81
+
82
+ **ScrollView**:
83
+ - ✅ scrollview_scrollTo: 滚动到位置
84
+ - ✅ scrollview_scrollIntoView: 滚动到子元素
85
+ - ✅ scrollview_getScrollOffset: 获取滚动偏移
86
+
87
+ **Swiper**:
88
+ - ✅ swiper_swipeTo: 滑动到指定页
89
+ - ✅ swiper_next: 下一页
90
+ - ✅ swiper_prev: 上一页
91
+ - ✅ swiper_getCurrent: 获取当前页索引
92
+
93
+ **MovableView**:
94
+ - ✅ movable_moveTo: 移动到位置
95
+ - ✅ movable_getPosition: 获取当前位置
96
+
97
+ #### 6. ElementRef 集成
98
+
99
+ - ✅ 所有工具支持 ElementRef 协议
100
+ - ✅ 支持 refId/selector/xpath 三种查询方式
101
+ - ✅ 统一的元素解析逻辑
102
+
103
+ ### Out of Scope (不包含)
104
+
105
+ - ❌ 元素截图(使用 Page screenshot)
106
+ - ❌ 拖拽到其他元素(使用 touchstart + touchmove + touchend 组合)
107
+ - ❌ 复杂手势识别(缩放、旋转等)
108
+ - ❌ 动画状态检测
109
+
110
+ ## Constraints (约束)
111
+
112
+ ### Technical Constraints (技术约束)
113
+
114
+ 1. **miniprogram-automator 依赖**
115
+ - 使用 Element 实例的官方 API
116
+ - 遵循触摸事件坐标系统
117
+ - 正确处理异步操作
118
+
119
+ 2. **触摸事件坐标**
120
+ - pageX/pageY: 相对于页面的坐标
121
+ - clientX/clientY: 相对于视口的坐标
122
+ - 支持多点触摸(touches 数组)
123
+
124
+ 3. **长按时间**
125
+ - 默认: 350ms
126
+ - 符合微信小程序标准
127
+
128
+ 4. **子类组件约束**
129
+ - Picker: 仅支持 selector/multiSelector/time/date 模式
130
+ - ScrollView: 支持横向/纵向滚动
131
+ - Swiper: 支持循环/自动播放配置
132
+ - MovableView: 支持边界限制
133
+
134
+ ### Business Constraints (业务约束)
135
+
136
+ 1. **交互时间**: 单次操作 <1 秒
137
+ 2. **长按时间**: 350ms(固定)
138
+ 3. **滑动时间**: 可配置,默认 300ms
139
+ 4. **兼容性**: 支持所有微信小程序基础组件
140
+
141
+ ## Success Criteria (成功标准)
142
+
143
+ ### Functional Criteria (功能标准)
144
+
145
+ **基础交互**:
146
+ - ✅ tap 触发点击事件
147
+ - ✅ longpress 触发长按事件
148
+ - ✅ touchstart/move/end 支持触摸事件序列
149
+ - ✅ input 输入文本到表单元素
150
+ - ✅ trigger 触发自定义事件
151
+
152
+ **属性读取**:
153
+ - ✅ getText 获取文本内容
154
+ - ✅ getAttribute 获取 HTML 属性
155
+ - ✅ getValue 获取表单值
156
+ - ✅ getProperty 获取 JavaScript 属性
157
+ - ✅ getStyle/getComputedStyle 获取样式
158
+
159
+ **位置尺寸**:
160
+ - ✅ getSize 返回宽高
161
+ - ✅ getOffset 返回偏移
162
+ - ✅ getBoundingClientRect 返回完整边界
163
+
164
+ **移动滑动**:
165
+ - ✅ swipe 支持 4 个方向滑动
166
+ - ✅ moveTo 移动到指定坐标
167
+ - ✅ scrollTo 滚动到位置
168
+
169
+ **子类操作**:
170
+ - ✅ Input/Textarea 输入操作完整
171
+ - ✅ Picker 选择操作完整
172
+ - ✅ ScrollView 滚动操作完整
173
+ - ✅ Swiper 翻页操作完整
174
+ - ✅ MovableView 移动操作完整
175
+
176
+ ### Quality Criteria (质量标准)
177
+
178
+ - ✅ TypeScript 编译 0 错误
179
+ - ✅ 单元测试覆盖率 >85%
180
+ - ✅ 72 个测试用例全部通过
181
+ - ✅ 无 ESLint 错误
182
+ - ✅ JSDoc 注释完整(956 行代码)
183
+
184
+ ### Documentation Criteria (文档标准)
185
+
186
+ - ✅ 每个工具有详细 schema 定义
187
+ - ✅ 子类操作分类清晰
188
+ - ✅ 坐标系统文档完整
189
+ - ⏳ charter.C4.align.yaml (本文档)
190
+ - ⏳ tasks.C4.atomize.md (任务卡)
191
+
192
+ ## Definition of Done (完成标准)
193
+
194
+ **代码**:
195
+ - ✅ `src/tools/element.ts` 实现完成 (956 lines)
196
+ - ✅ TypeScript 编译通过
197
+ - ✅ 23 个核心工具 + 6 类子类操作正确注册
198
+
199
+ **测试**:
200
+ - ✅ `tests/unit/element.test.ts` (1104 lines)
201
+ - ✅ 72 个测试用例全部通过
202
+ - ✅ 覆盖所有工具和子类操作
203
+ - ✅ Mock Element 实例
204
+
205
+ **文档**:
206
+ - ⏳ charter.C4.align.yaml (追溯)
207
+ - ⏳ tasks.C4.atomize.md (追溯)
208
+ - ✅ README 工具列表更新
209
+
210
+ **Git**:
211
+ - ✅ 已提交(Stage C 提交)
212
+
213
+ ## Dependencies (依赖)
214
+
215
+ **前置任务**:
216
+ - ✅ C3: Page 工具(query 获取元素)
217
+ - ✅ ElementRef 协议实现
218
+ - ✅ B2: SessionStore(管理元素缓存)
219
+
220
+ **后续任务**:
221
+ - C4 → C5 (工具注册器集成)
222
+ - C4 → D1 (Assert 工具使用 Element 属性)
223
+
224
+ ## Risks (风险)
225
+
226
+ ### Technical Risks (技术风险)
227
+
228
+ 1. **触摸事件复杂性** - 🟡 中风险
229
+ - 影响:多点触摸和事件序列可能出错
230
+ - 缓解:完整的单元测试覆盖
231
+
232
+ 2. **子类组件兼容性** - 🟡 中风险
233
+ - 影响:不同组件可能有特殊行为
234
+ - 缓解:参考官方文档实现
235
+
236
+ 3. **坐标系统混淆** - 🟢 已缓解
237
+ - 风险:pageX 和 clientX 混用
238
+ - 缓解:统一使用 pageX/pageY
239
+
240
+ ### Business Risks (业务风险)
241
+
242
+ 1. **性能问题** - 🟢 已缓解
243
+ - 影响:大量元素操作可能影响性能
244
+ - 缓解:使用元素缓存优化
245
+
246
+ ## Open Questions (未决问题)
247
+
248
+ - ❓ 是否需要支持拖拽到其他元素?(当前使用触摸事件组合)
249
+ - ❓ 是否需要支持复杂手势(缩放、旋转)?(当前不支持)
250
+ - ❓ 是否需要支持动画状态检测?(当前不支持)
251
+
252
+ ## References (参考资料)
253
+
254
+ - `docs/微信小程序自动化完整操作手册.md` - Element API 文档
255
+ - `docs/完整实现方案.md` - 工具分层设计
256
+ - `miniprogram-automator` 官方文档
257
+ - 微信小程序组件文档
258
+
259
+ ---
260
+
261
+ **Approval**: ✅ RETROSPECTIVE APPROVED
262
+ **Implementation**: ✅ COMPLETED (23个工具 + 6类子类操作)
263
+ **Documentation**: ⏳ IN PROGRESS