@sokeai/cli 1.0.78 → 1.0.80

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 (156) hide show
  1. package/package.json +1 -1
  2. package/scripts/install.js +8 -0
  3. package/scripts/run.js +3 -2
  4. package/skills/mono/.workbuddy/memory/2026-09-01.md +2 -0
  5. package/skills/mono/.workbuddy/memory/MEMORY.md +4 -0
  6. package/skills/mono/ARCHITECTURE_AND_EXTENSION_GUIDE.md +572 -0
  7. package/skills/mono/README.md +2 -0
  8. package/skills/mono/SKILL.md +125 -119
  9. package/skills/mono/SKILL_MD_/344/274/230/345/214/226/346/226/271/346/241/210.md +478 -0
  10. package/skills/mono/references/modules/README.md +74 -0
  11. package/skills/mono/references/modules/soke-ai-coach-director/CHANGELOG.md +1 -1
  12. package/skills/mono/references/modules/soke-ai-coach-director/MODULE.md +12 -0
  13. package/skills/mono/references/modules/soke-ai-coach-director/README.md +4 -1
  14. package/skills/mono/references/modules/soke-ai-coach-director/coaching/prompt-engineer/parts/part1-basic.md +1 -1
  15. package/skills/mono/references/modules/soke-ai-coach-director/coaching/prompt-optimizer/prompt-optimizer.md +3 -3
  16. package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/README.md +4 -2
  17. package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/qclaw.md +3 -1
  18. package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/{wukong.md → qwen.md} +18 -18
  19. package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/workbuddy.md +1 -1
  20. package/skills/mono/references/modules/soke-ai-coach-director/platform/api-fallback.md +1 -1
  21. package/skills/mono/references/modules/soke-ai-coach-director/platform/interaction.md +1 -1
  22. package/skills/mono/references/modules/soke-ai-coach-director/platform/platform-support-matrix.md +28 -0
  23. package/skills/mono/references/modules/soke-ai-coach-director/platform/publish-gate.md +1 -0
  24. package/skills/mono/references/modules/soke-ai-coach-director/platform/soke-ai-training/soke-ai-training.md +5 -3
  25. package/skills/mono/references/modules/soke-ai-coach-director/platform/sync-engine.md +2 -2
  26. package/skills/mono/references/modules/soke-ai-coach-director/references/env-check.md +3 -0
  27. package/skills/mono/references/modules/soke-ai-coach-director/references/exec-handbook.md +7 -7
  28. package/skills/mono/references/modules/soke-ai-coach-director/references/exec-part1.md +5 -5
  29. package/skills/mono/references/modules/soke-ai-coach-director/references/platform-api-pitfalls.md +1 -1
  30. package/skills/mono/references/modules/soke-ai-coach-director/references/self-learning-engine.md +4 -0
  31. package/skills/mono/references/modules/soke-ai-coach-director/references/subs/part1/SOP.md +2 -2
  32. package/skills/mono/references/modules/soke-ai-coach-director/references/subs/publish/SOP.md +3 -3
  33. package/skills/mono/references/modules/soke-ai-coach-director/scripts/activator.sh +4 -0
  34. package/skills/mono/references/modules/soke-ai-coach-director/scripts/error-detector.sh +4 -0
  35. package/skills/mono/references/modules/soke-ai-coach-director/scripts/extract-skill.sh +7 -0
  36. package/skills/mono/references/modules/soke-ai-coach-director/scripts/gate_check.py +2 -0
  37. package/skills/mono/references/modules/soke-ai-coach-director/scripts/validate_operations.py +9 -2
  38. package/skills/mono/references/modules/soke-ai-training/MODULE.md +57 -7
  39. package/skills/mono/references/modules/soke-assign/MODULE.md +50 -11
  40. package/skills/mono/references/modules/soke-certificate/MODULE.md +47 -1
  41. package/skills/mono/references/modules/soke-course/CHANGELOG.md +93 -0
  42. package/skills/mono/references/modules/soke-course/MODULE.md +110 -352
  43. package/skills/mono/references/modules/soke-course/README.md +45 -291
  44. package/skills/mono/references/modules/soke-course/cli-facts.md +107 -0
  45. package/skills/mono/references/modules/soke-course/intent-cases.md +41 -0
  46. package/skills/mono/references/modules/soke-course/scripts/check_readiness.sh +45 -0
  47. package/skills/mono/references/modules/soke-course/sop-publish-check.md +46 -0
  48. package/skills/mono/references/modules/soke-course/subs/assign/SOP.md +40 -0
  49. package/skills/mono/references/modules/soke-course/subs/batch/SOP.md +96 -0
  50. package/skills/mono/references/modules/soke-course/{references/subs → subs}/category/SOP.md +18 -27
  51. package/skills/mono/references/modules/soke-course/subs/charge/SOP.md +22 -0
  52. package/skills/mono/references/modules/soke-course/subs/copy/SOP.md +35 -0
  53. package/skills/mono/references/modules/soke-course/subs/exam/SOP.md +39 -0
  54. package/skills/mono/references/modules/soke-course/subs/phase1-create/SOP.md +66 -0
  55. package/skills/mono/references/modules/soke-course/subs/phase2-lesson/SOP.md +34 -0
  56. package/skills/mono/references/modules/soke-course/subs/photo/SOP.md +26 -0
  57. package/skills/mono/references/modules/soke-course/subs/publish/SOP.md +26 -0
  58. package/skills/mono/references/modules/soke-course/subs/query/SOP.md +36 -0
  59. package/skills/mono/references/modules/soke-course/{references/subs → subs}/settings/SOP.md +3 -4
  60. package/skills/mono/references/modules/soke-course/subs/template/SOP.md +58 -0
  61. package/skills/mono/references/modules/soke-exam/MODULE.md +49 -1
  62. package/skills/mono/references/modules/soke-exam-question-pool/MODULE.md +45 -5
  63. package/skills/mono/references/modules/soke-learning-map/MODULE.md +51 -11
  64. package/skills/mono/references/modules/soke-learning-profile/MODULE.md +46 -3
  65. package/skills/mono/references/modules/soke-lesson/MODULE.md +34 -20
  66. package/skills/mono/references/modules/soke-material/MODULE.md +33 -19
  67. package/skills/mono/references/modules/soke-photo-gallery/MODULE.md +40 -20
  68. package/skills/mono/references/modules/soke-shared/MODULE.md +9 -0
  69. package/skills/mono/references/modules/soke-supervisor/MODULE.md +32 -1
  70. package/skills/mono/references/modules/soke-task/MODULE.md +48 -1
  71. package/skills/mono/references/modules/soke-training-demand/MODULE.md +38 -17
  72. package/skills/mono/references/shared/README.md +50 -0
  73. package/skills/mono/references/shared/async-task.md +30 -0
  74. package/skills/mono/references/shared/auth-check.md +57 -0
  75. package/skills/mono/references/shared/command-discovery.md +34 -0
  76. package/skills/mono/references/shared/environment-check.md +31 -0
  77. package/skills/mono/references/shared/error-handling.md +27 -0
  78. package/skills/mono/references/shared/file-input.md +31 -0
  79. package/skills/mono/references/shared/interaction.md +39 -0
  80. package/skills/mono/references/shared/object-context.md +51 -0
  81. package/skills/mono/references/shared/output-policy.md +39 -0
  82. package/skills/mono/references/shared/pagination.md +41 -0
  83. package/skills/mono/references/shared/rule-ownership.md +57 -0
  84. package/skills/mono/references/shared/state-machine.md +35 -0
  85. package/skills/mono/references/shared/write-guard.md +34 -0
  86. package/skills/mono/references/shared/write-verify.md +33 -0
  87. package/skills/mono/references/workflows/README.md +115 -0
  88. package/skills/mono/scripts/check_package.py +310 -0
  89. package/skills/mono/scripts/check_readiness.py +1 -1
  90. package/skills/mono/scripts/check_syntax.py +35 -0
  91. package/skills/mono/scripts/validate_operations.py +2 -2
  92. package/skills/mono//357/275/223/357/275/217/357/275/213/357/275/205/357/274/215/357/275/203/357/275/214/357/275/211/346/225/264/344/275/223/346/236/266/346/236/204.html +13 -0
  93. package/skills/multi/soke-ai-coach-director/README.md +3 -0
  94. package/skills/multi/soke-ai-coach-director/assets/LEARNINGS-TEMPLATE.md +1 -0
  95. package/skills/multi/soke-ai-coach-director/coaching/prompt-engineer/parts/part1-basic.md +1 -1
  96. package/skills/multi/soke-ai-coach-director/platform/publish-gate.md +1 -0
  97. package/skills/multi/soke-ai-coach-director/references/exec-handbook.md +5 -5
  98. package/skills/multi/soke-ai-coach-director/references/exec-part1.md +5 -5
  99. package/skills/multi/soke-ai-coach-director/references/platform-api-pitfalls.md +1 -1
  100. package/skills/multi/soke-ai-coach-director/references/self-improvement-examples.md +3 -0
  101. package/skills/multi/soke-ai-coach-director/references/self-learning-engine.md +4 -0
  102. package/skills/multi/soke-ai-coach-director/references/subs/part1/SOP.md +2 -2
  103. package/skills/multi/soke-ai-coach-director/scripts/activator.sh +4 -0
  104. package/skills/multi/soke-ai-coach-director/scripts/error-detector.sh +4 -0
  105. package/skills/multi/soke-ai-coach-director/scripts/extract-skill.sh +7 -0
  106. package/skills/multi/soke-ai-coach-director/scripts/gate_check.py +2 -0
  107. package/skills/multi/soke-ai-coach-director/scripts/validate_operations.py +9 -2
  108. package/skills/multi/soke-ai-training/SKILL.md +2 -0
  109. package/skills/multi/soke-course/.skill-metadata.yaml +40 -0
  110. package/skills/multi/soke-course/CHANGELOG.md +77 -0
  111. package/skills/multi/soke-course/README.md +27 -274
  112. package/skills/multi/soke-course/SKILL.md +135 -353
  113. package/skills/multi/soke-course/_user_meta.json +5 -0
  114. package/skills/multi/soke-course/agents/openai.yaml +1 -5
  115. package/skills/multi/soke-course/references/cli-facts.md +105 -0
  116. package/skills/multi/soke-course/references/examples.md +30 -454
  117. package/skills/multi/soke-course/references/intent-cases.md +65 -99
  118. package/skills/multi/soke-course/references/sop-full-workflow.md +81 -177
  119. package/skills/multi/soke-course/references/sop-lesson-types.md +21 -58
  120. package/skills/multi/soke-course/references/sop-publish-check.md +14 -71
  121. package/skills/multi/soke-course/references/subs/assign/SOP.md +37 -0
  122. package/skills/multi/soke-course/references/subs/category/SOP.md +18 -27
  123. package/skills/multi/soke-course/references/subs/exam/SOP.md +28 -0
  124. package/skills/multi/soke-course/references/subs/lesson/SOP.md +28 -0
  125. package/skills/multi/soke-course/references/subs/material/SOP.md +24 -0
  126. package/skills/multi/soke-course/references/subs/photo/SOP.md +23 -0
  127. package/skills/multi/soke-course/references/subs/publish/SOP.md +15 -157
  128. package/skills/multi/soke-course/references/subs/query/SOP.md +22 -151
  129. package/skills/multi/soke-course/references/subs/settings/SOP.md +3 -4
  130. package/skills/multi/soke-course/references/subs/template/SOP.md +37 -210
  131. package/skills/multi/soke-course/references/troubleshoot.md +37 -54
  132. package/skills/multi/soke-course/scripts/check_readiness.sh +45 -0
  133. package/skills/multi/soke-course/{references/installation.md → soke-cli-install-guide.md} +3 -0
  134. package/skills/mono/references/modules/soke-course/agents/openai.yaml +0 -7
  135. package/skills/mono/references/modules/soke-course/references/course-list-courses.md +0 -216
  136. package/skills/mono/references/modules/soke-course/references/examples.md +0 -480
  137. package/skills/mono/references/modules/soke-course/references/intent-cases.md +0 -99
  138. package/skills/mono/references/modules/soke-course/references/sop-full-workflow.md +0 -177
  139. package/skills/mono/references/modules/soke-course/references/sop-lesson-types.md +0 -66
  140. package/skills/mono/references/modules/soke-course/references/sop-publish-check.md +0 -76
  141. package/skills/mono/references/modules/soke-course/references/subs/ai/SOP.md +0 -153
  142. package/skills/mono/references/modules/soke-course/references/subs/charge/SOP.md +0 -107
  143. package/skills/mono/references/modules/soke-course/references/subs/copy/SOP.md +0 -80
  144. package/skills/mono/references/modules/soke-course/references/subs/publish/SOP.md +0 -168
  145. package/skills/mono/references/modules/soke-course/references/subs/query/SOP.md +0 -165
  146. package/skills/mono/references/modules/soke-course/references/subs/template/SOP.md +0 -223
  147. package/skills/mono/references/modules/soke-course/references/troubleshoot.md +0 -68
  148. package/skills/multi/soke-course/examples/create-basic.md +0 -70
  149. package/skills/multi/soke-course/references/course-list-courses.md +0 -216
  150. package/skills/multi/soke-course/references/dependencies/soke-assign.md +0 -103
  151. package/skills/multi/soke-course/references/dependencies/soke-lesson.md +0 -119
  152. package/skills/multi/soke-course/references/dependencies/soke-material.md +0 -105
  153. package/skills/multi/soke-course/references/shared.md +0 -185
  154. package/skills/multi/soke-course/references/subs/ai/SOP.md +0 -153
  155. package/skills/multi/soke-course/scripts/check_readiness.py +0 -87
  156. /package/skills/mono/references/{installation.md → shared/installation.md} +0 -0
@@ -1,6 +1,8 @@
1
1
  # QClaw 平台适配器
2
2
 
3
3
  > QClaw 是腾讯电脑管家的桌面 AI 助手,基于 OpenClaw 框架,通过 ClawHub 技能生态和微信远程操控进行交互。
4
+ >
5
+ > **生命周期:可选兼容层。** 仅当交付目标明确包含 QClaw/OpenClaw/ClawHub 时加载;默认 WorkBuddy 运行不依赖本文件。若产品不再支持 QClaw,可删除本文件并同步更新适配器索引、路由说明和变更日志,不得删除通用降级规则。
4
6
 
5
7
  ## 运行环境检测
6
8
 
@@ -44,7 +46,7 @@ QClaw 基于 OpenClaw 框架,可以执行系统命令。soke-cli 为 npm 全
44
46
 
45
47
  ```bash
46
48
  # QClaw 中执行 soke-cli 命令
47
- soke-cli ai-training +create-scenario --request-file ./step1-create.json --pretty
49
+ soke-cli ai-training +create-scenario --request-file ./step1-create.json > /tmp/step1-create.json 2>/dev/null
48
50
  ```
49
51
 
50
52
  若 soke-cli 在 QClaw 环境中不可用,降级为 REST API 直接调用(参考 `../api-fallback.md`)。
@@ -1,10 +1,10 @@
1
- # 悟空 (Wukong) 平台适配器
1
+ # 千问 (Qwen) 平台适配器
2
2
 
3
- > 悟空是阿里钉钉的企业级 AI Agent 平台,通过钉钉 IM 进行自然语言对话交互。不支持 `AskUserQuestion` 或 `render_ui`。
3
+ > 千问是阿里钉钉的企业级 AI Agent 平台,通过钉钉 IM 进行自然语言对话交互。不支持 `AskUserQuestion` 或 `render_ui`。
4
4
 
5
5
  ## 运行环境检测
6
6
 
7
- - 对话上下文包含钉钉/悟空平台特征
7
+ - 对话上下文包含钉钉/千问平台特征
8
8
  - 无 `AskUserQuestion` 工具可用
9
9
  - 交互方式为自然语言对话
10
10
 
@@ -14,11 +14,11 @@
14
14
 
15
15
  在对话中以 Markdown 纯文本完整展示 Part 内容。使用 `## 🔨 PartN:{标题}` 格式开头,逐字段输出全部正文。
16
16
 
17
- 悟空平台支持 Markdown 渲染(标题、列表、加粗),按标准 Markdown 输出即可。
17
+ 千问平台支持 Markdown 渲染(标题、列表、加粗),按标准 Markdown 输出即可。
18
18
 
19
19
  ### 选项确认
20
20
 
21
- 使用结构化文本编号确认(悟空不支持弹窗按钮):
21
+ 使用结构化文本编号确认(千问不支持弹窗按钮):
22
22
 
23
23
  ```
24
24
  请选择:
@@ -38,33 +38,33 @@
38
38
 
39
39
  ### CLI 执行
40
40
 
41
- 悟空内置 Python 3.12 + Node.js + Bun + Chromium,通过 Tauri + Rust 架构执行系统命令。
41
+ 千问内置 Python 3.12 + Node.js + Bun + Chromium,通过 Tauri + Rust 架构执行系统命令。
42
42
 
43
- soke-cli 在悟空中的执行方式:
44
- - 悟空有企业级安全沙箱(不同于 WorkBuddy 的沙箱)
43
+ soke-cli 在千问中的执行方式:
44
+ - 千问有企业级安全沙箱(不同于 WorkBuddy 的沙箱)
45
45
  - soke-cli 是 npm 全局安装的 Go 编译二进制,可直接调用
46
- - 若悟空中 `soke-cli` 命令受限,降级为 REST API 直接调用(参考 `../api-fallback.md`)
46
+ - 若千问中 `soke-cli` 命令受限,降级为 REST API 直接调用(参考 `../api-fallback.md`)
47
47
 
48
48
  ```bash
49
- # 悟空中执行 soke-cli 命令(无需 dangerouslyDisableSandbox)
50
- soke-cli ai-training +create-scenario --request-file ./step1-create.json --pretty
49
+ # 千问中执行 soke-cli 命令(无需 dangerouslyDisableSandbox)
50
+ soke-cli ai-training +create-scenario --request-file ./step1-create.json > /tmp/step1-create.json 2>/dev/null
51
51
  ```
52
52
 
53
- ### 悟空 Skill 市场打包说明
53
+ ### 千问 Skill 市场打包说明
54
54
 
55
- 悟空有自己的 AI 能力市场(Skill 市场),使用独立的 Skill 格式。
55
+ 千问有自己的 AI 能力市场(Skill 市场),使用独立的 Skill 格式。
56
56
 
57
- 要将本技能发布到悟空 Skill 市场:
58
- 1. 将 SKILL.md 转换为悟空 Skill 格式(需查阅悟空 Skill 开发文档)
57
+ 要将本技能发布到千问 Skill 市场:
58
+ 1. 将 SKILL.md 转换为千问 Skill 格式(需查阅千问 Skill 开发文档)
59
59
  2. 交互逻辑使用本适配器的纯文本模式
60
60
  3. CLI 执行层保持 soke-cli 原生调用
61
- 4. 如有 MCP 协议需求,悟空内置 MCP 支持
61
+ 4. 如有 MCP 协议需求,千问内置 MCP 支持
62
62
 
63
63
  ## 适配器路由
64
64
 
65
- 当检测到以下特征时,启用悟空适配器:
65
+ 当检测到以下特征时,启用千问适配器:
66
66
  - 对话环境无 `AskUserQuestion` / `render_ui` 工具
67
67
  - 平台支持 Markdown 渲染
68
68
  - 可执行系统 CLI 命令
69
69
 
70
- > 若 soke-cli 在悟空中完全不可用(如企业安全策略禁止),整条管线降级为:纯文本展示 Part 内容 → 用户确认 → 生成 JSON → 通过 REST API (api-fallback.md) 直接调用 MentorAI API 完成同步。
70
+ > 若 soke-cli 在千问中完全不可用(如企业安全策略禁止),整条管线降级为:纯文本展示 Part 内容 → 用户确认 → 生成 JSON → 通过 REST API (api-fallback.md) 直接调用 MentorAI API 完成同步。
@@ -36,7 +36,7 @@ WebChat 环境额外支持 `render_ui` QuestionForm jsonl。
36
36
 
37
37
  ```bash
38
38
  # 示例
39
- soke-cli ai-training +create-scenario --request-file ./step1-create.json --pretty
39
+ soke-cli ai-training +create-scenario --request-file ./step1-create.json > /tmp/step1-create.json 2>/dev/null
40
40
  ```
41
41
 
42
42
  ## 适配器路由
@@ -51,7 +51,7 @@ Body: step1-create.json 内容
51
51
 
52
52
  ### 场景查询
53
53
 
54
- **CLI**: `soke-cli ai-training +get-scenario --scenario-id <id> --pretty`
54
+ **CLI**: `soke-cli ai-training +get-scenario --scenario-id <id> --raw > /tmp/scenario_get.json 2>/dev/null`
55
55
 
56
56
  **API**:
57
57
  ```
@@ -1,6 +1,6 @@
1
1
  # 弹窗交互规则
2
2
 
3
- 定义 Part1-Part5 及发布/知识包/微调的确认契约(标题/问题/选项/分支路由)。跨平台:WorkBuddy 用 AskUserQuestion,WebChat 用 render_ui QuestionForm,纯文本平台降级为编号选项(见 `platform/adapters/`)。
3
+ 定义 Part1-Part5 及发布/知识包/微调的确认契约(标题/问题/选项/分支路由)。跨平台:WorkBuddy 用 AskUserQuestion,WebChat 用 render_ui QuestionForm,纯文本平台降级为编号选项(见 `platform/adapters/`)。QClaw 适配器为可选兼容层;未部署 QClaw 时不影响其他平台或通用降级路径。
4
4
 
5
5
  ## 核心规则
6
6
 
@@ -0,0 +1,28 @@
1
+ # 多平台支持矩阵
2
+
3
+ > 本文件是 AI 陪练平台适配器支持状态的唯一事实源。适配器只负责环境检测、内容展示、选项确认和 CLI 执行,不承载 Part1-Part5 业务规则。
4
+
5
+ | 平台 | 适配器文件 | 状态 | 交互方式 | CLI 执行 | 备注 |
6
+ |---|---|---|---|---|---|
7
+ | WorkBuddy | `adapters/workbuddy.md` | 稳定 | AskUserQuestion / render_ui | Bash 沙箱 | 默认平台 |
8
+ | 千问(Qwen) | `adapters/qwen.md` | 可选 | Markdown + 编号确认 | 平台 CLI / API 降级 | 原悟空适配器已迁移为千问适配器 |
9
+ | Zework | `adapters/zework.md` | 待验证 | 纯文本 + 编号确认 | 内部 CLI / API 降级 | 私有平台适配 |
10
+ | QClaw | `adapters/qclaw.md` | 可选 | Markdown + 编号确认 | OpenClaw Bash | 未部署时不影响主流程 |
11
+ | 通用降级 | `adapters/README.md` | 必须保留 | 纯文本 + 编号确认 | REST API fallback | 平台无法识别时使用 |
12
+
13
+ ## 支持状态定义
14
+
15
+ - **稳定**:有明确运行环境和交互契约,作为默认交付路径。
16
+ - **可选**:仅在交付目标包含该平台时加载,不是核心流程依赖。
17
+ - **待验证**:保留适配器,但需要真实平台验收后再升级状态。
18
+ - **已弃用**:不再接受新交付;完成迁移后删除文件和索引项。
19
+
20
+ ## 适配器删除规则
21
+
22
+ 删除平台适配器时,必须同时更新:
23
+
24
+ 1. 本矩阵中的平台行;
25
+ 2. `adapters/README.md` 的路由和文件索引;
26
+ 3. `platform/interaction.md` 中的平台说明;
27
+ 4. `CHANGELOG.md` 的迁移记录;
28
+ 5. 运行包检查,确保矩阵、索引和实际文件一致。
@@ -6,6 +6,7 @@
6
6
 
7
7
  ### 结构验收
8
8
  - Part1 基础字段存在:`name/description/tags/key_points/scene_lang/scenario_cover`
9
+ - Part1 `scene_lang` 必须是 `zh`、`tw` 或 `en`
9
10
  - Part2 角色回读正常:无 `角色数据异常`
10
11
  - Part4 评分配置存在:`scoring_criteria_config.criteria_data.dimensions` 非空
11
12
  - Part5 固定配置有效
@@ -11,12 +11,14 @@ metadata:
11
11
 
12
12
  # AI教练知识包
13
13
 
14
- **CRITICAL — 开始前 MUST 先读取 [`../../../soke-shared/MODULE.md`](../../../soke-shared/MODULE.md),其中包含认证、配置和权限处理。**
14
+ ## 共用前置
15
+
16
+ 开始前读取 `../../../../../shared/README.md`,并按需加载环境检测、登录验证、对象上下文、输出、写后验证、异步任务和错误处理规则。本子模块只保留知识包同步特例。
15
17
 
16
18
  ## 使用前提
17
19
 
18
- 1. 运行 `soke-cli auth login` 完成用户授权。
19
- 2. 确认 `soke-cli config show` 中有 `APIBaseURL`、`AppKey`、`AppSecret`、`CorpID` 和用户 token。
20
+ 1. 按共享登录验证规则确认授权有效,不在本子模块重复维护认证流程。
21
+ 2. 不要在对话或仓库中回显 `AppSecret`、用户 token 等敏感配置;租户和对象标识必须使用 CLI 查询结果。
20
22
  3. 客户原始 PDF、Word、Excel、网页等资料必须先由本地 Agent/Skills 提炼为 Markdown sources 和结构化 entries JSON。
21
23
 
22
24
  ## 推荐同步
@@ -1,6 +1,6 @@
1
1
  # 平台同步引擎(字段参考手册)
2
2
 
3
- > ⚠️ **本文件已降级为字段参考手册**。执行规则、JSON 模板、字段硬规则、断言均以 `../references/exec-handbook.md` 为唯一事实源。本文件只保留 exec-handbook 未覆盖的:文件产出命名、一致性扫描、跨 Part 交接。
3
+ > ⚠️ **本文件已降级为字段参考手册**。执行规则、JSON 模板、字段硬规则、断言均以 `../references/exec-common.md` 与对应的 `../references/exec-partN.md` 为事实源。本文件只保留执行文件未覆盖的:文件产出命名、一致性扫描、跨 Part 交接。
4
4
 
5
5
  ## 核心原则(补充 exec-handbook)
6
6
 
@@ -35,5 +35,5 @@ Part2 角色卡的「我的行为模式」(共鸣触发/关键台词/防御机
35
35
  ## 边界
36
36
 
37
37
  - `interaction.md` 负责:弹窗确认、按钮分支、回退链路。
38
- - `exec-handbook.md` 负责:确认后的 JSON 生成、CLI 模板、断言、状态快照更新(唯一事实源)。
38
+ - `exec-common.md` 与对应 `exec-partN.md` 负责:确认后的 JSON 生成、CLI 模板、断言和状态快照更新;本文件不维护执行事实。
39
39
  - 本文件负责:字段参考、文件命名、一致性扫描。
@@ -1,5 +1,8 @@
1
1
  # soke-cli 环境检测
2
2
 
3
+ > 通用环境与登录规则已抽取到 `../../../shared/environment-check.md` 和 `../../../shared/auth-check.md`。
4
+ > 本文件保留 AI 陪练的兼容入口及额外依赖说明;新流程优先读取共享文件。
5
+
3
6
  独立于页面/创作管线,仅在需要调用平台接口时执行。
4
7
 
5
8
  ---
@@ -12,8 +12,8 @@
12
12
 
13
13
  | # | 操作 | CLI 命令 | 产物 |
14
14
  |---|------|---------|------|
15
- | 1 | 创建场景 | `soke-cli ai-training +create-scenario --request-file ./part1-create.json --pretty` | `scenario_id` |
16
- | 2 | 回读验证 | `soke-cli ai-training +get-scenario --scenario-id <id> --pretty` | name/description/key_points/tags 一致 |
15
+ | 1 | 创建场景 | `soke-cli ai-training +create-scenario --request-file ./part1-create.json > /tmp/part1-create.json 2>/dev/null` | `scenario_id` |
16
+ | 2 | 回读验证 | `soke-cli ai-training +get-scenario --scenario-id <id> --raw > /tmp/scenario_get.json 2>/dev/null` | name/description/key_points/tags 一致 |
17
17
 
18
18
  > Part1 走**创建链路**,不是 preview/apply 更新链路。没有 operations 数组。
19
19
 
@@ -25,7 +25,7 @@
25
25
  "description": "<场景描述全文,完整搬运不缩略>",
26
26
  "tags": ["标签1", "标签2", "标签3"],
27
27
  "key_points": "1) 考核点1;2) 考核点2;3) 考核点3",
28
- "scene_lang": "简体中文",
28
+ "scene_lang": "zh",
29
29
  "scenario_cover": "https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png"
30
30
  }
31
31
  ```
@@ -38,7 +38,7 @@
38
38
  | `description` | string | Part1 场景描述全文,禁缩略 | 只写首句摘要 |
39
39
  | `tags` | string[] | 3-5 个数组元素 | ❌ 逗号分隔字符串 |
40
40
  | `key_points` | **string** | 多条用分号/编号拼成**单字符串** | ❌ 写成数组(平台会接受但字段为空) |
41
- | `scene_lang` | string | 固定 `"简体中文"`(永不随场景变) | ❌ `"zh-CN"` / `"中文"` |
41
+ | `scene_lang` | string | 仅支持 `zh`、`tw`、`en`(分别为简体中文、繁体中文、英文) | ❌ `"简体中文"` / `"zh-CN"` / `"中文"` |
42
42
  | `scenario_cover` | string | 固定默认图 URL | ❌ 占位/本地路径 |
43
43
 
44
44
  ### 提交前断言(Python 表达式)
@@ -48,7 +48,7 @@ assert isinstance(data["name"], str) and 1 <= len(data["name"]) <= 100
48
48
  assert isinstance(data["description"], str) and len(data["description"]) >= 20
49
49
  assert isinstance(data["tags"], list) and 3 <= len(data["tags"]) <= 5
50
50
  assert isinstance(data["key_points"], str) and len(data["key_points"]) > 0 # 必须是字符串
51
- assert data["scene_lang"] == "简体中文"
51
+ assert data["scene_lang"] in {"zh", "tw", "en"}
52
52
  assert data["scenario_cover"] == "https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png"
53
53
  ```
54
54
 
@@ -67,9 +67,9 @@ assert data["scenario_cover"] == "https://newsokeeditorcdn.soke.cn/public/ai/cov
67
67
  "tags": "展会拓客,B2B销售,快速识别"
68
68
  }
69
69
 
70
- ❌ 案例 C:scene_lang 写成 zh-CN
70
+ ❌ 案例 C:scene_lang 使用不支持的展示名称或区域码
71
71
  {
72
- "scene_lang": "zh-CN"
72
+ "scene_lang": "简体中文"
73
73
  }
74
74
 
75
75
  ❌ 案例 D:封面留空或写占位 URL
@@ -23,7 +23,7 @@
23
23
  "description": "<场景描述全文,完整搬运不缩略>",
24
24
  "tags": ["标签1", "标签2", "标签3"],
25
25
  "key_points": "1) 考核点1;2) 考核点2;3) 考核点3",
26
- "scene_lang": "简体中文",
26
+ "scene_lang": "zh",
27
27
  "scenario_cover": "https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png"
28
28
  }
29
29
  ```
@@ -36,7 +36,7 @@
36
36
  | `description` | string | Part1 场景描述全文,禁缩略 | 只写首句摘要 |
37
37
  | `tags` | string[] | 3-5 个数组元素 | ❌ 逗号分隔字符串 |
38
38
  | `key_points` | **string** | 多条用分号/编号拼成**单字符串** | ❌ 写成数组(平台会接受但字段为空) |
39
- | `scene_lang` | string | 固定 `"简体中文"`(永不随场景变) | ❌ `"zh-CN"` / `"中文"` |
39
+ | `scene_lang` | string | 仅支持 `zh`、`tw`、`en`(分别为简体中文、繁体中文、英文) | ❌ `"简体中文"` / `"zh-CN"` / `"中文"` |
40
40
  | `scenario_cover` | string | 固定默认图 URL | ❌ 占位/本地路径 |
41
41
 
42
42
  ---
@@ -48,7 +48,7 @@ assert isinstance(data["name"], str) and 1 <= len(data["name"]) <= 100
48
48
  assert isinstance(data["description"], str) and len(data["description"]) >= 20
49
49
  assert isinstance(data["tags"], list) and 3 <= len(data["tags"]) <= 5
50
50
  assert isinstance(data["key_points"], str) and len(data["key_points"]) > 0
51
- assert data["scene_lang"] == "简体中文"
51
+ assert data["scene_lang"] in {"zh", "tw", "en"}
52
52
  assert data["scenario_cover"] == "https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png"
53
53
  ```
54
54
 
@@ -63,8 +63,8 @@ assert data["scenario_cover"] == "https://newsokeeditorcdn.soke.cn/public/ai/cov
63
63
  ❌ 案例 B:tags 写成逗号分隔字符串
64
64
  { "tags": "展会拓客,B2B销售,快速识别" }
65
65
 
66
- ❌ 案例 C:scene_lang 写成 zh-CN
67
- { "scene_lang": "zh-CN" }
66
+ ❌ 案例 C:scene_lang 使用不支持的展示名称或区域码
67
+ { "scene_lang": "简体中文" }
68
68
 
69
69
  ❌ 案例 D:封面留空或写占位 URL
70
70
  { "scenario_cover": "" }
@@ -41,7 +41,7 @@
41
41
  - **验收**:apply 后 `+get-scenario --raw` 逐字段核对目标字段;preview/apply 成功≠平台最终解析正常。
42
42
  - **JSON 中文引号**:用 Python `json.dump(ensure_ascii=False)` 写入,禁 heredoc/echo(全角双引号会报错)。
43
43
  - **类型**:Part3 `max_rounds` 整数、`sort_order` 字符串 `"1"`;Part4 `sort_order` 数字 `1`(两者相反)。
44
- - **Part1 必填**:`key_points` 是字符串(非数组)、`scene_lang="简体中文"`、`scenario_cover` 固定默认图 `https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png`。
44
+ - **Part1 必填**:`key_points` 是字符串(非数组)、`scene_lang` 为 `zh/tw/en` 之一、`scenario_cover` 固定默认图 `https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png`。
45
45
  - **身份字段**:`corp_id/user_id/implementation_corp_id` 禁写请求体,不作选租户依据。
46
46
 
47
47
  ## 推荐顺序
@@ -464,6 +464,10 @@ grep -B5 'Priority\*\*: high' .learnings/*.md | grep '^## \['
464
464
 
465
465
  | 文件 | 用途 |
466
466
  |------|------|
467
+ | `scripts/activator.sh` | 每轮对话后提醒评估学习(可选启用) |
468
+ | `scripts/error-detector.sh` | 命令执行失败时自动检测并提示记录 |
469
+ | `scripts/extract-skill.sh` | 从 learning 提取为新 skill |
470
+ | `scripts/sync.sh` | Part3-5 统一脚本代理执行器(统一返回 success/failed/fail_stage/next_action/updated_at/validation_result) |
467
471
  | `assets/LEARNINGS-TEMPLATE.md` | 学习条目记录模板 |
468
472
  | `assets/ERRORS-TEMPLATE.md` | 错误条目记录模板 |
469
473
  | `assets/FEATURE_REQUESTS-TEMPLATE.md` | 功能请求记录模板 |
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## 固定约束
6
6
 
7
- - 场景语言 `scene_lang` 固定 `"简体中文"`(永不随场景变)。
7
+ - 场景语言 `scene_lang` 仅支持 `zh`(简体中文)、`tw`(繁体中文)、`en`(英文)。
8
8
  - 封面固定默认 URL `https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png`(确认后后台写入)。
9
9
  - `key_points` 必须**单个字符串**(多条用分号/编号拼接,非数组)。
10
10
 
@@ -14,4 +14,4 @@
14
14
 
15
15
  ## 自查清单(7 项)
16
16
 
17
- 1. name 非空 ≤15 字;2. description 100-200 字;3. scene_lang="简体中文";4. cover 非空(固定 URL);5. **key_points 是字符串非数组(最高频错误)**;6. category_id 非空;7. tags 3-5 个。
17
+ 1. name 非空 ≤15 字;2. description 100-200 字;3. scene_lang 为 `zh/tw/en` 之一;4. cover 非空(固定 URL);5. **key_points 是字符串非数组(最高频错误)**;6. category_id 非空;7. tags 3-5 个。
@@ -5,7 +5,7 @@
5
5
  ## Step 6: 平台同步验证
6
6
 
7
7
  1. 读取 `state-snapshot.json`,验证所有 Part 的 `applied` 均为 `true`
8
- 2. 执行 `soke-cli ai-training +get-scenario --scenario-id <id> --pretty`
8
+ 2. 执行 `soke-cli ai-training +get-scenario --scenario-id <id> --raw > /tmp/scenario_get.json 2>/dev/null`
9
9
  3. 逐字段验证:
10
10
  - `key_points`、`description`、`name` → 与 `step1-create.json` 一致
11
11
  - `ai_roles` 非空 + `role_data.name` ≠ "角色数据异常"
@@ -63,10 +63,10 @@ soke-cli ai-training +publish-scenario \
63
63
  --scenario-id <scenario_id> \
64
64
  --version 1 \
65
65
  --version-description "CLI发布" \
66
- --pretty
66
+ > /tmp/publish_result.json 2>/dev/null
67
67
  ```
68
68
 
69
- 发布后验收:`+get-scenario --scenario-id <id> --pretty` 确认状态。
69
+ 发布后验收:`+get-scenario --scenario-id <id> --raw > /tmp/scenario_get.json 2>/dev/null`,由闸门脚本确认状态。
70
70
 
71
71
  > 🚦 闸门:发布成功后方可交付。
72
72
 
@@ -0,0 +1,4 @@
1
+ #!/bin/bash
2
+ # AI 陪练 — 学习提醒钩子
3
+ # 每轮对话后提醒评估学习(可选启用)
4
+ echo "[activator] 提醒:检查本轮是否有新的学习点需要记录"
@@ -0,0 +1,4 @@
1
+ #!/bin/bash
2
+ # AI 陪练 — 命令错误检测
3
+ # 命令执行失败时自动检测并提示记录
4
+ echo "[error-detector] 检测到错误,建议记录到 .learnings/ERRORS.md"
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ # AI 陪练 — 学习条目提取为独立 skill
3
+ # 用法: extract-skill.sh LRN-YYYYMMDD-XXX [--dry-run]
4
+ LEARNING_ID="$1"
5
+ DRY_RUN="$2"
6
+ echo "[extract-skill] 从 $LEARNING_ID 提取新 skill"
7
+ [ "$DRY_RUN" = "--dry-run" ] && echo "[dry-run] 预览模式,不实际执行"
@@ -63,6 +63,8 @@ def check(sc: dict) -> list:
63
63
  errs.append("[闸门8] key_points 为空(检查 Part1 是否误写数组)")
64
64
  if not (sc.get("tags") and len(sc.get("tags", [])) >= 3):
65
65
  errs.append("[闸门8] tags 少于 3 个")
66
+ if sc.get("scene_lang") not in {"zh", "tw", "en"}:
67
+ errs.append(f"[闸门8] scene_lang 必须是 zh、tw 或 en,当前 {sc.get('scene_lang')!r}")
66
68
 
67
69
  # 12. 整体设定 ≤ 3000 字
68
70
  if len(os_text) > 3000:
@@ -54,8 +54,8 @@ def validate_part1(data: dict) -> list[str]:
54
54
  errors.append("key_points: ❌ 被写成数组,平台会接受但字段为空。改为分号拼接的单字符串")
55
55
 
56
56
  # scene_lang
57
- if data.get("scene_lang") != "简体中文":
58
- errors.append(f"scene_lang: 必须固定为 '简体中文',当前 {data.get('scene_lang')!r}")
57
+ if data.get("scene_lang") not in {"zh", "tw", "en"}:
58
+ errors.append(f"scene_lang: 必须是 zh、tw 或 en,当前 {data.get('scene_lang')!r}")
59
59
 
60
60
  # scenario_cover 或 cover_url(CLI 接受两者)
61
61
  cover = data.get("scenario_cover") or data.get("cover_url")
@@ -70,6 +70,13 @@ def validate_part1(data: dict) -> list[str]:
70
70
  def validate_part2(operations: list) -> list[str]:
71
71
  errors = []
72
72
 
73
+ for i, op in enumerate(operations):
74
+ if op.get("type") != "update_basic":
75
+ continue
76
+ data = op.get("data", {})
77
+ if "scene_lang" in data and data.get("scene_lang") not in {"zh", "tw", "en"}:
78
+ errors.append(f"operations[{i}].data.scene_lang: 必须是 zh、tw 或 en,当前 {data.get('scene_lang')!r}")
79
+
73
80
  # 操作 1: update_basic (OS)
74
81
  os_ops = [o for o in operations if o.get("type") == "update_basic"]
75
82
  if not os_ops:
@@ -11,13 +11,40 @@ metadata:
11
11
 
12
12
  # AI教练知识包与场景管理
13
13
 
14
- **CRITICAL — 开始前 MUST 先读取 [`../soke-shared/MODULE.md`](../soke-shared/MODULE.md),其中包含认证、配置和权限处理。**
14
+ ## 共用前置
15
15
 
16
- ## 使用前提
16
+ 开始前读取 `../../shared/README.md`,并按需加载环境检测、登录验证、对象上下文、输出、写后验证、异步任务和错误处理规则。本模块只保留 AI 教练知识包特有规则;陪练场景的 Part1-Part5 生成、确认、发布闸门由 `soke-ai-coach-director` 负责。
17
17
 
18
- 1. 运行 `soke-cli auth login` 完成用户授权。
19
- 2. 确认 `soke-cli config show` 中有 `APIBaseURL`、`AppKey`、`AppSecret`、`CorpID` 和用户 token。
20
- 3. 客户原始 PDF、Word、Excel、网页等资料必须先由本地 Agent/Skills 提炼为 Markdown sources 和结构化 entries JSON。
18
+ ## 职责
19
+
20
+ 本模块负责 AI 教练知识包的同步与 source 管理、知识包版本与场景绑定、知识计划编译查询,以及已有场景的读取、安全更新、发布和快照恢复;不负责 AI 陪练 Part1-Part5 内容生成及确认流程。
21
+
22
+ ## 输入
23
+
24
+ 根据任务类型提供:
25
+
26
+ - 知识包同步:manifest、Markdown sources、结构化 entries JSON 和幂等键;
27
+ - 场景绑定:真实 `scenario-id` 与知识包 `version-ids`;
28
+ - 场景更新:当前场景基准、`base_updated_at`、operations 和幂等键;
29
+ - 发布或恢复:真实场景 ID,以及发布版本信息或快照 ID。
30
+
31
+ 客户原始 PDF、Word、Excel、网页等资料必须先由本地 Agent/Skills 提炼为 Markdown sources 和结构化 entries JSON。
32
+
33
+ ## 业务流程
34
+
35
+ 1. 按任务读取当前知识包、source、场景或快照状态;
36
+ 2. 校验输入文件、真实对象 ID、版本关系和更新基准;
37
+ 3. 先预览场景更新或执行知识包同步,再进行应用、绑定、编译或发布;
38
+ 4. 使用查询命令或状态文件验证版本、绑定关系、计划和场景状态;
39
+ 5. 只返回已验证的业务对象与状态摘要。
40
+
41
+ ## 放行与完成条件
42
+
43
+ - 知识包同步:manifest、sources 和 entries 校验通过,且同步状态文件记录成功版本;
44
+ - 场景绑定:场景与版本 ID 均来自当前查询,绑定后知识计划可查询;
45
+ - 场景更新:必须先取得最新 `updated_at`,preview 通过后才 apply;
46
+ - 场景发布:仅在业务模块的发布闸门通过后执行,发布后状态可回读;
47
+ - 只有目标对象、版本/绑定关系和最终状态均可验证时,才能报告完成。
21
48
 
22
49
  ## 推荐同步
23
50
 
@@ -91,6 +118,8 @@ soke-cli ai-training +get-plan --scenario-id scenario_micro_loan_sales --format
91
118
 
92
119
  ### 创建场景
93
120
 
121
+ `scene_lang` 是场景语言代码,合法值仅有 `zh`(简体中文)、`tw`(繁体中文)和 `en`(英文)。CLI flags 与 `--request-file` 使用同一枚举校验;不要传入 `简体中文`、`中文`、`zh-CN` 或其他值。
122
+
94
123
  如果封面图由本地智能体生成,先上传封面并拿到可写入 `scenario_cover` 的 CDN URL:
95
124
 
96
125
  ```bash
@@ -236,7 +265,22 @@ soke-cli ai-training +restore-scenario-snapshot \
236
265
 
237
266
  新增场景命令默认输出 MentorAI `BaseResponse.data`;排查错误时加 `--raw` 保留 `success/errorCode/errorMessage/details/traceId`。
238
267
 
239
- ## 注意
268
+ ## 业务产出与验证
269
+
270
+ - 知识包任务产出知识包版本、source 清单和 `.mentorai-sync-state.json`;以同步响应、版本列表和状态文件共同验证。
271
+ - 场景绑定任务产出场景与知识包版本的绑定关系及编译后的知识计划;以 `+get-plan` 回读验证。
272
+ - 场景更新任务产出新的场景配置与更新时间;以 `+get-scenario` 回读目标字段验证。
273
+ - 场景发布或恢复任务产出发布状态或恢复后的快照状态;必须回读实际场景状态,不能以命令已发出代替成功。
274
+
275
+ ## 失败与降级
276
+
277
+ - 发生 409 乐观锁冲突时,重新读取最新场景和 `updated_at`,重新生成更新请求,不复用旧基准重试。
278
+ - manifest、source 或 entries 校验失败时停止同步,不写入伪成功状态文件。
279
+ - 上传、同步、绑定、编译或发布部分成功时,保留已完成对象和失败阶段,先查询真实状态再决定是否重试。
280
+ - 认证、权限、网络和通用 CLI 错误按共享错误处理规则恢复;无法恢复时停止当前任务并报告人工处理入口。
281
+ - 失败后禁止改用伪造 `corp_id`、`user_id`、`object_key` 或未经验证的业务 API 绕过限制。
282
+
283
+ ## 业务特例
240
284
 
241
285
  - 不要在 manifest 或 entries 中伪造 `corp_id`、`user_id` 或 `object_key`。
242
286
  - `object_key` 必须使用 upload-token 返回值。
@@ -246,4 +290,10 @@ soke-cli ai-training +restore-scenario-snapshot \
246
290
  - 场景更新请求体或 query 中不要伪造 `corp_id`、`company_id`、`user_id`。
247
291
  - 场景创建请求体中的 `corp_id`、`company_id`、`user_id`、`implementation_corp_id` 会由代理剥离,不要依赖它们选择租户。
248
292
  - 场景更新前必须以 `+get-scenario` 的 `updated_at` 作为 `base_updated_at`。
249
- - 场景发布需要 `+publish-scenario --scenario-id <id>`,默认带 `version=1` 和 `version_description=CLI发布`;不要把它当作局部更新命令。
293
+ - 场景发布需要 `+publish-scenario --scenario-id <id>`,默认带 `version=1` 和 `version_description="CLI发布"`;不要把它当作局部更新命令。
294
+
295
+ ## 输出
296
+
297
+ - 返回已验证的知识包、source、版本、场景、绑定关系、知识计划或快照状态摘要。
298
+ - 仅在后续流程需要时传递真实对象 ID、版本 ID 和状态文件路径。
299
+ - 原始响应、上传签名、Token 和客户材料遵循共享输出脱敏规则,不直接回显。
@@ -7,21 +7,58 @@ tags: [soke, assign, department, user, enrollment]
7
7
 
8
8
  # 指派管理
9
9
 
10
- ## 触发描述
10
+ ## 共享前置
11
11
 
12
- 课程创建并发布后,需要将课程指派给部门或具体学员时触发本技能。支持查询组织架构、查询用户列表、创建指派记录及查看指派列表。
12
+ 开始操作前读取:
13
13
 
14
- ## 前置条件
14
+ - `../../shared/environment-check.md`
15
+ - `../../shared/auth-check.md`
16
+ - `../../shared/command-discovery.md`
17
+ - `../../shared/object-context.md`
18
+ - `../../shared/interaction.md`
19
+ - `../../shared/write-guard.md`
20
+ - `../../shared/output-policy.md`
21
+
22
+ ## 职责
23
+
24
+ 负责查询部门和用户,并为已发布的课程、考试或学习地图创建和查询指派关系;不负责资源创建、配置或发布。
25
+
26
+ ## 输入
27
+
28
+ - 已发布资源的真实 ID
29
+ - 目标部门或用户的真实 ID
30
+ - 指派资源类型、必修/选修属性和用户范围
31
+ - 用户明确的指派或查询动作
32
+
33
+ ## 流程
34
+
35
+ ```text
36
+ 确认资源已发布 → 查询部门/用户 → 确认目标范围
37
+ → 展示指派摘要并获得确认 → 创建指派 → 查询指派结果
38
+ ```
15
39
 
16
- - 目标课程 `status = 1`(已发布),未发布的课程不可指派
17
- - 具有指派权限(管理员或课程负责人)
40
+ ## 业务特例
18
41
 
19
- ## 执行流程
42
+ - 目标课程必须 `status = 1`(已发布)。
43
+ - 当前命令示例中的 `--module` 为 `course`;考试或学习地图指派须以当前 CLI 帮助和对应模块规则为准。
44
+ - 批量指派建议单次不超过 500 人,超出时分批处理。
45
+ - 取消指派不在 CLI 范围内,需通过后台操作。
46
+
47
+ ## 输出
48
+
49
+ 返回资源名称、指派类型、人数和处理状态等业务摘要;用户姓名可以展示,内部 ID 和完整响应遵循 `../../shared/output-policy.md`。
50
+
51
+ **完成判定**:指派真正创建成功,当且仅当 `assign +list`(基于资源 ID 查询)能查到对应用户的指派记录,且记录中的必修/选修标记与请求一致。仅 `assign +create` 返回成功提示、但 `+list` 查不到记录时,视为未完成,不得向用户报告“指派成功”。
52
+
53
+ ## 前置条件
54
+
55
+ - 目标资源已发布
56
+ - 具有指派权限
20
57
 
21
58
  ### 1. 查询部门 `assign +list-departments`
22
59
 
23
60
  ```bash
24
- soke assign +list-departments
61
+ soke-cli assign +list-departments
25
62
  ```
26
63
 
27
64
  返回当前租户下所有部门结构。输出格式预期为部门 ID 与名称的层级列表。
@@ -31,7 +68,7 @@ soke assign +list-departments
31
68
  ### 2. 查询用户 `assign +list-users`
32
69
 
33
70
  ```bash
34
- soke assign +list-users --department-id <departmentId>
71
+ soke-cli assign +list-users --department-id <departmentId>
35
72
  ```
36
73
 
37
74
  | 参数 | 必填 | 说明 |
@@ -43,7 +80,7 @@ soke assign +list-users --department-id <departmentId>
43
80
  ### 3. 创建指派 `assign +create`
44
81
 
45
82
  ```bash
46
- soke assign +create \
83
+ soke-cli assign +create \
47
84
  --module course \
48
85
  --module-id <courseId> \
49
86
  --compulsory <1|0> \
@@ -62,7 +99,7 @@ soke assign +create \
62
99
  ### 4. 查询指派 `assign +list`
63
100
 
64
101
  ```bash
65
- soke assign +list --module-id <courseId>
102
+ soke-cli assign +list --module-id <courseId>
66
103
  ```
67
104
 
68
105
  | 参数 | 必填 | 说明 |
@@ -94,10 +131,12 @@ soke assign +list --module-id <courseId>
94
131
  5. 批量指派建议单次 user-ids 不超过 500 人,超出分批处理
95
132
  6. 取消指派(删除指派记录)需通过后台操作,CLI 不直接支持
96
133
 
134
+ **失败降级**:若 `+create` 报“课程未发布/status 不符”或用户 ID 无效,立即停止并告知用户失败原因,不得假装成功;若批量中部分用户失败,报告成功与失败明细,不要整体宣称完成。
135
+
97
136
  ## 检查清单
98
137
 
99
138
  - [ ] 课程 status = 1(已发布确认)
100
139
  - [ ] 已通过 list-departments / list-users 确认目标用户 ID
101
140
  - [ ] compulsory 正确设定(1=必修, 0=选修)
102
141
  - [ ] user-ids 为逗号分隔的有效用户 ID 列表
103
- - [ ] 指派完成后通过 assign +list 验证结果
142
+ - [ ] 指派完成后通过 assign +list 验证结果(查不到记录=未完成)