@sokeai/cli 1.0.21 → 1.0.25

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/README.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  `soke-cli` 是授客AI官方提供的命令行工具,旨在帮助开发者和系统管理员更便捷地通过命令行与授客AI开放平台进行交互。该工具使用 Go 语言开发,支持多平台,并提供了 NPM 包的安装方式。
4
4
 
5
+ ## 目录
6
+
7
+ - [核心能力](#核心能力)
8
+ - [安装方法](#安装方法)
9
+ - [快速开始](#快速开始)
10
+ - [开发指南](#开发指南)
11
+ - [从接口封装到发布的完整流程](#从接口封装到发布的完整流程)
12
+ - [本地开发测试](#本地开发测试)
13
+ - [项目结构](#项目结构)
14
+ - [相关文档](#相关文档)
15
+
5
16
  ## 核心能力
6
17
 
7
18
  `soke-cli` 提供了以下核心能力:
@@ -15,21 +26,26 @@
15
26
 
16
27
  3. **业务模块快捷命令**
17
28
  - 针对授客AI核心业务场景提供了丰富的快捷命令集:
18
- - **通讯录 (contact)**: 部门与用户查询、管理等。
29
+ - **通讯录 (contact)**: 部门与用户查询、管理、搜索等。
19
30
  - **课程 (course)**: 课程列表、分类、学习记录、人脸识别记录等。
20
31
  - **考试 (exam)**: 考试列表、分类、考试成绩与记录查询。
32
+ - **学习档案 (learning-profile)**: 学员学习档案查询、学习情况统计。
21
33
  - **学习地图 (learning-map)**: 学习地图、阶段、任务查询与分配。
22
34
  - **证书 (certificate)**: 证书发放记录、分类等。
23
35
  - **学分 (credit) & 积分 (point)**: 学分/积分日志及用户情况查询。
24
36
  - **培训 (training)**: 线下培训查询与分配。
25
37
  - **新闻公告 (news)**: 资讯列表与详情。
26
38
 
39
+ 4. **AI Agent Skills**
40
+ - 提供 AI Agent 技能(Skills),使 AI 助手能够自动发现和调用 CLI 功能。
41
+ - 支持自然语言交互,无需记忆复杂的命令参数。
42
+
27
43
  ## 安装方法
28
44
 
29
45
  ### 方式一:通过 NPM 安装 (推荐)
30
46
  如果你本地已安装 Node.js,可以直接使用 npm 全局安装:
31
47
  ```bash
32
- npm install -g @sokeai/cli
48
+ npm install -g @sokeai/cli@latest
33
49
  ```
34
50
 
35
51
  ### 方式二:通过源码编译安装 (需要 Go 环境)
@@ -71,6 +87,8 @@ AI Agent 会自动:
71
87
 
72
88
  - **soke-shared**: 配置初始化、用户认证、权限处理等基础功能
73
89
  - **soke-exam**: 考试管理(查询考试、考试成绩、考试分类)
90
+ - **soke-course**: 课程管理(查询课程、课程分类、学习记录)
91
+ - **soke-learning-profile**: 学习档案查询(查询学员学习档案、学习情况统计)
74
92
  - 更多业务模块的 Skills 正在开发中...
75
93
 
76
94
  详细文档:[skills/README.md](skills/README.md)
@@ -146,18 +164,456 @@ soke-cli api GET /users/me
146
164
  soke-cli api POST /some/endpoint --data '{"key": "value"}'
147
165
  ```
148
166
 
149
- ## 项目结构说明
167
+ ## 开发指南
168
+
169
+ ### 从接口封装到发布的完整流程
170
+
171
+ #### 1️⃣ 接口封装为 CLI 命令
172
+
173
+ **步骤 1: 在 shortcuts 目录下定义接口元数据**
174
+
175
+ ```bash
176
+ # 创建新模块目录
177
+ mkdir -p shortcuts/your-module
178
+
179
+ # 创建命令定义文件
180
+ touch shortcuts/your-module/list_items.go
181
+ ```
182
+
183
+ **示例:定义一个查询列表的命令**
184
+
185
+ ```go
186
+ // shortcuts/your-module/list_items.go
187
+ package yourmodule
188
+
189
+ import "soke-cli/internal/client"
190
+
191
+ // ListItemsShortcut 定义查询列表命令
192
+ func ListItemsShortcut() client.Shortcut {
193
+ return client.Shortcut{
194
+ Name: "list-items", // 命令名称
195
+ Description: "查询项目列表", // 命令描述
196
+ Method: "GET", // HTTP 方法
197
+ Path: "/api/v1/items", // API 路径
198
+ Params: []client.Param{ // 参数定义
199
+ {
200
+ Name: "page",
201
+ Type: "int",
202
+ Description: "页码",
203
+ Required: false,
204
+ Default: "1",
205
+ },
206
+ {
207
+ Name: "page_size",
208
+ Type: "int",
209
+ Description: "每页数量",
210
+ Required: false,
211
+ Default: "10",
212
+ },
213
+ {
214
+ Name: "keyword",
215
+ Type: "string",
216
+ Description: "搜索关键词",
217
+ Required: false,
218
+ },
219
+ },
220
+ }
221
+ }
222
+ ```
223
+
224
+ **步骤 2: 注册命令到模块**
225
+
226
+ ```go
227
+ // shortcuts/your-module/shortcuts.go
228
+ package yourmodule
229
+
230
+ import "soke-cli/internal/client"
231
+
232
+ // Shortcuts 返回该模块的所有快捷命令
233
+ func Shortcuts() []client.Shortcut {
234
+ return []client.Shortcut{
235
+ ListItemsShortcut(),
236
+ // 添加更多命令...
237
+ }
238
+ }
239
+ ```
240
+
241
+ **步骤 3: 在 cmd 层注册模块**
242
+
243
+ ```go
244
+ // cmd/your_module/your_module.go
245
+ package yourmodule
246
+
247
+ import (
248
+ "soke-cli/internal/client"
249
+ yourmodule "soke-cli/shortcuts/your-module"
250
+ "github.com/spf13/cobra"
251
+ )
252
+
253
+ // YourModuleCmd 模块根命令
254
+ var YourModuleCmd = &cobra.Command{
255
+ Use: "your-module",
256
+ Short: "你的模块管理",
257
+ Long: "管理你的模块相关功能",
258
+ }
259
+
260
+ func init() {
261
+ // 自动注册所有快捷命令
262
+ client.RegisterShortcuts(YourModuleCmd, yourmodule.Shortcuts())
263
+ }
264
+ ```
265
+
266
+ **步骤 4: 在根命令中注册模块**
267
+
268
+ ```go
269
+ // cmd/root.go
270
+ import (
271
+ yourmodule "soke-cli/cmd/your_module"
272
+ )
273
+
274
+ func init() {
275
+ // 注册模块命令
276
+ rootCmd.AddCommand(yourmodule.YourModuleCmd)
277
+ }
278
+ ```
279
+
280
+ #### 2️⃣ 创建 AI Agent Skill
281
+
282
+ **步骤 1: 创建 Skill 目录和文档**
283
+
284
+ ```bash
285
+ # 创建 Skill 目录
286
+ mkdir -p skills/your-module
287
+
288
+ # 创建 Skill 定义文件
289
+ touch skills/your-module/SKILL.md
290
+ ```
291
+
292
+ **步骤 2: 编写 Skill 文档**
293
+
294
+ ```markdown
295
+ <!-- skills/your-module/SKILL.md -->
296
+ ---
297
+ name: your-module
298
+ description: 你的模块管理:查询项目列表、创建项目、更新项目等
299
+ trigger: 当用户需要查询项目、管理项目时使用
300
+ ---
301
+
302
+ # 你的模块管理 Skill
303
+
304
+ ## 功能说明
305
+
306
+ 提供项目管理相关功能,包括:
307
+ - 查询项目列表
308
+ - 创建新项目
309
+ - 更新项目信息
310
+ - 删除项目
311
+
312
+ ## 使用场景
313
+
314
+ - 用户询问:"查询所有项目"
315
+ - 用户询问:"创建一个新项目"
316
+ - 用户询问:"更新项目信息"
317
+
318
+ ## 可用命令
319
+
320
+ ### 查询项目列表
321
+
322
+ \`\`\`bash
323
+ soke-cli your-module +list-items [选项]
324
+ \`\`\`
325
+
326
+ **参数说明:**
327
+ - `--page <number>`: 页码(可选,默认:1)
328
+ - `--page-size <number>`: 每页数量(可选,默认:10)
329
+ - `--keyword <string>`: 搜索关键词(可选)
330
+
331
+ **使用示例:**
332
+ \`\`\`bash
333
+ # 查询第一页
334
+ soke-cli your-module +list-items
335
+
336
+ # 搜索包含"测试"的项目
337
+ soke-cli your-module +list-items --keyword "测试"
338
+ \`\`\`
339
+
340
+ ## 交互流程
341
+
342
+ 1. 识别用户意图(查询/创建/更新/删除)
343
+ 2. 提示用户提供必要参数
344
+ 3. 执行对应的 CLI 命令
345
+ 4. 解析并展示结果
346
+
347
+ ## 错误处理
348
+
349
+ - 如果用户未登录,提示执行 `soke-cli auth login`
350
+ - 如果参数缺失,提示用户补充必要参数
351
+ - 如果 API 返回错误,展示友好的错误信息
352
+ ```
353
+
354
+ **步骤 3: 更新 skills/README.md**
355
+
356
+ 在 `skills/README.md` 中添加新 Skill 的说明。
357
+
358
+ #### 3️⃣ 本地测试 Skill
359
+
360
+ **方法一:一键测试脚本(推荐)**
361
+
362
+ ```bash
363
+ # 1. 编译、安装到全局、运行测试
364
+ bash ./scripts/local-test.sh
365
+ # 提示时输入 'y' 更新全局安装
366
+
367
+ # 2. 链接 Skills 到 AI Agent
368
+ bash ./scripts/link-skills.sh
369
+ # 选择 'all' 链接到所有目录
370
+
371
+ # 3. 在 AI Agent 中测试
372
+ # 打开 Claude Code,输入:"查询所有项目"
373
+ ```
374
+
375
+ **方法二:手动测试**
376
+
377
+ ```bash
378
+ # 1. 编译项目
379
+ go build -o soke-cli main.go
380
+
381
+ # 2. 测试命令是否正常工作
382
+ ./soke-cli your-module +list-items --help
383
+
384
+ # 3. 安装到全局
385
+ sudo cp soke-cli /usr/local/bin/
386
+
387
+ # 4. 链接 Skill 到 Claude
388
+ mkdir -p ~/.claude/skills/your-module
389
+ cp skills/your-module/SKILL.md ~/.claude/skills/your-module/
390
+
391
+ # 5. 在 Claude Code 中测试
392
+ # 输入:"查询所有项目"
393
+ ```
394
+
395
+ **测试检查清单:**
396
+ - [ ] CLI 命令能正常执行
397
+ - [ ] 参数验证正确
398
+ - [ ] API 调用成功
399
+ - [ ] 输出格式正确
400
+ - [ ] AI Agent 能识别意图
401
+ - [ ] AI Agent 能正确调用命令
402
+ - [ ] 错误处理友好
403
+
404
+ #### 4️⃣ 用 Go 编译二进制文件
405
+
406
+ **编译单平台二进制**
407
+
408
+ ```bash
409
+ # macOS (Intel)
410
+ GOOS=darwin GOARCH=amd64 go build -o bin/soke-cli-darwin-amd64 main.go
411
+
412
+ # macOS (Apple Silicon)
413
+ GOOS=darwin GOARCH=arm64 go build -o bin/soke-cli-darwin-arm64 main.go
414
+
415
+ # Linux
416
+ GOOS=linux GOARCH=amd64 go build -o bin/soke-cli-linux-amd64 main.go
417
+
418
+ # Windows
419
+ GOOS=windows GOARCH=amd64 go build -o bin/soke-cli-windows-amd64.exe main.go
420
+ ```
421
+
422
+ **一键编译所有平台**
423
+
424
+ ```bash
425
+ # 使用编译脚本
426
+ bash ./scripts/build-binaries.sh
427
+
428
+ # 编译结果在 bin/ 目录下
429
+ ls -lh bin/
430
+ ```
431
+
432
+ **编译优化选项**
433
+
434
+ ```bash
435
+ # 减小二进制文件大小
436
+ go build -ldflags="-s -w" -o soke-cli main.go
437
+
438
+ # 添加版本信息
439
+ VERSION=$(git describe --tags --always)
440
+ go build -ldflags="-X main.Version=$VERSION" -o soke-cli main.go
441
+ ```
442
+
443
+ #### 5️⃣ 发布到 NPM 和 GitHub
444
+
445
+ **准备工作**
446
+
447
+ ```bash
448
+ # 1. 确保已登录 NPM
449
+ npm login
450
+
451
+ # 2. 确保已登录 GitHub CLI
452
+ gh auth login
453
+
454
+ # 3. 确保代码已提交
455
+ git add .
456
+ git commit -m "feat: 添加新模块"
457
+ git push
458
+ ```
459
+
460
+ **发布流程**
461
+
462
+ **方法一:一键发布(推荐)**
463
+
464
+ ```bash
465
+ # 1. 更新版本号
466
+ npm version patch # 1.0.0 -> 1.0.1
467
+ # 或
468
+ npm version minor # 1.0.0 -> 1.1.0
469
+ # 或
470
+ npm version major # 1.0.0 -> 2.0.0
471
+
472
+ # 2. 执行一键发布脚本
473
+ bash ./scripts/release.sh
474
+
475
+ # 脚本会自动完成:
476
+ # - 编译所有平台二进制文件
477
+ # - 创建 Git 标签
478
+ # - 推送标签到 GitHub
479
+ # - 创建 GitHub Release 并上传二进制文件
480
+ # - 发布到 NPM
481
+ ```
482
+
483
+ **方法二:手动发布**
484
+
485
+ ```bash
486
+ # 1. 更新版本号
487
+ npm version patch
488
+
489
+ # 2. 编译所有平台
490
+ bash ./scripts/build-binaries.sh
491
+
492
+ # 3. 创建并推送标签
493
+ VERSION=$(node -p "require('./package.json').version")
494
+ git tag v$VERSION
495
+ git push origin v$VERSION
496
+
497
+ # 4. 创建 GitHub Release
498
+ gh release create v$VERSION \
499
+ bin/soke-cli-darwin-amd64 \
500
+ bin/soke-cli-darwin-arm64 \
501
+ bin/soke-cli-linux-amd64 \
502
+ bin/soke-cli-windows-amd64.exe \
503
+ --title "v$VERSION" \
504
+ --notes "Release v$VERSION"
505
+
506
+ # 5. 发布到 NPM
507
+ npm publish --access public
508
+
509
+ # 6. 验证发布
510
+ npm view @sokeai/cli version
511
+ ```
512
+
513
+ **发布后验证**
514
+
515
+ ```bash
516
+ # 1. 测试 NPM 安装
517
+ npm install -g @sokeai/cli@latest
518
+
519
+ # 2. 验证版本
520
+ soke-cli --version
521
+
522
+ # 3. 测试命令
523
+ soke-cli your-module +list-items --help
524
+
525
+ # 4. 测试 Skills 安装
526
+ npx skills add liuchenlong1111/soke-cli -y -g
527
+
528
+ # 5. 在 AI Agent 中测试
529
+ # 打开 Claude Code,输入:"查询所有项目"
530
+ ```
531
+
532
+ ### 本地开发测试
533
+
534
+ **🚀 快速测试流程(推荐)**
535
+
536
+ ```bash
537
+ # 1. 一键测试:编译、安装到全局、运行测试(一条命令)
538
+ bash ./scripts/local-test.sh
539
+ # 提示时输入 'y' 更新全局安装
540
+
541
+ # 2. 链接 Skills 到 Claude(首次需要)
542
+ bash ./scripts/link-skills.sh
543
+ # 选择 'all' 链接到所有目录
544
+
545
+ # 3. 在 AI Agent 中测试
546
+ # 打开 Claude Code,输入:"查询张三的学习档案"
547
+ ```
548
+
549
+ **📖 详细指南:** [docs/LOCAL_TESTING.md](docs/LOCAL_TESTING.md)
150
550
 
151
- - `cmd/`: 存放所有 CLI 子命令的定义(按业务模块划分,如 `auth`, `course`, `exam` 等)。
152
- - `internal/`: 存放核心逻辑,包括认证 (`auth`)、API 客户端封装 (`client`)、配置管理 (`core`) 以及输出格式化 (`output`) 等。
153
- - `shortcuts/`: 定义了各个业务模块的快捷命令元数据(API路径、参数、默认值等),供 `cmd/` 动态注册命令使用。
154
- - `scripts/`: NPM 包相关的安装与运行脚本。
155
- - `main.go`: CLI 的主入口文件。
551
+ **完整开发流程**
552
+
553
+ ```bash
554
+ # 1. 修改代码后,运行本地测试(会提示是否更新全局安装)
555
+ bash ./scripts/local-test.sh
556
+
557
+ # 2. 运行完整 E2E 测试
558
+ bash ./scripts/e2e-test.sh
559
+
560
+ # 3. 测试 Skills(需要先更新全局安装)
561
+ npx skills add liuchenlong1111/soke-cli -y -g
562
+
563
+ # 4. 在 AI Agent 中测试自然语言交互
564
+ # 例如:"查询张三的学习档案"
565
+ ```
566
+
567
+ **运行完整 E2E 测试**
568
+
569
+ ```bash
570
+ # 测试所有模块
571
+ bash ./scripts/e2e-test.sh
572
+
573
+ # 测试特定模块
574
+ bash ./scripts/e2e-test.sh learning-profile
575
+ bash ./scripts/e2e-test.sh contact
576
+ ```
577
+
578
+ ## 项目结构
579
+
580
+ ```
581
+ soke-cli/
582
+ ├── cmd/ # CLI 子命令定义(按业务模块划分)
583
+ │ ├── root.go # 根命令和命令注册
584
+ │ ├── auth/ # 认证相关命令
585
+ │ ├── config/ # 配置管理命令
586
+ │ ├── api/ # 通用 API 调用命令
587
+ │ └── your_module/ # 你的业务模块命令
588
+ ├── internal/ # 核心逻辑(不对外暴露)
589
+ │ ├── auth/ # 认证逻辑(OAuth Device Flow)
590
+ │ ├── client/ # API 客户端封装
591
+ │ ├── core/ # 配置管理
592
+ │ └── output/ # 输出格式化
593
+ ├── shortcuts/ # 业务模块快捷命令元数据定义
594
+ │ └── your-module/ # 各模块的 API 路径、参数、默认值等
595
+ ├── skills/ # AI Agent Skills 定义
596
+ │ ├── README.md # Skills 使用说明
597
+ │ └── your-module/ # 各模块的 Skill 文档
598
+ │ └── SKILL.md
599
+ ├── scripts/ # 构建和发布脚本
600
+ │ ├── install.js # NPM 安装时下载二进制文件
601
+ │ ├── run.js # NPM 运行时入口
602
+ │ ├── build-binaries.sh # 编译所有平台二进制
603
+ │ ├── release.sh # 一键发布脚本
604
+ │ ├── local-test.sh # 本地测试脚本
605
+ │ └── link-skills.sh # 链接 Skills 到 AI Agent
606
+ ├── main.go # CLI 主入口
607
+ ├── go.mod # Go 依赖管理
608
+ ├── package.json # NPM 包配置
609
+ ├── Makefile # 编译和安装脚本
610
+ └── README.md # 项目说明文档
611
+ ```
156
612
 
157
- ## 开发与贡献
613
+ ## 相关文档
158
614
 
159
- 1. 依赖管理:项目使用 Go Modules,可以运行 `go mod tidy` 整理依赖。
160
- 2. 添加新命令:
161
- - 业务接口建议在 `shortcuts/` 目录下添加对应的结构定义。
162
- - 基础功能可在 `cmd/` 下新建对应包并在 `cmd/root.go` 中注册。
163
- 3. 测试:运行 `make test` 进行单元测试。
615
+ - **[QUICKSTART.md](QUICKSTART.md)** - 快速开始指南
616
+ - **[CLAUDE.md](CLAUDE.md)** - 项目架构和开发规范
617
+ - **[docs/LOCAL_TESTING.md](docs/LOCAL_TESTING.md)** - 本地测试详细指南
618
+ - **[skills/README.md](skills/README.md)** - AI Agent Skills 使用说明
619
+ - **[npm.md](npm.md)** - NPM 包发布详细文档
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sokeai/cli",
3
- "version": "1.0.21",
3
+ "version": "1.0.25",
4
4
  "description": "授客AI官方CLI工具 - 支持AI Agent Skills",
5
5
  "bin": {
6
6
  "soke-cli": "scripts/run.js"
@@ -42,6 +42,35 @@ if [ ! -f "./soke-cli" ]; then
42
42
  echo ""
43
43
  fi
44
44
 
45
+ # 检查全局安装的 CLI 版本
46
+ echo -e "${YELLOW}检查全局 CLI 安装...${NC}"
47
+ GLOBAL_CLI=$(which soke-cli 2>/dev/null)
48
+ if [ -n "$GLOBAL_CLI" ]; then
49
+ echo -e " 全局 CLI 路径: ${BLUE}${GLOBAL_CLI}${NC}"
50
+
51
+ # 检查全局版本是否支持 learning-profile
52
+ if ! $GLOBAL_CLI learning-profile --help &>/dev/null; then
53
+ echo -e "${YELLOW} 警告: 全局 CLI 不支持 learning-profile 模块${NC}"
54
+ echo -e "${YELLOW} 需要更新全局安装以支持 skill 测试${NC}"
55
+ echo ""
56
+ echo -e "${YELLOW}是否要将本地编译版本安装到全局? (y/n)${NC}"
57
+ read -r INSTALL_GLOBAL
58
+ if [ "$INSTALL_GLOBAL" = "y" ] || [ "$INSTALL_GLOBAL" = "Y" ]; then
59
+ echo -e "${YELLOW}安装到全局...${NC}"
60
+ sudo cp ./soke-cli $GLOBAL_CLI
61
+ echo -e "${GREEN}✓ 全局 CLI 已更新${NC}"
62
+ else
63
+ echo -e "${YELLOW}跳过全局安装,将仅测试本地版本${NC}"
64
+ fi
65
+ else
66
+ echo -e "${GREEN}✓ 全局 CLI 支持 learning-profile 模块${NC}"
67
+ fi
68
+ else
69
+ echo -e "${YELLOW} 未找到全局 CLI 安装${NC}"
70
+ echo -e "${YELLOW} Skill 测试需要全局安装 soke-cli${NC}"
71
+ fi
72
+ echo ""
73
+
45
74
  # 检查是否已登录
46
75
  echo -e "${YELLOW}检查登录状态...${NC}"
47
76
  if ! ./soke-cli config show &>/dev/null; then
@@ -99,6 +128,15 @@ if should_test_module "contact"; then
99
128
  test_command "contact" "+list-lectors" "" "获取讲师列表"
100
129
  test_command "contact" "+list-groups" "--start-time 1672502400000 --end-time 1704038400000" "获取用户组列表"
101
130
  test_command "contact" "+search-user" "--dept-user-name 测试" "搜索用户"
131
+ test_command "contact" "+search-dept" "--dept-name 测试" "搜索部门"
132
+ echo ""
133
+ fi
134
+
135
+ # ==================== Learning Profile 模块 ====================
136
+ if should_test_module "learning-profile"; then
137
+ echo -e "${YELLOW}[Learning Profile 模块]${NC}"
138
+ test_command "learning-profile" "+list" "--offset 0 --page-size 10" "获取学习档案列表"
139
+ test_command "learning-profile" "+list" "--is-new 1 --page-size 5" "获取新员工学习档案"
102
140
  echo ""
103
141
  fi
104
142