泛微技能检测工具
下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-vsc9dz4y--weaver-skill-detector.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-vsc9dz4y/weaver-skill-detector。泛微技能检测工具:对 skill 素材(zip/md/目录)做静态质检,判断是否符合 WorkBuddy 规范且通过泛微专属安全合规质检。默认检测范围 = 泛微专属(WV)+ WorkBuddy 平台(WB)+ 通用质量/安全;千问(QwenWork)规范仅在用户明确说明上架千问时用 –platform qwenwork 显式启用,不得主动检测。
阅读全文 (展开查看完整说明)
概述
对用户提交的 skill 素材(.zip 压缩包 / .md 文件 / 目录)做静态质检,判断是否为合格的 WorkBuddy skill,并拦截泛微场景下对外分发的高危风险(尤其是「默认登录地址指向泛微自用系统」这一红线)。
适用场景
- 用户发来一个
.zip(声称是 skill 包)或.md(声称是 SKILL.md / skill 文档),问「这个符不符合规范 / 是不是合格 skill」。 - 在把自研 skill 上传到 skillbub / 市场 / 分发给客户之前,做一次合规与安全扫描。
- 收到他人提交的 Weaver 系 skill,需要快速识别其中的硬编码 IP、凭证、默认系统地址等风险。
重要约束(务必遵守)
- 本工具只做静态分析,绝不连接任何线上 Weaver / e-cology 系统。 不要为了「验证」被检测 skill 而去实际请求任何系统地址。
- 绝不给默认系统地址。 若被分析的 skill 需要系统地址用于联调,必须要求用户显式提供其自有域名;
检测结果与工具本身都不得默认指向 e-cology.com.cn 等泛微自用域名。
- 检测结论基于静态规则,可能存在误报(尤其 IP / 凭证为启发式 WARN),输出时标注严重程度与依据,便于人工复核。
检测流程
第 1 步:确认输入类型并准备源码
接受三种输入,统一交给脚本处理:
.zip压缩包 → 解包到临时目录(已做路径穿越防护)后定位SKILL.md。.md/.markdown单文件 → 视作SKILL.md候选,临时承载。- 目录 → 直接扫描。
若压缩包内含多层目录(如外层
weaver-xxx/),脚本会自动递归查找SKILL.md。
第 2 步:运行检测脚本
使用本地 Python 运行(优先用托管运行时,避免污染用户环境):
/Users/tangbin/.workbuddy/binaries/python/versions/3.13.12/bin/python3 -S
<skill_dir>/scripts/validate_skill.py <用户提供的zip|.md|目录路径> [--json] [--out report.md] [--html report.html] [--market-live] [--market-catalog catalog.json] [--no-html]务必带
-S:本环境(WorkBuddy CLI)会注入sitecustomize.py代理每一次open()向 broker 申请文件 token。脚本需逐文件嗅探二进制(
_sniff_binary),**文件数较多的包(几十个文件以上)会因此长时间阻塞,最终被 SIGTERM 杀掉(exit 137),且控制台无报错**——表现为「命令卡住/无输出/被杀」,
与
--market-live联网无关(离线模式同样触发)。加-S跳过 site 与sitecustomize即可正常,脚本仅依赖标准库,不受
-S影响。若仍卡住,可用 faulthandler 定位:
python3 -S -c "import faulthandler,runpy,sys; faulthandler.dump_traceback_later(20,exit=True); sys.argv=[...]; runpy.run_path('<脚本路径>', run_name='__main__')"
- 默认自动输出 HTML 报告:每次检测默认生成美观的 HTML 报告到「输入同目录/<输入名>-report.html」(如
a.zip→a-report.html;目录输入 → 同级<目录名>-report.html),控制台会打印「HTML 报告已写出: <路径>」。头部展示 Skill 基础信息(MD5 / SHA256 / 文件大小)、技能能力清单与依赖的其他技能标签云(独立胶囊圈选,仅展示weaver-前缀依赖),正文含各维度检测结果(威胁模型视图、行为图谱已按需求停用)。 - 不带参数时打印可读报告(含每项 ✅/❌/⚠️ 状态、命中位置、修复建议)。
--json输出结构化结果,便于二次处理(HTML 报告仍默认生成;配合--no-html可只留 JSON)。--out report.md将报告落盘。--html report.html自定义 HTML 报告输出路径(默认路径规则见上,显式传参时以此为准)。--no-html完全关闭 HTML 输出(仅控制台/JSON,不落 HTML 文件)。--market-live(推荐,动态联网核查):自动联网查询 skillhub.cn 市场,为每个weaver-e10-前缀依赖实时标注 市场可搜(带跳转链接)/ 市场未收录 / 核查失败,非weaver-e10-前缀依赖标注 跳过核查。判定基于技能slug精确匹配(避免子串误命中,如weaver-e10-login不会误判weaver-e10-jucailin)。无需任何写死的清单文件。--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 / 技能市场」「比赛投稿 / 大赛提交」「发布前体检」「泛微上架」……
判断口诀:用户没说千问,就不是千问。 若不确定,按默认模式跑;确有需要时向用户确认,而不是默认把千问规则加上去。
# 默认模式(绝大多数场景直接这样跑,不需要 --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、B12(人员卡片接口红线,仅 weaver-e10-hrm 豁免);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):
- A1c′ 条目数 < 1000:包内文件总数上限 999(泛微模式仍为 ≤ 300)。
- A1f zip ≤ 10 MB:读取真实归档文件体积(zip/md 输入为权威值;目录输入无归档可测,降级为「包内文件合计」并在结论中标注为近似值)。
- A4′
<name>/SKILL.md精确路径:zip 输入用原始 namelist 精确比对;目录输入校验「SKILL.md 所在目录名 ==name」。这是千问最高频失败原因——macOS Finder 右键「压缩 N 项」只会得到裸SKILL.md,必须zip -r x.zip <name>/(带外层目录一起压)。 - A5f
displayName必填(≤ 255 字符)、A5gauthor_name必填、A5hargument-hint推荐但不阻断。 - 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)。 - A6e
icon必填且为公网 URL(规格 240*240,仅校验声明不下载)。 - A11d 正文 ≤ 64 KB:超出部分在市场详情页会被截断(不影响上传成功,但首屏体验劣化)。
- 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-docoperations)即判 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。适用范围(1.1.5 起):仅当技能
name为weaver-e10-前缀,或脚本内出现泛微自有域名字面量(e-cology.com.cn/e-weaver.com/weaver.com.cn/eteams.cn/weaver.com)时生效;请求第三方开放接口(鉴权方式各异,如appId + timestamp + sign)判为不适用 —— 强行要求 Cookie/eteamsid 反而会把 E10 会话凭证外泄给第三方。 - B10 E10 接口型技能「登录 + 凭证」契约(BLOCK,仅
weaver-e10-前缀技能生效,weaver-e10-login/weaver-e10-shared/weaver-e10-package-comparison整组豁免):- B10a 登录必须走登录 skill:E10 接口型技能必须依赖
weaver-e10-login或者weaver-e10-shared——需在 frontmatterdependencies声明,或在正文/脚本中引用weaver-e10-login/e10-loginCLI /E10_LOGIN_ENTRY,或引用weaver-e10-shared/weaver-work-cliCLI。无任何登录 skill 依赖证据即阻断。 - B10b 禁止自建登录:不得自行实现登录流程(Playwright / Selenium / Puppeteer 自动登录、扫码登录、账号密码登录、自建 OAuth 取 token),会话必须统一由登录 skill 提供。
- B10c 接口文档须声明完整凭证:文档型(无脚本)E10 技能若描述了接口请求(curl 示例 /
GET|POST /path/ 请求头 / 接口地址),必须在文档中明确请求头携带 ① Cookie 完整原始串 ② eteamsid ③ User-Agent(AgentType=…,IsAgent=true);脚本型技能由 B9 覆盖,不重复判定。Cookie 的声明形态三种都算(1.1.8 起):键值对(Cookie: <原始串>)、Markdown 认证表格单元格(`|Cookie| <原始串> |`,文档型技能的主流写法)、行首独立声明;只要文档里出现其中任一形态即判为已声明,不再因「表格写法没有冒号」误报阻断。 - 触发前提:存在 API 表面(脚本内真实 HTTP 调用,或文档中的接口请求描述)。纯规范/UI 类 E10 技能(无接口描述)自动跳过,不误伤。
- B10a 登录必须走登录 skill:E10 接口型技能必须依赖
- B12 禁止单独调用「人员卡片接口」反查姓名(BLOCK,全部技能生效,仅
weaver-e10-hrm豁免):- 命中接口即阻断:
/api/bs/hrm/card/get/*、/api/bs/hrm/profile/getEmployeeCard(含 f-string / 字符串拼接等变形,只要字面量出现即命中)。 - 根因:人员卡片接口是 HRM 域专用接口,平台侧对其访问量做统计与归因。非 HRM 技能若按人员 ID 逐个/循环调用该接口来反查人员姓名,会把非 HRM 场景的调用量灌进去,导致人员卡片接口访问数据统计异常、无法归因。
- 豁免:① 技能
name恰为weaver-e10-hrm(HRM 域官方技能,该接口归其专用);② 命中行含明确的否定/说明性语义(如「禁止调用…」「不要使用…」「❌」),用于规则说明与反例文本,不计违规。 - 改造建议:优先复用
weaver-e10-hrm的人员信息能力 → 改用支持批量/列表查询的 HRM 接口(一次请求带回多人编号与姓名)→ 从业务接口一次性取回姓名字段,避免二次反查。
- 命中接口即阻断:
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:Usersxxx等个人路径。 - 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+ 秒。 - B12 采用「命中即阻断」而非语义推断:人员卡片接口的判定不依赖「是否真的在循环里按 ID 取姓名」的语义推断——那种推断漏报率高、且容易被拼接写法绕过。当前策略是接口字面量出现即 BLOCK,只放行两类:① 技能
name恰为weaver-e10-hrm;② 命中行含否定/说明性语义(禁止/不要/避免/❌/反例 等),保证规则说明、禁用清单、最佳实践文档里「提到」该接口不会被自己拦。证据强度(人员 ID 入参 / 取姓名 / HTTP 调用 / 逐人循环)只写进报告描述,用于人工定位,不参与是否阻断的判定。 - 包体规模预检(解压前短路,A1g):对 zip 输入,先在解压之前读
namelist()(毫秒级)统计条目数与解压后体积;超过「平台条目上限 × 10」或 300 MB 时直接判 BLOCK 并跳过解压与后续检测。这是为了接住「误把整个应用工程当 skill 检测」的误用——实测一个 110 MB / 7433 条目(含 Electron.app)的包,原先解压 + 全文扫描要 180 秒以上甚至被系统杀掉,短路后 1.8 秒返回明确结论。介于阈值之间的包(如 300~3000 条目)仍正常解压检测;仅当文件数已超 A1c 红线时,才跳过威胁模型 / 行为图谱等深层全文扫描,并在报告中以 INFO 标注「未执行 + 瘦身建议」。 - 报告由工具自带,禁止手写脚本二次渲染:
validate_skill.py每次运行都会自动输出 HTML 报告(默认「输入同目录/<输入名>-report.html」,--html <path>自定义,--no-html关闭),控制台另有一份 Markdown 版。不允许先用--json导出再用自己写的 Python/JS 脚本重新拼一份 HTML——那个流程既慢又容易出统计不一致(手工统计常漏掉 INFO 项,导致「通过 57 / 共 64」这类对不上账),还会踩到执行环境对execute类工具的参数协议差异(codevscommand)。需要定制样式时应改render_html(),而不是在外面另起一套。 - 输出不使用 emoji:控制台与 HTML 报告一律用纯文本标记表达状态——
[PASS]/[FAIL]/[WARN]/[BLOCK]/[INFO]/[SKIP],不使用 ✅ ❌ ⚠️ ⛔ 等图形符号,也不使用 ✓ 等排版符号(统一用·)。理由:报告常要粘贴进工单、邮件、Wiki 或版本发布单,emoji 在部分系统里会变形、占宽不一致或被过滤;纯文本标记在任何环境下都稳定可读。唯一例外是HRM_NEGATIVE_CTX_RE这类检测输入正则里仍保留❌/✗字面量——它们是被检测对象可能出现的否定语义标记,必须保留,与「输出」无关。
版本历史
- 1.1.8(2026-09-22):B10c 误报修复——Cookie 声明识别扩为三种形态。
COOKIE_HEADER_RE原只认Cookie后紧跟(可选单/双引号)+:/=的键值对写法,而文档型 E10 技能的「请求头 / 认证」章节主流写法是 Markdown 表格(`|Cookie| <e10-login 返回的完整原始 Cookie 串> |)——Cookie后是反引号 + 竖线、没有冒号,正则永不命中,导致has_cookie=False,明明已按规范声明仍被判「① Cookie 完整原始串缺失」阻断。现正则改为三分支:① 键值对(Cookie:/Cookie =/'Cookie':);② Markdown 表格单元格(| s*['"]?Cookie['"]?s*|,兼容带/不带反引号);③ 行首独立声明(Cookie/Cookie:),并加re.MULTILINE`。实测 weaver-e10-jinchengda v1.1.1(11 处表格形态 Cookie 声明)由「1 阻断 / 不可发布」转为「0 阻断 / 可发布」。教训:B10c 的凭证关键词正则必须覆盖表格写法,否则会误伤全部采用认证表格的文档型技能。 - 1.1.7(2026-09-20):① 输出不使用 emoji——控制台与 HTML 报告的状态标记全面改为纯文本
[PASS]/[FAIL]/[WARN]/[BLOCK]/[INFO]/[SKIP],去掉 ✅ ❌ ⚠️ ⛔ 等图形符号与 ✓ 排版符号(统一用·);仅HRM_NEGATIVE_CTX_RE等检测输入正则保留❌/✗字面量(它们是被检测对象可能自带的否定语义标记)。回归套件同步去 emoji,且run_all.py的判定由「输出不含 ❌」改为退出码 +[FAIL]标记双保险,避免输出规范变化导致断言失效。② HTML 转义补强——_esc()在&<>之外补上"'(→"/'),覆盖title="…"、href='…'等属性值上下文,防止内容中的引号突破属性边界;同时删掉render_html()内的重复局部定义,统一复用模块级实现。③ 文档补两条硬约定:报告由工具自带、禁止手写脚本二次渲染;输出不使用 emoji。 - 1.1.6(2026-09-18):B10 契约豁免清单化——新增
B10_CONTRACT_EXEMPT_NAMES常量,将「登录 + 凭证」契约的豁免从写死判断改为清单管理:weaver-e10-login、weaver-e10-shared(能力提供方)与weaver-e10-package-comparison(包体对比工具,经审核豁免 B10a 登录依赖与 B10c 文档凭证声明两项阻断)。清单内技能整组豁免并以 INFO 标注。 - 1.1.5(2026-09-18):① B10a 登录依赖扩容——E10 接口型技能除
weaver-e10-login外,也可依赖weaver-e10-shared(证据含weaver-e10-shared/weaver-work-cliCLI),两者任一即可通过;weaver-e10-login与weaver-e10-shared自身均豁免。② B9 适用范围收窄——仅当技能name为weaver-e10-前缀,或脚本内出现泛微自有域名字面量(e-cology.com.cn/e-weaver.com/weaver.com.cn/eteams.cn/weaver.com)时才要求 Cookie+eteamsid+User-Agent;请求第三方开放接口(如appId + timestamp + sign鉴权)判为不适用,避免把 E10 会话凭证外泄给第三方。回归套件新增第 ④ 组(7 个 B10a 场景)。 - 1.1.4(2026-09-04):新增 B12 人员卡片接口红线(BLOCK)——任何技能出现
/api/bs/hrm/card/get/*或/api/bs/hrm/profile/getEmployeeCard(含拼接变形)即阻断,仅weaver-e10-hrm豁免;含否定语义的说明性文本不计违规。根因:非 HRM 技能按人员 ID 逐个调用该接口反查姓名,会污染人员卡片接口的访问数据统计。回归套件新增第 ③ 组(7 个 B12 场景)。 - 1.1.3(2026-09-01):新增包体规模预检(A1g,解压前短路)——zip 输入在解压前按条目数 / 解压后体积判断是否严重超限,超限则直接判 BLOCK 并跳过解压(110 MB / 7433 条目的误传包由「>180 秒且被系统杀掉」降至 1.8 秒);文件数超 A1c 红线时跳过深层全文扫描并以 INFO 标注。同时把渲染输出抽成统一的
emit_result(),并固化一键回归测试(3 组:自举 / 双平台 9 场景 / 打包形态含短路用例)。 - 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-前缀技能并离线声明依赖来源。