md-to-mowen 1.4.0 → 1.4.1
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/.claude/skills/e2e-dev/SKILL.md +338 -0
- package/.claude/skills/e2e-dev/references/review-checklist.md +92 -0
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +70 -113
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +1 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/status.d.ts +17 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +1 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +95 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/publish.d.ts +28 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +237 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/core/api.d.ts +54 -0
- package/dist/core/api.d.ts.map +1 -0
- package/dist/core/api.js +135 -0
- package/dist/core/api.js.map +1 -0
- package/dist/core/auth.d.ts +23 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +71 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/extract-prompt.d.ts +14 -0
- package/dist/core/extract-prompt.d.ts.map +1 -0
- package/dist/core/extract-prompt.js +66 -0
- package/dist/core/extract-prompt.js.map +1 -0
- package/dist/core/lint.d.ts +33 -0
- package/dist/core/lint.d.ts.map +1 -0
- package/dist/core/lint.js +182 -0
- package/dist/core/lint.js.map +1 -0
- package/dist/core/markdown.d.ts +23 -0
- package/dist/core/markdown.d.ts.map +1 -0
- package/dist/core/markdown.js +181 -0
- package/dist/core/markdown.js.map +1 -0
- package/dist/core/table.d.ts +44 -0
- package/dist/core/table.d.ts.map +1 -0
- package/dist/core/table.js +266 -0
- package/dist/core/table.js.map +1 -0
- package/dist/core/upload.d.ts +25 -0
- package/dist/core/upload.d.ts.map +1 -0
- package/dist/core/upload.js +129 -0
- package/dist/core/upload.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mast/to-markdown.d.ts +6 -0
- package/dist/mast/to-markdown.d.ts.map +1 -0
- package/dist/mast/to-markdown.js +1 -0
- package/dist/mast/to-markdown.js.map +1 -0
- package/dist/mast/types.d.ts +64 -0
- package/dist/mast/types.d.ts.map +1 -0
- package/dist/mast/types.js +1 -0
- package/dist/mast/types.js.map +1 -0
- package/dist/mowen/client.d.ts +52 -0
- package/dist/mowen/client.d.ts.map +1 -0
- package/dist/mowen/client.js +1 -0
- package/dist/mowen/client.js.map +1 -0
- package/dist/mowen/upload.d.ts +20 -0
- package/dist/mowen/upload.d.ts.map +1 -0
- package/dist/mowen/upload.js +1 -0
- package/dist/mowen/upload.js.map +1 -0
- package/dist/noteatom/from-mast.d.ts +8 -0
- package/dist/noteatom/from-mast.d.ts.map +1 -0
- package/dist/noteatom/from-mast.js +1 -0
- package/dist/noteatom/from-mast.js.map +1 -0
- package/dist/noteatom/index.d.ts +4 -0
- package/dist/noteatom/index.d.ts.map +1 -0
- package/dist/noteatom/index.js +1 -0
- package/dist/noteatom/index.js.map +1 -0
- package/dist/noteatom/to-mast.d.ts +7 -0
- package/dist/noteatom/to-mast.d.ts.map +1 -0
- package/dist/noteatom/to-mast.js +1 -0
- package/dist/noteatom/to-mast.js.map +1 -0
- package/dist/noteatom/types.d.ts +73 -0
- package/dist/noteatom/types.d.ts.map +1 -0
- package/dist/noteatom/types.js +1 -0
- package/dist/noteatom/types.js.map +1 -0
- package/dist/pipeline/hast-to-mast.d.ts +27 -0
- package/dist/pipeline/hast-to-mast.d.ts.map +1 -0
- package/dist/pipeline/hast-to-mast.js +20 -8
- package/dist/pipeline/hast-to-mast.js.map +1 -0
- package/dist/pipeline/md-to-hast.d.ts +9 -0
- package/dist/pipeline/md-to-hast.d.ts.map +1 -0
- package/dist/pipeline/md-to-hast.js +1 -0
- package/dist/pipeline/md-to-hast.js.map +1 -0
- package/dist/pipeline/remark-highlight.d.ts +10 -0
- package/dist/pipeline/remark-highlight.d.ts.map +1 -0
- package/dist/pipeline/remark-highlight.js +1 -0
- package/dist/pipeline/remark-highlight.js.map +1 -0
- package/dist/publish/asset-adapter.d.ts +16 -0
- package/dist/publish/asset-adapter.d.ts.map +1 -0
- package/dist/publish/asset-adapter.js +1 -0
- package/dist/publish/asset-adapter.js.map +1 -0
- package/dist/publish/index.d.ts +36 -0
- package/dist/publish/index.d.ts.map +1 -0
- package/dist/publish/index.js +1 -0
- package/dist/publish/index.js.map +1 -0
- package/dist/publish/process-directory.d.ts +36 -0
- package/dist/publish/process-directory.d.ts.map +1 -0
- package/dist/publish/process-directory.js +1 -0
- package/dist/publish/process-directory.js.map +1 -0
- package/dist/publish/process-file.d.ts +43 -0
- package/dist/publish/process-file.d.ts.map +1 -0
- package/dist/publish/process-file.js +1 -0
- package/dist/publish/process-file.js.map +1 -0
- package/dist/publish/progress.d.ts +12 -0
- package/dist/publish/progress.d.ts.map +1 -0
- package/dist/publish/progress.js +1 -0
- package/dist/publish/progress.js.map +1 -0
- package/dist/publish/table-renderer.d.ts +6 -0
- package/dist/publish/table-renderer.d.ts.map +1 -0
- package/dist/publish/table-renderer.js +1 -0
- package/dist/publish/table-renderer.js.map +1 -0
- package/dist/shared/config.d.ts +30 -0
- package/dist/shared/config.d.ts.map +1 -0
- package/dist/shared/config.js +1 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/metadata.d.ts +48 -0
- package/dist/shared/metadata.d.ts.map +1 -0
- package/dist/shared/metadata.js +5 -1
- package/dist/shared/metadata.js.map +1 -0
- package/dist/shared/retry.d.ts +11 -0
- package/dist/shared/retry.d.ts.map +1 -0
- package/dist/shared/retry.js +1 -0
- package/dist/shared/retry.js.map +1 -0
- package/package.json +42 -29
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: e2e-dev
|
|
3
|
+
description: >
|
|
4
|
+
端到端开发闭环:从需求拆解到 Issue 关闭的全自动化流程。
|
|
5
|
+
当用户说"端到端"、"e2e"、"帮我把这个需求做完"、"处理这个 issue"、
|
|
6
|
+
"从头到尾搞定"、"全流程开发"时触发此 skill。
|
|
7
|
+
支持输入 Issue 编号或需求描述文本。
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# 端到端开发(e2e-dev)
|
|
11
|
+
|
|
12
|
+
以 Issue 为驱动,自动执行从需求拆解到代码合并、Issue 关闭的完整开发闭环。
|
|
13
|
+
|
|
14
|
+
## 输入
|
|
15
|
+
|
|
16
|
+
用户通过 `/e2e-dev` 调用时,提供以下任一输入:
|
|
17
|
+
|
|
18
|
+
- **Issue 编号**:如 `#7`,直接读取 Issue 内容
|
|
19
|
+
- **需求描述**:自由文本,skill 会先创建 Issue 再继续
|
|
20
|
+
- **无输入**:提示用户提供需求或 Issue 编号
|
|
21
|
+
|
|
22
|
+
## 流程总览
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Phase 1: 需求拆解 → Phase 2: 代码开发 → Phase 3: 测试验证
|
|
26
|
+
↑ ↑
|
|
27
|
+
└────── 修复 ─────────┘
|
|
28
|
+
↓
|
|
29
|
+
Phase 6: 关闭 Issue ← Phase 5: 复测合并 ← Phase 4: 审核修复
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
每个阶段完成后向用户汇报进展,获得确认后进入下一阶段。
|
|
33
|
+
遇到无法自行解决的问题时,**暂停并请求人工协助**,不要猜测或卡死。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Phase 1: 需求拆解与验收
|
|
38
|
+
|
|
39
|
+
**目标**:以产品视角理解需求,拆解为可测试的验收条件。
|
|
40
|
+
|
|
41
|
+
### 步骤
|
|
42
|
+
|
|
43
|
+
1. **读取 Issue**
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gh issue view <number>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
若用户给的是需求描述而非 Issue 编号,先创建 Issue:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
gh issue create --title "<标题>" --body "<描述>" --label "enhancement"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
2. **拆解验收条件**
|
|
56
|
+
从 Issue 描述中提取:
|
|
57
|
+
- **功能需求**:要做什么
|
|
58
|
+
- **非功能需求**:性能、兼容性等约束
|
|
59
|
+
- **验收标准**(AC):每条必须可测试、可验证
|
|
60
|
+
|
|
61
|
+
3. **向用户确认**
|
|
62
|
+
展示拆解结果,格式:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
📋 需求拆解:#<number> <标题>
|
|
66
|
+
|
|
67
|
+
## 验收条件
|
|
68
|
+
- [ ] AC1: ...
|
|
69
|
+
- [ ] AC2: ...
|
|
70
|
+
- [ ] AC3: ...
|
|
71
|
+
|
|
72
|
+
请确认以上拆解是否准确,或补充修改。
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
4. **等待用户确认** 后进入 Phase 2
|
|
76
|
+
|
|
77
|
+
### 暂停条件
|
|
78
|
+
|
|
79
|
+
- Issue 描述模糊,无法拆解出明确的验收条件
|
|
80
|
+
- 需求涉及项目中不熟悉的领域
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Phase 2: 代码开发
|
|
85
|
+
|
|
86
|
+
**目标**:基于验收条件,用 TDD 方式完成功能开发。
|
|
87
|
+
|
|
88
|
+
### 步骤
|
|
89
|
+
|
|
90
|
+
1. **创建特征分支**
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
git checkout dev
|
|
94
|
+
git pull origin dev
|
|
95
|
+
git checkout -b <issueId>-<中文slug>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
分支命名示例:`7-支持代码块渲染`
|
|
99
|
+
|
|
100
|
+
2. **先写测试**(TDD)
|
|
101
|
+
- 根据验收条件编写测试用例,放在 `tests/` 对应目录下
|
|
102
|
+
- 测试文件命名:`<feature-name>.test.ts`
|
|
103
|
+
- 确保测试**先失败**(红)
|
|
104
|
+
|
|
105
|
+
3. **实现功能**
|
|
106
|
+
- 编写最小代码使测试通过(绿)
|
|
107
|
+
- 重构代码保持质量(重构)
|
|
108
|
+
- 遵循项目的 TypeScript 规范和已有代码风格
|
|
109
|
+
|
|
110
|
+
4. **提交代码**
|
|
111
|
+
遵循提交信息规范:
|
|
112
|
+
```bash
|
|
113
|
+
git add <具体文件>
|
|
114
|
+
git commit -m "feat: <中文描述> (closes #<issueId>)"
|
|
115
|
+
```
|
|
116
|
+
> `closes #<issueId>` 会在 PR 合并后自动关闭 Issue
|
|
117
|
+
|
|
118
|
+
### 暂停条件
|
|
119
|
+
|
|
120
|
+
- 实现方案有多种选择,需要用户决策
|
|
121
|
+
- 需要修改不熟悉的核心模块
|
|
122
|
+
- 遇到阻塞性的技术问题
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Phase 3: 测试验证
|
|
127
|
+
|
|
128
|
+
**目标**:确保所有测试通过,代码质量检查无误。
|
|
129
|
+
|
|
130
|
+
### 步骤
|
|
131
|
+
|
|
132
|
+
1. **运行完整检查**
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
npm test # 单元测试
|
|
136
|
+
npm run check # TypeScript 类型检查
|
|
137
|
+
npm run lint:pii # PII 扫描
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
2. **分析结果**
|
|
141
|
+
- **全部通过** → 进入 Phase 4
|
|
142
|
+
- **有失败** → 分析失败原因,回到 Phase 2 修复
|
|
143
|
+
|
|
144
|
+
3. **回到 Phase 2 的条件**
|
|
145
|
+
- 测试断言失败:修改代码逻辑
|
|
146
|
+
- 类型错误:修复类型定义
|
|
147
|
+
- PII 告警:脱敏处理
|
|
148
|
+
|
|
149
|
+
### 循环规则
|
|
150
|
+
|
|
151
|
+
Phase 2 ↔ Phase 3 构成内循环,直到所有检查通过。
|
|
152
|
+
最多循环 **3 轮**,仍未解决则暂停请求人工协助。
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Phase 4: 审核与修复
|
|
157
|
+
|
|
158
|
+
**目标**:自审代码质量,评估风险,发现潜在问题。
|
|
159
|
+
|
|
160
|
+
### 步骤
|
|
161
|
+
|
|
162
|
+
1. **执行 Code Review**
|
|
163
|
+
读取 `references/review-checklist.md`,逐项检查:
|
|
164
|
+
- 代码质量:命名、结构、重复、错误处理
|
|
165
|
+
- 架构合理性:是否符合项目分层、是否引入不当耦合
|
|
166
|
+
- 测试覆盖:验收条件是否全部覆盖、边界情况
|
|
167
|
+
- 安全性:PII 泄露、注入风险、依赖安全
|
|
168
|
+
|
|
169
|
+
2. **输出审核报告**
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
🔍 Code Review 报告
|
|
173
|
+
|
|
174
|
+
## 发现的问题
|
|
175
|
+
- [严重] ...
|
|
176
|
+
- [建议] ...
|
|
177
|
+
|
|
178
|
+
## 风险评估
|
|
179
|
+
- 低/中/高
|
|
180
|
+
|
|
181
|
+
## 结论
|
|
182
|
+
- ✅ 无阻塞问题,可进入合并
|
|
183
|
+
- ⚠️ 有 N 个问题需修复后重新提交
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
3. **处理审核结果**
|
|
187
|
+
- **无问题** → 进入 Phase 5
|
|
188
|
+
- **有问题** → 修复后回到 Phase 2,重新走 Phase 3
|
|
189
|
+
|
|
190
|
+
### 暂停条件
|
|
191
|
+
|
|
192
|
+
- 涉及架构级改动,需要人工决策
|
|
193
|
+
- 存在安全风险,需要人工确认
|
|
194
|
+
- 代码改动范围超出预期,需要重新评估需求
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Phase 5: 复测与合并
|
|
199
|
+
|
|
200
|
+
**目标**:最终验证,创建 PR 并合并到 dev 分支。
|
|
201
|
+
|
|
202
|
+
### 步骤
|
|
203
|
+
|
|
204
|
+
1. **最终测试**(确保 Phase 4 的修复没有引入新问题)
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
npm test
|
|
208
|
+
npm run check
|
|
209
|
+
npm run lint:pii
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
2. **推送分支**
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
git push origin <branch-name>
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
3. **创建 PR**
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
gh pr create --base dev --title "feat: <描述> (#<issueId>)" --body "..."
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
PR body 包含:
|
|
225
|
+
- 关联的 Issue:`Closes #<issueId>`
|
|
226
|
+
- 改动摘要
|
|
227
|
+
- 测试结果
|
|
228
|
+
|
|
229
|
+
4. **合并 PR**
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
gh pr merge --squash --delete-branch
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
5. **切换回 dev 并拉取最新**
|
|
236
|
+
```bash
|
|
237
|
+
git checkout dev
|
|
238
|
+
git pull origin dev
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### 暂停条件
|
|
242
|
+
|
|
243
|
+
- CI 检查失败,需要排查
|
|
244
|
+
- PR 存在合并冲突,需要手动解决
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Phase 6: 关闭 Issue
|
|
249
|
+
|
|
250
|
+
**目标**:记录完成状态,干净退出。
|
|
251
|
+
|
|
252
|
+
### 步骤
|
|
253
|
+
|
|
254
|
+
1. **添加完成评论**
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
gh issue comment <number> --body "✅ 已完成,PR #<pr-number> 已合并到 dev。"
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
2. **关闭 Issue**(如果 commit message 中没有 `closes` 关键字)
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
gh issue close <number>
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
3. **输出总结**
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
🎉 端到端完成!
|
|
270
|
+
|
|
271
|
+
Issue: #<number> <title>
|
|
272
|
+
PR: #<pr-number>
|
|
273
|
+
分支: <branch-name> (已删除)
|
|
274
|
+
状态: ✅ 已关闭
|
|
275
|
+
|
|
276
|
+
改动文件:
|
|
277
|
+
- src/...
|
|
278
|
+
- tests/...
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## 异常处理
|
|
284
|
+
|
|
285
|
+
### 测试持续失败
|
|
286
|
+
|
|
287
|
+
Phase 2 ↔ Phase 3 循环 3 轮后仍未通过:
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
⚠️ 测试在 3 轮修复后仍未通过,需要人工协助。
|
|
291
|
+
|
|
292
|
+
失败的测试:<test-name>
|
|
293
|
+
错误信息:<error-message>
|
|
294
|
+
|
|
295
|
+
请检查:
|
|
296
|
+
1. 验收条件是否理解有误?
|
|
297
|
+
2. 实现方案是否需要调整?
|
|
298
|
+
3. 测试用例本身是否有问题?
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### 审核发现阻塞问题
|
|
302
|
+
|
|
303
|
+
Phase 4 发现严重问题但无法自行修复:
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
⚠️ Code Review 发现阻塞性问题,需要人工决策。
|
|
307
|
+
|
|
308
|
+
问题:<description>
|
|
309
|
+
影响范围:<scope>
|
|
310
|
+
建议方案:<suggestion>
|
|
311
|
+
|
|
312
|
+
请确认如何处理。
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### 合并冲突
|
|
316
|
+
|
|
317
|
+
Phase 5 遇到合并冲突:
|
|
318
|
+
|
|
319
|
+
```
|
|
320
|
+
⚠️ 分支存在合并冲突,需要手动解决。
|
|
321
|
+
|
|
322
|
+
冲突文件:
|
|
323
|
+
- <file1>
|
|
324
|
+
- <file2>
|
|
325
|
+
|
|
326
|
+
建议:请先解决冲突后告诉我继续,或我尝试自动解决。
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## 项目约定
|
|
332
|
+
|
|
333
|
+
本 skill 运行时自动遵循项目的 `CLAUDE.md` 中定义的规则:
|
|
334
|
+
|
|
335
|
+
- **分支策略**:`dev` 为开发主分支,特征分支 `{issueId}-{slug}`
|
|
336
|
+
- **提交规范**:`feat:` / `fix:` / `chore:` / `docs:` / `test:`
|
|
337
|
+
- **版本管理**:semantic-release 自动管理,禁止手动改版本号
|
|
338
|
+
- **PII 规则**:绝对路径、API Key、`.env` 追踪等均会被拦截
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Code Review 检查清单
|
|
2
|
+
|
|
3
|
+
在 Phase 4(审核与修复)阶段使用此清单逐项检查。每项标记 ✅ 通过 / ❌ 不通过 / ⏭️ 不适用。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 代码质量
|
|
8
|
+
|
|
9
|
+
| # | 检查项 | 说明 |
|
|
10
|
+
| --- | ----------------- | ------------------------------------------ |
|
|
11
|
+
| 1.1 | 命名清晰 | 变量、函数、类型名能自解释,不用缩写 |
|
|
12
|
+
| 1.2 | 函数职责单一 | 每个函数只做一件事,不超过 50 行 |
|
|
13
|
+
| 1.3 | 无重复代码 | 相同逻辑已提取为公共函数/工具 |
|
|
14
|
+
| 1.4 | 错误处理完整 | 异步操作有 try-catch,API 调用有错误码处理 |
|
|
15
|
+
| 1.5 | 无魔法数字/字符串 | 常量已提取并命名 |
|
|
16
|
+
| 1.6 | 类型安全 | 无 `any` 滥用,泛型使用合理 |
|
|
17
|
+
|
|
18
|
+
## 2. 架构与设计
|
|
19
|
+
|
|
20
|
+
| # | 检查项 | 说明 |
|
|
21
|
+
| --- | ------------ | ------------------------------------------------------------------ |
|
|
22
|
+
| 2.1 | 符合项目分层 | 遵循 `src/` 下的模块划分(pipeline / publish / noteatom / shared) |
|
|
23
|
+
| 2.2 | 无不当耦合 | 新代码没有反向依赖(如 shared 模块依赖 publish) |
|
|
24
|
+
| 2.3 | 接口设计合理 | 导出的 API 签名稳定、向后兼容 |
|
|
25
|
+
| 2.4 | 依赖合理 | 没有引入不必要的第三方依赖 |
|
|
26
|
+
| 2.5 | 副作用可控 | 文件 I/O、网络请求等副作用集中在明确的位置 |
|
|
27
|
+
|
|
28
|
+
## 3. 测试覆盖
|
|
29
|
+
|
|
30
|
+
| # | 检查项 | 说明 |
|
|
31
|
+
| --- | -------------- | ------------------------------------------------ |
|
|
32
|
+
| 3.1 | 验收条件全覆盖 | Phase 1 拆解的每条 AC 都有对应测试 |
|
|
33
|
+
| 3.2 | 边界情况 | 空输入、异常输入、边界值都有测试 |
|
|
34
|
+
| 3.3 | 测试独立 | 每个测试用例不依赖其他用例的执行顺序 |
|
|
35
|
+
| 3.4 | 测试可读 | 测试名描述了行为(`should do X when Y`) |
|
|
36
|
+
| 3.5 | 无硬编码路径 | 测试中使用 `tmp` 目录或 mock,不依赖本机绝对路径 |
|
|
37
|
+
|
|
38
|
+
## 4. 安全性
|
|
39
|
+
|
|
40
|
+
| # | 检查项 | 说明 |
|
|
41
|
+
| --- | ------------- | ----------------------------------------- |
|
|
42
|
+
| 4.1 | 无 PII 泄露 | 代码中无本机绝对路径、API Key、Token |
|
|
43
|
+
| 4.2 | `.env` 未追踪 | `.env` 在 `.gitignore` 中,未被 `git add` |
|
|
44
|
+
| 4.3 | 输入校验 | 外部输入(文件路径、用户参数)有校验 |
|
|
45
|
+
| 4.4 | 依赖安全 | 新依赖无已知漏洞(`npm audit`) |
|
|
46
|
+
|
|
47
|
+
## 5. 可维护性
|
|
48
|
+
|
|
49
|
+
| # | 检查项 | 说明 |
|
|
50
|
+
| --- | ---------- | ---------------------------------------- |
|
|
51
|
+
| 5.1 | 注释有价值 | 复杂逻辑有注释说明"为什么",而非"做什么" |
|
|
52
|
+
| 5.2 | 文档同步 | 新增的公共 API 有 JSDoc / README 说明 |
|
|
53
|
+
| 5.3 | 日志适当 | 关键路径有日志输出,便于调试 |
|
|
54
|
+
| 5.4 | 配置外置 | 可变参数通过配置/环境变量传入,非硬编码 |
|
|
55
|
+
|
|
56
|
+
## 6. 提交规范
|
|
57
|
+
|
|
58
|
+
| # | 检查项 | 说明 |
|
|
59
|
+
| --- | ------------ | --------------------------------------------- |
|
|
60
|
+
| 6.1 | 提交信息格式 | 符合 `feat:` / `fix:` / `test:` 等前缀规范 |
|
|
61
|
+
| 6.2 | 提交粒度合理 | 一个提交完成一个逻辑变更,不混杂无关改动 |
|
|
62
|
+
| 6.3 | 无调试残留 | `console.log`、`debugger`、注释掉的代码已清理 |
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 审核结论模板
|
|
67
|
+
|
|
68
|
+
```markdown
|
|
69
|
+
## Code Review 结果
|
|
70
|
+
|
|
71
|
+
### 通过项
|
|
72
|
+
|
|
73
|
+
- ✅ 1.1 命名清晰
|
|
74
|
+
- ✅ 1.2 函数职责单一
|
|
75
|
+
- ...
|
|
76
|
+
|
|
77
|
+
### 问题项
|
|
78
|
+
|
|
79
|
+
- ❌ 3.2 缺少边界测试:未测试空数组输入
|
|
80
|
+
- ❌ 4.1 路径泄露:`src/foo.ts:42` 包含 `/Users/xxx/`
|
|
81
|
+
|
|
82
|
+
### 风险评估
|
|
83
|
+
|
|
84
|
+
- **低风险**:无阻塞问题
|
|
85
|
+
- **中风险**:有 1-2 个需修复的问题
|
|
86
|
+
- **高风险**:有架构或安全阻塞问题
|
|
87
|
+
|
|
88
|
+
### 建议
|
|
89
|
+
|
|
90
|
+
- 修复以上 ❌ 项后重新提交
|
|
91
|
+
- 或确认 ⏭️ 项为不适用
|
|
92
|
+
```
|
package/README.md
CHANGED
|
@@ -1,169 +1,126 @@
|
|
|
1
1
|
# md-to-mowen
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[](https://opensource.org/licenses/MIT)
|
|
3
|
+
将 Markdown(GFM)转换为墨问笔记的 CLI 工具。
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-

|
|
9
|
-
|
|
10
|
-
## 功能特性
|
|
11
|
-
|
|
12
|
-
- **一键发布** — 单文件或整个目录批量发布
|
|
13
|
-
- **智能编辑** — 自动追踪文件与笔记映射,再次发布自动进入编辑模式
|
|
14
|
-
- **图片处理** — 本地图片/远程 URL 自动上传到墨问 OSS
|
|
15
|
-
- **表格渲染** — Markdown 表格自动渲染为高清 PNG 图片
|
|
16
|
-
- **双向转换** — 支持 NoteAtom JSON 导出为 Markdown
|
|
17
|
-
- **隐私控制** — 独立命令设置笔记公开/私密状态
|
|
18
|
-
- **配置持久化** — 保存常用选项,无需每次重复输入
|
|
19
|
-
|
|
20
|
-
## 快速开始
|
|
21
|
-
|
|
22
|
-
### 安装
|
|
5
|
+
## 安装
|
|
23
6
|
|
|
24
7
|
```bash
|
|
25
8
|
npm install -g md-to-mowen
|
|
26
9
|
```
|
|
27
10
|
|
|
28
|
-
|
|
11
|
+
或使用 npx:
|
|
29
12
|
|
|
30
13
|
```bash
|
|
31
|
-
md-to-mowen
|
|
14
|
+
npx md-to-mowen --version
|
|
32
15
|
```
|
|
33
16
|
|
|
34
|
-
|
|
17
|
+
## 使用
|
|
35
18
|
|
|
36
|
-
###
|
|
19
|
+
### 发布文章
|
|
37
20
|
|
|
38
21
|
```bash
|
|
39
|
-
#
|
|
40
|
-
md-to-mowen publish
|
|
22
|
+
# 基本发布
|
|
23
|
+
md-to-mowen publish article.md
|
|
41
24
|
|
|
42
|
-
#
|
|
43
|
-
md-to-mowen publish
|
|
25
|
+
# 指定封面图
|
|
26
|
+
md-to-mowen publish article.md --cover cover.png
|
|
44
27
|
|
|
45
|
-
#
|
|
46
|
-
md-to-mowen publish
|
|
28
|
+
# 严格模式
|
|
29
|
+
md-to-mowen publish article.md --strict
|
|
47
30
|
|
|
48
|
-
#
|
|
49
|
-
md-to-mowen publish
|
|
31
|
+
# 跳过表格转换
|
|
32
|
+
md-to-mowen publish article.md --no-table
|
|
50
33
|
```
|
|
51
34
|
|
|
52
|
-
|
|
35
|
+
### 检查文章质量
|
|
53
36
|
|
|
54
|
-
|
|
37
|
+
```bash
|
|
38
|
+
# 基本检查
|
|
39
|
+
md-to-mowen lint article.md
|
|
55
40
|
|
|
56
|
-
|
|
41
|
+
# 严格模式
|
|
42
|
+
md-to-mowen lint article.md --strict
|
|
57
43
|
|
|
58
|
-
|
|
59
|
-
md-to-mowen
|
|
44
|
+
# 自定义字数范围
|
|
45
|
+
md-to-mowen lint article.md --min-chars 200 --max-chars 5000
|
|
60
46
|
```
|
|
61
47
|
|
|
62
|
-
|
|
63
|
-
| ---------------------------- | -------------------------------------- |
|
|
64
|
-
| `-i, --input <path>` | Markdown 文件路径或目录(必填) |
|
|
65
|
-
| `--note-id <id>` | 编辑已有笔记(全量替换内容) |
|
|
66
|
-
| `--tags <tags>` | 标签,逗号分隔(如 `tech,ai`) |
|
|
67
|
-
| `--auto-publish` | 自动发布,非草稿状态 |
|
|
68
|
-
| `--dry-run` | 走完流水线但不调用 API |
|
|
69
|
-
| `--cache-dir <dir>` | 保存流水线产物用于调试 |
|
|
70
|
-
| `--code-block-style <style>` | 代码块样式:`paragraph` 或 `codeblock` |
|
|
71
|
-
| `--no-recursive` | 批量发布时不递归扫描子目录 |
|
|
72
|
-
|
|
73
|
-
### `privacy` — 设置隐私状态
|
|
48
|
+
### 上传图片
|
|
74
49
|
|
|
75
50
|
```bash
|
|
76
|
-
|
|
77
|
-
md-to-mowen privacy --note-id <id> --visibility public|private
|
|
78
|
-
|
|
79
|
-
# 通过文件路径(需要元数据支持)
|
|
80
|
-
md-to-mowen privacy -i article.md --visibility public
|
|
51
|
+
md-to-mowen upload image.png
|
|
81
52
|
```
|
|
82
53
|
|
|
83
|
-
|
|
54
|
+
## 配置
|
|
84
55
|
|
|
85
|
-
|
|
86
|
-
md-to-mowen to-markdown -i note.json -o output.md
|
|
87
|
-
```
|
|
56
|
+
### API Key
|
|
88
57
|
|
|
89
|
-
|
|
58
|
+
设置环境变量:
|
|
90
59
|
|
|
91
60
|
```bash
|
|
92
|
-
|
|
61
|
+
export MOWEN_API_KEY=your-api-key
|
|
93
62
|
```
|
|
94
63
|
|
|
95
|
-
|
|
64
|
+
或在命令中指定:
|
|
96
65
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
```json
|
|
100
|
-
{
|
|
101
|
-
"defaultTags": "tech,programming",
|
|
102
|
-
"autoPublish": false,
|
|
103
|
-
"cacheDir": "./.cache",
|
|
104
|
-
"codeBlockStyle": "paragraph"
|
|
105
|
-
}
|
|
66
|
+
```bash
|
|
67
|
+
md-to-mowen publish article.md --api-key your-api-key
|
|
106
68
|
```
|
|
107
69
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
## Markdown 支持
|
|
111
|
-
|
|
112
|
-
| 语法 | 输出 |
|
|
113
|
-
| ------------------------------ | --------------------------- |
|
|
114
|
-
| 标题 H1-H6 | 粗体段落(层级丢失) |
|
|
115
|
-
| 有序/无序列表 | 带前缀的段落 |
|
|
116
|
-
| 引用块 | 墨问引用块 |
|
|
117
|
-
| **粗体** / _斜体_ / ~~删除线~~ | 对应标记 |
|
|
118
|
-
| `行内代码` | 代码标记 |
|
|
119
|
-
| [链接](url) | 链接标记 |
|
|
120
|
-
| 图片 | 上传后插入 |
|
|
121
|
-
| 代码块 | 每行带代码标记 / 渲染为图片 |
|
|
122
|
-
| 表格 | 渲染为 PNG 图片 |
|
|
123
|
-
|
|
124
|
-
## 项目结构
|
|
70
|
+
## 质量检查项
|
|
125
71
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
│ ├── pipeline/ # Markdown → HAST → MAST
|
|
132
|
-
│ ├── mast/ # 中间 AST 类型与序列化
|
|
133
|
-
│ ├── noteatom/ # NoteAtom 类型和双向转换
|
|
134
|
-
│ ├── mowen/ # API 客户端和上传
|
|
135
|
-
│ ├── publish/ # 发布流水线编排
|
|
136
|
-
│ └── shared/ # 工具函数
|
|
137
|
-
├── tests/ # 单元测试
|
|
138
|
-
└── docs/ # 学习指南与架构文档
|
|
139
|
-
```
|
|
72
|
+
1. **配图检查** - 必须有封面图或内嵌图片
|
|
73
|
+
2. **表格检查** - 有表格必须已转换为图片
|
|
74
|
+
3. **标题层级** - H1→H2→H3,不能跳级
|
|
75
|
+
4. **文章长度** - 建议 100-10000 字
|
|
76
|
+
5. **特殊标记** - 无 TODO/FIXME 等占位符
|
|
140
77
|
|
|
141
78
|
## 开发
|
|
142
79
|
|
|
143
80
|
```bash
|
|
81
|
+
# 克隆仓库
|
|
82
|
+
git clone https://github.com/momolibrary/md-to-mowen.git
|
|
83
|
+
cd md-to-mowen
|
|
84
|
+
|
|
144
85
|
# 安装依赖
|
|
145
86
|
npm install
|
|
146
87
|
|
|
147
|
-
# 运行测试
|
|
148
|
-
npm test
|
|
149
|
-
|
|
150
|
-
# 类型检查
|
|
151
|
-
npm run check
|
|
152
|
-
|
|
153
88
|
# 构建
|
|
154
89
|
npm run build
|
|
155
90
|
|
|
156
|
-
#
|
|
157
|
-
npm
|
|
91
|
+
# 测试
|
|
92
|
+
npm test
|
|
93
|
+
|
|
94
|
+
# 代码检查
|
|
95
|
+
npm run lint
|
|
158
96
|
```
|
|
159
97
|
|
|
160
|
-
##
|
|
98
|
+
## 项目结构
|
|
161
99
|
|
|
162
|
-
|
|
163
|
-
-
|
|
100
|
+
```
|
|
101
|
+
md-to-mowen/
|
|
102
|
+
├── src/
|
|
103
|
+
│ ├── cli.ts # CLI 入口
|
|
104
|
+
│ ├── index.ts # 核心导出
|
|
105
|
+
│ ├── commands/
|
|
106
|
+
│ │ └── publish.ts # 发布命令
|
|
107
|
+
│ └── core/
|
|
108
|
+
│ ├── api.ts # 墨问 API
|
|
109
|
+
│ ├── auth.ts # 授权管理
|
|
110
|
+
│ ├── extract-prompt.ts # 提示词提取
|
|
111
|
+
│ ├── lint.ts # 质量检查
|
|
112
|
+
│ ├── markdown.ts # Markdown 转换
|
|
113
|
+
│ ├── table.ts # 表格处理
|
|
114
|
+
│ └── upload.ts # 图片上传
|
|
115
|
+
├── tests/
|
|
116
|
+
│ ├── fixtures/ # 测试种子
|
|
117
|
+
│ ├── unit/ # 单元测试
|
|
118
|
+
│ └── integration/ # 集成测试
|
|
119
|
+
└── skill/
|
|
120
|
+
├── SKILL.md # Claude Code Skill
|
|
121
|
+
└── publish.sh # Skill wrapper
|
|
122
|
+
```
|
|
164
123
|
|
|
165
124
|
## License
|
|
166
125
|
|
|
167
126
|
MIT
|
|
168
|
-
|
|
169
|
-
# md-to-mowen
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
package/dist/cli/index.js
CHANGED