@pwddd/skills-scanner 1.2.0 → 1.2.4
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/index.ts +40 -4
- package/package.json +1 -1
- package/skills/skills-scanner/scan.py +15 -1
package/index.ts
CHANGED
|
@@ -30,7 +30,8 @@ import { promisify } from "util";
|
|
|
30
30
|
|
|
31
31
|
const execAsync = promisify(exec);
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
// 使用绝对路径,避免 __dirname 的问题
|
|
34
|
+
const PLUGIN_ROOT = process.env.OPENCLAW_PLUGIN_ROOT || __dirname;
|
|
34
35
|
const SKILL_DIR = join(PLUGIN_ROOT, "skills", "skills-scanner");
|
|
35
36
|
const VENV_PYTHON = join(SKILL_DIR, ".venv", "bin", "python");
|
|
36
37
|
const SCAN_SCRIPT = join(SKILL_DIR, "scan.py");
|
|
@@ -198,10 +199,31 @@ async function runScan(
|
|
|
198
199
|
if (opts.jsonOut) args.push("--json", opts.jsonOut);
|
|
199
200
|
|
|
200
201
|
const cmd = `"${VENV_PYTHON}" "${SCAN_SCRIPT}" ${args.map(a => `"${a}"`).join(" ")}`;
|
|
202
|
+
|
|
203
|
+
// 调试日志
|
|
204
|
+
console.log(`[skills-scanner] 执行命令: ${cmd}`);
|
|
205
|
+
console.log(`[skills-scanner] VENV_PYTHON: ${VENV_PYTHON}`);
|
|
206
|
+
console.log(`[skills-scanner] SCAN_SCRIPT: ${SCAN_SCRIPT}`);
|
|
207
|
+
console.log(`[skills-scanner] Python 存在: ${existsSync(VENV_PYTHON)}`);
|
|
208
|
+
console.log(`[skills-scanner] Script 存在: ${existsSync(SCAN_SCRIPT)}`);
|
|
209
|
+
|
|
201
210
|
try {
|
|
202
|
-
|
|
211
|
+
// 清除代理环境变量,避免 LiteLLM 加载时出错
|
|
212
|
+
const env = { ...process.env };
|
|
213
|
+
delete env.http_proxy;
|
|
214
|
+
delete env.https_proxy;
|
|
215
|
+
delete env.HTTP_PROXY;
|
|
216
|
+
delete env.HTTPS_PROXY;
|
|
217
|
+
delete env.all_proxy;
|
|
218
|
+
delete env.ALL_PROXY;
|
|
219
|
+
|
|
220
|
+
const { stdout, stderr } = await execAsync(cmd, {
|
|
221
|
+
timeout: 180_000,
|
|
222
|
+
env
|
|
223
|
+
});
|
|
203
224
|
return { exitCode: 0, output: (stdout + stderr).trim() };
|
|
204
225
|
} catch (err: any) {
|
|
226
|
+
console.error(`[skills-scanner] 命令执行失败: ${err.message}`);
|
|
205
227
|
return { exitCode: err.code ?? 1, output: (err.stdout + err.stderr || "").trim() || err.message };
|
|
206
228
|
}
|
|
207
229
|
}
|
|
@@ -364,8 +386,11 @@ export default function register(api: any) {
|
|
|
364
386
|
|
|
365
387
|
api.logger.info("[skills-scanner] ═══════════════════════════════════════");
|
|
366
388
|
api.logger.info("[skills-scanner] Plugin 正在加载...");
|
|
389
|
+
api.logger.info(`[skills-scanner] PLUGIN_ROOT: ${PLUGIN_ROOT}`);
|
|
390
|
+
api.logger.info(`[skills-scanner] SKILL_DIR: ${SKILL_DIR}`);
|
|
391
|
+
api.logger.info(`[skills-scanner] VENV_PYTHON: ${VENV_PYTHON}`);
|
|
392
|
+
api.logger.info(`[skills-scanner] SCAN_SCRIPT: ${SCAN_SCRIPT}`);
|
|
367
393
|
api.logger.info(`[skills-scanner] 扫描目录: ${scanDirs.join(", ")}`);
|
|
368
|
-
api.logger.info(`[skills-scanner] Python venv 路径: ${VENV_PYTHON}`);
|
|
369
394
|
api.logger.info(`[skills-scanner] Python 依赖状态: ${isVenvReady() ? "✅ 已就绪" : "❌ 未安装"}`);
|
|
370
395
|
|
|
371
396
|
// 立即尝试安装依赖(不等待 service start)
|
|
@@ -463,7 +488,18 @@ export default function register(api: any) {
|
|
|
463
488
|
handler: async (ctx: any) => {
|
|
464
489
|
const raw = (ctx.args ?? "").trim();
|
|
465
490
|
if (!raw) return { text: "用法:`/scan-skill <路径> [--detailed] [--behavioral]`" };
|
|
466
|
-
|
|
491
|
+
|
|
492
|
+
// 先检查依赖
|
|
493
|
+
if (!isVenvReady()) {
|
|
494
|
+
return { text: "⏳ Python 依赖尚未就绪,请稍后重试或查看日志" };
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// 测试 Python 能否导入
|
|
498
|
+
try {
|
|
499
|
+
execSync(`"${VENV_PYTHON}" -c "import skill_scanner; print('Import OK')"`, { encoding: 'utf-8' });
|
|
500
|
+
} catch (err: any) {
|
|
501
|
+
return { text: `❌ Python 导入测试失败:\n\`\`\`\n${err.message}\n\`\`\`` };
|
|
502
|
+
}
|
|
467
503
|
|
|
468
504
|
const parts = raw.split(/\s+/);
|
|
469
505
|
const skillPath = expandPath(parts.find(p => !p.startsWith("--")) ?? "");
|
package/package.json
CHANGED
|
@@ -24,9 +24,23 @@ try:
|
|
|
24
24
|
BehavioralAnalyzer,
|
|
25
25
|
PipelineAnalyzer,
|
|
26
26
|
)
|
|
27
|
-
except ImportError:
|
|
27
|
+
except ImportError as e:
|
|
28
28
|
print("❌ cisco-ai-skill-scanner 未安装。")
|
|
29
|
+
print(f" 导入错误: {e}")
|
|
29
30
|
print(" 请运行: uv pip install cisco-ai-skill-scanner")
|
|
31
|
+
print(f" Python 路径: {sys.executable}")
|
|
32
|
+
print(f" Python 版本: {sys.version}")
|
|
33
|
+
|
|
34
|
+
# 尝试显示 sys.path
|
|
35
|
+
print(" sys.path:")
|
|
36
|
+
for p in sys.path:
|
|
37
|
+
print(f" - {p}")
|
|
38
|
+
|
|
39
|
+
sys.exit(1)
|
|
40
|
+
except Exception as e:
|
|
41
|
+
print(f"❌ 导入时发生未知错误: {type(e).__name__}: {e}")
|
|
42
|
+
import traceback
|
|
43
|
+
traceback.print_exc()
|
|
30
44
|
sys.exit(1)
|
|
31
45
|
|
|
32
46
|
|