@cli-skill/cli 0.0.1-beta-16d46c3 → 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 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-16d46c3",
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
- "check": "tsc --noEmit -p tsconfig.json"
18
+ "test": "tsc -p tsconfig.test.json && bun test ./test"
19
19
  },
20
20
  "dependencies": {
21
- "@cli-skill/core": "^0.0.1-beta-16d46c3",
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: 当需要创建、接通、安装或维护 cli skill 时,使用 cli-skill CLI 完成标准流程。
3
+ description: 当任务涉及 cli skill 的创建、挂载、安装、发布或配置时,使用 cli-skill CLI
4
4
  ---
5
5
 
6
6
  # cli-skill-creator
7
7
 
8
- 当用户要创建一个新的 cli skill,接通本地开发中的 skill,安装一个已发布的 skill,或者维护 cli-skill 的全局配置时,使用这个 skill。
8
+ 这个 skill 面向的是:需要创建、修改、接通、安装或发布 cli skill 的任务。
9
9
 
10
- ## 何时使用
10
+ 如果需要查看 skill 源码结构和 core API 参考,继续看:
11
11
 
12
- - 用户说“创建一个 cli skill
13
- - 用户要把一个本地 skill 接成可直接执行的 CLI
14
- - 用户要安装或卸载一个已发布的 cli skill
15
- - 用户要查看或修改 `~/.cli-skill/config.json`
16
- - 用户要更新某个 skill 的 `SKILL.md` 中的 Tool / Config 文档区块
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
- 如果用户要新建一个 skill,默认按下面顺序执行:
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 enable <skill-name>
26
- cli-skill sync-skill --write
46
+ cli-skill <skill-name> build
47
+ cli-skill <skill-name> mount
27
48
  ```
28
49
 
29
- 如果用户没有指定 `cli-name`,默认令它等于 `skill-name`。
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
- | 激活本地 skill | `cli-skill enable <skill-name> [--agentPath <path>]` |
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
- | 发布本地 skill | `cli-skill publish <skill-name> [--dry-run]` |
41
- | 查看 skill 列表 | `cli-skill list` |
42
- | 同步 skill 文档 | 在 skill 根目录执行 `cli-skill sync-skill --write` |
43
- | 读取配置 | `cli-skill config get [keyPath]` |
44
- | 写入配置 | `cli-skill config set <keyPath> <value>` |
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` 会通过 `bunx` 调 templates 包创建 skill 项目。
49
- - 默认模板名是 `basic`,对应 templates 包里的内置基础模板。
50
- - `create` 只创建项目,不会自动执行 `bun install`,也不会自动注册 CLI。
51
- - `enable` 只做两件事:
52
- - 把目标 skill bin 接到 Bun 全局 bin
53
- - 把目标 skill 的 `./skill` 注册到目标 skill 目录,默认是 `~/.agents/skills/<skill-name>`
54
- - `enable` / `disable` 都通过 `skill-name` 到 `~/.cli-skill/skills/<skill-name>` 查找本地 skill 项目
55
- - `install` / `uninstall` 面向已发布或已打包的 skill
56
- - `install` 会把 skill 安装到 `~/.cli-skill/installed`
57
- - 同时把 bin 接到 Bun 全局 bin
58
- - 同时把 `skill/` 注册到目标 skill 目录,默认是 `~/.agents/skills/<skill-name>`
59
- - `install <skill-name>` 会先按 skill 名去 npm search API 查找:
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
- - 托管安装的 skill 默认放在:
115
+ - 托管安装目录:
68
116
  - `~/.cli-skill/installed`
69
- - agent 读取 skill 的目录默认是:
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
- - `~/.cli-skill/config.json`
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 get skillConfig.fx
83
- cli-skill config set skillConfig.fx.baseUrl https://example.com
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
- - `get` / `set` 支持点路径,如:
87
- - `skillConfig.fx.baseUrl`
88
- - `skillConfig.fx.env.TEST_VALUE`
89
-
90
- ## 文档同步规则
139
+ ## 文档规则
91
140
 
92
- - skill 的 `SKILL.md` 里,`Tool Reference` 和 `Config Reference` 应由平台命令生成。
93
- - 当工具或配置发生变化后,优先执行:
141
+ - `src/skill/*` 是模板源目录
142
+ - `skill/*` 是生成产物
143
+ - tool 或配置变更后,应重新执行:
94
144
 
95
145
  ```bash
96
- cli-skill sync-skill --write
146
+ cli-skill <skill-name> build
97
147
  ```
98
148
 
99
- - 不要手写维护这两个生成区块,除非用户明确要求。
100
-
101
149
  ## 不要做的事
102
150
 
103
151
  - 不要把 `create` 当成“已经可执行”
104
- - 不要让 `enable` 隐式执行 `install`
105
- - 不要手动改 `~/.agents/skills`,优先通过 `cli-skill` CLI 管理
106
- - 不要把测试 skill 长期留在工作区;测试时统一使用 `test-skill-1`、`test-skill-2` 这类名字
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,12 +1,9 @@
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 { registerPublishCommand } from "./commands/publish";
6
+ import { registerSkillCommand } from "./commands/skill";
10
7
  import { registerUninstallCommand } from "./commands/uninstall";
11
8
 
12
9
  export function createApp(version: string) {
@@ -14,13 +11,10 @@ export function createApp(version: string) {
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
- registerPublishCommand(cli);
17
+ registerSkillCommand(cli);
24
18
 
25
19
  cli.help();
26
20
  cli.version(version);