@yixiaoermail/cli 3.1.0 → 3.1.2

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 (88) hide show
  1. package/bin/ensure-executable.js +25 -0
  2. package/bin/postinstall.js +18 -0
  3. package/bin/resolve-binary.js +36 -0
  4. package/bin/yxer.js +8 -17
  5. package/dist/yxer-darwin-amd64 +0 -0
  6. package/dist/yxer-darwin-arm64 +0 -0
  7. package/dist/yxer-linux-amd64 +0 -0
  8. package/dist/yxer-linux-arm64 +0 -0
  9. package/dist/yxer-windows-amd64.exe +0 -0
  10. package/dist/yxer-windows-arm64.exe +0 -0
  11. package/package.json +7 -1
  12. package/references/cli/command-reference.md +234 -0
  13. package/references/cli/skill-install.md +76 -0
  14. package/references/legacy/capabilities.md +32 -0
  15. package/references/platforms/index.md +20 -0
  16. package/references/workflows/account-selection.md +38 -0
  17. package/references/workflows/common-rules.md +257 -0
  18. package/references/workflows/draft-workflow.md +44 -0
  19. package/references/workflows/local-vs-cloud.md +50 -0
  20. package/references/workflows/material-workflow.md +43 -0
  21. package/references/workflows/payload-sourcing.md +70 -0
  22. package/references/workflows/publish-article.md +66 -0
  23. package/references/workflows/publish-imageText.md +62 -0
  24. package/references/workflows/publish-troubleshooting.md +50 -0
  25. package/references/workflows/publish-video.md +63 -0
  26. package/schemas/account.schema.json +19 -0
  27. package/schemas/platforms/acfun.article.schema.json +117 -0
  28. package/schemas/platforms/acfun.video.schema.json +139 -0
  29. package/schemas/platforms/aiqiyi.article.schema.json +29 -0
  30. package/schemas/platforms/aiqiyi.video.schema.json +154 -0
  31. package/schemas/platforms/baijiahao.article.schema.json +160 -0
  32. package/schemas/platforms/baijiahao.imageText.schema.json +110 -0
  33. package/schemas/platforms/baijiahao.video.schema.json +179 -0
  34. package/schemas/platforms/bilibili.article.schema.json +109 -0
  35. package/schemas/platforms/bilibili.video.schema.json +175 -0
  36. package/schemas/platforms/chejiahao.article.schema.json +108 -0
  37. package/schemas/platforms/chejiahao.video.schema.json +111 -0
  38. package/schemas/platforms/csdn.article.schema.json +106 -0
  39. package/schemas/platforms/dayuhao.article.schema.json +106 -0
  40. package/schemas/platforms/dayuhao.video.schema.json +153 -0
  41. package/schemas/platforms/dewu.video.schema.json +134 -0
  42. package/schemas/platforms/douban.article.schema.json +48 -0
  43. package/schemas/platforms/douyin.article.schema.json +318 -0
  44. package/schemas/platforms/douyin.imageText.schema.json +217 -0
  45. package/schemas/platforms/douyin.video.schema.json +744 -0
  46. package/schemas/platforms/duoduoshipin.video.schema.json +108 -0
  47. package/schemas/platforms/fengwang.video.schema.json +135 -0
  48. package/schemas/platforms/jianshu.article.schema.json +33 -0
  49. package/schemas/platforms/kuaichuanhao.article.schema.json +83 -0
  50. package/schemas/platforms/kuaishou.imageText.schema.json +170 -0
  51. package/schemas/platforms/kuaishou.video.schema.json +240 -0
  52. package/schemas/platforms/meipai.video.schema.json +123 -0
  53. package/schemas/platforms/meiyou.video.schema.json +96 -0
  54. package/schemas/platforms/pipixia.video.schema.json +94 -0
  55. package/schemas/platforms/qiehao.article.schema.json +89 -0
  56. package/schemas/platforms/qiehao.video.schema.json +147 -0
  57. package/schemas/platforms/shipinhao.imageText.schema.json +138 -0
  58. package/schemas/platforms/shipinhao.video.schema.json +236 -0
  59. package/schemas/platforms/souhuhao.article.schema.json +73 -0
  60. package/schemas/platforms/souhuhao.video.schema.json +171 -0
  61. package/schemas/platforms/souhushipin.video.schema.json +115 -0
  62. package/schemas/platforms/tengxunshipin.video.schema.json +114 -0
  63. package/schemas/platforms/toutiaohao.article.schema.json +165 -0
  64. package/schemas/platforms/toutiaohao.imageText.schema.json +83 -0
  65. package/schemas/platforms/toutiaohao.video.schema.json +134 -0
  66. package/schemas/platforms/wangyihao.article.schema.json +85 -0
  67. package/schemas/platforms/wangyihao.video.schema.json +151 -0
  68. package/schemas/platforms/weishi.video.schema.json +101 -0
  69. package/schemas/platforms/weixin.account.article.schema.json +148 -0
  70. package/schemas/platforms/xhs.imageText.schema.json +119 -0
  71. package/schemas/platforms/xiaohongshu.video.schema.json +224 -0
  72. package/schemas/platforms/xiaohongshushop.video.schema.json +141 -0
  73. package/schemas/platforms/xinlang.article.schema.json +69 -0
  74. package/schemas/platforms/xinlang.imageText.schema.json +85 -0
  75. package/schemas/platforms/xinlang.video.schema.json +151 -0
  76. package/schemas/platforms/xueqiuhao.article.schema.json +84 -0
  77. package/schemas/platforms/yichehao.article.schema.json +140 -0
  78. package/schemas/platforms/yichehao.video.schema.json +101 -0
  79. package/schemas/platforms/yidianhao.article.schema.json +77 -0
  80. package/schemas/platforms/yidianhao.video.schema.json +152 -0
  81. package/schemas/platforms/zhihu.article.schema.json +104 -0
  82. package/schemas/platforms/zhihu.imageText.schema.json +61 -0
  83. package/schemas/platforms/zhihu.video.schema.json +144 -0
  84. package/schemas/publish.schema.json +26 -0
  85. package/skills/yixiaoer/SKILL.md +1 -1
  86. package/skills/yixiaoer/plugin.json +1 -1
  87. package/skills/yixiaoer/references/platforms/article/toutiaohao.md +28 -28
  88. package/skills/yixiaoer/references/platforms/imageText/baijiahao.md +41 -30
@@ -0,0 +1,257 @@
1
+ # 发布通用规则
2
+
3
+ > 所有发布工作流均需遵守本文档规则。
4
+
5
+ ---
6
+
7
+ ## 智能助理原则
8
+
9
+ 做智能助理,不做表单填写机。能自动补全的默认值先补全,只在必须决策时才追问用户。
10
+
11
+ ## 强制门禁
12
+
13
+ 发布类任务必须满足以下顺序;任意一步未完成,都不允许继续到下一步:
14
+
15
+ 1. 读取 `skills/yixiaoer/SKILL.md`
16
+ 2. 读取当前文件
17
+ 3. 读取 `account-selection.md`、`local-vs-cloud.md`、`payload-sourcing.md`
18
+ 4. 读取对应类型 workflow
19
+ 5. 执行 `yxer doctor`
20
+ 6. 执行 `yxer accounts list`
21
+ 7. 执行 `yxer prepare <platform> <type>`
22
+ 8. 优先执行 `yxer schema fields <platform> <type>`;需要 payload 骨架时再执行 `yxer schema get <platform> <type>`
23
+ 9. 执行 `yxer upload`
24
+ 10. 执行动态字段查询命令
25
+ 11. 组装 payload
26
+ 12. 执行 `yxer validate`
27
+ 13. 执行 `yxer publish`
28
+
29
+ 禁止行为:
30
+
31
+ - 跳过 `prepare` / `schema fields` / `schema get` 直接手写 payload
32
+ - 先执行 `publish`,失败后再补 `validate`
33
+ - 从空白 JSON 文件开始猜字段、猜层级、猜顺序
34
+ - 未读取 workflow 就按历史记忆填平台字段
35
+
36
+ ## 发布前自检清单
37
+
38
+ 每次真正执行 `validate` / `publish` 前,Agent 应先确认:
39
+
40
+ - `[ ]` 已读技能入口
41
+ - `[ ]` 已读通用规则
42
+ - `[ ]` 已读类型 workflow
43
+ - `[ ]` 已完成环境检查
44
+ - `[ ]` 已确认账号有效
45
+ - `[ ]` 已拿到最新 `prepare` 结果
46
+ - `[ ]` 已拿到最新 `schema fields` 结果;如需骨架再补 `schema get`
47
+ - `[ ]` 已完成上传,不存在外部 URL 直填
48
+ - `[ ]` 已查询动态字段,不存在手写 `raw`
49
+ - `[ ]` 当前 payload 不含模板占位符
50
+ - `[ ]` 当前 payload 已先通过 `validate`
51
+
52
+ ## 数据真实性原则
53
+
54
+ - Agent 组装请求数据时,必须以 `yxer prepare`、`yxer schema fields` / `schema get`、平台文档和 CLI 返回结果为唯一依据。
55
+ - 严禁自行猜测字段名、层级、枚举、默认值、示例值、`raw` 对象内容或资源元数据。
56
+ - 文档未定义、schema 未声明、CLI 未返回的字段,不得写入 payload。
57
+ - 动态字段和复杂对象必须先查询后填写;查不到时继续查询或向用户确认,不能凭经验编造。
58
+
59
+ ---
60
+
61
+ ## 发布通道判断规则
62
+
63
+ Agent 在任何 `publish` 之前,都要先读取 [`local-vs-cloud.md`](./local-vs-cloud.md) 并判断这次任务是云发布还是本机发布。
64
+
65
+ ### 何时用云发布
66
+
67
+ - 用户未明确指定发布通道
68
+ - 用户只说“帮我发布”,没有强调本机客户端
69
+ - 当前环境没有可用 `clientId`
70
+
71
+ ### 何时用本机发布
72
+
73
+ - 用户明确说“本机发布”“本地发布”“走客户端发布”
74
+ - 用户明确表示不要走云端代理,或者希望走当前机器网络环境
75
+ - 云发布已因代理问题失败,用户接受改走本机
76
+
77
+ ### 本机发布执行规则
78
+
79
+ - 必须显式使用 `publishChannel=local`
80
+ - 必须提供 `clientId`
81
+ - `validate`、`publish --dry-run`、正式 `publish` 必须使用同一套发布通道参数,避免“校验通过但执行模式不一致”
82
+ - `clientId` 获取优先级:
83
+ 1. payload 中已有 `clientId`
84
+ 2. 命令 flags:`--client-id <clientId>`
85
+ 3. 第四个位置参数:`yxer publish <type> <platform> <payload.json> <clientId>`
86
+ 4. 本地配置:`yxer config set-local-client-id <clientId>` 后由 CLI 自动读取
87
+
88
+ 推荐命令形态:
89
+
90
+ ```bash
91
+ yxer validate <platform> <type> .\payload.json --publish-channel local --client-id <clientId>
92
+ yxer publish <type> <platform> .\payload.json --publish-channel local --client-id <clientId> --dry-run
93
+ yxer publish <type> <platform> .\payload.json --publish-channel local --client-id <clientId>
94
+ ```
95
+
96
+ 如果已经通过 `yxer config set-local-client-id <clientId>` 预设默认值,则可省略 `--client-id`,但仍建议显式保留 `--publish-channel local`。
97
+
98
+ ### 发布通道失败后的回退
99
+
100
+ - 本机发布报“客户端不在线”或“获取在线设备列表失败”:
101
+ - 提示用户启动并登录蚁小二客户端
102
+ - 若用户不方便保持在线,建议改用云发布
103
+ - 云发布报“账号代理不存在”:
104
+ - 提示检查账号代理配置
105
+ - 若用户希望立即绕过代理限制,可改用本机发布
106
+
107
+ ---
108
+
109
+ ## 默认值自动补全规则
110
+
111
+ 字段来源和修 payload 顺序,优先遵循 [`payload-sourcing.md`](./payload-sourcing.md)。
112
+
113
+ ### 标准 payload 结构
114
+
115
+ 所有平台都必须使用同一套标准发布结构:
116
+
117
+ ```json
118
+ {
119
+ "action": "publish",
120
+ "publishType": "<video|imageText|article>",
121
+ "platforms": ["<平台中文名>"],
122
+ "publishChannel": "cloud",
123
+ "publishArgs": {
124
+ "accountForms": [
125
+ {
126
+ "platformAccountId": "<platformAccountId>",
127
+ "contentPublishForm": {
128
+ "formType": "task"
129
+ }
130
+ }
131
+ ]
132
+ }
133
+ }
134
+ ```
135
+
136
+ 强约束:
137
+
138
+ - 顶层必须包含 `publishArgs`
139
+ - `accountForms` 只能出现在 `publishArgs.accountForms`
140
+ - 平台差异字段默认填写在 `publishArgs.accountForms[].contentPublishForm`
141
+ - 共享资源字段可放在 `publishArgs` 根级,与 `accountForms` 同级,例如 `video`、`images`、`cover`、`coverKey`、`content`
142
+ - 文章正文推荐放在 `publishArgs.content`,再由 CLI 自动补齐到 `accountForms[].contentPublishForm.content`
143
+ - 不再兼容顶层 `accountForms`
144
+ - 不再兼容直接把平台表单字段放在 payload 顶层
145
+
146
+ 以下字段 Agent 应自动填入,无需询问用户:
147
+
148
+ | 字段 | 默认值 | 说明 |
149
+ | --- | --- | --- |
150
+ | `formType` | `"task"` | 固定值,无需询问 |
151
+ | `publishChannel` | `"cloud"` | 仅在用户未指定本机发布时默认使用 |
152
+ | `images[].key/size/width/height/format` | 从 `yxer upload` 结果自动获取 | 严禁手动编造 |
153
+ | `video.key/size/width/height/duration/format` | 从 `yxer upload` 结果自动获取 | 严禁手动编造 |
154
+ | `cover` / `coverKey` | 默认使用 `images[0]` 或视频封面 | 用户未单独指定封面时自动使用 |
155
+
156
+ 在自动填值之前,Agent 必须先读取平台前置数据和 schema:
157
+
158
+ - 先执行 `yxer prepare <platform> <type>`,确认该平台该类型需要哪些表单字段、账号能力和前置数据
159
+ - 先执行 `yxer schema fields <platform> <type>`,确认字段名、类型和必填项;需要根层级骨架时再执行 `yxer schema get <platform> <type>`
160
+ - 只有在 `prepare` / `schema fields` / `schema get` 已确认后,才开始填写或补齐 `payload.json`
161
+ - Agent 不允许从空白 JSON 手工拼接 payload;必须先基于标准结构或 CLI 模板生成骨架,再按返回结果填值
162
+
163
+ 以下字段应先向用户确认,再填入:
164
+
165
+ | 字段 | 确认方式 |
166
+ | --- | --- |
167
+ | `title` | 展示标题内容,请用户确认 |
168
+ | `description` / `content` | 如用户未提供,从标题自动生成并展示给用户确认 |
169
+ | `platformAccountId` | 如用户只有一个在线账号,自动选择并告知用户;多个则列出让用户选 |
170
+ | `scheduledTime` | 用户明确要求定时发布才询问时间;CLI 中统一传 13 位 Unix 毫秒时间戳,默认立即发布 |
171
+ | `publishChannel` | 用户明确提到本机/本地/客户端发布时,必须切换为 `local` |
172
+ | `clientId` | 用户要求本机发布且当前配置中没有默认值时,必须补齐 |
173
+
174
+ ---
175
+
176
+ ## 资源上传规范
177
+
178
+ ### 图片上传
179
+
180
+ - 支持格式:`jpg` / `png` / `webp`
181
+ - 每张图必须单独调用 `yxer upload` 获取 key
182
+ - 从返回结果中提取 `key` / `size` / `width` / `height` / `format`
183
+ - 禁止手动编造这些字段
184
+
185
+ ### 视频上传
186
+
187
+ - 支持格式:`mp4` / `mov`
188
+ - 调用 `yxer upload <视频路径>` 获取 key
189
+ - 返回结果额外包含 `duration`
190
+ - 视频封面必须单独上传,不能用视频文件本身代替封面
191
+
192
+ ### URL 资源
193
+
194
+ - 直接传 HTTP/HTTPS URL,`yxer upload` 会自动下载后上传
195
+ - 本地文件传绝对路径
196
+
197
+ ---
198
+
199
+ ## 复杂对象查询规范
200
+
201
+ 账号选择和 `platformAccountId` 确认,优先遵循 [`account-selection.md`](./account-selection.md)。
202
+
203
+ 以下字段严禁手动构造,必须通过查询命令获取完整 `raw` 对象:
204
+
205
+ | 字段 | 查询命令 | 返回必需字段 |
206
+ | --- | --- | --- |
207
+ | `location` | `yxer query locations <account_id> [--query 关键词]` | 整个 `yxer query locations` 返回对象 |
208
+ | `music` | `yxer query music <account_id> [--query 关键词]` | 整个 `yxer query music` 返回对象 |
209
+ | `collection` / `sub_collection` | `yxer query collections <account_id> [--type video]` | 整个 `yxer query collections` 返回对象 |
210
+ | `challenge` | `yxer query challenges <account_id> [--query 关键词]` | 整个 `yxer query challenges` 返回对象 |
211
+ | `category` | `yxer query categories <account_id> [--type video\|article]` | 整个 `yxer query categories` 返回对象 |
212
+ | `goods` | `yxer query goods <account_id> [--query 关键词]` | 整个 `yxer query goods` 返回对象 |
213
+
214
+ 查询后,将完整返回对象填入 payload 对应字段,不要只填 ID 或名称。
215
+ 前置查询对象一律不允许简化,包括 `location`、`goods`、`music`、`collection`、`challenge`、`category` 等;必须使用 CLI 查询返回的完整对象数据。
216
+ 其中 `music` 的 `playUrl` / `url` 属于查询结果元数据,不能因为外链规则手动删除。
217
+
218
+ ---
219
+
220
+ ## 分类层级规则
221
+
222
+ 若分类存在层级结构,Agent 必须选择并提交最深层的叶子节点。
223
+
224
+ 示例:
225
+
226
+ ```text
227
+ 错误:只填 "美食"
228
+ 正确:填 "美食" 下的 "家常菜"
229
+ ```
230
+
231
+ ---
232
+
233
+ ## 错误处理
234
+
235
+ | 错误场景 | 处理方式 |
236
+ | --- | --- |
237
+ | `yxer validate` 失败 | 读取错误信息,修正对应字段后重新校验 |
238
+ | `yxer publish` 失败 | 读取错误信息,判断是否需要重新 upload 或修正参数 |
239
+ | `yxer upload` 失败 | 检查文件路径或 URL 是否有效,重试一次 |
240
+ | `yxer accounts` 无在线账号 | 告知用户,建议检查账号 cookie 是否过期 |
241
+ | 查询命令返回空 | 放宽关键词重试;仍为空则告知用户该账号不支持此功能 |
242
+ | 本机发布失败且提示客户端不在线 | 引导用户启动客户端,或建议改用云发布 |
243
+ | 云发布失败且提示账号代理不存在 | 提示检查代理,或建议改用本机发布 |
244
+
245
+ ---
246
+
247
+ ## 严禁行为
248
+
249
+ - 未确认账号 `status=1` 就构造 payload
250
+ - 用户明确要求本机发布时,仍然默认走云发布
251
+ - 使用本机发布却没有显式提供或确认 `clientId`
252
+ - 手动编造 `key` / `size` / `width` / `height` / `duration`
253
+ - 手动构造 `location` / `music` / `collection` / `challenge` 的 `raw`
254
+ - 跳过 `yxer validate` 直接执行 `yxer publish`
255
+ - 在 payload 中直接使用外部 URL 作为图片或视频地址
256
+ - 跳过工作流步骤,自行拼大 JSON payload
257
+ - 用户说“草稿”时不询问类型,自行猜测是蚁小二草稿还是平台草稿
@@ -0,0 +1,44 @@
1
+ # 草稿工作流
2
+
3
+ > 适用范围:用户提到“保存草稿”“先存草稿”“不要立即发布”“稍后再发”。
4
+
5
+ ## 何时读取
6
+
7
+ - 用户要保存蚁小二内部草稿
8
+ - 用户把“草稿”和“发布”混在一起描述,需要分流
9
+
10
+ ## 先做类型判断
11
+
12
+ 先确认用户说的是哪一种:
13
+
14
+ - 蚁小二内部草稿:走 `yxer draft save <payload.json>`
15
+ - 平台草稿箱:仍走正常 `publish`,只是平台字段里可能体现草稿语义
16
+
17
+ 若用户只说“保存草稿”,不要直接执行,先区分这两种。
18
+
19
+ ## 蚁小二草稿标准步骤
20
+
21
+ 1. 先判断发布类型:`video` / `imageText` / `article`
22
+ 2. 读取 [`payload-sourcing.md`](./payload-sourcing.md)
23
+ 3. 如 payload 尚未成型,按对应发布工作流补齐账号、schema、资源和动态字段
24
+ 4. 生成或修正草稿 payload
25
+ 5. 执行 `yxer draft save <payload.json> [--dry-run]`
26
+
27
+ ## 规则
28
+
29
+ - `yxer draft save` 保存的是蚁小二内部草稿,不等同于平台草稿箱
30
+ - 草稿 payload 仍应使用统一发布结构,不要另造 schema
31
+ - 若用户后续要正式发布,仍需回到对应发布 workflow,先 `validate` 再 `publish`
32
+
33
+ ## 推荐命令
34
+
35
+ ```bash
36
+ yxer draft save .\draft-payload.json --dry-run
37
+ yxer draft save .\draft-payload.json
38
+ ```
39
+
40
+ ## 严禁行为
41
+
42
+ - 把 `yxer draft save` 当成平台草稿发布
43
+ - 用户没确认草稿类型就直接执行
44
+ - 省略账号、资源、动态字段准备,直接存一个不完整 payload
@@ -0,0 +1,50 @@
1
+ # 发布通道判断工作流
2
+
3
+ > 适用范围:任何会触发 `validate`、`publish --dry-run`、正式 `publish` 的任务。
4
+
5
+ ## 何时读取
6
+
7
+ - 用户提到“云发布 / 本机发布 / 本地发布 / 客户端发布”
8
+ - 当前任务已经进入发布阶段,需要确定通道
9
+ - 云发布或本机发布刚刚失败,需要回退
10
+
11
+ ## 决策树
12
+
13
+ 1. 用户明确要求本机/本地/客户端发布:走 `local`。
14
+ 2. 用户明确要求不要走云端代理:走 `local`。
15
+ 3. 用户未指定发布通道:默认走 `cloud`。
16
+ 4. 云发布遇到代理错误且用户接受切换:改走 `local`。
17
+ 5. 本机发布提示客户端不在线且用户不便保持在线:改走 `cloud`。
18
+
19
+ ## 本机发布门禁
20
+
21
+ - 必须显式带 `--publish-channel local`
22
+ - 必须确认 `clientId`
23
+ - `validate`、`publish --dry-run`、正式 `publish` 必须保持同一套通道参数
24
+
25
+ ## clientId 获取顺序
26
+
27
+ 1. payload 中已有 `clientId`
28
+ 2. 显式 flags:`--client-id <clientId>`
29
+ 3. 第四个位置参数:`yxer publish <type> <platform> <payload.json> <clientId>`
30
+ 4. 本地默认配置:`yxer config set-local-client-id <clientId>`
31
+
32
+ ## 推荐命令
33
+
34
+ ```bash
35
+ yxer config get
36
+ yxer validate 抖音 video .\payload.json --publish-channel local --client-id <clientId>
37
+ yxer publish video 抖音 .\payload.json --publish-channel local --client-id <clientId> --dry-run
38
+ yxer publish video 抖音 .\payload.json --publish-channel local --client-id <clientId>
39
+ ```
40
+
41
+ ## 回退策略
42
+
43
+ - 云发布报“账号代理不存在”:提示检查代理配置,或改走本机发布
44
+ - 本机发布报“客户端不在线”或“获取在线设备列表失败”:提示用户启动并登录客户端,或改回云发布
45
+
46
+ ## 严禁行为
47
+
48
+ - 用户明确要求本机发布时仍默认走 `cloud`
49
+ - 本机发布未确认 `clientId`
50
+ - `validate` 用云发布、`publish` 却改成本机发布
@@ -0,0 +1,43 @@
1
+ # 素材库工作流
2
+
3
+ > 适用范围:用户提到“素材库”“登记素材”“上传素材”“保存到素材库”“先把图片/视频收进库里”。
4
+
5
+ ## 何时读取
6
+
7
+ - 用户只想把资源放进素材库,不立即发布
8
+ - 用户要先上传,再登记成素材
9
+ - 用户要批量准备后续可复用素材
10
+
11
+ ## 决策树
12
+
13
+ - 用户只说“上传素材并登记”:优先 `yxer material add --file ...`
14
+ - 用户已经有 upload 结果,只差登记素材:走 `yxer material create <payload.json>`
15
+ - 用户只是准备发布资源,不一定要入素材库:走普通 `yxer upload`
16
+
17
+ ## 推荐流程
18
+
19
+ ### 一体化素材登记
20
+
21
+ ```bash
22
+ yxer material add --file .\demo.mp4 --type video
23
+ ```
24
+
25
+ ### 分步素材登记
26
+
27
+ 1. `yxer upload --file <path> --bucket material-library`
28
+ 2. 读取 upload 返回的真实资源字段
29
+ 3. 组装素材 payload
30
+ 4. `yxer material create <payload.json>`
31
+
32
+ ## 规则
33
+
34
+ - `material add` 优先于手工 `upload + material create`
35
+ - `material create` 前提是资源已经上传到 `material-library`
36
+ - 素材任务不等同于发布任务;不需要 `prepare` / `schema fields` / `schema get`,除非用户随后要直接发布
37
+ - 若用户要“上传后马上发布”,完成素材任务后切回对应发布 workflow
38
+
39
+ ## 严禁行为
40
+
41
+ - 未上传到素材库桶就执行 `material create`
42
+ - 把发布 payload 直接拿来当素材 payload
43
+ - 在素材任务里无意义地进入发布主流程
@@ -0,0 +1,70 @@
1
+ # Payload 来源纪律
2
+
3
+ > 适用范围:任何需要创建、修改、校验或解释 `payload.json` 的任务。
4
+
5
+ ## 何时读取
6
+
7
+ - 用户让 Agent 生成 payload
8
+ - 用户让 Agent 修 payload
9
+ - `validate` 失败,需要定位字段来源
10
+ - 用户问某个字段应该放哪一层
11
+
12
+ ## 字段来源优先级
13
+
14
+ 1. `yxer prepare <platform> <type>`:确认表单项、前置数据、账号能力
15
+ 2. 优先执行 `yxer schema fields <platform> <type>`:确认字段名、类型、必填项;需要完整层级骨架时再执行 `yxer schema get <platform> <type>`
16
+ 3. 查询命令:补充动态对象,如 `category`、`location`、`music`、`collection`、`challenge`、`goods`
17
+ 4. `yxer upload`:补充资源 `key`、尺寸、时长、格式等元数据
18
+ 5. 用户明确提供的业务内容:标题、正文、描述、发布时间等
19
+ 6. 平台文档:解释平台差异或特殊限制
20
+
21
+ ## 标准结构
22
+
23
+ ```json
24
+ {
25
+ "action": "publish",
26
+ "publishType": "<video|imageText|article>",
27
+ "platforms": ["<平台中文名>"],
28
+ "publishChannel": "cloud",
29
+ "publishArgs": {
30
+ "accountForms": [
31
+ {
32
+ "platformAccountId": "<platformAccountId>",
33
+ "contentPublishForm": {
34
+ "formType": "task"
35
+ }
36
+ }
37
+ ]
38
+ }
39
+ }
40
+ ```
41
+
42
+ ## 分层规则
43
+
44
+ - 顶层:`action`、`publishType`、`platforms`、`publishChannel`
45
+ - `publishArgs`:共享资源和账号表单容器
46
+ - `publishArgs.accountForms[]`:账号级表单
47
+ - `publishArgs.accountForms[].contentPublishForm`:平台业务字段
48
+ - `publishArgs.content`:文章正文主入口
49
+
50
+ ## 哪些字段不能猜
51
+
52
+ - 任意 schema 未声明字段
53
+ - 任意复杂对象的 `raw`
54
+ - 任意上传资源的 `key` / `size` / `width` / `height` / `duration` / `format`
55
+ - 任意平台枚举值、默认值、分类层级 ID
56
+
57
+ ## 修 payload 的顺序
58
+
59
+ 1. 先看 `validate` 错误
60
+ 2. 先回到 `prepare` / `schema fields` 核对字段;需要完整层级骨架时再用 `schema get`
61
+ 3. 回到查询命令或 upload 结果核对字段值
62
+ 4. 只修对应字段,不要重写整份 payload
63
+ 5. 重新执行 `yxer validate`
64
+
65
+ ## 严禁行为
66
+
67
+ - 从空白 JSON 猜测结构
68
+ - 直接把平台表单字段写到顶层
69
+ - 动态字段只填 ID 或名称、不填合法对象
70
+ - 手工伪造上传资源元数据
@@ -0,0 +1,66 @@
1
+ # 文章发布工作流
2
+
3
+ > 适用范围:百家号文章、头条号文章、公众号文章、知乎文章、搜狐号文章等。
4
+ > 阅读本文档前,请先阅读 [common-rules.md](./common-rules.md)。
5
+
6
+ ---
7
+
8
+ ## 推荐入口
9
+
10
+ 仅支持 `payload.json` 模式。发布前先获取表单字段和 schema:
11
+
12
+ ```bash
13
+ yxer prepare <platform> article
14
+ yxer schema fields <platform> article
15
+ yxer schema get <platform> article
16
+ ```
17
+
18
+ 开始前,先补读:
19
+
20
+ - [`account-selection.md`](./account-selection.md)
21
+ - [`local-vs-cloud.md`](./local-vs-cloud.md)
22
+ - [`payload-sourcing.md`](./payload-sourcing.md)
23
+
24
+ ## 执行顺序
25
+
26
+ 1. 查询账号:`yxer accounts list [platform] [--status 1] [--json]`
27
+ 2. 获取前置数据:`yxer prepare <platform> article`
28
+ 3. 先获取字段视图:`yxer schema fields <platform> article`;需要 payload 骨架时再执行 `yxer schema get <platform> article`
29
+ 4. 上传封面:`yxer upload <封面路径或URL>`
30
+ 5. 如正文含图片,先逐张上传并替换引用
31
+ 6. 按需查询分类、位置、话题
32
+ 7. 根据前置数据、schema 和字段来源纪律填写 `payload.json`
33
+ 8. 查阅对应平台文档:`skills/yixiaoer/references/platforms/article/`
34
+ 9. 执行校验:`yxer validate <platform> article <payload.json>`
35
+ 10. 正式发布:`yxer publish article <platform> <payload.json>`
36
+
37
+ ## 关键规则
38
+
39
+ - 发布前必须确认目标账号 `status=1`
40
+ - 文章必须有封面,未提供时必须补问
41
+ - 文章正文中的图片不能直接引用外部 URL,必须先上传
42
+ - 文章分类通常必须选到叶子节点
43
+ - 发布前先看 `prepare` 和 `schema fields` 返回的字段;只有要确认完整骨架时再看 `schema get`
44
+ - `payload.json` 必须使用统一标准结构:顶层 `publishArgs`
45
+ - 文章正文 `content` 应放在 `publishArgs.content`,与 `accountForms` 同级
46
+ - 账号和平台差异字段放在 `publishArgs.accountForms[].contentPublishForm`
47
+ - CLI 会在缺失时把 `publishArgs.content` 自动补齐到 `accountForms[].contentPublishForm.content`
48
+ - 用户明确要求本机发布时,必须显式传本机发布参数
49
+
50
+ ## 发布示例
51
+
52
+ ```bash
53
+ yxer validate 知乎 article .\payload.json
54
+ yxer publish article 知乎 .\payload.json
55
+ ```
56
+
57
+ ## 本机发布示例
58
+
59
+ ```bash
60
+ yxer publish article 百家号 .\payload.json --publish-channel local --client-id <clientId>
61
+ ```
62
+
63
+ ## 平台文档入口
64
+
65
+ - 索引:`skills/yixiaoer/references/platforms/article/index.md`
66
+ - 平台细节:`skills/yixiaoer/references/platforms/article/*.md`
@@ -0,0 +1,62 @@
1
+ # 图文发布工作流
2
+
3
+ > 适用范围:抖音图文、小红书笔记、知乎想法、快手图文、微博图文、微信视频号图文等。
4
+ > 阅读本文档前,请先阅读 [common-rules.md](./common-rules.md)。
5
+
6
+ ---
7
+
8
+ ## 推荐入口
9
+
10
+ 仅支持 `payload.json` 模式。发布前先获取表单字段和 schema:
11
+
12
+ ```bash
13
+ yxer prepare <platform> imageText
14
+ yxer schema fields <platform> imageText
15
+ yxer schema get <platform> imageText
16
+ ```
17
+
18
+ 开始前,先补读:
19
+
20
+ - [`account-selection.md`](./account-selection.md)
21
+ - [`local-vs-cloud.md`](./local-vs-cloud.md)
22
+ - [`payload-sourcing.md`](./payload-sourcing.md)
23
+
24
+ ## 执行顺序
25
+
26
+ 1. 查询账号:`yxer accounts list [platform] [--status 1] [--json]`
27
+ 2. 获取前置数据:`yxer prepare <platform> imageText`
28
+ 3. 先获取字段视图:`yxer schema fields <platform> imageText`;需要 payload 骨架时再执行 `yxer schema get <platform> imageText`
29
+ 4. 逐张上传图片:`yxer upload <文件路径或URL>`
30
+ 5. 按需查询分类、位置、音乐、合集、话题、商品
31
+ 6. 根据前置数据、schema 和字段来源纪律填写 `payload.json`
32
+ 7. 查阅对应平台文档:`skills/yixiaoer/references/platforms/imageText/`
33
+ 8. 执行校验:`yxer validate <platform> imageText <payload.json>`
34
+ 9. 正式发布:`yxer publish imageText <platform> <payload.json>`
35
+
36
+ ## 关键规则
37
+
38
+ - 发布前必须确认目标账号 `status=1`
39
+ - 每张图片都要单独上传,封面默认取第一张图
40
+ - 复杂对象必须通过查询命令获取完整对象,不要手写 `raw`
41
+ - 发布前先看 `prepare` 和 `schema fields` 返回的字段;只有要确认完整骨架时再看 `schema get`
42
+ - `payload.json` 必须使用统一标准结构:顶层 `publishArgs`,业务字段放在 `publishArgs.accountForms[].contentPublishForm`
43
+ - 多平台发布时,必须逐个平台分别执行完整流程
44
+ - 用户明确要求本机发布时,必须显式切换到 `local`
45
+
46
+ ## 发布示例
47
+
48
+ ```bash
49
+ yxer validate 小红书 imageText .\payload.json
50
+ yxer publish imageText 小红书 .\payload.json
51
+ ```
52
+
53
+ ## 本机发布示例
54
+
55
+ ```bash
56
+ yxer publish imageText 抖音 .\payload.json --publish-channel local --client-id <clientId>
57
+ ```
58
+
59
+ ## 平台文档入口
60
+
61
+ - 索引:`skills/yixiaoer/references/platforms/imageText/index.md`
62
+ - 平台细节:`skills/yixiaoer/references/platforms/imageText/*.md`
@@ -0,0 +1,50 @@
1
+ # 发布排查工作流
2
+
3
+ > 适用范围:用户提到“发布失败”“查记录”“为什么没发出去”“帮我排查这个任务”“看一下历史发布”。
4
+
5
+ ## 何时读取
6
+
7
+ - 发布失败后需要回查
8
+ - 用户提供错误信息或错误截图
9
+ - 用户想看最近的发布记录
10
+
11
+ ## 标准步骤
12
+
13
+ 1. 先确认问题属于哪一类:环境、账号、payload、资源、通道、平台返回错误
14
+ 2. 执行 `yxer query records [--platform P] [--limit N] [--status S] [--json]`
15
+ 3. 结合最近一次 `validate` / `publish` 输出定位错误阶段
16
+ 4. 回到对应 workflow:
17
+ - 账号问题:[`account-selection.md`](./account-selection.md)
18
+ - 通道问题:[`local-vs-cloud.md`](./local-vs-cloud.md)
19
+ - payload 结构问题:[`payload-sourcing.md`](./payload-sourcing.md)
20
+ - 发布类型问题:对应 `publish-video.md` / `publish-imageText.md` / `publish-article.md`
21
+
22
+ ## 错误分类
23
+
24
+ - `doctor` 失败:环境问题
25
+ - `accounts list` 无可用账号:账号状态问题
26
+ - `prepare` / `schema get` 异常:平台能力或定义问题
27
+ - `upload` 失败:本地文件或 URL 资源问题
28
+ - `validate` 失败:payload 结构或字段值问题
29
+ - `publish --dry-run` 失败:发布前检查问题
30
+ - 正式 `publish` 失败:通道、代理、客户端在线状态或平台返回错误
31
+
32
+ ## 推荐命令
33
+
34
+ ```bash
35
+ yxer query records --platform 抖音 --limit 10 --json
36
+ yxer doctor
37
+ yxer validate 抖音 video .\payload.json
38
+ ```
39
+
40
+ ## 规则
41
+
42
+ - 排查优先读错误信息和记录,不要先重写 payload
43
+ - 若错误发生在 `validate`,不要跳过它直接重试 `publish`
44
+ - 若用户给的是历史任务,先看 `records list`,不要立刻重新发布
45
+
46
+ ## 严禁行为
47
+
48
+ - 不看错误输出就盲目重试
49
+ - 未区分错误阶段就建议用户换平台或重发
50
+ - 直接修改业务内容,掩盖真实结构问题