weaver-work-cli 0.1.6 → 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.
- package/README.md +14 -9
- package/dist/cmd/skills/index.js +60 -0
- package/dist/internal/e10/auth/commands.js +44 -31
- package/dist/internal/e10/auth/session.js +44 -3
- package/dist/internal/e10/auth/xiaoe.js +363 -11
- package/dist/internal/e10/context.js +4 -2
- package/dist/internal/skills/detector.js +42 -0
- package/dist/internal/skills/install.js +50 -3
- package/dist/shortcuts/archive/render/search-format.js +12 -3
- package/dist/shortcuts/ebuilder-form/continuation.js +70 -0
- package/dist/shortcuts/ebuilder-form/errors.js +54 -0
- package/dist/shortcuts/ebuilder-form/host.js +1238 -0
- package/dist/shortcuts/ebuilder-form/index.js +108 -0
- package/dist/shortcuts/ebuilder-form/manifest.js +347 -0
- package/dist/shortcuts/ebuilder-form/operations/read.js +157 -0
- package/dist/shortcuts/ebuilder-form/operations/registry.js +56 -0
- package/dist/shortcuts/ebuilder-form/operations/shared.js +132 -0
- package/dist/shortcuts/ebuilder-form/operations/types.js +19 -0
- package/dist/shortcuts/ebuilder-form/operations/write.js +277 -0
- package/dist/shortcuts/ebuilder-form/operations.js +8 -0
- package/dist/shortcuts/ehr/operations/salary.js +2 -140
- package/dist/shortcuts/im/continuation.js +70 -0
- package/dist/shortcuts/{yimiaoban → im}/errors.js +14 -14
- package/dist/shortcuts/{yimiaoban → im}/host.js +26 -26
- package/dist/shortcuts/{yimiaoban → im}/index.js +42 -42
- package/dist/shortcuts/{yimiaoban → im}/manifest.js +7 -6
- package/dist/shortcuts/{yimiaoban → im}/operations/file-user.js +54 -41
- package/dist/shortcuts/{yimiaoban → im}/operations/group-read.js +46 -44
- package/dist/shortcuts/{yimiaoban → im}/operations/group-write.js +113 -66
- package/dist/shortcuts/{yimiaoban → im}/operations/msg-sync.js +164 -141
- package/dist/shortcuts/{yimiaoban → im}/operations/msg-write.js +47 -47
- package/dist/shortcuts/{yimiaoban → im}/operations/person.js +10 -10
- package/dist/shortcuts/{yimiaoban → im}/operations/registry.js +10 -8
- package/dist/shortcuts/{yimiaoban → im}/operations/session.js +82 -83
- package/dist/shortcuts/im/operations/shared.js +442 -0
- package/dist/shortcuts/{yimiaoban → im}/operations/types.js +1 -1
- package/dist/shortcuts/im/operations/user-remind.js +201 -0
- package/dist/shortcuts/{yimiaoban → im}/operations/write-util.js +7 -7
- package/dist/shortcuts/{yimiaoban → im}/operations.js +3 -3
- package/dist/shortcuts/index.js +10 -2
- package/dist/shortcuts/invoice/manifest.js +113 -10
- package/dist/shortcuts/invoice/operations/import.js +39 -14
- package/dist/shortcuts/invoice/operations/reim.js +38 -18
- package/dist/shortcuts/invoice/operations/shared.js +35 -6
- package/dist/shortcuts/jiuchuanhui/manifest.js +3 -3
- package/dist/shortcuts/jiuchuanhui/operations/registry.js +2 -2
- package/dist/shortcuts/{yimiaoban → okr}/continuation.js +10 -10
- package/dist/shortcuts/okr/errors.js +70 -0
- package/dist/shortcuts/okr/host.js +169 -0
- package/dist/shortcuts/okr/index.js +155 -0
- package/dist/shortcuts/okr/manifest.js +70 -0
- package/dist/shortcuts/okr/operations/link.js +305 -0
- package/dist/shortcuts/okr/operations/read.js +481 -0
- package/dist/shortcuts/okr/operations/registry.js +31 -0
- package/dist/shortcuts/okr/operations/shared.js +381 -0
- package/dist/shortcuts/okr/operations/types.js +88 -0
- package/dist/shortcuts/okr/operations/write.js +838 -0
- package/dist/shortcuts/okr/operations.js +8 -0
- package/dist/shortcuts/project/continuation.js +70 -0
- package/dist/shortcuts/project/errors.js +53 -0
- package/dist/shortcuts/project/host.js +160 -0
- package/dist/shortcuts/project/index.js +106 -0
- package/dist/shortcuts/project/manifest.js +36 -0
- package/dist/shortcuts/project/operations/read.js +551 -0
- package/dist/shortcuts/project/operations/registry.js +31 -0
- package/dist/shortcuts/project/operations/shared.js +68 -0
- package/dist/shortcuts/project/operations/types.js +39 -0
- package/dist/shortcuts/project/operations/write.js +266 -0
- package/dist/shortcuts/project/operations.js +8 -0
- package/dist/shortcuts/workflow/continuation.js +508 -0
- package/dist/shortcuts/workflow/endpoints.js +149 -0
- package/dist/shortcuts/workflow/errors.js +112 -0
- package/dist/shortcuts/workflow/host.js +224 -0
- package/dist/shortcuts/workflow/index.js +116 -0
- package/dist/shortcuts/workflow/manifest.js +30 -0
- package/dist/shortcuts/workflow/operations/form.js +4159 -0
- package/dist/shortcuts/workflow/operations/read.js +3778 -0
- package/dist/shortcuts/workflow/operations/registry.js +33 -0
- package/dist/shortcuts/workflow/operations/shared.js +167 -0
- package/dist/shortcuts/workflow/operations/types.js +44 -0
- package/dist/shortcuts/workflow/operations/write.js +1991 -0
- package/dist/shortcuts/workflow/operations.js +119 -0
- package/dist/shortcuts/workflow/state.js +182 -0
- package/docs/SKILL.md +5 -3
- package/docs/_catalog.md +10 -1
- package/docs/agent-invoice.md +2 -2
- package/docs/agent-skill-install.md +2 -2
- package/docs/e10-auth.md +3 -1
- package/docs/ebuilder-form.md +38 -0
- package/docs/im.md +104 -0
- package/docs/invoice.md +5 -5
- package/docs/okr.md +122 -0
- package/docs/operation-manual.md +10 -7
- package/docs/project.md +69 -0
- package/docs/skill-review-2026-09-19.md +68 -0
- package/package.json +3 -2
- package/scripts/package-skill.mjs +38 -11
- package/scripts/sync-connector-skills.mjs +172 -0
- package/skill-template/business-info.json +357 -16
- package/skill-template/domains/ebuilder-form.md +5 -0
- package/skill-template/domains/okr.md +18 -0
- package/skill-template/domains/shijingran.md +3 -0
- package/skill-template/domains/skill-maker.md +4 -4
- package/skill-template/domains/workflow.md +22 -0
- package/skill-template/domains/yepiaotong.md +4 -2
- package/skill-template/domains/yimiaoban.md +13 -10
- package/skill-template/product.json +5 -0
- package/skill-template/skill-template.md +1 -0
- package/skills/weaver-e10-calendar/SKILL.md +5 -1
- package/skills/weaver-e10-calendar/references/calendar-query.md +7 -0
- package/skills/weaver-e10-calendar/references/source-manifest.json +314 -32
- package/skills/weaver-e10-ebuilder-form/SKILL.md +123 -0
- package/skills/weaver-e10-ebuilder-form/references/context-routing.md +90 -0
- package/skills/weaver-e10-ebuilder-form/references/custom-api.md +86 -0
- package/skills/weaver-e10-ebuilder-form/references/disabled-capabilities.md +50 -0
- package/skills/weaver-e10-ebuilder-form/references/fields-browser.md +100 -0
- package/skills/weaver-e10-ebuilder-form/references/list-nlist.md +91 -0
- package/skills/weaver-e10-ebuilder-form/references/openapi-read.md +74 -0
- package/skills/weaver-e10-ebuilder-form/references/openapi-write.md +86 -0
- package/skills/weaver-e10-ebuilder-form/references/source-manifest.json +107 -0
- package/skills/weaver-e10-esb/SKILL.md +1 -1
- package/skills/weaver-e10-esb/references/source-manifest.json +15 -14
- package/skills/weaver-e10-hrm/SKILL.md +1 -1
- package/skills/weaver-e10-hrm/references/source-manifest.json +357 -38
- package/skills/weaver-e10-jiuchuanhui/SKILL.md +22 -4
- package/skills/weaver-e10-jiuchuanhui/references/clue.md +4 -2
- package/skills/weaver-e10-jiuchuanhui/references/contact.md +1 -1
- package/skills/weaver-e10-jiuchuanhui/references/customer.md +3 -3
- package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +1 -1
- package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +10 -10
- package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +3 -3
- package/skills/weaver-e10-jiuchuanhui/references/sale.md +7 -7
- package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +3 -3
- package/skills/weaver-e10-jucailin/SKILL.md +2 -2
- package/skills/weaver-e10-mail/SKILL.md +22 -6
- package/skills/weaver-e10-meeting/SKILL.md +22 -1
- package/skills/weaver-e10-okr/SKILL.md +139 -0
- package/skills/weaver-e10-okr/references/okr-align.md +59 -0
- package/skills/weaver-e10-okr/references/okr-keyresult.md +68 -0
- package/skills/weaver-e10-okr/references/okr-link-routing.md +67 -0
- package/skills/weaver-e10-okr/references/okr-query.md +105 -0
- package/skills/weaver-e10-okr/references/okr-write.md +94 -0
- package/skills/weaver-e10-okr/references/source-manifest.json +672 -0
- package/skills/weaver-e10-plan/SKILL.md +3 -3
- package/skills/weaver-e10-plan/references/plan-report-write.md +1 -1
- package/skills/weaver-e10-plan/references/source-manifest.json +20 -20
- package/skills/weaver-e10-qiyecheng/SKILL.md +21 -1
- package/skills/weaver-e10-qiyecheng/references/source-manifest.json +17 -17
- package/skills/weaver-e10-shared/SKILL.md +79 -11
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +41 -8
- package/skills/weaver-e10-shared/references/non-interactive-environment.md +78 -0
- package/skills/weaver-e10-shared/references/weaver-e10-installation.md +39 -0
- package/skills/weaver-e10-shijingran/SKILL.md +83 -0
- package/skills/weaver-e10-shijingran/references/field-resolution.md +105 -0
- package/skills/weaver-e10-shijingran/references/operations.md +154 -0
- package/skills/weaver-e10-shijingran/references/source-manifest.json +1380 -0
- package/skills/weaver-e10-shijingran/references/write-operations.md +90 -0
- package/skills/weaver-e10-skill-maker/SKILL.md +26 -9
- package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +39 -8
- package/skills/weaver-e10-skill-maker/references/detector-validation.md +25 -8
- package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +66 -5
- package/skills/weaver-e10-skill-maker/references/module-gap-audit-and-repair.md +86 -0
- package/skills/weaver-e10-skill-maker/references/source-update-detection.md +59 -5
- package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +16 -8
- package/skills/weaver-e10-wenshuding/SKILL.md +28 -4
- package/skills/weaver-e10-wenshuding/references/archive-search.md +14 -0
- package/skills/weaver-e10-wenshuding/references/source-manifest.json +27 -26
- package/skills/weaver-e10-workflow/SKILL.md +250 -0
- package/skills/weaver-e10-workflow/references/source-manifest.json +1062 -0
- package/skills/weaver-e10-workflow/references/workflow-agent-entry.md +96 -0
- package/skills/weaver-e10-workflow/references/workflow-batch.md +275 -0
- package/skills/weaver-e10-workflow/references/workflow-create.md +182 -0
- package/skills/weaver-e10-workflow/references/workflow-edit.md +106 -0
- package/skills/weaver-e10-workflow/references/workflow-memory.md +165 -0
- package/skills/weaver-e10-workflow/references/workflow-operate.md +153 -0
- package/skills/weaver-e10-workflow/references/workflow-query.md +821 -0
- package/skills/weaver-e10-workflow/references/workflow-share.md +117 -0
- package/skills/weaver-e10-workflow/references/workflow-view.md +189 -0
- package/skills/weaver-e10-yepiaotong/SKILL.md +28 -28
- package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +11 -5
- package/skills/weaver-e10-yepiaotong/references/invoice-import.md +14 -8
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +9 -43
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +8 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +13 -17
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +6 -7
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +2 -2
- package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1155 -553
- package/skills/weaver-e10-yimiaoban/SKILL.md +56 -38
- package/skills/weaver-e10-yimiaoban/references/ding-write.md +8 -8
- package/skills/weaver-e10-yimiaoban/references/error-codes.md +16 -0
- package/skills/weaver-e10-yimiaoban/references/field-resolution.md +10 -10
- package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +12 -12
- package/skills/weaver-e10-yimiaoban/references/group-read.md +16 -16
- package/skills/weaver-e10-yimiaoban/references/group-write.md +17 -15
- package/skills/weaver-e10-yimiaoban/references/msg-read.md +21 -17
- package/skills/weaver-e10-yimiaoban/references/msg-write.md +10 -10
- package/skills/weaver-e10-yimiaoban/references/person.md +6 -6
- package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +15 -11
- package/skills/weaver-e10-yimiaoban/references/session-sysmsg.md +11 -10
- package/skills/weaver-e10-yimiaoban/references/source-manifest.json +2164 -154
- package/skills/weaver-e10-yimiaoban/references/user-remind.md +75 -0
- package/skills/weaver-e10-ziguanjia/SKILL.md +4 -2
- package/skills/weaver-e10-ziguanjia/references/source-manifest.json +99 -29
- package/tools/weaver-skill-detector-1.0.13/SKILL.md +253 -0
- package/tools/weaver-skill-detector-1.0.13/_meta.json +6 -0
- package/tools/weaver-skill-detector-1.0.13/references/checklist.md +298 -0
- package/tools/weaver-skill-detector-1.0.13/scripts/validate_skill.py +4190 -0
- package/dist/shortcuts/yimiaoban/operations/shared.js +0 -236
- package/docs/yimiaoban.md +0 -86
- package/skills/weaver-e10-calendar/product.json +0 -8
- package/skills/weaver-e10-esb/product.json +0 -8
- package/skills/weaver-e10-hrm/product.json +0 -8
- package/skills/weaver-e10-jiuchuanhui/product.json +0 -8
- package/skills/weaver-e10-jucailin/product.json +0 -8
- package/skills/weaver-e10-mail/product.json +0 -8
- package/skills/weaver-e10-meeting/product.json +0 -8
- package/skills/weaver-e10-plan/product.json +0 -8
- package/skills/weaver-e10-qiyecheng/product.json +0 -8
- package/skills/weaver-e10-skill-maker/product.json +0 -8
- package/skills/weaver-e10-wenshuding/product.json +0 -8
- package/skills/weaver-e10-yepiaotong/product.json +0 -8
- package/skills/weaver-e10-yepiaotong/references/invoice-red.md +0 -261
- package/skills/weaver-e10-yimiaoban/product.json +0 -8
- package/skills/weaver-e10-ziguanjia/product.json +0 -8
- /package/dist/shortcuts/{yimiaoban → im}/operations/msg-parse.js +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# 消息免打扰设置(user.setRemind)
|
|
2
|
+
|
|
3
|
+
## 何时使用
|
|
4
|
+
|
|
5
|
+
用户说「把某个群/某个人设为免打扰」「别再提醒这个群」「恢复提醒」时使用。对应 operation:
|
|
6
|
+
|
|
7
|
+
| operation 对 | 用途 |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| `im.user.setRemind.prepare` / `.apply` | 设置**当前登录人自己**的会话免打扰(**仅会话维度**:单聊会话 / 群聊会话 / 系统会话) |
|
|
10
|
+
|
|
11
|
+
接口来源:`POST /api/em/msg/executeIm/user/setMsgRemind`(weaver-im-api `PathSetMsgRemind`,协议 `MsgRemindInfo`)。
|
|
12
|
+
|
|
13
|
+
## 输入要点
|
|
14
|
+
|
|
15
|
+
- `sessionType`(必填):`1` 单聊会话、`2` 群聊会话、`4` 系统会话。
|
|
16
|
+
- `reminder`(必填):`0` 消息接收提醒(恢复提醒)、`1` 消息接收但不提醒(免打扰,会话仍在最近列表并带未读数)。
|
|
17
|
+
- 目标字段按 `sessionType` 二选一(传错类型会报 `target_required`):
|
|
18
|
+
- `1` 单聊会话 → `toUid` + `toCid`(对方身份,先用 `im.person.resolve` 解析)
|
|
19
|
+
- `2` 群聊会话 → `groupId`
|
|
20
|
+
- `4` 系统会话 → `group`(系统消息分组 id,来自 `im.sysmsg.groupSearch`/会话列表)
|
|
21
|
+
- `prepare` 会只读回查目标名称(群名 / 人名 / 系统分组名)写进 `summary.target`,便于向用户确认后再 `apply`。
|
|
22
|
+
- 操作者身份由 CLI 用当前登录人(`teamsCheck`)填充,**调用方不能自带** `user`/`sender`/`operator`(会被 `forbidden_key` 拒绝)。
|
|
23
|
+
|
|
24
|
+
## 命令
|
|
25
|
+
|
|
26
|
+
Windows PowerShell:
|
|
27
|
+
|
|
28
|
+
```powershell
|
|
29
|
+
weaver-work-cli --json im run im.user.setRemind.prepare --input-json '{"sessionType":2,"groupId":"1788334281700000004","reminder":1}'
|
|
30
|
+
weaver-work-cli --json im run im.user.setRemind.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
macOS/Linux(bash/zsh):
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
weaver-work-cli --json im run im.user.setRemind.prepare --input-json '{"sessionType":2,"groupId":"1788334281700000004","reminder":1}'
|
|
37
|
+
weaver-work-cli --json im run im.user.setRemind.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
系统会话、单聊会话两种常见形态:
|
|
41
|
+
|
|
42
|
+
Windows PowerShell:
|
|
43
|
+
|
|
44
|
+
```powershell
|
|
45
|
+
weaver-work-cli --json im run im.user.setRemind.prepare --input-json '{"sessionType":4,"group":110,"reminder":1}'
|
|
46
|
+
weaver-work-cli --json im run im.user.setRemind.prepare --input-json '{"sessionType":1,"toUid":"100234","toCid":"102","reminder":0}'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
macOS/Linux(bash/zsh):
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
weaver-work-cli --json im run im.user.setRemind.prepare --input-json '{"sessionType":4,"group":110,"reminder":1}'
|
|
53
|
+
weaver-work-cli --json im run im.user.setRemind.prepare --input-json '{"sessionType":1,"toUid":"100234","toCid":"102","reminder":0}'
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 输出处理
|
|
57
|
+
|
|
58
|
+
- `prepare` 返回 `summary`:`action/target/sessionTypeName/reminderName` + 目标 id;**必须先向用户复述"把哪个会话设成什么状态"再 apply**。
|
|
59
|
+
- `apply` 返回 `sessionType`/`sessionTypeName`/`reminder`/`reminderName` 与目标 id。
|
|
60
|
+
- 核对方式(只读):`im.session.list` 里该会话的 `dontDisturb` 与 `unreadLabel`(免打扰会话显示 `N(免打扰)`)。联机实测:群/系统消息分组设为 `reminder:1` 后 `dontDisturb` 立即变为 `true`,设回 `0` 后恢复 `false`。
|
|
61
|
+
- 这是"低风险但会影响用户收消息"的设置:默认只在用户明确要求时执行,不要顺手改;改完若要还原,用同样的 operation 传 `reminder:0`。
|
|
62
|
+
|
|
63
|
+
## 注意
|
|
64
|
+
|
|
65
|
+
- 只影响**当前登录人自己**的免打扰偏好;不会改变其他成员的设置,也不会删除/清空会话。
|
|
66
|
+
- 本能力只做会话维度的「提醒 / 免打扰」两种状态;其它提醒形态请引导用户在易秒办客户端处理。
|
|
67
|
+
- 写操作只认 CLI 签发的 continuation:不手工拼、不复用、不跨操作;`apply` 不确定时不自动重试,先用 `im.session.list` 只读回查。
|
|
68
|
+
|
|
69
|
+
## 失败处理
|
|
70
|
+
|
|
71
|
+
- `session_type_invalid`:`sessionType` 不是 `1`(单聊会话)/`2`(群聊会话)/`4`(系统会话)。
|
|
72
|
+
- `reminder_invalid`:`reminder` 不是 `0`(接收提醒)或 `1`(免打扰)。
|
|
73
|
+
- `target_required`:该 `sessionType` 缺少对应目标字段(单聊会话缺 `toUid`/`toCid`、群聊会话缺 `groupId`、系统会话缺 `group`)。
|
|
74
|
+
- `forbidden_key`:入参带了 `user`/`sender`/`operator` 等操作人字段。
|
|
75
|
+
- 认证/上下文类错误参照共享规则;其余业务码见 [`error-codes.md`](error-codes.md)。
|
|
@@ -13,12 +13,14 @@ requires:
|
|
|
13
13
|
cliHelp: "weaver-work-cli asset --help"
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md),其中包含安装、E10 认证、JSON 输出和高风险写入规则。若不存在则必须先执行 `weaver-work-cli skills install shared --
|
|
16
|
+
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md),其中包含安装、E10 认证、JSON 输出和高风险写入规则。若不存在则必须先执行 `weaver-work-cli skills install shared --target-dir <当前Agent的Skills目录>`,若 CLI 未安装则先执行 `npm install -g weaver-work-cli`,安装或读取失败时必须停止执行。**
|
|
17
17
|
|
|
18
18
|
认证和登录态只能按共享规则通过 `weaver-work-cli auth ...` 命令判断;禁止直接读取、列出、打印或解析用户主目录下的旧 `.e10-cli`、auth、config 或 Keychain 数据。
|
|
19
19
|
所有命令通过 `weaver-work-cli --json asset run <operation>` 执行:简单 JSON 优先传 `--input-json '<json>'`,复杂或多行 JSON 先写入 UTF-8 文件再传 `--input <path>`,只有确认当前 shell 能稳定传管道时才使用 `--input -`。调用前先按需读取 references 下对应的文件,查参数结构,不要猜字段;**references 是第一信息源**,`weaver-work-cli asset schema` 是 operation、字段和风险等级的合约来源。
|
|
20
20
|
命令示例、提示词和临时说明必须同时兼容 Windows 和 macOS/Linux;涉及 JSON 输入、用户目录、路径分隔符、Python 启动器、文件删除、目录查看或文件比对时,同时给 Windows PowerShell 与 macOS/Linux(bash/zsh)两套示例。Agent 先根据当前系统和 shell 选择对应示例,不确定时用 `node -p "process.platform"` 判断。Windows/PowerShell 下不要使用 `printf`、`$HOME/...`、`~/...`、bash 反斜杠续行、`rm/ls/diff/python3` 等 Unix-only 写法。
|
|
21
21
|
|
|
22
|
+
# 泛微E10资管家资产管理
|
|
23
|
+
|
|
22
24
|
## 路由优先级(先判断是不是资管家资产,再选 operation)
|
|
23
25
|
|
|
24
26
|
资管家不是通用 E10 对象。**只要用户的核心对象是 E10 资产管理(资管家)里的资产、领用、报修、采购、折旧、资产地点/状态/类型,就优先使用 `weaver-e10-ziguanjia`。**
|
|
@@ -98,7 +100,7 @@ cliHelp: "weaver-work-cli asset --help"
|
|
|
98
100
|
- 列表返回的 `stateid` / `asset_type_browse` / `location_browse` 可能是 ID:回报前按 `asset.resolve.*` 反查为名称展示,不向用户暴露 ID(ID 仅内部拼「查看详情」链接用)。
|
|
99
101
|
- `status` 字段是**字符串** `"true"` / `"false"`,不是布尔;为 `"false"` 表示查询失败,**不能当成「无结果」**。
|
|
100
102
|
- 人员名称需先经 `weaver-e10-hrm` 解析为人员 ID 再传入 `person_id`;不要把姓名直接当 ID。查「我」的列表(uselist / repaillist / purchaselist)省略 `person_id` 即可,CLI 自动用当前登录人。
|
|
101
|
-
- 「查看详情」一律用对话内纯 Markdown
|
|
103
|
+
- 「查看详情」一律用对话内纯 Markdown 链接呈现(链接文字为「查看详情」,链接地址为该记录的详情页 URL),不带「查看详情:」前缀与冒号,也不把完整 URL 当纯文本展示;多条记录逐条生成各自的链接,不共用一条。
|
|
102
104
|
|
|
103
105
|
### 2) 已知对象时直达动作
|
|
104
106
|
|
|
@@ -11,15 +11,27 @@
|
|
|
11
11
|
},
|
|
12
12
|
"generatedAt": "2026-09-07T00:00:00.000Z",
|
|
13
13
|
"sourceSet": {
|
|
14
|
-
"aggregateSha256": "
|
|
15
|
-
"sourceRoots": [
|
|
14
|
+
"aggregateSha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945",
|
|
15
|
+
"sourceRoots": [
|
|
16
|
+
"weaver-e10-ziguanjia"
|
|
17
|
+
],
|
|
16
18
|
"detectionStrength": "weak"
|
|
17
19
|
},
|
|
18
20
|
"generatedTargets": {
|
|
19
|
-
"cli": [
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
"cli": [
|
|
22
|
+
"src/shortcuts/asset",
|
|
23
|
+
"src/shortcuts/index.ts"
|
|
24
|
+
],
|
|
25
|
+
"skill": [
|
|
26
|
+
"skills/weaver-e10-ziguanjia"
|
|
27
|
+
],
|
|
28
|
+
"tests": [
|
|
29
|
+
"test/business/ziguanjia-*.test.ts"
|
|
30
|
+
],
|
|
31
|
+
"docs": [
|
|
32
|
+
"docs/ziguanjia.md",
|
|
33
|
+
"skill-template/domains/ziguanjia.md"
|
|
34
|
+
]
|
|
23
35
|
},
|
|
24
36
|
"sources": [],
|
|
25
37
|
"sourceChunks": [
|
|
@@ -28,88 +40,142 @@
|
|
|
28
40
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md",
|
|
29
41
|
"anchor": "reference:ziguanjia-agent-entry.md",
|
|
30
42
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
31
|
-
"mapsToOperations": [
|
|
32
|
-
|
|
43
|
+
"mapsToOperations": [
|
|
44
|
+
"asset.gate.check"
|
|
45
|
+
],
|
|
46
|
+
"mapsToReferences": [
|
|
47
|
+
"references/ziguanjia-agent-entry.md"
|
|
48
|
+
]
|
|
33
49
|
},
|
|
34
50
|
{
|
|
35
51
|
"id": "asset.list",
|
|
36
52
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-query.md",
|
|
37
53
|
"anchor": "reference:ziguanjia-query.md",
|
|
38
54
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
39
|
-
"mapsToOperations": [
|
|
40
|
-
|
|
55
|
+
"mapsToOperations": [
|
|
56
|
+
"asset.list",
|
|
57
|
+
"asset.detail",
|
|
58
|
+
"asset.uselist",
|
|
59
|
+
"asset.repaillist",
|
|
60
|
+
"asset.purchaselist"
|
|
61
|
+
],
|
|
62
|
+
"mapsToReferences": [
|
|
63
|
+
"references/ziguanjia-query.md"
|
|
64
|
+
]
|
|
41
65
|
},
|
|
42
66
|
{
|
|
43
67
|
"id": "asset.resolve",
|
|
44
68
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md",
|
|
45
69
|
"anchor": "reference:ziguanjia-resolve.md",
|
|
46
70
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
47
|
-
"mapsToOperations": [
|
|
48
|
-
|
|
71
|
+
"mapsToOperations": [
|
|
72
|
+
"asset.resolve.location",
|
|
73
|
+
"asset.resolve.status",
|
|
74
|
+
"asset.resolve.type"
|
|
75
|
+
],
|
|
76
|
+
"mapsToReferences": [
|
|
77
|
+
"references/ziguanjia-resolve.md"
|
|
78
|
+
]
|
|
49
79
|
},
|
|
50
80
|
{
|
|
51
81
|
"id": "asset.create",
|
|
52
82
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-create.md",
|
|
53
83
|
"anchor": "reference:ziguanjia-create.md",
|
|
54
84
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
55
|
-
"mapsToOperations": [
|
|
56
|
-
|
|
85
|
+
"mapsToOperations": [
|
|
86
|
+
"asset.create"
|
|
87
|
+
],
|
|
88
|
+
"mapsToReferences": [
|
|
89
|
+
"references/ziguanjia-create.md"
|
|
90
|
+
]
|
|
57
91
|
},
|
|
58
92
|
{
|
|
59
93
|
"id": "asset.update",
|
|
60
94
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-update.md",
|
|
61
95
|
"anchor": "reference:ziguanjia-update.md",
|
|
62
96
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
63
|
-
"mapsToOperations": [
|
|
64
|
-
|
|
97
|
+
"mapsToOperations": [
|
|
98
|
+
"asset.update"
|
|
99
|
+
],
|
|
100
|
+
"mapsToReferences": [
|
|
101
|
+
"references/ziguanjia-update.md"
|
|
102
|
+
]
|
|
65
103
|
},
|
|
66
104
|
{
|
|
67
105
|
"id": "asset.use",
|
|
68
106
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-use.md",
|
|
69
107
|
"anchor": "reference:ziguanjia-use.md",
|
|
70
108
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
71
|
-
"mapsToOperations": [
|
|
72
|
-
|
|
109
|
+
"mapsToOperations": [
|
|
110
|
+
"asset.use"
|
|
111
|
+
],
|
|
112
|
+
"mapsToReferences": [
|
|
113
|
+
"references/ziguanjia-use.md"
|
|
114
|
+
]
|
|
73
115
|
},
|
|
74
116
|
{
|
|
75
117
|
"id": "asset.return",
|
|
76
118
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-return.md",
|
|
77
119
|
"anchor": "reference:ziguanjia-return.md",
|
|
78
120
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
79
|
-
"mapsToOperations": [
|
|
80
|
-
|
|
121
|
+
"mapsToOperations": [
|
|
122
|
+
"asset.return.query",
|
|
123
|
+
"asset.return.create"
|
|
124
|
+
],
|
|
125
|
+
"mapsToReferences": [
|
|
126
|
+
"references/ziguanjia-return.md"
|
|
127
|
+
]
|
|
81
128
|
},
|
|
82
129
|
{
|
|
83
130
|
"id": "asset.repair",
|
|
84
131
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md",
|
|
85
132
|
"anchor": "reference:ziguanjia-repair.md",
|
|
86
133
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
87
|
-
"mapsToOperations": [
|
|
88
|
-
|
|
134
|
+
"mapsToOperations": [
|
|
135
|
+
"asset.repair.query",
|
|
136
|
+
"asset.repair.create"
|
|
137
|
+
],
|
|
138
|
+
"mapsToReferences": [
|
|
139
|
+
"references/ziguanjia-repair.md"
|
|
140
|
+
]
|
|
89
141
|
},
|
|
90
142
|
{
|
|
91
143
|
"id": "asset.purch",
|
|
92
144
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md",
|
|
93
145
|
"anchor": "reference:ziguanjia-purch.md",
|
|
94
146
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
95
|
-
"mapsToOperations": [
|
|
96
|
-
|
|
147
|
+
"mapsToOperations": [
|
|
148
|
+
"asset.purch"
|
|
149
|
+
],
|
|
150
|
+
"mapsToReferences": [
|
|
151
|
+
"references/ziguanjia-purch.md"
|
|
152
|
+
]
|
|
97
153
|
},
|
|
98
154
|
{
|
|
99
155
|
"id": "asset.depre",
|
|
100
156
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md",
|
|
101
157
|
"anchor": "reference:ziguanjia-depre.md",
|
|
102
158
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
103
|
-
"mapsToOperations": [
|
|
104
|
-
|
|
159
|
+
"mapsToOperations": [
|
|
160
|
+
"asset.depre"
|
|
161
|
+
],
|
|
162
|
+
"mapsToReferences": [
|
|
163
|
+
"references/ziguanjia-depre.md"
|
|
164
|
+
]
|
|
105
165
|
},
|
|
106
166
|
{
|
|
107
167
|
"id": "disabled",
|
|
108
168
|
"sourcePath": "skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md",
|
|
109
169
|
"anchor": "reference:ziguanjia-disabled-capabilities.md",
|
|
110
170
|
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
111
|
-
"mapsToOperations": [
|
|
112
|
-
|
|
171
|
+
"mapsToOperations": [
|
|
172
|
+
"asset.transfer",
|
|
173
|
+
"asset.approve",
|
|
174
|
+
"asset.file.upload"
|
|
175
|
+
],
|
|
176
|
+
"mapsToReferences": [
|
|
177
|
+
"references/ziguanjia-disabled-capabilities.md"
|
|
178
|
+
]
|
|
113
179
|
}
|
|
114
180
|
],
|
|
115
181
|
"operationImpact": {
|
|
@@ -133,7 +199,11 @@
|
|
|
133
199
|
"asset.purch",
|
|
134
200
|
"asset.depre"
|
|
135
201
|
],
|
|
136
|
-
"withheld": [
|
|
202
|
+
"withheld": [
|
|
203
|
+
"asset.transfer",
|
|
204
|
+
"asset.approve",
|
|
205
|
+
"asset.file.upload"
|
|
206
|
+
],
|
|
137
207
|
"changed": [],
|
|
138
208
|
"removed": []
|
|
139
209
|
},
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: weaver-skill-detector
|
|
3
|
+
display_name: 泛微技能检测工具
|
|
4
|
+
display_name_en: Weaver Skill Detector
|
|
5
|
+
description: '泛微技能检测工具:对 skill 素材(zip/md/目录)做静态质检,判断是否符合 WorkBuddy 规范且通过泛微专属安全合规质检。默认检测范围 = 泛微专属(WV)+ WorkBuddy 平台(WB)+ 通用质量/安全;千问(QwenWork)规范仅在用户明确说明上架千问时用 --platform qwenwork 显式启用,不得主动检测。'
|
|
6
|
+
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,用户没说千问就默认不走千问规则。'
|
|
7
|
+
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.'
|
|
8
|
+
version: 1.1.2
|
|
9
|
+
author: 泛微网络科技股份有限公司
|
|
10
|
+
agent_created: true
|
|
11
|
+
license: MIT
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# 泛微技能检测工具
|
|
15
|
+
|
|
16
|
+
对用户提交的 skill 素材(`.zip` 压缩包 / `.md` 文件 / 目录)做**静态质检**,判断是否为合格的 WorkBuddy skill,
|
|
17
|
+
并拦截泛微场景下对外分发的高危风险(尤其是「默认登录地址指向泛微自用系统」这一红线)。
|
|
18
|
+
|
|
19
|
+
## 适用场景
|
|
20
|
+
|
|
21
|
+
- 用户发来一个 `.zip`(声称是 skill 包)或 `.md`(声称是 SKILL.md / skill 文档),问「这个符不符合规范 / 是不是合格 skill」。
|
|
22
|
+
- 在把自研 skill 上传到 skillbub / 市场 / 分发给客户**之前**,做一次合规与安全扫描。
|
|
23
|
+
- 收到他人提交的 Weaver 系 skill,需要快速识别其中的硬编码 IP、凭证、默认系统地址等风险。
|
|
24
|
+
|
|
25
|
+
## 重要约束(务必遵守)
|
|
26
|
+
|
|
27
|
+
1. **本工具只做静态分析,绝不连接任何线上 Weaver / e-cology 系统。** 不要为了「验证」被检测 skill 而去实际请求任何系统地址。
|
|
28
|
+
2. **绝不给默认系统地址。** 若被分析的 skill 需要系统地址用于联调,必须要求用户显式提供其**自有域名**;
|
|
29
|
+
检测结果与工具本身都不得默认指向 e-cology.com.cn 等泛微自用域名。
|
|
30
|
+
3. 检测结论基于静态规则,可能存在误报(尤其 IP / 凭证为启发式 WARN),输出时标注严重程度与依据,便于人工复核。
|
|
31
|
+
|
|
32
|
+
## 检测流程
|
|
33
|
+
|
|
34
|
+
### 第 1 步:确认输入类型并准备源码
|
|
35
|
+
|
|
36
|
+
接受三种输入,统一交给脚本处理:
|
|
37
|
+
- `.zip` 压缩包 → 解包到临时目录(已做路径穿越防护)后定位 `SKILL.md`。
|
|
38
|
+
- `.md` / `.markdown` 单文件 → 视作 `SKILL.md` 候选,临时承载。
|
|
39
|
+
- 目录 → 直接扫描。
|
|
40
|
+
|
|
41
|
+
> 若压缩包内含多层目录(如外层 `weaver-xxx/`),脚本会自动递归查找 `SKILL.md`。
|
|
42
|
+
|
|
43
|
+
### 第 2 步:运行检测脚本
|
|
44
|
+
|
|
45
|
+
使用本地 Python 运行(优先用托管运行时,避免污染用户环境):
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
/Users/tangbin/.workbuddy/binaries/python/versions/3.13.12/bin/python3 \
|
|
49
|
+
<skill_dir>/scripts/validate_skill.py <用户提供的zip|.md|目录路径> [--json] [--out report.md] [--html report.html] [--market-live] [--market-catalog catalog.json] [--no-html]
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- **默认自动输出 HTML 报告**:每次检测默认生成美观的 HTML 报告到「输入同目录/<输入名>-report.html」(如 `a.zip` → `a-report.html`;目录输入 → 同级 `<目录名>-report.html`),控制台会打印「HTML 报告已写出: <路径>」。头部展示 **Skill 基础信息(MD5 / SHA256 / 文件大小)**、**技能能力清单**与**依赖的其他技能**标签云(独立胶囊圈选,仅展示 `weaver-` 前缀依赖),正文含各维度检测结果(威胁模型视图、行为图谱已按需求停用)。
|
|
53
|
+
- 不带参数时打印**可读报告**(含每项 ✅/❌/⚠️ 状态、命中位置、修复建议)。
|
|
54
|
+
- `--json` 输出结构化结果,便于二次处理(HTML 报告仍默认生成;配合 `--no-html` 可只留 JSON)。
|
|
55
|
+
- `--out report.md` 将报告落盘。
|
|
56
|
+
- `--html report.html` 自定义 HTML 报告输出路径(默认路径规则见上,显式传参时以此为准)。
|
|
57
|
+
- `--no-html` 完全关闭 HTML 输出(仅控制台/JSON,不落 HTML 文件)。
|
|
58
|
+
- `--market-live`(推荐,**动态联网核查**):自动联网查询 skillhub.cn 市场,为每个 **`weaver-e10-` 前缀**依赖实时标注 **市场可搜(带跳转链接)/ 市场未收录 / 核查失败**,非 `weaver-e10-` 前缀依赖标注 **跳过核查**。判定基于技能 `slug` 精确匹配(避免子串误命中,如 `weaver-e10-login` 不会误判 `weaver-e10-jucailin`)。无需任何写死的清单文件。
|
|
59
|
+
- `--market-catalog catalog.json`(可选离线快照):不联网时传入「市场已收录技能清单」标注可达性,作为 `--market-live` 的离线替代。清单支持「列表」(`["a","b"]`,均为可搜)或「对象」(`{"a":true,"b":false}` 或富对象 `{"a":{"found":true,"market":"skillhub.cn","url":"..."}}`)。
|
|
60
|
+
- `--platform weaver|qwenwork`(**平台规范切换,默认 `weaver`**):
|
|
61
|
+
- `weaver`(默认):泛微生态规范,**既有行为完全不变**(`name` 必须 `weaver` 前缀、`display_name` 须以「泛微」开头、`author` 锁定为「泛微网络科技股份有限公司」等)。
|
|
62
|
+
- `qwenwork`:千问办公生态规范,启用千问专属硬性规则(见下方「千问模式」章节);同时**放宽**泛微品牌类约束(不强求 `weaver` 前缀、不锁 author)。
|
|
63
|
+
|
|
64
|
+
> ### ⚠️ 默认检测范围(重要·调度规则)
|
|
65
|
+
>
|
|
66
|
+
> **默认 = 泛微专属(WV)+ WorkBuddy 平台(WB)+ 通用质量/安全**,即 `weaver` 模式。
|
|
67
|
+
>
|
|
68
|
+
> **不要主动启用千问模式。** 仅当用户在需求里**明确说明**是「上架千问 / 千问办公 / QwenWork / 千问市场」时,才追加 `--platform qwenwork`。
|
|
69
|
+
>
|
|
70
|
+
> 以下表述一律按**默认 `weaver` 模式**执行,**不加** `--platform qwenwork`:
|
|
71
|
+
> 「检测一下这个 skill」「检查能不能上架」「提交 skillhub / 技能市场」「比赛投稿 / 大赛提交」「发布前体检」「泛微上架」……
|
|
72
|
+
>
|
|
73
|
+
> 判断口诀:**用户没说千问,就不是千问。** 若不确定,按默认模式跑;确有需要时向用户确认,而不是默认把千问规则加上去。
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# 默认模式(绝大多数场景直接这样跑,不需要 --platform)
|
|
77
|
+
/Users/tangbin/.workbuddy/binaries/python/versions/3.13.12/bin/python3 \
|
|
78
|
+
<skill_dir>/scripts/validate_skill.py ./my-skill.zip
|
|
79
|
+
|
|
80
|
+
# 千问模式(仅当用户明确说明要上千问办公市场时才用)
|
|
81
|
+
/Users/tangbin/.workbuddy/binaries/python/versions/3.13.12/bin/python3 \
|
|
82
|
+
<skill_dir>/scripts/validate_skill.py ./my-skill.zip --platform qwenwork
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
脚本退出码:`0`=通过/WARN,`1`=FAIL,`2`=输入非法。
|
|
86
|
+
|
|
87
|
+
### 第 3 步:解读结果
|
|
88
|
+
|
|
89
|
+
脚本按五份维度输出(详见 `references/checklist.md`):
|
|
90
|
+
|
|
91
|
+
#### 约束归属:WB(平台)、WV(泛微)、QW(千问)
|
|
92
|
+
|
|
93
|
+
检测项分属三套来源不同的规范,**违反后果不同,排查对象也不同**(详见 `references/checklist.md` 第 0 节):
|
|
94
|
+
|
|
95
|
+
| 归属 | 含义 | 约束对象 | 违反后果 |
|
|
96
|
+
|---|---|---|---|
|
|
97
|
+
| **WB** | WorkBuddy 平台约束(skillhub.cn 加载器与上传校验,对齐官方 `expert-reviewer`) | 任何作者的 skill,与是否泛微无关 | 平台直接拒收/加载异常,无协商空间 |
|
|
98
|
+
| **WV** | 泛微专属约束(品牌规范、E10 账号与接口调用契约、安全合规红线) | 泛微对外发布/上架/比赛提交的 skill | 平台不拦,但泛微内部发布门禁不放行 |
|
|
99
|
+
| **WB+WV** | 叠加 | 同上 | 任一层不满足即失败 |
|
|
100
|
+
| **QW** | 千问办公平台约束(千问生态接入开发指南,需 `--platform qwenwork` 显式启用) | 要上架千问办公市场的 skill | 千问平台直接拒收 |
|
|
101
|
+
| **QW+WB** | 千问独有约束,且与 WorkBuddy 通用要求共存 | 同上 | 任一层不满足即失败 |
|
|
102
|
+
| **QW+WV** | 同一 skill 既要上千问又要上泛微时的叠加约束 | 双平台上架的 skill | 取两者更严者 |
|
|
103
|
+
|
|
104
|
+
**一句话区分:WB = 平台收不收;WV = 泛微放不放;QW = 千问收不收。**
|
|
105
|
+
|
|
106
|
+
速查:**WB** → A1、A1a–A1e、A2、A2n、A3–A11c、A13、A14、G02–G04c、C08、BOM、CRLF、Q1–Q4b、E1、C1–C8、D1–D3;
|
|
107
|
+
**WV** → A2m、A4b、A8b–A8e、A12、B1–B10c;
|
|
108
|
+
**WB+WV** → A8f(`version`:平台要 SemVer,泛微要顶层)、E2(平台关注 dependencies,泛微只认 `weaver-e10-` 前缀);
|
|
109
|
+
**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(连接器就绪性契约)。
|
|
110
|
+
|
|
111
|
+
#### 千问模式(`--platform qwenwork`)—— 按需启用,非默认
|
|
112
|
+
|
|
113
|
+
> **触发前提:用户明确说明要上架千问办公市场。** 未说明时一律用默认 `weaver` 模式,
|
|
114
|
+
> 千问的 11 条专属规则(A1c′/A1f/A4′/A5f/A5g/A5h/A6c/A6e/A6f/A11d/B11)**一条都不会执行**,
|
|
115
|
+
> 报告中也不会出现任何 QW 归属项与 QW 图例——默认报告保持「泛微 + WorkBuddy + 通用」的原有形态。
|
|
116
|
+
|
|
117
|
+
千问与泛微的 frontmatter 字段名不一致,工具内置**字段别名映射**自动适配(见下表);泛微模式行为完全不变。
|
|
118
|
+
|
|
119
|
+
| 语义 | 泛微(`weaver`)字段名 | 千问(`qwenwork`)字段名 |
|
|
120
|
+
|---|---|---|
|
|
121
|
+
| 中文展示名 | `display_name`(须以「泛微」开头) | `displayName`(无前缀要求) |
|
|
122
|
+
| 英文展示名 | `display_name_en` | `name_en` |
|
|
123
|
+
| 中文描述 | `description_zh` | `description`(直接是中文) |
|
|
124
|
+
| 英文描述 | `description_en` | `description_en` |
|
|
125
|
+
| 发布方 | `author`(锁定为「泛微网络科技股份有限公司」) | `author_name`(表单字段,市场列表展示) |
|
|
126
|
+
| 唯一标识 | `name`(必须 `weaver` 前缀) | `name`(无品牌前缀要求) |
|
|
127
|
+
|
|
128
|
+
千问专属硬性规则(BLOCK):
|
|
129
|
+
|
|
130
|
+
1. **A1c′ 条目数 < 1000**:包内文件总数上限 999(泛微模式仍为 ≤ 300)。
|
|
131
|
+
2. **A1f zip ≤ 10 MB**:读取**真实归档文件体积**(zip/md 输入为权威值;目录输入无归档可测,降级为「包内文件合计」并在结论中标注为近似值)。
|
|
132
|
+
3. **A4′ `<name>/SKILL.md` 精确路径**:zip 输入用原始 namelist 精确比对;目录输入校验「SKILL.md 所在目录名 == `name`」。这是千问最高频失败原因——macOS Finder 右键「压缩 N 项」只会得到裸 `SKILL.md`,必须 `zip -r x.zip <name>/`(带外层目录一起压)。
|
|
133
|
+
4. **A5f `displayName` 必填**(≤ 255 字符)、**A5g `author_name` 必填**、**A5h `argument-hint` 推荐但不阻断**。
|
|
134
|
+
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`)。
|
|
135
|
+
6. **A6e `icon` 必填且为公网 URL**(规格 240*240,仅校验声明不下载)。
|
|
136
|
+
7. **A11d 正文 ≤ 64 KB**:超出部分在市场详情页会被截断(不影响上传成功,但首屏体验劣化)。
|
|
137
|
+
8. **B11 连接器就绪性契约**:技能若声明依赖连接器(`qwenwork.settings.connector.<类别>.<id>`),必须先用 `qw_query` 查询就绪状态,并处理 401/403 / token 失效回退到授权引导(Step 0);否则 BLOCK。
|
|
138
|
+
|
|
139
|
+
**A-1. 基础合规 · WorkBuddy 平台约束(WB)**
|
|
140
|
+
SKILL.md 存在、frontmatter 完整、
|
|
141
|
+
**`name` 命名规范(BLOCK)**:仅小写字母(a-z)、数字(0-9)和连字符(-),不允许大写/下划线/空格/中文/特殊字符;不能以 `-` 开头或结尾,不允许连续 `--`;长度必须 3-64 个字符、
|
|
142
|
+
**`description` 长度 1-1024(BLOCK)**:不能为空,超过 1024 字符判 FAIL、
|
|
143
|
+
**frontmatter YAML 语法真解析(A2n, BLOCK)**:平台用真 YAML 解析器解析 frontmatter,语法错误直接报「frontmatter 无法解析 / mapping values are not allowed in this context」拒收。高频触发:一行挤多个键值对(粘贴丢换行)、值中含未加引号的冒号+空格、Tab 缩进。装有 PyYAML 时真解析精确报行号,未装则降级启发式扫描、
|
|
144
|
+
目录名与 name 一致、无模板占位符残留、正文充实等。
|
|
145
|
+
|
|
146
|
+
**A-2. 基础合规 · 泛微生态约束(WV,平台不强制但泛微一律不放行)**
|
|
147
|
+
**`name` 必须以 `weaver` 开头(BLOCK)**、
|
|
148
|
+
**`display_name` 必填且以「泛微」开头(BLOCK)**、
|
|
149
|
+
**`display_name_en` 必填(BLOCK)**、
|
|
150
|
+
**`description_zh` 必填(BLOCK)**、
|
|
151
|
+
**`description_en` 必填(BLOCK)**、
|
|
152
|
+
**`version` 必须为顶层字段(BLOCK)**:平台只要求 SemVer(三段纯数字,如 `1.0.0`,不支持 `v1.0`/`1.0`/`latest`),泛微额外要求**必须顶层**,不允许 `metadata.version` 嵌套;上架市场时版本号须严格大于已发布版本、
|
|
153
|
+
**`author` 必须为「泛微网络科技股份有限公司」(BLOCK,缺失或不符即 FAIL)**、
|
|
154
|
+
**frontmatter 全部字段必须为顶层(BLOCK)**:`name`/`version`/`author`/`description` 等均写在顶层,**不允许 `metadata:` 嵌套块**(如 `metadata:\n author: ...`)——嵌套写法视为字段缺失,直接判 FAIL;仅空 `metadata:` 或嵌套非关键字段判 WARN。
|
|
155
|
+
另含 **正文行数 ≤ 500(WARN)**:SKILL.md 正文建议控制在 500 行以内,内容过多时拆分为 references/ 目录下的独立文件。
|
|
156
|
+
另含 **引用相对路径规范(WARN)**:正文引用其他文件必须使用相对 Skills 根目录的路径(如 references/api-docs.md、scripts/main.py 的形式),禁止反斜杠分隔与非系统类绝对路径,且资源目录下的引用文件须真实存在于包内;运行时系统路径(/tmp/、/Users/ 等)与占位符示例自动豁免。
|
|
157
|
+
另含 **A1a Windows 反斜杠路径分隔符(BLOCK,仅 zip 输入)**:基于 zip 原始条目名检查,任一 zip 条目路径含 `\`(如 `weaver-e10-doc\operations\`)即判 FAIL——skillhub 校验跑在 Unix,反斜杠会被视为文件名非法/不安全字符,整包标记「文件路径不安全」。须用 `zip -r xxx.zip xxx/` 或 7-Zip「标准 zip」模式重打,勿用 Windows 资源管理器拖拽。目录输入不触发此项(无法从 OS 路径推断打包后的 zip 路径)。
|
|
158
|
+
另含 **A1b 目录层级不超过两级(BLOCK)**:Skill 包仅支持 `根目录/二级目录/文件` 结构。以 SKILL.md 所在目录为 skill 根,任一文件相对深度 > 2(三级及以上子目录,如 `references/attend/xxx.md`)即判 FAIL——平台解析会异常。须把模块子目录拍平(`references/<模块>/<文件>` → `references/<文件>`)或提升模块目录为 references 同级。
|
|
159
|
+
另含 **A1c 文件总数 ≤ 300(BLOCK)**:包内(含任意层级、含隐藏/缓存文件)文件总数超过 300 即判 FAIL——平台上传硬性上限,超限直接拒收。须清理 `__pycache__`、`.DS_Store`、临时产物或拆分体积。
|
|
160
|
+
另含 **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/`)一律判违规。
|
|
161
|
+
另含 **A1e SKILL.md 文件名大小写精确(BLOCK)**:入口文件名必须精确为 `SKILL.md`(首字母大写、后缀全大写 MD),不允许 `skill.md` / `Skill.md` / `Skill.MD` 等任何大小写变体。平台/工具以区分大小写方式匹配入口文件名,变体不会被识别为 skill 入口,等于「无 SKILL.md」。变体单独存在 → 直接 BLOCK 并提示重命名为 `SKILL.md`;与精确 `SKILL.md` 并存 → 同样 BLOCK 提示删除多余变体。
|
|
162
|
+
另含 **A2 结构化文件可解析性(BLOCK)**:包内所有 `.json`/`.yaml`/`.yml`/`.toml` 文件必须可正常解析,格式错误会导致平台加载 skill 时直接报错。
|
|
163
|
+
另含 **A3 依赖引导完整性(WARN)**:若包内含 `scripts/`/`bin/`/`package.json`/`requirements.txt` 等依赖声明,须在 SKILL.md 或 references/ 中提供安装/使用说明。
|
|
164
|
+
|
|
165
|
+
**B. 专项质检(泛微合规与安全,全部为 WV)—— 红线**
|
|
166
|
+
- **B1 默认登录地址未指向泛微自用系统(BLOCK)**:严禁把 `e-cology.com.cn` / `weaver.com.cn` / `eteams.cn` 等泛微自用域名写死为默认地址。
|
|
167
|
+
- **B2 无硬编码真实 IP(HIGH)**:真实服务器 IP 必须脱敏为占位符。
|
|
168
|
+
- **B3 无硬编码凭证(HIGH)**:密码 / token / secret 不得字面量写死,须走 E10 命名凭据插件。
|
|
169
|
+
- **B4 凭证应通过插件获取(MEDIUM)**:涉及 Weaver API 时说明用 E10 插件(如 `key=ETEAMSID`)。
|
|
170
|
+
- **B5 敏感词占位规范(INFO)**:建议复用 `-替换敏感词占位符-`。
|
|
171
|
+
- **B6/B7/B8**:子进程调用、命令行传凭证、硬编码密钥解密本地凭证。
|
|
172
|
+
- **B9 API 请求凭证完整性(BLOCK)**:skill 发起对外 API 请求时,必须同时携带 ① Cookie 完整原始串(禁止裁剪/去重/改写)② eteamsid ③ User-Agent(AgentType=<agentType>,IsAgent=true),三条缺一不可;Cookie 被 split / dict / 切片改写时另计 WARN。
|
|
173
|
+
- **B10 E10 接口型技能「登录 + 凭证」契约(BLOCK,仅 `weaver-e10-` 前缀技能生效,`weaver-e10-login` 自身豁免)**:
|
|
174
|
+
- **B10a 登录必须走登录 skill**:E10 接口型技能必须依赖 `weaver-e10-login`——需在 frontmatter `dependencies` 声明,或在正文/脚本中引用 `weaver-e10-login` / `e10-login` CLI / `E10_LOGIN_ENTRY`。无任何登录 skill 依赖证据即阻断。
|
|
175
|
+
- **B10b 禁止自建登录**:不得自行实现登录流程(Playwright / Selenium / Puppeteer 自动登录、扫码登录、账号密码登录、自建 OAuth 取 token),会话必须统一由登录 skill 提供。
|
|
176
|
+
- **B10c 接口文档须声明完整凭证**:文档型(无脚本)E10 技能若描述了接口请求(curl 示例 / `GET|POST /path` / 请求头 / 接口地址),必须在文档中明确请求头携带 ① Cookie 完整原始串 ② eteamsid ③ User-Agent(AgentType=...,IsAgent=true);脚本型技能由 B9 覆盖,不重复判定。
|
|
177
|
+
- 触发前提:存在 API 表面(脚本内真实 HTTP 调用,或文档中的接口请求描述)。纯规范/UI 类 E10 技能(无接口描述)自动跳过,不误伤。
|
|
178
|
+
|
|
179
|
+
**G. 扩展安全(WB,对齐官方 expert-reviewer G 组)**
|
|
180
|
+
- **G02 无危险 shell 命令(HIGH)**:检测 `rm -rf /`、`curl|sh`、`sudo`、`chmod 777`、`dd`、fork bomb 等(否定语境豁免)。
|
|
181
|
+
- **G03 无内网域名残留(MEDIUM)**:检测 `*.woa.com`/`*.tencent.com`/`*.internal`/`*.local` 等通用内网域名(泛微自用域名由 B1 覆盖)。
|
|
182
|
+
- **G04a 无开发者个人路径残留(MEDIUM)**:检测 `/Users/xxx/`、`/home/xxx/`、`C:\Users\xxx\` 等个人路径。
|
|
183
|
+
- **G04b 无 IDE/平台配置目录残留(LOW)**:检测 `.vscode/`/`.idea/`/`.cursor/`/`.DS_Store` 等不应出现在发布包中的文件。
|
|
184
|
+
- **G04c CDN 依赖版本锁定(MEDIUM)**:检测 `cdn.jsdelivr.net/.../@latest` 等未锁定版本的 CDN 引用。
|
|
185
|
+
- **C08 无平台虚假技术承诺(MEDIUM)**:检测「本地AI」「离线运行」「不上云」「数据不出本机」等与平台运行方式不符的承诺。
|
|
186
|
+
- **BOM 头残留(LOW)**:检测 UTF-8 BOM(EF BB BF),可能导致 YAML frontmatter 解析失败。
|
|
187
|
+
- **CRLF 行尾(LOW)**:检测 Windows CRLF 行尾,跨平台分发时可能导致脚本执行异常。
|
|
188
|
+
|
|
189
|
+
**Q. 质量评估(WB,启发式,对齐官方 expert-reviewer Q 组)**
|
|
190
|
+
- **Q1 路由触发清晰度(LOW)**:SKILL.md 是否有明确的触发场景/关键词描述(如「当用户」「适用场景」「trigger」)。
|
|
191
|
+
- **Q2 上下文效率(LOW)**:检测 >100KB 的超大 Markdown 文件,影响 Agent 上下文窗口效率。
|
|
192
|
+
- **Q3 容错降级(LOW)**:包内含脚本时检查是否有 try/catch/except 等错误处理逻辑。
|
|
193
|
+
- **Q4 字段字数控制(LOW)**:`display_name` ≤20 字、`description` ≤200 字(一句话概述),详细内容放 `description_zh`/`description_en`。
|
|
194
|
+
|
|
195
|
+
**C. 威胁捕获模型视图(WB)**
|
|
196
|
+
8 类风险卡片网格(供应链 / 命令执行 / 网络请求与数据外传 / 文件操作与敏感路径 / Prompt 注入
|
|
197
|
+
/ 远程脚本下载执行 / 可疑编码/混淆 / 其他安全风险);每张卡片附三个引擎 chip —— **行为安全**
|
|
198
|
+
(按 status 着色,绿/橙/红)+ **AI 引擎**(紫色,扫描器自身作为 AI 引擎对外披露)+ **静态引擎**
|
|
199
|
+
(命中=蓝,未命中=灰)。
|
|
200
|
+
|
|
201
|
+
**D. 威胁行为图谱解析(WB)**
|
|
202
|
+
针对具体跨文件/跨行行为的联合检测,渲染为「顶部四 tab + 详情卡片」:
|
|
203
|
+
- 四个 tab:**全部引擎结果(N)** / **检出恶意(N)** / **检出可疑(N)** / **评估安全(N)**;
|
|
204
|
+
- 每条规则一张卡片,含三个引擎 chip、明确结论描述与深色等宽日志块(绿色 ✓ + `文件:行 → 代码` 命中)。
|
|
205
|
+
原覆盖三类行为:
|
|
206
|
+
- D1 `dangerouslyDisableSandbox` + `run_in_background` 绕过权限确认(HIGH)
|
|
207
|
+
- D2 浏览器启动参数关闭沙箱(HIGH)
|
|
208
|
+
- D3 提示词诱导用户明文粘贴 `ETEAMSID` / `token` / `session` 等会话凭证(HIGH)
|
|
209
|
+
|
|
210
|
+
**E. 技能能力清单(WB)**
|
|
211
|
+
透明列出识别到的运行时能力:HTTP 请求、调用外部 API、读取文件、写入文件、安装依赖包、
|
|
212
|
+
控制浏览器、读取环境变量、执行系统命令、数据库访问、网络监听 / Socket / WebSocket 等。
|
|
213
|
+
|
|
214
|
+
**E2. 依赖的其他技能(WB+WV)**
|
|
215
|
+
透明列出显式声明或文档引用的其他技能(**仅检测 `weaver-e10-` 前缀**的泛微生态技能,非 weaver-e10- 前缀一律不识别):frontmatter `dependencies` / `requires` / `depends_on` /
|
|
216
|
+
`skills` / `uses`(内联或 YAML 块列表)、description 中「由 xxx 提供/负责」、主 SKILL.md 中
|
|
217
|
+
`skill: "xxx"` / `/斜杠命令` /「使用 xxx 技能」表述;自动跳过自身与常见路径/占位符片段。
|
|
218
|
+
`weaver-ebuilder-*`、`weaver-openserver-*`、`e10-login`、`eteams-*` 等内部模块/平台引用**不算** skill 依赖,不做市场核查。
|
|
219
|
+
|
|
220
|
+
市场可达性标注(推荐 `--market-live` 动态核查):**仅对 `weaver-e10-` 前缀的依赖**实时查询 skillhub.cn 并标注
|
|
221
|
+
**市场可搜**(带跳转链接,消费方可直接获取)/ **市场未收录**(市场未上架,需随包另行分发)/
|
|
222
|
+
**核查失败**(联网异常,需手动核实);非 `weaver-e10-` 前缀依赖(如 `weaver-ebuilder-*`、`e10-login`,多为内部引用/误报)
|
|
223
|
+
统一标注 **跳过核查**,不做市场可达性判断,避免噪音。匹配规则为 `slug` 精确相等,避免子串误命中。
|
|
224
|
+
用途:在分发/评审前快速判断被依赖技能「消费方能否自行获取」,避免上架后因依赖缺失而无法联动。
|
|
225
|
+
离线场景可用 `--market-catalog catalog.json` 快照替代。
|
|
226
|
+
|
|
227
|
+
**综合判定**:存在任意 BLOCK 级 FAIL → FAIL(不通过);否则有 WARN → WARN(通过建议修复);全 PASS → PASS。
|
|
228
|
+
|
|
229
|
+
### 第 4 步:给出处置建议
|
|
230
|
+
|
|
231
|
+
- **FAIL**:逐条列出阻断项与高危项,给出具体修复动作(去掉默认地址、脱敏 IP、改走插件凭证等),请用户修复后复检。
|
|
232
|
+
- **WARN**:提示可在发布前优化的项(命名、占位残留、凭证来源说明)。
|
|
233
|
+
- **PASS**:确认合格,可进入分发/提交流程。
|
|
234
|
+
|
|
235
|
+
## 资源
|
|
236
|
+
|
|
237
|
+
- `scripts/validate_skill.py` — 核心静态检测脚本(接收 zip/.md/目录,输出报告)。
|
|
238
|
+
- `references/checklist.md` — 完整检测项、判定标准与红线说明。
|
|
239
|
+
|
|
240
|
+
## Notes
|
|
241
|
+
|
|
242
|
+
- 单 `.md` 文件无法校验「目录名与 name 一致」(A9),该场景下标注为 INFO 跳过。
|
|
243
|
+
- IP / 凭证检测为启发式 WARN,可能误报;请以脚本给出的「命中位置」人工确认。
|
|
244
|
+
- 如需新增检测规则(如特定敏感词库、其他泛微域名),直接扩展 `validate_skill.py` 中的常量与对应检测函数,并同步更新 `references/checklist.md`。
|
|
245
|
+
- **平台切换只影响字段与阈值,不影响安全类检测**:`--platform` 仅调整「结构/字段/打包阈值」类规则;威胁模型、行为图谱、硬编码 IP/凭证、E10 登录契约等安全检测在两种模式下都跑。
|
|
246
|
+
- **超大包扫描性能**:工具对参与扫描的单文件截断到 `MAX_SCAN_FILE_BYTES`(4 MB)、单行截断到 `SCAN_LINE_MAX_CHARS`(4000 字符)后再做正则匹配。原因是部分路径正则含可回溯量词,在超长单行(压缩 JS、无换行数据文件)上会退化成准 O(n²)——实测 11 MB 单行曾让扫描卡死 180 秒以上,截断后同一用例 8 秒内完成。截断只丢弃超长行尾部,行号一一对应,正常代码行远小于阈值,检测结论不受影响。
|
|
247
|
+
- **写正则的硬约束(改动 `validate_skill.py` 时务必遵守)**:逐行扫描的正则必须**先锚定字面量 token**,再向后做「有界尾部 + 定界」校验;**禁止** `[^\s'\"]*` 这类无界量词,也**禁止** `[^\s'\"]{0,N}` 这种「可空/通配前缀 + 有界量词」写法——后者会让引擎在每个起点试 N 种前缀长度,1.6 MB 单行实测需 90+ 秒。
|
|
248
|
+
|
|
249
|
+
## 版本历史
|
|
250
|
+
|
|
251
|
+
- **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)同步更新。
|
|
252
|
+
- **1.1.1**(2026-09-01):依赖检测支持 `--market-live` 动态联网核查 skillhub.cn,按 `slug` 精确匹配标注市场可达性;非 `weaver-` 前缀依赖标注跳过核查。
|
|
253
|
+
- **1.1.0**(2026-09-01):依赖检测初版,识别 `weaver-` 前缀技能并离线声明依赖来源。
|