@topmindspace/tms-skills 0.2.0 → 0.3.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 (43) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.en.md +47 -12
  3. package/README.md +46 -11
  4. package/bin/tms-skills.js +35 -5
  5. package/package.json +1 -1
  6. package/top-ppt-html/README.en.md +2 -2
  7. package/top-ppt-html/README.md +3 -3
  8. package/top-ppt-html/SKILL.md +4 -5
  9. package/top-ppt-html/references/modes.md +1 -1
  10. package/top-ppt-html/scripts/audit_docs.py +24 -0
  11. package/top-ppt-html/scripts/audit_skill.py +2 -2
  12. package/top-ppt-html/scripts/build_pptx.js +36 -0
  13. package/top-ppt-html/scripts/package_skill.py +3 -3
  14. package/topmind-cover/README.en.md +51 -0
  15. package/topmind-cover/README.md +17 -6
  16. package/topmind-cover/SKILL.md +25 -7
  17. package/topmind-cover/assets/examples/README.md +29 -0
  18. package/topmind-cover/assets/examples/big-poster-wechat.png +0 -0
  19. package/topmind-cover/assets/examples/big-poster.png +0 -0
  20. package/topmind-cover/assets/examples/cyber-glitch-wechat.png +0 -0
  21. package/topmind-cover/assets/examples/cyber-glitch.png +0 -0
  22. package/topmind-cover/assets/examples/guochao-wechat.png +0 -0
  23. package/topmind-cover/assets/examples/guochao.png +0 -0
  24. package/topmind-cover/assets/examples/magazine-wechat.png +0 -0
  25. package/topmind-cover/assets/examples/magazine.png +0 -0
  26. package/topmind-cover/assets/examples/minimal-wechat.png +0 -0
  27. package/topmind-cover/assets/examples/minimal.png +0 -0
  28. package/topmind-cover/assets/examples/tech-future-wechat.png +0 -0
  29. package/topmind-cover/assets/examples/tech-future.png +0 -0
  30. package/topmind-cover/references/cover-styles.md +174 -21
  31. package/topmind-cover/scripts/audit_docs.py +22 -0
  32. package/topmind-cover/scripts/crop-cover.py +1 -2
  33. package/topmind-wechat-post/README.en.md +63 -0
  34. package/topmind-wechat-post/README.md +16 -0
  35. package/topmind-wechat-post/SKILL.md +22 -13
  36. package/topmind-wechat-post/references/typography-rules.md +1 -1
  37. package/topmind-wechat-post/references/writing-quality.md +2 -2
  38. package/topmind-wechat-post/scripts/audit_docs.py +22 -0
  39. package/topmind-x-article/README.en.md +46 -0
  40. package/topmind-x-article/README.md +13 -2
  41. package/topmind-x-article/SKILL.md +13 -4
  42. package/topmind-x-article/scripts/audit_docs.py +22 -0
  43. package/topmind-x-article/scripts/md2x.py +5 -3
@@ -1,20 +1,23 @@
1
1
  ---
2
2
  name: topmind-cover
3
- version: 1.0.0
4
- description: "文章封面配图生成:X 长文与公众号共用。震撼、醒目、主题突出;平台尺寸规范、风格模板、命名落盘、成图检查一次配齐。Use when 封面、封面图、头图、配图、cover。Do NOT use for 正文插图、PPT/报告封面。"
3
+ version: 0.1.0
4
+ description: "文章封面配图生成:X 长文与公众号共用。震撼、醒目、主题突出;平台尺寸规范、风格模板、命名落盘、成图检查全流程覆盖。Use when 封面、封面图、头图、配图、cover。Do NOT use for 正文插图、PPT/报告封面。"
5
5
  action_category: write
6
6
  triggers:
7
7
  - 封面
8
8
  - 封面图
9
9
  - 头图
10
10
  - 配图
11
+ - 缩略图
11
12
  - cover
13
+ - thumbnail
12
14
  triggers_cn:
13
15
  - 公众号封面
14
16
  - X 封面
15
17
  - 文章封面
16
- author: Muse
18
+ author: TopMindspace
17
19
  license: MIT
20
+ homepage: https://github.com/topmindspace/tms-skills#readme
18
21
  updated: 2026-09-29
19
22
  ---
20
23
 
@@ -37,16 +40,25 @@ updated: 2026-09-29
37
40
 
38
41
  ## 工作流
39
42
 
40
- 1. **输入**:文章标题、3 个主题关键词、平台(`x` / `wechat` / `both`,默认 both)、风格(默认按题材自动选,见 `references/cover-styles.md`)。
41
- 2. **组 prompt**:`[风格模板] + 主体描述 + 大标题字(≤10 字,直接用文章标题或其压缩版)+ 横构图16:9 + 四周留白8%`。标题字必须在 prompt 里逐字写明,防 AI 自造错别字。
43
+ 0. **选风格(三步,必做)**:
44
+ ① 按题材从 `references/cover-styles.md` 选 1 种风格(6 选 1);
45
+ ② 看 `assets/examples/<style>.png` 示例图,确认视觉语言符合预期;
46
+ ③ 按该风格的 prompt 配方组 prompt(把 `{TITLE}` 换成实际标题)。
47
+ 示例清单见 `assets/examples/README.md`。
48
+ 1. **输入**:文章标题、3 个主题关键词、平台(`x` / `wechat` / `both`,默认 both)、
49
+ 风格(默认按题材自动选,见 `references/cover-styles.md`)。
50
+ 平台只影响生成 prompt 的侧重;裁剪落盘永远产出双尺寸。
51
+ 2. **组 prompt**:按 `references/cover-styles.md` 对应风格的配方组装
52
+ (标题 ≤10 字逐字写明,防 AI 自造错别字)。
42
53
  3. **生成**:`media.generate_image`,`name` 用 `<slug>-cover`。
43
54
  4. **检查**(必做,肉眼看一遍):
44
55
  - 标题字逐字正确,无错别字、无多字少字
45
56
  - 主体完整不被裁切,画面不杂乱
46
57
  - 一眼能说出主题;说不出就重生成
58
+ - 900×383 版复查:标题字、关键主体不被中央裁剪裁掉(见风格库"安全区铁律")
47
59
  5. **裁剪落盘**:
48
60
  ```bash
49
- python3 scripts/crop-cover.py <主图> --slug <slug> --out-dir <包>/images/
61
+ python3 scripts/crop-cover.py <主图> --out-dir <包>/images/
50
62
  ```
51
63
  产出 `00-封面.png`(1200×675,X/公众号共用主文件)与 `00-封面-公众号.png`(900×383)。
52
64
  公众号包规约:正文引用 `images/00-封面.png`,`图片上传清单.md` 登记两版。
@@ -56,9 +68,15 @@ updated: 2026-09-29
56
68
 
57
69
  - 一图一主题;主体占画面 40% 以上,居中或三分法
58
70
  - 大标题 ≤10 字,高对比(暗底亮字 / 亮底深字)
59
- - 四周 8% 安全边距,标题不贴边
71
+ - 四周 8% 安全边距,标题不贴边;标题字另须满足中央垂直 60% 安全区(见风格库"安全区铁律")
60
72
  - 忌:元素堆砌、小字密排、多主体打架、标题字错误
61
73
 
74
+ ## 外部依赖 / 规约来源
75
+
76
+ - "公众号包规约"(正文引用 `images/00-封面.png`、`图片上传清单.md` 登记两版)
77
+ 来自用户侧 workbuddy 环境,仓库内无此文件;缺失时仍按固定命名落盘,
78
+ 不阻塞核心流程。
79
+
62
80
  ## When NOT to use
63
81
 
64
82
  - 正文插图:主体是文字说明,按正文配图流程走
@@ -0,0 +1,29 @@
1
+ # 封面风格示例图
2
+
3
+ 6 种风格 × 2 种尺寸 = 12 张示例(共约 6.4MB,随 npm 包发布,npx 安装即得):
4
+
5
+ - `<style>.png`(1200×675,X 长文封面 / 公众号共用主尺寸)
6
+ - `<style>-wechat.png`(900×383,公众号封面大图,`scripts/crop-cover.py` 中央裁剪版)
7
+
8
+ | 文件 | 风格 | 适用场景(一句话) |
9
+ |------|------|--------------------|
10
+ | `big-poster.png` / `big-poster-wechat.png` | 震撼大字报 | 观点评论、行业观察、热点快评,"一句话立场"类文章默认选它 |
11
+ | `tech-future.png` / `tech-future-wechat.png` | 科技未来感 | AI/大模型/智能体/前沿技术题材,X 长文科技类默认风格 |
12
+ | `magazine.png` / `magazine-wechat.png` | 杂志编辑风 | 深度访谈、人物特写、商业分析,需要质感与信任感时用它 |
13
+ | `minimal.png` / `minimal-wechat.png` | 极简留白 | 随笔、书评、轻观点,给版面"呼吸感"的穿插封面 |
14
+ | `guochao.png` / `guochao-wechat.png` | 国潮插画 | 传统文化、历史、节气、非遗、国货品牌,节日特辑首选 |
15
+ | `cyber-glitch.png` / `cyber-glitch-wechat.png` | 赛博故障艺术 | 网络文化、赛博朋克、前沿实验,年轻化/亚文化话题 |
16
+
17
+ 详细配方(配色 hex / 字体 / 中英 prompt / 避坑)见 `../references/cover-styles.md`。
18
+
19
+ ## 安全区说明(重要)
20
+
21
+ 所有示例的标题字都落在**中央垂直 60% 安全区**内——这正是 `900×383` 中央裁剪版标题不被裁掉的原因。
22
+ 自己组 prompt 时务必遵守:标题/关键主体不得超出上下各 13% 的禁区,否则公众号版会被切掉。
23
+ 反例:标题压在顶部 15% 处时,`-wechat.png` 里只剩半截字(第一版 tech-future/guochao 示例即如此,已修正)。
24
+
25
+ ## 复用声明
26
+
27
+ **示例图可直接拿去用/改,作封面底图或风格参考。**
28
+ 拿去用时建议按 `scripts/crop-cover.py` 的流程重新裁剪双尺寸并按包规约命名落盘;
29
+ 改图时保留原风格的配色与版式语言,只换主体与标题字,以维持系列感。
@@ -1,40 +1,193 @@
1
- # 封面风格模板
1
+ # 封面风格库(6 种)
2
2
 
3
3
  选风格先看题材,再看系列延续性。同一系列固定一个模板,只换主体与标题字。
4
+ 选风格三步走:**先选风格 → 看 `assets/examples/` 对应示例图 → 按本库配方组 prompt**。
4
5
 
5
- ## 科技深空(默认 · AI/技术题材)
6
+ 每种风格的 prompt 配方都是中英双语模板:`{TITLE}` 为标题文字占位符(≤10 字,
7
+ 示例图上用 2~6 字短标题),尺寸固定 1200×675、横构图 16:9。
6
8
 
7
- - 深色底(藏青/墨黑)+ 霓虹线条 + 细颗粒星空
8
- - 主体:产品/人物半身,面光干净
9
- - 标题:白色粗黑,字号压住上 1/3
10
- - 例:Manus 2.0、Cue、AI 智能体题材
9
+ ## 安全区铁律(所有风格通用)
11
10
 
12
- ## 清新浅色(人物/生活/轻题材)
11
+ 900×383 公众号版是从 1200×675 主图**中央裁剪**(上下各裁约 12.2%):
12
+ **标题字与关键主体必须落在画面中央垂直 60% 安全区内**
13
+ (上下各预留 13%+ 不放标题字),否则公众号版会被裁掉。
14
+ 选风格、组 prompt、检查成图时都要先过这一条;以下各风格的标题位置描述
15
+ 均已按此约束书写。
13
16
 
14
- - 米白/浅灰底 + 柔光 + 大面积留白
15
- - 主体居中,神态自然
16
- - 标题:深灰细黑,落在下方 1/4
17
- - 例:卡牌系列人物、随笔
17
+ ---
18
18
 
19
- ## 国潮撞色(文化/历史题材)
19
+ ## 1. big-poster · 震撼大字报
20
20
 
21
- - 朱红/黛青撞色 + 传统纹样暗纹
22
- - 主体:国风人物或器物
23
- - 标题:书法感粗体,竖排亦可
21
+ - **适用场景**:观点评论、行业观察、热点快评;X 长文首图、公众号头图都适用,
22
+ 是"一句话立场"类文章的默认选择。
23
+ - **配色方案**:主色深红 `#C8102E`(或墨黑 `#111111` 做深色版),
24
+ 辅色明黄 `#FFC400`(点缀线条/印章),文字色纯白 `#FFFFFF`。
25
+ - **字体建议**:中文标题用 Noto Sans SC Black / 思源黑体 Heavy,
26
+ 标题字号占画面高度 28%~35%,字距紧凑,可做轻微倾斜或描边增强冲击力。
27
+ - **prompt 配方**:
28
+ ```
29
+ 中文:震撼中文大字报风格封面,纯深红底色配黑色斜切色块,纸张颗粒质感,
30
+ 画面中央巨型白色粗黑标题"{TITLE}",占画面一半,极简构图,高对比,
31
+ 横构图16:9,尺寸1200×675,除标题外无其他文字。
24
32
 
25
- ## 硬核评测(产品评测题材)
33
+ EN: Bold Chinese big-character poster style cover, solid crimson red
34
+ background with black diagonal bands, subtle paper grain. Giant bold white
35
+ Chinese title "{TITLE}" dominates the center, half the frame. Minimal
36
+ composition, high contrast, landscape 16:9, 1200x675, no other text.
37
+ ```
38
+ - **避坑**:
39
+ - 标题超过 10 个字必翻车——大字报风格下长标题会被模型挤成小字或错字;
40
+ 长标题先压缩再生成。
41
+ - 忌加副标题/英文小字/日期:模型极易在小字上造错别字,且破坏冲击力。
42
+ - 深色版(墨黑底)配白字时,检查文字与背景对比度,边缘加细描边防"糊"。
26
43
 
27
- - 深灰底 + 产品特写 + 数据流装饰
28
- - 标题:黄/白撞色,配 1 个核心数字(如"32%")
29
- - 忌:数字必须与正文一致,承重数字先核实
44
+ ## 2. tech-future · 科技未来感
30
45
 
31
- ## 通用 prompt 组装公式
46
+ - **适用场景**:AI/大模型/智能体/前沿技术题材;X 长文科技类默认风格,
47
+ Manus / Cue / Agent 这类题材首选。
48
+ - **配色方案**:主色深空藏青 `#0A1628`(近黑),辅色霓虹蓝 `#38BDF8`、
49
+ 电光紫 `#A78BFA`(渐变光效),文字色纯白 `#FFFFFF`。
50
+ - **字体建议**:中文标题用 Noto Sans SC Bold,字号占画面高度 18%~24%,
51
+ 落在画面上部、中央垂直安全区内;英文/数字点缀可用 Rajdhani 或 DIN 风格细体(仅作装饰字,
52
+ 必须人工核对拼写)。
53
+ - **prompt 配方**:
54
+ ```
55
+ 中文:科技未来感封面,深空藏青近黑背景,霓虹蓝色电路线条与细颗粒星空,
56
+ 中央主体为发光的抽象AI核心光球,边缘光干净,画面上部、中央垂直安全区内
57
+ 白色粗黑中文标题"{TITLE}",电影感光影,极简不堆砌,横构图16:9,尺寸1200×675,
58
+ 除标题外无其他文字。
59
+
60
+ EN: Futuristic tech cover, deep navy-black space background with glowing
61
+ neon-blue circuit lines and fine starfield particles. A sleek abstract
62
+ glowing AI core orb as central subject with clean rim light. Bold white
63
+ Chinese title "{TITLE}" in the upper third. Cinematic lighting, minimal,
64
+ landscape 16:9, 1200x675, no other text.
65
+ ```
66
+ - **避坑**:
67
+ - 霓虹元素别超过 2 种颜色,三色以上画面立刻变"杀马特"。
68
+ - 主体(光球/芯片/机器人)必须完整不被裁切,且占画面 40% 以上,
69
+ 否则标题和背景会"各说各话"。
70
+ - 星空颗粒开太大容易显脏:要求"细颗粒"而非"密集星空"。
71
+
72
+ ## 3. magazine · 杂志编辑风
73
+
74
+ - **适用场景**:深度访谈、人物特写、商业分析、年度盘点;公众号长文首选,
75
+ 需要"质感/信任感"时用它。
76
+ - **配色方案**:主色暖灰 `#E8E4DC`(浅底)或墨黑 `#141414`(深底版),
77
+ 辅色砖红 `#B03A2E`(细线/点缀),文字色炭黑 `#2B2B2B`(浅底)/
78
+ 米白 `#F5F1E8`(深底)。
79
+ - **字体建议**:中文标题用 Noto Serif SC Bold(宋体感)或思源黑体 Bold,
80
+ 字号占画面高度 14%~20%,落在左侧下方、中央垂直安全区内;标题上方配一条细色线,
81
+ 杂志感立刻出来。
82
+ - **prompt 配方**:
83
+ ```
84
+ 中文:杂志编辑风封面,暖灰色影棚背景,右侧三分之一处黑白质感人物肖像,
85
+ 左侧大面积留白,左侧下方(中央垂直安全区内)炭黑色典雅粗体中文标题"{TITLE}",标题上方一条砖红
86
+ 色细线,克制高级,杂志封面美学,横构图16:9,尺寸1200×675,除标题外无其他文字。
87
+
88
+ EN: Editorial magazine style cover, warm light-gray studio background,
89
+ dramatic black-and-white portrait in the right third, generous negative
90
+ space on the left. Dark charcoal elegant bold Chinese title "{TITLE}" at
91
+ lower left, with a thin brick-red rule line above it. Refined, minimal,
92
+ magazine cover aesthetic, landscape 16:9, 1200x675, no other text.
93
+ ```
94
+ - **避坑**:
95
+ - 人物肖像必须用"泛指"描述(商务人士/学者剪影),不得出现可识别的真实人物长相;
96
+ 隐私红线。
97
+ - 留白区别手痒加装饰字——杂志风的力量全在克制,加元素必俗。
98
+ - 深底版和浅底版不要混用:同一系列固定一种底色。
99
+
100
+ ## 4. minimal · 极简留白
101
+
102
+ - **适用场景**:随笔、书评、轻观点、生活感悟;公众号"轻阅读"类文章,
103
+ 或系列中需要"呼吸感"的穿插封面。
104
+ - **配色方案**:主色米白 `#F7F4EC`(或冷白 `#F2F4F6`),
105
+ 辅色淡墨 `#9AA0A6`(小面积点缀),文字色深灰 `#3A3A3A`。
106
+ - **字体建议**:中文标题用 Noto Sans SC Medium(不要用 Black,太重),
107
+ 字号占画面高度 8%~12%,落在左下角、中央垂直安全区内,留白 ≥60%。
108
+ - **prompt 配方**:
109
+ ```
110
+ 中文:极致极简主义封面,暖米白背景,大面积留白,一处微小的水墨笔触
111
+ (如孤鸟剪影)点缀在画面右侧中央(中央垂直安全区内),左下角(中央垂直安全区内)
112
+ 小字号深灰色中文标题"{TITLE}",呼吸感强,禅意,横构图16:9,尺寸1200×675,除标题外无其他文字。
113
+
114
+ EN: Extreme minimalism cover, warm off-white background with vast empty
115
+ space, one tiny ink-brush stroke (like a lone bird silhouette) near the
116
+ center-right. Small dark-gray Chinese title "{TITLE}" in delicate bold type
117
+ at the lower-left corner. Calm, airy, zen aesthetic, landscape 16:9,
118
+ 1200x675, no other text.
119
+ ```
120
+ - **避坑**:
121
+ - 极简风对"杂物"零容忍:模型爱加云/山/多余笔触,prompt 里明确"一处""微小""无其他元素"。
122
+ - 标题字别贪大:字一大立刻变"大字报",极简感全失。
123
+ - 公众号 900×383 中央裁剪会吃掉左右留白——主体和标题尽量往中央安全区放。
124
+
125
+ ## 5. guochao · 国潮插画
126
+
127
+ - **适用场景**:传统文化、历史、节气、非遗、国货品牌题材;公众号文化类、
128
+ 节日特辑首选。
129
+ - **配色方案**:主色朱红 `#D43D2A`,辅色黛青 `#2F4F4F`、鎏金 `#C9A86A`
130
+ (标题/纹样),文字色金 `#C9A86A` 或米白 `#F5EFE0`。
131
+ - **字体建议**:中文标题用书法感粗体(站酷快乐体/演示佛系体风格描述,
132
+ 或 Noto Serif SC Black),字号占画面高度 20%~28%,可竖排,
133
+ 落在上方(中央垂直安全区内)或中央。
134
+ - **prompt 配方**:
135
+ ```
136
+ 中文:国潮插画风封面,朱红与黛青大色块碰撞,祥云海浪传统纹样作暗纹背景,
137
+ 中央主体为风格化国风人物或神兽插画,上方(中央垂直安全区内)鎏金书法感
138
+ 中文标题"{TITLE}",浓烈鲜明,文化感,横构图16:9,尺寸1200×675,除标题外无其他文字。
139
+
140
+ EN: Guochao Chinese-trendy illustration cover, bold vermilion red and dark
141
+ teal color blocks, traditional cloud-and-wave patterns as subtle background
142
+ texture. Stylized Chinese-style figure or mythical beast illustration as
143
+ central subject. Golden calligraphy-style Chinese title "{TITLE}" at the
144
+ top. Vibrant, cultural, landscape 16:9, 1200x675, no other text.
145
+ ```
146
+ - **避坑**:
147
+ - 忌用真实历史人物/文物高精度复刻做主体——一是版权风险,二是模型画不准;
148
+ 用"风格化插画"表述。
149
+ - 朱红+黛青+鎏金已是三色上限,别再加第四色。
150
+ - 竖排标题时检查字序:模型偶发把竖排字写成横排或倒序,生成后逐字核对。
151
+
152
+ ## 6. cyber-glitch · 赛博故障艺术
153
+
154
+ - **适用场景**:网络文化、赛博朋克题材、前沿实验、数字艺术评论;
155
+ X 长文年轻化/亚文化话题,公众号慎用(读者年龄层偏大时跳过)。
156
+ - **配色方案**:主色深黑 `#0D0D12`,辅色品红 `#FF2E88`、电青 `#00E5FF`
157
+ (RGB 分离故障色),文字色白 `#FFFFFF`(带品红/青色错位重影)。
158
+ - **字体建议**:中文标题用 Noto Sans SC Black,字号占画面高度 18%~25%,
159
+ 居中,允许轻微 RGB 错位/扫描线质感,但笔画必须完整可辨认。
160
+ - **prompt 配方**:
161
+ ```
162
+ 中文:赛博故障艺术风封面,深黑背景,RGB通道分离错位、扫描线与数字噪点,
163
+ 霓虹品红与电青色块碎裂,中央主体为像素化消散的全息人脸/城市剪影,
164
+ 中央白色粗黑中文标题"{TITLE}"带轻微故障错位,笔画完整可辨认,
165
+ 前卫,数字 decay 美学,横构图16:9,尺寸1200×675,除标题外无其他文字。
166
+
167
+ EN: Cyberpunk glitch art cover, dark black background with RGB channel-split
168
+ distortion, scanlines and digital noise, neon magenta and cyan shards. A
169
+ fragmented holographic face / city silhouette dissolving into pixels at
170
+ center. Bold white Chinese title "{TITLE}" with slight glitch offset at the
171
+ center, strokes complete and legible. Edgy, digital decay aesthetic,
172
+ landscape 16:9, 1200x675, no other text.
173
+ ```
174
+ - **避坑**:
175
+ - 故障特效开度要收:标题笔画一旦被" glitch" 吃掉变成乱码,整张图作废;
176
+ 明确要求"笔画完整可辨认"。
177
+ - 噪点/扫描线过密会在公众号小图上糊成一团——要求"适度噪点"。
178
+ - 该风格视觉刺激强,连续多篇使用会疲劳:系列中最多穿插 1~2 次。
179
+
180
+ ---
181
+
182
+ ## 通用组装公式(沿用)
32
183
 
33
184
  ```
34
185
  {风格模板一句话},主体:{主体描述},
35
- 画面中央大标题“{≤10字标题}”,{暗底亮字/亮底深字},
186
+ 画面中央大标题"{≤10字标题}",{暗底亮字/亮底深字},
36
187
  横构图16:9,主体占画面40%以上,四周留白8%,
37
188
  极简,不堆砌元素,电影感光影
38
189
  ```
39
190
 
40
191
  标题字逐字写进 prompt;生成后第一件事就是检查标题字。
192
+ 示例图在 `assets/examples/`(`<style>.png` 1200×675 主图 + `<style>-wechat.png`
193
+ 900×383 公众号裁剪版),选风格前先看图。
@@ -48,6 +48,28 @@ def main() -> None:
48
48
  check(False, f"{rel} 悬空链接: {link}")
49
49
  check(True, "内部 md 链接可达")
50
50
 
51
+ # 反引号代码引用中的路径可达(审计 轻微-15 门禁盲区:之前只查 [text](path) 形式,
52
+ # `references/pan-style.md` 这类反引号引用曾漏网)。抓取反引号内的 references/*.md
53
+ # 与 scripts/* 路径并校验存在;glob/占位符写法(* ? < > |)跳过。
54
+ backtick_path_re = re.compile(r"(references|scripts)/([\w.\-/]+)")
55
+ line_suffix_re = re.compile(r":\d+(?:-\d+)?$")
56
+ backtick_bad = 0
57
+ for md in md_files:
58
+ text = md.read_text(encoding="utf-8")
59
+ rel = md.relative_to(ROOT).as_posix()
60
+ for span in set(re.findall(r"`([^`]+)`", text)):
61
+ for kind, p in backtick_path_re.findall(span):
62
+ p = line_suffix_re.sub("", p)
63
+ if not p or any(c in p for c in "*?<>|"):
64
+ continue
65
+ target = md.parent / kind / p
66
+ if not target.exists():
67
+ target = ROOT / kind / p
68
+ if not target.exists():
69
+ backtick_bad += 1
70
+ check(False, f"{rel} 反引号引用不可达: `{kind}/{p}`")
71
+ check(backtick_bad == 0, f"反引号内 references/scripts 引用可达(扫描 {len(md_files)} 个 md 文件)")
72
+
51
73
  if errors:
52
74
  print(f"\n[audit_docs] {NAME}: {len(errors)} 项失败")
53
75
  sys.exit(1)
@@ -2,7 +2,7 @@
2
2
  """封面图裁剪:从 16:9 主图中央裁出公众号 2.35:1 版,并统一落盘命名。
3
3
 
4
4
  用法:
5
- python3 crop-cover.py <主图路径> --slug <slug> --out-dir <包>/images/
5
+ python3 crop-cover.py <主图路径> --out-dir <包>/images/
6
6
 
7
7
  产出:
8
8
  <out-dir>/00-封面.png 1200x675 (X / 公众号共用主文件)
@@ -26,7 +26,6 @@ TARGETS = {
26
26
  def main() -> None:
27
27
  ap = argparse.ArgumentParser()
28
28
  ap.add_argument("src", help="16:9 主图路径")
29
- ap.add_argument("--slug", default="cover")
30
29
  ap.add_argument("--out-dir", required=True)
31
30
  args = ap.parse_args()
32
31
 
@@ -0,0 +1,63 @@
1
+ # topmind-wechat-post · WeChat Article Authoring
2
+
3
+ **[中文](./README.md)** | English
4
+
5
+ Full lifecycle for WeChat articles: delivery package, review & rewrite, three quality gates, status sync, WeChat inline typography, and publish checklist.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npx @topmindspace/tms-skills install topmind-wechat-post
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```bash
16
+ export TOPMIND_WORKSPACE=/path/to/workspace # recommended; or point the delivery package root with --base
17
+
18
+ # Create a new delivery package
19
+ python3 scripts/new-article.py --slug demo --title "标题" --direction reverse
20
+
21
+ # Typography lint + auto-fix
22
+ python3 scripts/lint-wechat.py --input <package>/公众号稿.md --fix
23
+
24
+ # De-AI-flavor scan (target ≥ 85)
25
+ python3 scripts/scan_ai_flavor.py <package>/公众号稿.md
26
+
27
+ # Markdown → fully inline HTML (--embed-images is mandatory, or pasted images go missing)
28
+ python3 scripts/md2wechat.py --input <package>/公众号稿.md --out-dir <package> --slug demo --embed-images
29
+
30
+ # Status sync
31
+ python3 scripts/sync-status.py --set 定稿 <package> --apply
32
+ ```
33
+
34
+ Scripts use Python stdlib only — zero dependencies.
35
+
36
+ ## Three paths
37
+
38
+ - **forward**: draft → WeChat article (review & rewrite)
39
+ - **reverse**: original topic → WeChat article → optional pushback
40
+ - **curated web**: online curated sources → handled as reverse
41
+
42
+ ## Three quality gates
43
+
44
+ Facts (first-hand sources) / logic (structural consistency) / copy (de-AI-flavor ≥ 85).
45
+
46
+ ## Related skills
47
+
48
+ - Cover art → `topmind-cover` (shared X long-form / WeChat cover)
49
+ - X long-form → `topmind-x-article` (Markdown draft → one-click X publish package)
50
+
51
+ ## External dependencies
52
+
53
+ The following skills live **outside this repo** (usually provided by the user's local workbuddy environment). Missing ones degrade or disable the corresponding capability; all scripts in this repo still work fully:
54
+
55
+ - `humanizer-zh`: fidelity boundaries for Chinese de-AI-flavor; without it the "de-AI-flavor only, no typesetting" path is unavailable.
56
+ - `qu-aiwei-zh`: Chinese de-AI-flavor scan targeting; `scripts/scan_ai_flavor.py` shares its origin and can substitute when missing (scan targeting degrades).
57
+
58
+ ## Development
59
+
60
+ ```bash
61
+ python3 scripts/package_skill.py --check
62
+ python3 scripts/negative_tests.py
63
+ ```
@@ -1,5 +1,7 @@
1
1
  # topmind-wechat-post · 公众号创作技能
2
2
 
3
+ [English](./README.en.md) | 中文
4
+
3
5
  公众号文章全生命周期:交付包、审校改写、质量三关、状态同步、微信内联排版与发布清单。
4
6
 
5
7
  ## 安装
@@ -41,6 +43,20 @@ python3 scripts/sync-status.py --set 定稿 <包> --apply
41
43
 
42
44
  事实(一手来源)/ 逻辑(结构一致)/ 文字(去 AI 味 ≥85)。
43
45
 
46
+ ## 相关技能
47
+
48
+ - 封面配图 → `topmind-cover`(X 长文 / 公众号共用封面)
49
+ - X 长文 → `topmind-x-article`(Markdown 原稿一键转 X 发布包)
50
+
51
+ ## 外部依赖
52
+
53
+ 本技能工作流会路由到以下**仓库外**技能(不含于本仓库,一般随用户侧 workbuddy
54
+ 环境提供)。缺失时对应能力降级/不可用,不影响本仓库脚本的全部功能:
55
+
56
+ - `humanizer-zh`:中文去 AI 味的保真边界;缺失时「只去 AI 味不排版」路径不可用。
57
+ - `qu-aiwei-zh`:中文去 AI 味扫描定位;`scripts/scan_ai_flavor.py` 与其同源,
58
+ 缺失时可用仓库内脚本替代,扫描定位能力降级。
59
+
44
60
  ## 开发
45
61
 
46
62
  ```bash
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: topmind-wechat-post
3
- description: "公众号文章全生命周期技能:交付包、审校改写、质量三关(事实/逻辑/去AI味)、状态同步、微信内联排版与发布清单。Use when 写公众号、公众号排版、定稿、发公众号。Do NOT use for 只改错别字、小红书/知乎、纯网页发布。"
3
+ version: 0.1.0
4
+ description: "管一篇公众号文章从选题/底稿到发布的完整生命周期:交付包搭建、审校改写、质量三关(事实/逻辑/去AI味)、状态同步、微信内联排版与发布清单。Use when 写公众号、公众号排版、公众号定稿、发公众号。Do NOT use for 只改错别字、小红书/知乎、纯网页发布。"
5
+ action_category: write
4
6
  triggers:
5
7
  - 公众号
6
8
  - 微信排版
@@ -12,10 +14,13 @@ triggers:
12
14
  - 公众号交付
13
15
  - wechat
14
16
  - mp format
15
- tags: [wechat, typography, formatting, publishing, markdown, write]
16
- author: TopMindSpace
17
+ triggers_cn:
18
+ - 写公众号文章
19
+ - 公众号排版定稿
20
+ - 公众号发布清单
21
+ author: TopMindspace
17
22
  license: MIT
18
- homepage: https://github.com/topmindspace/tms-skills
23
+ homepage: https://github.com/topmindspace/tms-skills#readme
19
24
  updated: 2026-09-29
20
25
  ---
21
26
 
@@ -90,15 +95,9 @@ python3 scripts/sync-status.py --set 定稿 <包> --apply
90
95
  python3 scripts/new-article.py --slug <中文短名> --title "<标题>" --direction reverse
91
96
  ```
92
97
 
93
- 取源坑(Next.js 站点):正文在 RSC 载荷里,优先 `GET /api/notes/<id>`;图片在 `/api/uploads/<hash>`,记 hash→本地名映射;同图双 hash 用 `md5` 去重。差异与口径写进包内 `README.md`。
98
+ 取源坑(RSC 载荷、图片 hash 映射、`md5` 去重、截图裁切)见 `references/workflow.md`「站外拉取取源注意」;差异与口径写进包内 `README.md`。
94
99
 
95
- **回推纪律**:notes 保持纯 Markdown。`::: 容器` / 徽章 / `==高亮==` 只进公众号稿。回推**务必带 `--assets`**(否则 GitHub 上 `images/` 死链):
96
-
97
- ```bash
98
- python3 scripts/push-to-topstream.py <包> --target notes/xxx.md --assets # dry-run
99
- python3 scripts/push-to-topstream.py <包> --target notes/xxx.md --assets --apply \
100
- --asset-names "00-封面.jpg=01-cover.jpg,…"
101
- ```
100
+ **回推纪律**:notes 保持纯 Markdown(`:::` 容器 / 徽章 / `==高亮==` 只进公众号稿);回推**务必带 `--assets`**(否则 GitHub 上 `images/` 死链)。命令串见 `references/workflow.md`「收尾」。
102
101
 
103
102
  ## 交付包与状态
104
103
 
@@ -159,7 +158,7 @@ python3 scripts/scan_ai_flavor.py <包>/公众号稿.md # ≥85(人话)
159
158
  ## 排版要点(写稿时)
160
159
 
161
160
  - 开头 150 字内钩子;单段 ≤110 字;列表项 ≤70 字
162
- - 二级标题序号化;容器:`::: stat|pull|note|tip|warn|danger|dialogue`
161
+ - 二级标题不手写序号(排版层自动生成);容器:`::: stat|pull|note|tip|warn|danger|dialogue`
163
162
  - **`::: stat` 内必须是 `数值 | 说明` 管道行**,否则静默丢弃
164
163
  - 评测稿:**图承担数据,正文只解读**;健康密度 **300–450 字/图**
165
164
  - 个股用词红线:禁用 买入/推荐/目标价…;文末投资声明
@@ -200,9 +199,19 @@ python3 scripts/md2wechat.py \
200
199
 
201
200
  可视化工作流伴面(若有):包列表 → 改稿 → 三关 → 预览 → 导出。脚本语义以本技能为准。
202
201
 
202
+ ## 外部依赖
203
+
204
+ 以下技能**不在本仓库**(一般随用户侧 workbuddy 环境提供);缺失时对应路由能力不可用,
205
+ 本仓库脚本(交付包、排版、发布清单等)功能不受影响:
206
+
207
+ - `humanizer-zh`:中文去 AI 味的保真边界(「只去 AI 味不排版」路径用)。
208
+ - `qu-aiwei-zh`:中文去 AI 味扫描定位;本仓库 `scan_ai_flavor.py` 与其同源,
209
+ 缺失时可用仓库内脚本替代,扫描定位能力降级。
210
+
203
211
  ## When NOT to use
204
212
 
205
213
  - 只想改几个句子 → 直接编辑
206
214
  - 小红书 / 知乎 / 掘金 → 平台约束不同
207
215
  - 通用长文交付 → 不在本技能范围
216
+ - 封面配图 → `topmind-cover`;X 长文 → `topmind-x-article`
208
217
  - 只去 AI 味不排版 → 中文走 `humanizer-zh`(先立保真边界)+ `qu-aiwei-zh`(再扫描定位);英文走 `humanizer`
@@ -6,7 +6,7 @@
6
6
 
7
7
  1. **开头 150 字内给钩子**:结论、反差或悬念,不要背景铺垫。原文首段若是长背景,压缩或后移。
8
8
  2. **段落切分**:单段 ≤ 110 字(约 4 行手机屏)。长段按语义断点拆开,不要机械等分。
9
- 3. **小标题序号化**:二级标题统一「一、二、三」或「01 / 02」,读者能感知进度。
9
+ 3. **小标题不手写序号**:写稿时保持二级标题为纯文本,序号由排版层按 `h2_style` 自动生成(规则见 `element-spec.md`「章节编号」)。主题换编号样式时无需手改,读者仍能感知进度。
10
10
  4. **列表项 ≤ 70 字**:超长列表项改成「加粗小标题 + 短说明」的段落组。
11
11
  5. **重点加粗**:只加粗结论句和关键数据,全篇加粗密度控制在每 20 字不超过 1 处。
12
12
  6. **长句拆短**:单句 > 45 字且有逗号堆叠时,拆成两句。
@@ -44,7 +44,7 @@
44
44
  |---|---|---|
45
45
  | 中文长文 / 公众号改稿 | `humanizer-zh` + `qu-aiwei-zh` | 先立边界,再扫描定位(默认组合) |
46
46
  | 只要分数和命中清单 | `qu-aiwei-zh` | 跑脚本,不改稿 |
47
- | 随笔要「加声音」 | `qu-aiwei-zh` + `references/pan-style.md` | 用表达方式加,不编故事 |
47
+ | 随笔要「加声音」 | `qu-aiwei-zh` | 用表达方式加,不编故事 |
48
48
  | 英文文本 | `humanizer` | `humanizer-zh` 只针对中文 |
49
49
  | 清单 / 词表 / 说明书 | 都不用 E 类姿态分 | 这类文体靠列举反例,检测器会把反例当真命中 |
50
50
 
@@ -114,7 +114,7 @@ python3 scripts/scan_ai_flavor.py <稿>.md # 技能自带,与 qu-aiwei-zh
114
114
 
115
115
  有「我」、有具体场景、有具体数字与人名、有不确定性表达(「其实」「不过」「还在想」)、句子长短交替、有真实细节而不是「很多人」「大多数」。
116
116
 
117
- ⚠️ 这一段说的是**表达方式**。原文没有第一人称、没有数字时,不许靠这一条去补——那正好踩中 `humanizer-zh` 的优先级第 1 条。加声音的手段是句长节奏、设问、括号自注(见 `pan-style.md`),配合删掉元叙述和教学腔。`humanizer-zh` 里写着同一句话:「用户要求增强个人风格时,用表达方式实现,不编故事。」
117
+ ⚠️ 这一段说的是**表达方式**。原文没有第一人称、没有数字时,不许靠这一条去补——那正好踩中 `humanizer-zh` 的优先级第 1 条。加声音的手段是句长节奏、设问、括号自注,配合删掉元叙述和教学腔。`humanizer-zh` 里写着同一句话:「用户要求增强个人风格时,用表达方式实现,不编故事。」
118
118
 
119
119
  英文文本才走 `humanizer`:它的取向是 **Add soul**(主动注入个性),与中文改稿的**保真优先**方向相反,别把它的思路套到中文稿上。
120
120
 
@@ -48,6 +48,28 @@ def main() -> None:
48
48
  check(False, f"{rel} 悬空链接: {link}")
49
49
  check(True, "内部 md 链接可达")
50
50
 
51
+ # 反引号代码引用中的路径可达(审计 轻微-15 门禁盲区:之前只查 [text](path) 形式,
52
+ # `references/pan-style.md` 这类反引号引用曾漏网)。抓取反引号内的 references/*.md
53
+ # 与 scripts/* 路径并校验存在;glob/占位符写法(* ? < > |)跳过。
54
+ backtick_path_re = re.compile(r"(references|scripts)/([\w.\-/]+)")
55
+ line_suffix_re = re.compile(r":\d+(?:-\d+)?$")
56
+ backtick_bad = 0
57
+ for md in md_files:
58
+ text = md.read_text(encoding="utf-8")
59
+ rel = md.relative_to(ROOT).as_posix()
60
+ for span in set(re.findall(r"`([^`]+)`", text)):
61
+ for kind, p in backtick_path_re.findall(span):
62
+ p = line_suffix_re.sub("", p)
63
+ if not p or any(c in p for c in "*?<>|"):
64
+ continue
65
+ target = md.parent / kind / p
66
+ if not target.exists():
67
+ target = ROOT / kind / p
68
+ if not target.exists():
69
+ backtick_bad += 1
70
+ check(False, f"{rel} 反引号引用不可达: `{kind}/{p}`")
71
+ check(backtick_bad == 0, f"反引号内 references/scripts 引用可达(扫描 {len(md_files)} 个 md 文件)")
72
+
51
73
  if errors:
52
74
  print(f"\n[audit_docs] {NAME}: {len(errors)} 项失败")
53
75
  sys.exit(1)