@cli-skill/cli 0.0.1-beta-d3a2d41 → 0.0.1-beta.20260402073007
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 +123 -0
- package/package.json +5 -4
- package/skill/SKILL.md +109 -61
- package/skill/references/core.md +229 -0
- package/src/app.ts +4 -10
- package/src/build.ts +371 -0
- package/src/commands/skill.ts +170 -0
- package/src/config.ts +18 -4
- package/src/constants.ts +10 -0
- package/src/index.ts +2 -1
- package/src/project.ts +48 -27
- package/src/registry.ts +62 -2
- package/src/version.ts +20 -0
- package/test/build.test.ts +112 -0
- package/test/config.test.ts +72 -0
- package/tsconfig.json +2 -1
- package/tsconfig.test.json +8 -0
- package/src/commands/disable.ts +0 -13
- package/src/commands/docs.ts +0 -22
- package/src/commands/enable.ts +0 -13
- package/src/commands/publish.ts +0 -24
package/README.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# @cli-skill/cli
|
|
2
|
+
|
|
3
|
+
`@cli-skill/cli` 是 `cli-skill` 的平台命令行入口。
|
|
4
|
+
|
|
5
|
+
它不是某一个具体 skill 的运行时,而是整个 skill 生命周期的管理入口。
|
|
6
|
+
|
|
7
|
+
## 主要职责
|
|
8
|
+
|
|
9
|
+
- 创建新的 skill 项目
|
|
10
|
+
- 提供统一的 skill 作用域命令入口
|
|
11
|
+
- 构建 `skill/` 产物
|
|
12
|
+
- 安装和卸载已发布 skill
|
|
13
|
+
- 挂载和取消挂载本地 skill
|
|
14
|
+
- 发布本地 skill
|
|
15
|
+
- 读写 `~/.cli-skill/config.json`
|
|
16
|
+
|
|
17
|
+
## 命令结构
|
|
18
|
+
|
|
19
|
+
### 平台命令
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cli-skill create <skillName> --cli-name <cliName> [--template <templateName>]
|
|
23
|
+
cli-skill list
|
|
24
|
+
cli-skill install <skillName> [--packageName <packageName>]
|
|
25
|
+
cli-skill uninstall <packageName>
|
|
26
|
+
cli-skill config get [keyPath]
|
|
27
|
+
cli-skill config set <keyPath> <value>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### skill 作用域命令
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
cli-skill <skillName> list
|
|
34
|
+
cli-skill <skillName> run <toolName> [rawInput]
|
|
35
|
+
cli-skill <skillName> config get [keyPath]
|
|
36
|
+
cli-skill <skillName> config set <keyPath> <value>
|
|
37
|
+
cli-skill <skillName> config unset <keyPath>
|
|
38
|
+
cli-skill <skillName> mount [targetPath]
|
|
39
|
+
cli-skill <skillName> unmount [targetPath]
|
|
40
|
+
cli-skill <skillName> build
|
|
41
|
+
cli-skill <skillName> publish [--dry-run] [--tag <tag>]
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 典型工作流
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
cli-skill create my-skill --cli-name my-skill
|
|
48
|
+
cd ~/.cli-skill/skills/my-skill
|
|
49
|
+
bun install
|
|
50
|
+
cli-skill my-skill build
|
|
51
|
+
cli-skill my-skill mount
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## skill 项目结构
|
|
55
|
+
|
|
56
|
+
一个标准 skill 项目包含:
|
|
57
|
+
|
|
58
|
+
- `src/index.ts`
|
|
59
|
+
- `src/tools/*`
|
|
60
|
+
- `src/skill/*`
|
|
61
|
+
|
|
62
|
+
其中:
|
|
63
|
+
|
|
64
|
+
- `src/index.ts`
|
|
65
|
+
- 定义并导出 skill
|
|
66
|
+
- `src/tools/*`
|
|
67
|
+
- 定义 tools
|
|
68
|
+
- `src/skill/*`
|
|
69
|
+
- 文档模板源目录
|
|
70
|
+
|
|
71
|
+
执行 `build` 后会生成:
|
|
72
|
+
|
|
73
|
+
- `skill/SKILL.md`
|
|
74
|
+
- `skill/agents/openai.yaml`
|
|
75
|
+
|
|
76
|
+
所以:
|
|
77
|
+
|
|
78
|
+
- `src/skill/` 是源码
|
|
79
|
+
- 根目录 `skill/` 是产物
|
|
80
|
+
|
|
81
|
+
## build 输入
|
|
82
|
+
|
|
83
|
+
`cli-skill <skillName> build` 会读取:
|
|
84
|
+
|
|
85
|
+
- `src/index.ts`
|
|
86
|
+
- `src/skill/`
|
|
87
|
+
|
|
88
|
+
`src/skill/` 下的 `.md`、`.yaml`、`.yml` 文件会被当成模板渲染到根目录 `skill/`。
|
|
89
|
+
|
|
90
|
+
当前常用模板变量有:
|
|
91
|
+
|
|
92
|
+
- `{{name}}`
|
|
93
|
+
- `{{description}}`
|
|
94
|
+
- `{{overview}}`
|
|
95
|
+
- `{{toolReference}}`
|
|
96
|
+
- `{{configReference}}`
|
|
97
|
+
|
|
98
|
+
## 安装模型
|
|
99
|
+
|
|
100
|
+
本地 skill 默认放在:
|
|
101
|
+
|
|
102
|
+
- `~/.cli-skill/skills`
|
|
103
|
+
|
|
104
|
+
托管安装目录默认是:
|
|
105
|
+
|
|
106
|
+
- `~/.cli-skill/installed`
|
|
107
|
+
|
|
108
|
+
默认 agent 目录是:
|
|
109
|
+
|
|
110
|
+
- `~/.agents/skills`
|
|
111
|
+
|
|
112
|
+
`install` 默认接受 skill 名。CLI 会在 npm 中查找同时包含:
|
|
113
|
+
|
|
114
|
+
- `cli-skill`
|
|
115
|
+
- `<skillName>`
|
|
116
|
+
|
|
117
|
+
这两个关键词的包。
|
|
118
|
+
|
|
119
|
+
如果已经知道包名,可以显式指定:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
cli-skill install fx --packageName @scope/cli-skill-fx
|
|
123
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cli-skill/cli",
|
|
3
|
-
"version": "0.0.1-beta
|
|
3
|
+
"version": "0.0.1-beta.20260402073007",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -15,11 +15,12 @@
|
|
|
15
15
|
},
|
|
16
16
|
"scripts": {
|
|
17
17
|
"build": "tsc -p tsconfig.json",
|
|
18
|
-
"
|
|
18
|
+
"test": "tsc -p tsconfig.test.json && bun test ./test"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@cli-skill/core": "^0.0.1-beta
|
|
21
|
+
"@cli-skill/core": "^0.0.1-beta.20260402073007",
|
|
22
22
|
"cac": "^6.7.14",
|
|
23
|
-
"lodash": "^4.17.21"
|
|
23
|
+
"lodash": "^4.17.21",
|
|
24
|
+
"zod": "^3.25.76"
|
|
24
25
|
}
|
|
25
26
|
}
|
package/skill/SKILL.md
CHANGED
|
@@ -1,106 +1,154 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cli-skill-creator
|
|
3
|
-
description:
|
|
3
|
+
description: 当任务涉及 cli skill 的创建、挂载、安装、发布或配置时,使用 cli-skill CLI。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# cli-skill-creator
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
这个 skill 面向的是:需要创建、修改、接通、安装或发布 cli skill 的任务。
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
如果需要查看 skill 源码结构和 core API 参考,继续看:
|
|
11
11
|
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
12
|
+
- [references/core.md](/Users/bin.jia1/work/github/cli-skill/packages/cli/skill/references/core.md)
|
|
13
|
+
|
|
14
|
+
## 使用时机
|
|
15
|
+
|
|
16
|
+
- 创建新的 cli skill
|
|
17
|
+
- 修改已有 skill
|
|
18
|
+
- 构建 `skill/` 产物
|
|
19
|
+
- 把本地 skill 接到 agent 目录
|
|
20
|
+
- 安装或卸载已发布 skill
|
|
21
|
+
- 发布本地 skill
|
|
22
|
+
- 读写 cli-skill 配置
|
|
23
|
+
|
|
24
|
+
## 工作模型
|
|
25
|
+
|
|
26
|
+
处理 cli skill 时,默认按两层命令来理解:
|
|
27
|
+
|
|
28
|
+
- 平台命令
|
|
29
|
+
- `cli-skill create`
|
|
30
|
+
- `cli-skill list`
|
|
31
|
+
- `cli-skill install`
|
|
32
|
+
- `cli-skill uninstall`
|
|
33
|
+
- `cli-skill config ...`
|
|
34
|
+
- skill 作用域命令
|
|
35
|
+
- `cli-skill <skill-name> ...`
|
|
36
|
+
|
|
37
|
+
skill 自己的 bin 只是一个转发入口,仍然会落到 `cli-skill <skill-name> ...`。
|
|
17
38
|
|
|
18
39
|
## 默认流程
|
|
19
40
|
|
|
20
|
-
|
|
41
|
+
当用户要新建一个 skill 时,默认流程是:
|
|
21
42
|
|
|
22
43
|
```bash
|
|
23
44
|
cli-skill create <skill-name> --cli-name <cli-name>
|
|
24
45
|
bun install
|
|
25
|
-
cli-skill
|
|
26
|
-
cli-skill
|
|
46
|
+
cli-skill <skill-name> build
|
|
47
|
+
cli-skill <skill-name> mount
|
|
27
48
|
```
|
|
28
49
|
|
|
29
|
-
|
|
50
|
+
如果没有提供 `cli-name`,默认令它等于 `skill-name`。
|
|
51
|
+
|
|
52
|
+
## 项目结构
|
|
30
53
|
|
|
31
|
-
|
|
54
|
+
默认 skill 项目结构:
|
|
55
|
+
|
|
56
|
+
- `src/index.ts`
|
|
57
|
+
- `src/tools/*`
|
|
58
|
+
- `src/skill/*`
|
|
59
|
+
|
|
60
|
+
含义:
|
|
61
|
+
|
|
62
|
+
- `src/index.ts`
|
|
63
|
+
- skill 定义入口
|
|
64
|
+
- `src/tools/*`
|
|
65
|
+
- tool 源码
|
|
66
|
+
- `src/skill/*`
|
|
67
|
+
- 文档模板源目录
|
|
68
|
+
|
|
69
|
+
执行:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
cli-skill <skill-name> build
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
会生成:
|
|
76
|
+
|
|
77
|
+
- `skill/SKILL.md`
|
|
78
|
+
- `skill/agents/openai.yaml`
|
|
79
|
+
|
|
80
|
+
## 常用命令
|
|
32
81
|
|
|
33
82
|
| 场景 | 命令 |
|
|
34
83
|
| --- | --- |
|
|
35
84
|
| 创建 skill | `cli-skill create <skill-name> --cli-name <cli-name> [--template <templateName>]` |
|
|
36
|
-
|
|
|
37
|
-
| 取消激活本地 skill | `cli-skill disable <skill-name> [--agentPath <path>]` |
|
|
85
|
+
| 查看 skill 列表 | `cli-skill list` |
|
|
38
86
|
| 安装已发布 skill | `cli-skill install <skill-name>` |
|
|
39
87
|
| 卸载已发布 skill | `cli-skill uninstall <package-name>` |
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
|
88
|
+
| 查看 tool 列表 | `cli-skill <skill-name> list` |
|
|
89
|
+
| 运行 tool | `cli-skill <skill-name> run <tool-name> [rawInput]` |
|
|
90
|
+
| 读取 skill 配置 | `cli-skill <skill-name> config get [keyPath]` |
|
|
91
|
+
| 写入 skill 配置 | `cli-skill <skill-name> config set <keyPath> <value>` |
|
|
92
|
+
| 删除 skill 配置 | `cli-skill <skill-name> config unset <keyPath>` |
|
|
93
|
+
| 挂载 skill | `cli-skill <skill-name> mount [targetPath]` |
|
|
94
|
+
| 取消挂载 skill | `cli-skill <skill-name> unmount [targetPath]` |
|
|
95
|
+
| 构建 skill 产物 | `cli-skill <skill-name> build` |
|
|
96
|
+
| 发布本地 skill | `cli-skill <skill-name> publish [--dry-run] [--tag <tag>]` |
|
|
97
|
+
| 读取全局配置 | `cli-skill config get [keyPath]` |
|
|
98
|
+
| 写入全局配置 | `cli-skill config set <keyPath> <value>` |
|
|
45
99
|
|
|
46
100
|
## 关键规则
|
|
47
101
|
|
|
48
|
-
- `create`
|
|
49
|
-
-
|
|
50
|
-
- `
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
|
|
54
|
-
- `
|
|
55
|
-
- `
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
-
|
|
60
|
-
- 搜索条件包含 `cli-skill` 和 `<skill-name>`
|
|
61
|
-
- 只有唯一命中时才会安装
|
|
62
|
-
- `install <skill-name> --packageName <package-name>` 会直接按显式包名安装
|
|
63
|
-
- `i` 是 `install` 的简写
|
|
64
|
-
- `publish <skill-name>` 会从 `~/.cli-skill/skills/<skill-name>` 找到本地 skill 项目,并执行 `bun publish`
|
|
65
|
-
- skill 项目默认创建在:
|
|
102
|
+
- `create` 只创建项目,不会自动安装依赖,也不会自动挂载。
|
|
103
|
+
- `build` 负责把 `src/skill/*` 渲染成根目录 `skill/*`。
|
|
104
|
+
- `mount` 负责:
|
|
105
|
+
- 接通 skill 的 bin
|
|
106
|
+
- 注册根目录 `skill/` 到 agent 目录
|
|
107
|
+
- `mount` 不应隐式执行 `install`。
|
|
108
|
+
- `install` / `uninstall` 面向已发布 skill。
|
|
109
|
+
- `publish` 只针对本地 skill。
|
|
110
|
+
|
|
111
|
+
默认目录:
|
|
112
|
+
|
|
113
|
+
- 本地 skill:
|
|
66
114
|
- `~/.cli-skill/skills/<skill-name>`
|
|
67
|
-
-
|
|
115
|
+
- 托管安装目录:
|
|
68
116
|
- `~/.cli-skill/installed`
|
|
69
|
-
- agent
|
|
117
|
+
- agent 默认目录:
|
|
70
118
|
- `~/.agents/skills/<skill-name>`
|
|
71
|
-
- 包名可以带 `cli-skill-` 前缀,但 agent 使用的 skill 名不带这个前缀。
|
|
72
|
-
- 如果用户只是要修改某个已有 skill,不要重新 `create`,直接进入现有 skill 目录工作。
|
|
73
119
|
|
|
74
|
-
##
|
|
120
|
+
## 配置
|
|
75
121
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
-
|
|
122
|
+
全局配置文件:
|
|
123
|
+
|
|
124
|
+
- `~/.cli-skill/config.json`
|
|
125
|
+
|
|
126
|
+
skill 作用域配置路径:
|
|
127
|
+
|
|
128
|
+
- `skillConfig.<skill-name>`
|
|
129
|
+
|
|
130
|
+
常见命令:
|
|
79
131
|
|
|
80
132
|
```bash
|
|
81
133
|
cli-skill config get
|
|
82
|
-
cli-skill config
|
|
83
|
-
cli-skill config
|
|
134
|
+
cli-skill config set skillsRoot ~/.cli-skill/skills
|
|
135
|
+
cli-skill <skill-name> config get
|
|
136
|
+
cli-skill <skill-name> config set baseUrl https://example.com
|
|
84
137
|
```
|
|
85
138
|
|
|
86
|
-
|
|
87
|
-
- `skillConfig.fx.baseUrl`
|
|
88
|
-
- `skillConfig.fx.env.TEST_VALUE`
|
|
89
|
-
|
|
90
|
-
## 文档同步规则
|
|
139
|
+
## 文档规则
|
|
91
140
|
|
|
92
|
-
- skill
|
|
93
|
-
-
|
|
141
|
+
- `src/skill/*` 是模板源目录
|
|
142
|
+
- `skill/*` 是生成产物
|
|
143
|
+
- tool 或配置变更后,应重新执行:
|
|
94
144
|
|
|
95
145
|
```bash
|
|
96
|
-
cli-skill
|
|
146
|
+
cli-skill <skill-name> build
|
|
97
147
|
```
|
|
98
148
|
|
|
99
|
-
- 不要手写维护这两个生成区块,除非用户明确要求。
|
|
100
|
-
|
|
101
149
|
## 不要做的事
|
|
102
150
|
|
|
103
151
|
- 不要把 `create` 当成“已经可执行”
|
|
104
|
-
-
|
|
105
|
-
-
|
|
106
|
-
-
|
|
152
|
+
- 不要手动改 `~/.agents/skills`
|
|
153
|
+
- 不要把 skill bin 当成独立平台
|
|
154
|
+
- 不要在修改已有 skill 时重新 `create`
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Core Reference
|
|
2
|
+
|
|
3
|
+
这份参考页回答的不是“命令怎么敲”,而是:
|
|
4
|
+
|
|
5
|
+
**一个 cli skill 的源码应该怎么组织。**
|
|
6
|
+
|
|
7
|
+
如果主 `SKILL.md` 解决的是工作流,那么这里解决的是源码模型。
|
|
8
|
+
|
|
9
|
+
## 先建立心智
|
|
10
|
+
|
|
11
|
+
写一个 cli skill 时,先把这三层区分开:
|
|
12
|
+
|
|
13
|
+
- `tool`
|
|
14
|
+
- 真正执行动作的最小单元
|
|
15
|
+
- `skill`
|
|
16
|
+
- 对 tools 的组织与描述
|
|
17
|
+
- `build` 产物
|
|
18
|
+
- 给 agent 使用的 `skill/` 目录
|
|
19
|
+
|
|
20
|
+
源码不是直接写给 agent 的。
|
|
21
|
+
源码先定义 skill 和 tools,然后再由 `build` 生成 agent 真正消费的产物。
|
|
22
|
+
|
|
23
|
+
## skill 项目源码结构
|
|
24
|
+
|
|
25
|
+
当前单个 skill 项目默认包含:
|
|
26
|
+
|
|
27
|
+
- `src/index.ts`
|
|
28
|
+
- `src/tools/*`
|
|
29
|
+
- `src/skill/*`
|
|
30
|
+
|
|
31
|
+
它们的职责分别是:
|
|
32
|
+
|
|
33
|
+
- `src/index.ts`
|
|
34
|
+
- 定义并导出 skill
|
|
35
|
+
- `src/tools/*`
|
|
36
|
+
- 定义 tools
|
|
37
|
+
- `src/skill/*`
|
|
38
|
+
- 文档模板源目录
|
|
39
|
+
|
|
40
|
+
执行:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
cli-skill <skill-name> build
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
之后,根目录会生成:
|
|
47
|
+
|
|
48
|
+
- `skill/SKILL.md`
|
|
49
|
+
- `skill/agents/openai.yaml`
|
|
50
|
+
|
|
51
|
+
所以一定要区分:
|
|
52
|
+
|
|
53
|
+
- `src/skill/*` 是源码
|
|
54
|
+
- `skill/*` 是产物
|
|
55
|
+
|
|
56
|
+
## `defineSkill` 负责什么
|
|
57
|
+
|
|
58
|
+
`defineSkill` 只负责描述这个 skill 本身。
|
|
59
|
+
|
|
60
|
+
当前它声明的是:
|
|
61
|
+
|
|
62
|
+
- `name`
|
|
63
|
+
- `description`
|
|
64
|
+
- `overview`
|
|
65
|
+
- `config`
|
|
66
|
+
- `tools`
|
|
67
|
+
|
|
68
|
+
也就是说,skill 只做“组织”和“说明”,不直接承担运行时能力注入。
|
|
69
|
+
|
|
70
|
+
## `defineTool` 负责什么
|
|
71
|
+
|
|
72
|
+
`defineTool` 才是运行能力的核心。
|
|
73
|
+
|
|
74
|
+
一个 tool 当前声明这些内容:
|
|
75
|
+
|
|
76
|
+
- `name`
|
|
77
|
+
- `description`
|
|
78
|
+
- `plugins`
|
|
79
|
+
- `examples`
|
|
80
|
+
- `inputSchema`
|
|
81
|
+
- `outputSchema`
|
|
82
|
+
- `run(input, ctx)`
|
|
83
|
+
|
|
84
|
+
最关键的一点是:
|
|
85
|
+
|
|
86
|
+
- tool 自己声明 `plugins`
|
|
87
|
+
- `ctx` 从 `plugins` 自动推导
|
|
88
|
+
|
|
89
|
+
所以你不需要手写 `ctx` 泛型,也不需要在 skill 上重复声明插件。
|
|
90
|
+
|
|
91
|
+
## 为什么 plugin 放在 tool 上
|
|
92
|
+
|
|
93
|
+
当前模型里,tool 才是真正执行动作的单位。
|
|
94
|
+
|
|
95
|
+
所以:
|
|
96
|
+
|
|
97
|
+
- skill 只负责组织 tools
|
|
98
|
+
- tool 负责声明自己需要什么能力
|
|
99
|
+
|
|
100
|
+
这样做的结果是:
|
|
101
|
+
|
|
102
|
+
- skill 更轻
|
|
103
|
+
- tool 的依赖更清楚
|
|
104
|
+
- `ctx` 的来源更明确
|
|
105
|
+
|
|
106
|
+
换句话说,运行时能力是“执行问题”,不是“文档问题”。
|
|
107
|
+
所以 plugin 挂在 tool 上,比挂在 skill 上更合理。
|
|
108
|
+
|
|
109
|
+
## plugin 注入怎么理解
|
|
110
|
+
|
|
111
|
+
plugin 负责两件事:
|
|
112
|
+
|
|
113
|
+
1. 提供运行时能力
|
|
114
|
+
2. 为 `ctx` 提供类型
|
|
115
|
+
|
|
116
|
+
例如 `browserPlugin` 会提供:
|
|
117
|
+
|
|
118
|
+
- `browser`
|
|
119
|
+
- `context`
|
|
120
|
+
- `page`
|
|
121
|
+
- `request`
|
|
122
|
+
|
|
123
|
+
当 tool 写成:
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
plugins: [browserPlugin]
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
那么 `run(input, ctx)` 里的 `ctx.page`、`ctx.request` 就会自动可用。
|
|
130
|
+
|
|
131
|
+
当前 plugin 生命周期是单次执行:
|
|
132
|
+
|
|
133
|
+
1. `setup`
|
|
134
|
+
2. `tool.run`
|
|
135
|
+
3. `dispose`
|
|
136
|
+
|
|
137
|
+
所以现在默认模型是“一次命令,一次 runtime”。
|
|
138
|
+
|
|
139
|
+
## 最小源码示例
|
|
140
|
+
|
|
141
|
+
```ts
|
|
142
|
+
import { z } from "zod";
|
|
143
|
+
import { browserPlugin, defineSkill, defineTool } from "@cli-skill/core";
|
|
144
|
+
|
|
145
|
+
const inputSchema = z.object({
|
|
146
|
+
url: z.string().url(),
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
const outputSchema = z.object({
|
|
150
|
+
url: z.string().url(),
|
|
151
|
+
title: z.string(),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const openPageTool = defineTool({
|
|
155
|
+
name: "open_page",
|
|
156
|
+
description: "Open a page and return its title.",
|
|
157
|
+
plugins: [browserPlugin],
|
|
158
|
+
inputSchema,
|
|
159
|
+
outputSchema,
|
|
160
|
+
async run(input, ctx) {
|
|
161
|
+
await ctx.page.goto(input.url);
|
|
162
|
+
return {
|
|
163
|
+
url: input.url,
|
|
164
|
+
title: await ctx.page.title(),
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
export default defineSkill({
|
|
170
|
+
name: "example",
|
|
171
|
+
description: "Example skill.",
|
|
172
|
+
overview: "An example skill powered by Playwright.",
|
|
173
|
+
config: {},
|
|
174
|
+
tools: [openPageTool],
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
这个例子里:
|
|
179
|
+
|
|
180
|
+
- `tool` 负责声明自己要 `browserPlugin`
|
|
181
|
+
- `skill` 只负责把它组织起来
|
|
182
|
+
- `build` 再负责生成 `skill/` 产物
|
|
183
|
+
|
|
184
|
+
## 文档模板怎么写
|
|
185
|
+
|
|
186
|
+
`src/skill/*` 下的 `.md/.yaml/.yml` 文件会在 build 时做变量替换。
|
|
187
|
+
|
|
188
|
+
当前常用变量有:
|
|
189
|
+
|
|
190
|
+
- `{{name}}`
|
|
191
|
+
- `{{description}}`
|
|
192
|
+
- `{{overview}}`
|
|
193
|
+
- `{{toolReference}}`
|
|
194
|
+
- `{{configReference}}`
|
|
195
|
+
|
|
196
|
+
所以建议把:
|
|
197
|
+
|
|
198
|
+
- Tool Reference
|
|
199
|
+
- Config Reference
|
|
200
|
+
|
|
201
|
+
交给模板变量,而不是手写重复内容。
|
|
202
|
+
|
|
203
|
+
## 依赖约定
|
|
204
|
+
|
|
205
|
+
`@cli-skill/core` 是一个库,不是最终 skill 包。
|
|
206
|
+
|
|
207
|
+
因此:
|
|
208
|
+
|
|
209
|
+
- `zod` 在 `core` 里是 `peerDependencies`
|
|
210
|
+
- skill 自己如果直接 `import { z } from "zod"`,就应在自己的包里声明 `zod`
|
|
211
|
+
|
|
212
|
+
这也是为什么生成出来的 skill 模板会把 `zod` 放在自己的 `dependencies` 里。
|
|
213
|
+
|
|
214
|
+
## 什么时候继续往下看
|
|
215
|
+
|
|
216
|
+
如果你需要的是:
|
|
217
|
+
|
|
218
|
+
- 怎么创建 skill
|
|
219
|
+
- 怎么 mount / install / publish
|
|
220
|
+
- 怎么 build 产物
|
|
221
|
+
|
|
222
|
+
优先回到主 skill 文档:
|
|
223
|
+
|
|
224
|
+
- [SKILL.md](/Users/bin.jia1/work/github/cli-skill/packages/cli/skill/SKILL.md)
|
|
225
|
+
|
|
226
|
+
这里更适合解决:
|
|
227
|
+
|
|
228
|
+
- skill 源码应该怎么写
|
|
229
|
+
- tool / skill / plugin 的职责边界是什么
|
package/src/app.ts
CHANGED
|
@@ -1,28 +1,22 @@
|
|
|
1
1
|
import { cac } from "cac";
|
|
2
2
|
import { registerConfigCommand } from "./commands/config";
|
|
3
3
|
import { registerCreateCommand } from "./commands/create";
|
|
4
|
-
import { registerDisableCommand } from "./commands/disable";
|
|
5
|
-
import { registerSyncSkillCommand } from "./commands/docs";
|
|
6
|
-
import { registerEnableCommand } from "./commands/enable";
|
|
7
4
|
import { registerInstallCommand } from "./commands/install";
|
|
8
5
|
import { registerListCommand } from "./commands/list";
|
|
9
|
-
import {
|
|
6
|
+
import { registerSkillCommand } from "./commands/skill";
|
|
10
7
|
import { registerUninstallCommand } from "./commands/uninstall";
|
|
11
8
|
|
|
12
|
-
export function createApp() {
|
|
9
|
+
export function createApp(version: string) {
|
|
13
10
|
const cli = cac("cli-skill");
|
|
14
11
|
|
|
15
12
|
registerCreateCommand(cli);
|
|
16
13
|
registerConfigCommand(cli);
|
|
17
|
-
registerSyncSkillCommand(cli);
|
|
18
14
|
registerListCommand(cli);
|
|
19
|
-
registerEnableCommand(cli);
|
|
20
|
-
registerDisableCommand(cli);
|
|
21
15
|
registerInstallCommand(cli);
|
|
22
16
|
registerUninstallCommand(cli);
|
|
23
|
-
|
|
17
|
+
registerSkillCommand(cli);
|
|
24
18
|
|
|
25
19
|
cli.help();
|
|
26
|
-
cli.version(
|
|
20
|
+
cli.version(version);
|
|
27
21
|
return cli;
|
|
28
22
|
}
|