weaver-work-cli 0.1.5 → 0.1.7

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.
Files changed (225) hide show
  1. package/README.md +14 -9
  2. package/dist/cmd/skills/index.js +60 -0
  3. package/dist/internal/e10/auth/commands.js +48 -32
  4. package/dist/internal/e10/auth/session.js +44 -3
  5. package/dist/internal/e10/auth/xiaoe.js +363 -11
  6. package/dist/internal/e10/context.js +4 -2
  7. package/dist/internal/skills/detector.js +42 -0
  8. package/dist/internal/skills/install.js +50 -3
  9. package/dist/shortcuts/archive/render/search-format.js +12 -3
  10. package/dist/shortcuts/ebuilder-form/continuation.js +70 -0
  11. package/dist/shortcuts/ebuilder-form/errors.js +54 -0
  12. package/dist/shortcuts/ebuilder-form/host.js +1238 -0
  13. package/dist/shortcuts/ebuilder-form/index.js +108 -0
  14. package/dist/shortcuts/ebuilder-form/manifest.js +347 -0
  15. package/dist/shortcuts/ebuilder-form/operations/read.js +157 -0
  16. package/dist/shortcuts/ebuilder-form/operations/registry.js +56 -0
  17. package/dist/shortcuts/ebuilder-form/operations/shared.js +132 -0
  18. package/dist/shortcuts/ebuilder-form/operations/types.js +19 -0
  19. package/dist/shortcuts/ebuilder-form/operations/write.js +277 -0
  20. package/dist/shortcuts/ebuilder-form/operations.js +8 -0
  21. package/dist/shortcuts/ehr/operations/salary.js +2 -140
  22. package/dist/shortcuts/im/continuation.js +70 -0
  23. package/dist/shortcuts/{yimiaoban → im}/errors.js +14 -14
  24. package/dist/shortcuts/{yimiaoban → im}/host.js +26 -26
  25. package/dist/shortcuts/{yimiaoban → im}/index.js +42 -42
  26. package/dist/shortcuts/{yimiaoban → im}/manifest.js +7 -6
  27. package/dist/shortcuts/{yimiaoban → im}/operations/file-user.js +54 -41
  28. package/dist/shortcuts/{yimiaoban → im}/operations/group-read.js +46 -44
  29. package/dist/shortcuts/{yimiaoban → im}/operations/group-write.js +113 -66
  30. package/dist/shortcuts/{yimiaoban → im}/operations/msg-sync.js +164 -141
  31. package/dist/shortcuts/{yimiaoban → im}/operations/msg-write.js +47 -47
  32. package/dist/shortcuts/{yimiaoban → im}/operations/person.js +10 -10
  33. package/dist/shortcuts/{yimiaoban → im}/operations/registry.js +10 -8
  34. package/dist/shortcuts/{yimiaoban → im}/operations/session.js +82 -83
  35. package/dist/shortcuts/im/operations/shared.js +442 -0
  36. package/dist/shortcuts/{yimiaoban → im}/operations/types.js +1 -1
  37. package/dist/shortcuts/im/operations/user-remind.js +201 -0
  38. package/dist/shortcuts/{yimiaoban → im}/operations/write-util.js +7 -7
  39. package/dist/shortcuts/{yimiaoban → im}/operations.js +3 -3
  40. package/dist/shortcuts/index.js +10 -2
  41. package/dist/shortcuts/invoice/manifest.js +113 -10
  42. package/dist/shortcuts/invoice/operations/import.js +39 -14
  43. package/dist/shortcuts/invoice/operations/reim.js +38 -18
  44. package/dist/shortcuts/invoice/operations/shared.js +35 -6
  45. package/dist/shortcuts/jiuchuanhui/manifest.js +3 -3
  46. package/dist/shortcuts/jiuchuanhui/operations/registry.js +2 -2
  47. package/dist/shortcuts/{yimiaoban → okr}/continuation.js +10 -10
  48. package/dist/shortcuts/okr/errors.js +70 -0
  49. package/dist/shortcuts/okr/host.js +169 -0
  50. package/dist/shortcuts/okr/index.js +155 -0
  51. package/dist/shortcuts/okr/manifest.js +70 -0
  52. package/dist/shortcuts/okr/operations/link.js +305 -0
  53. package/dist/shortcuts/okr/operations/read.js +481 -0
  54. package/dist/shortcuts/okr/operations/registry.js +31 -0
  55. package/dist/shortcuts/okr/operations/shared.js +381 -0
  56. package/dist/shortcuts/okr/operations/types.js +88 -0
  57. package/dist/shortcuts/okr/operations/write.js +838 -0
  58. package/dist/shortcuts/okr/operations.js +8 -0
  59. package/dist/shortcuts/project/continuation.js +70 -0
  60. package/dist/shortcuts/project/errors.js +53 -0
  61. package/dist/shortcuts/project/host.js +160 -0
  62. package/dist/shortcuts/project/index.js +106 -0
  63. package/dist/shortcuts/project/manifest.js +36 -0
  64. package/dist/shortcuts/project/operations/read.js +551 -0
  65. package/dist/shortcuts/project/operations/registry.js +31 -0
  66. package/dist/shortcuts/project/operations/shared.js +68 -0
  67. package/dist/shortcuts/project/operations/types.js +39 -0
  68. package/dist/shortcuts/project/operations/write.js +266 -0
  69. package/dist/shortcuts/project/operations.js +8 -0
  70. package/dist/shortcuts/workflow/continuation.js +508 -0
  71. package/dist/shortcuts/workflow/endpoints.js +149 -0
  72. package/dist/shortcuts/workflow/errors.js +112 -0
  73. package/dist/shortcuts/workflow/host.js +224 -0
  74. package/dist/shortcuts/workflow/index.js +116 -0
  75. package/dist/shortcuts/workflow/manifest.js +30 -0
  76. package/dist/shortcuts/workflow/operations/form.js +4159 -0
  77. package/dist/shortcuts/workflow/operations/read.js +3778 -0
  78. package/dist/shortcuts/workflow/operations/registry.js +33 -0
  79. package/dist/shortcuts/workflow/operations/shared.js +167 -0
  80. package/dist/shortcuts/workflow/operations/types.js +44 -0
  81. package/dist/shortcuts/workflow/operations/write.js +1991 -0
  82. package/dist/shortcuts/workflow/operations.js +119 -0
  83. package/dist/shortcuts/workflow/state.js +182 -0
  84. package/docs/SKILL.md +5 -3
  85. package/docs/_catalog.md +10 -1
  86. package/docs/agent-invoice.md +2 -2
  87. package/docs/agent-skill-install.md +2 -2
  88. package/docs/e10-auth.md +3 -1
  89. package/docs/ebuilder-form.md +38 -0
  90. package/docs/im.md +104 -0
  91. package/docs/invoice.md +5 -5
  92. package/docs/okr.md +122 -0
  93. package/docs/operation-manual.md +10 -7
  94. package/docs/project.md +69 -0
  95. package/docs/skill-review-2026-09-19.md +68 -0
  96. package/package.json +3 -2
  97. package/scripts/package-skill.mjs +38 -11
  98. package/scripts/sync-connector-skills.mjs +172 -0
  99. package/skill-template/business-info.json +357 -16
  100. package/skill-template/domains/ebuilder-form.md +5 -0
  101. package/skill-template/domains/okr.md +18 -0
  102. package/skill-template/domains/shijingran.md +3 -0
  103. package/skill-template/domains/skill-maker.md +4 -4
  104. package/skill-template/domains/workflow.md +22 -0
  105. package/skill-template/domains/yepiaotong.md +4 -2
  106. package/skill-template/domains/yimiaoban.md +13 -10
  107. package/skill-template/product.json +5 -0
  108. package/skill-template/skill-template.md +1 -0
  109. package/skills/weaver-e10-calendar/SKILL.md +5 -1
  110. package/skills/weaver-e10-calendar/references/calendar-query.md +7 -0
  111. package/skills/weaver-e10-calendar/references/source-manifest.json +314 -32
  112. package/skills/weaver-e10-ebuilder-form/SKILL.md +123 -0
  113. package/skills/weaver-e10-ebuilder-form/references/context-routing.md +90 -0
  114. package/skills/weaver-e10-ebuilder-form/references/custom-api.md +86 -0
  115. package/skills/weaver-e10-ebuilder-form/references/disabled-capabilities.md +50 -0
  116. package/skills/weaver-e10-ebuilder-form/references/fields-browser.md +100 -0
  117. package/skills/weaver-e10-ebuilder-form/references/list-nlist.md +91 -0
  118. package/skills/weaver-e10-ebuilder-form/references/openapi-read.md +74 -0
  119. package/skills/weaver-e10-ebuilder-form/references/openapi-write.md +86 -0
  120. package/skills/weaver-e10-ebuilder-form/references/source-manifest.json +107 -0
  121. package/skills/weaver-e10-esb/SKILL.md +1 -1
  122. package/skills/weaver-e10-esb/references/source-manifest.json +15 -14
  123. package/skills/weaver-e10-hrm/SKILL.md +1 -1
  124. package/skills/weaver-e10-hrm/references/source-manifest.json +357 -38
  125. package/skills/weaver-e10-jiuchuanhui/SKILL.md +22 -4
  126. package/skills/weaver-e10-jiuchuanhui/references/clue.md +4 -2
  127. package/skills/weaver-e10-jiuchuanhui/references/contact.md +1 -1
  128. package/skills/weaver-e10-jiuchuanhui/references/customer.md +3 -3
  129. package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +1 -1
  130. package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +10 -10
  131. package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +3 -3
  132. package/skills/weaver-e10-jiuchuanhui/references/sale.md +7 -7
  133. package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +3 -3
  134. package/skills/weaver-e10-jucailin/SKILL.md +2 -2
  135. package/skills/weaver-e10-mail/SKILL.md +22 -6
  136. package/skills/weaver-e10-meeting/SKILL.md +22 -1
  137. package/skills/weaver-e10-okr/SKILL.md +139 -0
  138. package/skills/weaver-e10-okr/references/okr-align.md +59 -0
  139. package/skills/weaver-e10-okr/references/okr-keyresult.md +68 -0
  140. package/skills/weaver-e10-okr/references/okr-link-routing.md +67 -0
  141. package/skills/weaver-e10-okr/references/okr-query.md +105 -0
  142. package/skills/weaver-e10-okr/references/okr-write.md +94 -0
  143. package/skills/weaver-e10-okr/references/source-manifest.json +672 -0
  144. package/skills/weaver-e10-plan/SKILL.md +3 -3
  145. package/skills/weaver-e10-plan/references/plan-report-write.md +1 -1
  146. package/skills/weaver-e10-plan/references/source-manifest.json +20 -20
  147. package/skills/weaver-e10-qiyecheng/SKILL.md +21 -1
  148. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +17 -17
  149. package/skills/weaver-e10-shared/SKILL.md +79 -11
  150. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +41 -8
  151. package/skills/weaver-e10-shared/references/non-interactive-environment.md +78 -0
  152. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +39 -0
  153. package/skills/weaver-e10-shijingran/SKILL.md +83 -0
  154. package/skills/weaver-e10-shijingran/references/field-resolution.md +105 -0
  155. package/skills/weaver-e10-shijingran/references/operations.md +154 -0
  156. package/skills/weaver-e10-shijingran/references/source-manifest.json +1380 -0
  157. package/skills/weaver-e10-shijingran/references/write-operations.md +90 -0
  158. package/skills/weaver-e10-skill-maker/SKILL.md +26 -9
  159. package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +39 -8
  160. package/skills/weaver-e10-skill-maker/references/detector-validation.md +25 -8
  161. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +66 -5
  162. package/skills/weaver-e10-skill-maker/references/module-gap-audit-and-repair.md +86 -0
  163. package/skills/weaver-e10-skill-maker/references/source-update-detection.md +59 -5
  164. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +16 -8
  165. package/skills/weaver-e10-wenshuding/SKILL.md +28 -4
  166. package/skills/weaver-e10-wenshuding/references/archive-search.md +14 -0
  167. package/skills/weaver-e10-wenshuding/references/source-manifest.json +27 -26
  168. package/skills/weaver-e10-workflow/SKILL.md +250 -0
  169. package/skills/weaver-e10-workflow/references/source-manifest.json +1062 -0
  170. package/skills/weaver-e10-workflow/references/workflow-agent-entry.md +96 -0
  171. package/skills/weaver-e10-workflow/references/workflow-batch.md +275 -0
  172. package/skills/weaver-e10-workflow/references/workflow-create.md +182 -0
  173. package/skills/weaver-e10-workflow/references/workflow-edit.md +106 -0
  174. package/skills/weaver-e10-workflow/references/workflow-memory.md +165 -0
  175. package/skills/weaver-e10-workflow/references/workflow-operate.md +153 -0
  176. package/skills/weaver-e10-workflow/references/workflow-query.md +821 -0
  177. package/skills/weaver-e10-workflow/references/workflow-share.md +117 -0
  178. package/skills/weaver-e10-workflow/references/workflow-view.md +189 -0
  179. package/skills/weaver-e10-yepiaotong/SKILL.md +28 -28
  180. package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +11 -5
  181. package/skills/weaver-e10-yepiaotong/references/invoice-import.md +14 -8
  182. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +9 -43
  183. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +8 -0
  184. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +13 -17
  185. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +6 -7
  186. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +2 -2
  187. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1155 -553
  188. package/skills/weaver-e10-yimiaoban/SKILL.md +56 -38
  189. package/skills/weaver-e10-yimiaoban/references/ding-write.md +8 -8
  190. package/skills/weaver-e10-yimiaoban/references/error-codes.md +16 -0
  191. package/skills/weaver-e10-yimiaoban/references/field-resolution.md +10 -10
  192. package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +12 -12
  193. package/skills/weaver-e10-yimiaoban/references/group-read.md +16 -16
  194. package/skills/weaver-e10-yimiaoban/references/group-write.md +17 -15
  195. package/skills/weaver-e10-yimiaoban/references/msg-read.md +21 -17
  196. package/skills/weaver-e10-yimiaoban/references/msg-write.md +10 -10
  197. package/skills/weaver-e10-yimiaoban/references/person.md +6 -6
  198. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +15 -11
  199. package/skills/weaver-e10-yimiaoban/references/session-sysmsg.md +11 -10
  200. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +2164 -154
  201. package/skills/weaver-e10-yimiaoban/references/user-remind.md +75 -0
  202. package/skills/weaver-e10-ziguanjia/SKILL.md +4 -2
  203. package/skills/weaver-e10-ziguanjia/references/source-manifest.json +99 -29
  204. package/tools/weaver-skill-detector-1.0.13/SKILL.md +253 -0
  205. package/tools/weaver-skill-detector-1.0.13/_meta.json +6 -0
  206. package/tools/weaver-skill-detector-1.0.13/references/checklist.md +298 -0
  207. package/tools/weaver-skill-detector-1.0.13/scripts/validate_skill.py +4190 -0
  208. package/dist/shortcuts/yimiaoban/operations/shared.js +0 -236
  209. package/docs/yimiaoban.md +0 -86
  210. package/skills/weaver-e10-calendar/product.json +0 -8
  211. package/skills/weaver-e10-esb/product.json +0 -8
  212. package/skills/weaver-e10-hrm/product.json +0 -8
  213. package/skills/weaver-e10-jiuchuanhui/product.json +0 -8
  214. package/skills/weaver-e10-jucailin/product.json +0 -8
  215. package/skills/weaver-e10-mail/product.json +0 -8
  216. package/skills/weaver-e10-meeting/product.json +0 -8
  217. package/skills/weaver-e10-plan/product.json +0 -8
  218. package/skills/weaver-e10-qiyecheng/product.json +0 -8
  219. package/skills/weaver-e10-skill-maker/product.json +0 -8
  220. package/skills/weaver-e10-wenshuding/product.json +0 -8
  221. package/skills/weaver-e10-yepiaotong/product.json +0 -8
  222. package/skills/weaver-e10-yepiaotong/references/invoice-red.md +0 -261
  223. package/skills/weaver-e10-yimiaoban/product.json +0 -8
  224. package/skills/weaver-e10-ziguanjia/product.json +0 -8
  225. /package/dist/shortcuts/{yimiaoban → im}/operations/msg-parse.js +0 -0
@@ -0,0 +1,298 @@
1
+ # 泛微技能检测 · 检测项清单(Checklist)
2
+
3
+ 本文件定义「泛微技能检测工具」对上传 skill(`.zip` 压缩包 / `.md` 文件 / 目录)的全部检测项与判定标准。
4
+ 脚本 `scripts/validate_skill.py` 严格按此清单执行静态分析。
5
+
6
+ 判定状态:`PASS`(通过)/ `WARN`(警告,可放行但建议修复)/ `FAIL`(不通过)。
7
+ 严重程度:`BLOCK`(阻断,致命)/ `HIGH`(高危)/ `MEDIUM`(中)/ `LOW`(低)/ `INFO`(提示)。
8
+
9
+ ---
10
+
11
+ ## 0. 约束归属总览(WorkBuddy 平台 / 泛微专属 / 千问专属)
12
+
13
+ 检测项分属三套来源不同的规范,**违反后果不同**,排查与申诉对象也不同,因此必须区分。
14
+
15
+ ### 0.1 三类约束的区别
16
+
17
+ | 归属 | 全称 | 来源 | 约束对象 | 违反后果 |
18
+ |------|------|------|----------|----------|
19
+ | **WB** | WorkBuddy 平台约束 | skillhub.cn / WorkBuddy 平台的加载器与上传校验程序(对齐官方 `expert-reviewer` 规范) | **任何作者**提交的 skill(含外部合作方、个人作者),与是否泛微无关 | 平台**直接拒收或加载异常**:上传失败、frontmatter 解析报错、入口识别不到、文件路径不安全、包体超限等。属于平台技术门槛,无协商空间 |
20
+ | **WV** | 泛微专属约束 | 泛微生态内部治理要求(品牌规范、E10 账号与接口调用契约、安全合规红线) | **泛微对外发布 / 上架 / 比赛提交**的 skill;内部自研、外部合作方共建的泛微系技能 | 平台层面通常**不会**拦(平台并不认识「泛微」概念),但**内部发布门禁不予放行**:品牌不符、账号体系不统一、登录与凭证链路违规、隐私合规风险 |
21
+ | **WB+WV** | 叠加 | 平台有通用要求,泛微在其上追加了更严的约束 | 同上 | 任一层不满足即判失败 |
22
+ | **QW** | 千问办公平台约束 | 千问(QwenWork)生态接入开发指南 | 要上架千问办公市场的 skill(需 `--platform qwenwork` 显式启用) | 千问平台**直接拒收**:包体超限、入口路径不对、字段缺失/取值非法、连接器未做就绪检查 |
23
+ | **QW+WB** | 千问叠加 | 千问独有约束,且与 WorkBuddy 通用要求共存 | 同上 | 任一层不满足即判失败 |
24
+ | **QW+WV** | 双平台叠加 | 同一 skill 既要上千问又要上泛微 | 双平台上架的 skill | 取两者更严者(如 `name` 既要满足千问命名规范,又要带 `weaver` 前缀) |
25
+
26
+ **一句话区分**:`WB` = 平台收不收;`WV` = 泛微放不放;`QW` = 千问收不收。
27
+
28
+ ### 0.2 归属图例
29
+
30
+ - `WB` —— WorkBuddy 平台强制
31
+ - `WV` —— 泛微专属
32
+ - `WB+WV` —— 平台通用要求 + 泛微追加约束(通常表现为「平台只要求有这个字段,泛微还要求字段值/写法」)
33
+ - `QW` —— 千问办公平台强制(仅 `--platform qwenwork` 时启用)
34
+ - `QW+WB` —— 千问独有约束 + WorkBuddy 通用要求
35
+ - `QW+WV` —— 千问与泛微双平台上架时的叠加约束
36
+
37
+ ### 0.3 归属速查索引
38
+
39
+ | 归属 | 规则编号 |
40
+ |------|----------|
41
+ | **WB**(平台强制) | A1、A1a、A1b、A1c、A1d、A1e、A2、A2n、A3、A4、A5、A5b、A6、A7、A8、A9、A10、A11、A11b、A11c、A13、A14、G02、G03、G04a、G04b、G04c、C08、BOM、CRLF、Q1、Q2、Q3、Q4、Q4b、E1、C1–C8、D1–D3 |
42
+ | **WV**(泛微专属) | A2m、A4b、A8b、A8c、A8d、A8e、A12、B1、B2、B3、B4、B5、B6、B7、B8、B9、B10a、B10b、B10c |
43
+ | **WB+WV**(叠加) | A8f(`version`:平台要求存在且为 SemVer;泛微要求是**顶层**字段,禁止 `metadata:` 嵌套)、E2(平台关注 `dependencies` 声明;泛微只识别 `weaver-e10-` 前缀依赖) |
44
+ | **QW**(千问专属,`--platform qwenwork`) | A1c′、A1f、A4′、A5f、A5g、A5h、A6c、A6e、A11d、B11a、B11b |
45
+ | **QW+WB**(千问叠加) | A1d(仅纯文本,两平台一致)、A1e(`SKILL.md` 大小写精确)、A2n(frontmatter YAML 真解析)、A3(`name` 命名规范) |
46
+ | **QW+WV**(双平台) | A3b(`name` 前缀:千问无品牌要求,泛微要求 `weaver` 前缀)、A8f(`version`:两平台都要 SemVer 且顶层) |
47
+
48
+ > 数量分布:WB 41 项 / WV 19 项 / WB+WV 2 项 / QW 11 项(不含已停用的 C/D 组)。
49
+ > QW 组仅在 `--platform qwenwork` 下执行;默认 `weaver` 模式完全不触发,既有结论逐条不变。
50
+
51
+ ### 0.4 复用与裁剪建议
52
+
53
+ | 场景 | 建议保留 | 可忽略 |
54
+ |------|----------|--------|
55
+ | 泛微对外发布 / 上架 / 比赛提交 | 全部(WB + WV) | QW 组 |
56
+ | 外部合作方共建的泛微系技能 | 全部(WB + WV) | QW 组 |
57
+ | 用本工具检测**非泛微**的第三方 skill(纯平台合规体检) | WB 组 | WV 组(A2m/A4b/A8b–A8e/A12/B*/E2 `weaver-e10-` 前缀限制),此时 `name` 前缀、`display_name` 泛微开头、`author` 泛微署名等均不适用 |
58
+ | **上千问办公市场** | WB + QW 组 | WV 组(千问无泛微品牌要求) |
59
+ | **千问 + 泛微双平台上架** | 全部(WB + WV + QW) | — 冲突项取更严者 |
60
+
61
+ ---
62
+
63
+ ## A-1. 基础合规 · WorkBuddy 平台约束(WB)
64
+
65
+ > 平台加载器与上传校验程序的硬性要求,任何作者都必须满足,违反即被平台拒收或加载异常。
66
+
67
+ | 编号 | 归属 | 检测项 | 严重度 | 判定标准 |
68
+ |------|------|--------|--------|----------|
69
+ | A1 | WB | SKILL.md 存在 | BLOCK | 压缩包/目录内需存在 `SKILL.md`;单 `.md` 文件需含 frontmatter |
70
+ | A1a| WB | **Windows 反斜杠路径分隔符** | **BLOCK** | **仅 zip 输入触发。** 基于 zip 原始条目名(namelist)检查,任一 zip 条目路径含 Windows 反斜杠 `\`(如 `weaver-e10-doc\operations\`)即判 FAIL。skillhub 上传校验运行在 Unix,反斜杠会被判为文件名中的非法/不安全字符,整包标记「文件路径不安全」而拒收。常见于 Windows 资源管理器直接拖拽打包(中文 Windows 易写出反斜杠路径);须用 `zip -r xxx.zip xxx/` 或 7-Zip「标准 zip」模式重打。目录输入不触发此项(无法从 OS 路径推断打包后的 zip 路径) |
71
+ | A1b| WB | **目录层级不超过两级** | **BLOCK** | Skill 包仅支持两级目录结构:`根目录/二级目录/文件`。以 SKILL.md 所在目录为 skill 根,任一文件相对深度 > 2(出现三级及以上子目录,如 `references/attend/xxx.md`)即判 FAIL——平台解析会异常。须把模块子目录拍平:将 `references/<模块>/<文件>` 改为 `references/<文件>` 或把模块目录提升为 references 同级目录 |
72
+ | A1c| WB | **文件总数 ≤ 300** | **BLOCK** | 包内(含任意层级、含隐藏/缓存文件)文件总数超过 300 即判 FAIL——平台上传硬性上限,超限直接拒收。须清理 `__pycache__`、`.DS_Store`、临时产物或拆分体积 |
73
+ | A1d| WB | **仅纯文本 / 禁止二进制** | **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/`)一律判违规 |
74
+ | A1e| WB | **SKILL.md 文件名大小写精确** | **BLOCK** | 入口文件名必须精确为 `SKILL.md`(首字母大写、后缀全大写 MD),禁止 `skill.md` / `Skill.md` / `Skill.MD` 等任何大小写变体。平台/工具以区分大小写方式匹配入口文件名,变体不会被识别为 skill 入口(等价「无 SKILL.md」)。变体单独存在 → BLOCK 并提示重命名为 `SKILL.md`;与精确 `SKILL.md` 并存 → 同样 BLOCK 提示删除多余变体 |
75
+ | A2 | WB | YAML frontmatter 完整 | BLOCK | 文件以 `---` 包裹的 frontmatter 开头,可被解析 |
76
+ | A2n| WB | **frontmatter YAML 语法(真解析)** | **BLOCK** | 平台用真 YAML 解析器解析 frontmatter,语法错误直接报「frontmatter 无法解析 / mapping values are not allowed in this context」拒收。检测器双层校验:装有 PyYAML 时真解析并精确报行号;未装则降级启发式扫描高频错误——① 一行挤多个键值对(`name: xxx display_name: yyy`,粘贴丢换行,最常见);② 值中含未加引号的冒号+空格(`description: 支持 xx: yy`);③ 行首 Tab 缩进。整体引号包裹的值内部冒号合法 |
77
+ | A3 | WB | `name` 字段 | BLOCK | frontmatter 必须含 `name` |
78
+ | A4 | WB | `name` 命名规范 | BLOCK | 仅小写字母(a-z)、数字(0-9)和连字符(-);不允许大写、下划线、空格、中文或特殊字符;不能以 `-` 开头/结尾,不含连续 `--`;长度必须 3-64 个字符 |
79
+ | A5 | WB | `description` 字段 | BLOCK | 必须含 `description`(不能为空) |
80
+ | A5b| WB | **`description` 长度(1-1024)** | **BLOCK** | `description` 长度必须在 1-1024 个字符之间,超过 1024 判 FAIL |
81
+ | A6 | WB | `description` 无尖括号 | LOW | 平台规范未禁止 `<` 或 `>`,但建议改为全角〈〉或移除,避免个别 YAML 解析器误判 |
82
+ | A7 | WB | `description` 充分性 | MEDIUM | description 长度 ≥ 20 字(过简不利于触发匹配) |
83
+ | A8 | WB | `agent_created` 标志 | LOW | 推荐含 `agent_created: true`(WorkBuddy 模型生成的技能建议带此标志,便于后续管理) |
84
+ | A9 | WB | 目录名与 name 一致 | MEDIUM | 仅 zip/目录:外层目录名须等于 frontmatter `name` |
85
+ | A10| WB | 无 TODO 占位残留 | MEDIUM | 正文不得残留 `[TODO]` / 待补充 / placeholder= 等模板占位 |
86
+ | A11| WB | 正文内容充实 | MEDIUM | 正文净字符 ≥ 100 |
87
+ | A11b| WB | **正文档行数 ≤ 500** | MEDIUM | SKILL.md 正文建议控制在 500 行以内;内容过多时应拆分为 `references/` 目录下的独立文件,正文只保留路由触发与核心说明 |
88
+ | A11c| WB | **引用相对路径规范** | MEDIUM | 正文引用其他文件时必须使用相对 Skills 根目录的路径(如 `references/api-docs.md`、`scripts/main.py`);禁止反斜杠分隔(`scripts\main.py`)与非系统类绝对路径(`/references/api.md`);`references/`、`scripts/` 等资源目录下的引用文件必须真实存在于包内。运行时系统路径(`/tmp/`、`/Users/`、`~/`、`C:\` 等)与占位符示例(`xxx.md`、`<参数>`)自动豁免,避免误报 |
89
+ | A13| WB | **结构化文件可解析性** | **BLOCK** | 包内所有 `.json`/`.yaml`/`.yml`/`.toml` 文件必须可正常解析(JSON 用 `json.loads`,YAML/TOML 做基本语法检查),格式错误会导致平台加载 skill 时直接报错 |
90
+ | A14| WB | 依赖引导完整性 | MEDIUM | 若包内含 `scripts/`/`bin/`/`package.json`/`requirements.txt` 等依赖声明,须在 SKILL.md 或 references/ 中提供安装/使用说明(检测「安装」「install」「依赖」「usage」等关键词) |
91
+
92
+ ---
93
+
94
+ ## A-2. 基础合规 · 泛微生态约束(WV)
95
+
96
+ > 平台并不强制这些(平台不认识「泛微」概念),但泛微对外发布 / 上架 / 比赛提交一律不放行。
97
+
98
+ | 编号 | 归属 | 检测项 | 严重度 | 判定标准 |
99
+ |------|------|--------|--------|----------|
100
+ | A2m| WV | **frontmatter 顶层结构(禁止 metadata 嵌套)** | **BLOCK** | 所有字段(`name`/`version`/`author`/`description` 等)均为**顶层**字段,frontmatter 中不得出现 `metadata:` 嵌套块。若嵌套块内含关键字段(author/version 等)→ BLOCK 并提示提升到顶层;仅空 `metadata:` 或嵌套非关键字段 → WARN。依据:泛微与合作方约定的 frontmatter 模板(`author: 合作方名称` / `version: 1.0.0` 均为顶层) |
101
+ | A4b| WV | **`name` 前缀(泛微强制)** | **BLOCK** | `name` 必须以 `weaver` 开头(如 `weaver-e10-xxx`),统一泛微生态命名空间,便于市场检索与依赖识别 |
102
+ | A8b| WV | **`display_name` 字段** | **BLOCK** | 必须含 `display_name`(中文展示名称),且必须以「泛微」开头 |
103
+ | A8c| WV | **`display_name_en` 字段** | **BLOCK** | 必须含 `display_name_en`(英文展示名称) |
104
+ | A8d| WV | **`description_zh` 字段** | **BLOCK** | 必须含 `description_zh`(简短中文介绍) |
105
+ | A8e| WV | **`description_en` 字段** | **BLOCK** | 必须含 `description_en`(英文简介) |
106
+ | A8f| **WB+WV** | **`version` 字段(SemVer + 顶层)** | **BLOCK** | **WB 部分**:必须含 `version` 且严格符合 SemVer「主版本.次版本.修订号」三段纯数字(如 `1.0.0`);不支持 `v1.0`、`1.0`、`latest`、`1.0.0-beta` 等非标准格式。**WV 部分**:必须是**顶层**字段,不允许 `metadata.version` 嵌套写法(嵌套视为缺失)。另:上架市场时版本号必须严格大于市场已发布版本 |
107
+ | A12| WV | **author 作者字段(泛微署名)** | **BLOCK** | frontmatter 必须含**顶层** `author` 字段(不允许 `metadata.author` 嵌套写法,嵌套视为缺失),且值必须精确等于「泛微网络科技股份有限公司」;缺失或值不符一律判 FAIL |
108
+
109
+ ---
110
+
111
+ ## B. 泛微专项质检(WV)—— 对外分发前红线
112
+
113
+ > 泛微生态的合规与安全红线,全部为泛微专属(WV)。平台侧无对应要求,属于内部发布门禁。
114
+
115
+ | 编号 | 归属 | 检测项 | 严重度 | 判定标准 |
116
+ |------|------|--------|--------|----------|
117
+ | B1 | WV | **默认登录地址未指向泛微自用系统** | **BLOCK** | 严禁将 `e-cology.com.cn` / `e-weaver.com` / `weaver.com.cn` / `eteams.cn` 等泛微自用域名写死为默认系统地址;客户下载后会越权访问泛微自用系统 |
118
+ | B2 | WV | 无硬编码真实 IP | HIGH | 不得出现真实服务器 IP(127.0.0.1 / 0.0.0.0 / example 占位除外);对外分发的 skill 必须脱敏为占位符,避免泄露客户/内部系统拓扑 |
119
+ | B3 | WV | 无硬编码凭证 | HIGH | 不得出现密码 / token / secret / api_key 等字面量,须走 E10 命名凭据插件 |
120
+ | B4 | WV | 凭证应通过插件获取 | MEDIUM | 涉及 Weaver API 调用时,应说明通过 E10 命名凭据插件(如 `key=ETEAMSID`)获取,禁止硬编码或 Playwright 登录兜底 |
121
+ | B5 | WV | 敏感词占位规范 | INFO | 向 Weaver 发送内容时,建议复用 `-替换敏感词占位符-` 规范避免敏感词拦截(E10 敏感词拦截特征:HTTP 200 + code 1001 + sensitiveScanCode 401) |
122
+ | B6 | WV | 无包外脚本子进程调用 | MEDIUM | 不得通过 `spawnSync`/`spawn`/`exec`/`subprocess` 等调用包外脚本文件(如 `tools/_init_env_cache.py`),避免用户环境自动执行外部代码 |
123
+ | B7 | WV | 凭证未通过命令行明文传递 | HIGH | 子进程调用的参数块内不得出现 `ETEAMSID`/`token`/`session`/`cookie`/`password`/`secret` 等凭证字段,禁止以命令行参数或 env 明文传入凭证 |
124
+ | B8 | WV | 无硬编码加密密钥 / 本地凭证访问 | HIGH | 不得硬编码密钥常量用于 AES 解密本地会话凭证;不得访问 `<~/.e10-cli/profiles/*/auth>` 等本地敏感凭证路径(须脱敏并限定授权范围) |
125
+ | B9 | WV | **API 请求凭证完整性** | **BLOCK** | 发起对外 API 请求(requests / urllib / httpx / fetch / axios / curl 等)时,请求头必须同时携带 ① `Cookie` 完整原始串(禁止裁剪/去重/改写)② `eteamsid` ③ `User-Agent: AgentType=<agentType>,IsAgent=true`;缺任一项即阻断;Cookie 被 split / dict / 切片改写另计 WARN |
126
+ | B10a | WV | **登录必须走登录 skill(E10 接口型技能)** | **BLOCK** | 仅对 `name` 为 `weaver-e10-` 前缀的技能生效(`weaver-e10-login` 自身豁免)。若为接口型技能(有脚本 HTTP 调用或文档接口描述),必须依赖 `weaver-e10-login`:frontmatter `dependencies` 声明,或正文/脚本引用 `weaver-e10-login` / `e10-login` CLI / `E10_LOGIN_ENTRY`。无任何登录 skill 依赖证据 → 阻断 |
127
+ | B10b | WV | **禁止自建登录** | **BLOCK** | 同 B10a 适用范围。不得自行实现登录流程:Playwright / Selenium / Puppeteer 自动登录、扫码/二维码登录、账号密码登录、自建 OAuth 取 token。会话必须统一由登录 skill 提供 |
128
+ | B10c | WV | **接口文档声明完整凭证(文档型 E10 技能)** | **BLOCK** | 同 B10a 适用范围。文档型(无脚本 HTTP 调用)技能若描述了接口请求(`curl` 示例 / `GET\|POST /path` / 请求头 / 接口地址),文档必须明确请求头携带 ① `Cookie` 完整原始串 ② `eteamsid` ③ `User-Agent: AgentType=...,IsAgent=true`;脚本型由 B9 覆盖,不重复判定 |
129
+ | — | WV | 触发前提与非适用 | INFO | B10 组需先检测到 API 表面(脚本内真实 HTTP 调用,或 Markdown 文档中的接口请求描述)才生效;纯规范/UI 类 E10 技能(如 `weaver-e10-ui-system`)无接口描述 → 自动跳过,不误伤。非 `weaver-e10-` 前缀技能整组不适用 |
130
+
131
+ ---
132
+
133
+ ## QW. 千问办公平台约束(QW)—— 需 `--platform qwenwork`(**非默认,勿主动启用**)
134
+
135
+ > **默认检测范围 = 泛微专属(WV)+ WorkBuddy 平台(WB)+ 通用质量/安全**,即 `weaver` 模式。
136
+ > 千问(QwenWork)生态接入规范的硬性约束,**仅在用户明确说明「上架千问 / 千问办公 / QwenWork」、并显式传 `--platform qwenwork` 时执行**。
137
+ > 默认 `weaver`(泛微)模式完全不触发本组规则,既有结论逐条不变,报告中也**不出现** QW 归属项与 QW 图例。
138
+ >
139
+ > 调度口诀:**用户没说千问,就不是千问。** 「检测 skill」「上架 skillhub」「比赛投稿」「发布前体检」等一律按默认 `weaver` 模式跑。
140
+
141
+ ### QW-0 平台阈值与字段别名对照
142
+
143
+ | 维度 | 泛微 `weaver`(默认) | 千问 `qwenwork` |
144
+ |------|----------------------|-----------------|
145
+ | 包内文件总数(A1c / A1c′) | ≤ 300 | **< 1000**(上限 999) |
146
+ | zip 包大小(A1f) | 不限制 | **≤ 10 MB**(BLOCK) |
147
+ | 入口路径(A4′) | 存在 `SKILL.md` 即可 | **必须精确为 `<name>/SKILL.md`** |
148
+ | SKILL.md 正文(A11d) | 不限制 | **≤ 64 KB**(超出在市场详情页截断) |
149
+ | `name` 前缀(A3b) | 必须 `weaver` 开头 | 无品牌前缀要求 |
150
+ | 中文展示名字段 | `display_name`(须以「泛微」开头) | `displayName`(无前缀要求) |
151
+ | 英文展示名字段 | `display_name_en` | `name_en` |
152
+ | 中文描述字段 | `description_zh` | `description`(直接是中文) |
153
+ | 发布方字段 | `author`(锁定「泛微网络科技股份有限公司」) | `author_name`(表单字段,市场列表展示) |
154
+ | 分类 | 无 | `category_code`(14 个固定枚举) |
155
+ | 图标 | 无 | `icon`(公网 URL,240*240) |
156
+ | 引导语 | 无 | `argument-hint`(推荐,缺失不阻断) |
157
+
158
+ ### QW-1 检测项清单
159
+
160
+ | 编号 | 归属 | 检测项 | 严重度 | 判定标准 |
161
+ |------|------|--------|--------|----------|
162
+ | A1c′ | QW | **包内文件总数 < 1000** | **BLOCK** | 包内(含任意层级、含隐藏文件)文件总数 ≥ 1000 即判 FAIL——千问上传硬性上限。须清理 `__pycache__`、`.DS_Store`、临时产物 |
163
+ | A1f | QW | **zip 包大小 ≤ 10 MB** | **BLOCK** | 读取**真实归档文件体积**(zip/md 输入为权威值);目录输入无归档可测,降级为「包内文件合计」并在结论中标注「(目录输入,无归档文件,取包内文件合计近似)」 |
164
+ | A4′ | QW | **`<name>/SKILL.md` 精确路径** | **BLOCK** | zip 输入:用 zip 原始 namelist 精确比对 `<name>/SKILL.md`(区分大小写与路径分隔符);目录输入:校验「SKILL.md 所在目录名 == frontmatter 的 `name`」;单 `.md` 输入无目录结构,跳过。**这是千问最高频失败原因**——macOS Finder 右键「压缩 N 项」只会得到裸 `SKILL.md`,必须用 `zip -r x.zip <name>/` 带上外层目录一起压缩 |
165
+ | A5f | QW | **`displayName` 必填** | **BLOCK** | 中文展示名必填且 ≤ 255 字符(千问市场列表展示用) |
166
+ | A5g | QW | **`author_name` 必填** | **BLOCK** | 发布方名称必填且 ≤ 255 字符。注意与泛微 `author` 区分:`author_name` 是千问表单字段,`author` 是 frontmatter 字段 |
167
+ | A5h | QW | `argument-hint` 引导语 | INFO | 推荐填写(用户输入框的预填引导语),缺失不阻断 |
168
+ | A6c | QW | **`category_code` 命中 14 个固定分类** | **BLOCK** | 取值必须属于:`content_creation`、`visual_creative`、`data_analysis`、`consulting_research`、`productivity`、`marketing_sales`、`ecommerce_retail`、`product_development`、`hr_recruiting`、`finance_accounting`、`legal_affairs`、`investment`、`education`、`other`。未设置仅 INFO 提示 |
169
+ | A6e | QW | **`icon` 必填且为公网 URL** | **BLOCK** | 缺少 `icon` / `icon_url` 即判 FAIL;非 `http(s)://` 开头判 WARN(规格 240*240 PNG / ≤ 2 MB;SVG 免尺寸校验,工具只校验声明不下载) |
170
+ | A11d | QW | **SKILL.md 正文 ≤ 64 KB** | **BLOCK** | 按 UTF-8 字节计,超出部分在市场详情页说明文档展示时会被截断(不影响上传成功,但首屏体验劣化)。须把长知识拆到 `references/` |
171
+ | B11a | QW | **连接器就绪性检查(`qw_query`)** | **BLOCK** | 技能若声明依赖连接器(`qwenwork.settings.connector.<类别>.<id>` 或「依赖连接器」表述),必须先调用 `qw_query` 查询连接器就绪状态;未做任何就绪检查即直接调用 → 阻断 |
172
+ | B11b | QW | **401/403 与 token 失效回退** | **BLOCK** | 依赖连接器的技能必须处理 401/403 / token 失效:引导用户回 Step 0 重新授权,不得直接报错退出 |
173
+
174
+ > B11 组触发前提:正文中出现连接器依赖声明(`qwenwork.settings.connector.*` 或「依赖连接器」字样)。未声明的技能不触发,不误伤。
175
+
176
+ ---
177
+
178
+ ## 红线说明(B1 重点)
179
+
180
+ **为什么 B1 是阻断项:** 泛微自有 demo/生产系统常部署在 e-cology.com.cn 等泛微自用域名。
181
+ 若 skill 将这些域名作为「默认登录地址 / 默认 base_url / 默认 host」写死,客户下载并运行后会连接到泛微自用系统,
182
+ 造成越权访问、数据泄露与隐私合规风险。**对外发布/提交的 skill 一律不得提供默认系统地址**,必须由用户显式提供自身系统地址。
183
+
184
+ **检测工具自身的约束:** 本工具仅做静态分析,**绝不连接任何线上 Weaver 系统**;若被分析的 skill 需要系统地址用于联调,
185
+ 应要求用户自行填入自有域名,工具与检测结果都不得默认指向 `e-cology.com.cn`。
186
+
187
+ ---
188
+
189
+ ## G. 扩展安全(WB)—— 对齐官方 expert-reviewer G 组
190
+
191
+ > 平台官方规范组,属 WorkBuddy 平台约束(WB);其中 G03 内网域名针对腾讯/平台内网,与泛微自用域名(B1)区分。
192
+
193
+ | 编号 | 归属 | 检测项 | 严重度 | 判定标准 |
194
+ |------|------|--------|--------|----------|
195
+ | G02 | WB | 无危险 shell 命令 | HIGH | 检测 `rm -rf /`、`rm -rf ~`、`rm -rf *`、fork bomb `:(){ :|:& };:`、`curl\|sh`、`sudo rm/chmod/dd/mkfs`、`chmod 777 /`、`dd if=...of=/dev/`、`mkfs.* /dev/`、`> /dev/sda`、`shutdown`/`reboot` 等危险命令(否定语境「禁止/不得」豁免) |
196
+ | G03 | WB | 无内网域名残留 | MEDIUM | 检测 `*.woa.com`/`*.tencent.com`/`*.internal`/`*.local`/`*.intranet`/`*.corp` 等通用内网域名(泛微自用域名 `e-cology.com.cn` 等由 B1 覆盖,否定语境豁免) |
197
+ | G04a| WB | 无开发者个人路径残留 | MEDIUM | 检测 `/Users/xxx/`、`/home/xxx/`、`C:\Users\xxx\`、`C:/Users/xxx/` 等开发者个人路径;对外分发后路径不一致会导致脚本/配置失效 |
198
+ | G04b| WB | 无 IDE/平台配置目录残留 | LOW | 检测 `.vscode/`/`.idea/`/`.cursor/`/`.codebuddy/`/`.fleet/`/`.claude/`/`.aider/`/`.github/`/`.DS_Store`/`Thumbs.db` 等不应出现在发布包中的文件 |
199
+ | G04c| WB | CDN 依赖版本锁定 | MEDIUM | 检测 `cdn.jsdelivr.net/.../@latest`、`unpkg.com/.../@latest`、`cdnjs.cloudflare.com/.../@latest`、`esm.sh/.../@latest` 等未锁定版本的 CDN 引用;上游更新可能引入不兼容或恶意代码 |
200
+ | C08 | WB | 无平台虚假技术承诺 | MEDIUM | 检测 Markdown 文档中的「本地AI」「离线运行」「不上云」「完全离线」「无需联网」「纯本地」「数据不出本机」「100%私密」「绝对安全」「永不泄露」「no cloud」「fully offline」等与平台运行方式不符的承诺(否定语境豁免) |
201
+ | BOM | WB | 无 BOM 头残留 | LOW | 检测文件开头的 UTF-8 BOM(EF BB BF),可能导致 YAML frontmatter 解析失败 |
202
+ | CRLF| WB | 无 CRLF 行尾 | LOW | 检测 Windows CRLF(\r\n)行尾,跨平台分发时可能导致 shell 脚本执行异常或 YAML 解析问题 |
203
+
204
+ ---
205
+
206
+ ## Q. 质量评估(WB)—— 启发式,对齐官方 expert-reviewer Q 组
207
+
208
+ | 编号 | 归属 | 检测项 | 严重度 | 判定标准 |
209
+ |------|------|--------|--------|----------|
210
+ | Q1 | WB | 路由触发清晰度 | LOW | SKILL.md 是否有明确的触发场景/关键词描述(检测「当用户」「触发」「适用场景」「使用场景」「何时使用」「trigger」「when to use」等关键词);缺少触发词可能导致技能无法被正确路由 |
211
+ | Q2 | WB | 上下文效率 | LOW | 检测 >100KB 的超大 Markdown 文件;过大文件占用上下文窗口,影响 Agent 处理效率,建议拆分或渐进披露 |
212
+ | Q3 | WB | 容错降级 | LOW | 包内含脚本时检查是否有 `try`/`catch`/`except`/`finally`/`.catch()`/`throw`/`raise` 等错误处理逻辑;缺少容错会导致异常时直接崩溃 |
213
+ | Q4 | WB | display_name 简洁性 | LOW | `display_name` 建议控制在 20 字以内以便展示 |
214
+ | Q4b| WB | description 字数控制 | LOW | `description` 建议控制在 200 字以内(一句话概述),详细内容放在 `description_zh`/`description_en`(对应官方 C02) |
215
+
216
+ ---
217
+
218
+ ## E. 技能能力清单与依赖(透明披露)
219
+
220
+ | 编号 | 归属 | 检测项 | 严重度 | 判定标准 |
221
+ |------|------|--------|--------|----------|
222
+ | E1 | WB | 识别到的能力 | INFO | 列出 skill 源码/文档中识别到的运行时能力:`HTTP 请求`、`调用外部 API`、`读取文件`、`写入文件`、`安装依赖包`、`控制浏览器`、`读取环境变量`、`执行系统命令`、`数据库访问`、`网络监听 / Socket / WebSocket` 等 |
223
+ | E2 | **WB+WV** | 依赖的其他技能 | INFO | **WB 部分**:平台关注 skill 的 `dependencies` 声明与其他技能引用关系。**WV 部分(泛微收窄)**:只识别 `weaver-e10-` 前缀技能,非 `weaver-e10-` 前缀的 `weaver-ebuilder-*`/`weaver-openserver-*`/`e10-`/`eteams-`/其他命名一律视为平台模块或内部引用、不作为技能依赖。识别来源:frontmatter `dependencies` / `requires` / `depends_on` / `skills` / `uses`(内联或 YAML 块列表)、description 中「由 xxx 提供/负责」、主 SKILL.md 中 `skill: "xxx"` / `/斜杠命令` /「使用 xxx 技能」表述;跳过自身、工具自身与常见路径/占位符片段。市场可达性:**推荐 `--market-live` 动态联网核查 skillhub.cn**(按 `slug` 精确匹配,实时标注 市场可搜[带链接] / 市场未收录 / 核查失败);离线可用 `--market-catalog catalog.json` 快照替代 |
224
+
225
+ ---
226
+
227
+ ## C. 威胁捕获模型视图(8 类风险卡片,WB)
228
+
229
+ > 已启用:每次检测默认渲染成「8 卡网格 + 三引擎并行评估」。每张卡片包含三个引擎 chip —— **行为安全**(按 status 着色,绿/橙/红)+ **AI 引擎**(紫色,扫描器自身作为 AI 引擎对外披露)+ **静态引擎**(命中=蓝、未命中=灰)。
230
+
231
+ | 编号 | 归属 | 检测项 | 严重度 | 判定标准 |
232
+ |------|------|--------|--------|----------|
233
+ | C1 | WB | 供应链风险 | MEDIUM | 检测到 `pip install` / `npm install` / `yarn add` / `curl \| bash` 等依赖安装或远程脚本拉取行为 |
234
+ | C2 | WB | 命令执行风险 | HIGH | 检测到 `eval` / `exec` / `spawn` / `subprocess` / `system` / `os.system` 等动态命令执行点 |
235
+ | C3 | WB | 网络请求与数据外传 | MEDIUM | 检测到 `requests` / `axios` / `fetch` / `curl` / `urllib` 等 HTTP 请求能力 |
236
+ | C4 | WB | 文件操作与敏感路径 | MEDIUM | 检测到文件读写,或引用 `~/.ssh` / `~/.aws` / `~/.e10-cli/profiles/.../auth` 等敏感路径 |
237
+ | C5 | WB | Prompt 注入风险 | HIGH | 提示词诱导用户粘贴 `ETEAMSID` / `token` / `password` 等凭证,或出现典型 prompt 注入话术 |
238
+ | C6 | WB | 远程脚本下载执行 | HIGH | 检测到 `curl \| bash`、`powershell -enc`、远程 `.py/.sh` 脚本执行等模式 |
239
+ | C7 | WB | 可疑编码/混淆 | MEDIUM | 检测到 `eval(atob(...))` / 长串 base64 / `\x`/ `\u` 转义序列等混淆特征 |
240
+ | C8 | WB | 其他安全风险 | HIGH | 检测到 `--no-sandbox` / `--disable-gpu` 等沙箱绕过参数,或截屏、录音、剪贴板读取等隐私采集能力 |
241
+
242
+ ---
243
+
244
+ ## D. 威胁行为图谱解析(具体跨文件/跨行行为,WB)
245
+
246
+ > 已启用:检测结果渲染到 HTML 报告「威胁行为图谱解析」section,顶部四个 tab —— **全部引擎结果(N)** / **检出恶意(N)** / **检出可疑(N)** / **评估安全(N)**。每条规则一张详情卡(深色日志块 + 具体 `文件:行 → 代码` 命中)。
247
+
248
+ | 编号 | 归属 | 检测项 | 严重度 | 判定标准 |
249
+ |------|------|--------|--------|----------|
250
+ | D1 | WB | dangerouslyDisableSandbox + run_in_background 绕过权限确认 | HIGH | 同一 skill 中同时出现 `dangerouslyDisableSandbox: true` 与 `run_in_background: true`,可能用于跳过权限确认并关闭沙箱 |
251
+ | D2 | WB | 浏览器启动参数关闭沙箱 | HIGH | 检测到 `--no-sandbox`、`--disable-gpu`、`--disable-setuid-sandbox` 等浏览器启动参数 |
252
+ | D3 | WB | 提示词诱导用户明文粘贴会话凭证 | HIGH | 提示词模板要求用户将 `ETEAMSID` / `token` / `session` 等凭证明文粘贴进对话 |
253
+
254
+ ---
255
+
256
+ ## 综合判定规则
257
+
258
+ - 存在任意 `BLOCK` 级 `FAIL` → 综合判定 **FAIL**(不通过)。
259
+ - 无 BLOCK,但存在 `WARN` → **WARN**(通过但建议修复)。
260
+ - 全部 PASS → **PASS**(通过)。
261
+
262
+ > 注:WB 与 WV 的 BLOCK 项在当前实现中**同等对待**(任一命中即不可发布)。
263
+ > 若需按归属分级处理(例如只跑 WB 做平台合规体检),参见「0.4 复用与裁剪建议」。
264
+ > QW 组同理:启用 `--platform qwenwork` 后,QW 的 BLOCK 项与 WB/WV 同等对待。
265
+
266
+ ---
267
+
268
+ ## 工程约定:扫描性能与正则写法(改动 `validate_skill.py` 必读)
269
+
270
+ ### 扫描截断
271
+
272
+ | 常量 | 值 | 作用 |
273
+ |------|-----|------|
274
+ | `MAX_SCAN_FILE_BYTES` | 4 MB | 单文件参与正则扫描的最大字节数,超出部分截断(扫描顺序仍覆盖全部文件) |
275
+ | `SCAN_LINE_MAX_CHARS` | 4000 | 单行参与正则扫描的最大字符数,超出部分截断,**行号一一对应不变** |
276
+
277
+ ### 背景(真实事故)
278
+
279
+ 部分路径正则含可回溯量词,在**超长单行**(压缩 JS、无换行数据文件)上会退化为准 O(n²):
280
+ 实测 11 MB 单行文本让整体扫描卡死 **180 秒以上**(表现为命令无响应、后台任务挂起)。
281
+ 加截断 + 正则改写后,同一用例 **8.4 秒**完成。截断只丢弃超长行尾部,正常代码行远小于阈值,检测结论不受影响。
282
+
283
+ ### 正则写法硬约束
284
+
285
+ 逐行扫描的正则必须**先锚定字面量 token**,再向后做「有界尾部 + 定界」校验:
286
+
287
+ ```python
288
+ # ✅ 正确:先锚定 token,再校验有界尾部
289
+ r"((?:e10|eteams|weaver)[^\s'\"]{0,120}profiles[^\s'\"]{0,120}auth(?:[\"'\s`]|$))"
290
+
291
+ # ❌ 禁止一:无界量词(超长行直接退化 O(n²))
292
+ r"([^\s'\"]*(?:\.ssh|\.aws|...)(?:[\"'\s`]|$))"
293
+
294
+ # ❌ 禁止二:可空/通配前缀 + 有界量词(每个起点要试 N 种前缀长度,1.6 MB 单行实测 90+ 秒)
295
+ r"([^\s'\"]{0,120}(?:\.ssh|\.aws|...)(?:[\"'\s`]|$))"
296
+ ```
297
+
298
+ 新增/修改正则后,务必用「逐步放大行长度」验证耗时呈线性增长,不要只看功能用例是否通过。