@sokeai/cli 1.0.79 → 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 (128) 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 +1 -1
  14. package/skills/mono/references/modules/soke-ai-coach-director/coaching/prompt-optimizer/prompt-optimizer.md +3 -3
  15. package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/README.md +4 -2
  16. package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/qclaw.md +3 -1
  17. package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/{wukong.md → qwen.md} +18 -18
  18. package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/workbuddy.md +1 -1
  19. package/skills/mono/references/modules/soke-ai-coach-director/platform/api-fallback.md +1 -1
  20. package/skills/mono/references/modules/soke-ai-coach-director/platform/interaction.md +1 -1
  21. package/skills/mono/references/modules/soke-ai-coach-director/platform/platform-support-matrix.md +28 -0
  22. package/skills/mono/references/modules/soke-ai-coach-director/platform/soke-ai-training/soke-ai-training.md +5 -3
  23. package/skills/mono/references/modules/soke-ai-coach-director/platform/sync-engine.md +2 -2
  24. package/skills/mono/references/modules/soke-ai-coach-director/references/env-check.md +3 -0
  25. package/skills/mono/references/modules/soke-ai-coach-director/references/exec-handbook.md +2 -2
  26. package/skills/mono/references/modules/soke-ai-coach-director/references/subs/publish/SOP.md +3 -3
  27. package/skills/mono/references/modules/soke-ai-training/MODULE.md +55 -7
  28. package/skills/mono/references/modules/soke-assign/MODULE.md +50 -11
  29. package/skills/mono/references/modules/soke-certificate/MODULE.md +47 -1
  30. package/skills/mono/references/modules/soke-course/CHANGELOG.md +93 -0
  31. package/skills/mono/references/modules/soke-course/MODULE.md +110 -352
  32. package/skills/mono/references/modules/soke-course/README.md +45 -291
  33. package/skills/mono/references/modules/soke-course/cli-facts.md +107 -0
  34. package/skills/mono/references/modules/soke-course/intent-cases.md +41 -0
  35. package/skills/mono/references/modules/soke-course/scripts/check_readiness.sh +45 -0
  36. package/skills/mono/references/modules/soke-course/sop-publish-check.md +46 -0
  37. package/skills/mono/references/modules/soke-course/subs/assign/SOP.md +40 -0
  38. package/skills/mono/references/modules/soke-course/subs/batch/SOP.md +96 -0
  39. package/skills/mono/references/modules/soke-course/{references/subs → subs}/category/SOP.md +18 -27
  40. package/skills/mono/references/modules/soke-course/subs/charge/SOP.md +22 -0
  41. package/skills/mono/references/modules/soke-course/subs/copy/SOP.md +35 -0
  42. package/skills/mono/references/modules/soke-course/subs/exam/SOP.md +39 -0
  43. package/skills/mono/references/modules/soke-course/subs/phase1-create/SOP.md +66 -0
  44. package/skills/mono/references/modules/soke-course/subs/phase2-lesson/SOP.md +34 -0
  45. package/skills/mono/references/modules/soke-course/subs/photo/SOP.md +26 -0
  46. package/skills/mono/references/modules/soke-course/subs/publish/SOP.md +26 -0
  47. package/skills/mono/references/modules/soke-course/subs/query/SOP.md +36 -0
  48. package/skills/mono/references/modules/soke-course/{references/subs → subs}/settings/SOP.md +3 -4
  49. package/skills/mono/references/modules/soke-course/subs/template/SOP.md +58 -0
  50. package/skills/mono/references/modules/soke-exam/MODULE.md +49 -1
  51. package/skills/mono/references/modules/soke-exam-question-pool/MODULE.md +45 -5
  52. package/skills/mono/references/modules/soke-learning-map/MODULE.md +51 -11
  53. package/skills/mono/references/modules/soke-learning-profile/MODULE.md +46 -3
  54. package/skills/mono/references/modules/soke-lesson/MODULE.md +34 -20
  55. package/skills/mono/references/modules/soke-material/MODULE.md +33 -19
  56. package/skills/mono/references/modules/soke-photo-gallery/MODULE.md +40 -20
  57. package/skills/mono/references/modules/soke-shared/MODULE.md +9 -0
  58. package/skills/mono/references/modules/soke-supervisor/MODULE.md +32 -1
  59. package/skills/mono/references/modules/soke-task/MODULE.md +48 -1
  60. package/skills/mono/references/modules/soke-training-demand/MODULE.md +38 -17
  61. package/skills/mono/references/shared/README.md +50 -0
  62. package/skills/mono/references/shared/async-task.md +30 -0
  63. package/skills/mono/references/shared/auth-check.md +57 -0
  64. package/skills/mono/references/shared/command-discovery.md +34 -0
  65. package/skills/mono/references/shared/environment-check.md +31 -0
  66. package/skills/mono/references/shared/error-handling.md +27 -0
  67. package/skills/mono/references/shared/file-input.md +31 -0
  68. package/skills/mono/references/shared/interaction.md +39 -0
  69. package/skills/mono/references/shared/object-context.md +51 -0
  70. package/skills/mono/references/shared/output-policy.md +39 -0
  71. package/skills/mono/references/shared/pagination.md +41 -0
  72. package/skills/mono/references/shared/rule-ownership.md +57 -0
  73. package/skills/mono/references/shared/state-machine.md +35 -0
  74. package/skills/mono/references/shared/write-guard.md +34 -0
  75. package/skills/mono/references/shared/write-verify.md +33 -0
  76. package/skills/mono/references/workflows/README.md +115 -0
  77. package/skills/mono/scripts/check_package.py +310 -0
  78. package/skills/mono/scripts/check_readiness.py +1 -1
  79. package/skills/mono/scripts/check_syntax.py +35 -0
  80. 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
  81. package/skills/multi/soke-course/.skill-metadata.yaml +40 -0
  82. package/skills/multi/soke-course/CHANGELOG.md +77 -0
  83. package/skills/multi/soke-course/README.md +27 -274
  84. package/skills/multi/soke-course/SKILL.md +135 -353
  85. package/skills/multi/soke-course/_user_meta.json +5 -0
  86. package/skills/multi/soke-course/agents/openai.yaml +1 -5
  87. package/skills/multi/soke-course/references/cli-facts.md +105 -0
  88. package/skills/multi/soke-course/references/examples.md +30 -454
  89. package/skills/multi/soke-course/references/intent-cases.md +65 -99
  90. package/skills/multi/soke-course/references/sop-full-workflow.md +81 -177
  91. package/skills/multi/soke-course/references/sop-lesson-types.md +21 -58
  92. package/skills/multi/soke-course/references/sop-publish-check.md +14 -71
  93. package/skills/multi/soke-course/references/subs/assign/SOP.md +37 -0
  94. package/skills/multi/soke-course/references/subs/category/SOP.md +18 -27
  95. package/skills/multi/soke-course/references/subs/exam/SOP.md +28 -0
  96. package/skills/multi/soke-course/references/subs/lesson/SOP.md +28 -0
  97. package/skills/multi/soke-course/references/subs/material/SOP.md +24 -0
  98. package/skills/multi/soke-course/references/subs/photo/SOP.md +23 -0
  99. package/skills/multi/soke-course/references/subs/publish/SOP.md +15 -157
  100. package/skills/multi/soke-course/references/subs/query/SOP.md +22 -151
  101. package/skills/multi/soke-course/references/subs/settings/SOP.md +3 -4
  102. package/skills/multi/soke-course/references/subs/template/SOP.md +37 -210
  103. package/skills/multi/soke-course/references/troubleshoot.md +37 -54
  104. package/skills/multi/soke-course/scripts/check_readiness.sh +45 -0
  105. package/skills/multi/soke-course/{references/installation.md → soke-cli-install-guide.md} +3 -0
  106. package/skills/mono/references/modules/soke-course/agents/openai.yaml +0 -7
  107. package/skills/mono/references/modules/soke-course/references/course-list-courses.md +0 -216
  108. package/skills/mono/references/modules/soke-course/references/examples.md +0 -480
  109. package/skills/mono/references/modules/soke-course/references/intent-cases.md +0 -99
  110. package/skills/mono/references/modules/soke-course/references/sop-full-workflow.md +0 -177
  111. package/skills/mono/references/modules/soke-course/references/sop-lesson-types.md +0 -66
  112. package/skills/mono/references/modules/soke-course/references/sop-publish-check.md +0 -76
  113. package/skills/mono/references/modules/soke-course/references/subs/ai/SOP.md +0 -153
  114. package/skills/mono/references/modules/soke-course/references/subs/charge/SOP.md +0 -107
  115. package/skills/mono/references/modules/soke-course/references/subs/copy/SOP.md +0 -80
  116. package/skills/mono/references/modules/soke-course/references/subs/publish/SOP.md +0 -168
  117. package/skills/mono/references/modules/soke-course/references/subs/query/SOP.md +0 -165
  118. package/skills/mono/references/modules/soke-course/references/subs/template/SOP.md +0 -223
  119. package/skills/mono/references/modules/soke-course/references/troubleshoot.md +0 -68
  120. package/skills/multi/soke-course/examples/create-basic.md +0 -70
  121. package/skills/multi/soke-course/references/course-list-courses.md +0 -216
  122. package/skills/multi/soke-course/references/dependencies/soke-assign.md +0 -103
  123. package/skills/multi/soke-course/references/dependencies/soke-lesson.md +0 -119
  124. package/skills/multi/soke-course/references/dependencies/soke-material.md +0 -105
  125. package/skills/multi/soke-course/references/shared.md +0 -185
  126. package/skills/multi/soke-course/references/subs/ai/SOP.md +0 -153
  127. package/skills/multi/soke-course/scripts/check_readiness.py +0 -87
  128. /package/skills/mono/references/{installation.md → shared/installation.md} +0 -0
@@ -0,0 +1,96 @@
1
+ # 多课程(批量)上传子 SOP
2
+
3
+ > 触发:Step 1.0 选「批量生成课程」进入本流程。本 SOP 只负责批量路径;单课程路径见 MODULE.md 主流程与对应 subs。参数以 `../../cli-facts.md` 为准。
4
+
5
+ ## 触发描述
6
+
7
+ 用户一次要创建/上传多门课程(给定一个目录,或明确要求批量)时触发。
8
+
9
+ ## 流程(B0-B7)
10
+
11
+ ### B0 模式
12
+
13
+ Step 1.0 判定为批量模式后进入本流程。**一次性收集分类(B)、模板(C)编码和本地课程目录绝对路径;不要求单独课程标题。**
14
+
15
+ ### B1 首轮收集(B + C + 目录路径,一次出)
16
+
17
+ - 单条收集消息同时输出三部分:**B 课程分类**(真实分类表格)、**C 课程模板**(模板表格)、**目录路径输入框**。
18
+ - C 模板表字段固定为「模板名称|适用场景|高级设置|小测验」,批量模式下「小测验」统一显示「不加(批量模式固定)」。
19
+ - 模板高级设置映射对每门课生效,不触发小测验流程。
20
+ - 允许用户一次回复「B 编码 + C 编码 + 目录绝对路径」,也允许分多次补充;三者齐备后才进入 B2 目录扫描。
21
+
22
+ ### B2 目录扫描(只访问二级路径)
23
+
24
+ - 一级是文件夹 → 课程名=文件夹名;课件=文件夹内(二级)支持的文件,更深层不访问;
25
+ - 一级是文件 → 课程名=文件名(去扩展名);课件=该文件;
26
+ - 支持扩展名:视频/音频/文档/图片;不支持文件跳过并备注;
27
+ - 忽略隐藏文件、符号链接;扩展名大小写不敏感;空目录、无支持课件、无权限或同名冲突必须先提示,不直接执行。
28
+
29
+ ### B3 计划确认(必须弹窗)
30
+
31
+ - 先展示批量计划表(课程名|课件数|课件列表)。
32
+ - 再使用原生二选一弹窗询问「确认批量上传」或「返回修改计划」。
33
+ - **只有用户选择「确认批量上传」后**,才开始执行创建课程与上传课件。
34
+
35
+ ### B4 逐课执行(固定无小测验)
36
+
37
+ 每门课按顺序执行:
38
+
39
+ 1. `course +create`(真实分类 ID)
40
+ 2. 逐文件 `file +upload`
41
+ 3. `course +lesson-create`(六字段原样传递)
42
+ 4. `course +advanced` 模板映射
43
+
44
+ **不创建、不导入、不询问小测验。**
45
+
46
+ 失败隔离:
47
+
48
+ - 单门课程创建、上传、建课件或设置失败:标记失败并停止该门,保留已产生的 ID;批量中的其他课程继续执行。
49
+ - 命令超时或响应丢失:先按标题、文件特征和已知 ID 回查,确认未成功前不得重试写操作。
50
+ - 每门课、每个文件分别记录状态并逐课输出进度。
51
+
52
+ ### B5 指派(可选)
53
+
54
+ - 弹窗1 询问是否指派:选项顺序固定「1. 指派(推荐)/2. 不指派」。
55
+ - 选「1. 指派」→ 紧接着收集「学习类型(F1 必修 / F2 选修)| 指派对象(部门指派 / 人员指派)」,同一部门逐课指派(read `../assign/SOP.md`)。
56
+ - 选「2. 不指派」→ 跳过指派,不出现学习类型问,也不出现指派部门/人员问。
57
+ - 未发布课程同样可以指派,无「先发布才能指派」限制。
58
+
59
+ ### B6 发布确认(指派完成后)
60
+
61
+ - 指派完成后,**单独弹窗**询问是否发布:选项顺序固定「1. 发布 / 2. 不发布」。
62
+ - 仅用户明确选择「1. 发布」才执行发布;每门课执行二次状态查询和 Gate Check 后发布(read `../publish/SOP.md`),禁止代发布。
63
+ - 选「2. 不发布」→ 不执行发布,课程保持未发布状态。
64
+
65
+ ### B7 汇总
66
+
67
+ 输出批量结果表:课程|course-id|课件数|指派|发布状态|失败动作|是否可重试;提供失败课程的可恢复位置。
68
+
69
+ ## 输出标准
70
+
71
+ ```text
72
+ ✅ 批量处理完成
73
+ - 成功: X 门(course-id 列表)
74
+ - 失败: Y 门(标题 + 原因)
75
+ - 跳过: Z 门(空目录/无效素材)
76
+ - 指派/发布状态: 逐门标注
77
+ ⏭️ 失败课程可恢复位置:{N 门} 可重试
78
+ ```
79
+
80
+ ## 注意事项
81
+
82
+ - 批量模式不默认发布、不默认指派,需用户明确。
83
+ - 小测验:批量统一不加(固定),不进入小测验流程。
84
+ - 指派与发布分开两步:先指派,指派完成后单独弹窗确认发布。
85
+ - 逐门使用真实分类 ID 与真实素材字段,禁止占位值。
86
+ - 图片不能作为课程课件素材,扫描时按规则过滤。
87
+
88
+ ## 检查清单
89
+
90
+ - [ ] B1 已一次性收集 B/C 编码 + 目录绝对路径
91
+ - [ ] B2 目录已扫描,隐藏文件/符号链接/空目录/更深层文件已过滤
92
+ - [ ] B3 计划表已展示且经原生弹窗确认后才执行
93
+ - [ ] B4 逐门创建均使用真实 ID,失败已隔离并记录,未询问小测验
94
+ - [ ] B5 指派经弹窗确认,未发布课程同样可指派,未代指派
95
+ - [ ] B6 指派完成后单独弹窗确认发布,未代发布
96
+ - [ ] B7 汇总表已输出,成功/失败/跳过/可重试明细完整
@@ -30,41 +30,32 @@ tags: [soke, category, classification, hierarchy]
30
30
  ### Step 1: 查询分类 `course +list-categories`
31
31
 
32
32
  ```bash
33
- soke course +list-categories
33
+ soke-cli course +list-categories
34
34
  ```
35
35
 
36
36
  无必填参数,返回当前租户下完整的分类树。
37
37
 
38
- 可选参数:
38
+ 返回结构以 `data.list` 为准,每项使用 `title`、`uuid`、`parent_id`;分页状态使用 `data.has_more`。当前事实表未确认 `--parent-id` 和 `--level`,禁止自行传入;需要展示子分类时,在已拉取列表中按 `parent_id` 本地构建层级。
39
39
 
40
- | 参数 | 必填 | 说明 |
41
- |------|------|------|
42
- | `--parent-id` | 否 | 查询指定父分类下的子分类 |
43
- | `--level` | 否 | 按层级过滤(1-6) |
40
+ ### Step 2: 分类选择(聊天文本分页列表,不用弹窗)
44
41
 
45
- 返回每个分类的 `id`、`name`、`parent_id`、`level`。
42
+ 组件单问≤4 选项装不下分页列表,故分类选择走聊天文本交互,规格:
46
43
 
47
- ### Step 2: 分类选择(弹窗交互)
44
+ - **查询后再显示真实分类**:必须先执行 `soke-cli course +list-categories --page 1 --page-size 100 --format json`,从返回的 `data.list` 读取 `title`、`uuid`、`parent_id`;将 `parent_id="1"` 的记录作为一级分类,禁止显示占位符、预设分类或空表;
45
+ - **只显示一级分类**,用 B 编码列表(B1..Bn,编码放名称前),**一页 10 个**;超过 10 个时末尾提示「回复'下一页'翻页(第 X/Y 页)」;
46
+ - **可搜索**:分类表格下方必须明确提示「如果没有找到需要的分类,请回复“搜索XX”搜索,或回复“下一页”查找」;用户回复「搜索 XX」→ 模糊匹配一级分类名 → 展示匹配 B 编码列表;
47
+ - 用户回复**编号或名称**即选定;用户说"随便"→ 取第一个;
48
+ - 用户已指定分类名且唯一匹配 → 不展示列表,直接使用;
49
+ - **无 Other、无弹窗**;列表末尾固定附「分类不存在?请后台新建,完成后回复'分类建好了'」。
48
50
 
49
- 根据匹配结果使用 `ask_user_question` 弹窗:
51
+ 展示示例:
50
52
 
51
- | 场景 | 弹窗策略 |
52
- |------|---------|
53
- | 用户已指定分类名,匹配到唯一结果 | 不弹窗,直接使用 |
54
- | 匹配到多个结果 | 弹窗列匹配项,最后加 `🆕 新建分类` |
55
- | 用户未指定分类 | 弹窗列一级分类列表,最后加 `🆕 新建分类` |
56
- | 用户说"随便" | 取第一个一级分类 |
57
-
58
- 弹窗示例:
59
53
  ```
60
- ask_user_question
61
- question: "选择课程分类"
62
- header: "分类"
63
- options:
64
- - label: "📁 技术研发" description: "一级分类 · 含 8 个子分类"
65
- - label: "📁 企业管理" description: "一级分类 · 含 5 个子分类"
66
- - label: "📁 产品设计" description: "一级分类 · 含 3 个子分类"
67
- - label: "🆕 新建分类" description: "前往管理后台新建分类"
54
+ 请选择课程分类(一级 · 第 1/1 页):
55
+ 1 外部课程 2 授客学堂赠送 3 新员工培训 4 岗位技能
56
+ 5 企业文化 6 办公软件 7 职业素养 8 产品迭代
57
+ 如果没有找到需要的分类,请回复“搜索XX”搜索,或回复“下一页”查找。
58
+ 回复编号或名称选择
68
59
  ```
69
60
 
70
61
  ### Step 3: 新建分类(CLI 不支持)
@@ -106,7 +97,7 @@ ask_user_question
106
97
  ## 检查清单
107
98
 
108
99
  - [ ] 已通过 list-categories 获取完整分类树
109
- - [ ] 选择分类时已使用 `ask_user_question` 弹窗
110
- - [ ] 弹窗最后一项始终为 `🆕 新建分类`
100
+ - [ ] 分类列表只显一级、10 个/页、带翻页与搜索提示
101
+ - [ ] 列表末尾附后台新建分类指引
111
102
  - [ ] 用户选新建时已告知后台操作路径
112
103
  - [ ] 确认目标分类 ID 存在于返回结果中
@@ -0,0 +1,22 @@
1
+ # 收费子 SOP(课程流程编排视角)
2
+
3
+ > 收费设置 CLI 暂不支持,本 SOP 只承载「课程流程中」的收费交互话术与后台指引。
4
+
5
+ ## 触发
6
+
7
+ Phase 3 课程设置中,用户提出收费/价格/试看相关需求时触发。
8
+
9
+ ## 规则
10
+
11
+ - CLI **不支持**收费设置(价格/试看/付费),一律走后台话术。
12
+ - 话术模板:
13
+
14
+ > 收费(价格/试看)暂不支持通过 CLI 设置,请在后台操作:
15
+ > **后台 → 课程管理 → 课程列表 → 编辑 → 收费设置**
16
+ > 可配置:课程价格、是否付费、试看范围等。
17
+ > 配置完成后请回复「收费设好了」,我将继续。
18
+
19
+ ## 检查清单
20
+
21
+ - [ ] 收费需求未尝试用 CLI 写入,已给后台路径
22
+ - [ ] 后台操作完成后有继续引导
@@ -0,0 +1,35 @@
1
+ # 维护路由子 SOP(课程流程编排视角)
2
+
3
+ > 本 SOP 承载「课程流程中」的关闭/删除/复制/审批/批量等维护操作的路由与话术;关闭命令真实参数以 `../../cli-facts.md` 的 course 组为准。
4
+
5
+ ## 触发
6
+
7
+ Phase 5 维护意图(关闭/删除/复制/审批/批量)触发。
8
+
9
+ ## 路由
10
+
11
+ | 操作 | 通道 | 说明 |
12
+ | --- | --- | --- |
13
+ | 关闭课程 | CLI `course +update --action close` | ⚠️ 先确认无学习地图关联 |
14
+ | 删除课程 | 后台 | 不可逆,需后台操作 |
15
+ | 复制课程 | 后台 | CLI 不支持 |
16
+ | 审批流 | 后台 | 后台 → 系统设置 → 审批设置(默认关闭) |
17
+ | 批量发布 | 后台 | CLI 只支持逐门 `course +publish` |
18
+
19
+ ## 关闭课程(CLI 支持)
20
+
21
+ - 执行前**先确认无学习地图关联**,有关联需先解除或引导后台处理。
22
+ - `course +update --course-id <id> --action close`。
23
+ - 关闭后可重新发布(`2 → 1`)。
24
+
25
+ ## 后台话术模板
26
+
27
+ > 该操作 CLI 暂不支持,请在后台完成:
28
+ > **后台 → 课程管理 → 课程列表 → {具体入口}**
29
+ > 完成后请回复「{操作}好了」,我将继续。
30
+
31
+ ## 检查清单
32
+
33
+ - [ ] 关闭前已确认无学习地图关联
34
+ - [ ] 删除/复制/审批/批量未尝试用 CLI 写入,已给后台路径
35
+ - [ ] 关闭用 `--action close`,删除未用 CLI 执行
@@ -0,0 +1,39 @@
1
+ # 小测验子 SOP(课程流程编排视角)
2
+
3
+ > 本 SOP 只承载「课程创建/上传流程中」的小测验交互编排规则;试卷/题库命令真实参数以 `../../cli-facts.md` 的 exam 最小建题链为准,实现细节见 `../../../soke-exam/MODULE.md`。
4
+
5
+ ## 触发
6
+
7
+ Phase 2 课件完成后,弹窗「📝 加小测验 / 不加,去发布」,用户选「加小测验」后触发本 SOP。
8
+
9
+ ## 交互顺序(硬规则)
10
+
11
+ 1. 课件完成后弹窗一次:**[📝 加小测验 / 不加,去发布]**(模板小测验默认值作推荐项,可改)。
12
+ 2. 用户选「加」→ **出题方式弹窗**:**[H1 选择试卷 / H2 导入试卷]**。
13
+ 3. 文本收试卷关键词或试题表路径,执行建题/挂载。
14
+
15
+ ## H1 选择试卷
16
+
17
+ - **不使用弹窗**,改为当前对话中用 Markdown 表格展示前 20 份已有试卷。
18
+ - 表格下方固定提示:「回复"搜索 XX"可模糊匹配;"下一页"翻页(当前仅 1 页)。」
19
+ - 已有试卷列表**仅在当前对话中展示**,不生成、打开或展示独立文件、远程页面或远程课程界面,也不将列表同步到远程平台。
20
+ - 用户回复编号/关键词选定试卷后,通过 `course +lesson-create --type exam --paper-id/--paper-title` 挂载为课程课件。
21
+
22
+ ## H2 导入试卷
23
+
24
+ - 文本收「试卷关键词或试题表路径」,按 `soke-exam` 建题链从零建题(题库 → 试题 → 试卷 → 发布试卷)后挂载。
25
+
26
+ ## 挂载成功后(硬规则)
27
+
28
+ - 试卷成功挂载后,**必须立即弹出指派与发布条件选择**。
29
+ - 小测验导入或挂载成功后,**必须立即弹出指派与发布条件选择,不得只输出状态后结束**。
30
+
31
+ ## 批量模式例外
32
+
33
+ - 批量模式(batch B5)固定不创建、不导入、不询问小测验,不进入本 SOP。
34
+
35
+ ## 检查清单
36
+
37
+ - [ ] 出题方式弹窗已收集 H1/H2
38
+ - [ ] H1 用 Markdown 表格展示前 20 份试卷 + 固定提示,未用弹窗、未生成独立文件
39
+ - [ ] 试卷挂载/导入成功后立即弹指派+发布条件,未只输出状态后结束
@@ -0,0 +1,66 @@
1
+ # 创建骨架子 SOP(Phase 1)
2
+
3
+ > 本 SOP 承载「创建课程」Phase 1 创建骨架的完整流程。命令参数以 `../../cli-facts.md` 为准;分类规则见 `../category/SOP.md`,模板规则见 `../template/SOP.md`。仅当意图路由判定为 create(创建/新建/做课/开课)时进入本 SOP。
4
+
5
+ ## 触发
6
+
7
+ 意图路由 Gate 0 判定为 create,或显式调用本技能且意图不明(默认走创建/上传主流程)时进入。
8
+
9
+ ## Step 1.0 模式路由
10
+
11
+ create 意图下先定模式,**确认模式前不得执行任何写入类 CLI**:
12
+
13
+ - 有明确 `course-id` → 当前课程操作,不新建;
14
+ - 有明确本地目录 → 进入批量流程(read `../batch/SOP.md`);
15
+ - 有单个文件或课程标题 → 单课程流程;
16
+ - **其余情况(用户只说「创建课程/上传课程」等,未给目录/文件/标题)→ 第一步先原生二选一询问「单课程上传」/「多课程批量上传」,禁止默认进单课程。**
17
+
18
+ - 用户选「单课程上传」→ 继续 Step 1.2。
19
+ - 用户选「多课程批量上传」→ 进入 B0(read `../batch/SOP.md`),一次性收集分类(B)+ 模板(C)+ 目录绝对路径,不要求单独课程标题;批量模式下无论 C1-C7,模板「小测验默认」统一为「不加」。
20
+
21
+ ## Step 1.1 就绪探测
22
+
23
+ 最小就绪探测:`soke-cli --version`(环境与版本)+ `soke-cli config show`(登录态与 `corpid`)。失败才读对应共享文档(见 `../../shared/README.md`)。
24
+
25
+ ## Step 1.2 单课程首轮收集(固定格式)
26
+
27
+ 选择「单课程上传」后,第一条收集消息必须严格按「课程标题 → A 课件来源 → B 课程分类 → 分类表格 → 分类提示 → C 课程模板 → 模板表格 → 回复格式 → 回复示例」顺序输出:
28
+
29
+ ```text
30
+ 请输入你要上传的课程标题:
31
+ A 课件来源
32
+ B 课程分类(一级 · 第 X/Y 页)
33
+ <必须先执行 `soke-cli course +list-categories --page 1 --page-size 100 --format json`,再将返回结果中 `parent_id="1"` 的一级分类按实际 `title` 和 `uuid` 渲染为 Markdown 表格;禁止使用占位符、预设分类或空表>
34
+ 回复「搜索 XX」可模糊匹配;"下一页"翻页(当前第 X/Y 页)。如需新分类请后台新建后回「分类建好了」。
35
+ C 课程模板
36
+ <详细课程模板表格>
37
+ 请直接提供课程标题、课件来源、分类和模板;选择本地上传时请同时提供文件路径(也可将文件拖到对话框中)。
38
+ ```
39
+
40
+ 硬规则:
41
+
42
+ - 所有选项编码必须放在名称前(如 `B1 外部课程`、`C1 合规必修`),禁止编码放名称后。
43
+ - 课程模板表格中的编码必须放在模板名称前面。
44
+ - 分类表格和模板表格必须使用本次接口/事实数据,不得输出占位符、空表或预设列表。
45
+ - 标题在输入框自由输入,**禁止建议标题**;提示用固定话术「请输入你要上传的课程标题」,禁止内部状态叙述。
46
+ - 允许用户一次回复「课程标题 + A/B/C 编码」,也允许分多次补充。
47
+ - A1 本地上传 → 同句或下句贴本地路径;A2 素材库选择 → 展示素材编号列表(20 个/页、「下一页」翻页、「搜索 XX」搜索),回复编号选定。
48
+
49
+ ## Step 1.3 查重 + 创建 + 模板写入
50
+
51
+ 1. 创建前先按「标题 + 分类 + 当前未发布状态」查重;发现疑似重复课程先列出课程 ID 和状态,等待用户选择复用或继续创建。
52
+ 2. 确认无重复后执行 `course +create --title --category-id`。
53
+ 3. **必须提取 course-id,未提取禁止下一步**。
54
+ 4. 模板 C1-C6 按 `../template/SOP.md` 映射表**立即 `+advanced` 固定写入高级设置**,并**展示「模板相关设置」表**,列序固定 **设置项|值|状态**(状态放值后面:✅ 已自动写入 / ⚠️ 后台待配 / 📝 小测验默认);C7 不写、展示空表。
55
+
56
+ ## Gate 1→2
57
+
58
+ **course-id 非空**,否则停在 Phase 1,禁止进入 Phase 2。
59
+
60
+ ## 检查清单
61
+
62
+ - [ ] create 意图下已先定模式:可判定(course-id/目录/单文件+标题)不弹,否则第一步先弹「单课程/批量」二选一,未默认进单课程
63
+ - [ ] 首轮收集按固定格式输出,编码放名称前,表格为真实数据非占位
64
+ - [ ] 创建前已查重
65
+ - [ ] `course +create` 后已提取 course-id
66
+ - [ ] C1-C6 已 `+advanced` 写入并展示「模板相关设置」表;C7 展示空表
@@ -0,0 +1,34 @@
1
+ # 课件构建子 SOP(Phase 2)
2
+
3
+ > 本 SOP 承载「创建课程」Phase 2 构建课件的完整流程。小测验交互见 `../exam/SOP.md`,课件命令参数以 `../../cli-facts.md` 的 lesson 组为准。仅当 Gate 1→2 通过(course-id 非空)后进入本 SOP。
4
+
5
+ ## 触发
6
+
7
+ Phase 1 完成、course-id 非空后进入。默认流程顺序:**先上传课件 → 再问小测验 → 最后指派+发布条件弹窗(见 Phase 4)**。
8
+
9
+ ## 2.1 课件上传与创建(逐项不弹窗)
10
+
11
+ - 用户已给文件:按扩展名自动判型(视频/音频/文档/图片),逐个上传 + 建课件,**不弹窗**。
12
+ - 图片走 `../photo/SOP.md` 链;素材库选择仅当用户主动说「从素材库选」时才用(`file list-files`)。
13
+
14
+ ## 2.2 加小测验
15
+
16
+ - 课件完成后**弹窗一次**:[📝 加小测验 / 不加,去发布](模板小测验默认值作推荐项,可改)。
17
+ - 加 → 出题方式弹窗 [H1 选择试卷 / H2 导入试卷] → 文本收试卷关键词或试题表路径;read `../exam/SOP.md` 执行。
18
+ - 小测验导入或挂载成功后,必须立即进入 Phase 4,弹出「指派课程 + 发布课程」条件弹窗,不得只输出状态后结束。
19
+
20
+ ## 2.3 排序
21
+
22
+ - 排序默认不问,告知「随时说'调顺序'」;用户提出才做(`+lesson-sort --sort-list`)。
23
+
24
+ ## Gate 2→3
25
+
26
+ **课件 ≥ 1**,否则停在 Phase 2。
27
+
28
+ ## 检查清单
29
+
30
+ - [ ] 课件已逐个上传建课件,未因图片误走课件链
31
+ - [ ] 加小测验用弹窗收集,出题方式已收集 H1/H2
32
+ - [ ] 小测验挂载/导入成功后立即进入 Phase 4 条件弹窗
33
+ - [ ] 排序默认未主动询问
34
+ - [ ] 课件数 ≥ 1 才进入 Phase 3
@@ -0,0 +1,26 @@
1
+ # 图片链子 SOP(课程流程编排视角)
2
+
3
+ > 本 SOP 只承载「课程创建/上传流程中」的图片处理编排规则;图片库命令真实参数以 `../../cli-facts.md` 的 photo-gallery 组为准,实现细节见 `../../../soke-photo-gallery/MODULE.md`。
4
+
5
+ ## 触发场景
6
+
7
+ - Phase 2 课件构建:用户提供的文件为图片时走本链(图片不能作为课程课件素材,仅封面/二维码等用)。
8
+ - Phase 3 课程设置:封面新图走本链。
9
+
10
+ ## 规则
11
+
12
+ - 图片**不能作为课程课件素材**(课件仅支持 video/audio/document);图片仅用于封面图、交流群二维码等。
13
+ - 封面图:`photo-gallery +create` 上传到图片库 → 取返回 `photoUri` → `course +update --image`。
14
+ - 交流群二维码:`course +advanced --image-file`(本地图,内部传 OSS 不进图片库)或 `--image-oss-url`(已有完整 URL),二选一。
15
+ - 支持格式:jpg/jpeg/png,单张最大 5 MB。
16
+
17
+ ## 完成判定
18
+
19
+ - 封面上传完成当且仅当 `photo-gallery +list`/`+get` 能查到该图且返回非空 `photoUri`。
20
+ - 两步(OSS 上传 + 图片库登记)任一步失败视为未完成,不得报成功。
21
+
22
+ ## 检查清单
23
+
24
+ - [ ] 图片未误当作课件素材(课件仅 video/audio/document)
25
+ - [ ] 封面已取真实 photoUri 后 course +update --image
26
+ - [ ] 二维码用 --image-file / --image-oss-url 二选一,未混传
@@ -0,0 +1,26 @@
1
+ # 发布管理子 SOP
2
+
3
+ > 状态流转与 Gate Check 矩阵的唯一定义在 ../../sop-publish-check.md;本文件只写执行动作。参数以 ../../cli-facts.md 为准。
4
+
5
+ ## 状态流转(收敛定案)
6
+
7
+ - 0 未发布 → 1 已发布:`course +publish`;
8
+ - 1 → 2 已关闭:`course +update --action close`(**CLI 支持**;删除才需后台);
9
+ - 2 → 1:**已关闭可重新发布**(收敛定案,troubleshoot 旧说法作废)。
10
+
11
+ ## 执行流程
12
+
13
+ 1. read ../../sop-publish-check.md,立即发布逐项执行发布 Gate(6 项);关闭课程另执行关闭专用检查;
14
+ 2. 🔴 阻塞 → 列全部阻塞项 + 修复指引 → 停止;仅 🟡 → 弹窗「有 X 项警告,确认继续发布吗?」;转码中/失败不得进入发布执行;
15
+ 3. 直接发布:`course +publish --course-id <id>`;定时:`--publish-time "YYYY-MM-DD HH:MM:SS"`(北京时间);
16
+ 4. 执行前重新获取课程状态并再次 Gate Check,确认仍是当前课程与计划;直接发布回查 status==1;定时发布回查 publish_time,未到点时 status 仍可为 0。
17
+
18
+ ## ⚠️ CLI 不支持
19
+
20
+ 审批流(后台→系统设置→审批设置;默认关闭)、批量发布(后台)、删除课程(后台,不可逆)。
21
+
22
+ ## 输出标准
23
+
24
+ 成功:✅ 课程发布成功 / 标题 / ID / status=1 / 学员端可见。
25
+ 定时:✅ 已设置定时发布 / 标题 / ID / publish_time / 当前 status=0(到点后回查)。
26
+ 不通过:❌ 逐项 [✓]/[✗] 列表 + 修复指引。
@@ -0,0 +1,36 @@
1
+ # 数据查询子 SOP
2
+
3
+ > 参数以 ../../cli-facts.md 为准(本节命令名/参数已按 v1.0.77 实测修正)。
4
+
5
+ ## 课程维度
6
+
7
+ - **学习统计未指定课程时**:先执行 `course +list-courses --status 1 --page 1 --page-size 20`,只展示已发布线上课前 20 个(标题、course-id、学员数、课件数),不直接展开详情;表格下方固定提示:`回复「搜索 XX」可模糊匹配;"下一页"翻页(当前仅 1 页)。`
8
+ - 用户回复课程编号、名称或 `course-id` 后,再进入学员/课件/作业统计;用户回复「搜索 XX」时带 `--keyword` 重查并重新展示前 20 个;回复「下一页」时按 `--page` 翻页并更新页码。
9
+ - 列表:`course +list-courses [--keyword --category-path --status 0|1|2 --is-in --is-my --page --page-size]`(**无时间范围参数**;学习统计入口固定 `status=1`,查其他状态需用户明确说明)
10
+ - 详情:`course +get-course --course-id <id>`
11
+
12
+ ## 学员维度
13
+
14
+ - 课程学员:`course +list-course-users --course-id <id> --finish-start-time <ms> --finish-end-time <ms> [--userid-list(≤100)]`(**finish 时间必传,且起止跨度 ≤7 天**(回归实测;旧文档 365 天作废);查全量按 7 天窗口循环分页)
15
+ - 学员详情:`course +get-course-user --course-id <id> --dept-user-id <uid>`
16
+
17
+ ## 课件维度
18
+
19
+ - 学习记录:`course +list-lesson-learns --lesson-id <id> [--course-id --userid-list --finish-start-time --finish-end-time]`
20
+ - 人脸记录:`course +list-lesson-faces --target-id <课件uuid>`(**--target-id,无时间参数**);face_status 1=成功 2=失败
21
+
22
+ ## 作业维度(clock,只读)
23
+
24
+ 1. `clock list-learnings --target-id <课程ID> --start-time <ms> --end-time <ms> --page 1 --page-size 10`(**page/page-size 强制必传**)→ 作业列表(clock-id)
25
+ 2. `clock list-logs --clock-id <id> --start-time --end-time --page --page-size` → 学员提交列表
26
+ 3. `clock list-log-lessons --target-id <提交ID> --page --page-size` → 提交材料明细
27
+
28
+ ## 输出标准
29
+
30
+ 表格化:课程列表(标题/状态/学员数/课件数);学员记录(姓名/部门/进度/时长/状态)。
31
+ 完成率 = finish_status=1 人数 / 总人数;平均进度 = study_progress 均值。
32
+
33
+ ## 注意
34
+
35
+ - 时间戳统一毫秒;分页必设(大结果集);
36
+ - 批量统计报表导出 → 话术「可另装 soke-task 技能」。
@@ -16,7 +16,7 @@ tags: [soke, course, settings, configuration, advanced]
16
16
  ### 基础信息更新 `course +update`
17
17
 
18
18
  ```bash
19
- soke course +update \
19
+ soke-cli course +update \
20
20
  --course-id <courseId> \
21
21
  --title "<新标题>" \
22
22
  --credit 10 \
@@ -27,7 +27,6 @@ soke course +update \
27
27
  | 参数 | 必填 | 说明 |
28
28
  |------|------|------|
29
29
  | `--course-id` | 是 | 课程 ID |
30
- | `--action` | 否 | 操作类型,默认 `update`;传 `close` 可关闭课程 |
31
30
  | `--title` | 否 | 课程标题 |
32
31
  | `--credit` | 否 | 学分 |
33
32
  | `--description` | 否 | 课程描述/简介 |
@@ -42,7 +41,7 @@ soke course +update \
42
41
  ### 高级设置更新 `course +advanced`
43
42
 
44
43
  ```bash
45
- soke course +advanced \
44
+ soke-cli course +advanced \
46
45
  --course-id <courseId> \
47
46
  --study-type 2 \
48
47
  --is-accelerate 1 \
@@ -123,7 +122,7 @@ soke-cli course +advanced \
123
122
 
124
123
  ## 注意事项
125
124
 
126
- 1. `course +update` 支持标题、学分、描述、封面图、分类 ID 修改,以及通过 `--action close` 关闭课程
125
+ 1. `course +update` 支持标题、学分、描述、封面图和分类 ID 修改
127
126
  2. 封面图地址来自图片库列表接口返回的 `photoUri`
128
127
  3. 分类修改可通过 `--category-id` 更新
129
128
  4. 高级设置项之间可能存在依赖关系(如开启视频学习中人脸识别后再设置识别次数),建议按表格顺序逐项配置
@@ -0,0 +1,58 @@
1
+ # 课程模板子 SOP
2
+
3
+ > 创建课程后(Step 1.3)立即触发。模板会自动应用 CLI 支持的高级设置;后台能力只生成待办清单,不声称已完成。
4
+
5
+ ## Step 1 选择(编码 C,不用弹窗)
6
+
7
+ 速查表带 C 编码展示(C1-C7),用户回复 C 编号选定:
8
+
9
+ | 模板编码与名称 | 适用场景 | 高级设置 | 小测验 |
10
+ |---|---|---|---|---|
11
+ | C1 合规必修 | 安全/合规/法务 | 解锁+人脸+禁倍速禁拖动+提醒+评价;证书/签名/审批需后台 | 单课程:不加;批量:不加(固定) |
12
+ | C2 考核认证 | 上岗/资格鉴定 | 解锁+评价;证书/审批需后台 | 单课程:加(默认);批量:不加(固定) |
13
+ | C3 新人入职 | 新员工/转岗 | 自由学习+倍速+未学提醒+评价 | 单课程:不加(默认);批量:不加(固定) |
14
+ | C4 知识分享 | 内部分享/兴趣 | 自由学习+倍速+拖动;免费设置需后台 | 单课程:加(默认);批量:不加(固定) |
15
+ | C5 领导力/软技能 | 管理/沟通 | 拖动+评价;作业/证书/钉钉群需后台 | 单课程:不加;批量:不加(固定) |
16
+ | C6 产品/业务 | 新品上线/业务更新 | 自由学习+倍速+未学提醒;定时发布需后台 | 单课程:加(默认);批量:不加(固定) |
17
+ | C7 不选择模板 | 精细控制 | 无预设 | 单课程:无默认;批量:不加(固定) |
18
+
19
+ ## Step 1.5 模板→设置固定映射(选中即自动应用)
20
+
21
+ 选中模板后:CLI 支持项**立即 `course +advanced` 固定写入**;后台项一行话术记录;小测验默认值带入 Phase 2 弹窗作推荐项。
22
+
23
+ | 模板 | +advanced 固定参数 | 小测验默认 |
24
+ |------|------------------|---------|
25
+ | C1 合规必修 | --study-type 2 --is-accelerate 0 --is-drag 0 --open-face-recognition 1 --evaluate-required 1 --is-remind 1 | D2 |
26
+ | C2 考核认证 | --study-type 2 --evaluate-required 1 | D1 |
27
+ | C3 新人入职 | --study-type 1 --is-accelerate 1 --is-remind 1 --evaluate-required 1 | D2 |
28
+ | C4 知识分享 | --study-type 1 --is-accelerate 1 --is-drag 1 | D1 |
29
+ | C5 领导力/软技能 | --is-drag 1 --evaluate-required 1 | D2 |
30
+ | C6 产品/业务 | --study-type 1 --is-accelerate 1 --is-remind 1 | D1 |
31
+ | C7 不选择 | 不写 | 无默认,弹窗问 |
32
+
33
+ ## Step 2 输出配置清单(列序固定:设置项|值|状态)
34
+
35
+ 选 1-6 → 先按 Step 1.5 执行 `course +advanced`,再输出该模板设置表,**列序固定 设置项|值|状态**(状态放值后面):
36
+
37
+ | 状态标记 | 含义 |
38
+ | --- | --- |
39
+ | ✅ 已自动写入 | CLI `+advanced`/`+update` 已执行 |
40
+ | ⚠️ 后台待配 | CLI 不支持,需后台操作 |
41
+ | 📝 小测验默认 | 带入 Phase 2 弹窗作推荐项 |
42
+
43
+ - **CLI(✅ 已自动写入)**:学习模式/倍速/拖动/人脸/提醒/评价/防挂机/评论/二维码 → `course +advanced`;标题/学分/描述/封面 → `course +update`;
44
+ - **后台(⚠️ 后台待配)**:证书/签名(证书设置)、价格/试看(收费设置)、审批发布(审批设置)、截止时间/自动配课(学习/指派设置)、小测验/作业课件(课件添加);
45
+ - **📝 小测验默认**:按模板映射带入 Phase 2 弹窗作推荐项。
46
+ 选 C7 → 不写、展示空表。
47
+
48
+ ## Step 3 Phase 3 设置表(可逐项改)
49
+
50
+ 展示「设置项 | 当前值」两列;用户指令处理:
51
+ - CLI 支持项 → 立即执行 +update/+advanced → 刷新表;
52
+ - 后台项 → 「已记录: {项} → {新值}(需在后台操作: {路径})」→ 刷新表;
53
+ - 「可以了/继续」→ 退出。
54
+
55
+ ## 注意
56
+
57
+ - 模板不影响已创建的 title/description/category-id;
58
+ - 选模板但未去后台配置的项,发布 Gate 不阻塞(均为非硬项)。
@@ -11,7 +11,55 @@ metadata:
11
11
 
12
12
  # 考试管理 (exam)
13
13
 
14
- **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../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/interaction.md`
24
+ - `../../shared/write-guard.md`
25
+ - `../../shared/write-verify.md`
26
+ - `../../shared/output-policy.md`
27
+ - `../../shared/error-handling.md`
28
+
29
+ 本模块只保留考试业务规则;通用规则统一由共享层维护。
30
+
31
+ ## 职责
32
+
33
+ 负责考试、题库、试题、试卷、考试用户和成绩的业务管理;不负责随机答题练习,练习流程由 `soke-exam-question-pool` 负责。
34
+
35
+ ## 输入
36
+
37
+ - 用户明确的考试、题库、试题、试卷或成绩操作
38
+ - 真实的分类、题库、试卷、考试和用户 ID
39
+ - 创建或更新对象所需的业务字段
40
+
41
+ ## 流程
42
+
43
+ ```text
44
+ 查询分类 → 创建题库 → 创建试题 → 创建试卷
45
+ → 发布试卷 → 创建/配置考试 → 指派考试 → 查询成绩
46
+ ```
47
+
48
+ 跨模块指派使用 `../soke-assign/MODULE.md`,不在本模块复制指派实现。
49
+
50
+ ## 业务特例
51
+
52
+ - 考试分类 UUID 与题库分类 UUID 是两个独立系统,禁止混用。
53
+ - `fill` 填空题答案嵌入 `title` 的 `[[答案N]]` 标记中,不传 `--answer`。
54
+ - 题型、发布参数和题库/试卷对象关系以本模块后续章节为准。
55
+
56
+ **失败降级**:发布与创建类写操作若返回业务错误、未返回 `uuid` 或状态未达预期(如发布考试后 `+get-exam` 仍 `status=0`),立即停止并说明原因,不要假设成功;考试/试卷发布前务必用 `+get-exam` / `+get-paper` 回读确认状态。
57
+
58
+ ## 输出
59
+
60
+ 返回考试业务摘要、状态、成绩或对象关系;列表结果说明筛选条件和结果范围,具体输出脱敏遵循 `../../shared/output-policy.md`。
61
+
62
+ **完成判定**:写操作以真实状态为准——试卷发布完成当且仅当 `+get-paper` 反映已发布;考试发布完成当且仅当 `+get-exam` 的 `status=1`;题库/试题/考试用户创建完成当且仅当返回对应 `uuid`;指派完成当且仅当 `+get-assign` 能查到对应用户。仅 CLI 回显“成功”但查询状态未变更的,视为未完成。
15
63
 
16
64
  ## 核心概念
17
65