@pwddd/skills-scanner 1.0.5 → 1.0.8

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.

Files changed (2) hide show
  1. package/index.ts +28 -25
  2. package/package.json +1 -1
package/index.ts CHANGED
@@ -117,13 +117,13 @@ async function ensureDeps(logger: any): Promise<boolean> {
117
117
  try {
118
118
  // 创建 venv
119
119
  await execAsync(`uv venv "${join(SKILL_DIR, ".venv")}" --python 3.10`);
120
- // 激活 venv 并安装包
121
- await execAsync(`"${VENV_PYTHON}" -m pip install cisco-ai-skill-scanner`);
120
+ // 使用 uv pip 安装(不需要激活 venv
121
+ await execAsync(`uv pip install --python "${VENV_PYTHON}" cisco-ai-skill-scanner`);
122
122
  logger.info("[skills-scanner] ✅ 依赖安装完成");
123
123
  return true;
124
124
  } catch (err: any) {
125
125
  logger.error(`[skills-scanner] ⚠️ 依赖安装失败: ${err.message}`);
126
- logger.error(`[skills-scanner] 请手动运行: uv pip install cisco-ai-skill-scanner`);
126
+ logger.error(`[skills-scanner] 请手动运行: uv pip install --python "${VENV_PYTHON}" cisco-ai-skill-scanner`);
127
127
  return false;
128
128
  }
129
129
  }
@@ -304,11 +304,13 @@ export default function register(api: any) {
304
304
  const preInstallScan = cfg.preInstallScan ?? "on";
305
305
  const onUnsafe = cfg.onUnsafe ?? "quarantine";
306
306
 
307
- // 向聊天发消息的辅助(用于 watcher 通知)——使用 registerCommand handler
308
- // 文档确认:registerCommand handler 可以直接 return { text },
309
- // watcher 是异步后台任务,没有 handler context。
310
- // 唯一有文档依据的方式:写入 event.messages(仅限 hook handler 内)。
311
- // 这里退而求其次:写到日志 + 持久化到 STATE_FILE,让用户可通过 /scan-status 查看。
307
+ api.logger.info("[skills-scanner] ═══════════════════════════════════════");
308
+ api.logger.info("[skills-scanner] Plugin 正在加载...");
309
+ api.logger.info(`[skills-scanner] 扫描目录: ${scanDirs.join(", ")}`);
310
+ api.logger.info(`[skills-scanner] Python venv 路径: ${VENV_PYTHON}`);
311
+ api.logger.info(`[skills-scanner] Python 依赖状态: ${isVenvReady() ? "✅ 已就绪" : "❌ 未安装"}`);
312
+
313
+ // 向聊天发消息的辅助(用于 watcher 通知)
312
314
  function persistWatcherAlert(msg: string) {
313
315
  const state = loadState();
314
316
  const alerts: string[] = (state as any).pendingAlerts ?? [];
@@ -323,40 +325,41 @@ export default function register(api: any) {
323
325
  api.registerService({
324
326
  id: "skills-scanner-setup",
325
327
  start: async () => {
326
- api.logger.info("[skills-scanner] 🚀 Service starting...");
328
+ api.logger.info("[skills-scanner] ─────────────────────────────────────");
329
+ api.logger.info("[skills-scanner] 🚀 后台服务启动中...");
330
+
327
331
  const depsReady = await ensureDeps(api.logger);
328
332
 
329
333
  if (!depsReady) {
330
334
  api.logger.error("[skills-scanner] ❌ 依赖安装失败,服务无法启动");
335
+ api.logger.error("[skills-scanner] 请手动运行: uv pip install --python \"" + VENV_PYTHON + "\" cisco-ai-skill-scanner");
331
336
  return;
332
337
  }
333
338
 
334
339
  if (preInstallScan === "on" && scanDirs.length > 0) {
340
+ api.logger.info(`[skills-scanner] 📁 启动文件监控: ${scanDirs.length} 个目录`);
335
341
  stopWatcher = startWatcher(scanDirs, onUnsafe, behavioral, persistWatcherAlert, api.logger);
342
+ api.logger.info("[skills-scanner] ✅ 文件监控已启动");
343
+ } else {
344
+ api.logger.info("[skills-scanner] ⏭️ 安装前扫描已禁用");
336
345
  }
346
+
347
+ api.logger.info("[skills-scanner] ─────────────────────────────────────");
348
+ },
349
+ stop: () => {
350
+ api.logger.info("[skills-scanner] 🛑 后台服务停止中...");
351
+ stopWatcher?.();
352
+ stopWatcher = null;
337
353
  },
338
- stop: () => { stopWatcher?.(); stopWatcher = null; },
339
354
  });
340
355
 
341
- // ── 2. Startup logging ────────────────────────────────────────────────────
342
- // 在 Gateway 启动时输出配置提示
343
- api.logger.info("[skills-scanner] Plugin 已加载");
344
- api.logger.info(`[skills-scanner] 安装前扫描:${preInstallScan === "on" ? `✅ 监听 ${scanDirs.length} 个目录` : "❌ 已禁用"}`);
345
-
346
- // 立即检查并安装依赖(不等待 service start)
347
- if (!isVenvReady()) {
348
- api.logger.info("[skills-scanner] 检测到 Python 依赖未安装,开始安装...");
349
- ensureDeps(api.logger).catch(err => {
350
- api.logger.error(`[skills-scanner] 依赖安装异常: ${err.message}`);
351
- });
352
- }
353
-
354
- // 检查是否需要注册 Cron Job
356
+ // ── 2. 启动日志和 Cron 提示 ───────────────────────────────────────────────
355
357
  const state = loadState() as any;
356
358
  if (!state.cronJobId) {
357
359
  api.logger.warn("[skills-scanner] ⚠️ 未检测到日报 Cron Job,请手动注册一次:");
358
360
  api.logger.info('[skills-scanner] openclaw cron add --name "skills-daily-report" --cron "0 8 * * *" --tz "Asia/Shanghai" --session isolated --message "请执行 /scan-report 并把结果发送到此渠道" --announce');
359
361
  }
362
+ api.logger.info("[skills-scanner] ═══════════════════════════════════════");
360
363
 
361
364
  // ── 3. /scan-skill ────────────────────────────────────────────────────────
362
365
  api.registerCommand({
@@ -508,5 +511,5 @@ export default function register(api: any) {
508
511
  });
509
512
  }, { commands: ["skills-scan"] });
510
513
 
511
- api.logger.info("[skills-scanner] Plugin 已注册 ✅");
514
+ api.logger.info("[skills-scanner] Plugin 注册完成");
512
515
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pwddd/skills-scanner",
3
- "version": "1.0.5",
3
+ "version": "1.0.8",
4
4
  "description": "OpenClaw Plugin:Skills 安全扫描、安装前拦截、安全日报",
5
5
  "main": "index.ts",
6
6
  "files": [