@pwddd/skills-scanner 1.0.8 → 1.1.0

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 +44 -8
  2. package/package.json +1 -1
package/index.ts CHANGED
@@ -73,7 +73,15 @@ function hasUv(): boolean {
73
73
  }
74
74
 
75
75
  function isVenvReady(): boolean {
76
- return existsSync(VENV_PYTHON);
76
+ if (!existsSync(VENV_PYTHON)) return false;
77
+
78
+ // 检查 cisco-ai-skill-scanner 是否真的安装
79
+ try {
80
+ execSync(`"${VENV_PYTHON}" -c "import skill_scanner"`, { stdio: 'ignore' });
81
+ return true;
82
+ } catch {
83
+ return false;
84
+ }
77
85
  }
78
86
 
79
87
  function expandPath(p: string): string {
@@ -106,21 +114,36 @@ function saveState(s: ScanState) {
106
114
 
107
115
  async function ensureDeps(logger: any): Promise<boolean> {
108
116
  if (isVenvReady()) {
109
- logger.info("[skills-scanner] Python 依赖已就绪");
117
+ logger.info("[skills-scanner] Python 依赖已就绪(cisco-ai-skill-scanner 已安装)");
110
118
  return true;
111
119
  }
120
+
112
121
  if (!hasUv()) {
113
122
  logger.warn("[skills-scanner] uv 未安装:brew install uv 或 curl -LsSf https://astral.sh/uv/install.sh | sh");
114
123
  return false;
115
124
  }
116
- logger.info("[skills-scanner] 首次启动,正在安装 cisco-ai-skill-scanner...");
125
+
126
+ logger.info("[skills-scanner] 正在安装 cisco-ai-skill-scanner...");
127
+
117
128
  try {
118
- // 创建 venv
119
- await execAsync(`uv venv "${join(SKILL_DIR, ".venv")}" --python 3.10`);
120
- // 使用 uv pip 安装(不需要激活 venv)
129
+ // 创建 venv(如果不存在)
130
+ if (!existsSync(VENV_PYTHON)) {
131
+ logger.info("[skills-scanner] 创建 Python 虚拟环境...");
132
+ await execAsync(`uv venv "${join(SKILL_DIR, ".venv")}" --python 3.10`);
133
+ }
134
+
135
+ // 安装包
136
+ logger.info("[skills-scanner] 安装 cisco-ai-skill-scanner 包...");
121
137
  await execAsync(`uv pip install --python "${VENV_PYTHON}" cisco-ai-skill-scanner`);
122
- logger.info("[skills-scanner] ✅ 依赖安装完成");
123
- return true;
138
+
139
+ // 验证安装
140
+ if (isVenvReady()) {
141
+ logger.info("[skills-scanner] ✅ 依赖安装完成并验证成功");
142
+ return true;
143
+ } else {
144
+ logger.error("[skills-scanner] ❌ 安装完成但验证失败,包可能未正确安装");
145
+ return false;
146
+ }
124
147
  } catch (err: any) {
125
148
  logger.error(`[skills-scanner] ⚠️ 依赖安装失败: ${err.message}`);
126
149
  logger.error(`[skills-scanner] 请手动运行: uv pip install --python "${VENV_PYTHON}" cisco-ai-skill-scanner`);
@@ -310,6 +333,18 @@ export default function register(api: any) {
310
333
  api.logger.info(`[skills-scanner] Python venv 路径: ${VENV_PYTHON}`);
311
334
  api.logger.info(`[skills-scanner] Python 依赖状态: ${isVenvReady() ? "✅ 已就绪" : "❌ 未安装"}`);
312
335
 
336
+ // 立即尝试安装依赖(不等待 service start)
337
+ if (!isVenvReady()) {
338
+ api.logger.info("[skills-scanner] 开始安装 Python 依赖...");
339
+ ensureDeps(api.logger).then(success => {
340
+ if (success) {
341
+ api.logger.info("[skills-scanner] ✅ 依赖安装成功(在 plugin 加载时)");
342
+ }
343
+ }).catch(err => {
344
+ api.logger.error(`[skills-scanner] 依赖安装失败: ${err.message}`);
345
+ });
346
+ }
347
+
313
348
  // 向聊天发消息的辅助(用于 watcher 通知)
314
349
  function persistWatcherAlert(msg: string) {
315
350
  const state = loadState();
@@ -328,6 +363,7 @@ export default function register(api: any) {
328
363
  api.logger.info("[skills-scanner] ─────────────────────────────────────");
329
364
  api.logger.info("[skills-scanner] 🚀 后台服务启动中...");
330
365
 
366
+ // 再次检查并安装依赖(防止 plugin 加载时安装失败)
331
367
  const depsReady = await ensureDeps(api.logger);
332
368
 
333
369
  if (!depsReady) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pwddd/skills-scanner",
3
- "version": "1.0.8",
3
+ "version": "1.1.0",
4
4
  "description": "OpenClaw Plugin:Skills 安全扫描、安装前拦截、安全日报",
5
5
  "main": "index.ts",
6
6
  "files": [