@sokeai/cli 1.0.6 → 1.0.8

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sokeai/cli",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "授客AI官方CLI工具 - 支持AI Agent Skills",
5
5
  "bin": {
6
6
  "soke-cli": "scripts/run.js"
@@ -11,7 +11,8 @@
11
11
  "release": "./scripts/release.sh"
12
12
  },
13
13
  "files": [
14
- "scripts/"
14
+ "scripts/",
15
+ "skills/"
15
16
  ],
16
17
  "repository": {
17
18
  "type": "git",
@@ -8,6 +8,86 @@ const platform = os.platform();
8
8
  const arch = os.arch();
9
9
  const version = require('../package.json').version;
10
10
 
11
+ function copyDirRecursive(srcDir, destDir) {
12
+ if (!fs.existsSync(srcDir)) return;
13
+ if (!fs.existsSync(destDir)) fs.mkdirSync(destDir, { recursive: true });
14
+
15
+ const entries = fs.readdirSync(srcDir, { withFileTypes: true });
16
+ for (const entry of entries) {
17
+ const srcPath = path.join(srcDir, entry.name);
18
+ const destPath = path.join(destDir, entry.name);
19
+
20
+ if (entry.isDirectory()) {
21
+ copyDirRecursive(srcPath, destPath);
22
+ continue;
23
+ }
24
+
25
+ if (entry.isSymbolicLink()) {
26
+ try {
27
+ const linkTarget = fs.readlinkSync(srcPath);
28
+ try {
29
+ fs.unlinkSync(destPath);
30
+ } catch (_) {}
31
+ fs.symlinkSync(linkTarget, destPath);
32
+ } catch (_) {}
33
+ continue;
34
+ }
35
+
36
+ fs.copyFileSync(srcPath, destPath);
37
+ }
38
+ }
39
+
40
+ function detectSokeclawWorkspaceSkillsDir() {
41
+ const homeDir = os.homedir();
42
+ const defaultSkillsDir = path.join(
43
+ homeDir,
44
+ '.sokeclaw',
45
+ 'openai-agents',
46
+ 'workspaces',
47
+ 'main',
48
+ 'skills'
49
+ );
50
+
51
+ const workclawConfigPath = path.join(homeDir, '.sokeclaw', 'workclaw.json');
52
+ if (!fs.existsSync(workclawConfigPath)) return defaultSkillsDir;
53
+
54
+ try {
55
+ const configText = fs.readFileSync(workclawConfigPath, 'utf8');
56
+ const config = JSON.parse(configText);
57
+ const workspaceDir = config?.defaults?.agents?.openaiAgents?.main?.workspace;
58
+ if (typeof workspaceDir === 'string' && workspaceDir.length > 0) {
59
+ return path.join(workspaceDir, 'skills');
60
+ }
61
+ } catch (_) {}
62
+
63
+ return defaultSkillsDir;
64
+ }
65
+
66
+ function syncSkillsToSokeclawWorkspace() {
67
+ const packageRoot = path.join(__dirname, '..');
68
+ const packagedSkillsDir = path.join(packageRoot, 'skills');
69
+ if (!fs.existsSync(packagedSkillsDir)) return;
70
+
71
+ const sokeclawSkillsDir = detectSokeclawWorkspaceSkillsDir();
72
+ const sokeclawRootDir = path.join(os.homedir(), '.sokeclaw');
73
+ if (!fs.existsSync(sokeclawRootDir)) return;
74
+
75
+ try {
76
+ fs.mkdirSync(sokeclawSkillsDir, { recursive: true });
77
+ } catch (_) {
78
+ return;
79
+ }
80
+
81
+ const skillNames = ['soke-shared', 'soke-exam'];
82
+ for (const skillName of skillNames) {
83
+ const src = path.join(packagedSkillsDir, skillName);
84
+ const dest = path.join(sokeclawSkillsDir, skillName);
85
+ if (fs.existsSync(src)) {
86
+ copyDirRecursive(src, dest);
87
+ }
88
+ }
89
+ }
90
+
11
91
  // 平台映射
12
92
  const platformMap = {
13
93
  'darwin': 'darwin',
@@ -109,6 +189,10 @@ downloadFile(downloadURL, binaryPath)
109
189
  }
110
190
  }
111
191
 
192
+ try {
193
+ syncSkillsToSokeclawWorkspace();
194
+ } catch (_) {}
195
+
112
196
  console.log('soke-cli 安装成功!');
113
197
  console.log(`二进制文件位置: ${binaryPath}`);
114
198
  console.log('\n使用方法:');
@@ -0,0 +1,196 @@
1
+ # 授客CLI AI Agent Skills
2
+
3
+ 本目录包含授客CLI的AI Agent技能定义,使AI Agent能够自动发现和调用授客CLI的各种功能。
4
+
5
+ ## 安装方法
6
+
7
+ ### 前提条件
8
+
9
+ 1. 已安装授客CLI:
10
+ ```bash
11
+ npm install -g @sokeai/cli
12
+ ```
13
+
14
+ 2. 已完成配置和认证:
15
+ ```bash
16
+ soke-cli config init
17
+ soke-cli auth login
18
+ ```
19
+
20
+ ### 安装Skills
21
+
22
+ **方式1:从GitHub安装(推荐)**
23
+
24
+ ```bash
25
+ # 全局安装所有skills
26
+ npx skills add <org>/soke-cli -y -g
27
+
28
+ # 或安装特定skill
29
+ npx skills add <org>/soke-cli --skill soke-exam -y -g
30
+ ```
31
+
32
+ > 注意:需要先将本项目推送到GitHub公开仓库,然后将 `<org>` 替换为实际的GitHub组织或用户名。
33
+
34
+ **方式2:本地安装(开发测试)**
35
+
36
+ ```bash
37
+ # 复制到全局skills目录
38
+ cp -r skills/soke-shared ~/.claude/skills/
39
+ cp -r skills/soke-exam ~/.claude/skills/
40
+
41
+ # 或复制到项目级skills目录
42
+ mkdir -p .claude/skills
43
+ cp -r skills/soke-shared .claude/skills/
44
+ cp -r skills/soke-exam .claude/skills/
45
+ ```
46
+
47
+ ### 验证安装
48
+
49
+ 安装完成后,AI Agent会自动加载这些skills。你可以通过以下方式验证:
50
+
51
+ 1. 在AI Agent对话中询问:"查询考试成绩"
52
+ 2. AI Agent应该能够识别并使用 `soke-exam` skill
53
+ 3. AI Agent会自动执行 `soke-cli exam +get-exam-user` 命令
54
+
55
+ ## Skills列表
56
+
57
+ ### soke-shared
58
+
59
+ **功能**: 共享基础规则,包含配置、认证、权限处理
60
+
61
+ **触发条件**:
62
+ - 首次使用soke-cli
63
+ - 需要配置初始化
64
+ - 需要用户登录
65
+ - 遇到权限错误
66
+
67
+ **关键内容**:
68
+ - 配置初始化(`soke-cli config init`)
69
+ - 用户认证(`soke-cli auth login`)
70
+ - 权限不足处理
71
+ - 错误处理规范
72
+ - 安全规则
73
+
74
+ ### soke-exam
75
+
76
+ **功能**: 考试管理,查询考试、考试用户和成绩
77
+
78
+ **触发条件**:
79
+ - 查询考试成绩
80
+ - 查看考试列表
81
+ - 查询考试用户信息
82
+ - 查看考试分类
83
+
84
+ **支持的命令**:
85
+ - `+list-exams`: 列出考试列表
86
+ - `+list-exam-users`: 列出考试用户成绩列表
87
+ - `+get-exam-user`: 获取单个考试用户详细成绩
88
+ - `+list-categories`: 列出考试分类
89
+
90
+ **使用示例**:
91
+ ```bash
92
+ # 查询考试成绩
93
+ soke-cli exam +get-exam-user --exam-id exam123 --dept-user-id user456
94
+
95
+ # 列出考试
96
+ soke-cli exam +list-exams --start-time 1672502400000 --end-time 1704038400000
97
+ ```
98
+
99
+ ## 目录结构
100
+
101
+ ```
102
+ skills/
103
+ ├── soke-shared/ # 共享基础skill
104
+ │ └── SKILL.md
105
+ ├── soke-exam/ # 考试管理skill
106
+ │ ├── SKILL.md
107
+ │ └── references/ # 详细文档
108
+ │ └── exam-get-exam-user.md
109
+ └── README.md # 本文件
110
+ ```
111
+
112
+ ## Skill文件格式
113
+
114
+ 每个skill目录包含一个 `SKILL.md` 文件,格式如下:
115
+
116
+ ```markdown
117
+ ---
118
+ name: skill-name # 技能名称
119
+ version: 1.0.0 # 版本号
120
+ description: "简短描述。当用户需要...时使用。" # 触发条件(关键)
121
+ metadata:
122
+ requires:
123
+ bins: ["soke-cli"] # 依赖的CLI工具
124
+ cliHelp: "soke-cli exam --help" # 帮助命令
125
+ ---
126
+
127
+ # Skill标题
128
+
129
+ [Markdown格式的详细说明]
130
+ ```
131
+
132
+ **关键字段说明**:
133
+ - `name`: 技能标识符,小写字母、数字、连字符
134
+ - `version`: 语义版本号
135
+ - `description`: **最重要**,AI用它判断何时触发此skill,必须包含"当用户需要...时使用"
136
+ - `metadata.requires.bins`: 依赖的CLI工具列表
137
+
138
+ ## 开发新的Skill
139
+
140
+ ### 步骤1:创建目录
141
+
142
+ ```bash
143
+ mkdir -p skills/soke-<module>/references
144
+ ```
145
+
146
+ ### 步骤2:编写SKILL.md
147
+
148
+ 参考 `soke-exam/SKILL.md` 的格式,包含:
149
+ 1. Frontmatter(name, version, description, metadata)
150
+ 2. 核心概念说明
151
+ 3. Shortcuts列表
152
+ 4. 命令详解
153
+ 5. 权限表
154
+ 6. 常见工作流
155
+
156
+ ### 步骤3:编写详细文档(可选)
157
+
158
+ 在 `references/` 目录下为每个重要命令创建详细文档。
159
+
160
+ ### 步骤4:测试
161
+
162
+ ```bash
163
+ # 本地安装测试
164
+ cp -r skills/soke-<module> ~/.claude/skills/
165
+
166
+ # 在AI Agent中测试触发条件
167
+ ```
168
+
169
+ ## 后续扩展
170
+
171
+ 可以按相同模式创建其他业务模块的skills:
172
+
173
+ - `soke-course` - 课程管理
174
+ - `soke-contact` - 组织架构(部门、用户、讲师)
175
+ - `soke-training` - 培训管理
176
+ - `soke-credit` - 学分管理
177
+ - `soke-certificate` - 证书管理
178
+ - 等等...
179
+
180
+ ## 注意事项
181
+
182
+ 1. **Description字段至关重要**: 这是AI匹配skill的唯一依据,必须清晰描述触发场景
183
+ 2. **命令示例要完整**: 包含所有必需参数,避免AI猜测
184
+ 3. **引用共享规则**: 每个业务skill都应引用soke-shared,避免重复
185
+ 4. **保持简洁**: SKILL.md应该是快速参考,详细文档放在references/目录
186
+ 5. **版本管理**: 更新skill时记得更新version字段
187
+
188
+ ## 相关链接
189
+
190
+ - 授客AI开放平台: https://opendev.soke.cn
191
+ - NPM包: @sokeai/cli
192
+ - Skills规范: https://github.com/agent-skills/spec
193
+
194
+ ## 许可证
195
+
196
+ MIT
@@ -0,0 +1,317 @@
1
+ ---
2
+ name: soke-exam
3
+ version: 1.0.0
4
+ description: "授客考试管理:查询考试、考试用户和成绩。查询考试列表、考试分类、考试用户成绩、考试详情。当用户需要查询考试成绩、查看考试列表、查询考试用户信息、查看考试分类时使用。"
5
+ metadata:
6
+ requires:
7
+ bins: ["soke-cli"]
8
+ cliHelp: "soke-cli exam --help"
9
+ ---
10
+
11
+ # 考试管理 (exam)
12
+
13
+ **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../soke-shared/SKILL.md`](../soke-shared/SKILL.md),其中包含认证、配置、权限处理**
14
+
15
+ ## 核心概念
16
+
17
+ - **Exam(考试)**: 考试实体,包含标题、时间范围、状态等信息,通过 `uuid` 标识
18
+ - **ExamUser(考试用户)**: 用户的考试记录,包含成绩、状态、答题时间等,通过 `target_id` 标识
19
+ - **Category(考试分类)**: 考试分类,支持层级结构,通过 `uuid` 标识
20
+ - **DeptUser(部门用户)**: 企业内的用户,通过 `dept_user_id` 标识
21
+
22
+ ## 资源关系
23
+
24
+ ```
25
+ Exam (考试)
26
+ ├── ExamUser (考试用户记录)
27
+ │ ├── dept_user_id (用户ID)
28
+ │ ├── score (成绩)
29
+ │ ├── exam_status (考试状态)
30
+ │ └── submit_time (提交时间)
31
+ └── Category (考试分类)
32
+ ```
33
+
34
+ ## Shortcuts(推荐优先使用)
35
+
36
+ Shortcut 是对常用操作的高级封装(`soke-cli exam +<verb> [flags]`)。有 Shortcut 的操作优先使用。
37
+
38
+ | Shortcut | 说明 |
39
+ |----------|------|
40
+ | [`+list-exams`](#list-exams) | 列出考试列表,支持时间范围和状态筛选 |
41
+ | [`+list-exam-users`](#list-exam-users) | 列出考试用户成绩列表,支持用户筛选和时间范围 |
42
+ | [`+get-exam-user`](#get-exam-user) | 获取单个考试用户的详细成绩信息 |
43
+ | [`+list-categories`](#list-categories) | 列出考试分类 |
44
+
45
+ ## 命令详解
46
+
47
+ ### +list-exams
48
+
49
+ 列出考试列表,支持按时间范围和状态筛选。
50
+
51
+ **命令格式**:
52
+ ```bash
53
+ soke-cli exam +list-exams \
54
+ --start-time <timestamp> \
55
+ --end-time <timestamp> \
56
+ [--status <status>] \
57
+ [--page <page>] \
58
+ [--page-size <size>]
59
+ ```
60
+
61
+ **参数说明**:
62
+ - `--start-time`: 开始时间(Unix时间戳,毫秒)**必需**
63
+ - `--end-time`: 结束时间(Unix时间戳,毫秒)**必需**
64
+ - `--status`: 考试状态(可选)
65
+ - `--page`: 页码,从1开始(默认: 1)
66
+ - `--page-size`: 每页数量,最大100(默认: 100)
67
+
68
+ **返回字段**:
69
+ - `uuid`: 考试ID
70
+ - `title`: 考试标题
71
+ - `start_time`: 开始时间
72
+ - `end_time`: 结束时间
73
+ - `status`: 考试状态
74
+
75
+ **示例**:
76
+ ```bash
77
+ # 查询2023年的所有考试
78
+ soke-cli exam +list-exams \
79
+ --start-time 1672502400000 \
80
+ --end-time 1704038400000
81
+
82
+ # 查询进行中的考试
83
+ soke-cli exam +list-exams \
84
+ --start-time 1672502400000 \
85
+ --end-time 1704038400000 \
86
+ --status "进行中"
87
+ ```
88
+
89
+ **权限要求**: `exam:exam:readonly`
90
+
91
+ ---
92
+
93
+ ### +list-exam-users
94
+
95
+ 列出考试用户成绩列表,支持按用户ID和完成时间筛选。
96
+
97
+ **命令格式**:
98
+ ```bash
99
+ soke-cli exam +list-exam-users \
100
+ --exam-id <exam_id> \
101
+ [--userid-list <user_ids>] \
102
+ [--finish-start-time <timestamp>] \
103
+ [--finish-end-time <timestamp>] \
104
+ [--page <page>] \
105
+ [--page-size <size>]
106
+ ```
107
+
108
+ **参数说明**:
109
+ - `--exam-id`: 考试ID **必需**
110
+ - `--userid-list`: 用户ID列表,逗号分隔,最多100个(可选)
111
+ - `--finish-start-time`: 完成开始时间(Unix时间戳,毫秒)(可选)
112
+ - `--finish-end-time`: 完成结束时间(Unix时间戳,毫秒)(可选)
113
+ - `--page`: 页码,从1开始(默认: 1)
114
+ - `--page-size`: 每页数量,最大100(默认: 100)
115
+
116
+ **返回字段**:
117
+ - `target_id`: 考试用户记录ID
118
+ - `dept_user_id`: 部门用户ID
119
+ - `score`: 成绩
120
+ - `exam_status`: 考试状态
121
+ - `create_time`: 创建时间
122
+
123
+ **示例**:
124
+ ```bash
125
+ # 查询某个考试的所有用户成绩
126
+ soke-cli exam +list-exam-users --exam-id exam123
127
+
128
+ # 查询特定用户的成绩
129
+ soke-cli exam +list-exam-users \
130
+ --exam-id exam123 \
131
+ --userid-list "user1,user2,user3"
132
+
133
+ # 查询某个时间段内完成的考试
134
+ soke-cli exam +list-exam-users \
135
+ --exam-id exam123 \
136
+ --finish-start-time 1672502400000 \
137
+ --finish-end-time 1704038400000
138
+ ```
139
+
140
+ **权限要求**: `exam:examUser:readonly`
141
+
142
+ ---
143
+
144
+ ### +get-exam-user
145
+
146
+ 获取单个考试用户的详细成绩信息,包含答题详情。
147
+
148
+ **命令格式**:
149
+ ```bash
150
+ soke-cli exam +get-exam-user \
151
+ --exam-id <exam_id> \
152
+ --dept-user-id <dept_user_id>
153
+ ```
154
+
155
+ **参数说明**:
156
+ - `--exam-id`: 考试ID **必需**
157
+ - `--dept-user-id`: 部门用户ID **必需**
158
+
159
+ **返回字段**:
160
+ - `target_id`: 考试用户记录ID
161
+ - `target_title`: 考试标题
162
+ - `dept_user_id`: 部门用户ID
163
+ - `score`: 成绩
164
+ - `exam_status`: 考试状态
165
+ - `start_time`: 开始时间
166
+ - `submit_time`: 提交时间
167
+ - `question_count`: 题目数量
168
+ - `create_time`: 创建时间
169
+
170
+ **示例**:
171
+ ```bash
172
+ # 查询张三的考试成绩
173
+ soke-cli exam +get-exam-user \
174
+ --exam-id exam123 \
175
+ --dept-user-id user456
176
+ ```
177
+
178
+ **权限要求**: `exam:examUser:readonly`
179
+
180
+ **使用场景**:
181
+ - 当用户询问"查询某人的考试成绩"时使用
182
+ - 需要同时提供考试ID和用户ID
183
+ - 如果只知道用户名,需要先通过 `soke-cli contact +search-user` 查询用户ID
184
+
185
+ ---
186
+
187
+ ### +list-categories
188
+
189
+ 列出考试分类,支持分页。
190
+
191
+ **命令格式**:
192
+ ```bash
193
+ soke-cli exam +list-categories \
194
+ [--page <page>] \
195
+ [--page-size <size>]
196
+ ```
197
+
198
+ **参数说明**:
199
+ - `--page`: 页码,从1开始(默认: 1)
200
+ - `--page-size`: 每页数量,最大100(默认: 100)
201
+
202
+ **返回字段**:
203
+ - `uuid`: 分类ID
204
+ - `title`: 分类名称
205
+ - `parent_id`: 父分类ID
206
+ - `create_time`: 创建时间
207
+
208
+ **示例**:
209
+ ```bash
210
+ # 查询所有考试分类
211
+ soke-cli exam +list-categories
212
+
213
+ # 分页查询
214
+ soke-cli exam +list-categories --page 1 --page-size 20
215
+ ```
216
+
217
+ **权限要求**: `exam:category:readonly`
218
+
219
+ ## 通用API调用
220
+
221
+ 如果Shortcuts不满足需求,可以使用通用API调用:
222
+
223
+ ```bash
224
+ soke-cli api <METHOD> <path> [--params <json>]
225
+ ```
226
+
227
+ 示例:
228
+ ```bash
229
+ soke-cli api GET /exam/exam/list --params '{"start_time":"1672502400000","end_time":"1704038400000"}'
230
+ ```
231
+
232
+ ## 权限表
233
+
234
+ | 操作 | 所需权限 |
235
+ |------|---------|
236
+ | `+list-exams` | `exam:exam:readonly` |
237
+ | `+list-exam-users` | `exam:examUser:readonly` |
238
+ | `+get-exam-user` | `exam:examUser:readonly` |
239
+ | `+list-categories` | `exam:category:readonly` |
240
+
241
+ ## 常见工作流
242
+
243
+ ### 工作流1: 查询用户考试成绩
244
+
245
+ 当用户询问"查询张三的考试成绩"时:
246
+
247
+ **步骤1**: 如果只知道用户名,先查询用户ID
248
+ ```bash
249
+ soke-cli contact +search-user --name "张三"
250
+ ```
251
+
252
+ **步骤2**: 获取考试列表,找到目标考试ID
253
+ ```bash
254
+ soke-cli exam +list-exams \
255
+ --start-time 1672502400000 \
256
+ --end-time 1704038400000
257
+ ```
258
+
259
+ **步骤3**: 查询该用户的考试成绩
260
+ ```bash
261
+ soke-cli exam +get-exam-user \
262
+ --exam-id <exam_id> \
263
+ --dept-user-id <dept_user_id>
264
+ ```
265
+
266
+ ### 工作流2: 统计考试完成情况
267
+
268
+ 当用户询问"统计某个考试的完成情况"时:
269
+
270
+ **步骤1**: 获取考试用户列表
271
+ ```bash
272
+ soke-cli exam +list-exam-users --exam-id <exam_id>
273
+ ```
274
+
275
+ **步骤2**: 分析返回的数据
276
+ - 统计 `exam_status` 字段的分布
277
+ - 计算平均分(`score` 字段)
278
+ - 统计完成人数
279
+
280
+ ### 工作流3: 查询某个时间段的考试
281
+
282
+ 当用户询问"查询本月的考试"时:
283
+
284
+ **步骤1**: 计算时间范围(Unix时间戳,毫秒)
285
+ ```bash
286
+ # 例如:2024年1月1日 00:00:00 = 1704038400000
287
+ # 2024年1月31日 23:59:59 = 1706716799000
288
+ ```
289
+
290
+ **步骤2**: 查询考试列表
291
+ ```bash
292
+ soke-cli exam +list-exams \
293
+ --start-time 1704038400000 \
294
+ --end-time 1706716799000
295
+ ```
296
+
297
+ ## 注意事项
298
+
299
+ 1. **时间格式**: 所有时间参数使用Unix时间戳(毫秒),不是秒
300
+ 2. **分页**: 默认每页100条,最大100条,超过需要分页查询
301
+ 3. **用户ID**: `dept_user_id` 是企业内的用户ID,不是用户名
302
+ 4. **考试ID**: `exam-id` 和 `uuid` 是同一个字段,都表示考试ID
303
+ 5. **权限**: 所有操作都需要先完成认证(`soke-cli auth login`)
304
+
305
+ ## 错误处理
306
+
307
+ ### 权限不足
308
+ 如果遇到权限错误,参考 [`../soke-shared/SKILL.md`](../soke-shared/SKILL.md) 中的权限处理章节。
309
+
310
+ ### 参数错误
311
+ 使用 `--help` 查看命令参数说明:
312
+ ```bash
313
+ soke-cli exam +get-exam-user --help
314
+ ```
315
+
316
+ ### 数据不存在
317
+ 如果查询的考试或用户不存在,API会返回空数据或错误提示。
@@ -0,0 +1,212 @@
1
+ # +get-exam-user - 获取考试用户详细成绩
2
+
3
+ ## 概述
4
+
5
+ 获取单个用户在特定考试中的详细成绩信息,包括分数、状态、答题时间等。
6
+
7
+ ## 命令格式
8
+
9
+ ```bash
10
+ soke-cli exam +get-exam-user \
11
+ --exam-id <exam_id> \
12
+ --dept-user-id <dept_user_id>
13
+ ```
14
+
15
+ ## 参数说明
16
+
17
+ ### 必需参数
18
+
19
+ | 参数 | 类型 | 说明 |
20
+ |------|------|------|
21
+ | `--exam-id` | string | 考试ID(uuid) |
22
+ | `--dept-user-id` | string | 部门用户ID |
23
+
24
+ ### 可选参数
25
+
26
+ | 参数 | 类型 | 默认值 | 说明 |
27
+ |------|------|--------|------|
28
+ | `--format` | string | json | 输出格式(json/table) |
29
+
30
+ ## 返回数据
31
+
32
+ ### JSON格式
33
+
34
+ ```json
35
+ {
36
+ "code": 0,
37
+ "msg": "success",
38
+ "data": {
39
+ "target_id": "exam_user_123",
40
+ "target_title": "2024年度安全培训考试",
41
+ "dept_user_id": "user456",
42
+ "score": 85,
43
+ "exam_status": "已完成",
44
+ "start_time": 1704038400000,
45
+ "submit_time": 1704042000000,
46
+ "question_count": 20,
47
+ "create_time": 1704038400000
48
+ }
49
+ }
50
+ ```
51
+
52
+ ### 表格格式
53
+
54
+ ```
55
+ target_id | target_title | dept_user_id | score | exam_status | start_time | submit_time | question_count | create_time
56
+ exam_user_123 | 2024年度安全培训考试 | user456 | 85 | 已完成 | 1704038400000 | 1704042000000 | 20 | 1704038400000
57
+ ```
58
+
59
+ ## 字段说明
60
+
61
+ | 字段 | 类型 | 说明 |
62
+ |------|------|------|
63
+ | `target_id` | string | 考试用户记录ID |
64
+ | `target_title` | string | 考试标题 |
65
+ | `dept_user_id` | string | 部门用户ID |
66
+ | `score` | number | 考试成绩(分数) |
67
+ | `exam_status` | string | 考试状态(如:已完成、进行中、未开始) |
68
+ | `start_time` | number | 开始答题时间(Unix时间戳,毫秒) |
69
+ | `submit_time` | number | 提交时间(Unix时间戳,毫秒) |
70
+ | `question_count` | number | 题目总数 |
71
+ | `create_time` | number | 记录创建时间(Unix时间戳,毫秒) |
72
+
73
+ ## 使用示例
74
+
75
+ ### 示例1: 查询单个用户成绩
76
+
77
+ ```bash
78
+ soke-cli exam +get-exam-user \
79
+ --exam-id exam123 \
80
+ --dept-user-id user456
81
+ ```
82
+
83
+ ### 示例2: 以表格格式输出
84
+
85
+ ```bash
86
+ soke-cli exam +get-exam-user \
87
+ --exam-id exam123 \
88
+ --dept-user-id user456 \
89
+ --format table
90
+ ```
91
+
92
+ ## 常见场景
93
+
94
+ ### 场景1: 用户询问自己的成绩
95
+
96
+ **用户输入**: "我的考试成绩是多少?"
97
+
98
+ **处理步骤**:
99
+ 1. 获取当前用户的 `dept_user_id`(通过 `soke-cli api GET /users/me`)
100
+ 2. 确认考试ID(可能需要先列出考试)
101
+ 3. 执行查询命令
102
+
103
+ ```bash
104
+ # 步骤1: 获取当前用户信息
105
+ soke-cli api GET /users/me
106
+
107
+ # 步骤2: 查询成绩
108
+ soke-cli exam +get-exam-user \
109
+ --exam-id exam123 \
110
+ --dept-user-id <从步骤1获取的user_id>
111
+ ```
112
+
113
+ ### 场景2: 管理员查询员工成绩
114
+
115
+ **用户输入**: "查询张三的考试成绩"
116
+
117
+ **处理步骤**:
118
+ 1. 通过姓名查询用户ID(使用 `soke-cli contact +search-user`)
119
+ 2. 确认考试ID
120
+ 3. 执行查询命令
121
+
122
+ ```bash
123
+ # 步骤1: 查询用户ID
124
+ soke-cli contact +search-user --name "张三"
125
+
126
+ # 步骤2: 查询成绩
127
+ soke-cli exam +get-exam-user \
128
+ --exam-id exam123 \
129
+ --dept-user-id <从步骤1获取的dept_user_id>
130
+ ```
131
+
132
+ ### 场景3: 批量查询多个用户成绩
133
+
134
+ **用户输入**: "查询所有人的考试成绩"
135
+
136
+ **处理步骤**:
137
+ 使用 `+list-exam-users` 更合适,可以一次获取所有用户的成绩列表。
138
+
139
+ ```bash
140
+ soke-cli exam +list-exam-users --exam-id exam123
141
+ ```
142
+
143
+ ## 权限要求
144
+
145
+ - **所需权限**: `exam:examUser:readonly`
146
+ - **认证方式**: 需要先执行 `soke-cli auth login` 完成用户认证
147
+
148
+ ## 错误处理
149
+
150
+ ### 错误1: 考试不存在
151
+
152
+ ```json
153
+ {
154
+ "code": 404,
155
+ "msg": "考试不存在"
156
+ }
157
+ ```
158
+
159
+ **解决方案**: 检查 `exam-id` 是否正确
160
+
161
+ ### 错误2: 用户未参加考试
162
+
163
+ ```json
164
+ {
165
+ "code": 404,
166
+ "msg": "用户未参加该考试"
167
+ }
168
+ ```
169
+
170
+ **解决方案**: 确认用户是否已参加该考试
171
+
172
+ ### 错误3: 权限不足
173
+
174
+ ```json
175
+ {
176
+ "code": 403,
177
+ "msg": "权限不足"
178
+ }
179
+ ```
180
+
181
+ **解决方案**:
182
+ 1. 确认已执行 `soke-cli auth login`
183
+ 2. 联系管理员开通 `exam:examUser:readonly` 权限
184
+
185
+ ### 错误4: 参数缺失
186
+
187
+ ```bash
188
+ Error: required flag(s) "exam-id", "dept-user-id" not set
189
+ ```
190
+
191
+ **解决方案**: 检查是否提供了所有必需参数
192
+
193
+ ## API详情
194
+
195
+ - **HTTP方法**: GET
196
+ - **API路径**: `/exam/user/info`
197
+ - **请求参数**:
198
+ - `exam_id`: 考试ID
199
+ - `dept_user_id`: 部门用户ID
200
+
201
+ ## 相关命令
202
+
203
+ - `+list-exam-users`: 列出考试用户成绩列表
204
+ - `+list-exams`: 列出考试列表
205
+ - `soke-cli contact +search-user`: 查询用户信息
206
+
207
+ ## 注意事项
208
+
209
+ 1. **时间戳格式**: 所有时间字段都是Unix时间戳(毫秒),不是秒
210
+ 2. **用户ID**: 必须使用 `dept_user_id`,不能使用用户名或其他标识
211
+ 3. **考试状态**: 状态值可能因系统配置而异,常见值包括:已完成、进行中、未开始、已过期
212
+ 4. **成绩计算**: 成绩字段可能为null(如果考试未完成或未提交)
@@ -0,0 +1,183 @@
1
+ ---
2
+ name: soke-shared
3
+ version: 1.0.0
4
+ description: "授客CLI共享基础:应用配置初始化、认证登录(auth login)、权限管理、错误处理、安全规则。当用户需要第一次配置(soke-cli config init)、使用登录授权(soke-cli auth login)、遇到权限不足、或首次使用soke-cli时触发。"
5
+ ---
6
+
7
+ # soke-cli 共享规则
8
+
9
+ 本技能指导你如何通过soke-cli操作授客AI资源,以及有哪些注意事项。
10
+
11
+ ## 配置初始化
12
+
13
+ 首次使用需运行 `soke-cli config init` 完成应用配置。
14
+
15
+ 当你帮用户初始化配置时,引导用户按照交互式提示完成配置:
16
+
17
+ ```bash
18
+ # 初始化配置
19
+ soke-cli config init
20
+ ```
21
+
22
+ 配置项包括:
23
+ - `app_key`: 开放平台应用Key
24
+ - `app_secret`: 开放平台应用Secret
25
+ - `api_base_url`: API地址(默认: https://opendev.soke.cn)
26
+ - `corpid`: 企业ID
27
+
28
+ 配置文件保存在 `~/.soke-cli/config.json`
29
+
30
+ ## 认证
31
+
32
+ ### 用户登录
33
+
34
+ 用户需要通过OAuth授权获取访问令牌:
35
+
36
+ ```bash
37
+ # 用户登录授权
38
+ soke-cli auth login
39
+ ```
40
+
41
+ 登录成功后,`access_token` 和 `refresh_token` 会自动保存到配置文件中。
42
+
43
+ ### Token管理
44
+
45
+ - **access_token**: 用户访问令牌,用于调用API
46
+ - **refresh_token**: 刷新令牌,用于获取新的access_token
47
+ - Token过期后需要重新执行 `soke-cli auth login`
48
+
49
+ ### 查看当前配置
50
+
51
+ ```bash
52
+ # 查看当前配置(不显示敏感信息)
53
+ soke-cli config show
54
+ ```
55
+
56
+ ## 权限不足处理
57
+
58
+ 遇到权限相关错误时,通常有以下几种情况:
59
+
60
+ ### 1. 未登录或Token过期
61
+
62
+ **错误特征**: 返回401 Unauthorized或Token无效
63
+
64
+ **解决方案**:
65
+ ```bash
66
+ soke-cli auth login
67
+ ```
68
+
69
+ ### 2. 缺少必要权限
70
+
71
+ **错误特征**: 返回403 Forbidden或权限不足提示
72
+
73
+ **解决方案**:
74
+ - 联系管理员在开放平台后台为应用开通相应权限
75
+ - 确认企业ID(corpid)和应用配置正确
76
+
77
+ ### 3. 参数错误
78
+
79
+ **错误特征**: 返回400 Bad Request或参数验证失败
80
+
81
+ **解决方案**:
82
+ - 检查必需参数是否提供
83
+ - 使用 `--help` 查看命令参数说明
84
+ - 参考API文档确认参数格式
85
+
86
+ ## 命令结构
87
+
88
+ ### Shortcuts(推荐)
89
+
90
+ Shortcuts是对常用操作的高级封装,参数友好,最适合AI Agent调用:
91
+
92
+ ```bash
93
+ soke-cli <service> +<verb> [flags]
94
+ ```
95
+
96
+ 示例:
97
+ ```bash
98
+ soke-cli exam +get-exam-user --exam-id exam123 --dept-user-id user456
99
+ soke-cli course +list-courses --page 1 --page-size 10
100
+ ```
101
+
102
+ ### 通用API调用
103
+
104
+ 支持直接调用任意API:
105
+
106
+ ```bash
107
+ soke-cli api <METHOD> <path> [--data <json>] [--params <json>]
108
+ ```
109
+
110
+ 示例:
111
+ ```bash
112
+ soke-cli api GET /users/me
113
+ soke-cli api POST /some/endpoint --data '{"key": "value"}'
114
+ ```
115
+
116
+ ## 输出格式
117
+
118
+ ### JSON格式(默认)
119
+
120
+ 所有命令默认输出JSON格式,便于程序解析:
121
+
122
+ ```bash
123
+ soke-cli exam +list-exams --format json
124
+ ```
125
+
126
+ ### 表格格式
127
+
128
+ 部分命令支持表格格式输出,更易读:
129
+
130
+ ```bash
131
+ soke-cli exam +list-exams --format table
132
+ ```
133
+
134
+ ## 安全规则
135
+
136
+ - **禁止输出密钥**(app_secret、access_token)到终端明文
137
+ - **写入/删除操作前必须确认用户意图**
138
+ - 敏感操作建议先使用 `--dry-run`(如果支持)预览
139
+
140
+ ## 错误处理
141
+
142
+ 当命令执行失败时:
143
+
144
+ 1. **检查配置**: 运行 `soke-cli config show` 确认配置正确
145
+ 2. **检查登录状态**: 如果是认证错误,运行 `soke-cli auth login`
146
+ 3. **检查参数**: 使用 `soke-cli <service> <command> --help` 查看参数说明
147
+ 4. **查看错误信息**: 错误响应中通常包含详细的错误原因
148
+
149
+ ## 常见问题
150
+
151
+ ### Q: 如何获取app_key和app_secret?
152
+
153
+ A: 登录授客AI开放平台(https://opendev.soke.cn),创建应用后即可获取。
154
+
155
+ ### Q: Token过期了怎么办?
156
+
157
+ A: 重新执行 `soke-cli auth login` 进行授权。
158
+
159
+ ### Q: 如何切换企业?
160
+
161
+ A: 运行 `soke-cli config init` 重新配置,或直接编辑 `~/.soke-cli/config.json` 文件。
162
+
163
+ ### Q: 支持哪些业务模块?
164
+
165
+ A: 目前支持以下模块:
166
+ - `contact`: 组织架构(部门、用户、岗位、讲师)
167
+ - `course`: 课程管理
168
+ - `exam`: 考试管理
169
+ - `training`: 培训管理
170
+ - `learning_map`: 学习地图
171
+ - `credit`: 学分管理
172
+ - `point`: 积分管理
173
+ - `news`: 资讯管理
174
+ - `certificate`: 证书管理
175
+ - 等等...
176
+
177
+ 每个模块都有对应的Skill,AI Agent会根据用户意图自动选择。
178
+
179
+ ## 相关链接
180
+
181
+ - 授客AI开放平台: https://opendev.soke.cn
182
+ - NPM包: @sokeai/cli
183
+ - 代码仓库: https://codeup.aliyun.com/5edbc121d1d1abe63b55f1c7/soke/soke-cli.git