@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 +3 -2
- package/scripts/install.js +84 -0
- package/skills/README.md +196 -0
- package/skills/soke-exam/SKILL.md +317 -0
- package/skills/soke-exam/references/exam-get-exam-user.md +212 -0
- package/skills/soke-shared/SKILL.md +183 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sokeai/cli",
|
|
3
|
-
"version": "1.0.
|
|
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",
|
package/scripts/install.js
CHANGED
|
@@ -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使用方法:');
|
package/skills/README.md
ADDED
|
@@ -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
|