@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.
- package/package.json +1 -1
- package/scripts/install.js +8 -0
- package/scripts/run.js +3 -2
- package/skills/mono/.workbuddy/memory/2026-09-01.md +2 -0
- package/skills/mono/.workbuddy/memory/MEMORY.md +4 -0
- package/skills/mono/ARCHITECTURE_AND_EXTENSION_GUIDE.md +572 -0
- package/skills/mono/README.md +2 -0
- package/skills/mono/SKILL.md +125 -119
- package/skills/mono/SKILL_MD_/344/274/230/345/214/226/346/226/271/346/241/210.md +478 -0
- package/skills/mono/references/modules/README.md +74 -0
- package/skills/mono/references/modules/soke-ai-coach-director/CHANGELOG.md +1 -1
- package/skills/mono/references/modules/soke-ai-coach-director/MODULE.md +12 -0
- package/skills/mono/references/modules/soke-ai-coach-director/README.md +1 -1
- package/skills/mono/references/modules/soke-ai-coach-director/coaching/prompt-optimizer/prompt-optimizer.md +3 -3
- package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/README.md +4 -2
- package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/qclaw.md +3 -1
- package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/{wukong.md → qwen.md} +18 -18
- package/skills/mono/references/modules/soke-ai-coach-director/platform/adapters/workbuddy.md +1 -1
- package/skills/mono/references/modules/soke-ai-coach-director/platform/api-fallback.md +1 -1
- package/skills/mono/references/modules/soke-ai-coach-director/platform/interaction.md +1 -1
- package/skills/mono/references/modules/soke-ai-coach-director/platform/platform-support-matrix.md +28 -0
- package/skills/mono/references/modules/soke-ai-coach-director/platform/soke-ai-training/soke-ai-training.md +5 -3
- package/skills/mono/references/modules/soke-ai-coach-director/platform/sync-engine.md +2 -2
- package/skills/mono/references/modules/soke-ai-coach-director/references/env-check.md +3 -0
- package/skills/mono/references/modules/soke-ai-coach-director/references/exec-handbook.md +2 -2
- package/skills/mono/references/modules/soke-ai-coach-director/references/subs/publish/SOP.md +3 -3
- package/skills/mono/references/modules/soke-ai-training/MODULE.md +55 -7
- package/skills/mono/references/modules/soke-assign/MODULE.md +50 -11
- package/skills/mono/references/modules/soke-certificate/MODULE.md +47 -1
- package/skills/mono/references/modules/soke-course/CHANGELOG.md +93 -0
- package/skills/mono/references/modules/soke-course/MODULE.md +110 -352
- package/skills/mono/references/modules/soke-course/README.md +45 -291
- package/skills/mono/references/modules/soke-course/cli-facts.md +107 -0
- package/skills/mono/references/modules/soke-course/intent-cases.md +41 -0
- package/skills/mono/references/modules/soke-course/scripts/check_readiness.sh +45 -0
- package/skills/mono/references/modules/soke-course/sop-publish-check.md +46 -0
- package/skills/mono/references/modules/soke-course/subs/assign/SOP.md +40 -0
- package/skills/mono/references/modules/soke-course/subs/batch/SOP.md +96 -0
- package/skills/mono/references/modules/soke-course/{references/subs → subs}/category/SOP.md +18 -27
- package/skills/mono/references/modules/soke-course/subs/charge/SOP.md +22 -0
- package/skills/mono/references/modules/soke-course/subs/copy/SOP.md +35 -0
- package/skills/mono/references/modules/soke-course/subs/exam/SOP.md +39 -0
- package/skills/mono/references/modules/soke-course/subs/phase1-create/SOP.md +66 -0
- package/skills/mono/references/modules/soke-course/subs/phase2-lesson/SOP.md +34 -0
- package/skills/mono/references/modules/soke-course/subs/photo/SOP.md +26 -0
- package/skills/mono/references/modules/soke-course/subs/publish/SOP.md +26 -0
- package/skills/mono/references/modules/soke-course/subs/query/SOP.md +36 -0
- package/skills/mono/references/modules/soke-course/{references/subs → subs}/settings/SOP.md +3 -4
- package/skills/mono/references/modules/soke-course/subs/template/SOP.md +58 -0
- package/skills/mono/references/modules/soke-exam/MODULE.md +49 -1
- package/skills/mono/references/modules/soke-exam-question-pool/MODULE.md +45 -5
- package/skills/mono/references/modules/soke-learning-map/MODULE.md +51 -11
- package/skills/mono/references/modules/soke-learning-profile/MODULE.md +46 -3
- package/skills/mono/references/modules/soke-lesson/MODULE.md +34 -20
- package/skills/mono/references/modules/soke-material/MODULE.md +33 -19
- package/skills/mono/references/modules/soke-photo-gallery/MODULE.md +40 -20
- package/skills/mono/references/modules/soke-shared/MODULE.md +9 -0
- package/skills/mono/references/modules/soke-supervisor/MODULE.md +32 -1
- package/skills/mono/references/modules/soke-task/MODULE.md +48 -1
- package/skills/mono/references/modules/soke-training-demand/MODULE.md +38 -17
- package/skills/mono/references/shared/README.md +50 -0
- package/skills/mono/references/shared/async-task.md +30 -0
- package/skills/mono/references/shared/auth-check.md +57 -0
- package/skills/mono/references/shared/command-discovery.md +34 -0
- package/skills/mono/references/shared/environment-check.md +31 -0
- package/skills/mono/references/shared/error-handling.md +27 -0
- package/skills/mono/references/shared/file-input.md +31 -0
- package/skills/mono/references/shared/interaction.md +39 -0
- package/skills/mono/references/shared/object-context.md +51 -0
- package/skills/mono/references/shared/output-policy.md +39 -0
- package/skills/mono/references/shared/pagination.md +41 -0
- package/skills/mono/references/shared/rule-ownership.md +57 -0
- package/skills/mono/references/shared/state-machine.md +35 -0
- package/skills/mono/references/shared/write-guard.md +34 -0
- package/skills/mono/references/shared/write-verify.md +33 -0
- package/skills/mono/references/workflows/README.md +115 -0
- package/skills/mono/scripts/check_package.py +310 -0
- package/skills/mono/scripts/check_readiness.py +1 -1
- package/skills/mono/scripts/check_syntax.py +35 -0
- 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
- package/skills/multi/soke-course/.skill-metadata.yaml +40 -0
- package/skills/multi/soke-course/CHANGELOG.md +77 -0
- package/skills/multi/soke-course/README.md +27 -274
- package/skills/multi/soke-course/SKILL.md +135 -353
- package/skills/multi/soke-course/_user_meta.json +5 -0
- package/skills/multi/soke-course/agents/openai.yaml +1 -5
- package/skills/multi/soke-course/references/cli-facts.md +105 -0
- package/skills/multi/soke-course/references/examples.md +30 -454
- package/skills/multi/soke-course/references/intent-cases.md +65 -99
- package/skills/multi/soke-course/references/sop-full-workflow.md +81 -177
- package/skills/multi/soke-course/references/sop-lesson-types.md +21 -58
- package/skills/multi/soke-course/references/sop-publish-check.md +14 -71
- package/skills/multi/soke-course/references/subs/assign/SOP.md +37 -0
- package/skills/multi/soke-course/references/subs/category/SOP.md +18 -27
- package/skills/multi/soke-course/references/subs/exam/SOP.md +28 -0
- package/skills/multi/soke-course/references/subs/lesson/SOP.md +28 -0
- package/skills/multi/soke-course/references/subs/material/SOP.md +24 -0
- package/skills/multi/soke-course/references/subs/photo/SOP.md +23 -0
- package/skills/multi/soke-course/references/subs/publish/SOP.md +15 -157
- package/skills/multi/soke-course/references/subs/query/SOP.md +22 -151
- package/skills/multi/soke-course/references/subs/settings/SOP.md +3 -4
- package/skills/multi/soke-course/references/subs/template/SOP.md +37 -210
- package/skills/multi/soke-course/references/troubleshoot.md +37 -54
- package/skills/multi/soke-course/scripts/check_readiness.sh +45 -0
- package/skills/multi/soke-course/{references/installation.md → soke-cli-install-guide.md} +3 -0
- package/skills/mono/references/modules/soke-course/agents/openai.yaml +0 -7
- package/skills/mono/references/modules/soke-course/references/course-list-courses.md +0 -216
- package/skills/mono/references/modules/soke-course/references/examples.md +0 -480
- package/skills/mono/references/modules/soke-course/references/intent-cases.md +0 -99
- package/skills/mono/references/modules/soke-course/references/sop-full-workflow.md +0 -177
- package/skills/mono/references/modules/soke-course/references/sop-lesson-types.md +0 -66
- package/skills/mono/references/modules/soke-course/references/sop-publish-check.md +0 -76
- package/skills/mono/references/modules/soke-course/references/subs/ai/SOP.md +0 -153
- package/skills/mono/references/modules/soke-course/references/subs/charge/SOP.md +0 -107
- package/skills/mono/references/modules/soke-course/references/subs/copy/SOP.md +0 -80
- package/skills/mono/references/modules/soke-course/references/subs/publish/SOP.md +0 -168
- package/skills/mono/references/modules/soke-course/references/subs/query/SOP.md +0 -165
- package/skills/mono/references/modules/soke-course/references/subs/template/SOP.md +0 -223
- package/skills/mono/references/modules/soke-course/references/troubleshoot.md +0 -68
- package/skills/multi/soke-course/examples/create-basic.md +0 -70
- package/skills/multi/soke-course/references/course-list-courses.md +0 -216
- package/skills/multi/soke-course/references/dependencies/soke-assign.md +0 -103
- package/skills/multi/soke-course/references/dependencies/soke-lesson.md +0 -119
- package/skills/multi/soke-course/references/dependencies/soke-material.md +0 -105
- package/skills/multi/soke-course/references/shared.md +0 -185
- package/skills/multi/soke-course/references/subs/ai/SOP.md +0 -153
- package/skills/multi/soke-course/scripts/check_readiness.py +0 -87
- /package/skills/mono/references/{installation.md → shared/installation.md} +0 -0
|
@@ -1,291 +1,45 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- [
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
soke-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
--title "第一课" \
|
|
47
|
-
--media-id "MATERIAL-UUID" \
|
|
48
|
-
--type "video" \
|
|
49
|
-
--length 600 \
|
|
50
|
-
--object "path/to/file.mp4" \
|
|
51
|
-
--filename "lesson1.mp4" \
|
|
52
|
-
--ext "mp4" \
|
|
53
|
-
--filesize 10485760
|
|
54
|
-
|
|
55
|
-
# 5. 发布课程
|
|
56
|
-
soke-cli course +publish --course-id "COURSE-UUID"
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### 查询课程
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
# 查询课程列表
|
|
63
|
-
soke-cli course +list-courses
|
|
64
|
-
|
|
65
|
-
# 查询课程详情
|
|
66
|
-
soke-cli course +get-course --course-id "COURSE-UUID"
|
|
67
|
-
|
|
68
|
-
# 查询课程分类
|
|
69
|
-
soke-cli course +list-categories
|
|
70
|
-
|
|
71
|
-
# 查询课程学习记录
|
|
72
|
-
soke-cli course +list-course-users --course-id "COURSE-UUID"
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## 主要命令
|
|
76
|
-
|
|
77
|
-
### 课程管理
|
|
78
|
-
| 命令 | 说明 |
|
|
79
|
-
|------|------|
|
|
80
|
-
| `+list-categories` | 查询课程分类(获取 category-id) |
|
|
81
|
-
| `+create` | 创建课程基本信息 |
|
|
82
|
-
| `+update` | 更新课程信息 |
|
|
83
|
-
| `+delete` | 删除未发布或已关闭课程 |
|
|
84
|
-
| `+advanced` | 更新课程高级设置 |
|
|
85
|
-
| `+publish` | 发布课程 |
|
|
86
|
-
| `+get-course` | 查询课程详情 |
|
|
87
|
-
| `+list-courses` | 查询课程列表 |
|
|
88
|
-
|
|
89
|
-
### 课件管理(soke-lesson)
|
|
90
|
-
| 命令 | 说明 |
|
|
91
|
-
|------|------|
|
|
92
|
-
| `+lesson-create` | 创建课件 |
|
|
93
|
-
| `+lesson-get` | 查询课件详情 |
|
|
94
|
-
| `+lesson-list` | 查询课件列表 |
|
|
95
|
-
|
|
96
|
-
### 素材管理(soke-material)
|
|
97
|
-
| 命令 | 说明 |
|
|
98
|
-
|------|------|
|
|
99
|
-
| `file +upload` | 上传文件到素材库 |
|
|
100
|
-
| `file +list-files` | 查询素材列表 |
|
|
101
|
-
| `file +get-info` | 查询素材详情 |
|
|
102
|
-
|
|
103
|
-
### 学习记录
|
|
104
|
-
| 命令 | 说明 |
|
|
105
|
-
|------|------|
|
|
106
|
-
| `+list-course-users` | 查询课程学习记录 |
|
|
107
|
-
| `+get-course-user` | 查询用户学习详情 |
|
|
108
|
-
| `+list-lesson-learns` | 查询课件学习记录 |
|
|
109
|
-
| `+list-lesson-faces` | 查询人脸识别记录 |
|
|
110
|
-
|
|
111
|
-
## 使用场景
|
|
112
|
-
|
|
113
|
-
### 场景1: 创建课程
|
|
114
|
-
|
|
115
|
-
适用于需要精细控制每个步骤的场景:
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
# 1. 查询课程分类,获取 category-id
|
|
119
|
-
soke-cli course +list-categories
|
|
120
|
-
|
|
121
|
-
# 2. 创建课程(使用上一步获取的 category-id)
|
|
122
|
-
course_id=$(soke-cli course +create \
|
|
123
|
-
--title "Python数据分析实战" \
|
|
124
|
-
--category-id "CATEGORY-UUID" \
|
|
125
|
-
--format json | jq -r '.data.uuid')
|
|
126
|
-
|
|
127
|
-
# 3. 批量上传素材
|
|
128
|
-
for file in ./lessons/*.mp4; do
|
|
129
|
-
media_id=$(soke-cli file +upload --file "$file" --format json | jq -r '.data.uuid')
|
|
130
|
-
|
|
131
|
-
# 4. 创建课件
|
|
132
|
-
soke-cli course +lesson-create \
|
|
133
|
-
--course-id "$course_id" \
|
|
134
|
-
--title "$(basename "$file" .mp4)" \
|
|
135
|
-
--media-id "$media_id" \
|
|
136
|
-
--type "video" \
|
|
137
|
-
--length 600 \
|
|
138
|
-
--object "path/to/$(basename "$file")" \
|
|
139
|
-
--filename "$(basename "$file")" \
|
|
140
|
-
--ext "mp4" \
|
|
141
|
-
--filesize $(stat -f%z "$file")
|
|
142
|
-
done
|
|
143
|
-
|
|
144
|
-
# 5. 发布课程
|
|
145
|
-
soke-cli course +publish --course-id "$course_id"
|
|
146
|
-
|
|
147
|
-
# 或定时发布课程,输入北京时间
|
|
148
|
-
soke-cli course +publish \
|
|
149
|
-
--course-id "$course_id" \
|
|
150
|
-
--publish-time "2026-07-14 17:24:42"
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### 场景2: 管理现有课程
|
|
154
|
-
|
|
155
|
-
```bash
|
|
156
|
-
# 查询课程列表
|
|
157
|
-
soke-cli course +list-courses --status 1
|
|
158
|
-
|
|
159
|
-
# 获取课程详情
|
|
160
|
-
soke-cli course +get-course --course-id "COURSE-UUID"
|
|
161
|
-
|
|
162
|
-
# 查询课程的课件
|
|
163
|
-
soke-cli course +lesson-list --course-id "COURSE-UUID"
|
|
164
|
-
|
|
165
|
-
# 更新课程信息
|
|
166
|
-
soke-cli course +update \
|
|
167
|
-
--course-id "COURSE-UUID" \
|
|
168
|
-
--title "新标题" \
|
|
169
|
-
--description "新描述"
|
|
170
|
-
|
|
171
|
-
# 删除未发布或已关闭课程
|
|
172
|
-
soke-cli course +delete --course-id "COURSE-UUID"
|
|
173
|
-
|
|
174
|
-
# 添加新课件
|
|
175
|
-
media_id=$(soke-cli file +upload --file ./new-lesson.mp4 --format json | jq -r '.data.uuid')
|
|
176
|
-
soke-cli course +lesson-create \
|
|
177
|
-
--course-id "COURSE-UUID" \
|
|
178
|
-
--title "新增课件" \
|
|
179
|
-
--media-id "$media_id" \
|
|
180
|
-
--type "video" \
|
|
181
|
-
--length 600 \
|
|
182
|
-
--object "path/to/new-lesson.mp4" \
|
|
183
|
-
--filename "new-lesson.mp4" \
|
|
184
|
-
--ext "mp4" \
|
|
185
|
-
--filesize 10485760
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### 场景3: 统计课程完成情况
|
|
189
|
-
|
|
190
|
-
```bash
|
|
191
|
-
# 1. 获取课程列表
|
|
192
|
-
soke-cli course +list-courses
|
|
193
|
-
|
|
194
|
-
# 2. 查询某个课程的学习记录
|
|
195
|
-
soke-cli course +list-course-users --course-id "COURSE-UUID"
|
|
196
|
-
|
|
197
|
-
# 3. 查询课件学习记录
|
|
198
|
-
soke-cli course +list-lesson-learns --lesson-id "LESSON-UUID"
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
## 参数说明
|
|
202
|
-
|
|
203
|
-
### 时间参数
|
|
204
|
-
|
|
205
|
-
所有时间参数使用 Unix 时间戳(毫秒)格式:
|
|
206
|
-
|
|
207
|
-
```javascript
|
|
208
|
-
// JavaScript 示例
|
|
209
|
-
const startTime = new Date('2024-01-01').getTime(); // 1704038400000
|
|
210
|
-
const endTime = new Date('2024-12-31').getTime(); // 1735660799000
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
### 状态参数
|
|
214
|
-
|
|
215
|
-
**课程状态 (status)**:
|
|
216
|
-
- `0`: 未发布
|
|
217
|
-
- `1`: 已发布
|
|
218
|
-
- `2`: 已关闭
|
|
219
|
-
|
|
220
|
-
**课程来源 (is-in)**:
|
|
221
|
-
- `0`: 外部课列表
|
|
222
|
-
- `1`: 内部课列表
|
|
223
|
-
|
|
224
|
-
**学习模式 (study_type)**:
|
|
225
|
-
- `1`: 自由式(可任意顺序学习)
|
|
226
|
-
- `2`: 解锁式(必须按顺序学习)
|
|
227
|
-
|
|
228
|
-
## 注意事项
|
|
229
|
-
|
|
230
|
-
1. **课程发布要求**: 课程至少需要一个课件才能发布
|
|
231
|
-
2. **分类必填**: 创建课程时必须指定分类ID
|
|
232
|
-
3. **素材先行**: 创建课件前必须先上传素材到素材库
|
|
233
|
-
4. **类型匹配**: 课件类型必须与素材类型匹配
|
|
234
|
-
5. **权限要求**: 需要相应的读写权限(`course:*:write` 或 `course:*:readonly`)
|
|
235
|
-
6. **认证要求**: 所有命令都需要先完成 `soke-cli auth login`
|
|
236
|
-
|
|
237
|
-
## 错误处理
|
|
238
|
-
|
|
239
|
-
### 权限不足
|
|
240
|
-
|
|
241
|
-
```bash
|
|
242
|
-
# 错误信息: Permission denied
|
|
243
|
-
# 解决方案: 检查是否已登录,并确认账号有相应权限
|
|
244
|
-
soke-cli auth login
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
### 时间范围超限
|
|
248
|
-
|
|
249
|
-
```bash
|
|
250
|
-
# 错误信息: Time range exceeds 365 days
|
|
251
|
-
# 解决方案: 缩小时间范围或分批查询
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
### 数据不存在
|
|
255
|
-
|
|
256
|
-
```bash
|
|
257
|
-
# 错误信息: Course not found
|
|
258
|
-
# 解决方案: 检查课程ID是否正确
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
## 相关文档
|
|
262
|
-
|
|
263
|
-
- [SKILL.md](./MODULE.md) - 完整的 Skill 文档和 API 参考
|
|
264
|
-
- [素材库管理 Skill](../soke-material/MODULE.md) - 文件上传和素材管理
|
|
265
|
-
- [课件管理 Skill](../soke-lesson/MODULE.md) - 课件创建和管理
|
|
266
|
-
- [共享配置 Skill](../soke-shared/MODULE.md) - 认证和配置管理
|
|
267
|
-
|
|
268
|
-
## Skill 架构
|
|
269
|
-
|
|
270
|
-
```
|
|
271
|
-
soke-course (主 skill)
|
|
272
|
-
├── 课程管理 (本 skill)
|
|
273
|
-
│ ├── +create (创建课程)
|
|
274
|
-
│ ├── +update (更新课程)
|
|
275
|
-
│ ├── +publish (发布课程)
|
|
276
|
-
│ └── 查询命令...
|
|
277
|
-
├── soke-lesson (子 skill - 课件管理)
|
|
278
|
-
│ ├── +lesson-create
|
|
279
|
-
│ ├── +lesson-get
|
|
280
|
-
│ └── +lesson-list
|
|
281
|
-
└── soke-material (子 skill - 素材管理)
|
|
282
|
-
├── file +upload
|
|
283
|
-
├── file +create
|
|
284
|
-
└── 查询命令...
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
## 版本历史
|
|
288
|
-
|
|
289
|
-
- v3.0.0 (2024-05-26): 重构为模块化架构,集成 soke-material 和 soke-lesson 子 skills
|
|
290
|
-
- v2.0.0 (2024-05-25): 添加课程创建和更新功能
|
|
291
|
-
- v1.0.0 (2024-05-14): 初始版本,支持课程查询、分类、学习记录等功能
|
|
1
|
+
# soke-course 课程主流程编排模块
|
|
2
|
+
|
|
3
|
+
授客AI课程主流程编排模块。负责课程创建、分类、模板、设置、发布、查询与维护,并编排同级模块完成素材、课件与指派。
|
|
4
|
+
|
|
5
|
+
## 职责
|
|
6
|
+
|
|
7
|
+
- 课程创建与分类(创建前必须真实查询分类)
|
|
8
|
+
- 课程模板与高级设置(创建后立即展示模板表)
|
|
9
|
+
- 课程发布、定时发布与发布前校验
|
|
10
|
+
- 学习进度与课程状态查询
|
|
11
|
+
- 课程关闭及其他维护路由
|
|
12
|
+
- 跨模块编排并传递真实 ID
|
|
13
|
+
|
|
14
|
+
## 不负责
|
|
15
|
+
|
|
16
|
+
- 素材上传(调用 `soke-material`)
|
|
17
|
+
- 课件创建(调用 `soke-lesson`)
|
|
18
|
+
- 指派实现(调用 `soke-assign`)
|
|
19
|
+
- 删除/复制课程、新建分类、收费、证书、AI 做课等(需后台)
|
|
20
|
+
|
|
21
|
+
## 入口
|
|
22
|
+
|
|
23
|
+
- [MODULE.md](./MODULE.md) — 模块合同与主流程(交互规范 / 意图路由 / 5 Phase / 批量)
|
|
24
|
+
- `subs/category/SOP.md` — 课程分类
|
|
25
|
+
- `subs/template/SOP.md` — 课程模板
|
|
26
|
+
- `subs/settings/SOP.md` — 课程设置
|
|
27
|
+
- `subs/publish/SOP.md` — 发布校验
|
|
28
|
+
- `subs/query/SOP.md` — 数据查询
|
|
29
|
+
- `subs/batch/SOP.md` — 多课程批量上传(B0-B7)
|
|
30
|
+
- `subs/assign/SOP.md` — 指派交互编排
|
|
31
|
+
- `subs/exam/SOP.md` — 小测验交互编排
|
|
32
|
+
- `subs/photo/SOP.md` — 图片链
|
|
33
|
+
- `subs/charge/SOP.md` — 收费后台话术
|
|
34
|
+
- `subs/copy/SOP.md` — 维护路由(关闭/删除/复制)
|
|
35
|
+
- `intent-cases.md` — 意图案例库
|
|
36
|
+
- `sop-publish-check.md` — 发布 Gate Check
|
|
37
|
+
- `cli-facts.md` — 命令参数事实源
|
|
38
|
+
|
|
39
|
+
## 并列模块
|
|
40
|
+
|
|
41
|
+
- [soke-material](../soke-material/MODULE.md)
|
|
42
|
+
- [soke-lesson](../soke-lesson/MODULE.md)
|
|
43
|
+
- [soke-assign](../soke-assign/MODULE.md)
|
|
44
|
+
- [soke-exam](../soke-exam/MODULE.md)
|
|
45
|
+
- [soke-photo-gallery](../soke-photo-gallery/MODULE.md)
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# CLI 事实表(唯一事实源)
|
|
2
|
+
|
|
3
|
+
> 实测于 soke-cli v1.0.77(2026-08-29)。本表为所有命令参数的唯一事实源;子 SOP 只写用法示例,参数以本表为准。
|
|
4
|
+
> 兜底规则:本表未覆盖的命令 → 跑 `soke-cli <cmd> --help` 实测后补录本表。
|
|
5
|
+
> 通用:所有命令支持 `--format json`(结构化输出推荐);时间戳均为毫秒。
|
|
6
|
+
> 返回契约:以下“必取字段”是进入下一步的最低要求;实际响应可能包裹在 `data/list/items` 中,先定位字段再继续。未知字段或未知状态不得按成功推断,需保留原始 JSON 并执行 `--help`/实测确认。
|
|
7
|
+
|
|
8
|
+
## course 组
|
|
9
|
+
|
|
10
|
+
### +create 创建课程
|
|
11
|
+
`--title`(必填) `--category-id`(必填) `--description`
|
|
12
|
+
返回最低字段:`course-id`、`title`、`status`。
|
|
13
|
+
|
|
14
|
+
### +update 更新/关闭课程
|
|
15
|
+
`--course-id`(必填) `--title` `--credit` `--description` `--category-id`
|
|
16
|
+
`--image`(封面,**只收图片库 photoUri**) `--image-x/y/w/h`(裁剪)
|
|
17
|
+
`--action` = update(默认) | **close(关闭课程,CLI 支持!删除才需后台)**
|
|
18
|
+
|
|
19
|
+
### +advanced 高级设置
|
|
20
|
+
`--course-id`(必填);`--study-type` 1自由/2解锁;`--is-accelerate` 倍速;`--is-drag`/`--drag-type` 拖动;
|
|
21
|
+
`--open-face-recognition` 课前人脸;`--is-first-face` 0不/1首次/2每次;`--learning-face-recognition`/`--face-recognition-times` 学习中人脸;
|
|
22
|
+
`--open-workrecord` 待办;`--allow-after-expiration` 截止后学习;`--is-remind`/`--remind-days`/`--remind-time`/`--remind-content` 未学提醒;
|
|
23
|
+
`--evaluate-required` 打星评价;`--is-hang`/`--hang-time`(≤60分) 文档防挂机;`--comment-switch` 评论;
|
|
24
|
+
`--image-file`(本地二维码图,内部传 OSS 不进图片库,jpg/jpeg/png) 与 `--image-oss-url` 二选一
|
|
25
|
+
|
|
26
|
+
### +publish 发布
|
|
27
|
+
`--course-id`(必填) `--publish-time`("YYYY-MM-DD HH:MM:SS" 北京时间;默认 0000-00-00 00:00:00=立即)
|
|
28
|
+
返回最低字段:`course-id`、`status`;定时发布另需回查 `publish-time`。
|
|
29
|
+
|
|
30
|
+
### +get-course / +list-courses
|
|
31
|
+
get: `--course-id`
|
|
32
|
+
list: `--keyword` `--category-path`(分类筛选,**不是 --category-id**) `--status`(0/1/2,**默认1**) `--is-in`(0外部/1内部,默认1) `--is-my` `--is-joint` `--joint-out` `--page` `--page-size`(默认10)
|
|
33
|
+
**⚠️ 无 --start-time/--end-time(旧文档的时间范围/365天限制对本命令不成立)**
|
|
34
|
+
|
|
35
|
+
### +list-categories
|
|
36
|
+
`--page` `--page-size`(max 100)。当前事实表未确认 `--parent-id`/`--level`,不得直接使用;如需末级分类,先按返回的 parent_id/level 递归查询或执行 --help 实测后补录。
|
|
37
|
+
|
|
38
|
+
### +lesson-create 创建课件
|
|
39
|
+
`--course-id`(必填) `--title` `--type` video/audio/photo_gallery/document/exam
|
|
40
|
+
非 exam:`--media-id`(素材UUID,**不是 --uuid**) `--filename` `--ext` `--filesize` `--object` `--length`(秒,**不是 --duration**)
|
|
41
|
+
exam:`--paper-id` 或 `--paper-title`(列表匹配) `--pool-id`(可选) `--minute`(默认30)/`--second`
|
|
42
|
+
通用:`--point` `--sort`
|
|
43
|
+
返回最低字段:`lesson-id`、`course-id`、`type`、`status`;非 exam 还需保留上传对象字段。
|
|
44
|
+
|
|
45
|
+
### +lesson-list / +lesson-get / +lesson-sort
|
|
46
|
+
list: `--course-id` `--keyword` `--type`(video/audio/image/document/link/live/exam/questionnaire/sign_in) `--page` `--limit`(默认10,**不是 --page-size**)
|
|
47
|
+
get: `--id`(课件ID,**不是 --lesson-id**)
|
|
48
|
+
sort: `--course-id` `--sort-list`("id1,id2,...",**不是 --order**)
|
|
49
|
+
|
|
50
|
+
### 学习数据查询
|
|
51
|
+
+list-course-users: `--course-id` `--finish-start-time`/`--finish-end-time`(**必传,跨度≤7天**,回归实测) `--userid-list`(逗号,≤100) `--page` `--page-size`
|
|
52
|
+
+get-course-user: `--course-id` `--dept-user-id`
|
|
53
|
+
+list-lesson-learns: `--lesson-id` `--course-id` `--userid-list` `--finish-start-time`/`--finish-end-time` `--page` `--page-size`
|
|
54
|
+
+list-lesson-faces: `--target-id`(=课件uuid,**不是 --lesson-id**) `--userid-list` `--page` `--page-size`(**无时间参数**)
|
|
55
|
+
|
|
56
|
+
## file 组(素材库)
|
|
57
|
+
|
|
58
|
+
+upload: `--file`(本地路径,**不是 --path**;不支持图片) `--type`(默认自动检测) `--length`(默认视频600/音频300/**文档120**) `--category-id` `--module`(默认material) `--object-name` `--storage`
|
|
59
|
+
返回最低字段:`uuid`、`filename`、`type`、`ext`、`filesize`、`object`、`length`;图片不得使用此命令。
|
|
60
|
+
list-files: **无 + 前缀** → `soke-cli file list-files --page --page-size`
|
|
61
|
+
get-info: **无 + 前缀** → `soke-cli file get-info --file-id`
|
|
62
|
+
+create: 创建素材库文件(已有 OSS 对象时)
|
|
63
|
+
|
|
64
|
+
## assign 组(指派)
|
|
65
|
+
|
|
66
|
+
+list-departments: `--keyword` `--parent-id`(默认"1"=仅顶级,**全树需递归**) `--page` `--limit`
|
|
67
|
+
+list-users: `--dept-id` `--keyword` `--search-target`(name/phone/job_number) `--list-all` `--is-in` `--page` `--limit`
|
|
68
|
+
+create: `--module`(course/exam/learning_map) `--target-id`(**不是 --module-id**) `--learn-type` **required/optional(不是 --compulsory 1|0)** `--user-ids` `--user-names`(对应) `--dept-ids` `--dept-names` `--date` `--set-message`/`--message-switch`/`--message-content`
|
|
69
|
+
返回最低字段:`target-id`、目标类型、实际指派数量和已存在/新增/失败明细。
|
|
70
|
+
+list: `--module` `--target-id` `--keyword` `--learn-type` `--page` `--limit`
|
|
71
|
+
|
|
72
|
+
## photo-gallery 组(图片库)
|
|
73
|
+
|
|
74
|
+
+create: `--file`(本地图片) `--title` `--category-id`(默认empty) → 返回 uuid/photoUri
|
|
75
|
+
+list: `--file-keyword` `--category-id` `--from` `--page` `--limit`
|
|
76
|
+
+get: `--uuid`(含完整访问 URL)
|
|
77
|
+
|
|
78
|
+
## exam 最小建题链(subs/exam 专用)
|
|
79
|
+
|
|
80
|
+
+create-pool: `--title` `--path`('["分类uuid"]') `--description` `--status`
|
|
81
|
+
+create-question: `--pool-id` `--type`(single_choice/choice/uncertain_choice/determine/fill/essay/material) `--title`(fill 用 `[[答案N]]`,**不传 --answer**) `--score`(>0) `--difficulty`(simple/medium/hard) `--choices`('[{"key":"A1","value":"A"}]') `--answer`(选择/判断为索引数组) `--answer-type`(fill) `--analysis`
|
|
82
|
+
+create-paper: `--title`(≤50) `--pool-id`('["pool_uuid"]') `--pattern`(questionType/random/selection/import) `--type-metas`(JSON: {"single_choice":{"count":N,"score":N},...})
|
|
83
|
+
+update-paper: `--paper-id` `--title`(**publish 必重传**) `--action publish`
|
|
84
|
+
+list-papers: `--page` `--page-size`(默认10) → 试卷列表(H1 选择试卷用,取 title/paper-id)
|
|
85
|
+
+get-paper: `--paper-id`(含完整字段与发布状态)
|
|
86
|
+
|
|
87
|
+
## clock 组(作业查询,只读;**--page/--page-size 强制必传**)
|
|
88
|
+
|
|
89
|
+
list-learnings: `--target-id`(课程ID) `--start-time`/`--end-time`(毫秒) `--page` `--page-size`
|
|
90
|
+
list-logs: `--clock-id`(来自 list-learnings) `--start-time`/`--end-time` `--page` `--page-size`
|
|
91
|
+
list-log-lessons: `--target-id`(提交ID,来自 list-logs) `--page` `--page-size`
|
|
92
|
+
|
|
93
|
+
## 漂移修正表(旧文档 → 实际)
|
|
94
|
+
|
|
95
|
+
| 旧 | 实际 |
|
|
96
|
+
|----|------|
|
|
97
|
+
| file +upload --path | --file |
|
|
98
|
+
| file +list-files / +get-info | 无 + 前缀 |
|
|
99
|
+
| lesson-create --uuid / --duration | --media-id / --length |
|
|
100
|
+
| lesson-get --lesson-id | --id |
|
|
101
|
+
| lesson-sort --order | --sort-list |
|
|
102
|
+
| lesson-list --page-size | --limit |
|
|
103
|
+
| list-courses --start-time/--end-time/--category-id | 不存在;用 --keyword/--category-path |
|
|
104
|
+
| list-lesson-faces --lesson-id + 时间范围 | --target-id,无时间参数 |
|
|
105
|
+
| assign --module-id / --compulsory 1\|0 | --target-id / --learn-type required\|optional |
|
|
106
|
+
| 关闭课程仅后台 | +update --action close |
|
|
107
|
+
| 文档默认时长 0s | 120s |
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 意图案例库(Gate 0 路由参考)
|
|
2
|
+
|
|
3
|
+
> 本文件承载「显式调用本技能但意图不明」时的路由判定案例,供 Gate 0 兜底决策。命令参数以 `cli-facts.md` 为准。
|
|
4
|
+
|
|
5
|
+
## 路由总表
|
|
6
|
+
|
|
7
|
+
| 用户说法(示例) | 判定意图 | 路由 |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| 创建/新建/做课/开课/上传课程 | create | Phase 1 全流程 |
|
|
10
|
+
| 加课件/传视频/调顺序 | add_lesson | Phase 2(需 course-id) |
|
|
11
|
+
| 改学分/换封面/开倍速/人脸/提醒 | settings | Phase 3 |
|
|
12
|
+
| 指派/必修/选修 | assign | Phase 4(发布前) |
|
|
13
|
+
| 发布/上线/定时发布 | publish | Phase 4(最后一步,仅明确 E1 执行) |
|
|
14
|
+
| 进度/完成率/谁学了/作业提交 | query | Phase 5 |
|
|
15
|
+
| 关闭/删除/复制 | maintain | Phase 5 维护 |
|
|
16
|
+
| 有哪些分类/查分类 | category | read subs/category |
|
|
17
|
+
|
|
18
|
+
## 上下文规则
|
|
19
|
+
|
|
20
|
+
- **有 course-id** → 当前课程操作,不新建。
|
|
21
|
+
- **学习统计未指定课程** → 先列已发布线上课前 20 个 + 表格下方提示,选定后再查统计。
|
|
22
|
+
- **有文件附件** → 倾向课件(add_lesson / Phase 2)。
|
|
23
|
+
- **歧义** → 弹窗列可能操作。
|
|
24
|
+
- **显式调用本技能且意图不明或与课程无关** → 默认走创建/上传主流程(提示输入标题 → 收集 A/B/C),不展开无关话题。
|
|
25
|
+
- **含明确他意图**(查询/发布/指派/设置/维护)→ 对应 Phase。
|
|
26
|
+
|
|
27
|
+
## 兜底示例
|
|
28
|
+
|
|
29
|
+
| 用户说法 | 判定 | 说明 |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| 「帮我做个课」 | create | 进入 Phase 1,提示输入标题 |
|
|
32
|
+
| 「把 xxx.mp4 传上去」 | add_lesson | 有文件附件 → 倾向课件,需 course-id |
|
|
33
|
+
| 「课程 123 学分改成 5」 | settings | 有 course-id + 设置意图 |
|
|
34
|
+
| 「这课谁学了」 | query | 未指定课程 → 先列前 20 已发布课 |
|
|
35
|
+
| 「随便,你看着办」 | create | 意图不明 → 默认创建主流程 |
|
|
36
|
+
| 「帮我把课程关了」 | maintain | 关闭场景 |
|
|
37
|
+
|
|
38
|
+
## 边界
|
|
39
|
+
|
|
40
|
+
- 本文件只做意图判定,不做业务执行;执行细节以各 Phase 与 subs SOP 为准。
|
|
41
|
+
- 与课程无关的闲聊/他领域请求,不在此展开,直接回落到对应技能或澄清。
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# soke-course v6 环境就绪检查(自包含版:无并列技能依赖)
|
|
3
|
+
set -e
|
|
4
|
+
BASE_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
5
|
+
|
|
6
|
+
echo "🔍 课程发布主管 v6 — 环境检查"
|
|
7
|
+
echo "============================"
|
|
8
|
+
|
|
9
|
+
echo "🔧 命令行工具:"
|
|
10
|
+
if ! command -v soke-cli &> /dev/null; then
|
|
11
|
+
echo " ❌ soke-cli 未安装 — 请 Read ../../shared/installation.md 按步骤安装"
|
|
12
|
+
exit 1
|
|
13
|
+
fi
|
|
14
|
+
echo " ✅ soke-cli: $(soke-cli --version)"
|
|
15
|
+
|
|
16
|
+
CONFIG=$(soke-cli config show 2>/dev/null || echo "")
|
|
17
|
+
# config show 使用中文标签「用户凭证」,不能只匹配旧字段名。
|
|
18
|
+
TOKEN_LINE=$(printf '%s\n' "$CONFIG" | grep -E '^用户凭证:' || true)
|
|
19
|
+
TOKEN_VALUE=$(printf '%s\n' "$TOKEN_LINE" | sed 's/^用户凭证:[[:space:]]*//')
|
|
20
|
+
if [ -n "$TOKEN_VALUE" ] && [ "$TOKEN_VALUE" != "(未设置)" ]; then
|
|
21
|
+
echo " ✅ 已登录"
|
|
22
|
+
else
|
|
23
|
+
echo " ⚠️ 未登录或 Token 过期 — 将由主流程自动执行网页登录授权"
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
echo "📁 子能力 SOP (subs/):"
|
|
27
|
+
for sub in category settings charge publish copy query template batch assign exam photo; do
|
|
28
|
+
if [ -f "$BASE_DIR/subs/$sub/SOP.md" ]; then
|
|
29
|
+
echo " ✅ $sub"
|
|
30
|
+
else
|
|
31
|
+
echo " ❌ $sub (缺失)"
|
|
32
|
+
fi
|
|
33
|
+
done
|
|
34
|
+
|
|
35
|
+
echo "📚 参考文档:"
|
|
36
|
+
for ref in cli-facts.md intent-cases.md sop-publish-check.md; do
|
|
37
|
+
if [ -f "$BASE_DIR/$ref" ]; then
|
|
38
|
+
echo " ✅ $ref"
|
|
39
|
+
else
|
|
40
|
+
echo " ❌ $ref (缺失)"
|
|
41
|
+
fi
|
|
42
|
+
done
|
|
43
|
+
|
|
44
|
+
echo ""
|
|
45
|
+
echo "✅ 环境检查完成"
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# 发布 Gate Check(课程发布前校验)
|
|
2
|
+
|
|
3
|
+
> 本文件是发布状态流转与 Gate Check 矩阵的唯一定义。执行动作见 `subs/publish/SOP.md`。参数以 `cli-facts.md` 为准。
|
|
4
|
+
|
|
5
|
+
## 状态流转(收敛定案)
|
|
6
|
+
|
|
7
|
+
- 0 未发布 → 1 已发布:`course +publish`;
|
|
8
|
+
- 1 → 2 已关闭:`course +update --action close`(**CLI 支持**;删除才需后台);
|
|
9
|
+
- 2 → 1:**已关闭可重新发布**。
|
|
10
|
+
|
|
11
|
+
## 立即发布 Gate Check(6 项)
|
|
12
|
+
|
|
13
|
+
| # | 检查项 | 阻塞级别 |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| 1 | 标题非空 | 🔴 阻塞 |
|
|
16
|
+
| 2 | 分类已设置 | 🔴 阻塞 |
|
|
17
|
+
| 3 | 课件数量 ≥ 1 | 🔴 阻塞 |
|
|
18
|
+
| 4 | 无转码失败课件 | 🔴 阻塞 |
|
|
19
|
+
| 5 | 转码中的课件 | 🟡 警告 |
|
|
20
|
+
| 6 | 其他非硬项(后台待配项) | 🟡 警告 |
|
|
21
|
+
|
|
22
|
+
规则:
|
|
23
|
+
|
|
24
|
+
- 🔴 阻塞 → 列全部阻塞项 + 修复指引 → 停止发布;
|
|
25
|
+
- 仅 🟡 → 弹窗「有 X 项警告,确认继续发布吗?」(发布警告用原生弹窗);
|
|
26
|
+
- 转码中/失败不得进入发布执行。
|
|
27
|
+
|
|
28
|
+
## 关闭场景额外检查(第 7 项)
|
|
29
|
+
|
|
30
|
+
- **7. 关闭前确认无学习地图关联**(有关联需先解除或引导后台处理)。
|
|
31
|
+
|
|
32
|
+
## 回查规则
|
|
33
|
+
|
|
34
|
+
- 立即发布:执行 `course +publish` 后回查 status==1。
|
|
35
|
+
- 定时发布:回查 publish_time,未到时间时允许 status 仍为 0。
|
|
36
|
+
- 执行前重新获取课程状态并再次 Gate Check,确认仍是当前课程与计划。
|
|
37
|
+
|
|
38
|
+
## 输出标准
|
|
39
|
+
|
|
40
|
+
- 成功:✅ 课程发布成功 / 标题 / ID / status=1 / 学员端可见。
|
|
41
|
+
- 定时:✅ 已设置定时发布 / 标题 / ID / publish_time / 当前 status=0(到点后回查)。
|
|
42
|
+
- 不通过:❌ 逐项 [✓]/[✗] 列表 + 修复指引。
|
|
43
|
+
|
|
44
|
+
## ⚠️ CLI 不支持
|
|
45
|
+
|
|
46
|
+
审批流(后台→系统设置→审批设置;默认关闭)、批量发布(后台)、删除课程(后台,不可逆)。
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# 指派子 SOP(课程流程编排视角)
|
|
2
|
+
|
|
3
|
+
> 本 SOP 只承载「课程创建/上传流程中」的指派交互编排规则;指派命令的真实参数以 `../../cli-facts.md` 的 assign 组为准,指派实现细节见 `../../../soke-assign/MODULE.md`。
|
|
4
|
+
|
|
5
|
+
## 触发
|
|
6
|
+
|
|
7
|
+
Phase 4 弹窗1 用户选择「1. 指派(推荐)」后触发本 SOP。
|
|
8
|
+
|
|
9
|
+
## 交互顺序(硬规则)
|
|
10
|
+
|
|
11
|
+
1. 弹窗1 确认指派后,紧接着固定收集两问:**学习类型(F1 必修 / F2 选修)| 指派对象(部门指派 / 人员指派)**。
|
|
12
|
+
2. **G2(不指派)不出现学习类型问,也不出现指派部门/人员问**。
|
|
13
|
+
3. 指派对象选项**隐藏用户组/职位**,只保留「部门指派 / 人员指派」。
|
|
14
|
+
|
|
15
|
+
## 部门指派
|
|
16
|
+
|
|
17
|
+
- 用户选部门指派后,**先执行 `assign +list-departments` 递归拉取部门树**,再使用原生选择弹窗罗列部门名称和成员数;**不能只要求用户输入部门名称**。
|
|
18
|
+
- 用户选定部门后,执行 `assign +create`,使用 `--dept-ids`/`--dept-names`。
|
|
19
|
+
- `--learn-type` 用 `required`(F1 必修)/ `optional`(F2 选修),**不是** `--compulsory 1|0`。
|
|
20
|
+
|
|
21
|
+
## 人员指派
|
|
22
|
+
|
|
23
|
+
- 用户选人员指派后,用关键词 `assign +list-users` 编号选定用户。
|
|
24
|
+
- 用户选定人员后,执行 `assign +create`,使用 `--user-ids`/`--user-names`。
|
|
25
|
+
|
|
26
|
+
## 完成判定
|
|
27
|
+
|
|
28
|
+
指派真正成功,当且仅当 `assign +list`(基于 `--target-id` 资源 ID 查询)能查到对应用户/部门的指派记录,且 `--learn-type` 标记与请求一致。仅 `+create` 回显成功但 `+list` 查不到的,视为未完成,不得报告「指派成功」。
|
|
29
|
+
|
|
30
|
+
## 前置条件
|
|
31
|
+
|
|
32
|
+
- 未发布课程同样可以指派,无「先发布才能指派」限制。
|
|
33
|
+
- 批量指派建议单次不超过 500 人,超出分批处理。
|
|
34
|
+
|
|
35
|
+
## 检查清单
|
|
36
|
+
|
|
37
|
+
- [ ] 弹窗2 已收集指派对象 + 学习类型(G2 跳过学习类型)
|
|
38
|
+
- [ ] 部门指派已先拉部门树并用原生弹窗罗列,未要求用户裸输部门名
|
|
39
|
+
- [ ] `--learn-type` 用 required/optional,未使用旧参数 --compulsory
|
|
40
|
+
- [ ] 指派完成后用 assign +list 回读验证(查不到=未完成)
|