@topmindspace/topmind-writing-skills 0.8.34 → 0.8.35

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 (56) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.en.md +11 -11
  3. package/README.md +11 -11
  4. package/package.json +1 -1
  5. package/topmind-briefs/CHANGELOG.md +4 -0
  6. package/topmind-briefs/README.en.md +1 -1
  7. package/topmind-briefs/README.md +1 -1
  8. package/topmind-briefs/SKILL.md +1 -1
  9. package/topmind-briefs/package.json +1 -1
  10. package/topmind-briefs/references/emoji-system.md +17 -20
  11. package/topmind-briefs/references/x-delivery-contract.md +22 -19
  12. package/topmind-briefs/references/x-layout-patterns.md +3 -2
  13. package/topmind-briefs/references/x-post-format.md +6 -6
  14. package/topmind-briefs/scripts/format_text.py +21 -13
  15. package/topmind-briefs/scripts/lint_x_post.py +12 -3
  16. package/topmind-cover/README.en.md +1 -1
  17. package/topmind-cover/README.md +1 -1
  18. package/topmind-format/README.en.md +4 -4
  19. package/topmind-format/README.md +5 -5
  20. package/topmind-format/SKILL.md +16 -15
  21. package/topmind-format/package.json +1 -1
  22. package/topmind-format/references/emoji-system.md +17 -20
  23. package/topmind-format/references/x-delivery-contract.md +22 -19
  24. package/topmind-format/references/x-layout-patterns.md +3 -2
  25. package/topmind-format/references/x-post-format.md +6 -6
  26. package/topmind-format/scripts/format_text.py +21 -13
  27. package/topmind-format/scripts/lint_x_post.py +12 -3
  28. package/topmind-format/scripts/negative_tests.py +14 -4
  29. package/topmind-poster/README.en.md +1 -1
  30. package/topmind-poster/README.md +1 -1
  31. package/topmind-viral-posts/README.en.md +3 -3
  32. package/topmind-viral-posts/README.md +5 -5
  33. package/topmind-viral-posts/SKILL.md +15 -15
  34. package/topmind-viral-posts/package.json +1 -1
  35. package/topmind-viral-posts/references/emoji-system.md +17 -20
  36. package/topmind-viral-posts/references/patterns.md +40 -39
  37. package/topmind-viral-posts/references/tags-and-topics.md +1 -1
  38. package/topmind-viral-posts/references/x-delivery-contract.md +22 -19
  39. package/topmind-viral-posts/references/x-layout-patterns.md +3 -2
  40. package/topmind-viral-posts/references/x-post-format.md +6 -6
  41. package/topmind-viral-posts/scripts/format_text.py +21 -13
  42. package/topmind-viral-posts/scripts/lint_x_post.py +12 -3
  43. package/topmind-wechat-post/README.en.md +1 -1
  44. package/topmind-wechat-post/README.md +1 -1
  45. package/topmind-wechat-post/SKILL.md +1 -1
  46. package/topmind-wechat-post/package.json +1 -1
  47. package/topmind-wechat-post/references/x-delivery-contract.md +22 -19
  48. package/topmind-wechat-post/references/x-post-format.md +6 -6
  49. package/topmind-wechat-post/scripts/lint_x_post.py +12 -3
  50. package/topmind-x-article/README.en.md +1 -1
  51. package/topmind-x-article/README.md +1 -1
  52. package/topmind-x-article/SKILL.md +1 -1
  53. package/topmind-x-article/package.json +1 -1
  54. package/topmind-x-article/references/x-delivery-contract.md +22 -19
  55. package/topmind-x-article/references/x-post-format.md +6 -6
  56. package/topmind-x-article/scripts/lint_x_post.py +12 -3
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [0.8.35] - 2026-10-14
2
+
3
+ > 根包 0.8.34 → **0.8.35**(patch);技能版本:topmind-briefs 0.2.17 → 0.2.18、topmind-format 0.1.2 → 0.1.3、topmind-viral-posts 0.3.9 → 0.3.10、
4
+ > topmind-wechat-post 0.3.9 → 0.3.10、topmind-x-article 0.4.15 → 0.4.16;topmind-cover、topmind-poster 不变。
5
+
6
+ ### 变更(更正 0.8.34:短文用 emoji,段子不用)
7
+
8
+ - **段子体完全不用 emoji**:不加人设点缀(🐔 🐱 🌱)、情绪表情和 emoji 列表符号;分点一条一行、靠行间空行区分,不加任何符号。
9
+ - **短文体分点必须用 emoji 列表符号**,按 `emoji-system.md`(该体系只适用于短文体,段子配额全为 0)。
10
+ - **`format_text.py --mode duanzi`**:去掉原文 emoji 与列表符号(Markdown 列表、🔹 等)后输出纯文字条目;不再接受 `--open` / `--close` / `--title-emoji`(报错退出 2)。
11
+ - **`lint_x_post.py --duanzi`**:新增 W13,段子里出现任何 emoji(含点缀和列表符号)时警告。
12
+ - 同步修正:`x-delivery-contract.md`(第一节改为短文 / 段子对照表,正反例更新)、`x-post-format.md`、`x-layout-patterns.md`、viral-posts SKILL / `patterns.md` / `tags-and-topics.md` 示例去 emoji、format SKILL 与示例、各 README。
13
+ - 评测 63 → 66 条(新增段子零 emoji、段子拒绝点缀、短文 emoji 列表);format 负向测试改为验证段子去 emoji、拒绝 `--open`、lint W13。
14
+
1
15
  ## [0.8.34] - 2026-10-14
2
16
 
3
17
  > 根包 0.8.33 → **0.8.34**(patch);技能版本:topmind-briefs 0.2.16 → 0.2.17、topmind-format 0.1.1 → 0.1.2、topmind-viral-posts 0.3.8 → 0.3.9、
package/README.en.md CHANGED
@@ -43,7 +43,7 @@ npx @topmindspace/topmind-writing-skills install topmind-briefs
43
43
 
44
44
  ### topmind-viral-posts · X viral short posts
45
45
 
46
- 18 post types plus hook × body × closer combinations, summarised from common high-engagement writing patterns in the Chinese X community (all examples are original): **duanzi layout** (one sentence per line, a blank line between lines), conversational tone, an engagement hook; original images first; asks before generating one via `topmind-cover`. Hashtags (1–3) are part of the post body; classification tags (type / purpose / platform / tone) are listed separately. Jokes may use bullets too — always emoji bullets, one per line with blank lines between. Each post is delivered in its own copyable block.
46
+ 18 post types plus hook × body × closer combinations, summarised from common high-engagement writing patterns in the Chinese X community (all examples are original): **duanzi layout** (one sentence per line, a blank line between lines), conversational tone, an engagement hook; original images first; asks before generating one via `topmind-cover`. Hashtags (1–3) are part of the post body; classification tags (type / purpose / platform / tone) are listed separately. Duanzi posts use no emoji at all — no persona motif, no reaction emoji, no bullet symbols; bullets are plain lines separated by blank lines. Each post is delivered in its own copyable block.
47
47
 
48
48
  ```bash
49
49
  npx @topmindspace/topmind-writing-skills install topmind-viral-posts
@@ -51,7 +51,7 @@ npx @topmindspace/topmind-writing-skills install topmind-viral-posts
51
51
 
52
52
  ### topmind-format · X plain-text formatter
53
53
 
54
- Paste existing text: **to duanzi** → one sentence per line with blank lines between, bullets turned into emoji bullets; **to short post** → paragraphing, emoji bullets, a keyword-matched title emoji and the chicken/cat/plant persona motif (🐔 🐱 🌱 🌸) at the start or end. Layout only — words never change; `format_text.py` enforces fidelity.
54
+ Paste existing text: **to duanzi** → one sentence per line with blank lines between, all emoji and bullet symbols removed; **to short post** → paragraphing, emoji bullets, a keyword-matched title emoji and the chicken/cat/plant persona motif (🐔 🐱 🌱 🌸) at the start or end. Layout only — words never change; `format_text.py` enforces fidelity.
55
55
 
56
56
  ```bash
57
57
  npx @topmindspace/topmind-writing-skills install topmind-format
@@ -63,12 +63,12 @@ Single source in `shared/references/`, distributed to each skill's `references/`
63
63
 
64
64
  | Doc | Covers |
65
65
  |---|---|
66
- | `x-delivery-contract.md` (must read) | Bullets are always emoji bullets (jokes and briefs alike; no `- ` / `1. `); the post body is one copy-ready block (including the source line and hashtags); sources, original images, image suggestions, internal tags and notes are listed separately; one block per post |
66
+ | `x-delivery-contract.md` (must read) | Short posts must use emoji bullets; duanzi posts use no emoji at all (plain bullet lines); never `- ` / `1. `; the post body is one copy-ready block (including the source line and hashtags); sources, original images, image suggestions, internal tags and notes are listed separately; one block per post |
67
67
  | `x-post-format.md` | No Markdown, bullet sets, spacing, sources, skeletons, images, WeChat → X |
68
- | `emoji-system.md` | The TopMind emoji system: 0–2 persona motifs (🐔 🐱 🌱) at start/end; 0–1 keyword-matched title emoji; one bullet set per post |
68
+ | `emoji-system.md` | The TopMind emoji system (short posts only): 0–2 persona motifs (🐔 🐱 🌱) at start/end; 0–1 keyword-matched title emoji; one bullet set per post |
69
69
  | `x-layout-patterns.md` | Layout patterns distilled from reference posts |
70
70
 
71
- Checks: `lint_x_post.py` (E1–E9 Markdown leftovers; W12 notes / sources / image lines / internal tags inside the post body).
71
+ Checks: `lint_x_post.py` (E1–E9 Markdown leftovers; W12 notes / sources / image lines / internal tags inside the post body; W13 any emoji in a duanzi post with `--duanzi`).
72
72
 
73
73
  ### topmind-cover · Cover art generation
74
74
 
@@ -102,15 +102,15 @@ npx @topmindspace/topmind-writing-skills install topmind-poster
102
102
 
103
103
  | Skill | Version | What it does |
104
104
  |-------|---------|--------------|
105
- | [`topmind-wechat-post`](./topmind-wechat-post/) | **0.3.9** | WeChat article lifecycle: package, review, 3 quality gates, inline typography & publish checklist |
106
- | [`topmind-x-article`](./topmind-x-article/) | **0.4.15** | X long-form one-click publish: Markdown → one-click-copy HTML (images/prompt copy, click-to-zoom images) / plain-text fallback + cover + checklist |
105
+ | [`topmind-wechat-post`](./topmind-wechat-post/) | **0.3.10** | WeChat article lifecycle: package, review, 3 quality gates, inline typography & publish checklist |
106
+ | [`topmind-x-article`](./topmind-x-article/) | **0.4.16** | X long-form one-click publish: Markdown → one-click-copy HTML (images/prompt copy, click-to-zoom images) / plain-text fallback + cover + checklist |
107
107
  | [`topmind-cover`](./topmind-cover/) | **0.4.8** | Cover art for X / WeChat (X master 1500×600 / 5:2): striking, theme-focused; 22-style cover style library + 16:9 X short-post cover scene + 12 title treatments + 55 example images (22 styles × 2 sizes + 11 variant samples) + 1 style overview |
108
- | [`topmind-briefs`](./topmind-briefs/) | **0.2.17** | Short-form briefs (WeChat + X): one topic, one chart; data rankings / paper explainers / product alerts / mechanism explainers; one plain-text X block (no HTML by default) with emoji bullets, source links and hashtag suggestions; post body in its own copy-ready block, sources and 1–2 original images listed separately; asks before generating any image |
109
- | [`topmind-viral-posts`](./topmind-viral-posts/) | **0.3.9** | X viral short posts: 18 template types + combinations, duanzi layout (blank lines, emoji bullets), one copy-ready block per post, hashtags in the body and classification tags listed separately; asks before generating an image |
110
- | [`topmind-format`](./topmind-format/) | **0.1.2** | X plain-text formatter: to duanzi (blank lines) / to short post (paragraphing + emoji system); layout only, words unchanged, with a fidelity check; body delivered as its own block |
108
+ | [`topmind-briefs`](./topmind-briefs/) | **0.2.18** | Short-form briefs (WeChat + X): one topic, one chart; data rankings / paper explainers / product alerts / mechanism explainers; one plain-text X block (no HTML by default) with emoji bullets, source links and hashtag suggestions; post body in its own copy-ready block, sources and 1–2 original images listed separately; asks before generating any image |
109
+ | [`topmind-viral-posts`](./topmind-viral-posts/) | **0.3.10** | X viral short posts: 18 template types + combinations, duanzi layout (blank lines, no emoji, plain bullet lines), one copy-ready block per post, hashtags in the body and classification tags listed separately; asks before generating an image |
110
+ | [`topmind-format`](./topmind-format/) | **0.1.3** | X plain-text formatter: to duanzi (blank lines, no emoji) / to short post (paragraphing + emoji system); layout only, words unchanged, with a fidelity check; body delivered as its own block |
111
111
  | [`topmind-poster`](./topmind-poster/) | **0.1.5** | HTML+CSS → high-res long image / poster / infographic PNG: headless Chrome 2× screenshot + auto-trim; "one image per section" batch workflow (generator + renderer) |
112
112
 
113
- Installer [`@topmindspace/topmind-writing-skills`](https://www.npmjs.com/package/@topmindspace/topmind-writing-skills) is **0.8.34** (whole-repo same-tag releases).
113
+ Installer [`@topmindspace/topmind-writing-skills`](https://www.npmjs.com/package/@topmindspace/topmind-writing-skills) is **0.8.35** (whole-repo same-tag releases).
114
114
 
115
115
  ### Which skill, and how they combine
116
116
 
package/README.md CHANGED
@@ -41,7 +41,7 @@ npx @topmindspace/topmind-writing-skills install topmind-briefs
41
41
 
42
42
  ### topmind-viral-posts · X 引流段子/爆款短篇
43
43
 
44
- 基于对 X 中文区常见高互动写法的归纳,提供 18 类型模板 + 钩子×主体×收尾组合玩法(示例均为自编),默认**段子体**(一句一行、行与行之间空一行)、口语化、带互动钩子,配图原图优先(官方 / 第三方 / 自己的后台截图),没有原图时先问是否配图、同意后走 topmind-cover 出图,话题标签(1–3 个)在正文末行,内部分类标签另列;段子也可以分点,分点必须用 emoji 列表符号,条目间空行;每条正文单独一块。
44
+ 基于对 X 中文区常见高互动写法的归纳,提供 18 类型模板 + 钩子×主体×收尾组合玩法(示例均为自编),默认**段子体**(一句一行、行与行之间空一行)、口语化、带互动钩子,配图原图优先(官方 / 第三方 / 自己的后台截图),没有原图时先问是否配图、同意后走 topmind-cover 出图,话题标签(1–3 个)在正文末行,内部分类标签另列;段子**完全不用 emoji**,分点不加符号、一条一行靠行间空行区分;每条正文单独一块。
45
45
 
46
46
  ```bash
47
47
  npx @topmindspace/topmind-writing-skills install topmind-viral-posts
@@ -51,7 +51,7 @@ npx @topmindspace/topmind-writing-skills install topmind-viral-posts
51
51
 
52
52
  ### topmind-format · X 纯文本格式化
53
53
 
54
- 用户贴一段现成文字:**转段子** → 每句一行、行间空一行,分点改 emoji 列表符号;**格式化成短文** → 合理分段换行、列表改 emoji、标题 emoji 对应关键词、开头结尾加鸡/猫/植物人设点缀(🐔 🐱 🌱 🌸)。只动排版不改字,`format_text.py` 自带原文保真校验。
54
+ 用户贴一段现成文字:**转段子** → 每句一行、行间空一行,去掉所有 emoji 与列表符号;**格式化成短文** → 合理分段换行、列表改 emoji、标题 emoji 对应关键词、开头结尾加鸡/猫/植物人设点缀(🐔 🐱 🌱 🌸)。只动排版不改字,`format_text.py` 自带原文保真校验。
55
55
 
56
56
  ```bash
57
57
  npx @topmindspace/topmind-writing-skills install topmind-format
@@ -63,12 +63,12 @@ npx @topmindspace/topmind-writing-skills install topmind-format
63
63
 
64
64
  | 文档 | 管什么 |
65
65
  |---|---|
66
- | `x-delivery-contract.md`(必读必守) | 分点必须用 emoji 列表符号(段子、短文都一样,禁用 `- ` `1. `);正文单独一个可直接复制的块(含来源行与话题标签),信源、原图、配图建议、内部标签、说明各自另列;多条帖子每条一块 |
66
+ | `x-delivery-contract.md`(必读必守) | 短文分点必须用 emoji 列表符号,段子完全不用 emoji(分点不加符号),都禁用 `- ` `1. `;正文单独一个可直接复制的块(含来源行与话题标签),信源、原图、配图建议、内部标签、说明各自另列;多条帖子每条一块 |
67
67
  | `x-post-format.md` | 不用 Markdown、列表符号、留白、来源、骨架、配图、公众号稿→X 稿 |
68
- | `emoji-system.md` | TopMind emoji 体系唯一出处:人设点缀 🐔 🐱 🌱 0–2 个只放首尾;标题 emoji 0–1 个对上关键词;列表符号一帖一套 |
68
+ | `emoji-system.md` | TopMind emoji 体系唯一出处(只用于短文体):人设点缀 🐔 🐱 🌱 0–2 个只放首尾;标题 emoji 0–1 个对上关键词;列表符号一帖一套 |
69
69
  | `x-layout-patterns.md` | 参考帖拆出的版式规律(首行给结论、列表引导语、【小标题】分节等) |
70
70
 
71
- 检查:`lint_x_post.py`(E1–E9 Markdown 残留;W12 正文混入信源 / 配图 / 说明 / 内部标签)。
71
+ 检查:`lint_x_post.py`(E1–E9 Markdown 残留;W12 正文混入信源 / 配图 / 说明 / 内部标签;`--duanzi` 时 W13 段子里出现 emoji)。
72
72
 
73
73
  ### topmind-cover · 封面配图生成
74
74
 
@@ -102,15 +102,15 @@ npx @topmindspace/topmind-writing-skills install topmind-poster
102
102
 
103
103
  | 技能 | 版本 | 做什么 |
104
104
  |------|------|--------|
105
- | [`topmind-wechat-post`](./topmind-wechat-post/) | **0.3.9** | 公众号文章全生命周期:交付包、审校改写、质量三关、微信内联排版与发布清单 |
106
- | [`topmind-x-article`](./topmind-x-article/) | **0.4.15** | X 长文一键发布:Markdown 原稿 → 一键复制 HTML(含配图/提示词复制、图片点击放大)/ 纯文本兜底 + 封面图 + 发布清单 |
105
+ | [`topmind-wechat-post`](./topmind-wechat-post/) | **0.3.10** | 公众号文章全生命周期:交付包、审校改写、质量三关、微信内联排版与发布清单 |
106
+ | [`topmind-x-article`](./topmind-x-article/) | **0.4.16** | X 长文一键发布:Markdown 原稿 → 一键复制 HTML(含配图/提示词复制、图片点击放大)/ 纯文本兜底 + 封面图 + 发布清单 |
107
107
  | [`topmind-cover`](./topmind-cover/) | **0.4.8** | 文章封面配图(X / 公众号共用,X 主尺寸 1500×600 / 5:2):震撼醒目主题突出;22 种封面风格库 + X 短文 16:9 封面场景 + 12 种标题花式 + 55 张示例图(22 种风格 × 2 尺寸 + 11 张变体样张) + 1 张风格总览图 |
108
- | [`topmind-briefs`](./topmind-briefs/) | **0.2.17** | 干货短文(公众号 + X 双平台):一件事讲透,数据榜单/论文解读/新品速递;X 版一段纯文本(默认不出 HTML)+ emoji 列表 + 来源链接 + 话题标签建议;正文单独成块,信源 / 原图另列,无原图先询问配图 |
109
- | [`topmind-viral-posts`](./topmind-viral-posts/) | **0.3.9** | X 引流段子/爆款短篇:18 大类型模板 + 组合玩法,段子体(行间空行,分点用 emoji 列表)、每条正文单独成块、话题标签在正文、分类标签另列;无原图先询问再走 topmind-cover |
110
- | [`topmind-format`](./topmind-format/) | **0.1.2** | X 纯文本格式化:转段子(行间空行,分点用 emoji 列表)/ 格式化成短文(分段 + emoji 体系),只动排版不改字,带原文保真校验;正文单独成块 |
108
+ | [`topmind-briefs`](./topmind-briefs/) | **0.2.18** | 干货短文(公众号 + X 双平台):一件事讲透,数据榜单/论文解读/新品速递;X 版一段纯文本(默认不出 HTML)+ emoji 列表 + 来源链接 + 话题标签建议;正文单独成块,信源 / 原图另列,无原图先询问配图 |
109
+ | [`topmind-viral-posts`](./topmind-viral-posts/) | **0.3.10** | X 引流段子/爆款短篇:18 大类型模板 + 组合玩法,段子体(行间空行,零 emoji,分点不加符号)、每条正文单独成块、话题标签在正文、分类标签另列;无原图先询问再走 topmind-cover |
110
+ | [`topmind-format`](./topmind-format/) | **0.1.3** | X 纯文本格式化:转段子(行间空行,零 emoji)/ 格式化成短文(分段 + emoji 体系),只动排版不改字,带原文保真校验;正文单独成块 |
111
111
  | [`topmind-poster`](./topmind-poster/) | **0.1.5** | HTML+CSS → 高清长图 / 海报 / 信息图 PNG:无头 Chrome 2× 截图 + 自动裁白;「一段一图」分段图批量出图(生成器 + 渲染器) |
112
112
 
113
- 安装器 [`@topmindspace/topmind-writing-skills`](https://www.npmjs.com/package/@topmindspace/topmind-writing-skills) 为 **0.8.34**(整仓同 tag 发版)。
113
+ 安装器 [`@topmindspace/topmind-writing-skills`](https://www.npmjs.com/package/@topmindspace/topmind-writing-skills) 为 **0.8.35**(整仓同 tag 发版)。
114
114
 
115
115
  ### 怎么选、怎么组合
116
116
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topmindspace/topmind-writing-skills",
3
- "version": "0.8.34",
3
+ "version": "0.8.35",
4
4
  "description": "TopMindSpace 写作技能合集 — 通过 npm / npx 安装技能(公众号长文、X 长文、干货短文、X 引流短帖、封面图、长图海报)。只出稿与发布包,不代发。",
5
5
  "license": "MIT",
6
6
  "author": "TopMindspace",
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.18 (2026-10-14)
4
+
5
+ - 更正:共享规约改为「短文分点用 emoji 列表符号、段子完全不用 emoji」;`emoji-system.md` 标明只适用于短文体;`lint_x_post.py` 新增 `--duanzi`(W13)
6
+
3
7
  ## 0.2.17 (2026-10-14)
4
8
 
5
9
  - 特性支持:接入共享 X 交付规约 `x-delivery-contract.md`(必读必守)——X 正文单独成块,信源 / 原图 / 说明另列;分点必须用 emoji 列表符号
@@ -8,7 +8,7 @@ A brief is not a long-form article — **no HTML by default**: the X version is
8
8
  Original facts, images and quotes come first; a cover is optional when no original image exists. Every delivery lists
9
9
  each source's name, publish time and link.
10
10
 
11
- - Version: **v0.2.17** (ships with `@topmindspace/topmind-writing-skills@0.8.34`)
11
+ - Version: **v0.2.18** (ships with `@topmindspace/topmind-writing-skills@0.8.35`)
12
12
 
13
13
  ## Install
14
14
 
@@ -6,7 +6,7 @@
6
6
  X 版是一段可直接复制的纯文本(分段换行 + 克制的 emoji + 来源链接),公众号版约 300–800 字 Markdown。
7
7
  尊重原始信息、原图、原文;配图原图优先,没有原图时封面可选(`topmind-cover`);交付时写明信息来源、发布时间与来源链接。
8
8
 
9
- - 版本:**v0.2.17**(随 `@topmindspace/topmind-writing-skills@0.8.34` 发布)
9
+ - 版本:**v0.2.18**(随 `@topmindspace/topmind-writing-skills@0.8.35` 发布)
10
10
 
11
11
  ## 安装
12
12
 
@@ -3,7 +3,7 @@ name: topmind-briefs
3
3
  description: "干货短文:一件事讲透,X + 公众号双平台。短文不是长文——默认不出 HTML:X 版是一段可直接复制的纯文本(首行给结论、合理分段换行、emoji 项目符号列表,emoji 只用 TopMind 体系,带来源链接,0–2 个话题标签),公众号版是 300–800 字 Markdown;交付遵守 X 交付规约:正文单独成块可直接复制(含来源行与话题标签),信源、原图(1–2 张)、说明各自分块;分点必须用 emoji 列表符号;没有原图时主动询问是否配图,不擅自生图。尊重原始信息、原图、原文。只交付不代发。Use when 写短文、公众号短文、X 短文、发快讯、简讯、速报、数据榜单、榜单速报、论文解读、新品速递、来篇短的、短平快、brief;信息密度型(数据、榜单、发布)走本技能。Do NOT use for 把现成文字格式化、转段子、排版(→ topmind-format)、X 长文与发 X 文章(→ topmind-x-article)、公众号长文与公众号排版 HTML(→ topmind-wechat-post)、引流互动型短帖、段子、涨粉帖、互关帖、爆款短篇(→ topmind-viral-posts)、单独出长图/海报/信息图 PNG(→ topmind-poster)、封面与头图(→ topmind-cover)、把稿子发出去(→ topmind-x,须用户确认)。"
4
4
  license: MIT
5
5
  metadata:
6
- version: "0.2.17"
6
+ version: "0.2.18"
7
7
  action_category: "write"
8
8
  triggers: "写短文, 公众号短文, X 短文, 发快讯, 快讯, 简讯, 速报, 干货短文, 论文解读, 数据榜单, 榜单速报, 新品速递, brief, 来篇短的, 短平快, 发个快讯"
9
9
  author: "TopMindSpace"
@@ -9,5 +9,5 @@
9
9
  "type": "git",
10
10
  "url": "git+https://github.com/topmindspace/topmind-writing-skills.git"
11
11
  },
12
- "version": "0.2.17"
12
+ "version": "0.2.18"
13
13
  }
@@ -1,7 +1,8 @@
1
1
  # TopMind emoji 体系(账号人设 · 标题 · 列表)
2
2
 
3
3
  > 交付与列表规约见 `x-delivery-contract.md`(必读必守)。
4
- > 适用:`topmind-briefs`(短文)、`topmind-viral-posts`(段子)、`topmind-format`(格式化)的 X 稿,以及其他技能派生 X 纯文本稿时。
4
+ > **只用于短文体**:`topmind-briefs`(短文)、`topmind-format` 的「格式化成短文」、viral-posts 热点资讯型的短文版,以及其他技能派生的 X 短文稿。
5
+ > **段子体完全不用 emoji**(`topmind-viral-posts` 段子、`topmind-format` 转段子):不用人设点缀、情绪表情、标题 emoji,也不用 emoji 列表符号;分点就一条一行、靠行间空行区分。
5
6
  > 公众号稿正文不用人设点缀。列表符号的细则见 `x-post-format.md`,本文只定「用哪些、用几个、放哪里」。
6
7
  > **唯一真源**:本文是 TopMind emoji 体系的唯一出处(仓库 `shared/references/emoji-system.md`,各技能目录里是逐字节副本)。各技能 SKILL.md 只引用本文,不另写一套 emoji 规则;要改体系只改这里。
7
8
 
@@ -13,7 +14,7 @@
13
14
  | 标题 emoji | 一眼看出这帖讲什么 | 标题行行首 | 0–1 个 |
14
15
  | 列表符号 | 分点、步骤、对比 | 每条列表项行首 | 一套,见 `x-post-format.md` |
15
16
 
16
- 三类之外的情绪表情(😂 🤝 😭)每帖最多 1 个,放在钩子或吐槽那一句的句尾。
17
+ 三类之外的情绪表情(😂 🤝 😭)短文一般不用。
17
18
 
18
19
  ## 二、人设点缀(账号 motif)
19
20
 
@@ -28,7 +29,7 @@
28
29
 
29
30
  用法:
30
31
 
31
- 1. **开头**:放在第一行行尾,或单独一行(段子可以单独一行)。例:`说个冷知识 🐱`
32
+ 1. **开头**:放在第一行(标题行)行尾。例:`🆕 某编辑器 3.0 发布 🐱`
32
33
  2. **结尾**:放在最后一句行尾(话题标签之前)。例:`明天见 🌱`
33
34
  3. **不进正文和列表**:正文中间、列表项里不放人设 emoji。
34
35
  4. **严肃内容不放**:事故、伤亡、争议、监管处罚类帖子不用人设点缀,也不用情绪表情。
@@ -77,7 +78,7 @@
77
78
 
78
79
  | 体裁 | 人设点缀 | 标题 emoji | 列表符号 | 情绪表情 |
79
80
  |---|---|---|---|---|
80
- | 段子(topmind-viral-posts / 转段子) | 0–2 | 不用(段子没有标题行) | 分点时一套(条目间空一行) | ≤1 |
81
+ | 段子(viral-posts 段子 / 转段子) | 0 | 0 | 0(分点不加符号,靠行间空行) | 0 |
81
82
  | 短文(topmind-briefs / 格式化成短文) | 0–2 | 0–1 | 一套 | 0 |
82
83
  | 严肃资讯 | 0 | 0–1(只用 ⚡ 📄 ⚠️ 📅) | • ▪ 或 🔹 | 0 |
83
84
  | 长帖资讯(【小标题】分节) | 0–1(只放结尾) | 0–1 | 一套或不用 | 0 |
@@ -86,22 +87,6 @@
86
87
 
87
88
  ## 七、示例(原创)
88
89
 
89
- 段子:
90
-
91
- ```text
92
- 说个冷知识 🐱
93
-
94
- X 的创作者收益,看的不只是浏览量。
95
-
96
- 付费蓝V用户的互动,权重明显更高。
97
-
98
- 所以同样十万浏览,收益可能差很多。
99
-
100
- 难怪大家都在找蓝V互动😂
101
-
102
- 蓝V互关,评论区报到 🌱
103
- ```
104
-
105
90
  短文:
106
91
 
107
92
  ```text
@@ -115,3 +100,15 @@ X 的创作者收益,看的不只是浏览量。
115
100
 
116
101
  #AI编程
117
102
  ```
103
+
104
+ 段子(零 emoji,对照用):
105
+
106
+ ```text
107
+ 说个冷知识:
108
+
109
+ X 的创作者收益,看的不只是浏览量。
110
+
111
+ 付费蓝V用户的互动,权重明显更高。
112
+
113
+ 蓝V互关,评论区报到
114
+ ```
@@ -1,17 +1,20 @@
1
1
  # X 文本交付规约(必读必守)
2
2
 
3
3
  > 适用:所有产出 X 纯文本的技能——`topmind-briefs`、`topmind-viral-posts`、`topmind-format`,以及 `topmind-x-article` 的 `X发布稿.txt`、`topmind-wechat-post` 派生的 X 稿。
4
- > 排版细则见 `x-post-format.md`,emoji 见 `emoji-system.md`,版式规律见 `x-layout-patterns.md`。本文只管两件事:**列表怎么写**、**东西怎么交**。
4
+ > 排版细则见 `x-post-format.md`,emoji 见 `emoji-system.md`(只用于短文体),版式规律见 `x-layout-patterns.md`。本文只管两件事:**列表与 emoji 怎么用**、**东西怎么交**。
5
5
 
6
- ## 一、列表:要分点就用 emoji 列表符号
6
+ ## 一、列表与 emoji:短文用 emoji,段子不用
7
7
 
8
- X 是纯文本,不渲染列表。段子和短文**都可以分点**;一旦分点:
8
+ X 是纯文本,不渲染列表。**两种体裁都禁用 Markdown 列表**(`- ` `* ` `+ ` `1. ` `1)`,`lint_x_post.py` 报 E1 / E2)。
9
9
 
10
- 1. **必须主动加 emoji 列表符号**:并列 🔹(二级 ▫️),步骤 1️⃣ 2️⃣ 3️⃣,对比 ✅ / ❌,严肃内容 • ▪;一帖一套,按 `emoji-system.md`。
11
- 2. **禁用 Markdown 列表**:`- ` `* ` `+ ` `1. ` `1)` 一律不用(`lint_x_post.py` 报 E1 / E2,`--fix` 自动改)。
12
- 3. **短文体**:列表条目连续排,条目超过一行时条目间空一行。
13
- 4. **段子体**:列表条目同样**一条一行、行间空一行**,和其他句子同一节奏。
14
- 5. 列表前一行写「xx:」引导语;只有 2 条时可以直接写成两句,不加符号。
10
+ | | 短文体(briefs、格式化成短文、热点短文版) | 段子体(viral-posts 段子、转段子) |
11
+ |---|---|---|
12
+ | 分点 | **必须用 emoji 列表符号**:🔹(二级 ▫️)/ 1️⃣ 2️⃣ 3️⃣ / ✅ ❌,一帖一套,按 `emoji-system.md` | **不加任何符号**:一条一行,靠行间空行区分 |
13
+ | emoji | 标题 emoji 0–1、人设点缀 0–2,按 `emoji-system.md` | **完全不用**:无人设点缀、无情绪表情、无列表符号 |
14
+ | 节奏 | 列表条目连续排,长条目间空一行 | 每句、每条都一行,行与行之间空一行 |
15
+ | 检查 | `lint_x_post.py 正文.txt` | `lint_x_post.py 段子.txt --duanzi`(出现 emoji 报 W13) |
16
+
17
+ 列表前一行写「xx:」引导语;只有 2 条时直接写成两句。
15
18
 
16
19
  ## 二、交付:正文单独成块,其他各自分开
17
20
 
@@ -22,7 +25,7 @@ X 是纯文本,不渲染列表。段子和短文**都可以分点**;一旦
22
25
  | 标题行、正文、emoji 列表 | 信源清单(名称|发布时间|URL) |
23
26
  | 正文里的来源行 `来源:名称 URL`(给读者看出处,资讯类默认带) | 原图地址、配图建议、出图 prompt、图注 |
24
27
  | 话题标签(末行,属正文) | 内部分类标签(类型 / 用途 / 语气)、备选话题标签 |
25
- | 原文自带的表情、人设点缀 | 排版说明、改了什么、注意事项、核实提醒 |
28
+ | 短文体的标题 emoji 与人设点缀 | 排版说明、改了什么、注意事项、核实提醒 |
26
29
  | thread 的「1/3」序号(每条一块) | 【帖 N】【X 版】①②③ 之类的块标题 |
27
30
 
28
31
  规定:
@@ -35,7 +38,7 @@ X 是纯文本,不渲染列表。段子和短文**都可以分点**;一旦
35
38
  6. **原图块**:1–2 张,`[图1] 图片地址或交付目录文件名 — 图注;来源`;没有原图写「未找到原图」,并在最后**问用户要不要配图**(可选 `topmind-cover`),不擅自生图。
36
39
  7. **公众号版**(briefs 双平台)单独一个 ` ```markdown ` 块,不和 X 正文同块。
37
40
  8. **落盘文件同理**:`X短文.txt`、`X发布稿.txt` 只放可发布内容;信源、配图、说明写进单独的 `交付说明.md`。
38
- 9. 发前自检:`python3 scripts/lint_x_post.py 正文.txt`——E 类清零;W12 表示正文里混进了信源 / 配图 / 说明 / 内部标签,挪出去。
41
+ 9. 发前自检:`python3 scripts/lint_x_post.py 正文.txt`(段子加 `--duanzi`)——E 类清零;W12 表示正文里混进了信源 / 配图 / 说明 / 内部标签,挪出去;W13 表示段子里出现了 emoji。
39
42
 
40
43
  ## 三、聊天交付示例
41
44
 
@@ -68,27 +71,27 @@ X 正文(直接复制):
68
71
  说明:标题 emoji 🆕 对应「发布」,结尾 🐱 为人设点缀。
69
72
  ````
70
73
 
71
- 正例(段子体带列表,两条帖子各自成块):
74
+ 正例(段子体带分点,零 emoji,两条帖子各自成块):
72
75
 
73
76
  ````text
74
77
  帖 1:
75
78
  ```text
76
79
  这周把发帖流程压缩成三步:
77
80
 
78
- 1️⃣ 早上先回评论
81
+ 早上先回评论
79
82
 
80
- 2️⃣ 中午发一条原创
83
+ 中午发一条原创
81
84
 
82
- 3️⃣ 睡前回访新关注
85
+ 睡前回访新关注
83
86
 
84
- 三步走完,不焦虑 🌱
87
+ 三步走完,不焦虑
85
88
 
86
89
  #日拱一卒
87
90
  ```
88
91
 
89
92
  帖 2:
90
93
  ```text
91
- 说个冷知识 🐱
94
+ 说个冷知识:
92
95
 
93
96
  收益不只看浏览量。
94
97
 
@@ -107,9 +110,9 @@ X 正文(直接复制):
107
110
  ````text
108
111
  ```text
109
112
  【帖 1】
110
- 这周把发帖流程压缩成三步:
113
+ 这周把发帖流程压缩成三步:🐔
111
114
  - 早上先回评论
112
- - 中午发一条原创
115
+ 🔹 中午发一条原创
113
116
  #日拱一卒
114
117
  配图:风景(日出)· 清新优雅
115
118
  标签:类型=打卡日常型|用途=日常
@@ -119,4 +122,4 @@ X 正文(直接复制):
119
122
  ```
120
123
  ````
121
124
 
122
- 错在:Markdown 列表 `- `;块标题、配图、内部标签混进正文块;两条帖子用 `---` 拼在一个块里;段子体条目之间没空行。
125
+ 错在:Markdown 列表 `- `;段子里用了 emoji(🐔 点缀、🔹 列表符号);块标题、配图、内部标签混进正文块;两条帖子用 `---` 拼在一个块里;段子体条目之间没空行。
@@ -22,7 +22,7 @@
22
22
  3. **两句短钩**:B 用两句各成一段的短句(判断 + 对比),英文帖常见。
23
23
  4. 钩子行最多 1 个情绪或标题 emoji(A、E 在行首各 1 个);F、D 完全不用也照样清楚。
24
24
 
25
- TopMind 写法:短文首行 = 标题 emoji(按关键词对照表,0–1 个)+ 带结论的标题;段子首行 = 钩子句 + 可选 1 个人设点缀。
25
+ TopMind 写法:短文首行 = 标题 emoji(按关键词对照表,0–1 个)+ 带结论的标题;段子首行 = 钩子句,不加任何 emoji。
26
26
 
27
27
  ## 二、分段长度与空行节奏
28
28
 
@@ -46,6 +46,7 @@ TopMind 写法:短文首行 = 标题 emoji(按关键词对照表,0–1 个
46
46
  1. 参考帖的 emoji 只出现在三个位置:**标题行首、列表行首、(偶尔)收尾行**;正文段中间都不插。
47
47
  2. 信息密度越高、emoji 越少:F、D 零 emoji 依然好读,靠的是空行和【小标题】。
48
48
  3. 不连用、不堆叠;🔥 😍 这类情绪 emoji 是参考帖的个人风格,**TopMind 不照搬**——标题 emoji 只按关键词对照表取,人设点缀用 🐔 🐱 🌱 等(见 `emoji-system.md`)。
49
+ 4. **段子体完全不用 emoji**:像 D 那样只靠一句一行和空行;分点不加符号。
49
50
 
50
51
  ## 五、中英混排
51
52
 
@@ -65,7 +66,7 @@ TopMind 写法:短文首行 = 标题 emoji(按关键词对照表,0–1 个
65
66
  1. **一句判断或建议收尾**:「免费可薅,别指望质量!」(A 的结构:短句 + 态度)、「装一个能省不少事」(D 的结构:给读者一个行动理由)。
66
67
  2. 收尾句单独成段,不超过一行;之后只接来源和标签。
67
68
  3. 清单体(C)可以无收尾,但短文默认要有一句收尾。
68
- 4. 收尾行可放 1 个人设点缀(🌱 🐾),严肃资讯不放。
69
+ 4. 短文收尾行可放 1 个人设点缀(🌱 🐾),严肃资讯和段子不放。
69
70
 
70
71
  ## 八、一页速查(写完对照)
71
72
 
@@ -7,9 +7,9 @@
7
7
  ## 一、不用 Markdown
8
8
 
9
9
  X 普通帖不渲染 Markdown:`- ` `* ` `1. ` 列表、`#` 标题、`**加粗**`、`> 引用`、`[文字](链接)`、表格、`~~删除线~~`、反引号和代码围栏都会原样显示。
10
- 强调靠换行前置或「」;链接直接贴 URL;分点用 emoji 列表符号(段子、短文都一样,见规约第一节)。
10
+ 强调靠换行前置或「」;链接直接贴 URL。分点:**短文体用 emoji 列表符号;段子体不加任何符号、完全不用 emoji**,一条一行靠行间空行区分(见规约第一节)。
11
11
 
12
- ## 二、列表符号
12
+ ## 二、列表符号(短文体)
13
13
 
14
14
  | 用途 | 符号 | 说明 |
15
15
  |---|---|---|
@@ -21,13 +21,13 @@ X 普通帖不渲染 Markdown:`- ` `* ` `1. ` 列表、`#` 标题、`**加粗*
21
21
  | 严肃 / 英文帖 | • ▪ → | 事故、争议类不用 ✅ 🎉 |
22
22
 
23
23
  规则:同层一个符号;一条一行(中文约 30 字内);最多两层;一个列表 3–5 条、不超过 7 条,只有 2 条时写成两句;列表前一行「xx:」引导语。
24
- 短文体条目连续排(条目超过一行时条目间空一行);**段子体条目一条一行、行间空一行**。
24
+ 短文体条目连续排(条目超过一行时条目间空一行)。段子体不用这些符号。
25
25
 
26
26
  ## 三、段落与留白
27
27
 
28
28
  一段 1–3 行,段与段空一行,不出现连续两个空行(段子体的行间空行除外)。
29
29
  钩子 / 标题、正文、列表、收尾、来源行、话题标签之间各空一行。长帖(约 500 字以上)用【小标题】单独成行分节。
30
- 段子体:一句一行,行与行之间都空一行(现成文字转段子体交给 `topmind-format`)。
30
+ 段子体:一句一行,行与行之间都空一行,零 emoji(现成文字转段子体交给 `topmind-format`)。
31
31
 
32
32
  ## 四、来源与核实
33
33
 
@@ -84,10 +84,10 @@ thread:第 1 条放钩子和最关键事实,中间条目以「2/5」开头
84
84
 
85
85
  ## 八、检查工具
86
86
 
87
- `python3 scripts/lint_x_post.py 正文.txt`(多条帖子用单独一行 `---` 分隔;长文兜底稿加 `--long`;`--fix --out 新文件` 自动把 Markdown 改成 X 写法)。
87
+ `python3 scripts/lint_x_post.py 正文.txt`(多条帖子用单独一行 `---` 分隔;段子加 `--duanzi`;长文兜底稿加 `--long`;`--fix --out 新文件` 自动把 Markdown 改成 X 写法)。
88
88
 
89
89
  | 代码 | 含义 |
90
90
  |---|---|
91
91
  | E1–E9 | Markdown 列表 / 有序列表 / 标题 / 加粗 / 引用 / 链接 / 表格 / 代码围栏 / 删除线(错误) |
92
92
  | W1–W7 | 反引号、列表超两层、同层混用符号、列表超 7 条、话题标签不在末行、标签超 3 个、超字数 |
93
- | W8–W12 | 点缀表情过多、AI 套话、有数据缺来源、连续空行、正文混入信源 / 配图 / 说明 / 内部标签 |
93
+ | W8–W13 | 点缀表情过多、AI 套话、有数据缺来源、连续空行、正文混入信源 / 配图 / 说明 / 内部标签、段子体出现 emoji(`--duanzi`) |
@@ -3,10 +3,10 @@
3
3
  """format_text.py — 把一段文字格式化成 X 段子体或短文体,只动排版,不改字。
4
4
 
5
5
  用法:
6
- python3 format_text.py 原文.txt --mode duanzi # 段子体:每句一行,行与行之间空一行;列表 → emoji 列表
6
+ python3 format_text.py 原文.txt --mode duanzi # 段子体:每句一行,行与行之间空一行;完全不用 emoji,分点只去掉符号
7
7
  python3 format_text.py 原文.txt --mode duanzi --split # 同上,并按句末标点(。!?!?)拆句
8
8
  python3 format_text.py 原文.txt --mode short # 短文体:合并多余空行,Markdown 列表 → emoji 列表
9
- python3 format_text.py 原文.txt --mode short --title-emoji 🆕 --open 🐔 --close 🌱
9
+ python3 format_text.py 原文.txt --mode short --title-emoji 🆕 --open 🐔 --close 🌱 # 点缀只用于短文体
10
10
  python3 format_text.py 原文.txt --mode duanzi --out 段子.txt
11
11
  cat 原文.txt | python3 format_text.py - --mode duanzi
12
12
 
@@ -53,6 +53,12 @@ def skeleton(text: str) -> str:
53
53
  BULLET_RE = re.compile(r"^\s*(?:[0-9]\uFE0F?\u20E3|\U0001F51F|[\u2460-\u2473]|[🔹🔸▫▪•✅❌📌➡→])")
54
54
 
55
55
 
56
+ def strip_emoji(s: str) -> str:
57
+ """段子体用:去掉 emoji 及其变体选择符、零宽连接符,再收拾多余空格。"""
58
+ s = EMOJI_RE.sub("", s).replace("\u200d", "")
59
+ return re.sub(r"[ \t]{2,}", " ", s).strip()
60
+
61
+
56
62
  def to_bullet(ln: str) -> str | None:
57
63
  """Markdown 列表行 → emoji 列表行(一级 🔹 / 1️⃣,二级缩进 ▫️);不是列表行返回 None。"""
58
64
  m = UL_RE.match(ln)
@@ -67,20 +73,22 @@ def to_bullet(ln: str) -> str | None:
67
73
 
68
74
 
69
75
  def duanzi(text: str, split: bool) -> list[str]:
70
- """段子体:一句一行、行间空一行。列表条目同样一条一行、行间空行,用 emoji 列表符号;--split 不拆列表条目。"""
76
+ """段子体:一句一行、行间空一行,完全不用 emoji。
77
+ 分点条目去掉列表符号(Markdown 标记与 emoji 符号都去掉),一条一行、靠行间空行区分;--split 不拆列表条目。
78
+ 原文里的 emoji(含人设点缀、情绪表情)一并去掉。"""
71
79
  lines: list[str] = []
72
80
  for raw in text.splitlines():
73
81
  if not raw.strip():
74
82
  continue
75
- b = to_bullet(raw.rstrip())
76
- if b is not None:
77
- lines.append(b.strip() if not b.startswith(" ") else b)
78
- elif BULLET_RE.match(raw):
79
- lines.append(raw.strip())
83
+ m, o = UL_RE.match(raw.rstrip()), OL_RE.match(raw.rstrip())
84
+ if m or o or BULLET_RE.match(raw):
85
+ item = m.group(2) if m else (o.group(3) if o else BULLET_RE.sub("", raw, count=1))
86
+ lines.append(strip_emoji(item))
80
87
  elif split:
81
- lines += [p.strip() for p in SENT_RE.split(raw.strip()) if p.strip()]
88
+ lines += [strip_emoji(p) for p in SENT_RE.split(raw.strip()) if strip_emoji(p)]
82
89
  else:
83
- lines.append(raw.strip())
90
+ lines.append(strip_emoji(raw))
91
+ lines = [ln for ln in lines if ln]
84
92
  out: list[str] = []
85
93
  for ln in lines:
86
94
  out += [ln, ""]
@@ -145,10 +153,10 @@ def main() -> int:
145
153
  print("错误:原文为空", file=sys.stderr)
146
154
  return 2
147
155
 
156
+ if args.mode == "duanzi" and (args.title_emoji or args.open_e or args.close_e):
157
+ print("错误:段子体完全不用 emoji,不接受 --title-emoji / --open / --close(点缀只用于 --mode short)", file=sys.stderr)
158
+ return 2
148
159
  lines = duanzi(text, args.split) if args.mode == "duanzi" else short(text)
149
- if args.mode == "duanzi" and args.title_emoji:
150
- print("提示:段子体没有标题行,已忽略 --title-emoji", file=sys.stderr)
151
- args.title_emoji = None
152
160
  lines = decorate(lines, args.title_emoji, args.open_e, args.close_e)
153
161
  result = "\n".join(lines) + "\n"
154
162
 
@@ -9,11 +9,12 @@ X 的普通帖子不渲染 Markdown。本脚本检查 X 稿,并可把常见 Ma
9
9
  python3 lint_x_post.py X稿.txt # 检查(一个文件里多条帖子用单独一行 --- 分隔)
10
10
  python3 lint_x_post.py X稿.txt --fix --out X稿.fixed.txt # 自动改写后输出到新文件
11
11
  python3 lint_x_post.py X发布稿.txt --long # 长文兜底稿:不查话题标签位置和字数
12
+ python3 lint_x_post.py 段子.txt --duanzi # 段子体:出现任何 emoji(含列表符号、人设点缀)记 W13
12
13
  cat X稿.txt | python3 lint_x_post.py - # 从标准输入读取
13
14
 
14
15
  警告(不影响退出码,--strict 时算失败)还包括:点缀表情过多(W8)、疑似 AI 套话(W9)、
15
16
  有数据但缺来源(W10)、连续多个空行(W11)、正文里混入非发布内容(W12:信源清单 / 配图 / 图注 / 说明 /
16
- 内部标签 / 帖序号等,应按 x-delivery-contract.md 另列,不放进可复制正文)。
17
+ 内部标签 / 帖序号等,应按 x-delivery-contract.md 另列,不放进可复制正文)、段子体出现 emoji(W13,需 --duanzi)。
17
18
  普通帖(非 --long)里出现代码围栏 ``` 记 E8(多半是把交付代码块的围栏一起复制进来了),
18
19
  删除线 ~~文字~~ 记 E9;--fix 会去掉这两类符号。
19
20
 
@@ -133,7 +134,12 @@ def keycap_for(n: int) -> str:
133
134
  return f"{n})"
134
135
 
135
136
 
136
- def lint_post(start: int, lines: list[str], long_mode: bool):
137
+ DUANZI_EMOJI_RE = re.compile(
138
+ r"[\U0001F100-\U0001F2FF\U0001F300-\U0001FAFF\u2600-\u27BF\u2B00-\u2BFF\u25AA\u25AB\u2022\u20E3\u2460-\u2473]"
139
+ )
140
+
141
+
142
+ def lint_post(start: int, lines: list[str], long_mode: bool, duanzi: bool = False):
137
143
  """返回 (errors, warnings),元素为 (行号, 代码, 说明)。"""
138
144
  errs, warns = [], []
139
145
  in_fence = False
@@ -153,6 +159,8 @@ def lint_post(start: int, lines: list[str], long_mode: bool):
153
159
  continue
154
160
  in_fence = not in_fence
155
161
  continue
162
+ if duanzi and DUANZI_EMOJI_RE.search(ln):
163
+ warns.append((no, "W13", "段子体不用 emoji(含人设点缀和列表符号):分点一条一行、靠行间空行区分"))
156
164
  if not long_mode and NONPUB_RE.match(ln):
157
165
  warns.append((no, "W12", "正文里混入非发布内容(信源清单 / 配图 / 说明 / 内部标签等):另列,不放进可复制正文"))
158
166
  if STRIKE_RE.search(ln):
@@ -285,6 +293,7 @@ def main() -> int:
285
293
  ap.add_argument("--long", action="store_true", help="长文兜底稿模式(X发布稿.txt):整份当一篇,不查话题标签位置和字数")
286
294
  ap.add_argument("--fix", action="store_true", help="自动改写 Markdown 写法为 X 写法(需 --out;只处理单个文件)")
287
295
  ap.add_argument("--out", help="--fix 的输出文件")
296
+ ap.add_argument("--duanzi", action="store_true", help="段子体模式:出现任何 emoji(含列表符号、人设点缀)记 W13")
288
297
  ap.add_argument("--strict", action="store_true", help="警告也算失败")
289
298
  args = ap.parse_args()
290
299
 
@@ -307,7 +316,7 @@ def main() -> int:
307
316
  print(f"错误:无法读取 {f}({e})", file=sys.stderr)
308
317
  return 2
309
318
  for idx, (start, lines) in enumerate(split_posts(text, args.long), 1):
310
- errs, warns = lint_post(start, lines, args.long)
319
+ errs, warns = lint_post(start, lines, args.long, args.duanzi)
311
320
  label = "" if args.long else f"#帖{idx} "
312
321
  for no, code, msg in errs:
313
322
  print(f"{f}:{no}: {label}[{code}] 错误:{msg}")
@@ -4,7 +4,7 @@
4
4
 
5
5
  A reusable skill for generating cover art for X long-form posts and WeChat articles. Goal: **striking, eye-catching, theme-focused**.
6
6
 
7
- - Version: **v0.4.8** (ships with `@topmindspace/topmind-writing-skills@0.8.34`)
7
+ - Version: **v0.4.8** (ships with `@topmindspace/topmind-writing-skills@0.8.35`)
8
8
 
9
9
  ## Style gallery
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  为 X 长文和公众号文章生成封面图的可复用技能。目标:**震撼、醒目、主题突出**。
6
6
 
7
- - 版本:**v0.4.8**(随 `@topmindspace/topmind-writing-skills@0.8.34` 发布)
7
+ - 版本:**v0.4.8**(随 `@topmindspace/topmind-writing-skills@0.8.35` 发布)
8
8
 
9
9
  ## 风格样张
10
10
 
@@ -2,9 +2,9 @@
2
2
 
3
3
  **[中文](./README.md)** | English
4
4
 
5
- Lays out existing text for X: **duanzi mode** (one sentence per line, a blank line between every line) or **short-post mode** (paragraphing, emoji bullets, a keyword-matched title emoji, and the account's chicken/cat/plant motif at the start or end). Layout only — the words are never changed; a fidelity check enforces it.
5
+ Lays out existing text for X: **duanzi mode** (one sentence per line, a blank line between every line, no emoji at all, bullets without symbols) or **short-post mode** (paragraphing, emoji bullets, a keyword-matched title emoji, and the account's chicken/cat/plant motif at the start or end). Layout only — the words are never changed; a fidelity check enforces it.
6
6
 
7
- - Version: **v0.1.2** (ships with `@topmindspace/topmind-writing-skills@0.8.34`)
7
+ - Version: **v0.1.3** (ships with `@topmindspace/topmind-writing-skills@0.8.35`)
8
8
 
9
9
  ## Install
10
10
 
@@ -15,12 +15,12 @@ npx @topmindspace/topmind-writing-skills install topmind-format
15
15
  ## Usage
16
16
 
17
17
  ```bash
18
- python3 scripts/format_text.py input.txt --mode duanzi --split --open 🐱 --close 🌱
18
+ python3 scripts/format_text.py input.txt --mode duanzi --split # duanzi rejects --open / --close / --title-emoji
19
19
  python3 scripts/format_text.py input.txt --mode short --title-emoji 🆕 --open 🐔
20
20
  python3 scripts/lint_x_post.py output.txt
21
21
  ```
22
22
 
23
- Emoji rules: [references/emoji-system.md](./references/emoji-system.md) (shared with topmind-briefs and topmind-viral-posts). X layout rules: [references/x-post-format.md](./references/x-post-format.md).
23
+ Emoji rules (short posts only): [references/emoji-system.md](./references/emoji-system.md). X layout rules: [references/x-post-format.md](./references/x-post-format.md).
24
24
 
25
25
  ## Scope
26
26