@pwddd/skills-scanner 2.4.1 → 2026.3.10

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.

Potentially problematic release.


This version of @pwddd/skills-scanner might be problematic. Click here for more details.

package/README.md CHANGED
@@ -1,431 +1,199 @@
1
- # openclaw-skills-scanner
2
-
3
- OpenClaw Plugin,通过 HTTP API 调用远程 [cisco-ai-skill-scanner](https://github.com/cisco-ai-defense/skill-scanner) 服务实现对 OpenClaw Skills 的安全扫描。
4
-
5
- ## 架构说明
6
-
7
- 本插件采用 **HTTP 客户端模式**:
8
- - **客户端**:本插件(TypeScript + Python HTTP 客户端)
9
- - **服务端**:独立运行的 `skill-scanner-api` 服务(需单独部署)
10
- - **通信方式**:通过 HTTP REST API 调用扫描服务
11
-
12
- ### 为什么使用 HTTP 模式?
13
-
14
- 1. **依赖隔离**:避免复杂的 Python 依赖安装问题(LiteLLM、代理配置等)
15
- 2. **服务复用**:多个客户端可共享同一个扫描服务
16
- 3. **灵活部署**:扫描服务可部署在专用服务器上,支持更强大的硬件配置
17
- 4. **简化维护**:客户端只需 `requests` 库,无需安装完整的 `cisco-ai-skill-scanner`
18
-
19
- ## 功能
20
-
21
- | 功能 | 实现方式 | 状态 |
22
- |---|---|---|
23
- | 启动时自动安装 Python 依赖(requests) | `registerService` | ✅ 全自动 |
24
- | `/skills-scanner` 统一命令入口 | `registerCommand` | ✅ 全自动 |
25
- | `openclaw skills-scan` CLI | `registerCli` | ✅ 全自动 |
26
- | 安装前扫描(新 Skill 出现时自动扫描) | `fs.watch` | ✅ 全自动 |
27
- | Gateway 启动时在日志里打印配置提示 | Plugin Hook `gateway:startup` | ✅ 全自动 |
28
- | 每日定期日报 | Cron Job | ✅ 智能自动注册 |
29
-
30
- ---
31
-
32
- ## 前置要求
33
-
34
- ### 1. 启动 skill-scanner-api 服务
35
-
36
- 在服务器上安装并启动 API 服务:
37
-
38
- ```bash
39
- # 安装 cisco-ai-skill-scanner
40
- pip install cisco-ai-skill-scanner
41
-
42
- # 启动 API 服务(默认端口 8000)
43
- skill-scanner-api
44
-
45
- # 或指定端口
46
- skill-scanner-api --port 8080
47
-
48
- # 开发模式(自动重载)
49
- skill-scanner-api --reload
50
- ```
51
-
52
- 验证服务是否正常:
53
-
54
- ```bash
55
- curl http://localhost:8000/health
56
- ```
57
-
58
- ### 2. 安装本插件
59
-
60
- ```bash
61
- # 从本地目录安装
62
- openclaw plugins install ./openclaw-skills-scanner
63
-
64
- # 或从 npm 安装
65
- openclaw plugins install @pwddd/skills-scanner
66
-
67
- # 重启 Gateway(Plugin 变更必须重启)
68
- openclaw gateway restart
69
- ```
70
-
71
- 重启后 Gateway 会自动:
72
- 1. 创建 Python venv 并安装 `requests` 库
73
- 2. 开始监听 Skills 目录(安装前扫描)
74
- 3. **智能注册定时任务**(检测已有任务,防止重复)
75
-
76
- ---
77
-
78
- ## 定时任务自动注册
79
-
80
- 插件启动时会**自动智能注册**定时任务,特点:
81
-
82
- - **幂等操作**:多次启动不会创建重复任务
83
- - **智能检测**:自动发现已存在的同名任务
84
- - ✅ **自动更新**:配置变更时自动更新任务
85
- - ✅ **防止冲突**:即使手动创建过任务也能正确识别
86
-
87
- 如果自动注册失败,可以使用 `/skills-scanner cron register` 命令手动注册。
88
-
89
- ---
90
-
91
- ## 注册每日日报(已自动化)
92
-
93
- ~~Plugin 无法自动注册 Cron Job(OpenClaw Plugin API 不提供此能力),需要手动执行一次:~~
94
-
95
- **更新**:从 v2.2.0 开始,插件会在启动时自动注册定时任务,无需手动操作!
96
-
97
- 如果需要手动管理,使用以下命令:
98
-
99
- 如果需要手动管理,使用以下命令:
100
-
101
- ```bash
102
- # 使用聊天命令(推荐)
103
- /skills-scanner cron register # 注册定时任务
104
- /skills-scanner cron unregister # 删除定时任务
105
- /skills-scanner cron status # 查看状态
106
-
107
- # 或使用 CLI 命令
108
- openclaw cron add \
109
- --name "skills-daily-report" \
110
- --cron "0 8 * * *" \
111
- --tz "Asia/Shanghai" \
112
- --session isolated \
113
- --message "请执行 /skills-scanner scan --report 并把结果发送到此渠道" \
114
- --announce
115
- ```
116
-
117
- 验证已注册:
118
-
119
- ```bash
120
- openclaw cron list
121
- ```
122
-
123
- ---
124
-
125
- ## 聊天命令
126
-
127
- ### 主命令
128
-
129
- ```bash
130
- /skills-scanner [子命令] [参数]
131
- ```
132
-
133
- ### 子命令
134
-
135
- | 命令 | 说明 |
136
- |---|---|
137
- | `/skills-scanner scan <路径> [选项]` | 扫描 Skill(智能判断单个/批量) |
138
- | `/skills-scanner status` | 查看状态、API 服务、定时任务 |
139
- | `/skills-scanner config [操作]` | 配置管理(show/reset) |
140
- | `/skills-scanner cron [操作]` | 定时任务管理(register/unregister/status) |
141
- | `/skills-scanner help` | 显示帮助文档 |
142
-
143
- ### 扫描选项
144
-
145
- | 选项 | 说明 |
146
- |---|---|
147
- | `--detailed` | 显示所有 findings 详情 |
148
- | `--behavioral` | 启用 AST 行为分析(更准确但较慢) |
149
- | `--recursive` | 递归扫描子目录 |
150
- | `--report` | 生成日报格式输出 |
151
-
152
- ### 使用示例
153
-
154
- ```bash
155
- # 扫描单个 Skill
156
- /skills-scanner scan ~/.openclaw/skills/my-skill
157
-
158
- # 批量扫描(递归)
159
- /skills-scanner scan ~/.openclaw/skills --recursive
160
-
161
- # 生成日报
162
- /skills-scanner scan ~/.openclaw/skills --report
163
-
164
- # 详细扫描 + 行为分析
165
- /skills-scanner scan ~/my-skill --detailed --behavioral
166
-
167
- # 查看状态
168
- /skills-scanner status
169
-
170
- # 配置管理
171
- /skills-scanner config show
172
- /skills-scanner config reset
173
-
174
- # 定时任务管理
175
- /skills-scanner cron status
176
- /skills-scanner cron register
177
- /skills-scanner cron unregister
178
-
179
- # 查看帮助
180
- /skills-scanner help
181
- ```
182
-
183
- ---
184
-
185
- ## CLI 命令
186
-
187
- ### 可用命令
188
-
189
- ```bash
190
- openclaw skills-scan <子命令> [参数]
191
- ```
192
-
193
- ### 子命令
194
-
195
- | 命令 | 说明 |
196
- |---|---|
197
- | `scan <路径>` | 扫描单个 Skill |
198
- | `batch <目录>` | 批量扫描目录 |
199
- | `report` | 生成完整日报 |
200
- | `health` | 检查 API 服务状态 |
201
-
202
- ### 使用示例
203
-
204
- ```bash
205
- # 扫描单个 Skill
206
- openclaw skills-scan scan ~/.openclaw/skills/my-skill
207
-
208
- # 批量扫描
209
- openclaw skills-scan batch ~/.openclaw/skills --recursive
210
-
211
- # 生成日报
212
- openclaw skills-scan report
213
-
214
- # 健康检查
215
- openclaw skills-scan health
216
-
217
- # 详细扫描
218
- openclaw skills-scan scan ~/my-skill --detailed --behavioral
219
- ```
220
-
221
- **注意**:CLI 命令是 `skills-scan`(不是 `skills-scanner`)
222
-
223
- ---
224
-
225
- ## 命令对比
226
-
227
- | 功能 | 聊天命令 | CLI 命令 |
228
- |---|---|---|
229
- | 扫描单个 Skill | `/skills-scanner scan <路径>` | `openclaw skills-scan scan <路径>` |
230
- | 批量扫描 | `/skills-scanner scan <目录> --recursive` | `openclaw skills-scan batch <目录> --recursive` |
231
- | 生成日报 | `/skills-scanner scan --report` | `openclaw skills-scan report` |
232
- | 查看状态 | `/skills-scanner status` | - |
233
- | 健康检查 | `/skills-scanner status`(包含) | `openclaw skills-scan health` |
234
- | 配置管理 | `/skills-scanner config` | - |
235
- | 定时任务 | `/skills-scanner cron` | - |
236
-
237
- ---
238
-
239
- ## 定时任务说明
240
-
241
- 插件会在启动时**自动智能注册**定时任务,无需手动操作:
242
-
243
- ### 智能注册机制
244
-
245
- 1. **检测已有任务**:启动时查询系统中是否已有同名任务
246
- 2. **幂等操作**:如果任务已存在,保存 ID 并跳过创建
247
- 3. **自动更新**:如果任务配置变更(时间、时区),自动删除旧任务并创建新任务
248
- 4. **防止重复**:即使多次重启或重新安装,也不会创建重复任务
249
-
250
- ### 默认配置
251
-
252
- - **任务名称**:`skills-daily-report`
253
- - **执行时间**:每天 08:00
254
- - **时区**:Asia/Shanghai
255
- - **执行内容**:发送 `/skills-scanner scan --report` 命令到指定渠道
256
-
257
- ### 手动管理
258
-
259
- 如果自动注册失败,可以手动操作:
260
-
261
- ```bash
262
- # 查看所有定时任务
263
- openclaw cron list
264
-
265
- # 手动注册
266
- openclaw cron add \
267
- --name "skills-daily-report" \
268
- --cron "0 8 * * *" \
269
- --tz "Asia/Shanghai" \
270
- --session isolated \
271
- --message "请执行 /skills-scanner scan --report 并把结果发送到此渠道" \
272
- --announce
273
-
274
- # 删除定时任务
275
- openclaw cron remove <job-id>
276
-
277
- # 修改执行时间(先删除再创建)
278
- openclaw cron remove <job-id>
279
- openclaw cron add --name "skills-daily-report" --cron "0 9 * * *" ...
280
- ```
281
-
282
- ### 投递到特定渠道
283
-
284
- 如果想将日报发送到特定渠道(如 Telegram):
285
-
286
- ```bash
287
- openclaw cron add \
288
- --name "skills-daily-report" \
289
- --cron "0 8 * * *" \
290
- --tz "Asia/Shanghai" \
291
- --session isolated \
292
- --message "请执行 /skills-scanner scan --report 并把结果发送到此渠道" \
293
- --announce \
294
- --channel telegram \
295
- --to "+8613312345678"
296
- ```
297
-
298
- ---
299
-
300
- ## 安装前扫描说明
301
-
302
- Plugin 启动后用 `fs.watch` 监听所有 Skills 目录。任何新 Skill 出现(无论通过 `clawhub install`、CLI 还是手动复制)都会触发扫描。
303
-
304
- 扫描结果通过 `persistWatcherAlert` 写入 `~/.openclaw/skills-scanner/state.json`,运行 `/skills-scanner status` 查看并清空告警列表。
305
-
306
- > **为什么不直接发聊天消息?**
307
- > OpenClaw Plugin API 没有提供在后台任务里主动推送消息给用户的方法。`event.messages.push()` 只在 Hook handler 的同步上下文中有效,`registerCommand` 的 handler 需要用户主动触发。这是平台限制,不是实现缺陷。
308
-
309
- 处置方式通过 `onUnsafe` 配置:
310
-
311
- | 值 | 行为 |
312
- |---|---|
313
- | `"quarantine"`(默认)| 移入 `~/.openclaw/skills-scanner/quarantine/` |
314
- | `"delete"` | 直接删除 |
315
- | `"warn"` | 仅写告警日志,保留文件 |
316
-
317
- ---
318
-
319
- ## 配置
320
-
321
- ```jsonc
322
- // ~/.openclaw/openclaw.json
323
- {
324
- "plugins": {
325
- "entries": {
326
- "skills-scanner": {
327
- "enabled": true,
328
- "config": {
329
- "apiUrl": "http://localhost:8000", // API 服务地址
330
- "scanDirs": ["~/.openclaw/skills"], // 留空自动检测
331
- "behavioral": false, // 行为分析(较慢)
332
- "useLLM": false, // 启用 LLM 分析
333
- "policy": "balanced", // strict | balanced | permissive
334
- "preInstallScan": "on", // fs.watch 安装前扫描
335
- "onUnsafe": "quarantine" // quarantine | delete | warn
336
- }
337
- }
338
- }
339
- }
340
- }
341
- ```
342
-
343
- ### 配置说明
344
-
345
- | 配置项 | 类型 | 默认值 | 说明 |
346
- |---|---|---|---|
347
- | `apiUrl` | string | `http://localhost:8000` | skill-scanner-api 服务地址 |
348
- | `scanDirs` | string[] | 自动检测 | 要扫描的 Skills 目录列表 |
349
- | `behavioral` | boolean | `false` | 启用行为分析(更准确但较慢) |
350
- | `useLLM` | boolean | `false` | 启用 LLM 分析(需 API 服务配置 LLM) |
351
- | `policy` | string | `balanced` | 扫描策略:`strict`(严格)/ `balanced`(平衡)/ `permissive`(宽松) |
352
- | `preInstallScan` | string | `on` | 是否启用 fs.watch 安装前扫描 |
353
- | `onUnsafe` | string | `quarantine` | 发现不安全 Skill 时的处置方式 |
354
-
355
- ---
356
-
357
- ## HTTP API 端点说明
358
-
359
- 本插件使用以下 API 端点:
360
-
361
- | 端点 | 方法 | 用途 |
362
- |---|---|---|
363
- | `/health` | GET | 健康检查 |
364
- | `/scan-upload` | POST | 上传 ZIP 文件扫描(单个 Skill) |
365
- | `/scan-batch` | POST | 批量异步扫描(服务器本地目录) |
366
- | `/scan-batch/{scan_id}` | GET | 查询批量扫描结果 |
367
-
368
- ### 扫描方式
369
-
370
- 1. **单个 Skill 扫描**:使用 `/scan-upload` 端点
371
- - 客户端将 Skill 目录打包成 ZIP
372
- - 上传到服务器
373
- - 服务器解压并扫描
374
- - 返回扫描结果
375
-
376
- 2. **批量扫描(服务器本地)**:使用 `/scan-batch` 端点
377
- - 适用于服务器本地目录
378
- - 异步执行,返回 scan_id
379
- - 轮询 `/scan-batch/{scan_id}` 获取结果
380
-
381
- 3. **批量扫描(客户端上传)**:客户端循环调用 `/scan-upload`
382
- - 适用于客户端本地多个 Skills
383
- - 逐个打包上传扫描
384
-
385
- ---
386
-
387
- ## 故障排查
388
-
389
- ### 1. 连接失败
390
-
391
- ```
392
- ✗ 无法连接到 API 服务: http://localhost:8000
393
- ```
394
-
395
- **解决方法**:
396
- - 确认 `skill-scanner-api` 服务正在运行
397
- - 检查配置中的 `apiUrl` 是否正确
398
- - 测试连接:`curl http://localhost:8000/health`
399
-
400
- ### 2. 代理问题
401
-
402
- 如果遇到代理相关错误,插件会自动清除代理环境变量。如果仍有问题,手动清除:
403
-
404
- ```bash
405
- unset http_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY
406
- ```
407
-
408
- ### 3. Python 依赖问题
409
-
410
- ```
411
- ⏳ Python 依赖尚未就绪
412
- ```
413
-
414
- **解决方法**:
415
- - 检查 `uv` 是否安装:`uv --version`
416
- - 手动安装依赖:
417
- ```bash
418
- cd ~/.openclaw/extensions/skills-scanner/skills/skills-scanner
419
- uv venv .venv --python 3.10
420
- uv pip install --python .venv/bin/python requests>=2.31.0
421
- ```
422
-
423
- ---
424
-
425
- ## 发布到 npm
426
-
427
- ```bash
428
- # 已发布为 @pwddd/skills-scanner
429
- npm login
430
- npm publish --access public
431
- ```
1
+ # Skills Scanner Plugin
2
+
3
+ OpenClaw Skills 安全扫描插件,用于检测 Skills 中的潜在安全威胁。
4
+
5
+ ## 功能特性
6
+
7
+ - 🔍 **自动扫描**: 监听 Skills 目录,自动扫描新安装的 Skill
8
+ - 📊 **定时日报**: 每天自动生成安全扫描报告
9
+ - 🛡️ **多种策略**: 支持 strict/balanced/permissive 三种扫描策略
10
+ - 🤖 **LLM 分析**: 可选的 LLM 语义分析
11
+ - 🔒 **自动隔离**: 检测到不安全的 Skill 自动隔离或删除
12
+
13
+ ## 安装
14
+
15
+ ```bash
16
+ # 从本地安装(开发)
17
+ openclaw plugins install ./extensions/skills-scanner
18
+
19
+ # 从 npm 安装(发布后)
20
+ openclaw plugins install @openclaw/skills-scanner
21
+ ```
22
+
23
+ ## 配置
24
+
25
+ `~/.openclaw/config.json` 或工作区配置中添加:
26
+
27
+ ```json
28
+ {
29
+ "plugins": {
30
+ "entries": {
31
+ "skills-scanner": {
32
+ "enabled": true,
33
+ "config": {
34
+ "apiUrl": "http://localhost:8000",
35
+ "scanDirs": ["~/.openclaw/skills", "~/.openclaw/workspace/skills"],
36
+ "behavioral": false,
37
+ "useLLM": false,
38
+ "policy": "balanced",
39
+ "preInstallScan": "on",
40
+ "onUnsafe": "quarantine"
41
+ }
42
+ }
43
+ }
44
+ }
45
+ }
46
+ ```
47
+
48
+ ### 配置说明
49
+
50
+ - `apiUrl`: 扫描 API 服务地址(需要先启动 skill-scanner-api 服务)
51
+ - `scanDirs`: 要监控的 Skills 目录列表
52
+ - `behavioral`: 是否启用行为分析(深度扫描,较慢)
53
+ - `useLLM`: 是否使用 LLM 进行语义分析
54
+ - `policy`: 扫描策略
55
+ - `strict`: 严格模式,发现任何可疑行为都标记为不安全
56
+ - `balanced`: 平衡模式(推荐)
57
+ - `permissive`: 宽松模式,只标记明确的威胁
58
+ - `preInstallScan`: 是否在安装时自动扫描
59
+ - `on`: 启用(推荐)
60
+ - `off`: 禁用
61
+ - `onUnsafe`: 发现不安全 Skill 的处理方式
62
+ - `quarantine`: 移入隔离目录(推荐)
63
+ - `delete`: 直接删除
64
+ - `warn`: 仅警告,不处理
65
+
66
+ ## 使用方法
67
+
68
+ ### 聊天命令
69
+
70
+ ```
71
+ /skills-scanner scan <路径> [选项] # 扫描 Skill
72
+ /skills-scanner status # 查看状态
73
+ /skills-scanner config [操作] # 配置管理
74
+ /skills-scanner cron [操作] # 定时任务管理
75
+ /skills-scanner help # 帮助信息
76
+ ```
77
+
78
+ #### 扫描选项
79
+
80
+ - `--detailed`: 显示详细的安全发现
81
+ - `--behavioral`: 启用行为分析
82
+ - `--recursive`: 递归扫描子目录
83
+ - `--report`: 生成日报格式
84
+
85
+ #### 示例
86
+
87
+ ```
88
+ /skills-scanner scan ~/.openclaw/skills/my-skill
89
+ /skills-scanner scan ~/.openclaw/skills --recursive
90
+ /skills-scanner scan ~/.openclaw/skills --report
91
+ /skills-scanner status
92
+ ```
93
+
94
+ ### CLI 命令
95
+
96
+ ```bash
97
+ # 扫描单个 Skill
98
+ openclaw skills-scan scan <path> [--detailed] [--behavioral]
99
+
100
+ # 批量扫描目录
101
+ openclaw skills-scan batch <directory> [--recursive] [--detailed]
102
+
103
+ # 生成日报
104
+ openclaw skills-scan report
105
+
106
+ # 检查 API 服务健康状态
107
+ openclaw skills-scan health
108
+ ```
109
+
110
+ ## 前置要求
111
+
112
+ ### 1. 安装 uv(Python 包管理器)
113
+
114
+ ```bash
115
+ # macOS/Linux
116
+ curl -LsSf https://astral.sh/uv/install.sh | sh
117
+
118
+ # 或使用 Homebrew
119
+ brew install uv
120
+ ```
121
+
122
+ ### 2. 启动扫描 API 服务
123
+
124
+ 插件需要连接到 skill-scanner-api 服务进行实际的安全扫描。
125
+
126
+ ```bash
127
+ # 启动服务(假设你已经有这个服务)
128
+ skill-scanner-api
129
+ ```
130
+
131
+ 默认服务地址为 `http://localhost:8000`,可以在配置中修改。
132
+
133
+ ## 工作流程
134
+
135
+ 1. **插件启动**: 自动安装 Python 依赖(requests)
136
+ 2. **文件监控**: 监听配置的 Skills 目录
137
+ 3. **自动扫描**: 检测到新 Skill 时自动触发扫描
138
+ 4. **结果处理**: 根据配置隔离/删除/警告不安全的 Skill
139
+ 5. **定时日报**: 每天 08:00 生成安全报告
140
+
141
+ ## 故障排除
142
+
143
+ ### Python 依赖安装失败
144
+
145
+ ```bash
146
+ # 手动安装依赖
147
+ cd extensions/skills-scanner/skills/skills-scanner
148
+ uv venv .venv --python 3.10
149
+ uv pip install --python .venv/bin/python requests>=2.31.0
150
+ ```
151
+
152
+ ### API 服务连接失败
153
+
154
+ 1. 确保 skill-scanner-api 服务正在运行
155
+ 2. 检查配置中的 `apiUrl` 是否正确
156
+ 3. 运行健康检查:`openclaw skills-scan health`
157
+
158
+ ### 定时任务未注册
159
+
160
+ ```bash
161
+ # 手动注册定时任务
162
+ /skills-scanner cron register
163
+
164
+ # 或使用 CLI
165
+ openclaw cron add \
166
+ --name "skills-daily-report" \
167
+ --cron "0 8 * * *" \
168
+ --tz "Asia/Shanghai" \
169
+ --session isolated \
170
+ --message "请执行 /skills-scanner scan --report 并把结果发送到此渠道" \
171
+ --announce
172
+ ```
173
+
174
+ ## 开发
175
+
176
+ ### 目录结构
177
+
178
+ ```
179
+ extensions/skills-scanner/
180
+ ├── package.json # npm 包配置
181
+ ├── openclaw.plugin.json # 插件元数据
182
+ ├── README.md # 文档
183
+ ├── index.ts # 插件入口
184
+ ├── src/ # 源代码
185
+ │ ├── config.ts # 配置管理
186
+ │ ├── scanner.ts # 扫描逻辑
187
+ │ ├── watcher.ts # 文件监控
188
+ │ ├── cron.ts # 定时任务
189
+ │ ├── commands.ts # 命令处理
190
+ │ └── types.ts # 类型定义
191
+ └── skills/
192
+ └── skills-scanner/
193
+ ├── scan.py # Python 扫描脚本
194
+ └── .venv/ # Python 虚拟环境(自动创建)
195
+ ```
196
+
197
+ ## 许可证
198
+
199
+ MIT