@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
@@ -11,11 +11,51 @@ metadata:
11
11
 
12
12
  # 可练习题库交互式练习系统
13
13
 
14
- 核心链路全量分页选库随机逐题实时反馈
14
+ 通过全量分页拉取题库、随机逐题练习、实时判分和本地状态持久化,支持五种题型。本模块只负责可练习题库和答题会话,不负责考试创建、发布或成绩报表。
15
+
16
+ ## 共用前置
17
+
18
+ 开始前先读取 `../../shared/environment-check.md`、`../../shared/auth-check.md`、`../../shared/object-context.md`、`../../shared/pagination.md`、`../../shared/state-machine.md`、`../../shared/output-policy.md`、`../../shared/error-handling.md`。本模块只保留题库练习特有规则。
19
+
20
+ ## 职责
21
+
22
+ 负责可练习题库的选择、随机出题、实时判分和答题状态持久化;不负责考试创建、试卷发布或成绩报表。
23
+
24
+ ## 输入
25
+
26
+ - 可练习题库列表及题目数据。
27
+ - 用户选择的题库和题目答案。
28
+ - 本地答题状态文件(可选)。
29
+
30
+ ## 流程
31
+
32
+ 全量分页拉取题库 → 用户选择题库 → 拉取题目并加载状态 → 随机出题与判分 → 保存状态并继续、结束或重新开始。
33
+
34
+ ## 业务特例
35
+
36
+ - 跨页题库按 UUID 去重,题目数量以 `data.content` 实际返回为准。
37
+ - 支持 `fill`、`determine`、`single_choice`、`choice`、`uncertain_choice` 五种题型及各自判分规则。
38
+ - 已展示但未提交的题目不计入答题状态或本轮总结。
39
+ - 状态文件按跨平台路径规则保存,不得写死 Windows/QClaw 路径。
40
+
41
+ **失败降级**:拉题或判分时若接口返回异常/题目缺失,跳过该异常题并重新从剩余未答题池随机抽题,不要中断整轮;状态文件写入失败时,本轮仍可在内存中继续,但须明确提示用户“本次进度未能保存,退出后不保留”。已展示未提交的题不计作答、不计正确。
42
+
43
+ ## 输出
44
+
45
+ - 展示干净的题目、判分反馈、进度和本轮小结,不向用户暴露内部 UUID 或接口字段。
46
+ - 保留答题状态,供下次进入同一题库时恢复。
47
+
48
+ **完成判定**:一轮练习“完成”当且仅当本轮所有已作答题目(uuid 已写入状态文件 `answered`)的判分与进度统计与状态文件一致,且状态文件已落盘(如可用)。仅界面显示进度、但状态文件未保存成功的,视为本轮状态未完成,应提示用户状态可能未持久化。
15
49
 
16
50
  ## 交互流程总览
17
51
 
18
- 用户触发练习Step1全量分页拉取全部题库展示供选择Step2用户选择一个题库Step3拉取该题库全部题目加载答题状态Step4从未答题目中随机抽一道呈现判分Step5询问下一题结束重开循环Step4
52
+ 用户触发练习后,按以下顺序执行:
53
+
54
+ 1. 全量分页拉取题库并展示供选择。
55
+ 2. 用户选择一个题库。
56
+ 3. 拉取该题库全部题目并加载答题状态。
57
+ 4. 从未答题目中随机抽题、呈现并判分。
58
+ 5. 询问下一题、结束答题或重新开始;选择下一题时回到第 4 步。
19
59
 
20
60
  ## Step1全量分页拉取题库列表
21
61
 
@@ -47,9 +87,9 @@ soke-cli exam-question-pool +questions --pool-id UUID --format json
47
87
 
48
88
  ### 答题状态文件
49
89
 
50
- 路径C:\Users\soke\.qclaw\workspace\.exam-state\{pool-uuid}.json
90
+ 状态文件使用跨平台本地路径:优先读取运行时 workspace 配置中的 `.exam-state/{pool-uuid}.json`;未提供 workspace 配置时,使用用户主目录下的 `.soke-cli/exam-state/{pool-uuid}.json`。不要写死 Windows、QClaw 或其他平台专用路径。首次使用时创建状态目录。
51
91
 
52
- 格式pool_id uuid pool_title 题库名 total 5 correct 0 answered 空数组
92
+ 格式:`pool_id`(题库 UUID)、`pool_title`(题库名)、`total`(实际题目数)、`correct`(答对数)、`answered`(已提交题目的 UUID 数组)。
53
93
 
54
94
  文件不存在或pool_id不匹配新建answered为空数组
55
95
  答完一题追加uuid到answered正确则correct加1
@@ -118,6 +158,6 @@ questions获取题库全部题目
118
158
 
119
159
  data.content数量可能与all_count不一致过滤题以实际返回为准
120
160
  填空show_answer是string二维数组每空可能有多个可接受值
121
- 状态文件路径C:\Users\soke\.qclaw\workspace\.exam-state\uuid.json先确保目录存在
161
+ 状态文件目录必须先确保存在;路径按上面的跨平台解析规则确定,不得写死 Windows 或 QClaw 路径
122
162
  每次出题前根据当前状态重新计算未答题池保证随机性
123
163
  填空题提示示例不能泄露正确答案统一用答案1答案2答案3占位
@@ -12,18 +12,59 @@ metadata:
12
12
 
13
13
  # 学习地图管理 (soke-learning-map)
14
14
 
15
- **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../../../references/installation.md`](../../../references/installation.md),其中包含认证、配置、权限处理**
15
+ ## 共享前置
16
16
 
17
- ## 使用前提
17
+ 开始前按需读取:
18
18
 
19
- 1. 已安装 `soke-cli`
20
- 2. 已登录授权:`soke-cli auth login`
19
+ - `../../../shared/environment-check.md`
20
+ - `../../../shared/auth-check.md`
21
+ - `../../../shared/command-discovery.md`
22
+ - `../../../shared/object-context.md`
23
+ - `../../../shared/pagination.md`
24
+ - `../../../shared/interaction.md`
25
+ - `../../../shared/write-guard.md`
26
+ - `../../../shared/write-verify.md`
27
+ - `../../../shared/async-task.md`
28
+ - `../../../shared/output-policy.md`
29
+ - `../../../shared/error-handling.md`
21
30
 
22
- ```bash
23
- soke-cli auth login
24
- soke-cli config show # 验证登录状态
31
+ 本模块只保留学习地图业务规则;通用规则统一由共享层维护。
32
+
33
+ ## 职责
34
+
35
+ 负责学习地图的分类、创建、课程阶段、发布、指派衔接、详情和学习进度查询;不负责课程内容创建,也不负责统计导出任务的实现。
36
+
37
+ ## 输入
38
+
39
+ - 地图标题、地图分类和阶段配置
40
+ - 已发布且可加入地图的课程真实 ID
41
+ - 用户明确的创建、发布、查询或指派动作
42
+ - 需要跨模块衔接时的真实地图、课程、阶段和用户/部门 ID
43
+
44
+ ## 流程
45
+
46
+ ```text
47
+ 查询地图分类 → 创建学习地图 → 查询课程分类与课程
48
+ → 检查课程可用性 → 创建阶段 → 发布地图
49
+ → 可选指派 → 查询详情/进度 → 可选创建统计任务
25
50
  ```
26
51
 
52
+ 指派调用 `../soke-assign/MODULE.md`,统计导出调用 `../soke-task/MODULE.md`。
53
+
54
+ ## 业务特例
55
+
56
+ - 地图分类 UUID、课程分类 UUID、地图 UUID、阶段 UUID 和课程 UUID 不可混用。
57
+ - 创建阶段只能传入课程可用性检查返回的 `availabelIds`。
58
+ - 发布前至少需要一个有效阶段;统计导出属于独立异步任务流程。
59
+
60
+ **失败降级**:发布若报“无阶段/阶段无内容”,先确认已用 `+create-stage` 创建至少一个含课程且 `availabelIds` 内的阶段,再用 `+detail` 回读 `status`;创建阶段若传入了 `check-item-status` 未返回的 UUID,按接口错误停下并改正,不要继续发布。跨模块指派失败以 `assign` 模块的真实返回为准。
61
+
62
+ ## 输出
63
+
64
+ 返回地图、阶段、发布状态和学习进度的业务摘要;跨模块只传递 CLI 返回的真实 ID,输出边界遵循 `../../../shared/output-policy.md`。
65
+
66
+ **完成判定**:创建地图完成当且仅当返回 `map-uuid`;创建阶段完成当且仅当返回 `stage-uuid`;发布完成当且仅当 `+detail`(或 `+list-maps`)查到 `status=1`;指派完成当且仅当 `assign +list` 能查到记录。仅 CLI 回显“发布成功”但 `+detail` 仍 `status=0` 的,视为未发布。
67
+
27
68
  ---
28
69
 
29
70
  ## 端到端创建工作流
@@ -408,11 +449,10 @@ soke-cli learning-map +detail --uuid "MAP-UUID" --format json
408
449
 
409
450
  ### 调试检查清单
410
451
 
411
- ```bash
412
- # 1. 认证状态
413
- soke-cli config show
452
+ 认证状态按 `../../../shared/auth-check.md` 检查。其余检查仅验证学习地图对象和阶段数据:
414
453
 
415
- # 2. 确认地图存在
454
+ ```bash
455
+ # 1. 确认地图存在
416
456
  soke-cli learning-map +list-maps \
417
457
  --start-time 1700000000000 --end-time 1800000000000 --format json | \
418
458
  jq '.data.list[] | select(.uuid=="MAP-UUID")'
@@ -9,7 +9,50 @@ metadata:
9
9
  cliHelp: "soke-cli learning-profile --help"
10
10
  ---
11
11
 
12
- **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../soke-shared/MODULE.md`](../soke-shared/MODULE.md),其中包含认证、配置、权限处理**
12
+ ## 共享前置
13
+
14
+ 开始前按需读取:
15
+
16
+ - `../../shared/environment-check.md`
17
+ - `../../shared/auth-check.md`
18
+ - `../../shared/command-discovery.md`
19
+ - `../../shared/object-context.md`
20
+ - `../../shared/pagination.md`
21
+ - `../../shared/output-policy.md`
22
+ - `../../shared/error-handling.md`
23
+
24
+ 本模块只保留学习档案业务规则;通用规则统一由共享层维护。
25
+
26
+ ## 职责
27
+
28
+ 负责查询学员的课程学习、考试成绩、证书、学分积分和培训等综合档案;不负责修改课程、考试或证书资源。
29
+
30
+ ## 输入
31
+
32
+ - 学员或部门的真实 ID
33
+ - 新员工筛选条件和分页条件
34
+ - 用户明确的档案查询、明细查询或统计动作
35
+
36
+ ## 流程
37
+
38
+ ```text
39
+ 确认学员/部门范围 → 查询学习档案 → 按需分页拉取
40
+ → 汇总课程、考试、证书和积分字段 → 输出业务摘要
41
+ ```
42
+
43
+ ## 业务特例
44
+
45
+ - 学员使用 `dept_user_id`,部门使用 `dept_id`,两类 ID 不可混用。
46
+ - 学习时长需格式化为用户可读的小时和分钟。
47
+ - 完整 JSON 只用于内部解析,前台只展示与查询目标相关的字段。
48
+
49
+ **失败降级**:若查询返回错误或为空,先核对 `dept_user_ids`/`dept_ids` 是否来自 `contact` 模块真实返回(学习档案不支持按姓名直查),不要猜测 ID;姓名查询须先经 `contact +search-user` 获取 `dept_user_id` 再查,缺失该前置时停下来说明,不要跳过或用占位 ID。
50
+
51
+ ## 输出
52
+
53
+ 返回姓名、部门、课程完成、考试通过、证书、学习时长、学分和积分等业务摘要;输出边界遵循 `../../shared/output-policy.md`。
54
+
55
+ **完成判定**:查询“完成”当且仅当返回数据覆盖所请求的学员/部门范围,且 `dept_user_id`/`dept_id` 与请求一致、关键字段(必修/选修完成、考试通过、证书数、学分/积分)已正确聚合;结果为空时如实报告“无学习记录”,不得臆造数据。
13
56
 
14
57
  ## 核心概念
15
58
 
@@ -125,7 +168,7 @@ soke-cli learning-profile +list --dept-ids dept456,dept789
125
168
  # 查询新员工的学习档案
126
169
  soke-cli learning-profile +list --is-new 1 --page-size 50
127
170
 
128
- # 分页查询(使用 offset)
171
+ # 模块查询示例(分页参数)
129
172
  soke-cli learning-profile +list --offset 0 --page-size 10 # 第1页
130
173
  soke-cli learning-profile +list --offset 10 --page-size 10 # 第2页
131
174
  soke-cli learning-profile +list --offset 20 --page-size 10 # 第3页
@@ -196,7 +239,7 @@ soke-cli learning-profile +list --page-size 100 --format json > learning_profile
196
239
  ## 注意事项
197
240
 
198
241
  1. **时间格式**: `learn_time`, `class_length` 等时长字段单位为秒,表格输出时会自动格式化为"X小时Y分钟"
199
- 2. **分页**: 使用 `offset` 和 `page_size` 进行分页,默认每页10条,最大100条
242
+ 2. 该接口的分页参数为 `offset` 和 `page_size`,默认每页10条、最大100条;全量查询和去重规则以 `../../shared/pagination.md` 为准。
200
243
  3. **数组参数**: `dept_user_ids` 和 `dept_ids` 是数组类型,多个ID用逗号分隔
201
244
  4. **姓名查询**: 学习档案接口不支持按姓名查询,需要先通过 `contact +search-user` 获取 dept_user_id
202
245
  5. **权限**: 需要 `learningProfile:readonly` 权限,如遇权限错误参考 soke-shared
@@ -7,9 +7,27 @@ tags: [soke, lesson, courseware, chapter, video, audio, document]
7
7
 
8
8
  # 课件管理
9
9
 
10
- ## 触发描述
10
+ ## 共享前置
11
11
 
12
- 用户已有课程(course)且完成素材上传后,需要将素材添加为课程的章节课件时触发本技能。支持创建课件、列表查询、详情查询和排序,仅支持 `video | audio | document` 三种类型的课件。
12
+ 开始前按需读取:
13
+
14
+ - `../../shared/environment-check.md`
15
+ - `../../shared/auth-check.md`
16
+ - `../../shared/object-context.md`
17
+ - `../../shared/write-verify.md`
18
+ - `../../shared/output-policy.md`
19
+
20
+ 本模块只保留课件业务规则;通用认证、对象 ID、写后验证和输出脱敏不在此重复定义。
21
+
22
+ ## 职责
23
+
24
+ 本模块负责将已上传素材创建为课程课件,并提供课件查询、详情和排序;不负责素材上传或课程发布。
25
+
26
+ ## 输入
27
+
28
+ - 已存在的目标课程真实 ID
29
+ - `soke-material` 返回的完整素材对象
30
+ - 课件标题和可选学习时长
13
31
 
14
32
  ## 输入要求
15
33
 
@@ -31,12 +49,12 @@ tags: [soke, lesson, courseware, chapter, video, audio, document]
31
49
 
32
50
  > ⚠️ `uuid` `filename` `type` `ext` `filesize` `object` 六个字段必须严格从素材上传返回结果中取值,不可自行构造或编造。
33
51
 
34
- ## 执行流程
52
+ ## 流程
35
53
 
36
54
  ### 1. 创建课件 `course +lesson-create`
37
55
 
38
56
  ```bash
39
- soke course +lesson-create \
57
+ soke-cli course +lesson-create \
40
58
  --course-id <courseId> \
41
59
  --title "<课件标题>" \
42
60
  --type <video|audio|document> \
@@ -65,7 +83,7 @@ soke course +lesson-create \
65
83
  ### 2. 课件列表 `course +lesson-list`
66
84
 
67
85
  ```bash
68
- soke course +lesson-list --course-id <courseId>
86
+ soke-cli course +lesson-list --course-id <courseId>
69
87
  ```
70
88
 
71
89
  返回指定课程下所有课件的列表,包含课件 ID、标题、类型、排序序号。
@@ -73,7 +91,7 @@ soke course +lesson-list --course-id <courseId>
73
91
  ### 3. 课件详情 `course +lesson-get`
74
92
 
75
93
  ```bash
76
- soke course +lesson-get --lesson-id <lessonId>
94
+ soke-cli course +lesson-get --lesson-id <lessonId>
77
95
  ```
78
96
 
79
97
  返回单个课件的完整信息(标题、类型、素材引用、时长、转码状态等)。
@@ -81,25 +99,19 @@ soke course +lesson-get --lesson-id <lessonId>
81
99
  ### 4. 课件排序 `course +lesson-sort`
82
100
 
83
101
  ```bash
84
- soke course +lesson-sort --course-id <courseId> --order "<lessonId1>,<lessonId2>,<lessonId3>"
102
+ soke-cli course +lesson-sort --course-id <courseId> --order "<lessonId1>,<lessonId2>,<lessonId3>"
85
103
  ```
86
104
 
87
105
  调整课程内课件的展示顺序,`--order` 为逗号分隔的课件 ID 列表,按先后顺序排列。
88
106
 
89
- ## 输出标准
107
+ ## 输出
90
108
 
91
- 创建课件成功后输出摘要:
109
+ - 创建课件成功后输出课程、课件标题、类型、时长和处理状态等业务摘要。
110
+ - 课件 ID 只在后续排序或查询确实需要时传递。
111
+ - 排序完成后输出更新后的课件列表。
112
+ - 输出边界遵循 `../../shared/output-policy.md`。
92
113
 
93
- ```
94
- ✅ 课件创建成功
95
- - 课程: {courseTitle} (ID: {courseId})
96
- - 课件: {title}
97
- - 类型: {type}
98
- - 时长: {duration}s
99
- - 课件 ID: {lessonId}
100
- ```
101
-
102
- 排序完成后输出更新后的课件列表。
114
+ **完成判定**:课件创建完成当且仅当 `course +lesson-list` 能查到该课件(标题、类型与素材 `uuid` 对应);排序完成当且仅当 `course +lesson-list` 返回顺序与请求的 `--order` 一致。仅 `+lesson-create` 回显成功、但 `+lesson-list` 查不到的,视为未完成。
103
115
 
104
116
  ## 注意事项
105
117
 
@@ -109,6 +121,8 @@ soke course +lesson-sort --course-id <courseId> --order "<lessonId1>,<lessonId2>
109
121
  4. 排序使用课件 ID 列表,未在列表中的课件保持在末尾,不丢失
110
122
  5. 课件删除、批量导入等操作不在 CLI 范围,如有需求引导至后台操作
111
123
 
124
+ **失败降级**:若 `+lesson-create` 报素材 `uuid`/`object` 无效或类型非 video/audio/document,立即停下并说明原因,不得用占位或编造的素材字段继续;创建后务必用 `course +lesson-list` 回读确认课件已存在,查不到则视为未创建成功。
125
+
112
126
  ## 检查清单
113
127
 
114
128
  - [ ] 素材已完成上传,持有完整返回对象
@@ -116,4 +130,4 @@ soke course +lesson-sort --course-id <courseId> --order "<lessonId1>,<lessonId2>
116
130
  - [ ] type 仅限 video / audio / document
117
131
  - [ ] uuid / filename / type / ext / filesize / object 六个字段均来自上传返回
118
132
  - [ ] duration 已按类型默认规则或用户指定设定
119
- - [ ] 课件创建完成后能通过 lesson-list 验证
133
+ - [ ] 课件创建完成后通过 course +lesson-list 回读验证(查不到=未完成)
@@ -7,15 +7,29 @@ tags: [soke, material, upload, video, audio, document]
7
7
 
8
8
  # 素材库管理
9
9
 
10
- ## 触发描述
10
+ ## 共享前置
11
11
 
12
- 用户需要上传课程素材(视频、音频、文档)到素材库,或从已有素材库中选择素材时触发本技能。
12
+ 开始前按需读取:
13
13
 
14
- 本技能支持两条路径:
15
- - **本地上传**:上传本地文件到素材库,返回标准资产信息
16
- - **素材库选择**:从已有素材库中搜索、浏览、选择已上传的素材
14
+ - `../../shared/environment-check.md`
15
+ - `../../shared/auth-check.md`
16
+ - `../../shared/file-input.md`
17
+ - `../../shared/object-context.md`
18
+ - `../../shared/write-verify.md`
19
+ - `../../shared/output-policy.md`
17
20
 
18
- ## 输入要求
21
+ 本模块只保留素材业务规则;通用认证、文件校验、对象 ID、写后验证和输出脱敏不在此重复定义。
22
+
23
+ ## 职责
24
+
25
+ 本模块负责视频、音频和文档素材的上传、查询与选择,不负责课程章节创建或课程发布。
26
+
27
+ ## 输入
28
+
29
+ - 本地上传:绝对文件路径。
30
+ - 素材库选择:用户明确选择的素材。
31
+
32
+ ### 输入要求
19
33
 
20
34
  **本地上传:**
21
35
  - **文件路径**:本地文件的绝对路径
@@ -31,7 +45,7 @@ tags: [soke, material, upload, video, audio, document]
31
45
  - 由调度方(soke-course)通过弹窗选定素材
32
46
  - 素材库中的文件已是上传态,直接返回复用即可
33
47
 
34
- ## 执行流程
48
+ ## 流程
35
49
 
36
50
  ### 第一步:确认文件有效性
37
51
 
@@ -44,7 +58,7 @@ tags: [soke, material, upload, video, audio, document]
44
58
  使用 CLI 命令上传素材:
45
59
 
46
60
  ```bash
47
- soke file +upload --path "/absolute/path/to/file"
61
+ soke-cli file +upload --path "/absolute/path/to/file"
48
62
  ```
49
63
 
50
64
  ### 第三步:解析返回结果
@@ -74,19 +88,19 @@ soke file +upload --path "/absolute/path/to/file"
74
88
 
75
89
  > 视频和音频实际时长以文件元数据为准;文档类不计时可设 0。
76
90
 
77
- ## 输出标准
91
+ ## 业务特例
78
92
 
79
- 完成上传后向用户输出摘要:
93
+ - 仅支持视频、音频和文档,不支持图片作为课程素材。
94
+ - 上传结果中的 `uuid`、`object` 等字段是后续课件创建的真实输入,不得手动构造。
95
+ - 视频、音频和文档的默认时长规则以本模块为准。
80
96
 
81
- ```
82
- ✅ 素材上传成功
83
- - 文件名: {filename}
84
- - 类型: {type}
85
- - 大小: {filesize} bytes
86
- - UUID: {uuid}
87
- ```
97
+ **失败降级**:上传若报格式不支持、文件不存在或存储失败,立即停止并说明原因,不进入课件创建;返回对象缺 `uuid`/`object` 时视为不可用,提示用户重试上传,不得凭记忆或占位值向下游(soke-lesson)传递。
98
+
99
+ ## 输出
100
+
101
+ 完成上传或选择后,返回标准素材对象供后续课件流程使用;用户侧摘要遵循共享输出脱敏规则。
88
102
 
89
- 可将完整返回对象缓存在上下文中,供后续 `soke-lesson` 创建课件时直接引用。
103
+ **完成判定**:上传“完成”当且仅当返回对象同时包含 `uuid`、`filename`、`type`、`ext`、`filesize`、`object` 六个字段且 `uuid` 非空。缺字段(尤其是 `uuid`/`object`)即视为上传未成功,不得把“已调用命令”当作“素材可用”,也不得手动补齐缺失字段。
90
104
 
91
105
  ## 注意事项
92
106
 
@@ -102,4 +116,4 @@ soke file +upload --path "/absolute/path/to/file"
102
116
  - [ ] 扩展名在 `.mp4|.avi|.mov|.mp3|.wav|.pdf|.ppt|.pptx|.doc|.docx` 中
103
117
  - [ ] 上传完成,获取到完整返回对象(uuid / filename / type / ext / filesize / object)
104
118
  - [ ] 默认时长按类型正确设定
105
- - [ ] 返回数据完整传递给后续课件创建流程
119
+ - [ ] 返回对象含完整 uuid/object 等六字段,完整传递给后续课件创建流程(缺 uuid=未完成)
@@ -11,17 +11,38 @@ metadata:
11
11
 
12
12
  # 图片库管理 (soke-photo-gallery)
13
13
 
14
- **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../soke-shared/MODULE.md`](../soke-shared/MODULE.md),其中包含认证、配置、权限处理**
14
+ ## 共用前置
15
15
 
16
- ## 使用前提
16
+ 开始前读取 `../../shared/README.md`,并按需加载其中的环境检测、登录验证、文件输入、对象上下文、分页、写后验证和错误处理规则。本模块只保留图片库特有规则。
17
17
 
18
- 1. 已安装 `soke-cli`
19
- 2. 已登录授权: `soke-cli auth login`
18
+ ## 职责
20
19
 
21
- ```bash
22
- soke-cli auth login
23
- soke-cli config show # 验证登录状态
24
- ```
20
+ 负责图片分类查询、图片上传、图片列表与详情查询及批量删除;不负责课程素材上传、课件创建或 AI 场景封面流程。
21
+
22
+ ## 输入
23
+
24
+ - 本地图片文件路径、图片标题和可选分类 ID。
25
+ - 通过 CLI 查询获得的分类 ID、图片 UUID。
26
+ - 用户明确的删除目标和操作确认。
27
+
28
+ ## 流程
29
+
30
+ 查询分类(可选) → 上传图片(本地文件到 OSS,再创建图片库记录) → 查询列表验证 → 查询详情获取 URL → 按需批量删除。
31
+
32
+ ## 业务特例
33
+
34
+ - 仅支持 jpg、jpeg、png,单张最大 5 MB。
35
+ - 上传是 OSS 上传和图片库登记两步操作,两步都成功才算完成。
36
+ - 删除不可恢复,图片 UUID 必须来自 CLI 返回结果并经过用户确认。
37
+
38
+ **失败降级**:上传是 OSS 与图片库登记两步,若 OSS 成功但登记失败,图片不会出现在 `+list`,视为未完成——应回读 `+list`/`+get` 确认 `uuid` 存在后再向用户报成功;删除前必须基于 `+list` 拿到的真实 `uuid` 并经用户确认,删除后仍用 `+list` 回读确认已消失。
39
+
40
+ ## 输出
41
+
42
+ - 返回图片上传、列表、详情或删除的业务摘要。
43
+ - 图片 URL 仅在用户需要访问地址时展示;内部响应和敏感信息遵循共享输出规则。
44
+
45
+ **完成判定**:上传完成当且仅当 `+list`(或 `+get`)能查到该图片且返回 `uuid` 与非空 `photoUri`;删除完成当且仅当 `+list` 中对应 `uuid` 不再出现。两步上传(OSS+登记)任一步失败、或 `+list` 查不到新图片的,视为未完成。
25
46
 
26
47
  ## 核心概念
27
48
 
@@ -36,8 +57,8 @@ soke-cli config show # 验证登录状态
36
57
  │ 1. (可选) 查询分类 → 获取 category-id │
37
58
  │ 2. 上传图片 → 本地文件 → OSS → 图片库记录 │
38
59
  │ 3. 查询图片列表 → 验证上传结果 │
39
- 3.1 查询图片详情 → 获取单张图片完整 URL │
40
- 4. (可选) 批量删除 → 清理图片 │
60
+ 4. 查询图片详情 → 获取单张图片完整 URL │
61
+ 5. (可选) 批量删除 → 清理图片 │
41
62
  └──────────────────────────────────────────────────────────────┘
42
63
  ```
43
64
 
@@ -120,7 +141,7 @@ soke-cli photo-gallery +list --category-id "CATEGORY-UUID"
120
141
  # 按文件名关键词搜索
121
142
  soke-cli photo-gallery +list --file-keyword "banner"
122
143
 
123
- # 分页
144
+ # 图片列表分页参数
124
145
  soke-cli photo-gallery +list --page 1 --limit 20
125
146
 
126
147
  # JSON 输出
@@ -145,7 +166,7 @@ soke-cli photo-gallery +list --format json
145
166
 
146
167
  ---
147
168
 
148
- ## 步骤3.1: 获取图片详情
169
+ ## 步骤4: 获取图片详情
149
170
 
150
171
  ```bash
151
172
  # 获取单张图片详情(含完整访问 URL)
@@ -167,7 +188,7 @@ soke-cli photo-gallery +get --uuid "IMAGE-UUID" --format json
167
188
 
168
189
  ---
169
190
 
170
- ## 步骤4: 批量删除图片(可选)
191
+ ## 步骤5: 批量删除图片(可选)
171
192
 
172
193
  ```bash
173
194
  # 删除单张图片
@@ -217,7 +238,7 @@ echo "图片UUID: $IMAGE_UUID"
217
238
  # === 3. 验证上传结果 ===
218
239
  soke-cli photo-gallery +list --file-keyword "logo" --format json
219
240
 
220
- # === 3.1 获取图片详情和访问 URL ===
241
+ # === 4. 获取图片详情和访问 URL ===
221
242
  soke-cli photo-gallery +get --uuid "$IMAGE_UUID" --format json
222
243
 
223
244
  # === 4. 批量上传 ===
@@ -228,7 +249,7 @@ for img in banner.jpg logo.png icon.png; do
228
249
  --category-id "CATEGORY-UUID"
229
250
  done
230
251
 
231
- # === 5. 清理不需要的图片 ===
252
+ # === 6. 清理不需要的图片 ===
232
253
  soke-cli photo-gallery +batch-delete --uuids "$IMAGE_UUID"
233
254
  ```
234
255
 
@@ -260,11 +281,10 @@ soke-cli photo-gallery +batch-delete --uuids "$IMAGE_UUID"
260
281
 
261
282
  ### 调试检查清单
262
283
 
263
- ```bash
264
- # 1. 确认登录状态
265
- soke-cli config show
284
+ 登录状态按 `../../shared/auth-check.md` 检查。以下命令仅用于确认图片库记录:
266
285
 
267
- # 2. 查询图片列表确认上传成功
286
+ ```bash
287
+ # 1. 查询图片列表确认上传成功
268
288
  soke-cli photo-gallery +list --format json | jq '.data.list[0]'
269
289
 
270
290
  # 3. 始终使用 --format json 获取结构化输出
@@ -283,4 +303,4 @@ soke-cli photo-gallery +list --format json
283
303
 
284
304
  ## 相关文档
285
305
 
286
- - [`../soke-shared/MODULE.md`](../soke-shared/MODULE.md) — 认证、配置、权限
306
+ - [`../../shared/README.md`](../../shared/README.md) — 认证、配置、权限等共享规则
@@ -7,6 +7,15 @@ description: "授客CLI共享基础:应用配置初始化、认证登录(aut
7
7
 
8
8
  # soke-cli 共享规则
9
9
 
10
+ 本目录的共享能力已统一归档到 Mono 包的 `../../shared/`。本兼容入口仅保留历史说明,不新增业务规则。
11
+
12
+ 开始操作前读取:
13
+
14
+ - `../../shared/README.md`
15
+ - `../../shared/environment-check.md`
16
+ - `../../shared/auth-check.md`
17
+ - `../../shared/cli-basics.md`
18
+
10
19
  本技能指导你如何通过soke-cli操作授客AI资源,以及有哪些注意事项。
11
20
 
12
21
  ## 配置初始化
@@ -11,7 +11,38 @@ metadata:
11
11
 
12
12
  # AI 督导模块 (supervisor)
13
13
 
14
- **CRITICAL — 开始前 MUST 先读取 [`../soke-shared/MODULE.md`](../soke-shared/MODULE.md),其中包含认证、配置、权限处理。**
14
+ ## 共用前置
15
+
16
+ 开始前先读取 `../../shared/README.md`,并按需加载其中的环境检测、登录验证、对象上下文、分页、交互、写入守卫、写后验证和错误处理规则。本模块只保留督导业务特有规则。
17
+
18
+ ## 职责
19
+
20
+ 负责 AI 督导场景的创建、评分标准配置、用户或部门指派、发布、详情查询及关闭前资源检查;不负责 AI 陪练、知识包同步或普通课程发布。
21
+
22
+ ## 输入
23
+
24
+ - 督导场景名称、描述、关键检查点和状态。
25
+ - 通过 CLI 查询获得的场景 ID、评分模板 ID、部门 ID 和用户 ID。
26
+ - 用户明确的指派、发布或关闭意图。
27
+
28
+ ## 流程
29
+
30
+ 推荐顺序为:创建草稿 → 查询评分模板 → 更新评分配置 → 指派前查重 → 查询部门/成员 → 指派 → 发布并回读;关闭前必须先执行资源检查。
31
+
32
+ ## 业务特例
33
+
34
+ - `template_id` 和 `dimensions[]` 必须来自评分标准模板查询结果。
35
+ - 关闭前仅当 `data.can_operate=true` 时允许关闭;否则根据阻塞信息处理关联资源。
36
+ - `corp_id` 仅在当前 CLI `--help` 明确要求且通过配置或查询获得时传入,不得编造。
37
+
38
+ **失败降级**:发布/指派/关闭等写操作若返回业务错误或回读状态不符,立即停止并说明原因,不要假设成功;关闭被 `+check-resource` 判定 `can_operate=false` 时,绝不强行关闭,应先处理 `block_message`/`bind_maps` 中的阻塞资源;`template_id`/`dimensions` 必须来自评分标准查询,缺失时停下重新查询,不得编造。
39
+
40
+ ## 输出
41
+
42
+ - 返回场景、评分配置、指派、发布或关闭检查的业务摘要。
43
+ - 发布后回读 `status`、`status_text` 和评分配置;不回显敏感凭证或无关原始响应。
44
+
45
+ **完成判定**:创建草稿完成当且仅当返回 `data.id`;指派完成当且仅当 `+list-assigns` 能查到对应 `target_id`/`assign_type`;发布完成当且仅当 `+get-scenario` 回读到预期 `status` 与 `scoring_criteria_config`;关闭完成当且仅当 `+check-resource` 先返回 `can_operate=true` 且 `+close-scenario` 成功。仅凭“执行成功”提示但回读状态不符的,视为未完成。
15
46
 
16
47
  ## 核心概念
17
48
 
@@ -11,7 +11,54 @@ metadata:
11
11
 
12
12
  # 异步任务管理 (soke-task)
13
13
 
14
- **CRITICAL — 开始前 MUST 先读取 [`../soke-shared/MODULE.md`](../soke-shared/MODULE.md),其中包含认证、配置和权限处理。**
14
+ ## 共享前置
15
+
16
+ 开始前按需读取:
17
+
18
+ - `../../shared/environment-check.md`
19
+ - `../../shared/auth-check.md`
20
+ - `../../shared/command-discovery.md`
21
+ - `../../shared/object-context.md`
22
+ - `../../shared/pagination.md`
23
+ - `../../shared/async-task.md`
24
+ - `../../shared/write-verify.md`
25
+ - `../../shared/output-policy.md`
26
+ - `../../shared/error-handling.md`
27
+
28
+ 本模块只保留异步统计任务的业务规则;通用任务状态、轮询、对象 ID 和输出规范统一由共享层维护。
29
+
30
+ ## 职责
31
+
32
+ 负责学习地图和课程学员统计任务的创建、状态查询和导出文件获取;不负责普通列表查询或课程/地图业务对象创建。
33
+
34
+ ## 输入
35
+
36
+ - 统计任务类型和目标资源真实 ID
37
+ - `learningMapUser` 或 `courseUser` 模块类型
38
+ - 部门、用户、学习状态和自定义字段筛选条件
39
+ - 用户明确的导出或统计生成动作
40
+
41
+ ## 流程
42
+
43
+ ```text
44
+ 确认目标资源 → 创建统计任务 → 保存 task ID
45
+ → 按 action 判断状态字段 → 轮询任务
46
+ → 获取报表地址或统计结果
47
+ ```
48
+
49
+ ## 业务特例
50
+
51
+ - `learningMapUser` 的 `target-id` 是学习地图 ID,`courseUser` 的 `target-id` 是课程 ID。
52
+ - `action=export` 查看 `data.export_status`,`action=report` 查看 `data.status`。
53
+ - 导出文件只有在任务完成且 `filePath` 非空时才可返回。
54
+
55
+ **失败降级**:创建若返回空 `data.id`,视为任务未创建,停下重试;导出查询若 `filePath` 为空,说明任务仍在进行或失败,应轮询 `task +get` 而非断言已导出;`--target-id` 与 `--module` 不匹配(地图用 `learningMapUser`、课程用 `courseUser`)会导致失败,应先确认目标资源类型再提交。
56
+
57
+ ## 输出
58
+
59
+ 返回任务状态、统计结果或导出文件名与地址等业务摘要;任务 ID 和完整响应按需保留,输出边界遵循 `../../shared/output-policy.md`。
60
+
61
+ **完成判定**:任务创建完成当且仅当返回 `data.id`;`action=export` 导出完成当且仅当 `task +get` 查到 `data.export_status` 为完成态且 `data.filePath` 非空;`action=report` 统计完成当且仅当 `data.status` 为完成态。仅创建返回 ID、但后续 `+get` 始终 `filePath` 为空或状态未完成的,视为任务未产出结果,应继续轮询或报告未完成。
15
62
 
16
63
  ## 核心规则
17
64