@sokeai/cli 1.0.74 → 1.0.75

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 (25) hide show
  1. package/package.json +1 -1
  2. package/scripts/build-binaries.sh +12 -0
  3. package/scripts/release.sh +50 -1
  4. package/skills/SKILL.md +1 -1
  5. package/skills/ai-coach-director/SKILL.md +379 -45
  6. package/skills/ai-coach-director/coaching/prompt-engineer/parts/part2-roles.md +8 -8
  7. package/skills/ai-coach-director/coaching/prompt-engineer/prompt-engineer.md +70 -43
  8. package/skills/ai-coach-director/platform/adapters/README.md +68 -0
  9. package/skills/ai-coach-director/platform/adapters/qclaw.md +67 -0
  10. package/skills/ai-coach-director/platform/adapters/workbuddy.md +45 -0
  11. package/skills/ai-coach-director/platform/adapters/wukong.md +70 -0
  12. package/skills/ai-coach-director/platform/adapters/zework.md +89 -0
  13. package/skills/ai-coach-director/platform/api-fallback.md +262 -0
  14. package/skills/ai-coach-director/platform/interaction.md +13 -10
  15. package/skills/ai-coach-director/platform/publish-gate.md +44 -0
  16. package/skills/ai-coach-director/platform/resource-finalizer.md +128 -0
  17. package/skills/ai-coach-director/platform/sync-engine.md +217 -90
  18. package/skills/ai-coach-director/references/env-check.md +46 -11
  19. package/skills/ai-coach-director/references/platform-api-pitfalls.md +15 -1
  20. package/skills/ai-coach-director/references/role-resource-matching.md +53 -16
  21. package/skills/ai-coach-director/references/verified-cli-cheatsheet.md +26 -12
  22. package/skills/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md +45 -7
  23. package/skills/soke-course/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md +44 -6
  24. package/skills/soke-learning-map/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md +45 -7
  25. package/skills/ai-coach-director/.learnings/LEARNINGS.md +0 -71
@@ -10,15 +10,21 @@
10
10
 
11
11
  ## 核心原则
12
12
 
13
- 1. JSON 文件写入工作目录,只在 CLI 命令中通过文件名自然出现,不单独提示"已生成文件"
13
+ 1. JSON 文件写入工作目录,**严禁在对话中出现任何 `.json` 文件名或路径**;`--request-file` / `--operations-file` 参数中的文件名始终在终端命令中使用,不写入对话窗口
14
14
  2. `corp_id` / `user_id` / `created_by` 等身份字段绝对禁止写入请求文件
15
15
  3. 字段直接从 Part1-Part5 结构化数据填充,不从自然语言大段反解析
16
- 4. **Part1 确认后强制同步**:用户在 `interaction.md` 模板 1 中选「确认,同步到平台(推荐)」后,立即执行 Step1 创建场景,不存在"跳过同步"的逃生路径
16
+ 4. **Part1 确认后强制同步**:用户在 `interaction.md` 模板 1 中选「确认,同步到平台(推荐)」后,立即执行 Step1 创建场景,不存在"跳过同步"的逃生路径。封面图的查找、生成、上传、修正全部后台自动处理,不向用户逐项确认
17
17
  5. 创建型流程采用按 Part 逐段同步:Step1 创建场景 → Part2 同步角色 → Part3 同步流程 → Part4 同步评分 → Part5 同步教练设置
18
18
  6. 每一步都先取最新平台状态,再生成 `base_updated_at` / `updated_at`,禁止依赖用户手工回传
19
19
  7. 平台真实 API 优先于历史文档示例;若文档与真实返回冲突,以已验证的 CLI / API 行为为准
20
20
  8. **JSON 内容 = Part 原文,一字不改**:生成 JSON 后、preview 前,必须逐字段与已确认的 Part 原文做 diff——JSON 中的文案与原文必须逐字相同,发现任何差异(缩略、改写、编造编号、重新排序)必须修正后再 preview。"大意相同"即违规
21
21
  9. **所有 soke-cli 命令必须绕过沙箱执行**:soke-cli 是 Go 编译二进制,在 WorkBuddy Bash 工具沙箱中会受限。调用 Bash 工具执行任何 soke-cli 命令时,必须设置 `dangerouslyDisableSandbox: true`。若命令返回 `permission denied` 或静默无输出,这是沙箱限制的预期表现,加 `dangerouslyDisableSandbox: true` 重试即可
22
+ 10. **资源匹配双通道(avatar/voice)**:Part2 内容先完整展示并由用户确认;确认后,资源匹配在生成 JSON 前后台执行。先检测 soke-cli 可用性——可用走 CLI 路径(`role-resource-matching.md`),不可用走 REST API 路径(`api-fallback.md`「资源匹配完整流程」)。**禁止因 CLI 不可用直接跳过资源匹配**——这会导致角色无头像无声音。只有 API 查询本身失败才允许标注跳过。资源匹配、写入、回读校验均不向用户二次确认
23
+ 11. **CLI 不可用时降级为 REST API**:当 soke-cli 在目标平台完全不可用(如悟空安全策略禁止、纯聊天环境),按 `api-fallback.md` 降级为 MentorAI REST API 直接调用。JSON 结构、字段映射、自查清单与 CLI 路径完全一致,差异仅在传输方式
24
+ 12. **对照最新 CLI 指南(v2.7)**:除踩坑清单外,同步执行还必须对齐《比得_AI陪练CLI创建与更新场景使用指南 2.0》的最新约定:优先使用 `--request-file` 承载完整更新请求;排障时再改用 `--operations-file` + `--base-updated-at` 组合。`preview` 不传 `idempotency_key`,`apply` 才强制要求
25
+ 13. **Part1 默认封面固定 + Part2 强制内联资源(v2.20.8)**:封面图 URL 必须在 `step1-create.json` 生成前确定,不允许先建空壳再补。**默认封面固定为** `https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png`,无需前台展示处理过程。只有当用户明确指定其他封面、或 `resource-finalizer.md` 兜底替换时,才允许改为其他 URL。角色头像和声音必须在 `part2-operations.json` 生成前完成匹配并写入,不允许分两次操作。`resource-finalizer.md` 降级为最后兜底补救,仅在前序流程意外遗漏时触发
26
+ 14. **Part1 创建成功硬闸门(v2.20.4)**:Part1 不是 preview/apply 更新链路,而是创建链路。用户确认后,必须立即生成 `part1-create.json` 或沿用 `step1-create.json`,并立即执行 `soke-cli ai-training +create-scenario --request-file ...`。**只有在创建返回成功、提取到非空 `scenario_id`、并完成创建后回读校验后,才允许进入 Part2。** 任一条件未满足 → 立即报错并停止,禁止静默续流。
27
+ 15. **Part2-Part5 同步成功硬闸门(v2.20.5)**:Part2、Part3、Part4、Part5 都属于更新链路。用户确认后,后台**必须先生成对应 JSON,再真实执行 preview/apply,再完成对应验收**,之后才允许进入下一 Part。若任一 Part 未生成 JSON、未执行同步、preview/apply 失败、或验收失败,必须立即报错并停止,禁止静默续流到下一 Part。
22
28
 
23
29
  ---
24
30
 
@@ -26,13 +32,13 @@
26
32
 
27
33
  | 模式 | 步骤 | 生成文件 | 在聊天中如何出现 |
28
34
  |---|---|---|---|
29
- | 创建型 | Step 1 | `step1-create.json` | CLI 命令中 `--request-file ./step1-create.json` |
30
- | 创建型 | Part2 | `part2-operations.json` | CLI 命令中 `--operations-file ./part2-operations.json` |
31
- | 创建型 | Part3 | `part3-operations.json` | CLI 命令中 `--operations-file ./part3-operations.json` |
32
- | 创建型 | Part4 | `part4-operations.json` | CLI 命令中 `--operations-file ./part4-operations.json` |
33
- | 创建型 | Part5 | `part5-operations.json` | CLI 命令中 `--operations-file ./part5-operations.json` |
35
+ | 创建型 | Step 1 | `part1-create.json` 或 `step1-create.json` | CLI 命令中 `--request-file ./part1-create.json` 或 `--request-file ./step1-create.json` |
36
+ | 创建型 | Part2 | `part2-operations.json` + `part2-update.json` + `part2-role-01.json` + `part2-role-02.json` + `part2-role-03.json` + `part2-os.json` | 用户确认后后台自动拆分并逐个同步;默认不直接执行整包 Part2 |
37
+ | 创建型 | Part3 | `part3-operations.json` + `part3-update.json` | 优先在 CLI 命令中用 `--request-file ./part3-update.json`;排障时可退回 `--operations-file ./part3-operations.json` |
38
+ | 创建型 | Part4 | `part4-operations.json` + `part4-update.json` | 优先在 CLI 命令中用 `--request-file ./part4-update.json`;排障时可退回 `--operations-file ./part4-operations.json` |
39
+ | 创建型 | Part5 | `part5-operations.json` + `part5-update.json` | 优先在 CLI 命令中用 `--request-file ./part5-update.json`;排障时可退回 `--operations-file ./part5-operations.json` |
34
40
  | 创建型 | 全流程 | `state-snapshot.json` | 完全不在聊天中出现 |
35
- | 微调 | 唯一 | `optimize-operations.json` | CLI 命令中 `--operations-file ./optimize-operations.json` |
41
+ | 微调 | 唯一 | `optimize-operations.json` + `optimize-update.json` | 优先 `--request-file ./optimize-update.json`;排障时再退回 operations 模式 |
36
42
 
37
43
  > 创建型默认优先直嵌知识库,不再默认生成 `knowledge-package.json`。只有知识库过大或用户明确要求知识包同步时,才进入 `soke-cli ai-training +sync` / `soke-cli ai-training +bind-scenario` 路径。
38
44
 
@@ -40,9 +46,9 @@
40
46
 
41
47
  ## 字段映射表
42
48
 
43
- ### 从 Part1 → `step1-create.json`
49
+ ### 从 Part1 → `part1-create.json` / `step1-create.json`
44
50
 
45
- > ⚠️ **核心规则:`step1-create.json` 的每个字段必须是已确认 Part1 的 1:1 忠实搬运,禁止在此阶段重新缩略、改写、扩写或重组内容。** 用户已确认的是哪个版本的 Part1,JSON 就用哪个版本。
51
+ > ⚠️ **核心规则:`part1-create.json` 或 `step1-create.json` 的每个字段必须是已确认 Part1 的 1:1 忠实搬运,禁止在此阶段重新缩略、改写、扩写或重组内容。** 用户已确认的是哪个版本的 Part1,JSON 就用哪个版本。
46
52
 
47
53
  | 提示词取值来源 | JSON 字段 | 类型 | 搬运规则 |
48
54
  |---|---|---|---|
@@ -50,7 +56,7 @@
50
56
  | Part1 场景描述(全文) | `description` | string | **完整搬运,不缩略不改写**;Part1 \"场景描述\"下的全部正文就是 description 的值 |
51
57
  | Part1 标签 | `tags` | string[] | 逐项映射为数组元素,顺序保持一致 |
52
58
  | Part1 考核关键点 | `key_points` | string | **必填**,将考核关键点各条拼接为单字符串(分号或编号分隔),不能是数组 |
53
- | **固定值 `简体中文`** | `scene_lang` | string | **必填,写死 `"简体中文"`,永远不改为其他值**。scene_lang 的取值不随用户语言、场景语种变化,始终固定为简体中文 |
59
+ | **固定值 `简体中文`** | `scene_lang` | string | **必填,写死 `"简体中文"`,永远不改为其他值**。scene_lang 的取值不随用户语言、场景语种变化,始终固定为简体中文;即使材料中写“中文”“普通话”“zh-CN”或其他表述,创建请求里也只能写 `简体中文` |
54
60
  | Part1 行业 | `industry` | string | 如平台字段存在则写入 |
55
61
  | Step1 已上传封面 | `scenario_cover` | string | **必填**,先上传封面再创建。封面来源见下方「封面生成与上传」规则 |
56
62
  | 已绑定企业 ID | `implementation_corp_id` | string | 若请求体存在该字段也不能依赖其选租户 |
@@ -59,6 +65,8 @@
59
65
 
60
66
  > ⚠️ **忠实搬运**:Part2 已确认的角色卡各字段原样映射,不在此阶段修改文案。
61
67
 
68
+ > ⚠️ **默认策略变更(v2.8)**:Part2 首次写入默认不要整包 `replace_ai_roles`。应优先按“单角色 `add_ai_role` → 回读验证 → 继续追加下一个角色 → 全部角色完成后再单独 `update_basic` 写 OS”的顺序执行。只有目标平台已被实证验证对整包角色替换稳定时,才允许改回 `replace_ai_roles`。
69
+
62
70
  | 提示词取值来源 | JSON 字段 |
63
71
  |---|---|
64
72
  | 角色卡.名称 | `ai_roles[].role_data.name` |
@@ -175,7 +183,7 @@
175
183
 
176
184
  ### Step 1:创建场景
177
185
 
178
- `step1-create.json` 必须包含以下字段(全部必填):
186
+ `part1-create.json` 或 `step1-create.json` 必须包含以下字段(全部必填):
179
187
  `name`, `description`, `tags`, `key_points`, `scene_lang`, `scenario_cover`。
180
188
 
181
189
  示例(完整六字段):
@@ -191,6 +199,14 @@
191
199
  }
192
200
  ```
193
201
 
202
+ ```bash
203
+ soke-cli ai-training +create-scenario \
204
+ --request-file ./part1-create.json \
205
+ --pretty
206
+ ```
207
+
208
+ 若当前实现仍沿用旧文件名,也允许:
209
+
194
210
  ```bash
195
211
  soke-cli ai-training +create-scenario \
196
212
  --request-file ./step1-create.json \
@@ -211,23 +227,20 @@ soke-cli ai-training +create-scenario \
211
227
  ```
212
228
 
213
229
  执行要求:
214
- - **封面生成与上传**:用户确认 Part1 后,在创建场景前必须先完成封面生成和上传:
215
- 1. **生成封面**:将场景名称 + 标签 + 行业信息作为 prompt,调用大模型图片生成,生成一张 4:3 比例场景封面图(如 1200×900),保存为本地 PNG(`./scenario-cover.png`)。
216
- - prompt 示例:`"生成一张AI陪练场景封面图,主题:{场景名称},行业:{行业},风格:{行业匹配风格},4:3比例,专业商务风格,适合培训场景使用"`
217
- - 风格匹配:展会/培训 → 明亮商务、医药 → 学术医疗、销售/谈判 → 高压剧集感、餐饮/服务 → 温馨生活、金融 → 专业稳重
218
- 2. **上传封面**:执行 `soke-cli ai-training +upload-scenario-cover --file ./scenario-cover.png --pretty`
219
- 3. **写入 URL**:从返回结果提取 CDN URL,写入 `step1-create.json.scenario_cover`
230
+ - **封面确定规则**:用户确认 Part1 后,在生成 `part1-create.json` 或 `step1-create.json` 前,默认直接写入固定封面 URL:`https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png`。仅当用户明确指定其他封面、或发布前资源补救流程主动替换时,才允许改用其他 URL。
220
231
  - **`key_points` 必须是字符串**,不能是数组;多条用分号或编号拼接
221
- - **`scene_lang` 固定为 `"简体中文"`**,永远不改为其他值
232
+ - **`scene_lang` 固定为 `"简体中文"`**,永远不改为其他值;生成请求时如果出现“中文”“zh-CN”“普通话”等值,必须在写文件前纠正为 `简体中文`
222
233
  - **`tags` 必须是数组**,不能是逗号分隔字符串
223
234
  - 自动从返回结果提取 `scenario_id`
235
+ - **`scenario_id` 必须非空**:若创建命令返回成功但未提取到 `scenario_id`,按创建失败处理,立即报错并停止
224
236
  - 将 `scenario_id` 写入 `state-snapshot.json`
225
- - **创建后验证**:执行 `soke-cli ai-training +get-scenario --scenario-id <id> --pretty`,确认返回中 `key_points`、`description`、`name`、`tags` 字段非空且内容与 `step1-create.json` 一致。若 `key_points` 为空或缺失,检查 `step1-create.json` `key_points` 字段是否为字符串格式
226
- - 立即进入 Part2,不等待用户回传
237
+ - **创建后验证**:执行 `soke-cli ai-training +get-scenario --scenario-id <id> --pretty`,确认返回中 `key_points`、`description`、`name`、`tags` 字段非空且内容与 `part1-create.json` `step1-create.json` 一致。若 `key_points` 为空或缺失,检查创建请求文件中 `key_points` 字段是否为字符串格式
238
+ - **只有创建命令成功 + `scenario_id` 非空 + 创建后验证通过,才允许进入 Part2**
239
+ - 若任一步失败:立即向用户报错,停止流程,严禁静默进入 Part2
227
240
 
228
- ### step1-create.json 自查清单
241
+ ### part1-create.json / step1-create.json 自查清单
229
242
 
230
- > ⚠️ 生成 `step1-create.json` 后、创建场景前,**必须逐项核对**。
243
+ > ⚠️ 生成 `part1-create.json` 或 `step1-create.json` 后、创建场景前,**必须逐项核对**。
231
244
 
232
245
  | # | 检查项 | 正确 | 错误示例 |
233
246
  |---|---|---|---|
@@ -241,9 +254,38 @@ soke-cli ai-training +create-scenario \
241
254
 
242
255
  > 🔴 **#4 是最高频错误**:`key_points` 写成数组而非字符串,导致创建成功但字段为空。
243
256
  > 🔴 **#5 scene_lang 写死**:永远不随场景语言变化,始终 `"简体中文"`。
257
+ > 🔴 **#6 默认封面固定**:若无特别指定,`scenario_cover` 直接写固定平台图 `https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png`。
258
+ > 🔴 **创建成功闸门**:没有 `scenario_id`,或 `get-scenario` 校验不通过,均视为 Part1 未完成,绝不进入 Part2。
244
259
 
245
260
  ### Part2:AI角色设定
246
261
 
262
+ 优先生成两个文件:
263
+ - `part2-operations.json`:完整 Part2 operations 裸数组(总定义)
264
+ - `part2-update.json`:完整更新请求(仅供总调试,不作为默认执行入口)
265
+
266
+ 然后后台自动拆分为角色级同步单元:
267
+ - `part2-role-01.json`
268
+ - `part2-role-02.json`
269
+ - `part2-role-03.json`
270
+ - `part2-os.json`
271
+
272
+ 默认后台执行顺序:
273
+ 1. Part2 已按「OS → 角色1 → 角色2 → 角色3...」完整展示并通过用户确认
274
+ 2. 自动查询头像库与语音库
275
+ 3. 为第1个角色匹配 avatar 与 voice_id
276
+ 4. 生成 `part2-role-01.json` → preview + apply → `get-scenario` 回读验证
277
+ 5. 为第2个角色匹配 avatar 与 voice_id
278
+ 6. 生成 `part2-role-02.json` → preview + apply → 回读验证
279
+ 7. 为第3个角色匹配 avatar 与 voice_id
280
+ 8. 生成 `part2-role-03.json` → preview + apply → 回读验证
281
+ 9. 生成 `part2-os.json` → preview + apply → 回读验证
282
+ 10. 全部同步成功后更新 state-snapshot,并把控制权交回 prompt-engineer **立即自动输出 Part3**
283
+ 11. 如平台已实证稳定,才允许整包 `replace_ai_roles` 作为特殊模式
284
+
285
+ 除非失败,以上过程不向用户展示细节,也不向用户请求任何中间确认。用户只确认完整 Part2 内容;角色资源匹配、角色1/角色2/角色3写入、OS写入和回读验证全部自动执行。**同步成功后不得停在中间态等待用户再次输入,必须自动续流输出 Part3。**
286
+
287
+ > ⚠️ **禁止中间态阻塞(v2.20.1)**:如前台已输出“Part2 已确认,正在后台同步角色设定”或等价提示,后台同步成功后必须在同一轮中继续输出 Part3,禁止把这条提示当成需要用户再次回复“继续”的断点。只有在 apply/回读失败或出现必须人工介入的异常时,才允许停下并提示用户。
288
+
247
289
  先获取最新场景状态:
248
290
 
249
291
  ```bash
@@ -252,24 +294,38 @@ soke-cli ai-training +get-scenario \
252
294
  --pretty
253
295
  ```
254
296
 
255
- 再预览:
297
+ 再预览(默认 request-file 模式):
256
298
 
257
299
  ```bash
258
300
  soke-cli ai-training +preview-scenario-update \
259
301
  --scenario-id <scenario_id> \
260
- --base-updated-at <updated_at> \
261
- --operations-file ./part2-operations.json \
262
- --reason "Part2: AI角色设定" \
302
+ --request-file ./part2-update.json \
263
303
  --pretty
264
304
  ```
265
305
 
266
- 预览通过后立即应用:
306
+ 预览通过后立即应用(默认 request-file 模式):
267
307
 
268
308
  ```bash
269
309
  soke-cli ai-training +apply-scenario-update \
270
310
  --scenario-id <scenario_id> \
311
+ --request-file ./part2-update.json \
312
+ --pretty
313
+ ```
314
+
315
+ 如需排障,再退回 operations 模式:
316
+
317
+ ```bash
318
+ soke-cli ai-training +preview-scenario-update \
319
+ --scenario-id <scenario_id> \
320
+ --operations-file ./part2-operations.json \
271
321
  --base-updated-at <updated_at> \
322
+ --reason "Part2: AI角色设定" \
323
+ --pretty
324
+
325
+ soke-cli ai-training +apply-scenario-update \
326
+ --scenario-id <scenario_id> \
272
327
  --operations-file ./part2-operations.json \
328
+ --base-updated-at <updated_at> \
273
329
  --idempotency-key "cli-<scenario_short>-part2-apply" \
274
330
  --reason "Part2: AI角色设定" \
275
331
  --pretty
@@ -284,41 +340,24 @@ soke-cli ai-training +apply-scenario-update \
284
340
  3. `ai_roles_overall_description` 非空,且前 100 字符与 Part2 OS 原文前 100 字符一致——确保 OS 整体设定完整写入而非丢失
285
341
  4. `role_data.name` ≠ `"角色数据异常"`——若出现此值,检查外壳字段是否误放入 `role_data` 内部
286
342
  5. 每个角色的 `role_data.background` 包含四段深度画像(我是谁/我的困扰/我的过往经历/我今天的心态),四段全部非空
287
- 6. **⚠️ avatar/voice_id 首次验收不检查**:角色首次 apply 时 `avatar`/`voice_id` 应为空 `""`,此阶段验收不要求 avatar/voice_id 非空。验收通过后进入下方资源回填流程。
288
-
289
- - **立即触发头像和语音资源自动匹配**(按 `../references/role-resource-matching.md` 执行):
290
- 1. **提取角色特征**:从角色卡提取性别(gender) + 年龄(age_group),映射为 CLI `--gender` / `--age-group` 过滤参数
291
- 2. **并行查询**:同时发起 `+list-role-avatars` `+list-role-voices`(带过滤参数),节省往返时间
292
- 3. **合并写入**:头像和语音**必须在同一个 `patch_ai_role` 操作中写入**,不可分两次——分开调用会导致第二次 patch 后 `updated_at` 变化,后续验收时误判第一次写入丢失
293
- ```json
294
- [
295
- {
296
- "type": "patch_ai_role",
297
- "data": {
298
- "scenario_role_id": "<角色ID>",
299
- "patch": {
300
- "role_data": {
301
- "avatar": "<头像URL>",
302
- "voice_id": "<声音ID>"
303
- },
304
- "customized_fields": ["avatar", "voice_id"]
305
- }
306
- }
307
- }
308
- ]
309
- ```
310
- - `avatar` 值:头像资源 **URL**(来自 `+list-role-avatars` 的 `url` 字段),严禁用 `id`
311
- - `voice_id` 值:声音资源 **ID**(来自 `+list-role-voices` 的 `id` 字段)
312
- - `customized_fields` 必须包含 `["avatar", "voice_id"]`,两者都写
313
- 4. **强制验证**:patch apply 后立即执行 `soke-cli ai-training +get-scenario --scenario-id <id> --pretty`,确认每个角色的 `ai_roles[].role_data.avatar` 为非空 URL(不是资源 ID),`ai_roles[].role_data.voice_id` 为非空 ID(不是 sample_url)
314
- 5. **重试机制**:任一角色 avatar/voice_id 为空 → 重新读取场景 `updated_at` → 重新生成 patch → 重试 1 次
315
- 6. **降级处理**:重试后仍失败 → 标注「⚠️ {角色名} 资源匹配未完成」,**不阻断 Part3**,但必须在最终交付摘要中提醒用户手动补充
316
- - 匹配结果在聊天中只显示一行摘要(如「张总 → 威严中年男性头像 + 沉稳男中音」)
317
- - 资源匹配完成后再进入 Part3
318
- - 若角色信息不足以支撑匹配(无姓名/性别/年龄暗示),标注「⚠️ 角色信息不足,无法执行资源匹配」,询问用户补充后再进入 Part3
343
+ 6. **⚠️ avatar/voice_id 验收**:随着 v2.11 资源前置,角色首次 apply 时 `avatar`/`voice_id` 应为真实值。验收时必须确认 avatar 为非空 URL、voice_id 为非空 ID。若个别角色资源匹配失败保留空值,不阻断流程但需在摘要中标注。
344
+ 7. **已知回读异常白名单(v2.20.6)**:若 `preview`/`apply` 已成功,但 `get-scenario` 仍表现为 `ai_roles: []`、`ai_roles_overall_description: null`,且平台实际已展示角色与 OS,则按已知平台回读口径异常记账通过,不再判定失败。
345
+
346
+ - **只有以下全部满足,才允许进入 Part3**:
347
+ 1. 已生成 `part2-operations.json` `part2-update.json`
348
+ 2. 已执行真实 preview/apply
349
+ 3. 角色逐字段回读验收通过,**或**命中已知回读异常白名单且平台实际已展示
350
+ 4. OS 回读验收通过,**或**命中已知回读异常白名单且平台实际已展示
351
+ - 若任一步失败:立即向用户报错,停止流程,严禁静默进入 Part3
352
+
353
+ - **头像和语音资源匹配前置(v2.11)**:生成 `part2-operations.json` 之前已完成匹配并写入 avatar/voice_id。若因角色信息不足导致匹配失败,允许该角色保留空值并标注;若 CLI/API 查询失败且是临时性错误,可在 apply 后按 `role-resource-matching.md` 修复流程单独 patch 该角色的 avatar/voice_id
319
354
 
320
355
  ### Part3:流程设置
321
356
 
357
+ 优先生成两个文件:
358
+ - `part3-operations.json`:operations 裸数组
359
+ - `part3-update.json`:完整更新请求
360
+
322
361
  先再次获取最新状态:
323
362
 
324
363
  ```bash
@@ -327,24 +366,38 @@ soke-cli ai-training +get-scenario \
327
366
  --pretty
328
367
  ```
329
368
 
330
- 再预览:
369
+ 再预览(默认 request-file 模式):
331
370
 
332
371
  ```bash
333
372
  soke-cli ai-training +preview-scenario-update \
334
373
  --scenario-id <scenario_id> \
335
- --base-updated-at <updated_at> \
336
- --operations-file ./part3-operations.json \
337
- --reason "Part3: 流程设置" \
374
+ --request-file ./part3-update.json \
338
375
  --pretty
339
376
  ```
340
377
 
341
- 预览通过后立即应用:
378
+ 预览通过后立即应用(默认 request-file 模式):
342
379
 
343
380
  ```bash
344
381
  soke-cli ai-training +apply-scenario-update \
345
382
  --scenario-id <scenario_id> \
383
+ --request-file ./part3-update.json \
384
+ --pretty
385
+ ```
386
+
387
+ 如需排障,再退回 operations 模式:
388
+
389
+ ```bash
390
+ soke-cli ai-training +preview-scenario-update \
391
+ --scenario-id <scenario_id> \
392
+ --operations-file ./part3-operations.json \
346
393
  --base-updated-at <updated_at> \
394
+ --reason "Part3: 流程设置" \
395
+ --pretty
396
+
397
+ soke-cli ai-training +apply-scenario-update \
398
+ --scenario-id <scenario_id> \
347
399
  --operations-file ./part3-operations.json \
400
+ --base-updated-at <updated_at> \
348
401
  --idempotency-key "cli-<scenario_short>-part3-apply" \
349
402
  --reason "Part3: 流程设置" \
350
403
  --pretty
@@ -353,10 +406,18 @@ soke-cli ai-training +apply-scenario-update \
353
406
  执行要求:
354
407
  - 使用最新 `updated_at`
355
408
  - 应用成功后更新状态并进入 Part4
356
- - **apply 后验证**:执行 `soke-cli ai-training +get-scenario --scenario-id <id> --pretty`,确认 `conversation_steps` 非空,`opening_dialogue` 非空,环节数量与 Part3 一致
409
+ - **apply 后验证(v2.20.3)**:执行 `soke-cli ai-training +get-scenario --scenario-id <id> --pretty`。
410
+ - ✅ `conversation_steps` 非空、`opening_dialogue` 非空 → 直接通过,进入 Part4。
411
+ - ⚠️ `conversation_steps` 为空,或 `conversation_steps` / `opening_dialogue` 在回读中均未反映,但 `preview` 与 `apply` 已成功 → 视为已知平台回读口径异常,记录到 `state-snapshot.json`,**直接继续 Part4**。
412
+ - 🔴 仅当 `preview`/`apply` 本身失败,或后续 Part4/Part5 因读取 Part3 平台字段出现明确阻塞证据时,才判定同步失败并回退排查。
413
+ - **若未生成 `part3-operations.json` / `part3-update.json`,或 `preview`/`apply` 根本未成功执行**:立即向用户报错,停止流程,严禁静默进入 Part4
357
414
 
358
415
  ### Part4:评分标准
359
416
 
417
+ 优先生成两个文件:
418
+ - `part4-operations.json`:operations 裸数组
419
+ - `part4-update.json`:完整更新请求
420
+
360
421
  先再次获取最新状态:
361
422
 
362
423
  ```bash
@@ -365,24 +426,38 @@ soke-cli ai-training +get-scenario \
365
426
  --pretty
366
427
  ```
367
428
 
368
- 再预览:
429
+ 再预览(默认 request-file 模式):
369
430
 
370
431
  ```bash
371
432
  soke-cli ai-training +preview-scenario-update \
372
433
  --scenario-id <scenario_id> \
373
- --base-updated-at <updated_at> \
374
- --operations-file ./part4-operations.json \
375
- --reason "Part4: 评分标准" \
434
+ --request-file ./part4-update.json \
376
435
  --pretty
377
436
  ```
378
437
 
379
- 预览通过后立即应用:
438
+ 预览通过后立即应用(默认 request-file 模式):
380
439
 
381
440
  ```bash
382
441
  soke-cli ai-training +apply-scenario-update \
383
442
  --scenario-id <scenario_id> \
443
+ --request-file ./part4-update.json \
444
+ --pretty
445
+ ```
446
+
447
+ 如需排障,再退回 operations 模式:
448
+
449
+ ```bash
450
+ soke-cli ai-training +preview-scenario-update \
451
+ --scenario-id <scenario_id> \
452
+ --operations-file ./part4-operations.json \
384
453
  --base-updated-at <updated_at> \
454
+ --reason "Part4: 评分标准" \
455
+ --pretty
456
+
457
+ soke-cli ai-training +apply-scenario-update \
458
+ --scenario-id <scenario_id> \
385
459
  --operations-file ./part4-operations.json \
460
+ --base-updated-at <updated_at> \
386
461
  --idempotency-key "cli-<scenario_short>-part4-apply" \
387
462
  --reason "Part4: 评分标准" \
388
463
  --pretty
@@ -391,12 +466,33 @@ soke-cli ai-training +apply-scenario-update \
391
466
  执行要求:
392
467
  - 使用最新 `updated_at`
393
468
  - apply 成功后**立即验收**:执行 `soke-cli ai-training +get-scenario --scenario-id <id> --raw --pretty`
394
- - 验证返回结果中评分配置非空(确认 `scoring_criteria` 或等效字段存在且内容完整)
469
+ - 优先验证返回结果中评分配置非空(确认 `scoring_criteria` 或等效字段存在且内容完整)
470
+ - **已知回读异常白名单(v2.20.7)**:若 `preview`/`apply` 已成功,但 `get-scenario` 仍表现为 `scoring_criteria_config: null`,且平台实际已展示评分标准,则按已知平台回读口径异常记账通过,不再判定失败。
395
471
  - 验收通过后更新状态并进入 Part5
396
- - 若验收失败(评分字段缺失或为空),标记为同步异常,排查 `part4-operations.json` 的 `data.config` 结构是否正确
472
+ - 若验收失败(评分字段缺失或为空,且平台侧也未展示),标记为同步异常,排查 `part4-operations.json` 的 `data.config` 结构是否正确
473
+ - **只有以下全部满足,才允许进入 Part5**:
474
+ 1. 已生成 `part4-operations.json` 与 `part4-update.json`
475
+ 2. 已执行真实 preview/apply
476
+ 3. 评分配置回读验收通过,**或**命中已知回读异常白名单且平台实际已展示
477
+ - 若任一步失败:立即向用户报错,停止流程,严禁静默进入 Part5
478
+
479
+ ### 发布前资源闸门
480
+
481
+ 在 Part5 完成后,执行 `publish-gate.md` 做验收。正常流程下封面/头像/声音已在前序 Part 中写入,应直接通过。
482
+
483
+ 若发现资源缺口,按优先级处理:
484
+ 1. 能自动补齐的 → 后台自动补齐
485
+ 2. 需兜底修复的 → 调用 `resource-finalizer.md`
486
+ 3. 无法补齐的 → 停止发布,输出缺口清单
487
+
488
+ 除非失败,不向用户展示补齐细节。
397
489
 
398
490
  ### Part5:教练设置
399
491
 
492
+ 优先生成两个文件:
493
+ - `part5-operations.json`:operations 裸数组
494
+ - `part5-update.json`:完整更新请求
495
+
400
496
  先再次获取最新状态:
401
497
 
402
498
  ```bash
@@ -405,24 +501,38 @@ soke-cli ai-training +get-scenario \
405
501
  --pretty
406
502
  ```
407
503
 
408
- 再预览:
504
+ 再预览(默认 request-file 模式):
409
505
 
410
506
  ```bash
411
507
  soke-cli ai-training +preview-scenario-update \
412
508
  --scenario-id <scenario_id> \
413
- --base-updated-at <updated_at> \
414
- --operations-file ./part5-operations.json \
415
- --reason "Part5: 教练设置" \
509
+ --request-file ./part5-update.json \
416
510
  --pretty
417
511
  ```
418
512
 
419
- 预览通过后立即应用:
513
+ 预览通过后立即应用(默认 request-file 模式):
420
514
 
421
515
  ```bash
422
516
  soke-cli ai-training +apply-scenario-update \
423
517
  --scenario-id <scenario_id> \
518
+ --request-file ./part5-update.json \
519
+ --pretty
520
+ ```
521
+
522
+ 如需排障,再退回 operations 模式:
523
+
524
+ ```bash
525
+ soke-cli ai-training +preview-scenario-update \
526
+ --scenario-id <scenario_id> \
527
+ --operations-file ./part5-operations.json \
424
528
  --base-updated-at <updated_at> \
529
+ --reason "Part5: 教练设置" \
530
+ --pretty
531
+
532
+ soke-cli ai-training +apply-scenario-update \
533
+ --scenario-id <scenario_id> \
425
534
  --operations-file ./part5-operations.json \
535
+ --base-updated-at <updated_at> \
426
536
  --idempotency-key "cli-<scenario_short>-part5-apply" \
427
537
  --reason "Part5: 教练设置" \
428
538
  --pretty
@@ -433,6 +543,11 @@ soke-cli ai-training +apply-scenario-update \
433
543
  - 应用成功后输出完成摘要
434
544
  - **apply 后验证**:执行 `soke-cli ai-training +get-scenario --scenario-id <id> --pretty`,确认练习配置字段(`passing_score`、`pass_difficulty`、`max_practice_attempts`、`completion_rule`、`ai_assistance_enabled` 等)已全部同步
435
545
  - 仅在知识库超长或用户明确要求知识包绑定时,追加 `soke-cli ai-training +sync` / `soke-cli ai-training +bind-scenario`
546
+ - **只有以下全部满足,才允许输出完成摘要/进入发布闸门**:
547
+ 1. 已生成 `part5-operations.json` 与 `part5-update.json`
548
+ 2. 已执行真实 preview/apply
549
+ 3. 练习配置字段回读验收通过
550
+ - 若任一步失败:立即向用户报错,停止流程,严禁静默输出“完成创建”或继续发布
436
551
 
437
552
  ### 微调(optimizer)确认后
438
553
 
@@ -443,15 +558,26 @@ soke-cli ai-training +get-scenario \
443
558
 
444
559
  soke-cli ai-training +preview-scenario-update \
445
560
  --scenario-id <scenario_id> \
446
- --base-updated-at <updated_at> \
561
+ --request-file ./optimize-update.json \
562
+ --pretty
563
+
564
+ soke-cli ai-training +apply-scenario-update \
565
+ --scenario-id <scenario_id> \
566
+ --request-file ./optimize-update.json \
567
+ --pretty
568
+
569
+ # 排障时再退回 operations 模式
570
+ soke-cli ai-training +preview-scenario-update \
571
+ --scenario-id <scenario_id> \
447
572
  --operations-file ./optimize-operations.json \
573
+ --base-updated-at <updated_at> \
448
574
  --reason "优化提示词" \
449
575
  --pretty
450
576
 
451
577
  soke-cli ai-training +apply-scenario-update \
452
578
  --scenario-id <scenario_id> \
453
- --base-updated-at <updated_at> \
454
579
  --operations-file ./optimize-operations.json \
580
+ --base-updated-at <updated_at> \
455
581
  --idempotency-key "cli-<scenario_short>-opt-apply" \
456
582
  --reason "优化提示词" \
457
583
  --pretty
@@ -459,7 +585,7 @@ soke-cli ai-training +apply-scenario-update \
459
585
 
460
586
  ---
461
587
 
462
- ## Part2 operations 结构
588
+ ## Part2 operations 结构(默认推荐:逐个 add_ai_role)
463
589
 
464
590
  ```json
465
591
  [
@@ -529,7 +655,7 @@ soke-cli ai-training +apply-scenario-update \
529
655
  - 不要把 `knowledge_level` 写成字符串;必须是数组
530
656
  - `customized_fields` 应与 `role_data` 中真实写入的自定义字段逐项对齐
531
657
  - `created_at` / `updated_at` 建议使用 UTC ISO8601 时间字符串
532
- - **`avatar` / `voice_id` 在 Part2 阶段留空字符串 `""`**,apply 后由资源匹配流程回填
658
+ - **`avatar` / `voice_id` 在 Part2 阶段必须写入真实值**:生成 `part2-operations.json` 前先执行 `+list-role-avatars` 和 `+list-role-voices` 完成资源匹配。头像和声音不允许在 JSON 中留空 `""`。若某个角色资源匹配失败,允许该角色留空并标注待补,但不能三个角色都留空
533
659
 
534
660
  ### Part2 replace_ai_roles 自查清单
535
661
 
@@ -542,8 +668,8 @@ soke-cli ai-training +apply-scenario-update \
542
668
  | 3 | `customization_level` | `"full"`,外层 | 写入 `role_data` 内 |
543
669
  | 4 | `is_custom_role` | `true`,外层 | 写入 `role_data` 内 |
544
670
  | 5 | `customized_fields` | 外层数组,与 `role_data` 字段逐项对齐 | 写入 `role_data` 内 |
545
- | 6 | `avatar` | `""` 或头像 URL | 传资源 `id`(如 `cover_ai_role_avatar_001`) |
546
- | 7 | `voice_id` | `""` 或声音 ID | `sample_url`(如 `...mp3`) |
671
+ | 6 | `avatar` | 头像 URL 或「匹配失败暂时为空」| 多个角色全部为空 |
672
+ | 7 | `voice_id` | 声音 ID 或「匹配失败暂时为空」| 多个角色全部为空 |
547
673
  | 8 | `knowledge_level` | 数组 `["专家级"]` | 字符串 `"专家级"` |
548
674
  | 9 | `taboos_objections` | 数组 `["禁止A", "禁止B"]` | 单个长字符串 |
549
675
  | 10 | `background` | 四段深度画像全文,非空 | `null` 或只写一句话 |
@@ -578,7 +704,7 @@ soke-cli ai-training +apply-scenario-update \
578
704
  ]
579
705
  ```
580
706
 
581
- > ⚠️ **已知平台 bug**:`add_conversation_step` apply 返回 snapshot_id 但数据不持久化(CLI v1.0.66),`get-scenario` 始终返回空 steps。对话步骤需在 MentorAI Web 管理后台手动补充。
707
+ > ⚠️ **已知平台限制(v2.20.3 修订)**:最新官方指南仍推荐用 `add_conversation_step` / `patch_conversation_step` / `remove_conversation_step` / `reorder_conversation_steps` 维护流程步骤;但当前部分 CLI 版本实测仍可能出现 apply 成功而 `get-scenario` 回读 `conversation_steps` 为空,甚至 `opening_dialogue` 也不及时反映。执行策略应为:先按标准语义操作生成并执行 Part3;若 `get-scenario` 回读异常,**默认按平台回读问题处理并直接续流 Part4**,不再要求用户先去 Web 后台确认。仅当 preview/apply 本身失败,或后续步骤出现明确阻塞证据时才回退排查。严禁因 CLI 回读异常直接阻断流程。
582
708
 
583
709
  ### Part3 operations 自查清单
584
710
 
@@ -745,7 +871,7 @@ soke-cli ai-training +apply-scenario-update \
745
871
  |---|---|---|
746
872
  | role-profiler 按需画像(仅按需) | Part2 | 已启用按需画像模式,且 Part1 行业/场景描述/角色背景被修改 |
747
873
  | 场景类型判定 | Part1 | Part1 标签/行业被修改 |
748
- | Part2 预览基线 | Part2 前 | 每次进入 Part2 都重新 GET |
874
+ | Part2 预览基线 | Part2 前 | 仅在 `scenario_id` 已成功写入 state-snapshot 后,才允许进入并重新 GET |
749
875
  | Part3 预览基线 | Part3 前 | 每次进入 Part3 都重新 GET |
750
876
  | Part4 预览基线 | Part4 前 | 每次进入 Part4 都重新 GET |
751
877
  | Part5 预览基线 | Part5 前 | 每次进入 Part5 都重新 GET |
@@ -801,7 +927,7 @@ soke-cli ai-training +apply-scenario-update \
801
927
 
802
928
  > ⚠️ **强制使用**:每次生成 Part JSON 后、preview 前,必须逐段对照此清单,确认每个内容块都已 1:1 复制到对应 JSON 字段。禁止摘要化、禁止改写、禁止遗漏任何一段。
803
929
 
804
- ### Part1 → `step1-create.json` 搬运清单
930
+ ### Part1 → `part1-create.json` / `step1-create.json` 搬运清单
805
931
 
806
932
  Part1 输出包含以下内容块,每块都必须映射到 JSON:
807
933
 
@@ -814,7 +940,7 @@ Part1 输出包含以下内容块,每块都必须映射到 JSON:
814
940
  | 5 | 场景语言 | ☐ | `scene_lang` | 固定写死 `"简体中文"` |
815
941
  | 6 | 封面图 CDN URL | ☐ | `scenario_cover` | 已上传封面的 CDN URL |
816
942
 
817
- > **生成后自检命令**:逐条打开 step1-create.json,对照 Part1 确认输出,确保 description 长度与 Part1 场景描述正文长度一致。
943
+ > **生成后自检命令**:逐条打开 `part1-create.json` 或 `step1-create.json`,对照 Part1 确认输出,确保 description 长度与 Part1 场景描述正文长度一致;随后必须执行 `+create-scenario` 并确认拿到 `scenario_id`,否则不得进入 Part2。
818
944
 
819
945
  ---
820
946
 
@@ -847,8 +973,8 @@ Part2 由两大部分组成:**AI角色整体设定(OS)** 和 **具体角
847
973
  | B4.1 | 背景四维完整性验证 | ☐ | — | 每个角色的 background 必须包含「我是谁/我的困扰/我的过往经历/我今天的心态」全部四段的完整原文。任一段缺失 → 判定为「维度缺失」,驳回。此检查须在 B4 逐字对齐之前完成。 |
848
974
  | B5 | MBTI | ☐ | `role_data.personality_type` | 代码+名称,如 "ISTJ" |
849
975
  | B6 | 性格 | ☐ | `role_data.personality` | 原样 |
850
- | B7 | 头像 | ☐ | `role_data.avatar` | Part2 阶段留空(""),apply 后由资源匹配回填 |
851
- | B8 | 语音 | ☐ | `role_data.voice_id` | Part2 阶段留空(""),apply 后由资源匹配回填 |
976
+ | B7 | 头像 | ☐ | `role_data.avatar` | 必须在生成 JSON 前查询 `+list-role-avatars` 完成匹配,写真实 URL |
977
+ | B8 | 语音 | ☐ | `role_data.voice_id` | 必须在生成 JSON 前查询 `+list-role-voices` 完成匹配,写真实 ID |
852
978
  | B9 | 角色标签 | ☐ | `role_data.tags` | 转为数组 |
853
979
  | B10 | 来源类型 | ☐ | `role_data.source_type` | 固定 "custom" |
854
980
  | B11 | 知识水平 | ☐ | `role_data.knowledge_level` | 数组,如 ["专家级"] |
@@ -957,6 +1083,7 @@ with open('file.json', 'w', encoding='utf-8') as f:
957
1083
  | JSON 解析失败 | 手工拼接中文引号/换行 | 用 Python `json.dump(..., ensure_ascii=False, indent=2)` 生成,**禁止 heredoc / echo / cat << 直接写含中文引号(``)的 JSON** |
958
1084
  | operation type 422 | type 拼错或使用过时 type | 严格使用平台已验证的 type 名 |
959
1085
  | `replace_conversation_steps` 422 | 平台不接受整包替换流程 | 改用 `add_conversation_step` / `patch_conversation_step` / `remove_conversation_step` / `reorder_conversation_steps` |
1086
+ | `add_conversation_step` apply 成功但回读为空 | 当前 CLI 版本存在回读口径差异,实际可能已写入 | 若 preview/apply 成功,则记录回读异常并直接继续 Part4;仅在后续出现明确阻塞证据时才回退排查 |
960
1087
  | `replace_scoring_criteria_config` 校验失败 | 少了 `data.config` 外层或 `criteria_data` 层级缺失 | 使用 `data.config.criteria_data`,确保 `criteria_data` 直接在 `config` 下且不缺失中间层级 |
961
1088
  | `step_name` 字段报错 | 写成 `name` | 对话环节字段固定使用 `step_name` |
962
1089
  | `base_updated_at` 过期 | 并发修改 | 每次 preview/apply 前先 `soke-cli ai-training +get-scenario` |