@qcplay/cli 1.0.13 → 1.0.15

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qcplay/cli",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "description": "QCPlay CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,11 +27,17 @@
27
27
  "test:auth": "node bin/qcplay.js auth",
28
28
  "test:publish": "node bin/qcplay.js www-article-list.store ../article.md",
29
29
  "test:wechat": "node test/wechat-article.test.js",
30
+ "test:lark": "node test/lark-article.test.js",
31
+ "test:platforms": "node test/platform-publish.test.js",
32
+ "test:rules": "node test/content-rules.test.js",
33
+ "test:rules-cli": "node test/content-rules-cli.test.js",
34
+ "test:project-catalog": "node test/project-catalog.test.js",
30
35
  "build:cli": "node --check bin/qcplay.js",
31
36
  "pack:check": "npm pack --dry-run"
32
37
  },
33
38
  "license": "MIT",
34
39
  "dependencies": {
35
- "cheerio": "^1.0.0-rc.12"
40
+ "cheerio": "^1.0.0-rc.12",
41
+ "playwright-core": "1.40.1"
36
42
  }
37
43
  }
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: qcplay-article
3
3
  version: 1.0.0
4
- description: "QCPlay 官网文章上传:Use when user mentions 发布文章、上传文章、官网文章、文章模板、微信推文转官网文章、微信公众号文章导入、文章发布、文章草稿、攻略文章、活动文章、视频攻略、萌新入门、资料站文章、文章 Front Matter、article.md 等;use for website article publishing intent only. Do not use for mail/docs/calendar/auth setup/IM chat tasks."
4
+ description: "QCPlay 官网文章上传与多平台分发:Use when user mentions 发布文章、上传文章、官网文章、多平台发布、内容分发、指定平台、TapTap、B站、微博、Discord、文章模板、微信推文转官网文章、微信公众号文章导入、飞书文档转官网文章、文章草稿、攻略文章、活动文章、视频攻略、萌新入门、资料站文章、文章 Front Matter、article.md 等;use for article publishing intent only. Do not use for mail/docs/calendar/auth setup/IM chat tasks."
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["qcplay", "qcplay-cli"]
@@ -9,14 +9,142 @@ metadata:
9
9
  authFile: "~/.qcplay/auth.json"
10
10
  templateCommand: "qcplay article"
11
11
  initCommand: "qcplay article init"
12
- importCommand: "qcplay article import <wechat-url> [file]"
12
+ importCommand: "qcplay article import <wechat-or-feishu-url> [file]"
13
13
  publishCommand: "qcplay www-article-list.store article.md"
14
+ multiPlatformPublishCommand: "qcplay publish article.md --project 最强蜗牛"
14
15
  updateCommand: "qcplay article update [id]"
15
16
  deleteCommand: "qcplay article delete [id]"
16
17
  ---
17
18
 
18
19
  # qcplay www-article-list.store
19
20
 
21
+ ## 多平台发布入口
22
+
23
+ 当用户要求把同一篇文章分发到官网之外的平台时,使用:
24
+
25
+ ```bash
26
+ qcplay publish article.md --project 最强蜗牛
27
+ ```
28
+
29
+ 用户明确指定平台时传入一个或多个 `--platform`:
30
+
31
+ ```bash
32
+ qcplay publish article.md --project 最强蜗牛 --region 国内 --platform TapTap --platform B站
33
+ ```
34
+
35
+ 用户没有指定平台时,不要替用户猜测;让 `publish` 命令在交互终端列出当前项目可用平台并等待选择。只查看清单使用:
36
+
37
+ ```bash
38
+ qcplay publish --project 最强蜗牛 --list-platforms
39
+ ```
40
+
41
+ 平台配置由 CLI 从飞书只读获取,不得把账号、密码或 webhook 写进文章、项目文件、命令参数或回复。TapTap、好游快爆、B站和微博的账号密码配置必须在加载后丢弃;未登录时必须由用户在浏览器中自行填写登录信息或扫码,CLI 不得向登录页写入账号密码或点击登录提交。浏览器出现扫码、验证码、二次验证或反爬校验时必须暂停并请用户完成,不得绕过。官网单独发布仍使用下文的 `www-article-list.store` 流程,原有草稿预览和确认上线规则不变。
42
+
43
+ 平台内容用户规则存放在 `~/.qcplay/platform-rules.json`。`install/update` 仅在文件不存在时创建,已有文件不得覆盖;单次发布或导入可用 `--rules-file <json>`。使用 `qcplay rules init|validate|list` 创建、校验和查看规则。规则可以按来源、项目、区域、平台和 `phase` 匹配,使用有限动作删除标题区间/文案/图片、替换文案/图片或清理图片说明,不得执行 JavaScript。飞书“特殊要求”继续负责动态密令、项目排版和平台配置;用户规则在内置平台处理后应用。
44
+
45
+ 公众号导入可使用 `qcplay article import <url> article.md --rules-file <json> --project <项目>`。`--project` 仅作为导入前规则匹配上下文,不得据此编造文章业务字段。
46
+
47
+ 公众号文章导入必须保留正文和安全排版,并应用 `phase: "import"` 的用户删除规则。`remove_image` 可按 `src`、`alt`、`title`、`caption`、`nearby_text` 或图片 `sha256` 匹配;前五种在下载前删除,指纹规则在下载后、上传前删除。图片动作必须先于章节和文案删除,避免相邻文案先被移除而导致图片无法匹配。默认模板包含删除“回复有奖/评论抽奖”标题区间的规则和一条禁用的导入删除示例。替换和图片说明清理动作在具体平台发布阶段执行。其他引导按当前“项目 + 区域 + 平台”行的飞书“特殊要求”处理。
48
+
49
+ 默认多平台命令保持直接发布。用户明确要求先查看官网外平台的待发布稿时,增加 `--review-draft`(或 `--review`):CLI 填完标题、富文本、图片、封面和发布设置后,在最终提交前保持浏览器打开;用户在 CMD 输入“可以发布”“发布”或直接按 Enter 后才可继续,输入“取消”时不得点击发布。该参数不改变官网流程。好游快爆没有原生草稿箱,只能保持已填好的编辑页供用户预览。
50
+
51
+ 多个浏览器平台必须逐个处理:当前平台登录或验证未完成时不得进入下一个平台;当前浏览器平台失败时,后续平台保持未执行。已有有效持久登录态时必须等待编辑器加载并直接填充内容,不得重复提示登录。好游快爆只允许使用飞书配置中当前游戏对应的 `bbs.3839.com` 发布链接,必须保留有效项目 `fid`(阿瑞斯病毒2 为 `20313`、新仙剑为 `24008`、最强蜗牛为 `12201`),缺失或为 `0` 时停止;未登录时先打开官网首页头像登录入口,完成官方 iframe 登录后最多重试 3 次返回原游戏发布页,并校验登录后的 `m/c/a/fid/type`,禁止落到首页或其他游戏发布页。任何图片或视频都必须确认上传或处理完成后再提交;失败或超时必须停止当前平台。
52
+
53
+ 好游快爆新版发帖页的标题是 `#threadTitle[contenteditable="true"]`,正文是 `.ql-editor[contenteditable="true"]`,发布控件是 `.editSubmit.active`。图片 marker 必须删除整行空段落后再插入图片,不能留下空的图片占位段。填充后连续回读标题和正文,并忽略 Quill 对空白、换行、图片节点和格式文本的重排,按各正文节点的文字顺序校验短片段;失败时明确标记为编辑器写入/回读失败,不归因于文章拉取。标题最多 48 字。点击发布后必须等待 `setThread` 返回 `code: 100`、成功提示或论坛/帖子页跳转,未取得成功回执不得判定发布成功,并应保留浏览器窗口供用户检查。不得因旧版 `input`/`textarea` 选择器缺失而把已登录编辑页误判成登录页。
54
+
55
+ ### TapTap 发布意图映射
56
+
57
+ 用户提到 TapTap 的发布形态或设置时,将意图写入文章 Front Matter,命令仍只传文章文件:
58
+
59
+ ```yaml
60
+ taptap_type: "" # 留空时跟随飞书页面 URL;也可指定 long-post、image-text 或 video
61
+ taptap_forum: "" # 默认使用当前项目同名论坛;填 0 不添加论坛
62
+ taptap_scheduled: "1" # “定时发布”
63
+ taptap_draft: "0" # “保存草稿”时改为 1
64
+ taptap_images: image-1.png,image-2.png
65
+ taptap_video: ./video.mp4
66
+ taptap_cover: ./cover.png
67
+ ```
68
+
69
+ 飞书“特殊要求”中的动态密令、有效期和动态群号不得写进 `article.md`,必须在本次发布命令中提供:
70
+
71
+ ```bash
72
+ qcplay publish article.md --project 新仙剑 --region 国内 --platform TapTap \
73
+ --taptap-secret-code "本次密令" \
74
+ --taptap-secret-period "8月10日~8月16日"
75
+ ```
76
+
77
+ - 用户说“发长帖/长贴”时使用 `taptap_type: long-post`。
78
+ - 用户说“发图文”时使用 `taptap_type: image-text`,并确认至少有 1 张、最多 18 张图片。
79
+ - 用户说“发视频”时使用 `taptap_type: video`,并确认存在可读的本地视频文件;远程 URL 不能直接用于文件上传。
80
+ - 用户说“添加游戏论坛”但未另给名称时,使用当前项目名;用户给出论坛名时按原名填写。
81
+ - TapTap 论坛搜索包含两级选择:先点击搜索建议,再点击精确同名论坛结果行,然后执行“返回 → 完成”。必须识别 `tap-button--disabled` CSS 禁用态;只有“完成”可用、弹窗关闭且主页面回读到已选论坛后才能继续发布。主页面已存在同名论坛时不得重复点击反选。
82
+ - 用户说“定时发布”时设置 `taptap_scheduled: "1"`,让 CLI 勾选定时发布;页面打开后由用户确认具体日期与时间。
83
+ - 用户说“存为草稿/保存草稿”时设置 `taptap_draft: "1"`,不得点击正式发布。
84
+ - `taptap_scheduled` 与 `taptap_draft` 不得同时设为 `"1"`;意图冲突时先让用户选择定时发布或保存草稿。
85
+ - 未指定形态时,文章默认使用长帖,避免误入必须上传图片的图文模式。
86
+ - 长帖正文中的图片必须按原文顺序通过 TapTap 官方正文图片控件上传,不得替换成图片 URL 文本;普通 `http/https` 超链接必须保留为 TapTap 可点击链接。
87
+ - 图片上传后的说明可以留空;文章原文已有的 `alt`、`title` 或 `figcaption` 默认保留,只有用户规则显式配置 `remove_image_caption` 时才清理。
88
+ - Markdown 正文必须先转成富文本;在 TapTap 支持范围内保留标题强调、段落间距、有序/无序列表、引用、粗体、斜体、下划线和删除线。不得声称 TapTap 不支持的任意 CSS 已被完整还原。
89
+ - 图文模式的图片进入 TapTap 顶部图片区,正文超链接仍需保留为可点击链接;视频模式正文也保留超链接。
90
+ - 自动化测试不得连接真实账号上传测试图片;真实编辑器结构探测必须断网进行,不得保存或发布测试草稿。
91
+ - 只有 TapTap 返回成功提示、离开编辑页或发布接口返回成功时,CLI 才能报告成功;仅点击按钮不算成功。
92
+ - TapTap 自动草稿创建/更新不是正式发布成功。正式发布必须等待 `moment/topic` 的直接创建接口或 `moment/topic-draft` 的正式发布接口成功后才能结束;显式保存草稿时才接受草稿创建/更新回执。
93
+
94
+ 公众号来源(`source_url` 为 `mp.weixin.qq.com`)发布到 TapTap 时,飞书平台配置中当前项目、区域、平台这一行的“特殊要求”列是主要内容约束来源;最强蜗牛还必须应用上文五个平台共享的已确认规则。关注、扫码、阅读原文、在看、朋友圈转发和后台回复等内容仅在当前行或该共享规则明确要求删除时清理。
95
+
96
+ 阿瑞斯病毒公众号导入稿必须写入 `distribution_project: "阿瑞斯病毒2"`。发布到 TapTap 时,按公众号视觉结构把 16px 品牌色一级板块转换为一级标题,把两位编号及其标题卡片转换为二级标题;其余颜色、加粗正文按原文保留。删除“回复有奖”标题到下一个一级板块之前的内容,保留“版本预约奖励”;板块之间插入 TapTap 分割线。未显式配置 `taptap_cover` 时使用公众号封面。飞书 URL 的 `app_id=387841&group_id=663910` 应进入“阿瑞斯病毒2 · 综合”,已存在该论坛时不得重复添加或反选;官方账号会话即为官方身份,不猜测或切换其他身份。
97
+
98
+ - 生成或整理文章前先执行 `qcplay publish --project <项目> --region <区域> --list-platforms`。CLI 会脱敏显示“特殊要求”中需要用户提供的字段,不展示账号、密码、Webhook 或整段原文。
99
+ - “特殊要求”明确提到密令、生效时间/有效期时,分别通过 `--taptap-secret-code`、`--taptap-secret-period` 取得本次值。最强蜗牛和新仙剑的密令和有效期为可选值,未提供时不生成密令福利区;其他项目只有在配置明确声明为必填且缺失时才不得启动浏览器或发布。
100
+ - “特殊要求”明确要求标题、加粗、颜色、字号或富文本排版时,保留 TapTap 支持的对应格式;明确要求去掉吟诗、人设替换或指定密令结尾时,按该行内容执行。
101
+ - 除最强蜗牛五个平台共享规则外,未配置“特殊要求”或该列未声明某项约束时,不得因为项目名称或历史经验自行套用。飞书配置更新后以最新列内容为准。
102
+ - 密令、有效期等动态内容只能使用用户明确提供的值,严禁猜测、沿用旧文章值或自行生成;飞书已配置的固定群号不得反向要求用户重复输入。
103
+
104
+ ### 微博发布意图映射
105
+
106
+ 微博文章使用头条文章编辑器,不使用首页普通微博发送框。标题、导语和正文必须分别写入对应控件:
107
+
108
+ ```yaml
109
+ weibo_intro: "" # 可选;留空使用 article_excerpt,最多 44 字
110
+ weibo_super_topic: "" # 可选;留空按当前项目生成 @项目超话
111
+ weibo_cover: "" # 可选;必须引用正文图片,留空默认使用正文第 1 张图
112
+ ```
113
+
114
+ - 标题写入“请输入标题”文本域,最多 32 个字符;导语写入“导语(选填)”,最多 44 个字符。
115
+ - 正文末尾必须添加当前游戏对应的超话提及,例如项目“最强蜗牛”默认使用 `@最强蜗牛超话`。优先使用 `weibo_super_topic`,其次使用飞书“特殊要求”中明确写出的 `@…超话` 或 `#…超话` 并保留标记形式,否则按当前项目名生成;正文已有同名提及时不得重复添加。
116
+ - 正文必须写入 Tiptap/ProseMirror 富文本编辑器,保留平台支持的段落、标题、列表、引用和行内格式。
117
+ - 正文图片必须按原文位置和顺序通过“图片库”上传。首次打开图片库时,必须逐个点击已有 `.image-list .image-item` 内的 `.ico_delpic`,每次确认旧缩略图数量减少后再继续,清空后才上传第一张本次文章图片;本次后续图片不得再次清理。相同规范化图片地址只保留首次出现的一张;等待加载状态结束后点击新 `.image-list .image-item`,确认出现 `is-selected` 且“插入”按钮移除 `n-button--disabled` 后再点击。出现裁剪对话框时使用默认“插入/确定/完成”,正文图片写入后才处理下一张。不得降级为图片 URL 或普通微博九宫格附件。
118
+ - 正文含图片时必须设置文章封面:打开 `.cover-empty` 或现有 `.cover-preview`,在“正文图片”页签选择 `weibo_cover` 指定图片;未指定时选择第 1 个 `.image-list .image-item`。确认 `is-selected` 后依次点击“下一步 → 图片裁剪”,等待 `cropper-image` 和 `cropper-selection` 连续稳定后再点“确定”。若提示“图片处理失败”,等待提示消失后最多自动重试一次;封面未回显时不得继续发布。
119
+ - 普通 `http/https` 超链接必须保留为可点击链接,并在提交前回读检查。
120
+ - 封面确认且回显后必须立即按“下一步 → 发布”完成文章投稿。只有发布接口、成功提示或发布历史页面跳转给出成功回执时,CLI 才能报告成功。
121
+ - 自动化测试不得连接真实微博账号上传或发布测试内容。
122
+
123
+ ### B站投稿意图映射
124
+
125
+ 用户要求发布 B站专栏或视频时,将投稿形态和平台字段写入文章 Front Matter:
126
+
127
+ ```yaml
128
+ bilibili_type: article # 专栏图文;视频使用 video
129
+ bilibili_video: ./video.mp4 # 视频投稿使用的本地文件
130
+ bilibili_cover: ./cover.png
131
+ bilibili_category: 游戏/手机游戏
132
+ bilibili_tags: 最强蜗牛,攻略
133
+ bilibili_topic: 最强蜗牛攻略
134
+ ```
135
+
136
+ - 未指定形态时使用 `bilibili_type: article`,进入官方专栏编辑地址。
137
+ - 用户说“B站视频投稿”时使用 `bilibili_type: video`,并确认 `bilibili_video` 是可读的本地文件;不得把远程 URL 直接交给视频文件控件。
138
+ - 视频文件必须小于 16GB,推荐使用 MP4、MOV 或 MKV;视频上传完成并出现稿件表单后才能填写标题、简介和投稿设置。
139
+ - 专栏正文必须写成富文本;正文图片按原文位置通过 B站官方图片控件上传,`http/https` 超链接必须保留为可点击链接。
140
+ - 默认用户规则模板在公众号来源发布到 B 站时删除包含“官充”的标题区间,直到下一个标题;实际执行以 `platform-rules.json` 为准,用户可修改、限定项目或禁用。普通正文仅提到“官充”不得触发标题区间删除。
141
+ - 在 B站支持范围内保留标题、段落、列表、引用、粗体、斜体、下划线、删除线、颜色和对齐;不得声称任意 CSS 都能完整还原。
142
+ - 视频简介不等同于专栏富文本。带标签的链接应同时写入可见 URL,避免只剩链接文字。
143
+ - `bilibili_category` 使用 `/` 分隔多级分区;`bilibili_tags` 最多 10 个。
144
+ - 用户指定 B站话题时写入 `bilibili_topic`;未填写时使用飞书当前平台行“特殊要求”中明确指定的话题。CLI 必须搜索并选择精确同名话题,找不到时停止投稿,不得改选相似话题;两处都未指定时不得猜测话题。
145
+ - 只有 B站返回成功提示、离开投稿页或投稿接口返回成功时,CLI 才能报告成功;仅点击按钮不算成功。
146
+ - 自动化测试不得连接真实 B站账号上传图片或视频,也不得保存或发布测试稿件。
147
+
20
148
  ## CRITICAL — 文章上传工作流,必须遵循
21
149
 
22
150
  本 Skill 用于通过 QCPlay CLI 保存、预览、上线和删除官网文章。
@@ -43,6 +171,14 @@ qcplay-cli www-article-list.store article.md
43
171
  qcplay article import "https://mp.weixin.qq.com/s/..." article.md
44
172
  ```
45
173
 
174
+ 当内容来源是飞书 Docx/Wiki 文档时,也使用 `article import`。CLI 必须读取 `docs +fetch --detail full` 的 XML 样式结构,不得用会丢失颜色、高亮、对齐和列宽的 Markdown 导出替代:
175
+
176
+ ```bash
177
+ qcplay article import "https://tenant.feishu.cn/wiki/..." article.md
178
+ ```
179
+
180
+ 飞书转换需保留标题层级、粗体/斜体、文字颜色、背景高亮、对齐、引用、编号列表、链接、表格列宽和合并单元格;宽表格在窄屏横向滚动。无法取得完整 XML 或图片缺少可访问地址时必须停止,不生成不完整草稿。
181
+
46
182
  该命令只生成本地官网文章草稿,不会提交到官网。确认草稿正文和 Front Matter 后,再执行保存命令。
47
183
 
48
184
  保存命令始终以 `status: "0"` 创建未上线文章,并输出文章 ID 和可点击预览地址。保存成功后必须打开该预览网页,只让用户本人检查文章内容和排版。AI 不得自动访问、抓取、截图、分析、比较或判断预览内容。只有用户明确确认上线后,才能执行:
@@ -138,6 +274,12 @@ QCPlay CLI 调用认证后端保存文章
138
274
  10. **微信正文图片必须全部转存成功**
139
275
  正文和封面图片必须先下载并上传到 `http://api.qingcigame.com/novel/time/literature/avatar`。接口返回的 `code` 不是 `200`、没有返回 `data.path`,或任意图片下载失败时,必须终止转换,不得生成或发布不完整文章。
140
276
 
277
+ 11. **微信专属引导按飞书平台行处理**
278
+ 导入 `mp.weixin.qq.com` 文章时保留关注公众号、长按扫码、阅读原文、社群和活动板块,避免在目标平台确定前不可逆删除。分发时按当前项目、区域、平台行的“特殊要求”执行清理;最强蜗牛的官网、B站、TapTap、微博和好游快爆还要应用共享内容规则。没有删除要求时不得套用其他游戏或平台的规则。不得对其他来源文章启用该规则。
279
+
280
+ 12. **微信排版保留并清理图片加载占位**
281
+ 微信正文的安全内联样式、字号、颜色、背景、对齐、间距和容器层级必须保留。正文图片转存成功后,移除 `js_img_loading`、`wx_img_loading` 等加载占位节点,并把无意义的默认 `alt="图片"` 归一为空;不得删除真正的图片说明,也不得为了清理“图片”二字而删除承载排版样式的父容器。
282
+
141
283
  ---
142
284
 
143
285
  ## 数据真实性与操作合规
@@ -14,8 +14,25 @@ release_time: 2026-07-09
14
14
  area: pc
15
15
  sort: 100
16
16
  game_id: 最强蜗牛
17
+ distribution_project: ""
17
18
  index_pc_img: ""
18
19
  index_move_img: ""
20
+ taptap_type: ""
21
+ taptap_forum: "" # 留空默认使用当前项目同名论坛;填 0 不添加论坛
22
+ taptap_scheduled: "0"
23
+ taptap_draft: "0"
24
+ taptap_images: ""
25
+ taptap_video: ""
26
+ taptap_cover: ""
27
+ bilibili_type: article
28
+ bilibili_video: ""
29
+ bilibili_cover: ""
30
+ bilibili_category: ""
31
+ bilibili_tags: ""
32
+ bilibili_topic: ""
33
+ weibo_intro: ""
34
+ weibo_super_topic: ""
35
+ weibo_cover: ""
19
36
  ---
20
37
 
21
38
  # 最强蜗牛萌新入门指南
@@ -0,0 +1,22 @@
1
+ ---
2
+ article_title: Strongest Snail Article Title
3
+ language: america_en
4
+ thumbnail: https://example.com/thumbnail.png
5
+ move_thumbnail: https://example.com/mobile-thumbnail.png
6
+ article_excerpt: Short article description.
7
+ article_url: strongest-snail-article-slug
8
+ origin: QCPlay
9
+ status: "0"
10
+ cate_id: "2"
11
+ video_link: ""
12
+ is_hot: "0"
13
+ is_index: "0"
14
+ release_time: "2026-08-17"
15
+ area: "1"
16
+ sort: "1"
17
+ game_id: "64"
18
+ ---
19
+
20
+ # Strongest Snail Article Title
21
+
22
+ Write the article content here.