@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.
- package/README.md +469 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +144 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +73 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +118 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/loader.d.ts +50 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +189 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/core/element-ref.d.ts +44 -0
- package/dist/core/element-ref.d.ts.map +1 -0
- package/dist/core/element-ref.js +213 -0
- package/dist/core/element-ref.js.map +1 -0
- package/dist/core/logger.d.ts +55 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +378 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/output.d.ts +21 -0
- package/dist/core/output.d.ts.map +1 -0
- package/dist/core/output.js +56 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/report-generator.d.ts +24 -0
- package/dist/core/report-generator.d.ts.map +1 -0
- package/dist/core/report-generator.js +212 -0
- package/dist/core/report-generator.js.map +1 -0
- package/dist/core/session.d.ts +83 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +306 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/timeout.d.ts +49 -0
- package/dist/core/timeout.d.ts.map +1 -0
- package/dist/core/timeout.js +67 -0
- package/dist/core/timeout.js.map +1 -0
- package/dist/core/tool-logger.d.ts +83 -0
- package/dist/core/tool-logger.d.ts.map +1 -0
- package/dist/core/tool-logger.js +453 -0
- package/dist/core/tool-logger.js.map +1 -0
- package/dist/core/validation.d.ts +39 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +93 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +85 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/assert.d.ts +108 -0
- package/dist/tools/assert.d.ts.map +1 -0
- package/dist/tools/assert.js +291 -0
- package/dist/tools/assert.js.map +1 -0
- package/dist/tools/automator.d.ts +45 -0
- package/dist/tools/automator.d.ts.map +1 -0
- package/dist/tools/automator.js +186 -0
- package/dist/tools/automator.js.map +1 -0
- package/dist/tools/element.d.ts +253 -0
- package/dist/tools/element.d.ts.map +1 -0
- package/dist/tools/element.js +615 -0
- package/dist/tools/element.js.map +1 -0
- package/dist/tools/index.d.ts +97 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +1565 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/miniprogram.d.ts +79 -0
- package/dist/tools/miniprogram.d.ts.map +1 -0
- package/dist/tools/miniprogram.js +245 -0
- package/dist/tools/miniprogram.js.map +1 -0
- package/dist/tools/network.d.ts +65 -0
- package/dist/tools/network.d.ts.map +1 -0
- package/dist/tools/network.js +205 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/page.d.ts +108 -0
- package/dist/tools/page.d.ts.map +1 -0
- package/dist/tools/page.js +307 -0
- package/dist/tools/page.js.map +1 -0
- package/dist/tools/record.d.ts +86 -0
- package/dist/tools/record.d.ts.map +1 -0
- package/dist/tools/record.js +316 -0
- package/dist/tools/record.js.map +1 -0
- package/dist/tools/snapshot.d.ts +82 -0
- package/dist/tools/snapshot.d.ts.map +1 -0
- package/dist/tools/snapshot.js +258 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/types.d.ts +240 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/docs/SIMPLE_USAGE.md +210 -0
- package/docs/api/README.md +244 -0
- package/docs/api/assert.md +1015 -0
- package/docs/api/automator.md +345 -0
- package/docs/api/element.md +1454 -0
- package/docs/api/miniprogram.md +558 -0
- package/docs/api/network.md +883 -0
- package/docs/api/page.md +909 -0
- package/docs/api/record.md +963 -0
- package/docs/api/snapshot.md +792 -0
- package/docs/architecture.E-Docs.md +1359 -0
- package/docs/architecture.F1.md +720 -0
- package/docs/architecture.F2.md +871 -0
- package/docs/architecture.F3.md +905 -0
- package/docs/architecture.md +90 -0
- package/docs/charter.A1.align.yaml +170 -0
- package/docs/charter.A2.align.yaml +199 -0
- package/docs/charter.A3.align.yaml +242 -0
- package/docs/charter.A4.align.yaml +227 -0
- package/docs/charter.B1.align.yaml +179 -0
- package/docs/charter.B2.align.yaml +200 -0
- package/docs/charter.B3.align.yaml +200 -0
- package/docs/charter.B4.align.yaml +188 -0
- package/docs/charter.C1.align.yaml +190 -0
- package/docs/charter.C2.align.yaml +202 -0
- package/docs/charter.C3.align.yaml +211 -0
- package/docs/charter.C4.align.yaml +263 -0
- package/docs/charter.C5.align.yaml +220 -0
- package/docs/charter.D1.align.yaml +190 -0
- package/docs/charter.D2.align.yaml +234 -0
- package/docs/charter.D3.align.yaml +206 -0
- package/docs/charter.E-Docs.align.yaml +294 -0
- package/docs/charter.F1.align.yaml +193 -0
- package/docs/charter.F2.align.yaml +248 -0
- package/docs/charter.F3.align.yaml +287 -0
- package/docs/charter.G.align.yaml +174 -0
- package/docs/charter.align.yaml +111 -0
- package/docs/examples/session-report-usage.md +449 -0
- package/docs/maintenance.md +682 -0
- package/docs/playwright-mcp/350/260/203/347/240/224.md +53 -0
- package/docs/setup-guide.md +775 -0
- package/docs/tasks.A1.atomize.md +296 -0
- package/docs/tasks.A2.atomize.md +408 -0
- package/docs/tasks.A3.atomize.md +564 -0
- package/docs/tasks.A4.atomize.md +496 -0
- package/docs/tasks.B1.atomize.md +352 -0
- package/docs/tasks.B2.atomize.md +561 -0
- package/docs/tasks.B3.atomize.md +508 -0
- package/docs/tasks.B4.atomize.md +504 -0
- package/docs/tasks.C1.atomize.md +540 -0
- package/docs/tasks.C2.atomize.md +665 -0
- package/docs/tasks.C3.atomize.md +745 -0
- package/docs/tasks.C4.atomize.md +908 -0
- package/docs/tasks.C5.atomize.md +755 -0
- package/docs/tasks.D1.atomize.md +547 -0
- package/docs/tasks.D2.atomize.md +619 -0
- package/docs/tasks.D3.atomize.md +790 -0
- package/docs/tasks.E-Docs.atomize.md +1204 -0
- package/docs/tasks.atomize.md +189 -0
- package/docs/troubleshooting.md +855 -0
- package/docs//345/256/214/346/225/264/345/256/236/347/216/260/346/226/271/346/241/210.md +155 -0
- package/docs//345/274/200/345/217/221/344/273/273/345/212/241/350/256/241/345/210/222.md +110 -0
- 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
- 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
- package/docs//346/216/245/345/217/243/346/226/271/346/241/210.md +565 -0
- package/docs//347/254/254/344/270/200/347/211/210/346/234/254/346/226/271/346/241/210.md +380 -0
- package/package.json +87 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# Charter: [B3] ElementRef 解析器
|
|
2
|
+
|
|
3
|
+
task_id: B3
|
|
4
|
+
task_name: ElementRef 统一元素定位协议
|
|
5
|
+
stage: B
|
|
6
|
+
phase: Align (Retrospective)
|
|
7
|
+
created_at: "2025-10-02"
|
|
8
|
+
status: COMPLETED
|
|
9
|
+
estimated_hours: 2
|
|
10
|
+
actual_hours: 2
|
|
11
|
+
|
|
12
|
+
## Goal (目标)
|
|
13
|
+
|
|
14
|
+
实现 ElementRef 统一元素定位协议,支持 refId/selector/xpath/index/pagePath 多种定位方式,并提供自动缓存和失效机制。
|
|
15
|
+
|
|
16
|
+
**核心交付物**:
|
|
17
|
+
- `src/core/element-ref.ts` (~150 lines)
|
|
18
|
+
- resolveElement() 函数
|
|
19
|
+
- resolvePage() 函数
|
|
20
|
+
- generateRefId() 函数
|
|
21
|
+
- 元素缓存管理
|
|
22
|
+
|
|
23
|
+
## Non-Goals (非目标)
|
|
24
|
+
|
|
25
|
+
- ❌ 不支持 XPath 定位(miniprogram-automator 不支持)
|
|
26
|
+
- ❌ 不实现元素等待逻辑(属于工具层)
|
|
27
|
+
- ❌ 不实现元素查询优化(直接使用 SDK)
|
|
28
|
+
- ❌ 不实现跨页面元素引用
|
|
29
|
+
|
|
30
|
+
## Scope (范围)
|
|
31
|
+
|
|
32
|
+
### In Scope (包含)
|
|
33
|
+
|
|
34
|
+
1. **ElementRef 接口**
|
|
35
|
+
- ✅ refId?: string - 缓存句柄引用
|
|
36
|
+
- ✅ selector?: string - WXML/CSS 选择器
|
|
37
|
+
- ✅ xpath?: string - XPath 选择器(抛出不支持错误)
|
|
38
|
+
- ✅ index?: number - 多元素索引
|
|
39
|
+
- ✅ pagePath?: string - 目标页面路径
|
|
40
|
+
- ✅ save?: boolean - 是否缓存并返回 refId
|
|
41
|
+
|
|
42
|
+
2. **resolveElement() 函数**
|
|
43
|
+
- ✅ 优先从 elementCache 解析 refId
|
|
44
|
+
- ✅ 若无 refId,使用 selector/xpath 查询
|
|
45
|
+
- ✅ 支持 index 索引多元素
|
|
46
|
+
- ✅ 支持 save 参数缓存元素
|
|
47
|
+
- ✅ 返回 Element 对象和新 refId(如果 save=true)
|
|
48
|
+
|
|
49
|
+
3. **resolvePage() 函数**
|
|
50
|
+
- ✅ 若提供 pagePath,切换到指定页面
|
|
51
|
+
- ✅ 若无 pagePath,返回当前页面
|
|
52
|
+
- ✅ 支持 pagePath 格式验证
|
|
53
|
+
- ✅ 返回 Page 对象
|
|
54
|
+
|
|
55
|
+
4. **generateRefId() 函数**
|
|
56
|
+
- ✅ 生成唯一元素引用 ID
|
|
57
|
+
- ✅ 格式:`elem-{timestamp}-{random}`
|
|
58
|
+
- ✅ 保证全局唯一性
|
|
59
|
+
|
|
60
|
+
5. **缓存管理**
|
|
61
|
+
- ✅ 使用 session.elementCache 存储
|
|
62
|
+
- ✅ 自动失效机制(页面切换时清空)
|
|
63
|
+
- ✅ 手动清理接口
|
|
64
|
+
|
|
65
|
+
### Out of Scope (不包含)
|
|
66
|
+
|
|
67
|
+
- ❌ XPath 查询实现
|
|
68
|
+
- ❌ 元素等待和重试
|
|
69
|
+
- ❌ 元素查询性能优化
|
|
70
|
+
- ❌ 跨会话元素共享
|
|
71
|
+
|
|
72
|
+
## Constraints (约束)
|
|
73
|
+
|
|
74
|
+
### Technical Constraints (技术约束)
|
|
75
|
+
|
|
76
|
+
1. **miniprogram-automator 限制**
|
|
77
|
+
- 仅支持 CSS 选择器和组件选择器
|
|
78
|
+
- 不支持 XPath
|
|
79
|
+
- 元素句柄无法跨页面使用
|
|
80
|
+
|
|
81
|
+
2. **缓存失效规则**
|
|
82
|
+
- 页面切换时自动清空缓存
|
|
83
|
+
- 元素销毁时句柄失效
|
|
84
|
+
- 必须处理失效场景
|
|
85
|
+
|
|
86
|
+
3. **TypeScript 规范**
|
|
87
|
+
- 完整类型定义
|
|
88
|
+
- 严格模式
|
|
89
|
+
- 导入使用 .js 后缀
|
|
90
|
+
|
|
91
|
+
4. **错误处理**
|
|
92
|
+
- 明确的错误消息
|
|
93
|
+
- 区分不同失败原因
|
|
94
|
+
- 提供调试信息
|
|
95
|
+
|
|
96
|
+
### Business Constraints (业务约束)
|
|
97
|
+
|
|
98
|
+
1. **性能要求**: 元素解析 <50ms
|
|
99
|
+
2. **缓存容量**: 单会话最多 1000 个元素
|
|
100
|
+
3. **兼容性**: 支持所有 WXML 组件
|
|
101
|
+
|
|
102
|
+
## Success Criteria (成功标准)
|
|
103
|
+
|
|
104
|
+
### Functional Criteria (功能标准)
|
|
105
|
+
|
|
106
|
+
- ✅ resolveElement 正确解析 refId
|
|
107
|
+
- ✅ resolveElement 正确解析 selector
|
|
108
|
+
- ✅ resolveElement 支持 index 索引
|
|
109
|
+
- ✅ resolveElement 支持 save 缓存
|
|
110
|
+
- ✅ resolvePage 正确切换页面
|
|
111
|
+
- ✅ resolvePage 返回当前页面
|
|
112
|
+
- ✅ generateRefId 生成唯一 ID
|
|
113
|
+
- ✅ XPath 抛出明确错误
|
|
114
|
+
|
|
115
|
+
### Quality Criteria (质量标准)
|
|
116
|
+
|
|
117
|
+
- ✅ TypeScript 编译 0 错误
|
|
118
|
+
- ✅ 代码行数 ~150 行
|
|
119
|
+
- ✅ 无 ESLint 错误
|
|
120
|
+
- ✅ JSDoc 注释完整
|
|
121
|
+
- ✅ 单元测试覆盖(随工具测试)
|
|
122
|
+
|
|
123
|
+
### Documentation Criteria (文档标准)
|
|
124
|
+
|
|
125
|
+
- ✅ ElementRef 接口文档
|
|
126
|
+
- ✅ resolveElement/resolvePage 函数文档
|
|
127
|
+
- ✅ 缓存机制说明
|
|
128
|
+
- ⏳ charter.B3.align.yaml (本文档)
|
|
129
|
+
- ⏳ tasks.B3.atomize.md (任务卡)
|
|
130
|
+
|
|
131
|
+
## Definition of Done (完成标准)
|
|
132
|
+
|
|
133
|
+
**代码**:
|
|
134
|
+
- ✅ `src/core/element-ref.ts` 实现完成 (~150 lines)
|
|
135
|
+
- ✅ TypeScript 编译通过
|
|
136
|
+
- ✅ 所有函数实现
|
|
137
|
+
|
|
138
|
+
**测试**:
|
|
139
|
+
- ✅ 单元测试随工具测试验证
|
|
140
|
+
- ✅ 集成测试覆盖各种定位方式
|
|
141
|
+
- ✅ 测试缓存和失效机制
|
|
142
|
+
|
|
143
|
+
**文档**:
|
|
144
|
+
- ⏳ charter.B3.align.yaml (追溯)
|
|
145
|
+
- ⏳ tasks.B3.atomize.md (追溯)
|
|
146
|
+
- ⏳ session_log (追溯)
|
|
147
|
+
|
|
148
|
+
**Git**:
|
|
149
|
+
- ✅ 已提交(随 C4 Element 工具提交)
|
|
150
|
+
|
|
151
|
+
## Dependencies (依赖)
|
|
152
|
+
|
|
153
|
+
**前置任务**:
|
|
154
|
+
- ✅ A3: 仓库结构初始化
|
|
155
|
+
- ✅ B2: SessionStore(使用 elementCache)
|
|
156
|
+
- ✅ miniprogram-automator SDK 了解
|
|
157
|
+
|
|
158
|
+
**后续任务**:
|
|
159
|
+
- B3 → C4 (Element 工具使用解析器)
|
|
160
|
+
- B3 → 所有元素操作工具
|
|
161
|
+
|
|
162
|
+
## Risks (风险)
|
|
163
|
+
|
|
164
|
+
### Technical Risks (技术风险)
|
|
165
|
+
|
|
166
|
+
1. **XPath 不支持** - 🟢 已缓解
|
|
167
|
+
- 影响:用户期望使用 XPath
|
|
168
|
+
- 缓解:明确错误消息,引导使用 selector
|
|
169
|
+
|
|
170
|
+
2. **缓存失效** - 🟢 已缓解
|
|
171
|
+
- 影响:页面切换后元素句柄失效
|
|
172
|
+
- 缓解:自动清空缓存,清晰错误提示
|
|
173
|
+
|
|
174
|
+
3. **选择器冲突** - 🟡 中风险
|
|
175
|
+
- 影响:selector 匹配多个元素
|
|
176
|
+
- 缓解:支持 index 参数精确定位
|
|
177
|
+
|
|
178
|
+
### Business Risks (业务风险)
|
|
179
|
+
|
|
180
|
+
1. **用户体验** - 🟢 低风险
|
|
181
|
+
- 影响:缓存失效导致操作失败
|
|
182
|
+
- 缓解:清晰错误消息,引导重新查询
|
|
183
|
+
|
|
184
|
+
## Open Questions (未决问题)
|
|
185
|
+
|
|
186
|
+
- ✅ 是否支持 XPath?(否,SDK 不支持)
|
|
187
|
+
- ✅ 缓存容量限制?(1000 个元素/会话)
|
|
188
|
+
- ❓ 是否需要支持跨页面元素引用?(当前不支持)
|
|
189
|
+
|
|
190
|
+
## References (参考资料)
|
|
191
|
+
|
|
192
|
+
- `docs/微信小程序自动化完整操作手册.md` - 元素查询 API
|
|
193
|
+
- `docs/完整实现方案.md` - ElementRef 协议设计
|
|
194
|
+
- miniprogram-automator 选择器文档
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
**Approval**: ✅ RETROSPECTIVE APPROVED
|
|
199
|
+
**Implementation**: ✅ COMPLETED
|
|
200
|
+
**Documentation**: ⏳ IN PROGRESS
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Charter: [B4] Logger 和 OutputManager
|
|
2
|
+
|
|
3
|
+
task_id: B4
|
|
4
|
+
task_name: Logger 和 OutputManager 实现
|
|
5
|
+
stage: B
|
|
6
|
+
phase: Align (Retrospective)
|
|
7
|
+
created_at: "2025-10-02"
|
|
8
|
+
status: COMPLETED
|
|
9
|
+
estimated_hours: 1-2
|
|
10
|
+
actual_hours: 1.5
|
|
11
|
+
|
|
12
|
+
## Goal (目标)
|
|
13
|
+
|
|
14
|
+
实现结构化日志系统(Logger)和产物管理器(OutputManager),为 MCP Server 提供统一的日志输出和文件管理能力。
|
|
15
|
+
|
|
16
|
+
**核心交付物**:
|
|
17
|
+
- `src/core/logger.ts` (~50 lines)
|
|
18
|
+
- `src/core/output.ts` (~60 lines)
|
|
19
|
+
- Logger: info/warn/error 方法
|
|
20
|
+
- OutputManager: resolveOutputPath/writeFile 方法
|
|
21
|
+
|
|
22
|
+
## Non-Goals (非目标)
|
|
23
|
+
|
|
24
|
+
- ❌ 不实现日志持久化(仅 console 输出)
|
|
25
|
+
- ❌ 不实现日志级别过滤
|
|
26
|
+
- ❌ 不实现日志轮转
|
|
27
|
+
- ❌ 不实现远程日志上传
|
|
28
|
+
|
|
29
|
+
## Scope (范围)
|
|
30
|
+
|
|
31
|
+
### In Scope (包含)
|
|
32
|
+
|
|
33
|
+
1. **Logger 类**
|
|
34
|
+
- ✅ info(message: string, meta?: object): void
|
|
35
|
+
- ✅ warn(message: string, meta?: object): void
|
|
36
|
+
- ✅ error(message: string, meta?: object): void
|
|
37
|
+
- ✅ 所有日志输出到 console.error(避免干扰 stdio)
|
|
38
|
+
- ✅ 结构化日志格式:[level] message {meta}
|
|
39
|
+
|
|
40
|
+
2. **OutputManager 类**
|
|
41
|
+
- ✅ constructor(sessionId: string, baseDir: string)
|
|
42
|
+
- ✅ resolveOutputPath(type: string, filename: string): string
|
|
43
|
+
- ✅ writeFile(type: string, filename: string, content: string|Buffer): Promise<string>
|
|
44
|
+
- ✅ 目录结构:{baseDir}/{sessionId}/{type}/
|
|
45
|
+
|
|
46
|
+
3. **目录管理**
|
|
47
|
+
- ✅ 自动创建目录
|
|
48
|
+
- ✅ 支持多种产物类型(screenshot/snapshot/log/trace)
|
|
49
|
+
- ✅ 返回绝对路径
|
|
50
|
+
|
|
51
|
+
4. **文件操作**
|
|
52
|
+
- ✅ 写入文本文件
|
|
53
|
+
- ✅ 写入二进制文件(Buffer)
|
|
54
|
+
- ✅ 错误处理和重试
|
|
55
|
+
|
|
56
|
+
### Out of Scope (不包含)
|
|
57
|
+
|
|
58
|
+
- ❌ 日志持久化到文件
|
|
59
|
+
- ❌ 日志级别配置
|
|
60
|
+
- ❌ 日志格式化选项
|
|
61
|
+
- ❌ 文件压缩和清理
|
|
62
|
+
|
|
63
|
+
## Constraints (约束)
|
|
64
|
+
|
|
65
|
+
### Technical Constraints (技术约束)
|
|
66
|
+
|
|
67
|
+
1. **stdio 避让**
|
|
68
|
+
- 所有日志必须输出到 console.error
|
|
69
|
+
- 不能使用 console.log(stdout 被 MCP 占用)
|
|
70
|
+
|
|
71
|
+
2. **文件系统**
|
|
72
|
+
- 使用 Node.js fs/promises API
|
|
73
|
+
- 支持相对路径和绝对路径
|
|
74
|
+
- 自动创建目录(recursive)
|
|
75
|
+
|
|
76
|
+
3. **TypeScript 规范**
|
|
77
|
+
- 完整类型定义
|
|
78
|
+
- 严格模式
|
|
79
|
+
- 导入使用 .js 后缀
|
|
80
|
+
|
|
81
|
+
4. **错误处理**
|
|
82
|
+
- 捕获文件 I/O 错误
|
|
83
|
+
- 记录错误日志
|
|
84
|
+
- 抛出明确异常
|
|
85
|
+
|
|
86
|
+
### Business Constraints (业务约束)
|
|
87
|
+
|
|
88
|
+
1. **日志性能**: 日志输出不阻塞主流程
|
|
89
|
+
2. **文件性能**: 文件写入 <100ms
|
|
90
|
+
3. **存储限制**: 单会话产物 <100MB
|
|
91
|
+
|
|
92
|
+
## Success Criteria (成功标准)
|
|
93
|
+
|
|
94
|
+
### Functional Criteria (功能标准)
|
|
95
|
+
|
|
96
|
+
- ✅ Logger.info/warn/error 正确输出
|
|
97
|
+
- ✅ 日志格式清晰可读
|
|
98
|
+
- ✅ OutputManager 正确创建目录
|
|
99
|
+
- ✅ OutputManager 正确写入文件
|
|
100
|
+
- ✅ resolveOutputPath 返回正确路径
|
|
101
|
+
- ✅ 支持文本和二进制内容
|
|
102
|
+
|
|
103
|
+
### Quality Criteria (质量标准)
|
|
104
|
+
|
|
105
|
+
- ✅ TypeScript 编译 0 错误
|
|
106
|
+
- ✅ logger.ts ~50 行
|
|
107
|
+
- ✅ output.ts ~60 行
|
|
108
|
+
- ✅ 无 ESLint 错误
|
|
109
|
+
- ✅ JSDoc 注释完整
|
|
110
|
+
|
|
111
|
+
### Documentation Criteria (文档标准)
|
|
112
|
+
|
|
113
|
+
- ✅ Logger API 文档
|
|
114
|
+
- ✅ OutputManager API 文档
|
|
115
|
+
- ✅ 目录结构说明
|
|
116
|
+
- ⏳ charter.B4.align.yaml (本文档)
|
|
117
|
+
- ⏳ tasks.B4.atomize.md (任务卡)
|
|
118
|
+
|
|
119
|
+
## Definition of Done (完成标准)
|
|
120
|
+
|
|
121
|
+
**代码**:
|
|
122
|
+
- ✅ `src/core/logger.ts` 实现完成 (~50 lines)
|
|
123
|
+
- ✅ `src/core/output.ts` 实现完成 (~60 lines)
|
|
124
|
+
- ✅ TypeScript 编译通过
|
|
125
|
+
- ✅ 所有方法实现
|
|
126
|
+
|
|
127
|
+
**测试**:
|
|
128
|
+
- ✅ 单元测试随工具测试验证
|
|
129
|
+
- ✅ 手动测试日志输出
|
|
130
|
+
- ✅ 集成测试文件写入
|
|
131
|
+
|
|
132
|
+
**文档**:
|
|
133
|
+
- ⏳ charter.B4.align.yaml (追溯)
|
|
134
|
+
- ⏳ tasks.B4.atomize.md (追溯)
|
|
135
|
+
- ⏳ session_log (追溯)
|
|
136
|
+
|
|
137
|
+
**Git**:
|
|
138
|
+
- ✅ 已提交(随 D2 Snapshot 工具提交)
|
|
139
|
+
|
|
140
|
+
## Dependencies (依赖)
|
|
141
|
+
|
|
142
|
+
**前置任务**:
|
|
143
|
+
- ✅ A3: 仓库结构初始化
|
|
144
|
+
- ✅ Node.js fs/promises API 了解
|
|
145
|
+
|
|
146
|
+
**后续任务**:
|
|
147
|
+
- B4 → D2 (Snapshot 工具使用 OutputManager)
|
|
148
|
+
- B4 → 所有需要输出文件的工具
|
|
149
|
+
|
|
150
|
+
## Risks (风险)
|
|
151
|
+
|
|
152
|
+
### Technical Risks (技术风险)
|
|
153
|
+
|
|
154
|
+
1. **stdio 干扰** - 🟢 已缓解
|
|
155
|
+
- 影响:console.log 干扰 MCP 协议
|
|
156
|
+
- 缓解:强制使用 console.error
|
|
157
|
+
|
|
158
|
+
2. **文件权限** - 🟡 中风险
|
|
159
|
+
- 影响:无法创建目录/写入文件
|
|
160
|
+
- 缓解:错误处理 + 清晰错误消息
|
|
161
|
+
|
|
162
|
+
3. **路径安全** - 🟡 中风险
|
|
163
|
+
- 影响:路径遍历攻击
|
|
164
|
+
- 缓解:路径验证和规范化
|
|
165
|
+
|
|
166
|
+
### Business Risks (业务风险)
|
|
167
|
+
|
|
168
|
+
1. **存储占用** - 🟢 低风险
|
|
169
|
+
- 影响:产物文件占用磁盘空间
|
|
170
|
+
- 缓解:会话清理机制 + 用户管理
|
|
171
|
+
|
|
172
|
+
## Open Questions (未决问题)
|
|
173
|
+
|
|
174
|
+
- ✅ 日志是否需要持久化?(否,仅 console 输出)
|
|
175
|
+
- ✅ 是否需要日志级别过滤?(否,后续扩展)
|
|
176
|
+
- ❓ 是否需要产物文件清理策略?(当前手动清理)
|
|
177
|
+
|
|
178
|
+
## References (参考资料)
|
|
179
|
+
|
|
180
|
+
- `docs/完整实现方案.md` - 日志和产物管理设计
|
|
181
|
+
- Node.js fs/promises API 文档
|
|
182
|
+
- Node.js path API 文档
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
**Approval**: ✅ RETROSPECTIVE APPROVED
|
|
187
|
+
**Implementation**: ✅ COMPLETED
|
|
188
|
+
**Documentation**: ⏳ IN PROGRESS
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Charter: [C1] Automator 工具
|
|
2
|
+
|
|
3
|
+
task_id: C1
|
|
4
|
+
task_name: Automator 工具实现
|
|
5
|
+
stage: C
|
|
6
|
+
phase: Align (Retrospective)
|
|
7
|
+
created_at: "2025-10-02"
|
|
8
|
+
status: COMPLETED
|
|
9
|
+
estimated_hours: 2-3
|
|
10
|
+
actual_hours: 3
|
|
11
|
+
|
|
12
|
+
## Goal (目标)
|
|
13
|
+
|
|
14
|
+
实现 Automator 级别的 4 个 MCP 工具,封装微信开发者工具的启动、连接、断开和关闭功能。
|
|
15
|
+
|
|
16
|
+
**核心交付物**:
|
|
17
|
+
- `src/tools/automator.ts` - 4 个工具实现 (252 lines)
|
|
18
|
+
- `tests/unit/automator.test.ts` - 单元测试 (364 lines, 20 tests)
|
|
19
|
+
- 工具: launch, connect, disconnect, close
|
|
20
|
+
|
|
21
|
+
## Non-Goals (非目标)
|
|
22
|
+
|
|
23
|
+
- ❌ 不实现 MiniProgram 级别工具(留给 C2)
|
|
24
|
+
- ❌ 不实现配置文件管理(使用默认配置)
|
|
25
|
+
- ❌ 不实现自动重连机制(简单失败返回)
|
|
26
|
+
- ❌ 不实现端口冲突检测(用户自行处理)
|
|
27
|
+
|
|
28
|
+
## Scope (范围)
|
|
29
|
+
|
|
30
|
+
### In Scope (包含)
|
|
31
|
+
|
|
32
|
+
1. **launch 工具**
|
|
33
|
+
- ✅ 启动微信开发者工具
|
|
34
|
+
- ✅ 支持自定义项目路径
|
|
35
|
+
- ✅ 支持自定义端口(默认 9420)
|
|
36
|
+
- ✅ 支持自定义 CLI 路径(默认 macOS 路径)
|
|
37
|
+
- ✅ 返回会话 ID 和启动状态
|
|
38
|
+
|
|
39
|
+
2. **connect 工具**
|
|
40
|
+
- ✅ 连接到已启动的开发者工具
|
|
41
|
+
- ✅ 支持自定义端口
|
|
42
|
+
- ✅ 获取 MiniProgram 实例
|
|
43
|
+
- ✅ 返回连接成功状态
|
|
44
|
+
|
|
45
|
+
3. **disconnect 工具**
|
|
46
|
+
- ✅ 断开当前连接
|
|
47
|
+
- ✅ 清理 MiniProgram 实例
|
|
48
|
+
- ✅ 保留 IDE 进程(不关闭)
|
|
49
|
+
|
|
50
|
+
4. **close 工具**
|
|
51
|
+
- ✅ 关闭微信开发者工具
|
|
52
|
+
- ✅ 终止 IDE 进程
|
|
53
|
+
- ✅ 清理会话资源
|
|
54
|
+
|
|
55
|
+
### Out of Scope (不包含)
|
|
56
|
+
|
|
57
|
+
- ❌ 多实例管理(一次仅支持一个会话)
|
|
58
|
+
- ❌ 自动重连机制
|
|
59
|
+
- ❌ 端口冲突解决
|
|
60
|
+
- ❌ Windows/Linux CLI 路径支持
|
|
61
|
+
|
|
62
|
+
## Constraints (约束)
|
|
63
|
+
|
|
64
|
+
### Technical Constraints (技术约束)
|
|
65
|
+
|
|
66
|
+
1. **miniprogram-automator 依赖**
|
|
67
|
+
- 必须使用官方 `miniprogram-automator` SDK
|
|
68
|
+
- 遵循其 launch/connect API 规范
|
|
69
|
+
- 正确处理异步操作和错误
|
|
70
|
+
|
|
71
|
+
2. **Session 隔离**
|
|
72
|
+
- 每个会话独立的 automator 实例
|
|
73
|
+
- 会话 ID 自动生成(UUID)
|
|
74
|
+
- 通过 SessionStore 管理生命周期
|
|
75
|
+
|
|
76
|
+
3. **默认配置**
|
|
77
|
+
- CLI 路径: `/Applications/wechatwebdevtools.app/Contents/MacOS/cli`
|
|
78
|
+
- 端口: 9420
|
|
79
|
+
- 超时: 30 秒
|
|
80
|
+
|
|
81
|
+
4. **错误处理**
|
|
82
|
+
- 明确区分启动失败 vs 连接失败
|
|
83
|
+
- 返回清晰的错误消息
|
|
84
|
+
- 记录详细错误日志
|
|
85
|
+
|
|
86
|
+
### Business Constraints (业务约束)
|
|
87
|
+
|
|
88
|
+
1. **启动时间**: <10 秒
|
|
89
|
+
2. **连接时间**: <3 秒
|
|
90
|
+
3. **关闭时间**: <2 秒
|
|
91
|
+
4. **兼容性**: macOS 优先,微信开发者工具 1.06+
|
|
92
|
+
|
|
93
|
+
## Success Criteria (成功标准)
|
|
94
|
+
|
|
95
|
+
### Functional Criteria (功能标准)
|
|
96
|
+
|
|
97
|
+
- ✅ launch 成功启动开发者工具
|
|
98
|
+
- ✅ connect 成功连接并获取 MiniProgram 实例
|
|
99
|
+
- ✅ disconnect 断开连接但保留 IDE
|
|
100
|
+
- ✅ close 完全关闭 IDE 和会话
|
|
101
|
+
- ✅ 错误场景正确处理(端口占用、CLI 不存在等)
|
|
102
|
+
|
|
103
|
+
### Quality Criteria (质量标准)
|
|
104
|
+
|
|
105
|
+
- ✅ TypeScript 编译 0 错误
|
|
106
|
+
- ✅ 单元测试覆盖率 >80%
|
|
107
|
+
- ✅ 20 个测试用例全部通过
|
|
108
|
+
- ✅ 无 ESLint 错误
|
|
109
|
+
- ✅ JSDoc 注释完整
|
|
110
|
+
|
|
111
|
+
### Documentation Criteria (文档标准)
|
|
112
|
+
|
|
113
|
+
- ✅ 每个工具有 zod schema 定义
|
|
114
|
+
- ✅ 工具描述清晰(inputSchema.description)
|
|
115
|
+
- ✅ 函数签名有 JSDoc
|
|
116
|
+
- ⏳ charter.C1.align.yaml (本文档)
|
|
117
|
+
- ⏳ tasks.C1.atomize.md (任务卡)
|
|
118
|
+
|
|
119
|
+
## Definition of Done (完成标准)
|
|
120
|
+
|
|
121
|
+
**代码**:
|
|
122
|
+
- ✅ `src/tools/automator.ts` 实现完成 (252 lines)
|
|
123
|
+
- ✅ TypeScript 编译通过
|
|
124
|
+
- ✅ 4 个工具正确注册
|
|
125
|
+
|
|
126
|
+
**测试**:
|
|
127
|
+
- ✅ `tests/unit/automator.test.ts` (364 lines)
|
|
128
|
+
- ✅ 20 个测试用例全部通过
|
|
129
|
+
- ✅ 覆盖成功/失败场景
|
|
130
|
+
- ✅ Mock miniprogram-automator 依赖
|
|
131
|
+
|
|
132
|
+
**文档**:
|
|
133
|
+
- ⏳ charter.C1.align.yaml (追溯)
|
|
134
|
+
- ⏳ tasks.C1.atomize.md (追溯)
|
|
135
|
+
- ✅ README 工具列表更新
|
|
136
|
+
|
|
137
|
+
**Git**:
|
|
138
|
+
- ✅ 已提交(Stage C 提交)
|
|
139
|
+
|
|
140
|
+
## Dependencies (依赖)
|
|
141
|
+
|
|
142
|
+
**前置任务**:
|
|
143
|
+
- ✅ B1: MCP Server 骨架
|
|
144
|
+
- ✅ B2: SessionStore 实现
|
|
145
|
+
- ✅ `miniprogram-automator` 已安装
|
|
146
|
+
|
|
147
|
+
**后续任务**:
|
|
148
|
+
- C1 → C2 (需要 MiniProgram 实例)
|
|
149
|
+
- C1 → C5 (工具注册器集成)
|
|
150
|
+
|
|
151
|
+
## Risks (风险)
|
|
152
|
+
|
|
153
|
+
### Technical Risks (技术风险)
|
|
154
|
+
|
|
155
|
+
1. **CLI 路径变化** - 🟡 中风险
|
|
156
|
+
- 影响:微信开发者工具更新可能改变 CLI 路径
|
|
157
|
+
- 缓解:允许用户自定义 CLI 路径
|
|
158
|
+
|
|
159
|
+
2. **端口冲突** - 🟡 中风险
|
|
160
|
+
- 影响:端口被占用导致启动失败
|
|
161
|
+
- 缓解:明确错误提示,建议更换端口
|
|
162
|
+
|
|
163
|
+
3. **进程泄漏** - 🟢 已缓解
|
|
164
|
+
- 风险:异常退出导致 IDE 进程残留
|
|
165
|
+
- 缓解:优雅关闭机制,SessionStore.dispose() 清理
|
|
166
|
+
|
|
167
|
+
### Business Risks (业务风险)
|
|
168
|
+
|
|
169
|
+
1. **跨平台兼容** - 🟡 中风险
|
|
170
|
+
- 影响:当前仅支持 macOS
|
|
171
|
+
- 缓解:文档明确说明,未来扩展 Windows/Linux
|
|
172
|
+
|
|
173
|
+
## Open Questions (未决问题)
|
|
174
|
+
|
|
175
|
+
- ❓ 是否需要支持多个小程序同时运行?(当前单实例)
|
|
176
|
+
- ❓ 是否需要自动重连机制?(当前无)
|
|
177
|
+
- ❓ 是否需要端口自动探测?(当前手动指定)
|
|
178
|
+
|
|
179
|
+
## References (参考资料)
|
|
180
|
+
|
|
181
|
+
- `docs/微信小程序自动化完整操作手册.md` - Automator API 文档
|
|
182
|
+
- `docs/完整实现方案.md` - 工具分层设计
|
|
183
|
+
- `miniprogram-automator` 官方文档
|
|
184
|
+
- `src/core/session.ts` - Session 管理
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
**Approval**: ✅ RETROSPECTIVE APPROVED
|
|
189
|
+
**Implementation**: ✅ COMPLETED
|
|
190
|
+
**Documentation**: ⏳ IN PROGRESS
|