---
name: weaver-skill-detector
display_name: 泛微技能检测工具
display_name_en: Weaver Skill Detector
description: '泛微技能检测工具：对 skill 素材（zip/md/目录）做静态质检，判断是否符合 WorkBuddy 规范且通过泛微专属安全合规质检。默认检测范围 = 泛微专属（WV）+ WorkBuddy 平台（WB）+ 通用质量/安全；千问（QwenWork）规范仅在用户明确说明上架千问时用 --platform qwenwork 显式启用，不得主动检测。'
description_zh: '泛微技能检测工具。对用户提交的 skill 素材（.zip/.md/目录）做静态质检，默认覆盖：(1) WorkBuddy 通用结构校验（SKILL.md、frontmatter、命名规范）；(2) 泛微专项红线——默认登录地址、硬编码 IP/凭证、凭证来源、敏感词；(3) 运行时威胁模型与行为图谱——命令执行、网络外传、文件敏感路径、Prompt 注入、远程脚本、沙箱绕过、浏览器控制、环境变量等。对外发布/提交前做风险拦截。另有千问办公（QwenWork）平台规范（zip ≤ 10 MB、条目 < 1000、<name>/SKILL.md 精确路径、displayName/name_en/author_name/category_code/icon 字段、连接器就绪契约 qw_query + 401/403 重授权），但属于按需启用：仅当用户明确说明要上架千问办公市场时才追加 --platform qwenwork，用户没说千问就默认不走千问规则。'
description_en: 'Weaver skill detector: statically validate skill packages (zip/md/directory) against WorkBuddy conventions and Weaver-specific security & compliance rules - default-login domains, hardcoded IPs/credentials, credential sourcing, sensitive words, plus runtime threat model & behavior graph (command execution, network exfiltration, sensitive file paths, prompt injection, remote scripts, sandbox bypass, browser control, env vars). Acts as a release-gate risk interceptor before publishing/submission. Default scope is Weaver (WV) + WorkBuddy platform (WB) + generic quality/security. A separate QwenWork (Qwen) ruleset exists (zip <= 10 MB, < 1000 entries, exact <name>/SKILL.md path, displayName/name_en/author_name/category_code/icon fields, connector readiness contract with qw_query plus 401/403 re-auth), but it is opt-in only: pass --platform qwenwork ONLY when the user explicitly says the skill is being published to the QwenWork marketplace. If the user does not mention Qwen, stay on the default weaver mode.'
version: 1.1.2
author: 泛微网络科技股份有限公司
agent_created: true
license: MIT
---

# 泛微技能检测工具

对用户提交的 skill 素材（`.zip` 压缩包 / `.md` 文件 / 目录）做**静态质检**，判断是否为合格的 WorkBuddy skill，
并拦截泛微场景下对外分发的高危风险（尤其是「默认登录地址指向泛微自用系统」这一红线）。

## 适用场景

- 用户发来一个 `.zip`（声称是 skill 包）或 `.md`（声称是 SKILL.md / skill 文档），问「这个符不符合规范 / 是不是合格 skill」。
- 在把自研 skill 上传到 skillbub / 市场 / 分发给客户**之前**，做一次合规与安全扫描。
- 收到他人提交的 Weaver 系 skill，需要快速识别其中的硬编码 IP、凭证、默认系统地址等风险。

## 重要约束（务必遵守）

1. **本工具只做静态分析，绝不连接任何线上 Weaver / e-cology 系统。** 不要为了「验证」被检测 skill 而去实际请求任何系统地址。
2. **绝不给默认系统地址。** 若被分析的 skill 需要系统地址用于联调，必须要求用户显式提供其**自有域名**；
   检测结果与工具本身都不得默认指向 e-cology.com.cn 等泛微自用域名。
3. 检测结论基于静态规则，可能存在误报（尤其 IP / 凭证为启发式 WARN），输出时标注严重程度与依据，便于人工复核。

## 检测流程

### 第 1 步：确认输入类型并准备源码

接受三种输入，统一交给脚本处理：
- `.zip` 压缩包 → 解包到临时目录（已做路径穿越防护）后定位 `SKILL.md`。
- `.md` / `.markdown` 单文件 → 视作 `SKILL.md` 候选，临时承载。
- 目录 → 直接扫描。

> 若压缩包内含多层目录（如外层 `weaver-xxx/`），脚本会自动递归查找 `SKILL.md`。

### 第 2 步：运行检测脚本

使用本地 Python 运行（优先用托管运行时，避免污染用户环境）：

```bash
/Users/tangbin/.workbuddy/binaries/python/versions/3.13.12/bin/python3 \
  <skill_dir>/scripts/validate_skill.py <用户提供的zip|.md|目录路径> [--json] [--out report.md] [--html report.html] [--market-live] [--market-catalog catalog.json] [--no-html]
```

- **默认按需输出 HTML 报告**：未显式传 `--html` 且未传 `--no-html` 时，只有检测结论为 `WARN` 或 `FAIL` 才生成 HTML 报告到「输入同目录/<输入名>-report.html」（如 `a.zip` → `a-report.html`；目录输入 → 同级 `<目录名>-report.html`）；纯 `PASS` 不落 HTML 文件。控制台会在实际写出时打印「HTML 报告已写出: <路径>」。头部展示 **Skill 基础信息（MD5 / SHA256 / 文件大小）**、**技能能力清单**与**依赖的其他技能**标签云（独立胶囊圈选，仅展示 `weaver-` 前缀依赖），正文含各维度检测结果（威胁模型视图、行为图谱已按需求停用）。
- 不带参数时打印**可读报告**（含每项 ✅/❌/⚠️ 状态、命中位置、修复建议）。
- `--json` 输出结构化结果，便于二次处理（默认仅 `WARN/FAIL` 生成 HTML；配合 `--no-html` 可只留 JSON）。
- `--out report.md` 将报告落盘。
- `--html report.html` 自定义 HTML 报告输出路径（显式传参时即使纯 `PASS` 也会写出）。
- `--no-html` 关闭默认 HTML 输出（仅控制台/JSON，不落默认 HTML 文件）。
- `--market-live`（推荐，**动态联网核查**）：自动联网查询 skillhub.cn 市场，为每个 **`weaver-e10-` 前缀**依赖实时标注 **市场可搜（带跳转链接）/ 市场未收录 / 核查失败**，非 `weaver-e10-` 前缀依赖标注 **跳过核查**。判定基于技能 `slug` 精确匹配（避免子串误命中，如 `weaver-e10-shared` 不会误判其它技能）。无需任何写死的清单文件。
- `--market-catalog catalog.json`（可选离线快照）：不联网时传入「市场已收录技能清单」标注可达性，作为 `--market-live` 的离线替代。清单支持「列表」（`["a","b"]`，均为可搜）或「对象」（`{"a":true,"b":false}` 或富对象 `{"a":{"found":true,"market":"skillhub.cn","url":"..."}}`）。
- `--platform weaver|qwenwork`（**平台规范切换，默认 `weaver`**）：
  - `weaver`（默认）：泛微生态规范，**既有行为完全不变**（`name` 必须 `weaver` 前缀、`display_name` 须以「泛微」开头、`author` 锁定为「泛微网络科技股份有限公司」等）。
  - `qwenwork`：千问办公生态规范，启用千问专属硬性规则（见下方「千问模式」章节）；同时**放宽**泛微品牌类约束（不强求 `weaver` 前缀、不锁 author）。

> ### ⚠️ 默认检测范围（重要·调度规则）
>
> **默认 = 泛微专属（WV）+ WorkBuddy 平台（WB）+ 通用质量/安全**，即 `weaver` 模式。
>
> **不要主动启用千问模式。** 仅当用户在需求里**明确说明**是「上架千问 / 千问办公 / QwenWork / 千问市场」时，才追加 `--platform qwenwork`。
>
> 以下表述一律按**默认 `weaver` 模式**执行，**不加** `--platform qwenwork`：
> 「检测一下这个 skill」「检查能不能上架」「提交 skillhub / 技能市场」「比赛投稿 / 大赛提交」「发布前体检」「泛微上架」……
>
> 判断口诀：**用户没说千问，就不是千问。** 若不确定，按默认模式跑；确有需要时向用户确认，而不是默认把千问规则加上去。

```bash
# 默认模式（绝大多数场景直接这样跑，不需要 --platform）
/Users/tangbin/.workbuddy/binaries/python/versions/3.13.12/bin/python3 \
  <skill_dir>/scripts/validate_skill.py ./my-skill.zip

# 千问模式（仅当用户明确说明要上千问办公市场时才用）
/Users/tangbin/.workbuddy/binaries/python/versions/3.13.12/bin/python3 \
  <skill_dir>/scripts/validate_skill.py ./my-skill.zip --platform qwenwork
```

脚本退出码：`0`=通过/WARN，`1`=FAIL，`2`=输入非法。

### 第 3 步：解读结果

脚本按五份维度输出（详见 `references/checklist.md`）：

#### 约束归属：WB（平台）、WV（泛微）、QW（千问）

检测项分属三套来源不同的规范，**违反后果不同，排查对象也不同**（详见 `references/checklist.md` 第 0 节）：

| 归属 | 含义 | 约束对象 | 违反后果 |
|---|---|---|---|
| **WB** | WorkBuddy 平台约束（skillhub.cn 加载器与上传校验，对齐官方 `expert-reviewer`） | 任何作者的 skill，与是否泛微无关 | 平台直接拒收/加载异常，无协商空间 |
| **WV** | 泛微专属约束（品牌规范、E10 账号与接口调用契约、安全合规红线） | 泛微对外发布/上架/比赛提交的 skill | 平台不拦，但泛微内部发布门禁不放行 |
| **WB+WV** | 叠加 | 同上 | 任一层不满足即失败 |
| **QW** | 千问办公平台约束（千问生态接入开发指南，需 `--platform qwenwork` 显式启用） | 要上架千问办公市场的 skill | 千问平台直接拒收 |
| **QW+WB** | 千问独有约束，且与 WorkBuddy 通用要求共存 | 同上 | 任一层不满足即失败 |
| **QW+WV** | 同一 skill 既要上千问又要上泛微时的叠加约束 | 双平台上架的 skill | 取两者更严者 |

**一句话区分：WB = 平台收不收；WV = 泛微放不放；QW = 千问收不收。**

速查：**WB** → A1、A1a–A1e、A2、A2n、A3–A11c、A13、A14、G02–G04c、C08、BOM、CRLF、Q1–Q4b、E1、C1–C8、D1–D3；
**WV** → A2m、A4b、A8b–A8e、A12、B1–B10c；
**WB+WV** → A8f（`version`：平台要 SemVer，泛微要顶层）、E2（平台关注 dependencies，泛微只认 `weaver-e10-` 前缀）；
**QW** → A1c′（条目 < 1000）、A1f（zip ≤ 10 MB）、A4′（`<name>/SKILL.md` 精确路径）、A5f（`displayName`）、A5g（`author_name`）、A5h（`argument-hint`，推荐不阻）、A6c（`category_code` 14 枚举）、A6e（`icon`）、A11d（正文 ≤ 64 KB）、B11（连接器就绪性契约）。

#### 千问模式（`--platform qwenwork`）—— 按需启用，非默认

> **触发前提：用户明确说明要上架千问办公市场。** 未说明时一律用默认 `weaver` 模式，
> 千问的 11 条专属规则（A1c′/A1f/A4′/A5f/A5g/A5h/A6c/A6e/A6f/A11d/B11）**一条都不会执行**，
> 报告中也不会出现任何 QW 归属项与 QW 图例——默认报告保持「泛微 + WorkBuddy + 通用」的原有形态。

千问与泛微的 frontmatter 字段名不一致，工具内置**字段别名映射**自动适配（见下表）；泛微模式行为完全不变。

| 语义 | 泛微（`weaver`）字段名 | 千问（`qwenwork`）字段名 |
|---|---|---|
| 中文展示名 | `display_name`（须以「泛微」开头） | `displayName`（无前缀要求） |
| 英文展示名 | `display_name_en` | `name_en` |
| 中文描述 | `description_zh` | `description`（直接是中文） |
| 英文描述 | `description_en` | `description_en` |
| 发布方 | `author`（锁定为「泛微网络科技股份有限公司」） | `author_name`（表单字段，市场列表展示） |
| 唯一标识 | `name`（必须 `weaver` 前缀） | `name`（无品牌前缀要求） |

千问专属硬性规则（BLOCK）：

1. **A1c′ 条目数 < 1000**：包内文件总数上限 999（泛微模式仍为 ≤ 300）。
2. **A1f zip ≤ 10 MB**：读取**真实归档文件体积**（zip/md 输入为权威值；目录输入无归档可测，降级为「包内文件合计」并在结论中标注为近似值）。
3. **A4′ `<name>/SKILL.md` 精确路径**：zip 输入用原始 namelist 精确比对；目录输入校验「SKILL.md 所在目录名 == `name`」。这是千问最高频失败原因——macOS Finder 右键「压缩 N 项」只会得到裸 `SKILL.md`，必须 `zip -r x.zip <name>/`（带外层目录一起压）。
4. **A5f `displayName` 必填**（≤ 255 字符）、**A5g `author_name` 必填**、**A5h `argument-hint` 推荐但不阻断**。
5. **A6c `category_code`** 必须命中千问固定 14 个分类（`content_creation`/`visual_creative`/`data_analysis`/`consulting_research`/`productivity`/`marketing_sales`/`ecommerce_retail`/`product_development`/`hr_recruiting`/`finance_accounting`/`legal_affairs`/`investment`/`education`/`other`）。
6. **A6e `icon` 必填且为公网 URL**（规格 240*240，仅校验声明不下载）。
7. **A11d 正文 ≤ 64 KB**：超出部分在市场详情页会被截断（不影响上传成功，但首屏体验劣化）。
8. **B11 连接器就绪性契约**：技能若声明依赖连接器（`qwenwork.settings.connector.<类别>.<id>`），必须先用 `qw_query` 查询就绪状态，并处理 401/403 / token 失效回退到授权引导（Step 0）；否则 BLOCK。

**A-1. 基础合规 · WorkBuddy 平台约束（WB）**
SKILL.md 存在、frontmatter 完整、
**`name` 命名规范（BLOCK）**：仅小写字母（a-z）、数字（0-9）和连字符（-），不允许大写/下划线/空格/中文/特殊字符；不能以 `-` 开头或结尾，不允许连续 `--`；长度必须 3-64 个字符、
**`description` 长度 1-1024（BLOCK）**：不能为空，超过 1024 字符判 FAIL、
**frontmatter YAML 语法真解析（A2n, BLOCK）**：平台用真 YAML 解析器解析 frontmatter，语法错误直接报「frontmatter 无法解析 / mapping values are not allowed in this context」拒收。高频触发：一行挤多个键值对（粘贴丢换行）、值中含未加引号的冒号+空格、Tab 缩进。装有 PyYAML 时真解析精确报行号，未装则降级启发式扫描、
目录名与 name 一致、无模板占位符残留、正文充实等。

**A-2. 基础合规 · 泛微生态约束（WV，平台不强制但泛微一律不放行）**
**`name` 必须以 `weaver` 开头（BLOCK）**、
**`display_name` 必填且以「泛微」开头（BLOCK）**、
**`display_name_en` 必填（BLOCK）**、
**`description_zh` 必填（BLOCK）**、
**`description_en` 必填（BLOCK）**、
**`version` 必须为顶层字段（BLOCK）**：平台只要求 SemVer（三段纯数字，如 `1.0.0`，不支持 `v1.0`/`1.0`/`latest`），泛微额外要求**必须顶层**，不允许 `metadata.version` 嵌套；上架市场时版本号须严格大于已发布版本、
**`author` 必须为「泛微网络科技股份有限公司」（BLOCK，缺失或不符即 FAIL）**、
**frontmatter 全部字段必须为顶层（BLOCK）**：`name`/`version`/`author`/`description` 等均写在顶层，**不允许 `metadata:` 嵌套块**（如 `metadata:\n  author: ...`）——嵌套写法视为字段缺失，直接判 FAIL；仅空 `metadata:` 或嵌套非关键字段判 WARN。
另含 **正文行数 ≤ 500（WARN）**：SKILL.md 正文建议控制在 500 行以内，内容过多时拆分为 references/ 目录下的独立文件。
另含 **引用相对路径规范（WARN）**：正文引用其他文件必须使用相对 Skills 根目录的路径（如 references/api-docs.md、scripts/main.py 的形式），禁止反斜杠分隔与非系统类绝对路径，且资源目录下的引用文件须真实存在于包内；运行时系统路径（/tmp/、/Users/ 等）与占位符示例自动豁免。
另含 **A1a Windows 反斜杠路径分隔符（BLOCK，仅 zip 输入）**：基于 zip 原始条目名检查，任一 zip 条目路径含 `\`（如 `weaver-e10-doc\operations\`）即判 FAIL——skillhub 校验跑在 Unix，反斜杠会被视为文件名非法/不安全字符，整包标记「文件路径不安全」。须用 `zip -r xxx.zip xxx/` 或 7-Zip「标准 zip」模式重打，勿用 Windows 资源管理器拖拽。目录输入不触发此项（无法从 OS 路径推断打包后的 zip 路径）。
另含 **A1b 目录层级不超过两级（BLOCK）**：Skill 包仅支持 `根目录/二级目录/文件` 结构。以 SKILL.md 所在目录为 skill 根，任一文件相对深度 > 2（三级及以上子目录，如 `references/attend/xxx.md`）即判 FAIL——平台解析会异常。须把模块子目录拍平（`references/<模块>/<文件>` → `references/<文件>`）或提升模块目录为 references 同级。
另含 **A1c 文件总数 ≤ 300（BLOCK）**：包内（含任意层级、含隐藏/缓存文件）文件总数超过 300 即判 FAIL——平台上传硬性上限，超限直接拒收。须清理 `__pycache__`、`.DS_Store`、临时产物或拆分体积。
另含 **A1d 仅纯文本 / 禁止二进制（BLOCK）**：ZIP 包内任意位置不得包含二进制文件，包括但不限于可执行（`.exe`/`.dll`/`.so`/`.dylib`）、图片媒体（`.png`/`.jpg`/`.gif`/`.mp4`）、压缩归档（`.zip`/`.tar`/`.gz`）等；只允许纯文本格式（`.md`/`.py`/`.js`/`.txt`/`.json`/`.yaml` 等）。采用「纯文本扩展名允许清单 + 二进制魔数嗅探」双保险：扩展名不在清单内会再嗅探文件头（空字节 / PNG/JPEG/PDF/ZIP/EXE 等魔数），连「文本扩展名却实为二进制」也漏不掉；无扩展名的纯文本（LICENSE/Makefile 等）经已知名单或嗅探放行，避免误杀；macOS 打包垃圾（`.DS_Store`/`._xxx`/`__MACOSX/`）一律判违规。
另含 **A1e SKILL.md 文件名大小写精确（BLOCK）**：入口文件名必须精确为 `SKILL.md`（首字母大写、后缀全大写 MD），不允许 `skill.md` / `Skill.md` / `Skill.MD` 等任何大小写变体。平台/工具以区分大小写方式匹配入口文件名，变体不会被识别为 skill 入口，等于「无 SKILL.md」。变体单独存在 → 直接 BLOCK 并提示重命名为 `SKILL.md`；与精确 `SKILL.md` 并存 → 同样 BLOCK 提示删除多余变体。
另含 **A2 结构化文件可解析性（BLOCK）**：包内所有 `.json`/`.yaml`/`.yml`/`.toml` 文件必须可正常解析，格式错误会导致平台加载 skill 时直接报错。
另含 **A3 依赖引导完整性（WARN）**：若包内含 `scripts/`/`bin/`/`package.json`/`requirements.txt` 等依赖声明，须在 SKILL.md 或 references/ 中提供安装/使用说明。

**B. 专项质检（泛微合规与安全，全部为 WV）—— 红线**
- **B1 默认登录地址未指向泛微自用系统（BLOCK）**：严禁把 `e-cology.com.cn` / `weaver.com.cn` / `eteams.cn` 等泛微自用域名写死为默认地址。
- **B2 无硬编码真实 IP（HIGH）**：真实服务器 IP 必须脱敏为占位符。
- **B3 无硬编码凭证（HIGH）**：密码 / token / secret 不得字面量写死，须走 E10 命名凭据插件。
- **B4 凭证应通过插件获取（MEDIUM）**：涉及 Weaver API 时说明用 E10 插件（如 `key=ETEAMSID`）。
- **B5 敏感词占位规范（INFO）**：建议复用 `-替换敏感词占位符-`。
- **B6/B7/B8**：子进程调用、命令行传凭证、硬编码密钥解密本地凭证。
- **B9 API 请求凭证完整性（BLOCK）**：skill 发起对外 API 请求时，必须同时携带 ① Cookie 完整原始串（禁止裁剪/去重/改写）② eteamsid ③ User-Agent（AgentType=<agentType>,IsAgent=true），三条缺一不可；Cookie 被 split / dict / 切片改写时另计 WARN。
- **B10 E10 接口型技能「共享登录 + 凭证」契约（BLOCK，仅 `weaver-e10-` 前缀技能生效，`weaver-e10-shared` / `weaver-e10-shared-connector` 自身豁免）**：
  - **B10a 登录必须走共享规则**：E10 接口型技能必须依赖 `weaver-e10-shared`；连接器版依赖 `weaver-e10-shared-connector`。需在 frontmatter `dependencies` 声明，或在正文/脚本中引用共享规则 / `weaver-work-cli auth`。无任何共享登录规则依赖证据即阻断。
  - **B10b 禁止自建登录**：不得自行实现登录流程（Playwright / Selenium / Puppeteer 自动登录、扫码登录、账号密码登录、自建 OAuth 取 token），会话必须统一由共享规则与 `weaver-work-cli auth` 托管。
  - ~~**B10c 接口文档须声明完整凭证**~~ **（2026-09-20 起停用）**：请求头三件套（Cookie 完整原始串 / eteamsid / User-Agent）已收敛为「唯一权威声明」，只写在 `weaver-e10-shared`（连接器版 `weaver-e10-shared-connector`）入口 SKILL.md 的「请求头契约」章节，业务模块一律改为指针引用、不再复制代码块。本规则按单个技能目录独立扫描，看不到 shared 的正文，继续启用会把正确的引用写法误判为 FAIL，故整段停用；脚本型技能仍由 B9 覆盖。
  - 触发前提：存在 API 表面（脚本内真实 HTTP 调用，或文档中的接口请求描述）。纯规范/UI 类 E10 技能（无接口描述）自动跳过，不误伤。

**G. 扩展安全（WB，对齐官方 expert-reviewer G 组）**
- **G02 无危险 shell 命令（HIGH）**：检测 `rm -rf /`、`curl|sh`、`sudo`、`chmod 777`、`dd`、fork bomb 等（否定语境豁免）。
- **G03 无内网域名残留（MEDIUM）**：检测 `*.woa.com`/`*.tencent.com`/`*.internal`/`*.local` 等通用内网域名（泛微自用域名由 B1 覆盖）。
- **G04a 无开发者个人路径残留（MEDIUM）**：检测 `/Users/xxx/`、`/home/xxx/`、`C:\Users\xxx\` 等个人路径。
- **G04b 无 IDE/平台配置目录残留（LOW）**：检测 `.vscode/`/`.idea/`/`.cursor/`/`.DS_Store` 等不应出现在发布包中的文件。
- **G04c CDN 依赖版本锁定（MEDIUM）**：检测 `cdn.jsdelivr.net/.../@latest` 等未锁定版本的 CDN 引用。
- **C08 无平台虚假技术承诺（MEDIUM）**：检测「本地AI」「离线运行」「不上云」「数据不出本机」等与平台运行方式不符的承诺。
- **BOM 头残留（LOW）**：检测 UTF-8 BOM（EF BB BF），可能导致 YAML frontmatter 解析失败。
- **CRLF 行尾（LOW）**：检测 Windows CRLF 行尾，跨平台分发时可能导致脚本执行异常。

**Q. 质量评估（WB，启发式，对齐官方 expert-reviewer Q 组）**
- **Q1 路由触发清晰度（LOW）**：SKILL.md 是否有明确的触发场景/关键词描述（如「当用户」「适用场景」「trigger」）。
- **Q2 上下文效率（LOW）**：检测 >100KB 的超大 Markdown 文件，影响 Agent 上下文窗口效率。
- **Q3 容错降级（LOW）**：包内含脚本时检查是否有 try/catch/except 等错误处理逻辑。
- **Q4 字段字数控制（LOW）**：`display_name` ≤20 字、`description` ≤200 字（一句话概述），详细内容放 `description_zh`/`description_en`。

**C. 威胁捕获模型视图（WB）**
8 类风险卡片网格（供应链 / 命令执行 / 网络请求与数据外传 / 文件操作与敏感路径 / Prompt 注入
/ 远程脚本下载执行 / 可疑编码/混淆 / 其他安全风险）；每张卡片附三个引擎 chip —— **行为安全**
（按 status 着色，绿/橙/红）+ **AI 引擎**（紫色，扫描器自身作为 AI 引擎对外披露）+ **静态引擎**
（命中=蓝，未命中=灰）。

**D. 威胁行为图谱解析（WB）**
针对具体跨文件/跨行行为的联合检测，渲染为「顶部四 tab + 详情卡片」：
- 四个 tab：**全部引擎结果(N)** / **检出恶意(N)** / **检出可疑(N)** / **评估安全(N)**；
- 每条规则一张卡片，含三个引擎 chip、明确结论描述与深色等宽日志块（绿色 ✓ + `文件:行 → 代码` 命中）。
原覆盖三类行为：
- D1 `dangerouslyDisableSandbox` + `run_in_background` 绕过权限确认（HIGH）
- D2 浏览器启动参数关闭沙箱（HIGH）
- D3 提示词诱导用户明文粘贴 `ETEAMSID` / `token` / `session` 等会话凭证（HIGH）

**E. 技能能力清单（WB）**
透明列出识别到的运行时能力：HTTP 请求、调用外部 API、读取文件、写入文件、安装依赖包、
控制浏览器、读取环境变量、执行系统命令、数据库访问、网络监听 / Socket / WebSocket 等。

**E2. 依赖的其他技能（WB+WV）**
透明列出显式声明或文档引用的其他技能（**仅检测 `weaver-e10-` 前缀**的泛微生态技能，非 weaver-e10- 前缀一律不识别）：frontmatter `dependencies` / `requires` / `depends_on` /
`skills` / `uses`（内联或 YAML 块列表）、description 中「由 xxx 提供/负责」、主 SKILL.md 中
`skill: "xxx"` / `/斜杠命令` /「使用 xxx 技能」表述；自动跳过自身与常见路径/占位符片段。
`weaver-ebuilder-*`、`weaver-openserver-*`、`e10-login`、`eteams-*` 等内部模块/平台引用**不算** skill 依赖，不做市场核查。

市场可达性标注（推荐 `--market-live` 动态核查）：**仅对 `weaver-e10-` 前缀的依赖**实时查询 skillhub.cn 并标注
**市场可搜**（带跳转链接，消费方可直接获取）/ **市场未收录**（市场未上架，需随包另行分发）/
**核查失败**（联网异常，需手动核实）；非 `weaver-e10-` 前缀依赖（如 `weaver-ebuilder-*`、`e10-login`，多为内部引用/误报）
统一标注 **跳过核查**，不做市场可达性判断，避免噪音。匹配规则为 `slug` 精确相等，避免子串误命中。
用途：在分发/评审前快速判断被依赖技能「消费方能否自行获取」，避免上架后因依赖缺失而无法联动。
离线场景可用 `--market-catalog catalog.json` 快照替代。

**综合判定**：存在任意 BLOCK 级 FAIL → FAIL（不通过）；否则有 WARN → WARN（通过建议修复）；全 PASS → PASS。

### 第 4 步：给出处置建议

- **FAIL**：逐条列出阻断项与高危项，给出具体修复动作（去掉默认地址、脱敏 IP、改走插件凭证等），请用户修复后复检。
- **WARN**：提示可在发布前优化的项（命名、占位残留、凭证来源说明）。
- **PASS**：确认合格，可进入分发/提交流程。

## 资源

- `scripts/validate_skill.py` — 核心静态检测脚本（接收 zip/.md/目录，输出报告）。
- `references/checklist.md` — 完整检测项、判定标准与红线说明。

##  Notes

- 单 `.md` 文件无法校验「目录名与 name 一致」（A9），该场景下标注为 INFO 跳过。
- IP / 凭证检测为启发式 WARN，可能误报；请以脚本给出的「命中位置」人工确认。
- 如需新增检测规则（如特定敏感词库、其他泛微域名），直接扩展 `validate_skill.py` 中的常量与对应检测函数，并同步更新 `references/checklist.md`。
- **平台切换只影响字段与阈值，不影响安全类检测**：`--platform` 仅调整「结构/字段/打包阈值」类规则；威胁模型、行为图谱、硬编码 IP/凭证、E10 登录契约等安全检测在两种模式下都跑。
- **超大包扫描性能**：工具对参与扫描的单文件截断到 `MAX_SCAN_FILE_BYTES`（4 MB）、单行截断到 `SCAN_LINE_MAX_CHARS`（4000 字符）后再做正则匹配。原因是部分路径正则含可回溯量词，在超长单行（压缩 JS、无换行数据文件）上会退化成准 O(n²)——实测 11 MB 单行曾让扫描卡死 180 秒以上，截断后同一用例 8 秒内完成。截断只丢弃超长行尾部，行号一一对应，正常代码行远小于阈值，检测结论不受影响。
- **写正则的硬约束（改动 `validate_skill.py` 时务必遵守）**：逐行扫描的正则必须**先锚定字面量 token**，再向后做「有界尾部 + 定界」校验；**禁止** `[^\s'\"]*` 这类无界量词，也**禁止** `[^\s'\"]{0,N}` 这种「可空/通配前缀 + 有界量词」写法——后者会让引擎在每个起点试 N 种前缀长度，1.6 MB 单行实测需 90+ 秒。

## 版本历史

- **1.1.2**（2026-09-01）：依赖识别收窄为**仅 `weaver-e10-` 前缀**。非该前缀的 `weaver-ebuilder-*` / `weaver-openserver-*` / `e10-*` / `eteams-*` 一律视为平台模块或内部引用，不再识别为技能依赖、不再做 skillhub 市场可达性核查。对应 `validate_skill.py` 的 `add()` 前缀过滤、高精度标识符正则、`looks_like_skill_name()` 及文档（SKILL.md / references/checklist.md）同步更新。
- **1.1.1**（2026-09-01）：依赖检测支持 `--market-live` 动态联网核查 skillhub.cn，按 `slug` 精确匹配标注市场可达性；非 `weaver-` 前缀依赖标注跳过核查。
- **1.1.0**（2026-09-01）：依赖检测初版，识别 `weaver-` 前缀技能并离线声明依赖来源。
