@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/CHANGELOG.md +31 -0
- package/INSTALL.md +280 -0
- package/QUICKSTART.md +106 -0
- package/README.md +199 -431
- package/SUMMARY.md +272 -0
- package/openclaw.plugin.json +41 -59
- package/package.json +14 -19
- package/src/commands.ts +269 -0
- package/src/config.ts +170 -0
- package/src/cron.ts +82 -0
- package/src/deps.ts +71 -0
- package/src/report.ts +113 -0
- package/src/scanner.ts +45 -0
- package/src/state.ts +66 -0
- package/src/types.ts +47 -0
- package/src/watcher.ts +124 -0
package/README.md
CHANGED
|
@@ -1,431 +1,199 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
OpenClaw
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
###
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
###
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
#
|
|
162
|
-
/skills-scanner
|
|
163
|
-
|
|
164
|
-
#
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
/
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|