@creatoria/miniapp-mcp 0.1.3 → 0.2.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 (246) hide show
  1. package/README.md +14 -3
  2. package/dist/app/cli/index.d.ts +6 -0
  3. package/dist/app/cli/index.d.ts.map +1 -0
  4. package/dist/app/cli/index.js +6 -0
  5. package/dist/app/cli/index.js.map +1 -0
  6. package/dist/app/index.d.ts +6 -0
  7. package/dist/app/index.d.ts.map +1 -0
  8. package/dist/app/index.js +6 -0
  9. package/dist/app/index.js.map +1 -0
  10. package/dist/app/server/index.d.ts +7 -0
  11. package/dist/app/server/index.d.ts.map +1 -0
  12. package/dist/app/server/index.js +6 -0
  13. package/dist/app/server/index.js.map +1 -0
  14. package/dist/capabilities/assert/index.d.ts +5 -0
  15. package/dist/capabilities/assert/index.d.ts.map +1 -0
  16. package/dist/capabilities/assert/index.js +5 -0
  17. package/dist/capabilities/assert/index.js.map +1 -0
  18. package/dist/capabilities/automator/index.d.ts +6 -0
  19. package/dist/capabilities/automator/index.d.ts.map +1 -0
  20. package/dist/capabilities/automator/index.js +6 -0
  21. package/dist/capabilities/automator/index.js.map +1 -0
  22. package/dist/capabilities/automator/schemas/close.d.ts +5 -0
  23. package/dist/capabilities/automator/schemas/close.d.ts.map +1 -0
  24. package/dist/capabilities/automator/schemas/close.js +11 -0
  25. package/dist/capabilities/automator/schemas/close.js.map +1 -0
  26. package/dist/capabilities/automator/schemas/connect.d.ts +11 -0
  27. package/dist/capabilities/automator/schemas/connect.d.ts.map +1 -0
  28. package/dist/capabilities/automator/schemas/connect.js +19 -0
  29. package/dist/capabilities/automator/schemas/connect.js.map +1 -0
  30. package/dist/capabilities/automator/schemas/disconnect.d.ts +5 -0
  31. package/dist/capabilities/automator/schemas/disconnect.d.ts.map +1 -0
  32. package/dist/capabilities/automator/schemas/disconnect.js +11 -0
  33. package/dist/capabilities/automator/schemas/disconnect.js.map +1 -0
  34. package/dist/capabilities/automator/schemas/index.d.ts +4 -0
  35. package/dist/capabilities/automator/schemas/index.d.ts.map +1 -0
  36. package/dist/capabilities/automator/schemas/index.js +12 -0
  37. package/dist/capabilities/automator/schemas/index.js.map +1 -0
  38. package/dist/capabilities/automator/schemas/launch.d.ts +17 -0
  39. package/dist/capabilities/automator/schemas/launch.d.ts.map +1 -0
  40. package/dist/capabilities/automator/schemas/launch.js +26 -0
  41. package/dist/capabilities/automator/schemas/launch.js.map +1 -0
  42. package/dist/capabilities/element/index.d.ts +5 -0
  43. package/dist/capabilities/element/index.d.ts.map +1 -0
  44. package/dist/capabilities/element/index.js +5 -0
  45. package/dist/capabilities/element/index.js.map +1 -0
  46. package/dist/capabilities/index.d.ts +15 -0
  47. package/dist/capabilities/index.d.ts.map +1 -0
  48. package/dist/capabilities/index.js +14 -0
  49. package/dist/capabilities/index.js.map +1 -0
  50. package/dist/capabilities/miniprogram/index.d.ts +5 -0
  51. package/dist/capabilities/miniprogram/index.d.ts.map +1 -0
  52. package/dist/capabilities/miniprogram/index.js +5 -0
  53. package/dist/capabilities/miniprogram/index.js.map +1 -0
  54. package/dist/capabilities/network/index.d.ts +5 -0
  55. package/dist/capabilities/network/index.d.ts.map +1 -0
  56. package/dist/capabilities/network/index.js +5 -0
  57. package/dist/capabilities/network/index.js.map +1 -0
  58. package/dist/capabilities/page/index.d.ts +5 -0
  59. package/dist/capabilities/page/index.d.ts.map +1 -0
  60. package/dist/capabilities/page/index.js +5 -0
  61. package/dist/capabilities/page/index.js.map +1 -0
  62. package/dist/capabilities/record/index.d.ts +5 -0
  63. package/dist/capabilities/record/index.d.ts.map +1 -0
  64. package/dist/capabilities/record/index.js +5 -0
  65. package/dist/capabilities/record/index.js.map +1 -0
  66. package/dist/capabilities/schema-registry.d.ts +4 -0
  67. package/dist/capabilities/schema-registry.d.ts.map +1 -0
  68. package/dist/capabilities/schema-registry.js +18 -0
  69. package/dist/capabilities/schema-registry.js.map +1 -0
  70. package/dist/capabilities/schema-types.d.ts +22 -0
  71. package/dist/capabilities/schema-types.d.ts.map +1 -0
  72. package/dist/capabilities/schema-types.js +2 -0
  73. package/dist/capabilities/schema-types.js.map +1 -0
  74. package/dist/capabilities/snapshot/index.d.ts +5 -0
  75. package/dist/capabilities/snapshot/index.d.ts.map +1 -0
  76. package/dist/capabilities/snapshot/index.js +5 -0
  77. package/dist/capabilities/snapshot/index.js.map +1 -0
  78. package/dist/config/loader.js +1 -1
  79. package/dist/config/loader.js.map +1 -1
  80. package/dist/core/element-ref.d.ts +1 -43
  81. package/dist/core/element-ref.d.ts.map +1 -1
  82. package/dist/core/element-ref.js +1 -212
  83. package/dist/core/element-ref.js.map +1 -1
  84. package/dist/core/logger.d.ts +1 -54
  85. package/dist/core/logger.d.ts.map +1 -1
  86. package/dist/core/logger.js +1 -377
  87. package/dist/core/logger.js.map +1 -1
  88. package/dist/core/output.d.ts +1 -20
  89. package/dist/core/output.d.ts.map +1 -1
  90. package/dist/core/output.js +1 -55
  91. package/dist/core/output.js.map +1 -1
  92. package/dist/core/report-generator.d.ts +1 -23
  93. package/dist/core/report-generator.d.ts.map +1 -1
  94. package/dist/core/report-generator.js +1 -211
  95. package/dist/core/report-generator.js.map +1 -1
  96. package/dist/core/session.d.ts +2 -82
  97. package/dist/core/session.d.ts.map +1 -1
  98. package/dist/core/session.js +2 -305
  99. package/dist/core/session.js.map +1 -1
  100. package/dist/core/timeout.d.ts +1 -48
  101. package/dist/core/timeout.d.ts.map +1 -1
  102. package/dist/core/timeout.js +1 -66
  103. package/dist/core/timeout.js.map +1 -1
  104. package/dist/core/tool-logger.d.ts +1 -82
  105. package/dist/core/tool-logger.d.ts.map +1 -1
  106. package/dist/core/tool-logger.js +1 -452
  107. package/dist/core/tool-logger.js.map +1 -1
  108. package/dist/core/validation.d.ts +1 -38
  109. package/dist/core/validation.d.ts.map +1 -1
  110. package/dist/core/validation.js +1 -92
  111. package/dist/core/validation.js.map +1 -1
  112. package/dist/runtime/element/element-ref.d.ts +44 -0
  113. package/dist/runtime/element/element-ref.d.ts.map +1 -0
  114. package/dist/runtime/element/element-ref.js +214 -0
  115. package/dist/runtime/element/element-ref.js.map +1 -0
  116. package/dist/runtime/element/index.d.ts +2 -0
  117. package/dist/runtime/element/index.d.ts.map +1 -0
  118. package/dist/runtime/element/index.js +2 -0
  119. package/dist/runtime/element/index.js.map +1 -0
  120. package/dist/runtime/index.d.ts +10 -0
  121. package/dist/runtime/index.d.ts.map +1 -0
  122. package/dist/runtime/index.js +10 -0
  123. package/dist/runtime/index.js.map +1 -0
  124. package/dist/runtime/logging/index.d.ts +3 -0
  125. package/dist/runtime/logging/index.d.ts.map +1 -0
  126. package/dist/runtime/logging/index.js +3 -0
  127. package/dist/runtime/logging/index.js.map +1 -0
  128. package/dist/runtime/logging/logger.d.ts +55 -0
  129. package/dist/runtime/logging/logger.d.ts.map +1 -0
  130. package/dist/runtime/logging/logger.js +379 -0
  131. package/dist/runtime/logging/logger.js.map +1 -0
  132. package/dist/runtime/logging/tool-logger.d.ts +83 -0
  133. package/dist/runtime/logging/tool-logger.d.ts.map +1 -0
  134. package/dist/runtime/logging/tool-logger.js +454 -0
  135. package/dist/runtime/logging/tool-logger.js.map +1 -0
  136. package/dist/runtime/outputs/index.d.ts +3 -0
  137. package/dist/runtime/outputs/index.d.ts.map +1 -0
  138. package/dist/runtime/outputs/index.js +3 -0
  139. package/dist/runtime/outputs/index.js.map +1 -0
  140. package/dist/runtime/outputs/output-manager.d.ts +12 -0
  141. package/dist/runtime/outputs/output-manager.d.ts.map +1 -0
  142. package/dist/runtime/outputs/output-manager.js +39 -0
  143. package/dist/runtime/outputs/output-manager.js.map +1 -0
  144. package/dist/runtime/outputs/report-generator.d.ts +5 -0
  145. package/dist/runtime/outputs/report-generator.d.ts.map +1 -0
  146. package/dist/runtime/outputs/report-generator.js +175 -0
  147. package/dist/runtime/outputs/report-generator.js.map +1 -0
  148. package/dist/runtime/session/index.d.ts +3 -0
  149. package/dist/runtime/session/index.d.ts.map +1 -0
  150. package/dist/runtime/session/index.js +3 -0
  151. package/dist/runtime/session/index.js.map +1 -0
  152. package/dist/runtime/session/store.d.ts +28 -0
  153. package/dist/runtime/session/store.d.ts.map +1 -0
  154. package/dist/runtime/session/store.js +154 -0
  155. package/dist/runtime/session/store.js.map +1 -0
  156. package/dist/runtime/session/utils/cleanup.d.ts +3 -0
  157. package/dist/runtime/session/utils/cleanup.d.ts.map +1 -0
  158. package/dist/runtime/session/utils/cleanup.js +78 -0
  159. package/dist/runtime/session/utils/cleanup.js.map +1 -0
  160. package/dist/runtime/timeout/index.d.ts +2 -0
  161. package/dist/runtime/timeout/index.d.ts.map +1 -0
  162. package/dist/runtime/timeout/index.js +2 -0
  163. package/dist/runtime/timeout/index.js.map +1 -0
  164. package/dist/runtime/timeout/timeout.d.ts +49 -0
  165. package/dist/runtime/timeout/timeout.d.ts.map +1 -0
  166. package/dist/runtime/timeout/timeout.js +67 -0
  167. package/dist/runtime/timeout/timeout.js.map +1 -0
  168. package/dist/runtime/validation/index.d.ts +2 -0
  169. package/dist/runtime/validation/index.d.ts.map +1 -0
  170. package/dist/runtime/validation/index.js +2 -0
  171. package/dist/runtime/validation/index.js.map +1 -0
  172. package/dist/runtime/validation/validation.d.ts +39 -0
  173. package/dist/runtime/validation/validation.d.ts.map +1 -0
  174. package/dist/runtime/validation/validation.js +93 -0
  175. package/dist/runtime/validation/validation.js.map +1 -0
  176. package/dist/schemas/automator/miniprogram_close.json +12 -0
  177. package/dist/schemas/automator/miniprogram_connect.json +19 -0
  178. package/dist/schemas/automator/miniprogram_disconnect.json +12 -0
  179. package/dist/schemas/automator/miniprogram_launch.json +30 -0
  180. package/dist/server.js +1 -1
  181. package/dist/server.js.map +1 -1
  182. package/dist/tools/index.js +1 -1
  183. package/dist/tools/index.js.map +1 -1
  184. package/dist/tools/miniprogram.d.ts +0 -1
  185. package/dist/tools/miniprogram.d.ts.map +1 -1
  186. package/dist/tools/miniprogram.js +17 -29
  187. package/dist/tools/miniprogram.js.map +1 -1
  188. package/dist/tools/page.js +2 -2
  189. package/dist/tools/page.js.map +1 -1
  190. package/docs/directory-structure-and-code-style-best-practices.md +91 -0
  191. package/docs/migration/README.md +34 -0
  192. package/docs/migration/TC-ALIGN-01-notes.md +35 -0
  193. package/docs/migration/runtime-skeleton.md +50 -0
  194. package/docs/migration/tool-schema-strategy.md +75 -0
  195. package/docs//345/256/214/346/225/264/345/256/236/347/216/260/346/226/271/346/241/210.md +14 -14
  196. package/docs//347/254/254/344/270/200/347/211/210/346/234/254/346/226/271/346/241/210.md +7 -7
  197. package/package.json +4 -2
  198. package/docs/SIMPLE_USAGE.md +0 -210
  199. package/docs/architecture.E-Docs.md +0 -1359
  200. package/docs/architecture.F1.md +0 -720
  201. package/docs/architecture.F2.md +0 -871
  202. package/docs/architecture.F3.md +0 -905
  203. package/docs/architecture.md +0 -90
  204. package/docs/charter.A1.align.yaml +0 -170
  205. package/docs/charter.A2.align.yaml +0 -199
  206. package/docs/charter.A3.align.yaml +0 -242
  207. package/docs/charter.A4.align.yaml +0 -227
  208. package/docs/charter.B1.align.yaml +0 -179
  209. package/docs/charter.B2.align.yaml +0 -200
  210. package/docs/charter.B3.align.yaml +0 -200
  211. package/docs/charter.B4.align.yaml +0 -188
  212. package/docs/charter.C1.align.yaml +0 -190
  213. package/docs/charter.C2.align.yaml +0 -202
  214. package/docs/charter.C3.align.yaml +0 -211
  215. package/docs/charter.C4.align.yaml +0 -263
  216. package/docs/charter.C5.align.yaml +0 -220
  217. package/docs/charter.D1.align.yaml +0 -190
  218. package/docs/charter.D2.align.yaml +0 -234
  219. package/docs/charter.D3.align.yaml +0 -206
  220. package/docs/charter.E-Docs.align.yaml +0 -294
  221. package/docs/charter.F1.align.yaml +0 -193
  222. package/docs/charter.F2.align.yaml +0 -248
  223. package/docs/charter.F3.align.yaml +0 -287
  224. package/docs/charter.G.align.yaml +0 -174
  225. package/docs/charter.align.yaml +0 -111
  226. package/docs/maintenance.md +0 -682
  227. package/docs/playwright-mcp/350/260/203/347/240/224.md +0 -53
  228. package/docs/setup-guide.md +0 -775
  229. package/docs/tasks.A1.atomize.md +0 -296
  230. package/docs/tasks.A2.atomize.md +0 -408
  231. package/docs/tasks.A3.atomize.md +0 -564
  232. package/docs/tasks.A4.atomize.md +0 -496
  233. package/docs/tasks.B1.atomize.md +0 -352
  234. package/docs/tasks.B2.atomize.md +0 -561
  235. package/docs/tasks.B3.atomize.md +0 -508
  236. package/docs/tasks.B4.atomize.md +0 -504
  237. package/docs/tasks.C1.atomize.md +0 -540
  238. package/docs/tasks.C2.atomize.md +0 -665
  239. package/docs/tasks.C3.atomize.md +0 -745
  240. package/docs/tasks.C4.atomize.md +0 -908
  241. package/docs/tasks.C5.atomize.md +0 -755
  242. package/docs/tasks.D1.atomize.md +0 -547
  243. package/docs/tasks.D2.atomize.md +0 -619
  244. package/docs/tasks.D3.atomize.md +0 -790
  245. package/docs/tasks.E-Docs.atomize.md +0 -1204
  246. package/docs/tasks.atomize.md +0 -189
@@ -1,248 +0,0 @@
1
- # Charter: F2 - 失败时自动快照收集
2
-
3
- ## 项目信息
4
- project: creatoria-miniapp-mcp
5
- stage: F - 可观测性与产物输出
6
- task_id: F2
7
- title: 失败时自动收集截图和数据快照
8
- owner: ClaudeCode
9
- created: 2025-10-03
10
- status: in_progress
11
-
12
- ## 1. 目标 (Goals)
13
- ### 主要目标
14
- - **自动诊断收集**:工具调用失败时自动捕获页面快照和截图,无需手动触发
15
- - **上下文保留**:保存失败时的完整上下文(错误信息、工具参数、堆栈跟踪)
16
- - **可配置化**:允许用户启用/禁用自动快照,避免产生过多文件
17
- - **产物组织**:统一输出到 `artifacts/failures/` 目录,便于后续分析
18
-
19
- ### 业务价值
20
- - **提升调试效率**:失败时自动保存现场,开发者可直接查看快照而非重现问题
21
- - **增强可观测性**:配合 F1 日志系统,提供完整的故障诊断链路
22
- - **降低维护成本**:减少"无法复现"问题的排查时间
23
-
24
- ## 2. 非目标 (Non-Goals)
25
- - ❌ 不实现失败重试机制(属于工具层面的可靠性增强)
26
- - ❌ 不实现快照的自动分析/报告生成(留给 F3 任务)
27
- - ❌ 不实现快照的自动清理策略(由用户或外部工具管理)
28
- - ❌ 不支持自定义快照触发条件(仅在工具失败时触发)
29
-
30
- ## 3. 范围 (Scope)
31
- ### In Scope
32
- - ✅ 扩展 ToolLogger 支持失败快照
33
- - ✅ 配置项:`enableFailureSnapshot` (默认: false)
34
- - ✅ 失败快照包含:
35
- - 页面截图(PNG 格式)
36
- - 页面数据快照(JSON 格式)
37
- - 错误上下文(工具名、参数、错误消息、堆栈)
38
- - ✅ 产物目录结构:`artifacts/failures/{sessionId}/{toolName}-{timestamp}/`
39
- - ✅ 与 D2 快照工具集成(复用 snapshotPage/snapshotFull)
40
- - ✅ 单元测试覆盖
41
-
42
- ### Out of Scope
43
- - 🚫 视频录制(超出快照范畴)
44
- - 🚫 多页面快照(只捕获当前页面)
45
- - 🚫 快照压缩/归档(用户自行处理)
46
- - 🚫 快照上传到云存储(超出本地 MCP 职责)
47
-
48
- ## 4. 约束 (Constraints)
49
- ### 技术约束
50
- - **依赖 D2**:必须在 miniProgram 已连接且 D2 快照工具可用时才能收集
51
- - **性能影响**:快照收集是异步操作,不应阻塞错误抛出
52
- - **磁盘空间**:每次失败产生 ~100KB-5MB 文件(截图主要占用)
53
- - **Node.js 版本**:需要 Node 18+(与项目要求一致)
54
-
55
- ### 设计约束
56
- - **Fire-and-Forget**:快照收集失败不应影响原始错误的抛出
57
- - **幂等性**:同一错误不应重复收集快照
58
- - **安全性**:快照文件名必须经过验证,防止路径遍历
59
-
60
- ## 5. 解决方案 (Solution)
61
- ### 5.1 架构设计
62
- ```
63
- ┌─────────────────────────────────────────────────────────────┐
64
- │ ToolLogger.wrap() │
65
- ├─────────────────────────────────────────────────────────────┤
66
- │ try { │
67
- │ const result = await handler(session, args) │
68
- │ logger.info('Tool call completed', { result }) │
69
- │ return result │
70
- │ } catch (error) { │
71
- │ logger.error('Tool call failed', { error }) │
72
- │ ┌──────────────────────────────────────────────────┐ │
73
- │ │ if (config.enableFailureSnapshot) { │ │
74
- │ │ void this.captureFailureSnapshot({ │ │
75
- │ │ session, toolName, args, error │ │
76
- │ │ }).catch(e => logger.warn('Snapshot failed')) │ │
77
- │ │ } │ │
78
- │ └──────────────────────────────────────────────────┘ │
79
- │ throw error // ✅ 不阻塞错误抛出 │
80
- │ } │
81
- └─────────────────────────────────────────────────────────────┘
82
- ```
83
-
84
- ### 5.2 快照收集流程
85
- ```yaml
86
- 步骤:
87
- 1. 检查前提条件:
88
- - session.miniProgram 存在
89
- - session.outputManager 存在
90
- - config.enableFailureSnapshot === true
91
-
92
- 2. 生成失败目录:
93
- - 路径: artifacts/failures/{sessionId}/{toolName}-{timestamp}/
94
- - 创建目录(如不存在)
95
-
96
- 3. 收集快照数据:
97
- - 调用 snapshotPage() 获取页面数据 + 截图
98
- - 捕获系统信息(可选)
99
-
100
- 4. 保存错误上下文:
101
- - 文件: error-context.json
102
- - 内容:
103
- - toolName: 失败的工具名称
104
- - timestamp: ISO 8601 时间戳
105
- - error: { message, stack, code }
106
- - args: 工具调用参数(已脱敏)
107
- - duration: 执行耗时(ms)
108
-
109
- 5. 日志记录:
110
- - logger.info('Failure snapshot captured', { path })
111
- - 失败则 logger.warn('Failed to capture snapshot')
112
- ```
113
-
114
- ### 5.3 配置扩展
115
- ```typescript
116
- // src/types.ts
117
- interface LoggerConfig {
118
- level?: LogLevel
119
- enableFileLog?: boolean
120
- outputDir?: string
121
- bufferSize?: number
122
- flushInterval?: number
123
- enableFailureSnapshot?: boolean // 🆕 默认 false
124
- }
125
-
126
- // src/config/defaults.ts
127
- const DEFAULT_LOGGER_CONFIG = {
128
- // ...existing
129
- enableFailureSnapshot: false,
130
- }
131
- ```
132
-
133
- ### 5.4 目录结构示例
134
- ```
135
- .mcp-artifacts/
136
- └── session-abc123-2025-10-03T12-34-56/
137
- ├── logs/
138
- │ └── session-abc123.log
139
- └── failures/ # 🆕 失败快照目录
140
- ├── element_click-20251003-123500/ # 🆕 按工具+时间分组
141
- │ ├── snapshot.json # 页面数据快照
142
- │ ├── snapshot.png # 页面截图
143
- │ └── error-context.json # 错误上下文
144
- └── page_navigate-20251003-123600/
145
- ├── snapshot.json
146
- ├── snapshot.png
147
- └── error-context.json
148
- ```
149
-
150
- ## 6. 实现计划 (Implementation Plan)
151
- ### Phase 1: 核心实现 (1.5h)
152
- - [ ] 扩展 `LoggerConfig` 类型定义 (`src/types.ts`)
153
- - [ ] 添加配置默认值 (`src/config/defaults.ts`)
154
- - [ ] 实现 `ToolLogger.captureFailureSnapshot()` 方法
155
- - [ ] 集成到 `ToolLogger.wrap()` 的 catch 块
156
-
157
- ### Phase 2: 测试验证 (1h)
158
- - [ ] 单元测试:验证快照收集逻辑
159
- - [ ] 单元测试:验证配置开关生效
160
- - [ ] 单元测试:验证错误不被快照阻塞
161
- - [ ] 集成测试:端到端验证失败场景
162
-
163
- ### Phase 3: 文档完善 (0.5h)
164
- - [ ] 更新架构文档 (`docs/architecture.F2.md`)
165
- - [ ] 更新使用示例(启用失败快照)
166
- - [ ] 更新配置文档
167
-
168
- ## 7. 验收标准 (Definition of Done)
169
- ### 功能验收
170
- - ✅ 工具调用失败时,自动生成快照文件(当 `enableFailureSnapshot: true`)
171
- - ✅ 快照包含:snapshot.json, snapshot.png, error-context.json
172
- - ✅ 配置为 `false` 时,不生成快照
173
- - ✅ 快照收集失败不影响原始错误抛出
174
-
175
- ### 质量验收
176
- - ✅ 新增测试用例全部通过
177
- - ✅ 现有测试用例无回归(395+ 全通过)
178
- - ✅ TypeScript 编译无错误
179
- - ✅ 代码格式化完成(Prettier)
180
-
181
- ### 文档验收
182
- - ✅ charter.F2.align.yaml 完成
183
- - ✅ architecture.F2.md 完成
184
- - ✅ 配置示例更新
185
-
186
- ## 8. 风险与缓解 (Risks)
187
- ### 风险 #1: 快照收集耗时影响用户体验
188
- - **影响**: 用户等待错误返回时间变长
189
- - **缓解**: Fire-and-forget 模式,不阻塞错误抛出
190
- - **监控**: 记录快照收集耗时到日志
191
-
192
- ### 风险 #2: miniProgram 未连接时无法快照
193
- - **影响**: 某些工具失败时无快照(如 launch 失败)
194
- - **缓解**: 添加前提条件检查,graceful 降级
195
- - **监控**: 日志记录快照收集失败原因
196
-
197
- ### 风险 #3: 磁盘空间耗尽
198
- - **影响**: 快照保存失败
199
- - **缓解**:
200
- - 复用 F1 的磁盘空间检查逻辑
201
- - 默认关闭快照功能
202
- - 文档建议定期清理
203
- - **监控**: 磁盘空间不足时警告日志
204
-
205
- ### 风险 #4: 敏感数据泄漏到快照
206
- - **影响**: 快照文件包含敏感信息
207
- - **缓解**:
208
- - 复用 F1 的脱敏逻辑处理 args
209
- - 文档提醒用户快照文件的隐私风险
210
- - **监控**: Code review 检查脱敏逻辑
211
-
212
- ## 9. 依赖关系 (Dependencies)
213
- ### 输入依赖
214
- - ✅ **D2 (快照工具)**:snapshotPage/snapshotFull 已实现
215
- - ✅ **F1 (日志系统)**:ToolLogger 已实现
216
- - ✅ **OutputManager**:文件管理已实现
217
-
218
- ### 输出依赖
219
- - ⏳ **F3 (会话报告)**:将使用 F2 的失败快照生成汇总报告
220
-
221
- ## 10. 里程碑 (Milestones)
222
- | 里程碑 | 目标 | 预计完成 |
223
- |--------|------|----------|
224
- | M1 | 核心实现完成 | T+1.5h |
225
- | M2 | 测试验证通过 | T+2.5h |
226
- | M3 | 文档完善 | T+3h |
227
- | M4 | Code Review + 提交 | T+3.5h |
228
-
229
- ## 11. 成功指标 (Success Metrics)
230
- - **功能完整性**: 失败快照收集成功率 100%(前提条件满足时)
231
- - **性能影响**: 快照收集耗时 < 500ms(不阻塞错误)
232
- - **测试覆盖**: 新增代码分支覆盖率 > 90%
233
- - **用户体验**: 默认关闭,不影响现有用户
234
-
235
- ## 12. 开放问题 (Open Questions)
236
- - ❓ Q1: 是否需要限制快照文件数量上限?
237
- - 建议:暂不限制,由用户管理;文档提醒定期清理
238
-
239
- - ❓ Q2: 是否需要支持自定义快照内容?
240
- - 建议:F2 保持简单,自定义留给用户手动调用 snapshot 工具
241
-
242
- - ❓ Q3: 是否需要记录失败统计(哪些工具失败最多)?
243
- - 建议:留给 F3 会话报告任务
244
-
245
- ## 13. 审批记录 (Approvals)
246
- - [ ] **技术方案审批**: 待审批
247
- - [ ] **安全审查**: 待审批
248
- - [ ] **实现批准**: 待批准
@@ -1,287 +0,0 @@
1
- # Charter: F3 - 会话报告生成
2
-
3
- ## 项目信息
4
- project: creatoria-miniapp-mcp
5
- stage: F - 可观测性与产物输出
6
- task_id: F3
7
- title: 会话报告生成(JSON/Markdown 汇总)
8
- owner: ClaudeCode
9
- created: 2025-10-03
10
- status: in_progress
11
-
12
- ## 1. 目标 (Goals)
13
- ### 主要目标
14
- - **会话汇总**:自动生成会话执行报告,包含所有工具调用、执行时长、成功/失败统计
15
- - **双格式输出**:支持 JSON(机器可读)和 Markdown(人类可读)两种格式
16
- - **失败追踪**:汇总所有失败的工具调用,关联 F2 快照目录
17
- - **性能分析**:提供工具调用耗时统计,识别性能瓶颈
18
-
19
- ### 业务价值
20
- - **调试加速**:一站式查看会话全貌,快速定位问题
21
- - **质量度量**:提供成功率、平均耗时等指标,评估自动化脚本质量
22
- - **报告分享**:Markdown 格式便于在团队中共享测试结果
23
-
24
- ## 2. 非目标 (Non-Goals)
25
- - ❌ 不实现实时报告更新(仅会话结束时生成)
26
- - ❌ 不实现报告的自动上传/分发(用户自行处理)
27
- - ❌ 不实现可视化图表(纯文本/JSON)
28
- - ❌ 不实现多会话对比分析(单会话维度)
29
-
30
- ## 3. 范围 (Scope)
31
- ### In Scope
32
- - ✅ 会话级别数据收集
33
- - 工具调用记录(工具名、参数、结果、耗时、状态)
34
- - 失败详情(错误消息、快照路径)
35
- - 会话元数据(创建时间、结束时间、总耗时)
36
- - ✅ JSON 报告生成
37
- - 结构化数据(可编程解析)
38
- - 完整的调用历史
39
- - 统计指标
40
- - ✅ Markdown 报告生成
41
- - 汇总表格
42
- - 失败详情列表
43
- - 性能统计
44
- - ✅ 报告存储
45
- - 路径:`artifacts/{sessionId}/report.json`
46
- - 路径:`artifacts/{sessionId}/report.md`
47
-
48
- ### Out of Scope
49
- - 🚫 HTML/PDF 格式(超出范围)
50
- - 🚫 实时流式报告(仅最终报告)
51
- - 🚫 多会话聚合(单会话独立)
52
- - 🚫 告警/通知机制(超出本地 MCP 职责)
53
-
54
- ## 4. 约束 (Constraints)
55
- ### 技术约束
56
- - **依赖 F1**:需要从结构化日志中提取工具调用数据
57
- - **依赖 F2**:需要关联失败快照路径
58
- - **内存限制**:需要在会话期间缓存所有调用记录(控制内存增长)
59
- - **文件格式**:JSON 必须符合 JSON Schema,Markdown 必须符合 CommonMark
60
-
61
- ### 设计约束
62
- - **可选功能**:默认禁用,显式启用(避免产生过多文件)
63
- - **异步生成**:报告生成不应阻塞会话关闭
64
- - **容错性**:报告生成失败不应影响会话正常关闭
65
-
66
- ## 5. 解决方案 (Solution)
67
- ### 5.1 数据收集
68
- ```
69
- ┌─────────────────────────────────────────────────────────────┐
70
- │ SessionState │
71
- │ │
72
- │ reportData?: { │
73
- │ toolCalls: ToolCallRecord[] │
74
- │ startTime: Date │
75
- │ endTime?: Date │
76
- │ } │
77
- └─────────────────────────────────────────────────────────────┘
78
- ```
79
-
80
- **ToolCallRecord 结构**:
81
- ```typescript
82
- interface ToolCallRecord {
83
- timestamp: Date
84
- toolName: string
85
- args: any // Sanitized
86
- duration: number // milliseconds
87
- success: boolean
88
- result?: any // Sanitized
89
- error?: {
90
- message: string
91
- snapshotPath?: string // Link to F2 snapshot
92
- }
93
- }
94
- ```
95
-
96
- ### 5.2 报告生成流程
97
- ```yaml
98
- 步骤:
99
- 1. 会话开始:
100
- - 初始化 reportData = { toolCalls: [], startTime: now }
101
-
102
- 2. 工具调用时 (ToolLogger):
103
- - 记录 ToolCallRecord 到 session.reportData.toolCalls
104
-
105
- 3. 会话关闭:
106
- - 设置 reportData.endTime = now
107
- - 调用 generateReport(session)
108
- - 生成 report.json 和 report.md
109
- - 保存到 artifacts/{sessionId}/
110
- ```
111
-
112
- ### 5.3 报告格式
113
-
114
- #### JSON 格式
115
- ```json
116
- {
117
- "sessionId": "test-session-123",
118
- "startTime": "2025-10-03T06:00:00.000Z",
119
- "endTime": "2025-10-03T06:15:30.000Z",
120
- "duration": 930000,
121
- "summary": {
122
- "totalCalls": 50,
123
- "successCount": 47,
124
- "failureCount": 3,
125
- "successRate": 0.94,
126
- "avgDuration": 1500,
127
- "maxDuration": 5000,
128
- "minDuration": 100
129
- },
130
- "toolCalls": [
131
- {
132
- "timestamp": "2025-10-03T06:00:05.000Z",
133
- "toolName": "miniprogram_launch",
134
- "duration": 3000,
135
- "success": true
136
- },
137
- {
138
- "timestamp": "2025-10-03T06:05:10.000Z",
139
- "toolName": "element_click",
140
- "duration": 500,
141
- "success": false,
142
- "error": {
143
- "message": "Element not found",
144
- "snapshotPath": "failures/element_click-2025-10-03_06-05-10-123Z"
145
- }
146
- }
147
- ],
148
- "failures": [
149
- {
150
- "toolName": "element_click",
151
- "timestamp": "2025-10-03T06:05:10.000Z",
152
- "error": "Element not found",
153
- "snapshotPath": "failures/element_click-2025-10-03_06-05-10-123Z"
154
- }
155
- ]
156
- }
157
- ```
158
-
159
- #### Markdown 格式
160
- ```markdown
161
- # Session Report: test-session-123
162
-
163
- ## Summary
164
- - **Duration**: 15m 30s
165
- - **Total Calls**: 50
166
- - **Success Rate**: 94% (47/50)
167
- - **Average Duration**: 1.5s
168
-
169
- ## Tool Call Statistics
170
- | Tool Name | Calls | Success | Failure | Avg Duration |
171
- |-----------|-------|---------|---------|--------------|
172
- | miniprogram_launch | 1 | 1 | 0 | 3.0s |
173
- | page_navigate | 5 | 5 | 0 | 0.8s |
174
- | element_click | 10 | 8 | 2 | 0.5s |
175
- | element_input | 8 | 8 | 0 | 0.3s |
176
-
177
- ## Failures
178
- ### 1. element_click
179
- - **Time**: 2025-10-03 06:05:10
180
- - **Error**: Element not found
181
- - **Snapshot**: [failures/element_click-2025-10-03_06-05-10-123Z](failures/element_click-2025-10-03_06-05-10-123Z)
182
-
183
- ## Timeline
184
- | Time | Tool | Status | Duration |
185
- |------|------|--------|----------|
186
- | 06:00:05 | miniprogram_launch | ✅ | 3.0s |
187
- | 06:00:08 | page_navigate | ✅ | 0.8s |
188
- | 06:05:10 | element_click | ❌ | 0.5s |
189
- ```
190
-
191
- ## 6. 实现计划 (Implementation Plan)
192
- ### Phase 1: 数据收集 (1h)
193
- - [ ] 扩展 SessionState 类型定义
194
- - [ ] 在 ToolLogger.wrap() 中记录 ToolCallRecord
195
- - [ ] 添加配置项 `enableSessionReport`
196
-
197
- ### Phase 2: 报告生成 (2h)
198
- - [ ] 实现 ReportGenerator 类
199
- - [ ] 实现 generateJSONReport()
200
- - [ ] 实现 generateMarkdownReport()
201
- - [ ] 集成到 session.dispose()
202
-
203
- ### Phase 3: 测试验证 (1h)
204
- - [ ] 单元测试:数据收集
205
- - [ ] 单元测试:JSON 格式验证
206
- - [ ] 单元测试:Markdown 格式验证
207
- - [ ] 集成测试:端到端报告生成
208
-
209
- ## 7. 验收标准 (Definition of Done)
210
- ### 功能验收
211
- - ✅ 会话结束时自动生成 report.json 和 report.md
212
- - ✅ JSON 格式包含所有必需字段(summary、toolCalls、failures)
213
- - ✅ Markdown 格式可读性强,包含表格和链接
214
- - ✅ 失败记录正确关联 F2 快照路径
215
- - ✅ 配置为 `false` 时不生成报告
216
-
217
- ### 质量验收
218
- - ✅ 新增测试用例全部通过
219
- - ✅ 现有测试用例无回归(406+ 全通过)
220
- - ✅ TypeScript 编译无错误
221
- - ✅ 代码格式化完成(Prettier)
222
-
223
- ### 文档验收
224
- - ✅ charter.F3.align.yaml 完成
225
- - ✅ architecture.F3.md 完成
226
- - ✅ 使用示例更新
227
-
228
- ## 8. 风险与缓解 (Risks)
229
- ### 风险 #1: 内存占用随会话增长
230
- - **影响**: 长时间会话可能产生大量 ToolCallRecord
231
- - **缓解**:
232
- - 限制单个会话最大调用记录数(如 1000 条)
233
- - 超出限制后,丢弃最早的记录
234
- - 文档建议定期创建新会话
235
- - **监控**: 记录 toolCalls 数组长度到日志
236
-
237
- ### 风险 #2: 报告生成耗时影响关闭速度
238
- - **影响**: 用户等待会话关闭时间变长
239
- - **缓解**:
240
- - Fire-and-forget 模式生成报告
241
- - 报告生成失败不阻塞关闭
242
- - **监控**: 记录报告生成耗时
243
-
244
- ### 风险 #3: 敏感数据泄漏到报告
245
- - **影响**: 报告文件包含敏感信息
246
- - **缓解**:
247
- - 复用 F1 脱敏逻辑处理 args/result
248
- - 文档提醒报告文件的隐私风险
249
- - **监控**: Code review 检查脱敏逻辑
250
-
251
- ## 9. 依赖关系 (Dependencies)
252
- ### 输入依赖
253
- - ✅ **F1 (日志系统)**:ToolLogger 已实现
254
- - ✅ **F2 (失败快照)**:快照路径格式已确定
255
- - ✅ **OutputManager**:文件写入能力已实现
256
-
257
- ### 输出依赖
258
- - 无下游依赖(F3 是 Stage F 的最后任务)
259
-
260
- ## 10. 里程碑 (Milestones)
261
- | 里程碑 | 目标 | 预计完成 |
262
- |--------|------|----------|
263
- | M1 | 数据收集完成 | T+1h |
264
- | M2 | 报告生成完成 | T+3h |
265
- | M3 | 测试验证通过 | T+4h |
266
- | M4 | Code Review + 提交 | T+4.5h |
267
-
268
- ## 11. 成功指标 (Success Metrics)
269
- - **功能完整性**: 报告生成成功率 100%(配置启用时)
270
- - **性能影响**: 报告生成耗时 < 200ms(不阻塞关闭)
271
- - **文件大小**: 单会话报告 < 1MB(控制磁盘占用)
272
- - **可读性**: Markdown 格式在 GitHub 预览正常
273
-
274
- ## 12. 开放问题 (Open Questions)
275
- - ❓ Q1: 是否需要支持报告模板自定义?
276
- - 建议:F3 保持简单,固定格式;自定义留给用户后处理
277
-
278
- - ❓ Q2: 是否需要支持增量报告(会话过程中实时更新)?
279
- - 建议:F3 仅支持最终报告;实时功能复杂度高,留给未来优化
280
-
281
- - ❓ Q3: 是否需要包含页面截图链接?
282
- - 建议:仅链接 F2 失败快照;成功调用的截图不包含(避免报告过大)
283
-
284
- ## 13. 审批记录 (Approvals)
285
- - [ ] **技术方案审批**: 待审批
286
- - [ ] **安全审查**: 待审批
287
- - [ ] **实现批准**: 待批准
@@ -1,174 +0,0 @@
1
- # Charter: Stage G 测试验证与示例沉淀
2
-
3
- ## Goal (目标)
4
- 为 creatoria-miniapp-mcp 项目补齐集成测试、示例脚本,并完善文档和工具清单,确保项目达到生产就绪状态。
5
-
6
- ## Business Value (业务价值)
7
- - **质量保证**: 通过集成测试验证端到端流程的正确性
8
- - **用户体验**: 提供可运行的示例脚本,降低用户上手门槛
9
- - **可维护性**: 自动化工具清单生成,保持文档与代码同步
10
- - **生产就绪**: 达成 M4 里程碑,为发布做好准备
11
-
12
- ## Scope (范围)
13
-
14
- ### In Scope
15
-
16
- #### G1: 单元测试审查
17
- - 审查现有 440 个单元测试的覆盖率
18
- - 补充缺失的边界用例测试
19
- - 确保所有核心模块测试覆盖率 > 80%
20
-
21
- #### G2: 集成测试实现
22
- - 创建集成测试框架(tests/integration/)
23
- - 实现端到端测试场景:
24
- 1. 基础导航流程(launch → navigate → screenshot)
25
- 2. 元素交互流程(query → tap → input → assert)
26
- 3. 断言验证流程(assert + snapshot)
27
- 4. 录制回放流程(record → replay)
28
- 5. 失败快照收集(F2 集成)
29
- 6. 会话报告生成(F3 集成)
30
-
31
- #### G3: 示例脚本创建
32
- - examples/scripts/ 目录结构设计
33
- - 创建可运行的 TypeScript 示例:
34
- 1. 基础导航示例 (basic-navigation.ts)
35
- 2. 元素交互示例 (element-interaction.ts)
36
- 3. 断言测试示例 (assertion-testing.ts)
37
- 4. 快照调试示例 (snapshot-debugging.ts)
38
- 5. 录制回放示例 (record-replay.ts)
39
- - 配套 README 说明运行方式
40
-
41
- #### G4: 工具清单自动生成
42
- - 实现 scripts/update-readme.ts 脚本
43
- - 从源码自动提取工具列表和分类
44
- - 自动更新 README.md 的工具清单部分
45
- - 集成到 CI/CD 流程确保同步
46
-
47
- ### Out of Scope (明确不做)
48
- - 性能测试和压力测试(后续 Stage H)
49
- - 可视化测试报告(后续优化)
50
- - E2E 测试的 CI 集成(Stage H)
51
- - 多平台兼容性测试(Stage H)
52
-
53
- ## Non-Goals (非目标)
54
- - 不修改现有核心功能实现
55
- - 不引入新的业务功能
56
- - 不重构现有代码架构
57
-
58
- ## Constraints (约束)
59
-
60
- ### Technical (技术约束)
61
- - 集成测试需要真实的微信小程序项目
62
- - 测试运行需要微信开发者工具环境
63
- - 示例脚本必须可独立运行(无需 MCP 客户端)
64
- - 工具清单生成必须保持与源码100%同步
65
-
66
- ### Time (时间约束)
67
- - G1: 审查单元测试 - 0.5 小时
68
- - G2: 集成测试实现 - 2-3 小时
69
- - G3: 示例脚本创建 - 1-2 小时
70
- - G4: 工具清单生成 - 1 小时
71
- - **总计**: 4.5-6.5 小时
72
-
73
- ### Compliance (合规约束)
74
- - 遵循现有代码风格
75
- - 测试必须稳定可重复
76
- - 示例代码必须简洁易懂
77
-
78
- ## Definition of Done (完成标准)
79
-
80
- ### G1: 单元测试审查 ✅
81
- - [ ] 审查 18 个测试套件的覆盖范围
82
- - [ ] 补充缺失的边界用例(如有)
83
- - [ ] 所有测试通过率 100%
84
- - [ ] 测试覆盖率报告生成
85
-
86
- ### G2: 集成测试实现 ✅
87
- - [ ] tests/integration/ 目录结构创建
88
- - [ ] 至少 6 个集成测试场景实现
89
- - [ ] 测试使用示例小程序项目
90
- - [ ] 所有集成测试通过
91
- - [ ] 集成测试文档(README)
92
-
93
- ### G3: 示例脚本创建 ✅
94
- - [ ] examples/scripts/ 目录结构创建
95
- - [ ] 至少 5 个可运行示例脚本
96
- - [ ] 每个示例都有注释说明
97
- - [ ] examples/scripts/README.md 运行指南
98
- - [ ] 验证所有示例可正常运行
99
-
100
- ### G4: 工具清单生成 ✅
101
- - [ ] scripts/update-readme.ts 脚本实现
102
- - [ ] 自动提取工具列表和分类
103
- - [ ] README.md 工具清单自动更新
104
- - [ ] 验证生成的清单完整准确
105
- - [ ] 添加到 package.json scripts
106
-
107
- ## Open Questions (开放问题)
108
- 1. 集成测试使用哪个示例小程序项目?
109
- - 选项 A: 创建最小化测试项目
110
- - 选项 B: 使用官方示例项目
111
- - **建议**: 创建最小化项目,便于测试控制
112
-
113
- 2. 示例脚本是 TypeScript 还是 JavaScript?
114
- - **决议**: TypeScript,与项目保持一致
115
-
116
- 3. 集成测试是否需要在 CI 中运行?
117
- - **决议**: Stage G 先本地验证,Stage H 再集成 CI
118
-
119
- 4. 工具清单生成器需要包含哪些信息?
120
- - **决议**: 工具名称、分类、描述、参数Schema
121
-
122
- ## Dependencies (依赖)
123
-
124
- ### Input Dependencies
125
- - Stage A-F 已全部完成
126
- - 65 个工具已实现(8 个分类)
127
- - 440 个单元测试已通过
128
- - F1/F2/F3 可观测性功能已就绪
129
-
130
- ### Output Dependencies
131
- - Stage H (CI/CD) 依赖集成测试和示例脚本
132
- - 用户文档依赖工具清单的准确性
133
-
134
- ## Risks (风险)
135
- - ⚠️ 集成测试依赖微信开发者工具环境,可能不稳定
136
- - ⚠️ 示例小程序项目可能需要额外维护
137
- - ⚠️ 工具清单自动生成可能遗漏手动添加的工具
138
- - ⚠️ 集成测试运行时间可能较长,影响开发体验
139
-
140
- **缓解措施**:
141
- - 集成测试提供跳过机制(环境变量控制)
142
- - 创建最小化示例项目,减少维护成本
143
- - 工具清单生成器增加人工校验步骤
144
- - 集成测试标记为可选,不阻塞单元测试
145
-
146
- ## Success Metrics (成功指标)
147
- - ✅ 单元测试通过率: 100%
148
- - ✅ 集成测试场景覆盖: 6+ 个核心流程
149
- - ✅ 示例脚本数量: 5+ 个
150
- - ✅ 工具清单准确性: 100% (与源码同步)
151
- - ✅ 示例可运行率: 100%
152
-
153
- ## Timeline (时间线)
154
- - **Day 1 上午**: G1 单元测试审查 (0.5h)
155
- - **Day 1 下午**: G2 集成测试框架搭建 (2h)
156
- - **Day 2 上午**: G2 集成测试场景实现 (1h)
157
- - **Day 2 下午**: G3 示例脚本创建 (1.5h)
158
- - **Day 3 上午**: G4 工具清单生成器 (1h)
159
- - **Day 3 下午**: 验证和文档完善 (0.5h)
160
-
161
- ## Stakeholders (相关方)
162
- - **Owner**: ClaudeCode (Generalist Agent)
163
- - **Approver**: User (samuelcn)
164
- - **Beneficiaries**:
165
- - 最终用户(获得可运行示例)
166
- - 维护者(获得自动化工具清单)
167
- - 贡献者(获得完整测试覆盖)
168
-
169
- ---
170
-
171
- **Charter 创建时间**: 2025-10-03
172
- **预计开始时间**: 2025-10-03
173
- **预计完成时间**: 2025-10-05
174
- **状态**: APPROVED (自动批准,Stage F 已完成)