@topmindspace/tms-skills 0.5.0 → 0.7.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/CHANGELOG.md +64 -0
- package/README.en.md +6 -5
- package/README.md +14 -5
- package/package.json +2 -1
- package/top-ppt-html/README.en.md +2 -2
- package/top-ppt-html/README.md +1 -1
- package/topmind-briefs/CHANGELOG.md +22 -0
- package/topmind-briefs/README.en.md +40 -0
- package/topmind-briefs/README.md +37 -0
- package/topmind-briefs/SKILL.md +101 -0
- package/topmind-briefs/dist/topmind-briefs.manifest.json +21 -0
- package/topmind-briefs/dist/topmind-briefs.zip +0 -0
- package/topmind-briefs/package-lock.json +13 -0
- package/topmind-briefs/package.json +1 -0
- package/topmind-briefs/references/examples.md +127 -0
- package/topmind-briefs/references/platform-specs.md +60 -0
- package/topmind-briefs/references/style-guide.md +55 -0
- package/topmind-briefs/scripts/audit_css.py +39 -0
- package/topmind-briefs/scripts/audit_docs.py +80 -0
- package/topmind-briefs/scripts/audit_skill.py +60 -0
- package/topmind-briefs/scripts/audit_styles.py +54 -0
- package/topmind-briefs/scripts/negative_tests.py +88 -0
- package/topmind-briefs/scripts/package_skill.py +188 -0
- package/topmind-cover/README.en.md +4 -4
- package/topmind-cover/README.md +4 -4
- package/topmind-cover/SKILL.md +5 -5
- package/topmind-cover/assets/examples/README.md +2 -0
- package/topmind-cover/package.json +1 -1
- package/topmind-cover/references/cover-prompts.md +19 -19
- package/topmind-cover/references/cover-styles.md +27 -26
- package/topmind-cover/scripts/crop-cover.py +6 -6
- package/topmind-cover/scripts/negative_tests.py +1 -1
- package/topmind-wechat-post/README.en.md +1 -1
- package/topmind-wechat-post/README.md +1 -1
- package/topmind-wechat-post/SKILL.md +74 -38
- package/topmind-wechat-post/package.json +1 -1
- package/topmind-wechat-post/references/element-spec.md +3 -2
- package/topmind-wechat-post/scripts/md2wechat.py +2 -7
- package/topmind-x-article/README.en.md +6 -2
- package/topmind-x-article/README.md +4 -2
- package/topmind-x-article/SKILL.md +59 -4
- package/topmind-x-article/package.json +1 -1
- package/topmind-x-article/references/publish-checklist.md +1 -1
- package/topmind-x-article/references/x-html-format.md +13 -1
- package/topmind-x-article/scripts/md2x-html.py +179 -51
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: topmind-wechat-post
|
|
3
|
-
version: 0.
|
|
4
|
-
description: "管一篇公众号文章从选题/底稿到发布的完整生命周期:交付包搭建、审校改写、质量三关(事实/逻辑/去AI味)、状态同步、微信内联排版与发布清单。Use when 写公众号、公众号排版、公众号定稿、发公众号。Do NOT use for
|
|
3
|
+
version: 0.2.0
|
|
4
|
+
description: "管一篇公众号文章从选题/底稿到发布的完整生命周期:交付包搭建、审校改写、质量三关(事实/逻辑/去AI味)、状态同步、微信内联排版与发布清单。Use when 写公众号、公众号排版、公众号定稿、发公众号。Do NOT use for 只改错别字、小红书/知乎、纯网页发布。"
|
|
5
5
|
action_category: write
|
|
6
6
|
triggers:
|
|
7
7
|
- 公众号
|
|
8
8
|
- 微信排版
|
|
9
|
-
- 微信编辑器
|
|
10
9
|
- 公众号排版
|
|
11
10
|
- 公众号稿
|
|
12
11
|
- 排版这篇文章
|
|
13
|
-
- 粘贴到公众号
|
|
14
12
|
- 定稿
|
|
15
13
|
- 发公众号
|
|
16
14
|
- 公众号交付
|
|
17
|
-
- 状态同步
|
|
18
15
|
- wechat
|
|
19
16
|
- mp format
|
|
20
17
|
triggers_cn:
|
|
@@ -29,7 +26,7 @@ updated: 2026-09-29
|
|
|
29
26
|
|
|
30
27
|
# topmind-wechat-post · 公众号创作技能
|
|
31
28
|
|
|
32
|
-
|
|
29
|
+
**公众号专用写作技能**。管一篇公众号文章从选题/底稿到发布清单的完整生命周期。
|
|
33
30
|
|
|
34
31
|
```
|
|
35
32
|
选题/底稿 → 创作 → 质量三关 → 定稿(状态+目录) → 排版 → 发布清单 →(可选)回推 notes
|
|
@@ -37,6 +34,14 @@ updated: 2026-09-29
|
|
|
37
34
|
|
|
38
35
|
> 用户明确说公众号 / 微信排版时进本技能;通用长文写作不在本技能范围内。
|
|
39
36
|
|
|
37
|
+
## 语言铁律
|
|
38
|
+
|
|
39
|
+
- **默认中文**:标题、正文、配图文案一律用中文写作,这是默认行为,不需要用户每次声明。
|
|
40
|
+
- **英文是例外**:只有用户**明确说**"写英文文章"时才用英文。用户消息里夹杂英文词、
|
|
41
|
+
给英文参考素材、引用英文原文,都不算"要求写英文"。
|
|
42
|
+
- 引用英文一手素材(官方公告、模型卡、论文标题)时保留英文原文,正文主体仍是中文,
|
|
43
|
+
必要时在旁给中文翻译。
|
|
44
|
+
|
|
40
45
|
## 脚本(真源)
|
|
41
46
|
|
|
42
47
|
| 脚本 | 用途 |
|
|
@@ -50,22 +55,23 @@ updated: 2026-09-29
|
|
|
50
55
|
| `scripts/scan_ai_flavor.py` | 中文去 AI 味扫描(与 `qu-aiwei-zh` 同源) |
|
|
51
56
|
|
|
52
57
|
```bash
|
|
53
|
-
# 路径解析:CLI --base → env TOPMIND_WECHAT_BASE / TOPMIND_WORKSPACE / TOPSTREAM_ROOT → 惯例
|
|
58
|
+
# 路径解析:CLI --base/--workspace → env TOPMIND_WECHAT_BASE / TOPMIND_WORKSPACE / TOPSTREAM_ROOT → 惯例
|
|
54
59
|
export TOPMIND_WORKSPACE=/path/to/workspace # 推荐
|
|
55
60
|
python3 scripts/new-article.py --slug demo --title "标题" --direction reverse
|
|
56
61
|
python3 scripts/lint-wechat.py --input <包>/公众号稿.md --fix
|
|
57
62
|
python3 scripts/scan_ai_flavor.py <包>/公众号稿.md # 目标 ≥85
|
|
58
|
-
python3 scripts/md2wechat.py --input <包>/公众号稿.md --out-dir <包> --slug demo
|
|
63
|
+
python3 scripts/md2wechat.py --input <包>/公众号稿.md --out-dir <包> --slug demo \
|
|
64
|
+
--asset-root <素材根> --embed-images
|
|
59
65
|
python3 scripts/sync-status.py --set 定稿 <包> --apply
|
|
60
66
|
```
|
|
61
67
|
|
|
62
|
-
细节见 `references/workflow.md` · `references/known-pits.md
|
|
68
|
+
细节见 [`references/workflow.md`](references/workflow.md) · [`references/known-pits.md`](references/known-pits.md)。
|
|
63
69
|
|
|
64
70
|
## 路径默认
|
|
65
71
|
|
|
66
72
|
| 用途 | 解析 |
|
|
67
73
|
|------|------|
|
|
68
|
-
| 交付包根 | `--base` → `TOPMIND_WECHAT_BASE` → `{ws}/40
|
|
74
|
+
| 交付包根 | `--base` → `TOPMIND_WECHAT_BASE` → `{ws}/40-创作/2026-公众号` 或 `{ws}/20-专题/2026-公众号` |
|
|
69
75
|
| 工作区 | `TOPMIND_WORKSPACE` |
|
|
70
76
|
| 底稿/回推 | `--topstream` → `TOPSTREAM_ROOT` → 可选;不存在则跳过 notes 校验 |
|
|
71
77
|
| 终稿交付 | 可 `save-output` 拷贝到 role:delivery(`88-交付/`),包仍留在创作类专题 |
|
|
@@ -90,9 +96,13 @@ python3 scripts/sync-status.py --set 定稿 <包> --apply
|
|
|
90
96
|
|
|
91
97
|
### 站外拉取(转载整合 / 在线精选站)
|
|
92
98
|
|
|
93
|
-
源不在本工作区、也不在 topstream `notes/` 时,**仍落 `reverse` + `target_file: pending`**。
|
|
99
|
+
源不在本工作区、也不在 topstream `notes/` 时,**仍落 `reverse` + `target_file: pending`**。
|
|
94
100
|
**不要用 `forward`**:它要求 `source_file` 以 `notes/` 开头且文件真实存在,站外源必然过不了 `sync-mapping.py`。
|
|
95
101
|
|
|
102
|
+
```bash
|
|
103
|
+
python3 scripts/new-article.py --slug <中文短名> --title "<标题>" --direction reverse
|
|
104
|
+
```
|
|
105
|
+
|
|
96
106
|
取源坑(RSC 载荷、图片 hash 映射、`md5` 去重、截图裁切)见 `references/workflow.md`「站外拉取取源注意」;差异与口径写进包内 `README.md`。
|
|
97
107
|
|
|
98
108
|
**回推纪律**:notes 保持纯 Markdown(`:::` 容器 / 徽章 / `==高亮==` 只进公众号稿);回推**务必带 `--assets`**(否则 GitHub 上 `images/` 死链)。命令串见 `references/workflow.md`「收尾」。
|
|
@@ -119,6 +129,9 @@ target_file: pending # reverse:pending | notes/xxx.md
|
|
|
119
129
|
word_count: 0 # 纯中文字数,sync-status 维护
|
|
120
130
|
```
|
|
121
131
|
|
|
132
|
+
**交付铁律**:发布/分享时直接用交付包里的 HTML 原文件原样呈现,
|
|
133
|
+
不临时重新生成版本;`公众号稿.md` 是唯一改稿入口,改稿后重建 HTML 再交付。
|
|
134
|
+
|
|
122
135
|
状态与目录名**不要手改**:
|
|
123
136
|
|
|
124
137
|
```bash
|
|
@@ -129,14 +142,16 @@ python3 scripts/sync-status.py --set 定稿 <包> --apply
|
|
|
129
142
|
|
|
130
143
|
### 关 1 · 事实
|
|
131
144
|
|
|
132
|
-
- 承重数字回**一手来源**;厂商口径 / 据报道
|
|
133
|
-
-
|
|
134
|
-
-
|
|
135
|
-
-
|
|
145
|
+
- 承重数字回**一手来源**;厂商口径 / 据报道 分开写
|
|
146
|
+
- 查不到一手来源的传闻**删**
|
|
147
|
+
- 改稿续写:正文已有数字**回源重核**(上一轮文本最不可信)
|
|
148
|
+
- 多口径(主轮/复跑)显式拆开;表格从数据源生成,禁止手抄
|
|
149
|
+
- 外部工具改过的稿:**先核数字再动文字**;「比值对但绝对值错」= 全段重核
|
|
136
150
|
|
|
137
151
|
### 关 2 · 逻辑
|
|
138
152
|
|
|
139
|
-
-
|
|
153
|
+
- 单边结论旁配反方证据
|
|
154
|
+
- 结构前后一致;同一事实多处同值
|
|
140
155
|
|
|
141
156
|
### 关 3 · 文字(去 AI 味)
|
|
142
157
|
|
|
@@ -149,17 +164,17 @@ python3 scripts/scan_ai_flavor.py <包>/公众号稿.md # ≥85(人话)
|
|
|
149
164
|
- **口语化 ≠ 有人味**:删社交垫词(元叙述、空转过渡、姿态句)
|
|
150
165
|
- 判据:**这句话删掉之后,读者少知道了什么?**
|
|
151
166
|
|
|
152
|
-
详见 `references/writing-quality.md
|
|
167
|
+
详见 [`references/writing-quality.md`](references/writing-quality.md)。
|
|
153
168
|
|
|
154
169
|
## 排版要点(写稿时)
|
|
155
170
|
|
|
156
|
-
- 开头 150 字内钩子;单段 ≤110 字;列表项 ≤70 字
|
|
157
|
-
- 二级标题不手写序号(排版层自动生成);容器:`::: stat|pull|note|tip|warn|danger|dialogue`
|
|
158
|
-
- **`::: stat` 内必须是 `数值 | 说明` 管道行**,否则静默丢弃
|
|
159
|
-
- 评测稿:**图承担数据,正文只解读**;健康密度 **300–450 字/图**
|
|
160
|
-
- 个股用词红线:禁用 买入/推荐/目标价…;文末投资声明
|
|
171
|
+
- 开头 150 字内钩子;单段 ≤110 字;列表项 ≤70 字
|
|
172
|
+
- 二级标题不手写序号(排版层自动生成);容器:`::: stat|pull|note|tip|warn|danger|dialogue`
|
|
173
|
+
- **`::: stat` 内必须是 `数值 | 说明` 管道行**,否则静默丢弃
|
|
174
|
+
- 评测稿:**图承担数据,正文只解读**;健康密度 **300–450 字/图**
|
|
175
|
+
- 个股用词红线:禁用 买入/推荐/目标价…;文末投资声明
|
|
161
176
|
|
|
162
|
-
|
|
177
|
+
更多:[`references/typography-rules.md`](references/typography-rules.md) · [`references/wechat-constraints.md`](references/wechat-constraints.md)。
|
|
163
178
|
|
|
164
179
|
## 排版与导出(必读)
|
|
165
180
|
|
|
@@ -172,26 +187,32 @@ python3 scripts/md2wechat.py \
|
|
|
172
187
|
|
|
173
188
|
1. **永远 `--embed-images`**,否则粘贴丢图(相对路径被序列化成 file://)
|
|
174
189
|
2. **图片 basename 铁律**:正文引用名 = `images/` 目标名;禁止两套同名图共处
|
|
175
|
-
3.
|
|
176
|
-
4.
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
190
|
+
3. 合规自检出现 `✗` 改生成器,不要手改 HTML
|
|
191
|
+
4. **配图位置铁律**(2026-10-01 九月全景教训):图片必须紧跟它证明的那段文字
|
|
192
|
+
(最多隔一段);改稿移动段落时图片行一起搬。构建后必跑:嵌入图数量=文档图数量、
|
|
193
|
+
嵌入图顺序=文档出现顺序(逐张解码与源文件比对);每张图前后 6 行做主题关键词
|
|
194
|
+
邻近检查,不通过则人工核对。
|
|
195
|
+
5. **双版一致性校验**(2026-10-01 九月全景教训 B):同一选题出 X 版后,
|
|
196
|
+
必跑 X 内嵌图序列 vs 公众号内嵌图序列的逐字节/逐像素比对(X 去掉封面后应完全一致)。
|
|
197
|
+
X 侧图片顺序必须用 `--images-from 公众号稿.md` 派生,禁止手工拼 `--images`
|
|
198
|
+
(曾因文件名排序 ≠ 文档顺序,导致 X 版从第六节起整段配图错位)。
|
|
199
|
+
|
|
200
|
+
坑清单:[`references/known-pits.md`](references/known-pits.md)。
|
|
180
201
|
|
|
181
202
|
## 主题
|
|
182
203
|
|
|
183
|
-
| 文件 | 风格 |
|
|
204
|
+
| 文件 | 风格 | 适用 |
|
|
184
205
|
|------|------|------|
|
|
185
|
-
| `assets/themes/minimal-ink.json`(默认) | 黑白灰 + 砖红 |
|
|
186
|
-
| `assets/themes/tech-blue.json` | 科技蓝 |
|
|
187
|
-
| `assets/themes/newsprint.json` | 报纸衬线 |
|
|
188
|
-
| `assets/themes/graphite.json` | 石墨克制 |
|
|
189
|
-
| `assets/themes/amber-review.json` | 琥珀评测 |
|
|
206
|
+
| `assets/themes/minimal-ink.json`(默认) | 黑白灰 + 砖红 | 深度研析 / 观点 / 随笔 |
|
|
207
|
+
| `assets/themes/tech-blue.json` | 科技蓝 | AI/技术 |
|
|
208
|
+
| `assets/themes/newsprint.json` | 报纸衬线 | 人文评论 |
|
|
209
|
+
| `assets/themes/graphite.json` | 石墨克制 | 严肃报告 |
|
|
210
|
+
| `assets/themes/amber-review.json` | 琥珀评测 | 产品评测 |
|
|
190
211
|
|
|
191
|
-
`md2wechat.py --list-themes` 看全部;`--theme genre:评测` 可按题材自动选。
|
|
192
|
-
渲染规格见 `references/element-spec.md` · 主题映射见 `references/theme-map.md
|
|
212
|
+
`md2wechat.py --list-themes` 看全部;`--theme genre:评测` 可按题材自动选。
|
|
213
|
+
渲染规格见 [`references/element-spec.md`](references/element-spec.md) · 主题映射见 [`references/theme-map.md`](references/theme-map.md)。
|
|
193
214
|
|
|
194
|
-
**平台红线速查**(详见 `references/wechat-constraints.md
|
|
215
|
+
**平台红线速查**(详见 [`references/wechat-constraints.md`](references/wechat-constraints.md)):禁 `div`/`pre`/`h1`/`figure`/`thead`/flex/float/gradient/shadow;表格 `table-layout` 不写 fixed;列数 ≥4 转卡片。
|
|
195
216
|
|
|
196
217
|
## 与 Desktop「公众号创作」
|
|
197
218
|
|
|
@@ -200,7 +221,7 @@ python3 scripts/md2wechat.py \
|
|
|
200
221
|
## 外部依赖
|
|
201
222
|
|
|
202
223
|
以下技能**不在本仓库**(一般随用户侧 workbuddy 环境提供);缺失时对应路由能力不可用,
|
|
203
|
-
|
|
224
|
+
本仓库脚本(交付包、排版、发布清单等)功能不受影响:
|
|
204
225
|
|
|
205
226
|
- `humanizer-zh`:中文去 AI 味的保真边界(「只去 AI 味不排版」路径用)。
|
|
206
227
|
- `qu-aiwei-zh`:中文去 AI 味扫描定位;本仓库 `scan_ai_flavor.py` 与其同源,
|
|
@@ -213,3 +234,18 @@ python3 scripts/md2wechat.py \
|
|
|
213
234
|
- 通用长文交付 → 不在本技能范围
|
|
214
235
|
- 封面配图 → `topmind-cover`;X 长文 → `topmind-x-article`
|
|
215
236
|
- 只去 AI 味不排版 → 中文走 `humanizer-zh`(先立保真边界)+ `qu-aiwei-zh`(再扫描定位);英文走 `humanizer`
|
|
237
|
+
|
|
238
|
+
## 实战沉淀(2026-10-01 九月全景项目)
|
|
239
|
+
|
|
240
|
+
- **文字精炼原则**:月度盘点类文章,文字只给"看图能看清的简单结论或事实",
|
|
241
|
+
不发散论述。删掉的典型:"9 月没发生的那件事可能是最重要的"(评论腔)、
|
|
242
|
+
"是同一道题的两种解法"(比喻发散)。每段压到 1–2 句,只留时间、主体、数字、来源。
|
|
243
|
+
- **第三方客观素材优先**:官方产品截图 > 官方基准图 > 第三方榜单截图 > 自制图表。
|
|
244
|
+
自制图只用于时间线、价格对比、总结盘点。9 月项目新增:OpenAI DevDay 官方
|
|
245
|
+
Codex 四图(CLI/Cloud/Code Review/Security)、DeepSeek Harness 官方图标+
|
|
246
|
+
第三方实测截图。
|
|
247
|
+
- **模型信息核实**:Muse Spark、Step 5 Preview 等新模型,分数/价格必须回官方模型卡
|
|
248
|
+
或 Artificial Analysis 原页,不直接采用二手报告数字。榜单文字与榜单截图日期对齐
|
|
249
|
+
(如 AA 9/28 快照),分数不跨期比较。
|
|
250
|
+
- **frontmatter 状态诚实**:`status: 定稿` 必须等事实/逻辑/文字三关全过才写,
|
|
251
|
+
构建流水线跑通不等于定稿;`word_count` 用脚本实算,不手填。
|
|
@@ -124,9 +124,10 @@
|
|
|
124
124
|
| `on` | 无条件追加 |
|
|
125
125
|
| `off` | 只在显式写了 `::: sign` 时渲染 |
|
|
126
126
|
|
|
127
|
-
-
|
|
127
|
+
- 署名区**不再渲染"自我介绍"行**(2026-10-01 用户要求去掉"我是{{作者名}},{{一句话简介}}");
|
|
128
|
+
只保留三连 CTA。`--author` / `--author-bio` 参数保留仅为兼容旧调用,不再使用
|
|
128
129
|
- 判定「已自带」的口径:正文末尾 8 个非空段落内出现
|
|
129
|
-
`点赞 / 在看 / 三连 / 点个关注 / 欢迎关注 / 关注「 / 扫码 /
|
|
130
|
+
`点赞 / 在看 / 三连 / 点个关注 / 欢迎关注 / 关注「 / 扫码 / 分享给`
|
|
130
131
|
|
|
131
132
|
---
|
|
132
133
|
|
|
@@ -1340,20 +1340,15 @@ def render_toc(titles, theme):
|
|
|
1340
1340
|
|
|
1341
1341
|
|
|
1342
1342
|
def render_signature(theme, author="", bio=""):
|
|
1343
|
-
"""
|
|
1344
|
-
|
|
1345
|
-
blurb = esc(bio.strip() or "{{一句话简介}}")
|
|
1343
|
+
"""尾部签名区。2026-10-01 起默认不再渲染"自我介绍"行(我是{{作者名}},{{一句话简介}});
|
|
1344
|
+
只保留三连 CTA。author/bio 参数保留仅为兼容旧调用,不再使用。"""
|
|
1346
1345
|
return ('<section style="margin:34px 0 0;padding:16px 18px;background:%s;'
|
|
1347
1346
|
'border-top:2px solid %s;border-radius:%s;">'
|
|
1348
|
-
'<p style="margin:0 0 8px;font-size:14px;line-height:1.75;'
|
|
1349
|
-
'color:%s;word-break:break-word;">我是 <span style="font-weight:600;'
|
|
1350
|
-
'color:%s;">%s</span>,%s</p>'
|
|
1351
1347
|
'<p style="margin:0;font-size:14px;line-height:1.75;color:%s;'
|
|
1352
1348
|
'word-break:break-word;">如果你觉得今天这篇有收获,欢迎'
|
|
1353
1349
|
'<span style="font-weight:600;color:%s;">点赞、在看、转发</span>'
|
|
1354
1350
|
'三连,我们下篇见。</p></section>'
|
|
1355
1351
|
% (theme["surface"], theme["accent"], theme["radius"],
|
|
1356
|
-
theme["text"], theme["text_strong"], name, blurb,
|
|
1357
1352
|
theme["text"], theme["accent"]))
|
|
1358
1353
|
|
|
1359
1354
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
Turn a Markdown draft into a "copy → paste → publish" X long-form (Article) package.
|
|
6
6
|
|
|
7
|
-
- Version: **v0.
|
|
7
|
+
- Version: **v0.4.0** (same tag as `@topmindspace/tms-skills@0.7.0`)
|
|
8
8
|
|
|
9
9
|
## Install
|
|
10
10
|
|
|
@@ -17,7 +17,11 @@ npx @topmindspace/tms-skills install topmind-x-article
|
|
|
17
17
|
```bash
|
|
18
18
|
# 1. Draft → one-click-copy HTML (preferred)
|
|
19
19
|
python3 scripts/md2x-html.py <draft>.md --out <package>/X长文.html \
|
|
20
|
-
--images
|
|
20
|
+
--images-from 公众号稿.md [--cover cover-1500x600.png]
|
|
21
|
+
# --images-from derives image order from the WeChat draft in document order
|
|
22
|
+
# (required when the X draft is derived from it);
|
|
23
|
+
# never hand-assemble --images (filename sort order != document order —
|
|
24
|
+
# this once misplaced a whole section's images).
|
|
21
25
|
# Open X长文.html in a browser → click the top 「一键复制全文」 button → paste into the X Article editor body
|
|
22
26
|
# (the first # heading is excluded from the clipboard — fill it into X's title field by hand;
|
|
23
27
|
# upload the cover separately via X's dedicated cover entry)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
把 Markdown 原稿变成"复制 → 粘贴 → 发"的 X 长文(Article)发布包。
|
|
6
6
|
|
|
7
|
-
- 版本:**v0.
|
|
7
|
+
- 版本:**v0.4.0**(与 `@topmindspace/tms-skills@0.7.0` 同 tag)
|
|
8
8
|
|
|
9
9
|
## 安装
|
|
10
10
|
|
|
@@ -17,7 +17,9 @@ npx @topmindspace/tms-skills install topmind-x-article
|
|
|
17
17
|
```bash
|
|
18
18
|
# 1. 原稿转一键复制 HTML(首选)
|
|
19
19
|
python3 scripts/md2x-html.py <原稿>.md --out <包>/X长文.html \
|
|
20
|
-
--images
|
|
20
|
+
--images-from 公众号稿.md [--cover cover-1500x600.png]
|
|
21
|
+
# --images-from 从公众号稿按文档顺序派生图片(X 稿由公众号稿派生时必用);
|
|
22
|
+
# 禁止手工拼 --images 列表(文件名排序 ≠ 文档顺序,曾导致整段配图错位)。
|
|
21
23
|
# 浏览器打开 X长文.html → 点页顶「一键复制全文」→ 粘贴进 X Article 编辑器正文
|
|
22
24
|
# (首个 # 标题不进剪贴板,手动填入 X 标题栏;封面在 X 独立入口单独上传)
|
|
23
25
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: topmind-x-article
|
|
3
|
-
version: 0.
|
|
3
|
+
version: 0.4.0
|
|
4
4
|
description: "X 长文(Article)一键发布:Markdown 原稿 → 可直接复制的 X长文.html(富文本一键复制+配图内嵌)/ X发布稿.txt + 封面图 + 发布清单。沉淀自实战。Use when X 长文、发 X 文章、X article、长文发 X。Do NOT use for 短推文(→ topmind-x)、公众号(→ topmind-wechat-post)。"
|
|
5
5
|
action_category: write
|
|
6
6
|
triggers:
|
|
@@ -33,19 +33,33 @@ updated: 2026-09-29
|
|
|
33
33
|
原稿.md → md2x.py → X发布稿.txt(纯文本兜底)
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
+
## 语言铁律
|
|
37
|
+
|
|
38
|
+
- **默认中文**:标题、正文、配图文案一律用中文写作,这是默认行为,不需要用户每次声明。
|
|
39
|
+
- **英文是例外**:只有用户**明确说**"写英文文章/帖子"时才用英文。用户消息里夹杂英文词、
|
|
40
|
+
给英文参考素材、引用英文原文,都不算"要求写英文"。
|
|
41
|
+
- 引用英文一手素材(官方公告、模型卡、论文标题)时保留英文原文,正文主体仍是中文,
|
|
42
|
+
必要时在旁给中文翻译。
|
|
43
|
+
|
|
36
44
|
## 工作流
|
|
37
45
|
|
|
38
46
|
1. **转 HTML**(一键复制的核心,首选):
|
|
39
47
|
```bash
|
|
40
48
|
python3 scripts/md2x-html.py <原稿>.md --out <包>/X长文.html \
|
|
41
|
-
--images
|
|
49
|
+
--images-from 公众号稿.md [--cover cover-1500x600.png]
|
|
42
50
|
```
|
|
51
|
+
`--images-from` 从公众号稿按文档顺序派生图片(X 稿永远由公众号稿派生时必用)。
|
|
52
|
+
**禁止手工拼 `--images` 列表**:文件名数字顺序 ≠ 文档顺序
|
|
53
|
+
(如 `14-kling` 与 `15-china-models` 按名排序会错位),手工传参曾导致整段配图错乱。
|
|
54
|
+
只有无公众号稿可派生的纯 X 原创稿,才允许用 `--images <图1> <图2> ...`,
|
|
55
|
+
此时必须逐张核对文件名与 `[图N]` 的对应关系。
|
|
43
56
|
单文件 HTML:内联样式 + 配图 base64 内嵌。浏览器打开后点页顶
|
|
44
57
|
「一键复制全文」,富文本(含格式)进剪贴板,去 X 文章编辑器粘贴。
|
|
45
58
|
转换规则见 `references/x-html-format.md`。
|
|
46
59
|
- `#` 首个标题**不进剪贴板**:手动填入 X 标题栏(工具栏有三步话术提示)。
|
|
47
60
|
- 每张配图自动编号 `[图N]`;图片 data-URI 内嵌,能随粘贴带入编辑器最好,
|
|
48
61
|
带不进去时用图下「下载图片」按钮按编号下载再上传——不用找文件、不用对顺序。
|
|
62
|
+
点击图片弹出 lightbox 放大看原图(右键可另存/截图,不拦截右键菜单)。
|
|
49
63
|
- 每个 ``` 提示词块渲染为引用块(X 可识别)+ 右上角「复制提示词」按钮,
|
|
50
64
|
一键复制该块纯文本。**复制分双通道**:作者侧用 HTML 里的按钮(发布前取用文本);
|
|
51
65
|
读者侧一键复制只能来自 X 原生代码块,需在编辑器里 Insert → Code 手动逐块转换
|
|
@@ -57,7 +71,7 @@ updated: 2026-09-29
|
|
|
57
71
|
规则见 `references/x-format.md`。HTML 复制异常时的备用入口。
|
|
58
72
|
转完**通读一遍**:X 不渲染 markdown,标记剥离后断句、emphasis 全靠文字本身,
|
|
59
73
|
读不顺就回原稿改。
|
|
60
|
-
3. **封面图**:调 `topmind-cover`,平台选 `x`,得
|
|
74
|
+
3. **封面图**:调 `topmind-cover`,平台选 `x`,得 1500×600 主图。
|
|
61
75
|
4. **发布清单**:按 `references/publish-checklist.md` 逐项过。
|
|
62
76
|
5. **发布**:用户在 X Article 编辑器粘贴全文、上传封面与配图(按 `[图N]` 编号),
|
|
63
77
|
人工点发布。**API 不发长文**(topmind-x 的 xurl 只覆盖短推文)。
|
|
@@ -70,12 +84,19 @@ updated: 2026-09-29
|
|
|
70
84
|
├── 原稿.md # 输入(或复用既有原稿)
|
|
71
85
|
├── X长文.html # 首选复制入口:浏览器打开,一键复制全文
|
|
72
86
|
├── X发布稿.txt # 纯文本兜底入口
|
|
73
|
-
├── cover-
|
|
87
|
+
├── cover-1500x600.png # 封面(topmind-cover 产出,X 编辑器单独上传)
|
|
74
88
|
└── 发布清单.md # 本次发布 checklist(含时间、链接)
|
|
75
89
|
```
|
|
76
90
|
|
|
77
91
|
## 实战沉淀
|
|
78
92
|
|
|
93
|
+
- **事实铁律**:承重事实(数字、排名、发布日期、融资额)逐条回一手来源
|
|
94
|
+
(官方公告/模型卡/论文/财报);厂商给的数字标"厂商口径"或"官方口径";
|
|
95
|
+
媒体转引标"据 XX 报道";查不到一手来源的传闻删;推测必须显式标"(推测)",
|
|
96
|
+
与事实段落切割,不混写。改稿续写时正文已有数字回源重核(上一轮文本最不可信)。
|
|
97
|
+
- **文字铁律**:去 AI 味、精炼、不编造;看图即得的简单事实不再展开复述;
|
|
98
|
+
多用第三方客观素材,观点可以撞、表达必须原创。
|
|
99
|
+
- **交付铁律**:发布/分享时直接用交付的 HTML 原文件原样呈现,不临时重新生成版本。
|
|
79
100
|
- 补充信息(邀请码、链接、勘误)**不挤正文**,发在发布后首条评论并置顶
|
|
80
101
|
- 标题 ≤140 字符,首段 3 行内出钩子;配图逐张按 `[图N]` 顺序上传,传完对照清单点一遍
|
|
81
102
|
- 事实修正只改发布包,不回头改已发原文(除非勘误)
|
|
@@ -99,3 +120,37 @@ updated: 2026-09-29
|
|
|
99
120
|
|
|
100
121
|
- `topmind-x`:280 字短推文发布(xurl 只覆盖短推文,不发长文)。
|
|
101
122
|
- `topmind-capture`:「只想存档不发布」时的收录路由。
|
|
123
|
+
|
|
124
|
+
## 实战沉淀(2026-10-01 九月全景项目)
|
|
125
|
+
|
|
126
|
+
- **HTML 占位符映射铁律**:`md2x-html.py --cover` 注入封面到 `__COVER__`,正文图按序注入
|
|
127
|
+
`__IMG_01__`–`__IMG_N__`。曾出现错位 bug(封面位置注入 `__IMG_01__`、正文图整体后移、
|
|
128
|
+
最后一张图跑到 `__COVER__`),原因是占位符替换顺序错误。修复后验收标准:
|
|
129
|
+
第一张 base64 图解码为 1500×600(封面尺寸),无占位符残留。
|
|
130
|
+
- **X发布稿.txt 图序**:由 `md2x.py` 从 X长文.md 生成,`[图N]` 编号与 HTML 正文图顺序一致,
|
|
131
|
+
封面不占编号(X 编辑器单独上传封面)。
|
|
132
|
+
|
|
133
|
+
## 实战沉淀(2026-10-01 九月全景·配图错位修复)
|
|
134
|
+
|
|
135
|
+
- **错位症状 A**:Grok 4.7 配图落在 Meta 段落之后;"国产模型一览"落在手机段落之后。
|
|
136
|
+
原因:改稿时只动文字不动图,图片 markdown 行被"落下"到下一段。
|
|
137
|
+
- **铁律**:图片必须紧跟它证明的那段文字(最多隔一段);改稿移动段落时,图片行一起搬。
|
|
138
|
+
- **错位症状 B(根本原因)**:旧版 X 构建从"六、工具与 Agent"起配图全错
|
|
139
|
+
(Codex 段配 OpenRouter 图、Harness 段配 AA 榜单图……)。
|
|
140
|
+
原因:`X长文.md` 里只有裸 `[图N]` 标记,图片靠 `--images` 命令行手工传参;
|
|
141
|
+
构建时按 `images/*` 文件名排序传入,而文件名数字顺序 ≠ 文档顺序
|
|
142
|
+
(`14-kling`/`15-china-models` 建图顺序与文档顺序相反;`21-codex`/`22-harness`
|
|
143
|
+
是后加的,排在 `16-openrouter` 之后)。从图 14 起全部错位一格,
|
|
144
|
+
图 14/15 互换不易察觉,到图 16(Codex 段)才明显暴露。
|
|
145
|
+
- **根治**:`md2x-html.py` 新增 `--images-from 公众号稿.md`,
|
|
146
|
+
从公众号稿的 `![]()` 按文档顺序自动派生图片,**不再允许手工排序**;
|
|
147
|
+
脚本内置校验:`[图N]` 必须连续编号且数量 = 图片数,否则直接报错退出
|
|
148
|
+
(不静默生成错版)。
|
|
149
|
+
- **构建后必跑三项校验**(缺一不可):
|
|
150
|
+
1. 脚本自校验通过(数量/连续性)。
|
|
151
|
+
2. 嵌入图顺序校验:逐张解码 base64,与源文件按文档顺序比对(像素或字节一致即过)。
|
|
152
|
+
3. 图文邻近校验:每张图前后各取 6 行,检查是否出现该图主题关键词
|
|
153
|
+
(如 Grok 图邻近必须有"Grok");章节题图(节首图)只查节标题相关性。
|
|
154
|
+
- **派生纪律**:`X长文.md` 永远由 `公众号稿.md` 重新派生(脚本重排 `[图N]`),
|
|
155
|
+
不手工改编号;派生后 `X发布稿.txt` 同步重生成。
|
|
156
|
+
`公众号稿.md` 是唯一真源:改图先改公众号稿,再重派生 X 稿,两边永不独立改图。
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
- [ ] `X发布稿.txt` 通读一遍:断句顺、无 markdown 残留标记(HTML 复制异常时的兜底)
|
|
10
10
|
- [ ] 标题 ≤140 字符;首段 3 行内出钩子
|
|
11
11
|
- [ ] 承重数字与原稿一致(转格式不改数字)
|
|
12
|
-
- [ ] 封面图
|
|
12
|
+
- [ ] 封面图 1500×600 已备好,标题字无错别字
|
|
13
13
|
- [ ] 配图按 `[图N]` 顺序排好,清单与文件一一对应
|
|
14
14
|
- [ ] 话题标签想好(放文末,不超过 3 个)
|
|
15
15
|
- [ ] 提示词密集型文章:规划好哪些提示词块要在 X 里转原生代码块
|
|
@@ -48,11 +48,23 @@
|
|
|
48
48
|
|
|
49
49
|
## 图片约定
|
|
50
50
|
|
|
51
|
-
- `--images
|
|
51
|
+
- 图片来源:有公众号稿可派生时一律用 `--images-from 公众号稿.md`,
|
|
52
|
+
从源 md 的 `![]()` 按文档顺序自动取图;**禁止手工拼 `--images` 顺序**
|
|
53
|
+
(文件名数字排序 ≠ 文档顺序,2026-10-01 九月全景曾因此从第六节起整段错位)。
|
|
54
|
+
无源可派生的纯 X 原创稿才允许 `--images` 手工传参,且须逐张核对。
|
|
55
|
+
脚本内置校验:`[图N]` 须连续编号且数量 = 图片数,否则报错退出。
|
|
56
|
+
- `--cover` 只做页顶预览 + 下载,**不占 `[图N]` 编号**
|
|
52
57
|
- 配图建议先压缩到宽 900px 左右的 JPEG(单张 <100KB),11 张图总 HTML 约 800KB,
|
|
53
58
|
直接双击打开不卡
|
|
54
59
|
- 下载按钮用 JS 取同图 `src` 触发下载,data-URI 在 HTML 里只存一份(体积减半)
|
|
55
60
|
|
|
61
|
+
## 点击放大(lightbox)
|
|
62
|
+
|
|
63
|
+
- 正文每张配图、封面预览图均可点击,弹出全屏 lightbox 放大查看原图
|
|
64
|
+
- lightbox 内提供「新标签页打开原图」(Blob URL,绕开浏览器对 data: URL 顶层导航的限制)、
|
|
65
|
+
「下载原图」按钮;**刻意不拦截右键菜单**,放大后可右键图片另存,或直接截图
|
|
66
|
+
- lightbox 位于 `#article` 之外,「一键复制全文」不会把它带入剪贴板
|
|
67
|
+
|
|
56
68
|
## 复制行为
|
|
57
69
|
|
|
58
70
|
- 「一键复制全文」:`ClipboardItem` 同时写 `text/html` + `text/plain`,
|