@sokeai/cli 1.0.63 → 1.0.65
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/skills/.claude/settings.local.json +7 -0
- package/skills/soke-ai-training/SKILL.md +138 -3
- package/skills/soke-assign/SKILL.md +58 -338
- package/skills/soke-course/SKILL.md +310 -417
- package/skills/soke-course/agents/openai.yaml +7 -0
- package/skills/soke-course/examples/create-basic.md +70 -0
- package/skills/soke-course/references/intent-cases.md +99 -0
- package/skills/soke-course/references/sop-full-workflow.md +172 -0
- package/skills/soke-course/references/sop-lesson-types.md +66 -0
- package/skills/soke-course/references/sop-publish-check.md +74 -0
- package/skills/soke-course/references/subs/ai/SOP.md +153 -0
- package/skills/soke-course/references/subs/category/SOP.md +112 -0
- package/skills/soke-course/references/subs/charge/SOP.md +107 -0
- package/skills/soke-course/references/subs/copy/SOP.md +80 -0
- package/skills/soke-course/references/subs/publish/SOP.md +138 -0
- package/skills/soke-course/references/subs/query/SOP.md +163 -0
- package/skills/soke-course/references/subs/settings/SOP.md +74 -0
- package/skills/soke-course/references/subs/template/SOP.md +223 -0
- package/skills/soke-course/references/troubleshoot.md +68 -0
- package/skills/soke-course/scripts/check_readiness.sh +82 -0
- package/skills/soke-lesson/SKILL.md +78 -472
- package/skills/soke-material/SKILL.md +64 -349
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: soke-course-category
|
|
3
|
+
version: 1.1.0
|
|
4
|
+
description: 分类管理 — 查询课程分类体系(6级层级),移动端展示前3级
|
|
5
|
+
tags: [soke, category, classification, hierarchy]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 分类管理
|
|
9
|
+
|
|
10
|
+
## 触发描述
|
|
11
|
+
|
|
12
|
+
在创建课程前需要选择或查询课程所属分类时触发。分类体系为 6 级树形层级结构,移动端仅展示前 3 级。
|
|
13
|
+
|
|
14
|
+
## 分类体系
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
一级分类
|
|
18
|
+
└── 二级分类
|
|
19
|
+
└── 三级分类
|
|
20
|
+
└── 四级分类
|
|
21
|
+
└── 五级分类
|
|
22
|
+
└── 六级分类
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- **管理后台**:展示完整 6 级
|
|
26
|
+
- **移动端(学员侧)**:仅展示前 3 级(一二三级)
|
|
27
|
+
|
|
28
|
+
## 执行流程
|
|
29
|
+
|
|
30
|
+
### Step 1: 查询分类 `course +list-categories`
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
soke course +list-categories
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
无必填参数,返回当前租户下完整的分类树。
|
|
37
|
+
|
|
38
|
+
可选参数:
|
|
39
|
+
|
|
40
|
+
| 参数 | 必填 | 说明 |
|
|
41
|
+
|------|------|------|
|
|
42
|
+
| `--parent-id` | 否 | 查询指定父分类下的子分类 |
|
|
43
|
+
| `--level` | 否 | 按层级过滤(1-6) |
|
|
44
|
+
|
|
45
|
+
返回每个分类的 `id`、`name`、`parent_id`、`level`。
|
|
46
|
+
|
|
47
|
+
### Step 2: 分类选择(弹窗交互)
|
|
48
|
+
|
|
49
|
+
根据匹配结果使用 `ask_user_question` 弹窗:
|
|
50
|
+
|
|
51
|
+
| 场景 | 弹窗策略 |
|
|
52
|
+
|------|---------|
|
|
53
|
+
| 用户已指定分类名,匹配到唯一结果 | 不弹窗,直接使用 |
|
|
54
|
+
| 匹配到多个结果 | 弹窗列匹配项,最后加 `🆕 新建分类` |
|
|
55
|
+
| 用户未指定分类 | 弹窗列一级分类列表,最后加 `🆕 新建分类` |
|
|
56
|
+
| 用户说"随便" | 取第一个一级分类 |
|
|
57
|
+
|
|
58
|
+
弹窗示例:
|
|
59
|
+
```
|
|
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: "前往管理后台新建分类"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Step 3: 新建分类(CLI 不支持)
|
|
71
|
+
|
|
72
|
+
若用户选择 `🆕 新建分类`,告知操作路径:
|
|
73
|
+
|
|
74
|
+
> "CLI 暂不支持新建分类。请前往管理后台操作:
|
|
75
|
+
> **后台 → 课程管理 → 分类设置 → 新增分类**
|
|
76
|
+
>
|
|
77
|
+
> 创建时会要求填写:分类名称、选择父级分类、设定排序序号。
|
|
78
|
+
> 分类可分六级,手机端学员只能看到前三级。
|
|
79
|
+
>
|
|
80
|
+
> 新建完成后请回复"分类建好了",我将重新拉取分类列表继续。"
|
|
81
|
+
|
|
82
|
+
用户确认后 → 重新执行 Step 1 → 再弹窗选择。
|
|
83
|
+
|
|
84
|
+
## 输出标准
|
|
85
|
+
|
|
86
|
+
以缩进层级列表形式展示分类树(供参考,弹窗交互时不需要打印全部):
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
📁 技术研发 (ID: 1, L1)
|
|
90
|
+
📁 前端开发 (ID: 12, L2)
|
|
91
|
+
📁 React (ID: 121, L3)
|
|
92
|
+
📁 基础入门 (ID: 1211, L4)
|
|
93
|
+
...
|
|
94
|
+
📁 企业管理 (ID: 2, L1)
|
|
95
|
+
...
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 注意事项
|
|
99
|
+
|
|
100
|
+
1. 分类为租户级别数据,不同租户分类体系独立
|
|
101
|
+
2. 课程必须归属于一个末级分类(通常是第 4-6 级)
|
|
102
|
+
3. 移动端仅展示前 3 级,创建分类时需考虑移动端用户体验
|
|
103
|
+
4. 删除分类前需清空该分类下的所有课程
|
|
104
|
+
5. 分类层级一旦确定不建议频繁调整,会影响已有课程归类
|
|
105
|
+
|
|
106
|
+
## 检查清单
|
|
107
|
+
|
|
108
|
+
- [ ] 已通过 list-categories 获取完整分类树
|
|
109
|
+
- [ ] 选择分类时已使用 `ask_user_question` 弹窗
|
|
110
|
+
- [ ] 弹窗最后一项始终为 `🆕 新建分类`
|
|
111
|
+
- [ ] 用户选新建时已告知后台操作路径
|
|
112
|
+
- [ ] 确认目标分类 ID 存在于返回结果中
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: soke-course-charge
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: 收费设置 — 付费课程与试学规则说明,全部需后台操作
|
|
5
|
+
tags: [soke, charge, pricing, payment, trial, alipay]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 收费设置
|
|
9
|
+
|
|
10
|
+
## 触发描述
|
|
11
|
+
|
|
12
|
+
用户需要为课程配置收费模式、设置价格、开通试学功能时触发本技能。**全部收费相关操作均需通过管理后台完成,CLI 不支持任何收费配置。**
|
|
13
|
+
|
|
14
|
+
## ⚠️ CLI 不支持
|
|
15
|
+
|
|
16
|
+
**所有收费设置操作均需通过后台:**
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
后台 → 课程管理 → 课程列表 → 编辑 → 收费设置
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 收费规则说明
|
|
23
|
+
|
|
24
|
+
### 1. 支付宝商户密钥
|
|
25
|
+
|
|
26
|
+
配置收费前必须先在系统层面绑定支付宝商户密钥:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
后台 → 系统设置 → 支付设置 → 支付宝配置
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
需提供:
|
|
33
|
+
- 支付宝商户 PID
|
|
34
|
+
- 支付宝商户密钥(MD5 Key)
|
|
35
|
+
- 支付宝公钥
|
|
36
|
+
|
|
37
|
+
未配置商户密钥将无法开启任何课程收费。
|
|
38
|
+
|
|
39
|
+
### 2. 付费课程试学规则
|
|
40
|
+
|
|
41
|
+
试学功能仅在**同时满足以下所有条件**时可用:
|
|
42
|
+
|
|
43
|
+
| 条件 | 说明 |
|
|
44
|
+
|------|------|
|
|
45
|
+
| 课程为付费课程 | 已设定价格且支付通道可用 |
|
|
46
|
+
| 课件数量 ≥ 2 | 课程内至少有 2 节课时 |
|
|
47
|
+
| 课件类型含视频/音频/文档 | 课时中包含 `video`、`audio` 或 `document` 类型的课件 |
|
|
48
|
+
|
|
49
|
+
> ⚠️ 纯图文课件(不含视频/音频/文档)不满足试学条件。
|
|
50
|
+
|
|
51
|
+
**试学模式规则:**
|
|
52
|
+
|
|
53
|
+
- 试学期间学员可免费观看指定数量的课件
|
|
54
|
+
- 试学不记录学习进度 — 付费购买后从第 1 节重新开始
|
|
55
|
+
- 试学可配置开放课时数(如开放前 2 节)
|
|
56
|
+
- 试学可配置时间限制(如 7 天内有效)
|
|
57
|
+
|
|
58
|
+
### 3. 价格设置
|
|
59
|
+
|
|
60
|
+
- 支持固定价格(一口价)
|
|
61
|
+
- 支持划线价(原价 ¥199 → 现价 ¥99)
|
|
62
|
+
- 支持限时优惠(设置优惠截止时间)
|
|
63
|
+
- 价格单位为人民币(元),精确到小数点后两位
|
|
64
|
+
|
|
65
|
+
### 4. 学员端行为
|
|
66
|
+
|
|
67
|
+
- 免费课程:学员直接加入学习
|
|
68
|
+
- 付费课程未购买:可试学(如已开启),或看到课程介绍页 + 购买按钮
|
|
69
|
+
- 付费课程已购买:正常学习,记录进度,可获得证书(如已配置)
|
|
70
|
+
|
|
71
|
+
## 输出标准
|
|
72
|
+
|
|
73
|
+
当用户询问收费设置时,输出:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
⚠️ 收费设置为后台操作,CLI 不支持
|
|
77
|
+
|
|
78
|
+
配置路径:后台 → 课程管理 → 课程列表 → 编辑 → 收费设置
|
|
79
|
+
|
|
80
|
+
前置条件:
|
|
81
|
+
1. 支付宝商户密钥已配置(系统设置 → 支付设置)
|
|
82
|
+
2. 课程已创建且课件已添加
|
|
83
|
+
|
|
84
|
+
试学条件:
|
|
85
|
+
- 付费课程
|
|
86
|
+
- 课件 ≥ 2 节
|
|
87
|
+
- 包含 video/audio/document 类型课件
|
|
88
|
+
- 试学不记录学习进度
|
|
89
|
+
|
|
90
|
+
如需配置,请前往后台操作。
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## 注意事项
|
|
94
|
+
|
|
95
|
+
1. 收费是课程的高级属性,与课程发布状态无关 — 未发布的课程也可以配置收费
|
|
96
|
+
2. 修改价格不会影响已购买学员,已支付订单不受影响
|
|
97
|
+
3. 关闭收费(改为免费)后,已购学员权益保留,新学员免费学习
|
|
98
|
+
4. 试学课件必须在课程课件列表中,不能额外上传独立试学内容
|
|
99
|
+
5. 试学数据与正式学习数据完全隔离,不产生进度混淆
|
|
100
|
+
6. 退款、发票等支付后操作不在此 Skill 范围,需走财务后台流程
|
|
101
|
+
|
|
102
|
+
## 检查清单
|
|
103
|
+
|
|
104
|
+
- [ ] 用户已了解收费配置全部需后台操作
|
|
105
|
+
- [ ] 如涉及试学,已告知前置条件(付费 + 课件≥2 + 含视频/音频/文档)
|
|
106
|
+
- [ ] 如涉及支付,已提醒支付宝商户密钥配置前置
|
|
107
|
+
- [ ] 已提醒试学不记录学习进度的关键规则
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: soke-course-copy
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: 课程复制 — 复制规则说明,全部需后台操作
|
|
5
|
+
tags: [soke, copy, duplicate, clone, course]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 课程复制
|
|
9
|
+
|
|
10
|
+
## 触发描述
|
|
11
|
+
|
|
12
|
+
用户需要基于已有课程创建副本时触发本技能。**课程复制的所有操作均需通过管理后台完成,CLI 不支持。**
|
|
13
|
+
|
|
14
|
+
## ⚠️ CLI 不支持
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
后台 → 课程管理 → 课程列表 → 课程操作 → 复制
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## 复制规则
|
|
21
|
+
|
|
22
|
+
### 会复制的内容
|
|
23
|
+
|
|
24
|
+
| 内容 | 复制后状态 | 说明 |
|
|
25
|
+
|------|-----------|------|
|
|
26
|
+
| **课件(lessons)** | 进度归零 (progress=0) | 所有课件完整复制,但学习计数从 0 开始 |
|
|
27
|
+
| **素材(materials)** | 完整复制 | 课件关联的素材资源(视频/音频/文档)完整复制 |
|
|
28
|
+
| **作业(homework)** | 完整复制 | 作业配置和内容一并复制 |
|
|
29
|
+
| **测验(quizzes)** | 作为新考试复制 | 原有测验以独立的新考试形式复制到新课程中 |
|
|
30
|
+
| **基础设置** | 完整复制 | 标题(可追加"-副本")、描述、分类等基础信息 |
|
|
31
|
+
| **高级设置** | 除钉钉二维码外全部复制 | 学习模式、人脸识别、提醒、评价、证书、签名等均复制 |
|
|
32
|
+
| **收费设置** | 完整复制 | 价格、试学配置等收费设置一并复制 |
|
|
33
|
+
|
|
34
|
+
### 不会复制的内容
|
|
35
|
+
|
|
36
|
+
| 内容 | 原因 |
|
|
37
|
+
|------|------|
|
|
38
|
+
| **钉钉二维码** | 群二维码与具体课程绑定,新课程需重新上传 |
|
|
39
|
+
|
|
40
|
+
### 复制结果
|
|
41
|
+
|
|
42
|
+
- 新课程进入 **未发布列表**(status=0)
|
|
43
|
+
- 所有学习进度归零(progress=0)
|
|
44
|
+
- 与原课程数据完全隔离,互不干扰
|
|
45
|
+
- 新课程标题默认追加"-副本"后缀,可手动修改
|
|
46
|
+
|
|
47
|
+
## 输出标准
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
⚠️ 课程复制为后台操作,CLI 不支持
|
|
51
|
+
|
|
52
|
+
操作路径:后台 → 课程管理 → 课程列表 → 找到目标课程 → 操作 → 复制
|
|
53
|
+
|
|
54
|
+
复制规则:
|
|
55
|
+
✅ 会复制:课件(progress=0)、素材、作业、测验(新考试)、基础设置、
|
|
56
|
+
高级设置(除钉钉二维码)、收费设置
|
|
57
|
+
❌ 不复制:钉钉二维码
|
|
58
|
+
|
|
59
|
+
复制结果:
|
|
60
|
+
- 新课程进入未发布列表 (status=0)
|
|
61
|
+
- 所有进度归零
|
|
62
|
+
- 数据与原课程完全隔离
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 注意事项
|
|
66
|
+
|
|
67
|
+
1. 复制操作为异步任务,大课程(课件数 > 100)可能耗时较长
|
|
68
|
+
2. 视频素材引用原始文件而非物理复制,不占用额外存储空间
|
|
69
|
+
3. 复制后的课程标题自动追加"-副本",建议手动修改为目标标题
|
|
70
|
+
4. 复制不携带原课程的学习数据(学习人数、完成率、评价等)
|
|
71
|
+
5. 收费设置虽然复制,但建议检查价格和试学配置是否正确
|
|
72
|
+
6. 作业和测验作为新的独立实体存在,修改副本不影响原课程
|
|
73
|
+
7. 钉钉群二维码需为复制后的课程重新上传
|
|
74
|
+
|
|
75
|
+
## 检查清单
|
|
76
|
+
|
|
77
|
+
- [ ] 已告知用户课程复制需后台操作
|
|
78
|
+
- [ ] 已说明复制范围(哪些会/不会复制)
|
|
79
|
+
- [ ] 已提醒复制后进入未发布列表,进度归零
|
|
80
|
+
- [ ] 已提醒钉钉二维码不会复制,需手动补充
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: soke-course-publish
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: 发布管理 — 发布前 Gate Check 五道校验 + 发布操作,含状态流转与审批规则
|
|
5
|
+
tags: [soke, publish, gate-check, status, approval]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 发布管理
|
|
9
|
+
|
|
10
|
+
## 触发描述
|
|
11
|
+
|
|
12
|
+
课程内容与设置准备就绪后,需要将课程发布上线供学员学习时触发本技能。发布前需通过 Gate Check 五道校验,通过后方可执行发布操作。
|
|
13
|
+
|
|
14
|
+
## 课程状态流转
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
┌──────────┐ 发布 ┌──────────┐
|
|
18
|
+
│ 0: 未发布 │ ──────────→ │ 1: 已发布 │
|
|
19
|
+
└──────────┘ └─────┬────┘
|
|
20
|
+
↑ │
|
|
21
|
+
│ 关闭 │
|
|
22
|
+
└───────────────────────────┘
|
|
23
|
+
← 重新发布
|
|
24
|
+
|
|
25
|
+
┌──────────┐
|
|
26
|
+
│ 2: 已关闭 │
|
|
27
|
+
└──────────┘
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| 状态码 | 含义 | 说明 |
|
|
31
|
+
|--------|------|------|
|
|
32
|
+
| `0` | 未发布 | 课程初始状态,可编辑,学员不可见 |
|
|
33
|
+
| `1` | 已发布 | 已上线,学员可见可学习 |
|
|
34
|
+
| `2` | 已关闭 | 已下线,学员不可见,可重新发布 |
|
|
35
|
+
|
|
36
|
+
> 已关闭 (status=2) 的课程可重新发布回到 status=1,也可继续编辑后重新发布。
|
|
37
|
+
|
|
38
|
+
## 执行流程
|
|
39
|
+
|
|
40
|
+
### 第一步:Gate Check(发布前置校验)
|
|
41
|
+
|
|
42
|
+
执行 `course +publish` 前,系统自动完成以下 5 项校验。**任何一项不通过则发布失败。**
|
|
43
|
+
|
|
44
|
+
| 序号 | 校验项 | 通过条件 | 不通过提示 |
|
|
45
|
+
|------|--------|----------|-----------|
|
|
46
|
+
| 1 | **标题** | 课程标题不为空 | "请填写课程标题" |
|
|
47
|
+
| 2 | **分类** | 已选择课程所属分类 | "请选择课程分类" |
|
|
48
|
+
| 3 | **课件 ≥ 1** | 课程下至少有 1 节课件 | "请至少添加一节课件" |
|
|
49
|
+
| 4 | **无转码失败课件** | 所有视频/音频课件转码状态为成功 | "存在转码失败的课件,请重新上传" |
|
|
50
|
+
| 5 | **无转码中课件** | 没有正在转码的课件(转码完成后才可发布) | "课件转码中,请稍候再发布" |
|
|
51
|
+
|
|
52
|
+
> 文档类课件无需转码,校验项 4、5 仅针对视频和音频课件。
|
|
53
|
+
|
|
54
|
+
### 第二步:执行发布 `course +publish`
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
soke course +publish --course-id <courseId>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
| 参数 | 必填 | 说明 |
|
|
61
|
+
|------|------|------|
|
|
62
|
+
| `--course-id` | 是 | 课程 ID |
|
|
63
|
+
|
|
64
|
+
发布成功后课程状态由 `0` → `1`。
|
|
65
|
+
|
|
66
|
+
## ⚠️ CLI 不支持的操作
|
|
67
|
+
|
|
68
|
+
| 操作 | 说明 | 替代路径 |
|
|
69
|
+
|------|------|---------|
|
|
70
|
+
| **定时发布** | 设置未来时间自动发布 | 后台 → 课程管理 → 发布设置 → 定时发布 |
|
|
71
|
+
| **审批流** | 发布需经过审批流程 | 后台 → 系统设置 → 审批设置 |
|
|
72
|
+
| **批量发布** | 一次发布多门课程 | 后台 → 课程管理 → 批量操作 |
|
|
73
|
+
| **关闭课程** | 将已发布课程下线 | 后台 → 课程管理 → 课程操作 → 关闭 |
|
|
74
|
+
| **删除课程** | 物理删除课程及所有数据 | 后台 → 课程管理 → 课程操作 → 删除 |
|
|
75
|
+
|
|
76
|
+
## 审批规则
|
|
77
|
+
|
|
78
|
+
### 默认审批配置
|
|
79
|
+
|
|
80
|
+
| 配置项 | 默认值 | 说明 |
|
|
81
|
+
|--------|--------|------|
|
|
82
|
+
| 审批开关 | **关闭** | 默认不启用审批流,发布即上线 |
|
|
83
|
+
| 审批流层级 | 1 级 | 如需开启,仅支持 1 级审批 |
|
|
84
|
+
| 第一级审批人 | **不可删除** | 审批流至少保留 1 个审批节点 |
|
|
85
|
+
| 默认审批人 | **主管理员** | 系统默认审批人为租户主管理员 |
|
|
86
|
+
| 审批模式 | **或签** | 第一级多个审批人时,任一人通过即可 |
|
|
87
|
+
|
|
88
|
+
### 开启审批流
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
后台 → 系统设置 → 审批设置 → 课程发布审批
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
开启后,发布操作将生成审批单,审批通过后课程才正式上线(status 变为 1)。
|
|
95
|
+
|
|
96
|
+
## 输出标准
|
|
97
|
+
|
|
98
|
+
发布成功:
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
✅ 课程发布成功
|
|
102
|
+
- 课程: {title} (ID: {courseId})
|
|
103
|
+
- 状态: 已发布 (status=1)
|
|
104
|
+
- 学员端已可见
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Gate Check 不通过(示例):
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
❌ 发布校验未通过
|
|
111
|
+
- [✗] 标题:请填写课程标题
|
|
112
|
+
- [✓] 分类:已选择
|
|
113
|
+
- [✗] 课件:请至少添加一节课件
|
|
114
|
+
- [✓] 转码失败:无
|
|
115
|
+
- [✓] 转码中:无
|
|
116
|
+
|
|
117
|
+
请完成上述校验项后重新发布。
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## 注意事项
|
|
121
|
+
|
|
122
|
+
1. 先过 Gate Check,再执行 publish — 校验项全部通过是发布的必要条件
|
|
123
|
+
2. 转码是异步过程,上传视频/音频后需等待转码完成再发布
|
|
124
|
+
3. 课程关闭后学员端不可见,但历史学习记录保留
|
|
125
|
+
4. 关闭后可重新发布,状态回到 1
|
|
126
|
+
5. 删除课程不可逆,CLI 不提供删除入口
|
|
127
|
+
6. 审批流默认关闭,如需开启需后台手动配置
|
|
128
|
+
|
|
129
|
+
## 检查清单
|
|
130
|
+
|
|
131
|
+
- [ ] 标题已填写(非空)
|
|
132
|
+
- [ ] 分类已选择
|
|
133
|
+
- [ ] 课件数 ≥ 1
|
|
134
|
+
- [ ] 无转码失败的课件
|
|
135
|
+
- [ ] 无正在转码中的课件
|
|
136
|
+
- [ ] 五道校验全部通过
|
|
137
|
+
- [ ] publish 执行成功,状态确认变为 1
|
|
138
|
+
- [ ] 如涉及审批流,已告知默认关闭及后台配置路径
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: soke-course-query
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: 数据查询 — 课程/学员/学习记录/人脸验证数据查询
|
|
5
|
+
tags: [soke, query, data, analytics, learning-records]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 数据查询
|
|
9
|
+
|
|
10
|
+
## 触发描述
|
|
11
|
+
|
|
12
|
+
需要查询课程数据、学员学习记录、人脸验证记录等运营数据时触发本技能。支持课程维度、学员维度、课件维度的多层级数据查询。
|
|
13
|
+
|
|
14
|
+
## 通用约束
|
|
15
|
+
|
|
16
|
+
- **时间范围限制**:所有查询的时间跨度 ≤ 365 天(如超出返回错误)
|
|
17
|
+
- **时间戳格式**:所有时间戳均为**毫秒级 Unix timestamp**
|
|
18
|
+
- **状态码含义**:
|
|
19
|
+
- `status`(课程):`0`=未发布,`1`=已发布,`2`=已关闭
|
|
20
|
+
- `face_status`(人脸):`1`=验证成功,`2`=验证失败
|
|
21
|
+
|
|
22
|
+
## 执行流程
|
|
23
|
+
|
|
24
|
+
### 1. 课程列表 `+list-courses`
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
soke course +list-courses
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| 参数 | 必填 | 说明 |
|
|
31
|
+
|------|------|------|
|
|
32
|
+
| `--keyword` | 否 | 按标题/描述模糊搜索 |
|
|
33
|
+
| `--status` | 否 | 按状态过滤(0/1/2) |
|
|
34
|
+
| `--category-id` | 否 | 按分类过滤 |
|
|
35
|
+
| `--page` | 否 | 页码(默认 1) |
|
|
36
|
+
| `--page-size` | 否 | 每页条数(默认 20) |
|
|
37
|
+
| `--start-time` | 否 | 创建时间起始(ms) |
|
|
38
|
+
| `--end-time` | 否 | 创建时间结束(ms),与 start-time 跨度 ≤ 365 天 |
|
|
39
|
+
|
|
40
|
+
返回课程列表,包含课程 ID、标题、状态、创建时间、学习人数等摘要。
|
|
41
|
+
|
|
42
|
+
### 2. 课程详情 `+get-course`
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
soke course +get-course --course-id <courseId>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
| 参数 | 必填 | 说明 |
|
|
49
|
+
|------|------|------|
|
|
50
|
+
| `--course-id` | 是 | 课程 ID |
|
|
51
|
+
|
|
52
|
+
返回课程完整信息:标题、描述、分类、状态、讲师、课件数、学习人数、完成率等。
|
|
53
|
+
|
|
54
|
+
### 3. 课程学员列表 `+list-course-users`
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
soke course +list-course-users --course-id <courseId>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
| 参数 | 必填 | 说明 |
|
|
61
|
+
|------|------|------|
|
|
62
|
+
| `--course-id` | 是 | 课程 ID |
|
|
63
|
+
| `--status` | 否 | 学习状态过滤(进行中/已完成/未开始) |
|
|
64
|
+
| `--keyword` | 否 | 按学员姓名搜索 |
|
|
65
|
+
| `--page` | 否 | 页码 |
|
|
66
|
+
| `--page-size` | 否 | 每页条数 |
|
|
67
|
+
|
|
68
|
+
返回该课程所有学员列表,包含用户 ID、姓名、部门、学习进度、学习时长、完成状态。
|
|
69
|
+
|
|
70
|
+
### 4. 学员详情 `+get-course-user`
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
soke course +get-course-user \
|
|
74
|
+
--course-id <courseId> \
|
|
75
|
+
--user-id <userId>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
| 参数 | 必填 | 说明 |
|
|
79
|
+
|------|------|------|
|
|
80
|
+
| `--course-id` | 是 | 课程 ID |
|
|
81
|
+
| `--user-id` | 是 | 学员 ID |
|
|
82
|
+
|
|
83
|
+
返回单个学员在该课程下的详细学习记录:每节课时进度、总时长、完成状态、成绩等。
|
|
84
|
+
|
|
85
|
+
### 5. 课件学习记录 `+list-lesson-learns`
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
soke course +list-lesson-learns \
|
|
89
|
+
--lesson-id <lessonId> \
|
|
90
|
+
--start-time <ms> \
|
|
91
|
+
--end-time <ms>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
| 参数 | 必填 | 说明 |
|
|
95
|
+
|------|------|------|
|
|
96
|
+
| `--lesson-id` | 是 | 课件 ID |
|
|
97
|
+
| `--start-time` | 是 | 起始时间(ms),跨度 ≤ 365 天 |
|
|
98
|
+
| `--end-time` | 是 | 结束时间(ms) |
|
|
99
|
+
| `--user-id` | 否 | 按学员过滤 |
|
|
100
|
+
|
|
101
|
+
返回指定课件在时间范围内的学员学习记录:用户、学习时长、完成百分比、首次学习时间、最后学习时间。
|
|
102
|
+
|
|
103
|
+
### 6. 人脸验证记录 `+list-lesson-faces`
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
soke course +list-lesson-faces \
|
|
107
|
+
--lesson-id <lessonId> \
|
|
108
|
+
--start-time <ms> \
|
|
109
|
+
--end-time <ms>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
| 参数 | 必填 | 说明 |
|
|
113
|
+
|------|------|------|
|
|
114
|
+
| `--lesson-id` | 是 | 课件 ID |
|
|
115
|
+
| `--start-time` | 是 | 起始时间(ms),跨度 ≤ 365 天 |
|
|
116
|
+
| `--end-time` | 是 | 结束时间(ms) |
|
|
117
|
+
| `--user-id` | 否 | 按学员过滤 |
|
|
118
|
+
| `--face-status` | 否 | 验证状态:`1`=成功,`2`=失败 |
|
|
119
|
+
|
|
120
|
+
返回人脸验证记录,包含:
|
|
121
|
+
- 用户信息
|
|
122
|
+
- 验证时间
|
|
123
|
+
- `face_status`:`1` = 验证成功,`2` = 验证失败
|
|
124
|
+
- 失败原因(如有人脸不匹配、超时等)
|
|
125
|
+
|
|
126
|
+
## 输出标准
|
|
127
|
+
|
|
128
|
+
以结构化表格或摘要形式输出查询结果,示例如下:
|
|
129
|
+
|
|
130
|
+
**课程列表**:
|
|
131
|
+
```
|
|
132
|
+
📋 课程列表 (共 N 门)
|
|
133
|
+
|
|
134
|
+
| 标题 | 状态 | 学员数 | 完成率 | 创建时间 |
|
|
135
|
+
|------|------|--------|--------|----------|
|
|
136
|
+
| ... | ... | ... | ... | ... |
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**学员学习记录**:
|
|
140
|
+
```
|
|
141
|
+
📊 {courseTitle} — 学员学习记录 (共 N 人)
|
|
142
|
+
|
|
143
|
+
| 姓名 | 部门 | 进度 | 学习时长 | 状态 |
|
|
144
|
+
|------|------|------|----------|------|
|
|
145
|
+
| ... | ... | ... | ... | ... |
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## 注意事项
|
|
149
|
+
|
|
150
|
+
1. **时间跨度**:所有时间范围查询(start-time / end-time)跨度不超过 365 天,超过需分段查询
|
|
151
|
+
2. **时间戳单位**:统一使用毫秒 (ms),`Date.now()` 风格的时间戳,如 `1700000000000`
|
|
152
|
+
3. **分页查询**:大数据量查询务必使用分页参数,避免超时
|
|
153
|
+
4. **face_status 枚举**:仅 `1`(成功)和 `2`(失败),无其他状态值
|
|
154
|
+
5. **课程状态枚举**:`0`(未发布)/ `1`(已发布)/ `2`(已关闭),查询时按需过滤
|
|
155
|
+
6. 人脸验证记录仅在人脸识别功能已开启的课程中产生数据
|
|
156
|
+
|
|
157
|
+
## 检查清单
|
|
158
|
+
|
|
159
|
+
- [ ] 时间范围 ≤ 365 天
|
|
160
|
+
- [ ] 时间戳已确认采用毫秒单位
|
|
161
|
+
- [ ] 分页参数对大结果集已设置
|
|
162
|
+
- [ ] face_status 查询值为 1 或 2
|
|
163
|
+
- [ ] course status 查询值为 0/1/2
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: soke-course-settings
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: 课程设置 — 基础信息编辑及高级设置项说明,高级设置需后台操作
|
|
5
|
+
tags: [soke, course, settings, configuration, advanced]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 课程设置
|
|
9
|
+
|
|
10
|
+
## 触发描述
|
|
11
|
+
|
|
12
|
+
课程创建后需要对课程标题、描述等基础信息进行修改,或需要了解高级设置项(学习模式、人脸识别、证书等)的配置方式时触发本技能。
|
|
13
|
+
|
|
14
|
+
## CLI 支持的操作
|
|
15
|
+
|
|
16
|
+
### 基础信息更新 `course +update`
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
soke course +update \
|
|
20
|
+
--course-id <courseId> \
|
|
21
|
+
--title "<新标题>" \
|
|
22
|
+
--description "<新描述>"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
| 参数 | 必填 | 说明 |
|
|
26
|
+
|------|------|------|
|
|
27
|
+
| `--course-id` | 是 | 课程 ID |
|
|
28
|
+
| `--title` | 否 | 课程标题 |
|
|
29
|
+
| `--description` | 否 | 课程描述/简介 |
|
|
30
|
+
|
|
31
|
+
> `title` 和 `description` 至少传一个,可同时更新。
|
|
32
|
+
|
|
33
|
+
## ⚠️ CLI 不支持的高级设置
|
|
34
|
+
|
|
35
|
+
以下 9 项高级设置均需通过管理后台操作,CLI 暂不支持:
|
|
36
|
+
|
|
37
|
+
| 序号 | 设置项 | 说明 | 后台操作路径 |
|
|
38
|
+
|------|--------|------|-------------|
|
|
39
|
+
| 1 | **学习模式** `study_type` | 必修/选修模式、闯关模式(顺序解锁)、自由模式 | 后台 → 课程管理 → 课程列表 → 编辑 → 学习设置 |
|
|
40
|
+
| 2 | **倍速播放** `speed` | 允许学员使用倍速播放(0.5x - 2.0x) | 后台 → 课程管理 → 课程列表 → 编辑 → 学习设置 → 播放控制 |
|
|
41
|
+
| 3 | **人脸识别** `face_recognition` | 开启后学员学习时需人脸验证,防挂机/替学 | 后台 → 课程管理 → 课程列表 → 编辑 → 学习设置 → 人脸识别 |
|
|
42
|
+
| 4 | **学习提醒** `reminders` | 配置定时提醒推送(未完成学员、推送时间、频次) | 后台 → 课程管理 → 课程列表 → 编辑 → 学习设置 → 提醒设置 |
|
|
43
|
+
| 5 | **课程评价** `rating` | 开启学员评分/评论功能,可设为审核后展示 | 后台 → 课程管理 → 课程列表 → 编辑 → 评价设置 |
|
|
44
|
+
| 6 | **证书设置** `certificate` | 配置结业证书模板(背景图、字段、盖章)和通过条件 | 后台 → 课程管理 → 课程列表 → 编辑 → 证书设置 |
|
|
45
|
+
| 7 | **证书签名** `signature` | 配置证书上的签名图片(讲师/负责人手写签名) | 后台 → 课程管理 → 课程列表 → 编辑 → 证书设置 → 签名管理 |
|
|
46
|
+
| 8 | **钉钉二维码** `dingtalk_qrcode` | 配置钉钉群二维码,学员学习页展示入群入口 | 后台 → 课程管理 → 课程列表 → 编辑 → 学习设置 → 钉钉二维码 |
|
|
47
|
+
|
|
48
|
+
> 操作路径示例以标准后台结构为准,实际路径可能因后台版本略有差异。
|
|
49
|
+
|
|
50
|
+
## 输出标准
|
|
51
|
+
|
|
52
|
+
基础信息更新成功后:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
✅ 课程信息更新成功
|
|
56
|
+
- 课程: {newTitle} (ID: {courseId})
|
|
57
|
+
- 描述: {newDescription 摘要}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
当用户询问高级设置时,列出上述 9 项并以表格形式呈现,引导至对应后台路径。
|
|
61
|
+
|
|
62
|
+
## 注意事项
|
|
63
|
+
|
|
64
|
+
1. `course +update` 仅支持 `title` 和 `description` 两个字段的修改
|
|
65
|
+
2. 封面图修改属于素材上传范围,不在本技能覆盖内
|
|
66
|
+
3. 分类修改需通过专门的分类设置功能或后台操作
|
|
67
|
+
4. 高级设置项之间可能存在依赖关系(如证书依赖签名设置),建议按表格顺序逐项配置
|
|
68
|
+
5. 钉钉二维码设置与课程复制时的行为有关联(复制时不携带,见 `soke-course-copy`)
|
|
69
|
+
|
|
70
|
+
## 检查清单
|
|
71
|
+
|
|
72
|
+
- [ ] CLI 操作:title/description 已准备完毕,courseId 确认存在
|
|
73
|
+
- [ ] 高级设置需求已识别,已提供对应后台路径
|
|
74
|
+
- [ ] 所有 9 项高级设置均已告知用户为后台操作
|