资讯详情

SkillSpector Multilingual Batch Scanner 实战指南:目录并行扫描、语言检测与 LLM Gap-Fill 原理

发布时间:2026/9/16 23:26:48

500+
企业客户服务经验
120+
行业领域内容覆盖
3000+
原创页面设计沉淀
98%
客户满意度

SkillSpector Multilingual Batch Scanner 实战指南:目录并行扫描、语言检测与 LLM Gap-Fill 原理

SkillSpector Multilingual Batch Scanner 实战指南目录并行扫描、语言检测与 LLM Gap-Fill 原理【免费下载链接】SkillSpectorSecurity scanner for AI agent skills. Detect vulnerabilities, malicious patterns, security risks, prompt injection, data exfiltration, and supply-chain risks in Claude Code, Codex, and MCP skills before you install them.项目地址: https://gitcode.com/GitHub_Trending/sk/SkillSpector本指南围绕 SkillSpector 仓库中的contrib/batch_scan社区贡献模块展开讲解如何把单技能安全扫描扩展为目录级并行批量扫描覆盖自动语言检测en/zh/ja/ko、非英语技能的LLM Gap-Fill 规则补盲以及多 API Key 负载均衡等生产级工程细节。读完本文你将掌握该模块的全部命令行用法、三种报告格式、并发与限流调优方法以及其底层源码的实现原理可直接用于 CI 批量审查 AI Agent 技能。一、模块定位零改动上游的目录级安全扫描器SkillSpector 是一个面向 AI Agent 技能skill定义的静态 LLM 安全分析器可检测提示注入、数据外泄、供应链风险、恶意模式等。上游 CLI 每次只扫描单个技能目录例如skillspector scan ./tests/fixtures/malicious_skill/。当需要审查数百个技能时逐条执行既不现实也无法规模化。contrib/batch_scan以零改动上游src/skillspector/为约束在此基础上叠加了三层能力批量发现递归查找输入根目录下所有包含SKILL.md的技能子目录自动语言检测按技能逐一判定语言en/zh/ja/ko并行执行每个技能以独立线程跑完整的 SkillSpector 图流水线graph.invokeLLM Gap-Fill对非英语技能追加一次定向 LLM 分析覆盖 8 条英语关键词静态规则无法识别的漏洞类别聚合报告按风险分数降序输出 terminal / JSON / Markdown 三种格式的汇总报告。一句话验证文档中的核心命令python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 7即可把仓库内置的全部测试夹具一次性扫完。模块入口与并发编排见 contrib/batch_scan/batch_scan.py 的main()函数。二、快速上手2.1 前置条件与环境变量# 1. 创建并激活虚拟环境 python3 -m venv .venv source .venv/bin/activate # 2. 以开发模式安装 SkillSpector pip install -e . # 3. 复制并编辑环境变量模板复制到仓库根目录的 .env cp contrib/batch_scan/.env.example .env.env文件需要以下键完整模板见 contrib/batch_scan/.env.example变量是否必需用途SKILLSPECTOR_PROVIDER是固定为openaiDeepSeek / OpenAI 兼容接口均走此模式SKILLSPECTOR_MODEL是默认模型名例如deepseek-chat或deepseek-v4-flashOPENAI_API_KEY单 key 模式标准 OpenAI 兼容 KeyOPENAI_BASE_URL单 key 模式例如https://api.deepseek.comSKILLSPECTOR_API_KEYS多 key 模式管道符分隔的key\|base_url\|model列表每个 key 一行或用分号分隔实际模板中还包含SKILLSPECTOR_LOG_LEVELWARNING用于控制日志级别。多 key 配置在.env.example中的真实写法如下api_pool.py的create_api_key_pool_from_env()会先把分号替换为换行再逐行解析所以分号与换行两种分隔均可SKILLSPECTOR_API_KEYSsk-or-xxx1|https://api.deepseek.com|deepseek-chat;sk-or-xxx2|https://api.deepseek.com|deepseek-chat;sk-or-xxx3|https://api.openai.com/v1|gpt-5.4 SKILLSPECTOR_PROVIDERopenai SKILLSPECTOR_MODELdeepseek-chat⚠️ 并行 LLM 扫描需要多个 API Key。用--workers 4配合 1 个 Key 会立刻触发限流。请至少配置与 worker 数量相当的 Key——--workers 8时配置 10 个 Key 是安全的选择。ApiKeyPool 会在某个 Key 被限流时自动故障转移。如果只有 1 个 Key请改用--workers 1或--no-llm。关于.env的加载时机还有一个易踩的坑源码在 contrib/batch_scan/init.py 与 batch_scan.py 顶部都强制在任何skillspector导入之前执行dotenv.load_dotenv(..., overrideTrue)原因是skillspector.constants在导入时就会读取SKILLSPECTOR_MODEL/SKILLSPECTOR_PROVIDER晚加载会导致模型配置失效。2.2 静态-only 模式快速、无需 API Keypython -m contrib.batch_scan.batch_scan ./tests/fixtures/ --no-llm--no-llm跳过所有 LLM 分析仅执行静态模式规则适合无 Key 环境下的快速初筛。2.3 全 LLM 扫描python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 72.4 用内置夹具验证安装python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 8仓库在 tests/fixtures 下按类别组织了大量技能样本malicious_skill、mcp_*、sdi/、sqp/、ssd/等文档描述为 23 个技能用于演练每一条检测规则。验证时还会顺带触发 ApiKeyPool 与 Gap-Fill 的完整链路。三、输出格式与报告解读3.1 三种格式一览格式参数适用场景TerminalRich-f terminal默认人工审查JSON-f json -o report.jsonCI 流水线Markdown-f markdown -o report.mdPR 评论三种格式的实现分别位于 contrib/batch_scan/reports.py 的_format_terminal、_format_json、_format_markdown它们都消费同一份list[dict]结果列表结构由runner.entry_from_result()定义。3.2 示例Terminal 输出23 个夹具、8 个 workerSkillSpector Batch Scan — 23 skill(s) in ./tests/fixtures (8 workers, 10 API keys) [1/23] malicious_skill → 100/100 CRITICAL (14 issue(s)) [8/23] sdi/sdi1_mismatch → 97/100 CRITICAL (6 issue(s)) [11/23] sdi/sdi4_divergence → 100/100 CRITICAL (8 issue(s)) [19/23] ssd/ssd1_semantic_injection → 100/100 CRITICAL (4 issue(s)) [5/23] mcp_poisoned_tool → 100/100 CRITICAL (16 issue(s)) ╭──────────────────────────────────────────────────────────────────╮ │ SkillSpector Batch Scan Report │ ╰────────────────── v2.2.3 | Multilingual Enhanced ──────────────╯ Total: 23 skill(s) scanned Skills by Risk Score (23 completed) ┏━━━━━━━━━━━━━━━━━━━━┳━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━┳━━━━━━┓ ┃ Skill ┃ LR ┃ Score ┃ Severity ┃ Issues ┃ Lang ┃ ┡━━━━━━━━━━━━━━━━━━━━╇━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━╇━━━━━━┩ │ chef-assistant │ ✓ │ 100/100 │ CRITICAL │ 14 │ en │ │ reаd_data │ ✓ │ 100/100 │ CRITICAL │ 16 │ en │ │ ... │ │ │ │ │ │ │ safe-greeting │ ✓ │ 0/100 │ LOW │ 0 │ en │ │ code-reviewer │ ✓ │ 0/100 │ LOW │ 0 │ en │ └────────────────────┴────┴─────────┴──────────┴────────┴──────┘ 15 skill(s) with HIGH or CRITICAL risk — review immediately 6 skill(s) with LOW risk — likely safeLR 列Language Reliability语义✓ 英语技能静态 LLM 全覆盖⚠ 非英语技能已应用 Gap-Fill额外覆盖 8 条规则。3.3 示例JSON 输出节选{ batch: { scanned_at: 2026-06-19T01:20:0000:00, total_skills: 23, scan_mode: multilingual-enhanced, enhancements: { language_detection: unicode-script-ratio, gap_fill_applied: 0, gap_fill_findings: 0 } }, skills: [ { skill: { name: malicious_skill, source: malicious_skill, source_group: ., language: en, scanned_at: 2026-06-19T01:20:0500:00 }, risk_assessment: { score: 100, severity: CRITICAL, recommendation: DO NOT INSTALL }, issues: [ { id: E1, message: Skill executes shell commands without user consent, severity: CRITICAL, confidence: 1.0, language_compatible: true } ], scan_mode: multilingual-enhanced, enhancements: { gap_fill_applied: false, gap_fill_findings: 0, english_keyword_rules_skipped: 0 } } ] }3.4 LLM 与静态模式对比同一批 23 个夹具、8 个 worker技能--no-llmLLM 模式LLM 额外捕获的内容ssd1_semantic_injection0/100 (0)100/100(4)静态不可见的语义注入ssd2_novel_phrasing0/100 (0)100/100(3)绕过关键词匹配的新颖措辞ssd3_nl_exfiltration0/100 (0)60/100(3)自然语言伪装的数据外泄ssd4_narrative_deception10/100 (1)100/100(9)欺骗性叙事框架sdi4_divergence13/100 (2)100/100(8)意图-行为不一致sdi1_mismatch52/100 (4)97/100(6)额外 2 条 LLM 发现sdi3_scope_creep71/100 (3)100/100(9)隐藏的范围扩张sqp2_missing_warnings26/100 (2)58/100(3)缺失的安全护栏malicious_skill100/100 (6)100/100(14)额外 8 条 LLM 发现mcp_poisoned_tool100/100 (8)100/100(16)额外 8 条 LLM 发现safe_skill0/100 (0)0/100(0)干净样本保持干净 ✓ssd_clean0/100 (0)0/100(0)干净样本保持干净 ✓关键结论LLM 语义分析器SSD/SDI/SQP能捕获英语关键词静态模式完全漏掉的整类漏洞干净样本始终干净不会产生误报膨胀对已被静态规则标记的技能LLM 平均每个技能能追加 2–8 条发现。3.5 与上游单技能扫描的快速对比# 上游 —— 扫描单个技能 skillspector scan ./tests/fixtures/malicious_skill/ -f json -o upstream.json # 批量 —— 扫描全部技能 python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f json -o batch.json批量输出相对上游的关键差异字段scan_mode: multilingual-enhanced—— 来源标记enhancements.gap_fill_applied—— 是否使用了 LLM Gap-Fillenhancements.english_keyword_rules_skipped—— 被跳过的静态规则数量非英语技能恒为 25见 contrib/batch_scan/runner.py 中_ENGLISH_KEYWORD_RULE_COUNTskill.language—— 检测出的语言标签。四、命令行全参考4.1 扫描LLM 模式python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 7 # 默认 python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 1 # 串行易读 python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 20 # 高吞吐4.2 扫描静态-only无需 API Keypython -m contrib.batch_scan.batch_scan ./tests/fixtures/ --no-llm python -m contrib.batch_scan.batch_scan ./tests/fixtures/ --no-require-llm --no-llm # 非英语技能也跳过 LLM4.3 输出格式python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal # 默认Rich python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f json -o report.json python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f markdown -o report.md4.4 夹具测试内置技能集python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 8 python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 8 --no-llm python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f json -o report.json --workers 84.5 语言覆盖python -m contrib.batch_scan.batch_scan ./tests/fixtures/ --lang auto --workers 4 # 自动检测默认 python -m contrib.batch_scan.batch_scan ./tests/fixtures/ --lang zh -f terminal --workers 4 python -m contrib.batch_scan.batch_scan ./tests/fixtures/ --lang ja -f terminal --workers 4 python -m contrib.batch_scan.batch_scan ./tests/fixtures/ --lang ko -f terminal --workers 4 python -m contrib.batch_scan.batch_scan ./tests/fixtures/ --lang en -f terminal --workers 4 # 跳过 Gap-Fill4.6 调试python -m contrib.batch_scan.batch_scan ./tests/fixtures/ --workers 1 -V # 单 worker 详细日志 python -m contrib.batch_scan.batch_scan ./tests/fixtures/ --workers 4 -V skillspector scan ./tests/fixtures/malicious_skill/ --no-llm # 验证上游正常4.7 上游 vs 批量对比skillspector scan ./tests/fixtures/malicious_skill/ -f json -o upstream.json python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f json -o batch.json --workers 44.8 CI 集成与退出码退出码含义0全部安全无 HIGH/CRITICAL1存在 ≥1 个 HIGH 或 CRITICAL 风险技能2发生扫描错误CI 用法python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f json -o report.json --workers 8 if [ $? -eq 0 ]; then echo All clean; fi退出码判定逻辑见 batch_scan.py 末尾errors非零优先返回 2否则只要存在分数 50 的技能has_high_risk即返回 1。五、并发调优--workers与 API 容量场景Workers峰值并发 LLM 请求免费额度 API Key110–15付费基础版4默认25–40企业版 / 多 Key7–1050–80调试1 -V串行易读从源码看这个模块实际叠加了三层并发见 contrib/batch_scan/batch_scan.py 模块 docstring 与 contrib/batch_scan/docs/DESIGN.mdLayer 3 — batch_scan.py: ThreadPoolExecutor(max_workersN) [本模块] Layer 2 — llm_analyzer_base: asyncio.Semaphore(10) [上游] Layer 1 — graph.py: 20 个分析器 fan-out [上游]各层互不知晓图流水线不知道自己在被并发调用worker 也不知道图内部会再扇出。之所以选用ThreadPoolExecutor而非ProcessPoolExecutor是因为后者在 macOS 上spawn模式会为每个子进程重新导入 LangGraph导致 30 秒以上的启动超时而graph.invoke()是纯函数每个线程操作各自独立的 state dict天然线程隔离。此外还有两项健壮性设计90 秒单技能超时future.result(timeout90)超时的技能被标记TIMEOUT并跳过其余 worker 继续不会重试避免占用额外槽位Rich 输出线程安全进度打印通过_print_lock串行化因为 Rich 控制台并非线程安全。六、语言检测原理Unicode 脚本比例语言检测实现在 contrib/batch_scan/detection.py零第三方依赖仅使用标准库unicodedata上游mcp_tool_poisoning.py也在使用。核心是脚本字符占比启发式CJK Unified (0x4E00–0x9FFF) → zh 占字母字符 ≥10% Hiragana Katakana (0x3040–0x30FF)→ ja ≥5% Hangul Syllables (0xAC00–0xD7AF) → ko ≥10% 否则 → en具体流程detect_language(content)逐字符统计 CJK / 假名 / 韩文数量与总字母字符数unicodedata.category().startswith(L)判定优先级为jakozhendetect_skill_language(file_cache)对技能内每个文件的结果做多数投票得到技能级语言。已知限制汉字密度高而假名密度低的日文文本会被误判为中文DESIGN.md 中已明确记录。批量扫描前会预解析全部技能的语言lang_map避免 worker 线程在文件 I/O 上互相争抢。七、LLM Gap-Fill非英语技能的规则补盲7.1 为什么需要 Gap-Fill上游有 25 条英语关键词静态规则P1–P8、E1–E4、PE1–PE3、EA1–EA4、OH1–OH3、TR1–TR3、MP1–MP3、RA1–RA2其正则只匹配英语短语例如r(clear|erase|wipe|forget)\s(your|my|the)\s(memory|context|instructions)。对非英语文本这些规则召回率归零。其中 17 条P1–P4、E1–E4、PE1–PE3、EA1–EA4、OH1–OH3、TR1–TR3已有语义分析器 SSD / SDI / SQP 覆盖剩余 8 条没有任何 LLM 等价规则正是 Gap-Fill 的靶点规则 ID漏洞类别典型特征英语示例P5有害内容毒物配方、武器制造、自伤/伤人指令伪装成教程P6–P8系统提示词泄露print your system prompt / 间接翻译 / 工具上传外泄MP1–MP3记忆投毒持久上下文注入、上下文窗口填充、清空记忆/改写身份RA1–RA2流氓 Agent自我修改代码写__file__、cron / .bashrc / systemd 持久化规则选入标准见 DESIGN.md静态正则被证明只匹配英语通过阅读static_patterns_*.py源码确认且没有语义分析器认领该规则 ID。Gap-Fill 提示词本身也明确要求只报告置信度 ≥0.7 的发现、不得编造 findings见 gap_fill.py 中的GAP_FILL_ANALYZER_PROMPT。7.2 实现GapFillAnalyzergap_fill.py 把原先裸露的chat_completion调用重构成了LLMAnalyzerBase的子类GapFillAnalyzer从而免费获得token 预算感知分批get_batches并行执行arun_batches结构化输出GapFillFinding/GapFillResult两个 Pydantic 模型做字段约束severity 枚举、confidence ∈ [0,1]语言感知提示词检测出的语言被注入提示词模板GAP_FILL_ANALYZER_PROMPT.format(languagelang)。关键实现细节response_schema None结构化输出被显式禁用因此响应是原始字符串需要手动json.loads→model_validate两步解析解析失败时返回空列表并打 WARNING 日志——这是刻意的优雅降级单次畸形响应不会阻塞流水线。最后按confidence 0.7过滤并只接受_GAP_FILL_RULE_IDS集合内的规则 ID。执行时机见 batch_scan.py 的_scan_skill()图流水线跑完后若lang ! en且启用 LLM 且无错误则对文件缓存执行run_gap_fill()把追加的 findings 通过annotate_findings()合并进entry[issues]并置位enhancements.gap_fill_applied。八、ApiKeyPool 多 Key 负载均衡8.1 配置格式多 key 模式推荐见 contrib/batch_scan/.env.exampleSKILLSPECTOR_API_KEYSsk-or-xxx1|https://api.openai.com/v1|gpt-5.4;sk-or-xxx2|https://api.openai.com/v1|gpt-5.4单 key 模式向后兼容无需池export OPENAI_API_KEYsk-or-xxx1当SKILLSPECTOR_API_KEYS未设置时create_api_key_pool_from_env()会回退读取OPENAI_API_KEY及OPENAI_API_KEY_2…OPENAI_API_KEY_9若最终只有 ≤1 个 key则返回None走上游的单 key provider 路径这也解释了为什么单 key 必须用--workers 1。8.2 调度算法类 Kubernetes 调度器实现位于 api_pool.py核心数据结构是每个ApiKey的并发槽默认max_concurrent5acquire → 挑选负载最低的空闲 keyleast-loaded release(successTrue) → 标记空闲 release(successFalse) → 标记 rate_limited退避 30s × 2^n上限 300s 429 后再次 acquire → 自动切换其他 keyacquire(timeout)阻塞式仅当所有未限流 key 的槽位耗尽才等待try_acquire()非阻塞版本供异步上下文使用release(key, successFalse)指数退避30 × 2^(n-1)cap 300 秒快照指标snapshot()会输出到报告请求总数、峰值并发槽位、限流次数、重试成功数。PooledChatModel是 LangChain 兼容的透明包装器每次invoke/ainvoke从池中取 key、动态构建ChatOpenAI实例、完成后归还遇到限流异常时以successFalse归还并自动换 key 重试默认最多 5 次。8.3 双补丁接线堵住from-import绕过set_api_pool()见 runner.py必须同时补丁两个模块的get_chat_modelskillspector.llm_utils.get_chat_modelskillspector.llm_analyzer_base.get_chat_model原因llm_analyzer_base在模块顶层用from ... import get_chat_model创建了局部引用只补丁llm_utils会漏掉它导致图内部分析器约占全部 LLM 调用的 95%绕过 key 池。双补丁后图分析器、meta 分析器、Gap-Fill 全部经由PooledChatModel走共享池set_api_pool(None)会把两个模块恢复原状。对应验证见 contrib/batch_scan/tests/test_pool_wiring.py。九、DeepSeek / 非 OpenAI 兼容补丁7 个 monkey-patchDeepSeek 直连 API 不支持response_format结构化输出而上游会无条件调用with_structured_output()导致 HTTP 400 并污染 httpx 连接池。为此 runner.py 提供deepseek_compat()上下文管理器在整次扫描期间应用 7 个补丁、退出时含异常路径自动还原且嵌套安全#目标机制目的1LLMAnalyzerBase.__init__实例属性self.response_schema None禁用结构化输出实例隔离2LLMAnalyzerBase.parse_responsejson.loads→ Pydantic 校验处理原始字符串响应3LLMMetaAnalyzer.parse_response同上 清洗null/none处理 LLM 输出怪癖4LLMAnalyzerBase.build_prompt追加 JSON 输出指令给模型格式提示5LLMMetaAnalyzer.build_prompt同上同上6ChatOpenAI.__init__注入httpx.Timeout(connect8s, read30s)防止连接挂死7asyncio.run异常处理器丢弃Event loop is closed压制清理噪音补丁 1 的关键洞察最初方案是改类属性response_schema所有线程共享存在竞态——线程 A 还原原值时线程 B 还在创建实例随即触发with_structured_output()→ 400。改为写实例__dict__后利用 Python MRO 实例属性优先于类属性的语言级保证每个分析器实例各持一个None零共享、零竞态。补丁 6 的管线httpx 默认connect5.0、readNone无限一个被接受但永不回包的 TCP 连接会让 worker 线程永久阻塞而ThreadPoolExecutor无法杀线程。补丁在内部 OpenAI 客户端缓存之前注入httpx.Timeout同时写 Pydantic 别名timeout与规范字段request_timeout避免依赖别名优先级内部行为。此外所有补丁应用前都会执行_verify_patch_targets()签名/依赖校验runner.py一旦上游 API 变动导致假设失效会立即抛出带明确信息的RuntimeError把静默失败转化为启动即失败。十、单技能扫描流水线run_one每个技能的完整链路由run_one()runner.py驱动run_one(skill_dir) ├─ scan_state() # 构建初始 LangGraph state ├─ graph.invoke(state) # 上游流水线未改动 │ ├─ build_context # 文件缓存、manifest │ ├─ 20 个分析器 # fan-out15 静态 5 LLM │ └─ meta_analyzer # LLM 验证 丰富 ├─ entry_from_result() # 提取 标注skill / risk_assessment / issues / enhancements └─ cleanup_result() # shutil.rmtree → subprocess 兜底entry_from_result()输出每项包含source_group相对路径首段、language、scan_mode、enhancements等溯源字段异常时生成severity: ERROR的占位条目并返回错误消息。cleanup_result()的shutil.rmtree在 macOS 上可能因悬空 fd 阻塞因此提供了subprocessUnixrm -rf/ Windowsrmdir /s /q兜底。十一、边缘情况与疑难解答# 静态-only 即使非英语技能也跳过 LLM 要求 python -m contrib.batch_scan.batch_scan ./tests/fixtures/ --no-require-llm --no-llm症状修复No LLM API key configured配置.env或改用--no-llm连接错误 / 429降低--workers技能超时90 秒检查网络扫描器会跳过并继续Event loop is closed无害已被补丁压制model_info token 限制警告无害使用 128K 默认值十二、已知限制无断点/恢复机制1000 个技能扫到第 847 个失败会丢失全部进度语言检测仅覆盖 4 种文字阿拉伯文、印地文、西里尔文会被归类为英语失去 Gap-Fill 覆盖无 SARIF 输出上游支持 SARIF本模块提供 terminal/JSON/Markdown 三种非英语 Gap-Fill 质量未经基准评测目前没有 ground-truth 对比数据parse_responseJSON 恢复是尽力而为LLM 返回畸形 JSON 时分析器返回空 findings不崩溃。这是刻意的优雅降级选择——单次畸形响应不会阻塞流水线但用户无法得知丢失了哪些 findings。架构细节见 DESIGN.md未来方向见 FUTURE_WORK.md线程安全与 DeepSeek 约束的踩坑记录见 PITFALLS.md。十三、运行测试164 项# 全部 164 项测试 # 单元测试 —— 随机顺序seed42120 项 python contrib/batch_scan/tests/tests-pro/random_numbered.py # Pool 接线冒烟测试4 项检查 python contrib/batch_scan/tests/test_pool_wiring.py # Monkey-patch 侵入性14 项测试 python contrib/batch_scan/tests/test_monkeypatch_invasiveness.py # Monkey-patch 脆弱性26 项测试 python contrib/batch_scan/tests/test_monkeypatch_fragility.py # 便捷命令 # 一条命令运行全部评审主题测试 python -m unittest \ contrib.batch_scan.tests.test_monkeypatch_invasiveness \ contrib.batch_scan.tests.test_monkeypatch_fragility -v python contrib/batch_scan/tests/test_pool_wiring.py # 变异测试 —— 4 个风险域注入 30 个 bug python contrib/batch_scan/tests/tests-pro/mutation_max.py # 顺序 pytest若已安装 pytest pytest contrib/batch_scan/tests/tests-pro/ -v测试套件结构164 项总计与各自的设计动机contrib/batch_scan/tests/ ├── test_pool_wiring.py ← Issue #1: 4 项冒烟检查 ├── test_monkeypatch_invasiveness.py ← Issue #2: 14 项线程隔离 ├── test_monkeypatch_fragility.py ← Issue #2: 26 项守卫校验 ├── tests-pro/ │ ├── test_api_pool.py ← Issue #3: 45 项acquire/backoff │ ├── test_gap_fill.py ← Issue #3: 41 项JSON 解析 │ ├── test_runner_patches.py ← Issue #3: 24 项上下文管理器 │ └── test_annotation.py ← Issue #3: 10 项语言兼容 └── docs/ ├── TEST_DESIGN.md ← 每个套件为何这样设计 ├── TEST_GUIDE.md ← 每个文件覆盖什么运行命令 └── BUGS_FOUND.md ← 发现 16 个 bug修复 3 个测试 bug测试文档分别在 TEST_DESIGN.md、TEST_GUIDE.md 与 BUGS_FOUND.md。就代码评审保障而言set_api_pool()的双补丁由 test_pool_wiring.py 验证了llm_utils、LLMAnalyzerBase._llm、GapFillAnalyzer.chat_model三条路径全部接入PooledChatModel补丁侵入性与脆弱性分别由 14 项导入隔离、线程隔离、50 实例并发与 26 项7 个补丁逐一校验、深层依赖检查、原子性测试保障评审完整答复见 REVIEW_RESPONSE.md。十四、深入阅读DESIGN.md —— 架构、三层并发模型、双补丁机制、被否决的备选方案ProcessPool / 全 asyncio / fork 上游PITFALLS.md —— 线程安全、from-import陷阱、DeepSeek 约束FUTURE_WORK.md —— 未来方向与代码约定CONTRIBUTING.md —— 开发环境搭建与代码规范核心源码batch_scan.pyCLI 并发编排、runner.py图封装 兼容补丁、api_pool.pyKey 池、gap_fill.py规则补盲、detection.py语言检测、reports.py报告格式化【免费下载链接】SkillSpectorSecurity scanner for AI agent skills. Detect vulnerabilities, malicious patterns, security risks, prompt injection, data exfiltration, and supply-chain risks in Claude Code, Codex, and MCP skills before you install them.项目地址: https://gitcode.com/GitHub_Trending/sk/SkillSpector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
热门专题

继续阅读更多专题内容

围绕企业服务、数字化转型与官网运营的常青话题,持续输出深度内容

企业官网建设指南 企业托管服务模式 财税政策与解读 企业数字化转型 官网SEO与获客 网站安全与运维
配套服务

读完这篇文章,了解更多服务

从整站搭建到SEO布局,17项核心服务助您打造高转化的企业官网

01

企业托管整站搭建

从信息架构到栏目预留,搭建可生长的企业站点骨架,每个页面独立原创设计。...

了解详情
02

规整可信网页设计

雪地靴温暖风原创设计,金属铜线条贯穿全页,拒绝通用模板与AI流水线。...

了解详情
03

企业服务SEO布局

关键词体系与语义化结构,从建站源头为搜索排名而生。...

了解详情
04

业务预约咨询表单

多场景表单与线索收集体系,把访问流量转化为可追踪的销售线索。...

了解详情
05

企业服务站点运维

安全巡检、数据备份与内容更新支持,全年守护网站稳定运行。...

了解详情
06

全终端商务适配

电脑、平板、手机一致呈现,移动端体验与转化同样出色。...

了解详情
需要专业建议?

让专业顾问为您解读行业趋势

关于企业官网建设、SEO获客与数字化转型的任何疑问,欢迎一对一咨询我们的专业顾问。