weaver-work-cli 0.1.26 → 0.1.29

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 (163) hide show
  1. package/README.md +7 -2
  2. package/dist/cmd/setup/index.js +1 -1
  3. package/dist/internal/e10/auth/commands.js +1 -6
  4. package/dist/internal/e10/auth/messages.js +3 -0
  5. package/dist/internal/e10/auth/session.js +8 -0
  6. package/dist/internal/e10/auth-recovery.js +148 -0
  7. package/dist/internal/e10/client.js +47 -15
  8. package/dist/internal/e10/context.js +8 -8
  9. package/dist/internal/e10/index.js +1 -0
  10. package/dist/internal/e10/request-runtime.js +51 -9
  11. package/dist/shortcuts/archive/host.js +3 -2
  12. package/dist/shortcuts/archive/manifest.js +1 -1
  13. package/dist/shortcuts/archive-oa/host.js +2 -1
  14. package/dist/shortcuts/archive-oa/manifest.js +1 -1
  15. package/dist/shortcuts/asset/host.js +7 -6
  16. package/dist/shortcuts/blog/host.js +4 -3
  17. package/dist/shortcuts/caizhilian/host.js +3 -2
  18. package/dist/shortcuts/caizhilian/manifest.js +1 -1
  19. package/dist/shortcuts/calendar/host.js +2 -1
  20. package/dist/shortcuts/contract/host.js +34 -59
  21. package/dist/shortcuts/ehr/host.js +2 -1
  22. package/dist/shortcuts/esb/host.js +2 -1
  23. package/dist/shortcuts/fna/host.js +6 -3
  24. package/dist/shortcuts/fna/manifest.js +10 -5
  25. package/dist/shortcuts/fna/operations/expense-chart.js +162 -0
  26. package/dist/shortcuts/fna/operations/registry.js +2 -0
  27. package/dist/shortcuts/hrm/host.js +2 -1
  28. package/dist/shortcuts/im/host.js +3 -2
  29. package/dist/shortcuts/invoice/host.js +9 -7
  30. package/dist/shortcuts/invoice/manifest.js +23 -142
  31. package/dist/shortcuts/invoice/operations/issuing-qys.js +266 -203
  32. package/dist/shortcuts/invoice/operations/registry.js +1 -6
  33. package/dist/shortcuts/jiuchuanhui/host.js +2 -1
  34. package/dist/shortcuts/mail/host.js +2 -1
  35. package/dist/shortcuts/meeting/host.js +2 -1
  36. package/dist/shortcuts/meeting/operations/eb/conflict.js +78 -12
  37. package/dist/shortcuts/okr/host.js +2 -1
  38. package/dist/shortcuts/plan/host.js +2 -1
  39. package/dist/shortcuts/project/host.js +2 -1
  40. package/dist/shortcuts/workflow/host.js +3 -5
  41. package/dist/shortcuts/workflow/index.js +4 -1
  42. package/dist/shortcuts/workflow/operations/chatscene.js +4 -22
  43. package/dist/shortcuts/workflow/operations/form.js +281 -166
  44. package/dist/shortcuts/workflow/operations/read.js +39 -8
  45. package/dist/shortcuts/workflow/operations/registry.js +2 -0
  46. package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +331 -0
  47. package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +133 -0
  48. package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +326 -0
  49. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +113 -0
  50. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +259 -0
  51. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoListRows.js +64 -0
  52. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoOutputPlanner.js +28 -0
  53. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.aggregate.js +70 -0
  54. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +267 -0
  55. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +392 -0
  56. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +165 -0
  57. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +448 -0
  58. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +348 -0
  59. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +222 -0
  60. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +66 -0
  61. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +502 -0
  62. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +540 -0
  63. package/dist/shortcuts/workflow/stdout-compact.js +7 -0
  64. package/docs/SKILL.md +1 -1
  65. package/docs/_catalog.md +2 -1
  66. package/docs/agent-invoice.md +1 -1
  67. package/docs/caizhilian.md +1 -1
  68. package/docs/e10-auth.md +1 -1
  69. package/docs/fna.md +7 -3
  70. package/docs/invoice.md +4 -6
  71. package/docs/todo-smart-convert/README.md +171 -0
  72. package/docs/todo-smart-convert/data-contract.md +236 -0
  73. package/docs/todo-smart-convert/mock/ai-todo-query-target.json +209 -0
  74. package/docs/todo-smart-convert/subgroup-rules.md +245 -0
  75. package/package.json +1 -1
  76. package/scripts/package-skill.mjs +1 -1
  77. package/skill-template/business-info.json +4 -1
  78. package/skill-template/domains/caizhilian.md +2 -1
  79. package/skill-template/domains/qiyecheng.md +1 -0
  80. package/skill-template/domains/yepiaotong.md +6 -2
  81. package/skill-template/skill-template.md +1 -0
  82. package/skills/weaver-e10-blog/SKILL.md +6 -1
  83. package/skills/weaver-e10-blog/references/blog-query.md +3 -1
  84. package/skills/weaver-e10-caizhilian/SKILL.md +18 -9
  85. package/skills/weaver-e10-caizhilian/references/action-flow.md +70 -0
  86. package/skills/weaver-e10-caizhilian/references/agent-entry.md +6 -2
  87. package/skills/weaver-e10-caizhilian/references/auth-and-install.md +207 -0
  88. package/skills/weaver-e10-caizhilian/references/file-collection.md +56 -54
  89. package/skills/weaver-e10-caizhilian/references/file-upload.md +4 -4
  90. package/skills/weaver-e10-caizhilian/references/host-executor-prompt.md +32 -0
  91. package/skills/weaver-e10-caizhilian/references/host-platform-integration.md +46 -0
  92. package/skills/weaver-e10-caizhilian/references/rule-index.md +56 -0
  93. package/skills/weaver-e10-caizhilian/references/setting-attach.md +5 -16
  94. package/skills/weaver-e10-caizhilian/references/setting-backup.md +4 -13
  95. package/skills/weaver-e10-caizhilian/references/setting-encrypt.md +6 -15
  96. package/skills/weaver-e10-caizhilian/references/setting-storage-docs-summary.md +126 -0
  97. package/skills/weaver-e10-caizhilian/references/setting-storage-field-map.md +57 -0
  98. package/skills/weaver-e10-caizhilian/references/setting-storage.md +142 -482
  99. package/skills/weaver-e10-caizhilian/references/source-manifest.json +7 -7
  100. package/skills/weaver-e10-caizhilian/references/task-workflow.md +87 -0
  101. package/skills/weaver-e10-caizhilian/references/withheld.md +2 -2
  102. package/skills/weaver-e10-caizhilian/references/write-protocol.md +7 -0
  103. package/skills/weaver-e10-calendar/SKILL.md +6 -1
  104. package/skills/weaver-e10-esb/SKILL.md +8 -0
  105. package/skills/weaver-e10-esb/references/input-format.md +3 -1
  106. package/skills/weaver-e10-esb/references/source-manifest.json +5 -5
  107. package/skills/weaver-e10-hrm/SKILL.md +6 -1
  108. package/skills/weaver-e10-hrm/references/employee.md +1 -1
  109. package/skills/weaver-e10-hrm/references/org.md +1 -1
  110. package/skills/weaver-e10-hrm/references/position.md +1 -1
  111. package/skills/weaver-e10-jinchengda/SKILL.md +2 -1
  112. package/skills/weaver-e10-jinchengda/references/contract-agent-entry.md +1 -1
  113. package/skills/weaver-e10-jiuchuanhui/SKILL.md +6 -1
  114. package/skills/weaver-e10-jucailin/SKILL.md +6 -1
  115. package/skills/weaver-e10-jucailin/references/hr-contact.md +1 -1
  116. package/skills/weaver-e10-jucailin/references/salary.md +1 -1
  117. package/skills/weaver-e10-mail/SKILL.md +6 -1
  118. package/skills/weaver-e10-meeting/SKILL.md +11 -6
  119. package/skills/weaver-e10-meeting/references/meeting-eb.md +7 -3
  120. package/skills/weaver-e10-meeting/references/meeting-queries.md +3 -1
  121. package/skills/weaver-e10-meeting/references/meeting-verification.md +4 -2
  122. package/skills/weaver-e10-okr/SKILL.md +6 -1
  123. package/skills/weaver-e10-okr/references/source-manifest.json +5 -5
  124. package/skills/weaver-e10-plan/SKILL.md +6 -1
  125. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +3 -1
  126. package/skills/weaver-e10-plan/references/plan-report-query.md +3 -1
  127. package/skills/weaver-e10-plan/references/source-manifest.json +7 -7
  128. package/skills/weaver-e10-qiyecheng/SKILL.md +16 -6
  129. package/skills/weaver-e10-qiyecheng/references/catalog.md +6 -3
  130. package/skills/weaver-e10-qiyecheng/references/expense-center.md +2 -0
  131. package/skills/weaver-e10-qiyecheng/references/expense-chart.md +78 -0
  132. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +87 -33
  133. package/skills/weaver-e10-shared/SKILL.md +37 -14
  134. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +11 -8
  135. package/skills/weaver-e10-shared/references/non-interactive-environment.md +4 -4
  136. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +3 -1
  137. package/skills/weaver-e10-wenshuding/SKILL.md +6 -1
  138. package/skills/weaver-e10-wenshuding/references/source-manifest.json +3 -3
  139. package/skills/weaver-e10-workflow/SKILL.md +23 -1
  140. package/skills/weaver-e10-workflow/references/source-manifest.json +1 -2
  141. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +282 -0
  142. package/skills/weaver-e10-workflow/references/workflow-create.md +30 -55
  143. package/skills/weaver-e10-workflow/scripts/todo-summary.cjs +695 -0
  144. package/skills/weaver-e10-yepiaotong/SKILL.md +19 -17
  145. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +75 -78
  146. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +179 -0
  147. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +238 -0
  148. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +7 -7
  149. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +11 -5
  150. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +55 -33
  151. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +102 -23
  152. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +1 -1
  153. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +53 -42
  154. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +94 -214
  155. package/skills/weaver-e10-yimiaoban/SKILL.md +9 -2
  156. package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +1 -1
  157. package/skills/weaver-e10-yimiaoban/references/msg-read.md +1 -1
  158. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +9 -9
  159. package/skills/weaver-e10-ziguanjia/SKILL.md +6 -1
  160. package/dist/shortcuts/invoice/operations/issuing.js +0 -198
  161. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +0 -161
  162. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-qys-ledger.md +0 -66
  163. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +0 -107
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: weaver-setting-storage
3
- description: "对话式修改**两级**文件存储设置: - **系统级**:租户平台(<your-tenant-platform-domain>/tenant/tenant/doc/storageSet)— 影响所有租户 - **租户级**:后台管理中心(<your-e10-domain> 文件设置 → 存储设置)— 只影响当前租户 通过自然语言 / `storage list / show / test / rule set / rule order / rule open / rule add / rule delete / instance add / instance delete` 即可 完成 GET 拉取 → diff 让用户确认 → POST 落库。鉴权使用三件套(ETEAMSID + authToken + freepass token)加 randomkey,两个 level 都走 /papi/。 Use for 系统存储设置、租户平台存储设置、租户后台存储设置、文件存储规则、业务规则、静态规则、默认规则、 子目录、压缩存储、加密存储、SM4、nginx 配置。"
3
+ description: "对话式查改文件存储设置(系统级 + 租户级):存储实例只读查询,存储规则(业务/静态/默认/子规则)的查询、保存、启停、排序与删除。字段语义见 setting-storage-field-map.md,目录架构与存储方案见 setting-storage-docs-summary.md。Use for 系统存储设置、租户平台存储设置、租户后台存储设置、文件存储规则、业务规则、静态规则、默认规则、子目录、压缩存储、加密存储、SM4、nginx 配置。"
4
4
  license: Proprietary
5
- compatibility: 泛微E10采知连配套使用,内部可自由使用与修改,禁止对外分发
5
+ compatibility: 泛微E10采知连配套使用,随 weaver-e10-caizhilian 技能分发
6
6
  metadata:
7
7
  maintainer: unknown
8
8
  type: capability
@@ -11,369 +11,126 @@ metadata:
11
11
  tags: [存储设置, 系统存储, 租户存储, 存储规则, 业务规则, 静态规则, 压缩存储, 加密存储]
12
12
  ---
13
13
 
14
- # weaver-setting-storage
14
+ # 文件存储设置(系统级 + 租户级)
15
15
 
16
- 让"文件存储设置"页(**系统级** + **租户级**)**用对话就能查 + 改**。背后调 papi 接口(两个 level 都走 papi):
16
+ 让「文件存储设置」用对话就能查 + 改:查当前值 → 列差异让用户确认 → 写入 → 回读校验。写操作一律走 prepare → apply(见 `write-protocol.md`)。
17
17
 
18
- ### 系统级(papi + all_teams)
19
- - 存储实例:`/papi/file/storage/listStorageInstance` / `getStorageInstance` / `testConnect`
20
- - 存储规则:`/papi/file/storage/rule/frontComp/ruleForm` / `rule/saveData` / `rule/saveOrder` / `rule/saveOpen` / `rule/search`
21
- - 浏览器辅助:`/papi/file/common/browser/associate/storageInstance`
22
- - **鉴权**:三件套
18
+ ## 认证前置(必须)
23
19
 
24
- ### 租户级(papi + 当前租户)
25
- - 存储实例:`/papi/file/storage/listStorageInstance` / `getStorageInstance` / `testConnect`
26
- - 存储规则:`/papi/file/storage/rule/frontComp/ruleForm` / `rule/saveData` / `rule/delete` / `rule/frontComp/ruleTable`
27
- - 浏览器辅助:`/papi/file/common/browser/{associate,complete,history}/{storageInstance,module}`(前端用,agent 对话式不需要)
28
- - **鉴权**:三件套(与 system 级相同)
20
+ 本模块通过 CLI 托管的认证获取凭证(base_url + Cookie + eteamsid + User-Agent),凭证契约见 `auth-and-install.md`,不依赖手动配置文件,Agent 不得自己读取或输出凭证。
29
21
 
30
- ### 鉴权(三件套,所有 papi 接口通用)
22
+ **使用前必须确保**:
31
23
 
32
- 业务接口需要同时带:
24
+ 1. CLI 已安装:`weaver-work-cli --version` 能正常输出版本号
25
+ 2. 已完成登录:`weaver-work-cli auth status` 显示已登录
33
26
 
34
- - **Cookie**(E10 后台 `<your-e10-domain>` 域):
35
- - `ETEAMSID=<id>`(如 `PCACCOUNT_xxx-xxx`)
36
- - `authToken=<JWT>`(eyJ 开头)
37
- - `LOGIN_TYPE=pc_account` / `langId=7` / `langType=zh_CN`(辅助,不严格校验)
38
- - **URL query**:
39
- - `token=<freepass token>`(从 `/sp/file/SysStorageSet/freepass?token=xxx` 来的,32 字符 hex)
40
- - `wea_link_keep_freepass=1`(免登标志)
41
- - `tenant_langType=zh_CN`
42
- - `randomkey_<6 chars>=<6 chars>`(CSRF 防护,每次请求生成一对)
27
+ **登录与登录失效处理**:读取 `auth-and-install.md`,由 Agent 复用任务开始时的宿主判定,禁止调用任何其他登录 Skill。明确为 XiaoE 时只执行 `weaver-work-cli auth xiaoe`,失败即停止且不得改走浏览器;非 XiaoE 时先取得用户确认的真实 E10 域名,再执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
43
28
 
44
- > 之前的 `listPageToken.data.token` 跟 freepass token **不一定是同一个**——listPageToken 是租户平台管理类
45
- > 接口用的,E10 后台业务接口用 freepass token。
29
+ ## 两个层级(改之前先确认)
46
30
 
47
- 修改前先 diff,**写操作必走对话确认**;CLI 走 GET 拉当前值 → merge 子字段 → diff → POST 落库 → GET 校验。
31
+ | 层级 | 入口页面 | 影响范围 |
32
+ |---|---|---|
33
+ | **系统级** | 租户平台(`<your-tenant-platform-domain>/tenant/tenant/doc/storageSet`) | 所有租户(公共业务目录) |
34
+ | **租户级** | 后台管理中心(`<your-e10-domain>` 文件设置 → 存储设置) | 仅当前租户,可覆盖系统级 |
35
+
36
+ - 用户**没明说改哪一级时必须主动问**,不能假设。
37
+ - 用户分不清时按上表解释:系统级 = 给所有租户统一落点;租户级 = 单租户特殊化(例如某个租户文件量大单独挂云存储)。
38
+ - 两个层级都通过同一组操作处理,`rule.save` 的 `default_rule` 标明是否默认规则。
48
39
 
49
40
  ## When to use
50
41
 
51
- - 用户说"看一下系统存了哪些存储""默认规则是什么""改一下业务规则路径""恢复系统默认"
52
- - 改租户平台"文件存储设置"页(`<your-tenant-platform-domain>/tenant/tenant/doc/storageSet`,系统级 / all_teams)
53
- - 改后台管理中心"文件设置 → 存储设置"页(`<your-e10-domain>`,租户级 / 当前租户)
54
- - 改业务/静态/默认规则
42
+ - 用户说「看一下存了哪些存储」「默认规则是什么」「改一下业务规则路径」
43
+ - 改系统级(租户平台「文件存储设置」)或租户级(后台「文件设置 → 存储设置」)的业务/静态/默认规则
55
44
  - 解释存储实例类型(本地/腾讯云/阿里云/华为云/S3/FastDFS/HDFS)的字段差异
56
- - 解释"子目录 / 压缩存储 / 加密存储 / 文件来源 / 规则顺序 / nginx 配置"的语义
45
+ - 解释「子目录 / 压缩存储 / 加密存储 / 文件来源 / 规则顺序 / nginx 配置」的语义
57
46
 
58
47
  **不适用**:
59
48
 
60
- - 附件设置 → `weaver-setting-attach`
61
- - 加解密设置 → `weaver-setting-encrypt`
62
- - 备份设置 → `weaver-setting-backup`
63
- - **存储实例的写操作**(新增/修改/删除实例)—— 实例是「系统级只读」,
64
- 改实例要进 E10 后台"系统级存储"页面
49
+ - 附件设置 → `setting-attach.md`;加解密设置 → `setting-encrypt.md`;备份设置 → `setting-backup.md`
50
+ - **存储实例的写操作**(新增/修改/删除实例)与连通性测试——当前只支持实例只读查询,改实例要引导用户进后台「系统级存储」页面
51
+ - 恢复系统默认规则、静态规则的「同步到 nginx」——同样引导后台页面操作
65
52
 
66
- ## 命令清单
53
+ ## 操作清单
67
54
 
68
- > **知识库参考**:目录架构 / 7 种存储类型 / 4 种方案推荐 / 清理说明,可参考文件服务知识库的「文件存储」目录;客户对话时按本文命令清单对应执行即可。
69
- >
70
- > **话术参考**:13 大场景的话术示例(对话式规则 1-10 + 操作回执 + 概念解释 + 错误兜底),按本文对话式规则组织即可,无需外部模板。
55
+ 命令形式见 SKILL.md:`weaver-work-cli --json caizhilian run caizhilian.setting-storage.<操作> --input-json '<json>'`。
71
56
 
72
- CLI 软链名 `storage`(避开 setting-attach/encrypt/backup 的 `setting-*` 系列)。
57
+ | 操作 | 作用 | 类型 |
58
+ |---|---|---|
59
+ | `instance.list` | 列存储实例 | 只读 |
60
+ | `instance.get` | 实例详情(敏感字段自动掩码) | 只读 |
61
+ | `rule.form` | 拉规则表单(不传 `id` 为默认规则) | 只读 |
62
+ | `rule.table` | 拉规则表 | 只读 |
63
+ | `rule.search` | 高级搜索规则(`conditions` + 可选 `rule_type`) | 只读 |
64
+ | `rule.save` | 保存规则(改字段或新建子规则,`rule_info_list` + `default_rule`) | 写 |
65
+ | `rule.enable` | 启用/停用规则(`rule_info_list` 含 `id`、`openStatus`) | 写 |
66
+ | `rule.order` | 改规则顺序(`rule_ids` 按顺序) | 写 |
67
+ | `rule.delete` | 删除子规则(`rule_ids`) | 写 |
73
68
 
74
- **所有命令共享**:`--config <name>` 必填;`--local` 可选(强制标记本地环境,关闭自动 login 和自动 fetch);`--level system|tenant` 可选(强制选层级,不传按 baseUrl 域名自动判断);`--token <value>` 可选(临时覆盖 .env.local 里的 `FREEPASS_TOKEN`);
75
- `--auth-token <value>` 可选(临时覆盖 .env.local 里的 `AUTH_TOKEN`)。
69
+ 写操作都分 `.prepare` / `.apply` 两步,确认协议见 `write-protocol.md`。
76
70
 
77
- | 命令 | 作用 | 适用 |
78
- |---|---|---|
79
- | `storage login --config <name> [--base-url <url>]` | 起 Chrome + 登录页 + 让用户从租户平台点"进入 E10 后台文件存储设置"链接 → 跳到 `/sp/file/SysStorageSet/freepass?token=xxx` → 自动抓 ETEAMSID + authToken + freepass token 三件套落盘。<br>**本地**:不自动起 Chrome,提示手动配三件套。 | both |
80
- | `storage env --config <name> [--local] [--level]` | 打印当前 config 解析结果(含 `env_type` / `level` / `token` 状态) | both |
81
- | `storage list --config <name> [--page 1] [--size 20]` | 列存储实例 | both |
82
- | `storage show <instance_id> --config <name>` | 单实例详情(7 类字段全展开,accessKey 自动 mask) | both |
83
- | `storage test <instance_id> --config <name>` | 测试某实例连接 | both |
84
- | `storage rule show --config <name> [--default] [--id <ruleId>]` | 拉规则详情(系统级同时返回业务+静态;租户级只返回业务) | both |
85
- | `storage rule list --config <name> [--name <kw>]` | 高级搜索规则列表 | both |
86
- | `storage rule set --config <name> (--default \| --id N) --item k=v [--item ...] [--rule-type 0\|1] [--dry-run] [--yes]` | 改规则:GET → merge → diff → 询问 → POST → 校验。<br>**租户级不支持 `--rule-type 1`(静态规则)**。 | both(rule-type 1 仅 system) |
87
- | `storage rule add --config <name> --name <X> --source <id\|name> --source-type {0\|1\|2\|3} --instance <id> --sub-dir {1..5} [--storage-path] [--algorithm SM4] [--on\|--off] [--compressed] [--encrypted] --yes` | **新建子规则**:走 `POST /api/file/storage/rule/saveData` ADD 路径,传 `ruleInfoList` 含 1 条不带 id 的 `StoRuleInfo`。 | both |
88
- | `storage rule order --config <name> --ids 1,2,3 [--yes]` | 改规则顺序 | system(租户级可调但意义小) |
89
- | `storage rule delete --config <name> --id <ruleId> --yes` | **删除子规则**:走 `POST /api/file/storage/rule/delete` 删一条子规则。 | both |
90
- | `storage rule open --config <name> --id N (--on \| --off) [--yes]` | 启用/停用某条 | both |
91
- | `storage rule reset-default --config <name> --yes` | 恢复系统默认 | system only(租户级没有"系统默认"可恢复) |
92
- | `storage explain <field\|type\|concept>` | 解释某字段/存储类型/概念,**不调任何接口** | both |
93
-
94
- ## 13 个支持字段(rule 子字段,CLI 接受 3 种写法)
95
-
96
- snake-case 别名 / 中文别名 / DTO 字段名(驼峰)。完整别名见下方各字段说明。
97
-
98
- ### 通用(业务/静态都可用)
99
-
100
- | CLI key | DTO 字段 | 类型 | 备注 |
101
- |---|---|---|---|
102
- | `rule-name` | `ruleName` | str | 多语言字段 |
103
- | `rule-open` | `ruleOpen` | bool | true=启用 / false=停用 |
104
-
105
- ### 业务规则(`--rule-type 0`,默认)
106
-
107
- | CLI key | DTO 字段 | 类型 | 备注 |
108
- |---|---|---|---|
109
- | `storage-instance` | `storageInstanceId` | str | 业务文件落到哪个实例 |
110
- | `storage-path` | `storagePath` | str | 业务文件存储路径(相对 tenantKey) |
111
- | `file-source` | `fileSourceValue` | str | 文件来源 id 列表,逗号分隔 |
112
- | `file-source-type` | `fileSourceType` | enum | `-1`=默认 `0`=模块 `1`=目录 `2`=分部 `3`=部门 |
113
- | `sub-directory-type` | `subDirectoryType` | enum | `1`=年 `2`=月 `3`=天 `4`=部门 `5`=无 |
114
- | `compressed-storage` | `compressedStorage` | bool | 仅本地存储生效 |
115
- | `encrypted-storage` | `encryptedStorage` | bool | 仅本地存储,配套 `sys-file-algorithm` |
116
- | `sys-file-algorithm` | `sysFileAlgorithm` | str | 默认 `SM4` |
117
-
118
- ### 静态规则(`--rule-type 1`)
119
-
120
- | CLI key | DTO 字段 | 类型 | 备注 |
121
- |---|---|---|---|
122
- | `static-storage-instance` | `staticStorageInstanceId` | str | 静态资源落到哪个实例 |
123
- | `static-storage-path` | `staticStoragePath` | str | 静态资源路径/存储桶 |
124
- | `static-nginx-config` | `expandRuleConfig.staticNginxConfig` | str | nginx 配置(嵌套 JSON 子字段,CLI 子字段 merge) |
125
-
126
- ## 7 种存储类型
127
-
128
- CLI 改规则时"选存储实例"指的就是这些。完整字段差异见下表:
129
-
130
- | code | 名称 | 关键字段 |
131
- |---|---|---|
132
- | 0 | 本地存储 | `storagePath` |
133
- | 1 | 腾讯云 COS | `region` / `bucket` / `accessId` / `accessKey` / `endPoint` |
134
- | 2 | 阿里云 OSS | 同上 + `cname` |
135
- | 3 | 华为云 OBS | 同上 + `rootPath` |
136
- | 4 | S3 标准 | `region` / `bucket` / `accessId` / `accessKey` / `storageHost` / `pathStyle` / `rootPath` |
137
- | 5 | FastDFS | `trackerServers` / `downLoadHost` |
138
- | 6 | HDFS | `hdfsServerIp` / `hdfsServerPort` / `hdfsUserName` / `rootPath` |
71
+ ## 字段与概念
72
+
73
+ - **规则 13 个字段**(通用 2 + 业务 8 + 静态 3)与 DTO 键名、实例类型关键字段:`setting-storage-field-map.md`
74
+ - **目录架构(7 个标识)、7 种存储类型、4 种方案推荐、清理说明**:`setting-storage-docs-summary.md`
75
+ - 业务规则(ruleType=0)与静态规则(ruleType=1)字段集不同,保存时不要混用。
139
76
 
140
77
  ## 硬性门禁
141
78
 
142
- 1. **写操作必须先 diff** —— `rule set` 不带 `--dry-run` 也不带 `--yes` 时,把 diff
143
- 打到 stdout 并等 stdin 输入 `y` 才发 POST;EOF / `n` / 非 `y` 视为取消。
144
- **对话式 agent 流程**:即使 CLI 已带 `--yes`,**仍必须先在对话里走
145
- "改前值 / 改后影响 / 明确询问" 三步**(见对话式规则 4),得到
146
- "改 / 确认 / 好的" 之类回复后才调 CLI。
147
- 2. **环境必须显式** —— 不绑定默认环境;缺 `--config` 且无 ENV 兜底时报错退出。
148
- 3. **`prod` 必加 --yes** —— `--config prod` 时必须同时带 `--yes` 才会发 POST。
149
- 4. **业务规则 vs 静态规则字段互斥** —— `--rule-type 0`(业务,默认)只接受
150
- 业务/通用字段;`--rule-type 1`(静态)只接受静态/通用字段。CLI 在 parse 阶段
151
- 就拒,不发到后端。
152
- 5. **改完后 GET 校验** —— POST 完调一次 `ruleForm` 重拉,比对 expected 与服务端真实值。
153
- 6. **不写日志到 home 之外** —— 所有凭证 / 日志只落在
154
- 本技能的本地工作目录下。
155
- 7. **未指定子字段保留** —— CLI 走 GET 拉整对象再 merge;只改指定子字段,其它保留。
156
- 8. **租户平台实例写操作(add / delete)** —— CLI 走
157
- `instance add / delete` 改实例。**对象存储凭证必须嵌套 `storageConfigInfo` 字段**:
158
- - 顶层(`StorageInstanceConfigParam` 顶层):`instanceName / storagePath / storageState / instanceType / httpHttps`
159
- - 嵌套(`StorageConfigInfo` 实体):
160
- `bucket / region / accessId / accessKey / endPoint / rootPath / storageHost / pathStyle / cname / hdfsServerIp / hdfsServerPort / hdfsUserName / trackerServers / group / ...`
161
- - CLI 自动按字段名归类,调用方无需关心平铺/嵌套。**注意**:
162
- - 华为云 (`instanceType=3`) 的 `defaultField()` 不含 `REGION`(区域信息塞在 endPoint 里,形如 `obs.cn-north-4.myhuaweicloud.com`),后端会主动过滤掉 region,传了也白传。
163
- - 腾讯云/阿里云/华为云/S3 这四种"对象存储"的 `storagePath` 顶层字段**通常为空**(信息在 `bucket` 里),CLI 不校验。
164
- - **空壳实例 update 会触发后端异常**:实例配置为空时更新会失败,这是后端缺陷,CLI 不自动修。
165
- **解法**:新建一个不同名字的实例(避开空壳),或走 E10 二开流程修复空壳实例。
166
- 9. **license 检查** —— 没 `STORAGE_RULE` license 时 `ruleList` 直接返回空;
167
- CLI 会给 warning 但仍允许 POST(让后端真拒)。
168
- 10. **本地/远程分流** —— CLI 按 `BASE_URL` 自动判断:
169
- - `127.0.0.1` / `localhost` / `0.0.0.0` / `127.*` → **local**:不自动 login、不自动 fetch 三件套;缺三件套直接报错并提示用户填到 `.env.local`
170
- - 其它 → **remote**:`login` 自动起专用 Chrome 让用户登录 + 抓三件套;业务调用时从 `.env.local` 读
171
- - `--local` 可显式强制标记
172
- 11. **papi URL 必须拼三件套** —— 所有 papi 业务接口都要求:
173
- - URL query 拼 `token=<freepass token>` + `wea_link_keep_freepass=1` + `tenant_langType=zh_CN` + `randomkey_xxxx`(每次生成)
174
- - Cookie 设 `ETEAMSID` + `authToken`(JWT)
175
- - CLI 走 `_papi_qs(freepass_token, randomkey)` + `_session(eteams_id, auth_token)` 统一处理
176
- - **注意**:业务接口拼的是 freepass token;listPageToken 是租户平台管理类接口用的,两者不要混用
177
- 12. **系统级 vs 租户级分流** —— CLI 按 `BASE_URL` 域名自动判断 level(system/tenant),但**两个 level 的业务接口都是 `/papi/file/...`**:
178
- - `<your-tenant-platform-domain>` → **system**(系统级 / papi / all_teams / 需 sysStorageRule=true)
179
- - `<your-e10-domain>` → **tenant**(E10 后台 / papi / 当前租户 / 需 sysStorageRule=false)
180
- - 其它 → 保守默认 `system`
181
- - `--level system|tenant` 可显式强制
182
- 13. **租户级不支持静态规则** —— 后台管理中心只支持业务规则 + 默认规则;
183
- `--rule-type 1` 在 tenant 模式下 CLI 直接报"租户级没有静态规则"。
184
- 14. **agent 不得擅自新建 / 改 / 删数据绕开校验** ——
185
- 客户回执"好的"**只代表同意本次确认的字段和值**,**不代表**同意 agent 擅自做超出范围的操作(新建 / 修改 / 删除任何数据、修改任何环境配置、调整任何不在确认清单里的字段)。
186
- - **典型违规场景**:客户说"用默认存储实例" → 校验过不去 → agent 擅自新建一个存储实例(或新建一个测试实例)绕开校验 → **绝对禁止**
187
- - **正确做法**:
188
- 1. **停下来**,直接告诉客户失败原因(校验过不去的具体异常信息)
189
- 2. **列出 2-3 条可行路径**让客户选(换已有实例 / 客户在自己环境试 / 找二开修后端 bug),**不擅自造数据**
190
- 3. **不**为"测试验证"而新建任何数据(包括"临时"实例、"测试"子规则);实在需要验证,优先用 mock / 静态分析 / HAR 抓包
191
- - **判断标准**:客户没明确说"建一个新的" / "新建一个绕开" 时,agent **不要**主动做"新建 / 改 / 删"任何数据
192
- - **覆盖范围**:
193
- - 存储实例(不能擅自 `instance add` 绕开 `validateStorageInstance` 等校验)
194
- - 子规则(不能擅自 `rule add` 试各种 source-type 找能过的)
195
- - 任何其它写操作(instanceType / configInfo / rule / 备份规则 / 附件设置 / 加解密设置 都受这条约束)
196
- - **例外**(agent 可以自动做的):**只读**操作(`list / show / test / search / explain`)+ **已经在客户确认清单里的写操作**(客户明确"好的" + 已经在确认对话里列出了完整 payload)
197
- - **如果客户**明确说"你帮我建一个试一下" / "新建一个本地存储实例来跑测试" / "建一个空壳的看看能不能触发"——才算"客户明确同意新建",但仍建议 agent 在执行前再**简短复述一下"我建一个 X 实例,只用于测试,完事我会删"** 让客户二次确认
79
+ 1. **写操作必须先确认**——先把「改前值 / 改后影响 / 要改成什么」讲清楚,得到用户明确同意才执行 apply;用户回执「好的」只代表同意确认清单里的字段和值。
80
+ 2. **业务规则 vs 静态规则字段互斥**——`rule.save` 的 `rule_info_list` 里:业务规则只放业务/通用字段,静态规则只放静态/通用字段;混用属入参错误,不要发出去试探。
81
+ 3. **改完后回读校验**——保存后用 `rule.form`(或 `rule.table`)重拉,比对目标值与服务端真实值,不一致要明确报告未保存成功。
82
+ 4. **未指定子字段保留**——只改用户点名的字段,其它保持原值;不要「顺便」改。
83
+ 5. **license 未开时规则列表为空**——没有存储规则 license 时查询返回空、保存会被拒;引导用户找管理员开通,不要反复重试。
84
+ 6. **改默认规则会脱离系统默认**——改默认规则后不再继承系统初始化的默认存储实例;改之前必须提示这一点。当前没有一键恢复操作,需要回退时引导后台处理。
85
+ 7. **agent 不得擅自新建 / 改 / 删数据绕开校验**——
86
+ - **典型违规**:用户说「用默认存储实例」→ 校验过不去 → agent 擅自新建一个实例绕开校验 → **绝对禁止**
87
+ - **正确做法**:① 停下来,直接说明失败原因;② 列出 2-3 条可行路径让用户选(换已有实例 / 用户在自己环境试 / 走后台或二开处理),**不擅自造数据**;③ 不为「测试验证」新建任何数据(包括「临时」实例、「测试」子规则)
88
+ - **判断标准**:用户没明确说「建一个新的」时,不要主动做任何新建 / 修改 / 删除
89
+ - **例外**:只读查询 + 已在确认清单里的写操作可以执行;用户明确要求新建时,执行前简短复述「我建一个 X,只用于测试,完事我删」再二次确认
198
90
 
199
91
  ## 对话式交互规则
200
92
 
201
- > 这些是 **agent 在对话中使用本 skill 时**的硬约束,跟底层 CLI 脚本无关。命令行直接跑
202
- > `storage` 可以绕过,但任何经由本 skill 的 agent 流程都必须遵守。
203
-
204
- 1. **支持自定义环境链接**
205
- - 用户在对话里直接给出 `https://...` 形式的 baseUrl,**按这个 URL 走**,
206
- **不要**要求用户去改 `.env.local` 或加新 config
207
- - 落地方式:临时 `export WEILE_<NAME>_BASE_URL=<url>`,或 CLI 加 `--base-url <url>`
208
- - 凭证沿用现有 config;若该 URL 下无凭证,按规则 2 触发登录流程
209
- - 同一会话内多次操作复用同一 baseUrl,不要每次都让用户重输
210
- - **如果用户在内置浏览器里已经登录了对应页面**,可以直接用同一个浏览器的
211
- `ETEAMSID`(通过内置浏览器 DevTools / `Application > Cookies` 抓到),写到
212
- `.env.local` 即可跳过 `storage login` 流程
213
-
214
- 2. **操作前必查登录态 + 三件套**
215
- 每次 `list / show / test / rule *` 之前先确认对应 config 的 **三件套齐**:
216
- `ETEAMSID` + `authToken` + `freepass_token`(在 `.env.local` 里看 `WEILE_<NAME>_ETEAMSID` / `WEILE_<NAME>_AUTH_TOKEN` / `WEILE_<NAME>_FREEPASS_TOKEN`),
217
- 并按 level 选择登录入口:
218
- - **(0) 客户要求改存储时,先确认 level**:
219
- - **客户没明说必须主动问**,不能假设
220
- - **客户分不清 system/tenant 时**,告知两者的区别:
221
- - **系统级**(租户平台 `tenant.*`):改的是 `all_teams`,**影响所有租户**;改系统级业务规则 = 改所有租户业务文件最终落点
222
- - **租户级**(后台管理中心 `weapp.*`):改的是**当前租户**;改租户级规则 = 单租户覆盖
223
- - **场景区别**:改系统级 = 给所有租户统一;改租户级 = 单个租户特殊化(例如某个租户量特别大要单独挂云存储)
224
- - **入口区别**:系统级 = 租户平台 `<your-tenant-platform-domain>/.../storageSet`;租户级 = E10 后台 `<your-e10-domain> → 文件设置 → 存储设置`
225
- - **关键点**:两个 level 的业务接口**都走 `/papi/file/...`**(不要写成 `/api/...`)
226
- - **(1) 系统级**:先确认客户已**登录租户平台**(`<your-tenant-platform-domain>`);没登录就告知客户去登录或从浏览器 DevTools 拿三件套写到 `.env.local`
227
- - **(2) 租户级**:先确认客户已**登录 E10 后台**(`<your-e10-domain>`);三种走法:
228
- - 优先触发独立登录 skill(如 `weaver-im login`)
229
- - 或弹登录框让客户登录
230
- - 或客户提供三件套(DevTools 抓 `ETEAMSID` + `authToken` cookie + 任意 papi URL 上的 `token` query 参数)写到 `.env.local`
231
- - **(3) 优先复用已有登录 skill** — 若系统已装独立的 Weaver 登录入口(如
232
- `weaver-im login`、`weaver-file-dev-flow` 的登录阶段、或其他第三方
233
- "weaver-login" skill),**先 `skill({name: "..."})` 加载它走它的登录流程**,
234
- 拿到三件套落到 `WEILE_<NAME>_ETEAMSID` / `_AUTH_TOKEN` / `_FREEPASS_TOKEN` 后再继续
235
- - **(4) 复用内置浏览器** — 如果用户已在内置浏览器里登录了 weapp / tenant 域名,
236
- 从浏览器 DevTools 拿 `ETEAMSID` + `authToken` cookie 值 + 任意 papi URL 上的 `token` 参数
237
- 写到 `.env.local` 即可
238
- - **(5) 没有现成登录入口时** — 按 env_type 分流:
239
- - **远程**(baseUrl 不是 127.*/localhost/0.0.0.0):回落到本 skill 自带的
240
- `storage login`,起专用 Chrome 弹登录页 + 让用户从租户平台点"进入 E10 后台文件存储设置"
241
- 链接 → 跳到 `/sp/file/SysStorageSet/freepass?token=xxx` → 自动抓三件套全部落盘
242
- - **本地**(baseUrl 是 127.*/localhost/0.0.0.0):**不自动起 Chrome**,
243
- 直接提示用户在浏览器登录后从 DevTools 抓三件套复制到 `.env.local`:
244
- `WEILE_<NAME>_ETEAMSID` / `WEILE_<NAME>_AUTH_TOKEN` / `WEILE_<NAME>_FREEPASS_TOKEN`
245
- - **(6) 三件套齐全才发业务请求** — `Session.require_auth()` 会校验三件套;缺哪件报具体错误
246
- - **(7) 登录 / 三件套准备好后立即调 `storage list` 验证**,失败的话让客户重新登录 / 提供三件套
247
-
248
- 3. **查询要简洁**(`list / show / rule show` 时的输出格式)
249
- - **只返回三样**:**真实租户名**(系统级不区分租户,可省)、
250
- 设置项名(中文别名或 DTO 字段名)、当前值
251
- - **不要**返回:bool 三态展开、enum 解释、字段语义说明、风险提示、
252
- "建议/可以这么做" 等附加内容 —— 这些只在用户追问时再说
253
- - 多项查询时一行一项,格式固定:
254
-
255
- ```
256
- <租户名或「系统级」> · <设置项名>:<当前值>
257
- ```
258
-
259
- 4. **修改前必须三步问清**
260
- - 步骤 a — **改前的值**:说清楚这一项当前是什么(从 GET 里取,不要瞎猜)
261
- - 步骤 b — **改后影响**:说清楚改完会影响什么业务、放行/禁止哪些场景、
262
- 触及哪些用户,以及是否会**间接影响其他字段**(如 `encrypted-storage=true`
263
- 后 `sys-file-algorithm` 才生效;改默认规则会脱离系统默认)
264
- - 步骤 c — **明确询问**:用一句话问"要改成 X 吗?",**得到用户肯定回复
265
- (y / 改 / 确认 / 好的 之类)才发 POST**,即使 CLI 已带 `--yes` 也不许跳过
266
- - 三步可以一次消息里说全,但步骤 c 的问句**必须独立成行**,不能藏在
267
- 长段落里让人找不到
268
-
269
- 5. **话术面向客户(非开发)**
270
- 本 skill 的对话对象是**客户/业务人员**,不是开发。所有输出话术:
271
- - **禁止出现**:CLI key(`rule-name`、`storage-instance` 等)、DTO 字段名
272
- (`ruleName`、`storageInstanceId` 等)、布尔字面值(`true` / `false`)、
273
- HTTP 术语(POST / GET / 200 / 401)、内部流程术语("步骤 a / 步骤 b / 步骤 c"、
274
- "diff"、"回 y / 改"、"落库")、内部命令(`storage rule set`、`--item`)
275
- - **必须使用**:业务中文名("业务规则"、"默认规则"、"存储实例"、"子目录")、
276
- 业务状态("已启用 / 已停用")、自然语言确认("要改吗?回 改 / 确认 / 好的")
277
- - 需要看技术细节时(用户主动问"用的什么字段" / "接口是啥" / "为什么改不了"),
278
- **只在该轮回应**展开,平时一律隐藏
279
- - 身份信息隐藏 `userId` / `tenantKey` / `ETEAMSID` 这类内部 ID,只说"当前租户"
280
- 或"系统级"
281
- - 可选自检:输出话术前自查一遍合规性
282
-
283
- 6. **做不到时正确引导**
284
- 客户要改的项**当前工具/接口改不了**时,**不要**静默截断、**不要**发注定失败
285
- 的请求。常见场景:
286
- - **租户平台实例是系统级只读**:客户说"我想新建一个本地存储实例" →
287
- CLI 没法做。引导客户去 E10 后台"系统级存储 → 新建",在那边建完再来
288
- 改业务规则里选这个新实例
289
- - **license 没开**:租户没 `STORAGE_RULE` license 时 `ruleList` 返回空,
290
- 改规则会失败。引导客户找管理员开 license
291
- - **三件套拿不到**:远程环境 `storage login` 失败时,引导客户
292
- `storage login --config <name>` 重新登录;或手动从浏览器 DevTools 抓三件套
293
- 写到 `WEILE_<NAME>_ETEAMSID` + `WEILE_<NAME>_AUTH_TOKEN` + `WEILE_<NAME>_FREEPASS_TOKEN`
294
- —— 注意:token 来自 freepass 入口 URL(`/sp/file/SysStorageSet/freepass?token=xxx`),
295
- 不是 listPageToken 响应
296
- - **字段间依赖**:
297
- - `encrypted-storage=true` 但 `sys-file-algorithm` 为空 → CLI 自动填 `SM4`(门禁)
298
- - 业务规则下 `sub-directory-type=4`(按部门)但没分部 license → 后端会拒
299
- - 静态规则 `static-nginx-config` 改完还要"同步到 nginx 服务器"才能生效
300
- → 引导客户去 E10 后台"系统级存储 → 静态文件规则"点"同步"按钮
301
- - **改默认规则的副作用**:脱离系统默认(前端弹窗原话),要回退用
302
- `storage rule reset-default`
303
- - **后端返回致命错误**(已知):不重试,直接告诉客户失败原因 + 正确路径
304
- - 话术模板:
305
- "这里改不了:<原因>。需要去<正确路径>那里先做<前置操作>。
306
- 在那边保存后,回到这里再让我帮你改存储设置里的对应项,
307
- 就能改到你想要的值了。"
308
-
309
- 7. **改存储规则前:先列当前所有项 + 逐项说明,按 level 分流**
310
- 改存储规则时按 level 走不同流程,**都先列当前所有项再问客户改哪些**:
311
-
312
- **A. 系统级**(租户平台):
313
- - 调 `storage rule show --default` 拉出"**业务文件存储规则**" + "**静态文件存储规则**"两套全部当前值
314
- - 把每一项用**业务中文名**列出来(参考 `setting-storage-docs-summary.md` 第 1 节"7 个标识目录"和 `setting-storage-field-map.md` 13 个字段),并**逐项说明这一项是控制什么的**(业务含义 + 改了会影响哪些业务)
315
- - **只**改客户说想改的项;其它项保持原值(门禁 7:未指定子字段保留)
316
- - 不要在列出当前值的同时"顺便"推荐改某项;客户没问就不主动建议
317
-
318
- **B. 租户级**(E10 后台管理中心):
319
- - 调 `storage rule show --default` 拉**当前租户的默认存储规则**详细信息(含里面挂的存储实例的【名称 / 类型 / 启用状态】)
320
- - 调 `storage rule list` 拉**当前租户的所有存储子规则**(`--name` 可选模糊),**每条规则都要给客户展示完整详情**:
321
- - 规则名称 / 启用状态 / 文件来源 / 子目录类型
322
- - **这条规则挂的存储实例的【名称 / 类型 / 启用状态】**(客户要知道这条规则最终落到哪个实例)
323
- - 然后告诉客户"默认规则 + N 条子规则"的全景,问要改哪条
324
- - 改的是"默认规则" → 调 `storage rule set --default --item ...`
325
- - 改的是"子规则 id=N" → 调 `storage rule set --id N --item ...`
326
- - **绝不**只看默认规则就跳过子规则——子规则可能"挂的实例"跟默认规则完全不一样(按文件来源分部)
327
-
328
- **C. 租户级 新建子规则**(前端不是固定 6 字段,是按存储实例类型动态显示):
329
- - **走 `storage rule add` CLI**(不是 `rule set`),走 `POST /api/file/storage/rule/saveData` ADD 路径——传 `ruleInfoList` 含 1 条**不带 id** 的 `StoRuleInfo`
330
- - **前端"新建存储规则"页面字段是动态的,按"存储实例"类型切换**(是否本地存储决定压缩/加密等字段显隐):
331
- - **基础 6 字段(无论选什么存储实例都显示)**:
332
- - 规则名
333
- - 文件来源(前端只让用户选"模块 / 文件夹"两种,分部/部门已被隐藏)
334
- - 存储实例
335
- - 存储路径
336
- - 子目录
337
- - 启用
338
- - **本地存储 专属字段**(选了本地存储才出现):
339
- - **压缩存储**(`compressedStorage` Switch 开关)
340
- - **加密存储**(`encryptedStorage` Switch 开关)
341
- - **加密算法**(`sysFileAlgorithm`,开了"加密存储"才出现,是个 Icon 按钮点开弹窗选,默认 `SM4`,可选 `AES-256`)
342
- - **非本地存储(腾讯 / 阿里 / 华为 / S3 / FastDFS / HDFS)**:基础 6 字段,**不**显示压缩/加密/算法(云存储不需要)
343
- - **前端动态显隐逻辑**:
344
- ```ts
345
- if ('storageInstance' in value) {
346
- const instanceType = value.storageInstance[0]?.instanceType;
347
- const isNotLocal = instanceType !== InstanceType.LOCAL;
348
- // 存储路径,子目录,压缩存储,加密存储 在非本地存储下需要隐藏
349
- ['compressedStorage', 'encryptedStorage'].forEach(filedKey => formStore.setHide(filedKey, isNotLocal))
350
- // 本地存储 且还没选择子目录时 子目录页默认更新为 "按【天】生成子目录"
351
- if (!formStore.getFormDatas()?.subDirectoryType && !isNotLocal) {
352
- formStore.updateDatas({subDirectoryType: '2'});
353
- }
354
- }
355
- ```
356
- - **字段数量不是固定的**:选了本地存储就多出压缩/加密/算法 3 个。**正确认知**:基础 6 + 选了本地再加 2-3 个 = 6~9 字段之间
357
- - **`fileSourceType` 实际值是 1/2/3/4**(1=模块 2=文件夹 3=分部 4=部门 -1=默认,不要写成 0/1/2/3):
358
- - `fileSourceType=1`(模块):`fileSourceValue` = **moduleFlag 英文**(如 `"document"`),不是模块中文名"文档"——后端 `searchModuleStrToEntry` 用它去 `fileModuleBrowser.getModuleMap()` 里查,
359
- 找不到就 `filter(Objects::nonNull)` 静默丢弃
360
- - `fileSourceType=2`(文件夹):`fileSourceValue` = **文档中心目录 id**(数字字符串,多个用逗号分隔)
361
- - `fileSourceType=3`(分部):`fileSourceValue` = **分部 id**(数字)
362
- - `fileSourceType=4`(部门):`fileSourceValue` = **部门 id**(数字)
363
- - **`fileSourceValue` 怎么传值**(前端 + 后端双向验证):
364
- - **前端 Browser(type=module)** 调 `/api/file/common/browser/complete/module` 拿 `Map<moduleFlag, moduleName>`,每条 module 包装成 `{id: moduleFlag, title: moduleFlag, content: moduleName}`(HAR 实测确认)
365
- - 前端保存时把选中项按 id 拼接 —— **id = moduleFlag 英文**,不是中文 moduleName
366
- - **后端按模块映射表解析**:**找到就按 moduleFlag 入库,找不到就静默丢弃**
367
- - **反推**:传中文 moduleName(如"文档")→ 映射表找不到 → 被丢弃 → 看似保存成功但 `fileSourceValue` 入库为空
368
- - **给必填值的话术**(含本地存储专属字段):
369
- - 基础 6 字段:规则名 / 文件来源 / 存储实例 / 存储路径 / 子目录 / 启用
370
- - **如果选本地存储**:追加问"压缩存储"开不开(默认关)+ "加密存储"开不开(默认关)+ 开了加密就问"加密算法"(默认 `SM4`,可选 `AES-256`)
371
- - **如果选云存储**:不追问压缩/加密/算法
372
- - **模块对应关系速查表**(基于常见模块整理,跨租户可能有出入):
373
-
374
- | 业务中文名 | moduleFlag(英文) |
93
+ 1. **查询要简洁**
94
+ - 只返回三样:层级(系统级 / 当前租户)、设置项名(业务中文名)、当前值
95
+ - 不要主动展开 enum 解释、字段语义、风险提示、建议——用户追问再说
96
+ - 多项查询一行一项:`<层级> · <设置项名>:<当前值>`
97
+
98
+ 2. **修改前必须三步问清**
99
+ - **改前的值**:说清这一项当前是什么(从查询结果取,不猜测)
100
+ - **改后影响**:说清改完影响什么业务、是否连带影响其他字段(如开启加密存储后加密算法才生效;改默认规则会脱离系统默认)
101
+ - **明确询问**:一句话问「要改成 X 吗?」,**得到肯定回复才执行**;问句独立成行,不藏在长段落里
102
+ - 三步可以在一条消息里说全,但询问句必须独立成行
103
+
104
+ 3. **话术面向客户(非开发)**
105
+ - 禁止出现:DTO 字段名、布尔字面值、HTTP 术语、内部命令与操作 ID
106
+ - 必须使用:业务中文名(「业务规则」「默认规则」「存储实例」「子目录」)、业务状态(「已启用 / 已停用」)、自然语言确认
107
+ - 隐藏内部 ID(用户 ID / 租户标识 / 会话凭证),只说「当前租户」或「系统级」
108
+
109
+ 4. **做不到时正确引导**(不要静默截断,不要发注定失败的请求)
110
+ - **实例是只读的**:用户要新建/改存储实例 → 引导去后台「系统级存储」页面,建完再来改业务规则里选这个新实例
111
+ - **license 没开**:规则列表为空、保存失败 → 引导找管理员开 license
112
+ - **字段间依赖**:开启加密存储但算法为空 → 默认按 SM4;子目录「按部门」需要对应 license,否则后端拒绝;静态规则的 nginx 配置改完还要在后台「静态文件规则」点「同步」才生效
113
+ - **改默认规则的副作用**:脱离系统默认继承,改前提示
114
+ - **后端返回致命错误**:不重试,直接告诉用户失败原因 + 正确路径
115
+ - 话术模板:「这里改不了:<原因>。需要去<正确路径>那里先做<前置操作>。在那边保存后,回到这里再让我帮你改存储设置里的对应项,就能改到你想要的值了。」
116
+
117
+ 5. **改存储规则前:先列当前所有项 + 逐项说明**
118
+ - 先拉当前规则(系统级用 `rule.form` 看默认业务 + 静态两套;租户级用 `rule.form` 看默认规则、`rule.table` / `rule.search` 看全部子规则),**每条规则都要展示完整详情**:规则名称 / 启用状态 / 文件来源 / 子目录类型 / 挂的存储实例(名称 / 类型 / 启用状态)
119
+ - 用**业务中文名**逐项说明这一项控制什么、改了影响哪些业务(参考 `setting-storage-docs-summary.md` 第 1 节「7 个标识目录」和 `setting-storage-field-map.md` 13 个字段)
120
+ - **只**改用户点名的项;其它保持原值;列出当前值时不要「顺便」推荐改动
121
+ - **绝不**只看默认规则就跳过子规则——子规则挂的实例可能跟默认规则完全不一样(按文件来源覆盖)
122
+
123
+ 6. **新建子规则的字段**
124
+ - 走 `rule.save`(`rule_info_list` 里放**不带 id** 的一条规则信息)
125
+ - 页面字段随存储实例类型动态变化:**基础字段**为规则名 / 文件来源 / 存储实例 / 存储路径 / 子目录 / 启用;**选本地存储**再加压缩存储、加密存储、加密算法(开启加密才出现,默认 SM4);**云存储**不显示压缩/加密/算法
126
+ - **文件来源类型取值**(不要写成 0/1/2/3):`1`=模块 `2`=文件夹 `3`=分部 `4`=部门 `-1`=默认
127
+ - 模块:`fileSourceValue` 传**模块标识英文**(如 `"document"`),不是中文名——传中文会保存「看似成功」但实际被丢弃
128
+ - 文件夹:传文档中心目录 ID(数字字符串,多个逗号分隔);分部/部门:传对应数字 ID
129
+ - 模块标识速查(跨环境可能有出入,以用户在页面上选到的为准):
130
+
131
+ | 业务中文名 | 模块标识 |
375
132
  |---|---|
376
- | 知识管理("文档") | `document` |
133
+ | 知识管理(「文档」) | `document` |
377
134
  | 公文管理 | `odoc` |
378
135
  | 流程 | `workflow` |
379
136
  | 邮件 | `email` |
@@ -381,158 +138,61 @@ CLI 改规则时"选存储实例"指的就是这些。完整字段差异见下
381
138
  | 协作 | `cowork` |
382
139
  | 日程 | `calendar` |
383
140
 
384
- 完整列表调 `/api/file/common/browser/complete/module` 拉(HAR 实测当前租户 197 个 moduleFlag)。**未知模块让客户用前端 Browser 选好后告诉我 moduleFlag 英文**——前端选择器会同时显示 moduleFlag 和 moduleName,agent 没法直接替客户选(需要 Browser 操作)。
385
-
386
- 8. **改/选存储实例时:先列已有 + 让客户选**
387
- 改规则的"存储实例"字段 / 改"业务文件要落到哪个实例"时:
388
- - **先调 `storage list` 列出所有已有存储实例**,每个实例给出 **三要素**:**名称 / 类型(本地/腾讯/阿里/华为/S3/FastDFS/HDFS)/ 启用状态**
389
- - **问客户"选已有实例 / 新建一个"**——不要直接跳到"新建";新建是高成本操作,能复用就先复用
390
- - 客户说"选已有" → 调 `storage show <id>` 把详情给客户确认,再调 `rule set --item storage-instance=<id>`
391
- - 客户说"新建" → 走规则 9
392
-
393
- 9. **新建存储实例:列支持类型 + 按 defaultField 给必填值 + 测试先于保存**
394
- 新建存储实例必须按这个三步走,**不能跳步也不能漏字段**:
395
-
396
- - **步骤 a — 列支持类型**:先把 7 种支持的存储类型告诉客户(本地 / 腾讯云 / 阿里云 / 华为云 / S3 / FastDFS / HDFS),让客户选要新建哪种
397
- - **步骤 b — 按 defaultField 给必填值**:
398
- - 客户选好类型后,**按本文「7 种存储类型」的该类型 defaultField 给字段**——**不能给页面上没有的字段**
399
- - **每种类型的字段都不一样**:
400
- - 本地:实例名 + 存储路径
401
- - 腾讯云:实例名 + 协议 + 终端节点 + 区域 + 桶 + 访问 id/key(共 7 项,含独立"区域"字段)
402
- - 阿里云:实例名 + 协议 + 终端节点 + 桶 + 访问 id/key + CNAME(**没"区域"独立字段,没"二级路径"**)
403
- - 华为云:实例名 + 协议 + 终端节点 + 桶 + 访问 id/key + 二级路径(可选)(**没"区域"独立字段**)
404
- - S3:实例名 + 协议 + 终端节点 + S3 host + 区域 + 桶 + 访问 id/key + PathStyle + 二级路径(可选)
405
- - FastDFS:实例名 + trackerServers + downLoadHost(**没终端节点/桶/凭证**)
406
- - HDFS:实例名 + hdfsServerIp + hdfsServerPort + 存储路径 + hdfsUserName(**没终端节点/桶/凭证**)
407
- - **终端节点(END_POINT) 是个组合控件**:左侧是**协议下拉**(`http://` / `https://`),右侧是**域名文本框**。**协议走 `httpHttps` 顶层字段 + 域名走 `endPoint` 嵌套字段**——不能拼成一个字符串
408
- - 凭证(访问 id / 访问 key)不复读到对话里,收到后只说"已收到"
409
- - **步骤 c — 测试先于保存(强制)**:
410
- - 客户填好后,**agent 必须立刻调 `storage test-create` 测试连通性**(不调 `instance add`)
411
- - 测试通过 → 才调 `storage instance add` 保存
412
- - 测试不通过 → **绝不保存**,根据后端返回的异常告诉客户原因 + 怎么改(例如:桶不存在 → 检查桶名;访问 key 错 → 检查凭证;端点拼错 → 检查协议和域名)
413
- - **测试 CLI**: `storage test-create` 走 `testConnect` 不传 id,跟 `instance add` 拆开,严格"先测后存"
414
- - **绝对不能**问"要存吗"再保存——客户给完整信息后**agent 必须先测试**,告诉客户测试结果,客户说"存"才存
415
- - **注意**:步骤 c 的"测试"是后端 `testConnect` 走真实凭证 + 真实桶的真实请求,比"保存后再看"靠谱得多
416
-
417
- 10. **查询"现在系统是什么存储"时:综合三处 + 去重 + 业务信息 + 无 ID**
418
- 客户问"现在系统是什么存储"/"现在业务文件存哪了"/"现在用的哪套存储"等**纯查询场景**(不是要改),必须**综合查三处**再综合回答:
419
-
420
- - **A. 查系统级业务文件存储规则** → `storage rule show --level system --default` 拿"业务文件最终落点"(含挂的存储实例 + 子目录规则 + 存储路径)
421
- - **B. 查系统级静态文件存储规则** → 走 `getStorageInstance` 拿"静态资源最终落点的存储实例详情"(含存储路径/桶/端点等)
422
- - **C. 查当前租户的存储信息** → `storage rule show --level tenant --default` 拿"租户级默认规则挂的实例"
423
-
424
- **输出格式硬约束**:
425
- - **禁止出现 ID**:任何 instance.id / rule.id / usageType 等**纯内部状态字段都不能出现**——这些是开发用字段,不是客户要的"现在用什么"
426
- - **必须包含业务信息**:每个落点要包含 **存储类型 / 实例名 / 桶名(对象存储) / 区域 / 终端节点 / 存储路径(本地) / 子目录规则**——客户问"现在用什么"就是要这些业务信息,不要只回个名字
427
- - **分段写但不用编号**:业务文件 / 静态文件 / 租户是否覆盖三段分开写,每段一段自然语言
428
- - **去重规则**:C 跟 A/B 一致时,**不单独列 C 那一行**——客户问的是"系统是什么存储",租户级跟系统级一致时只说一次
429
-
430
- **标准输出模板**:
431
- ```markdown
432
- 当前系统存储概况:
433
-
434
- - 业务文件(租户业务 / 系统公共 / 临时文件)
435
- - 存储类型:<腾讯云存储/阿里云存储/...>
436
- - 存储实例:<实例名>
437
- - 桶:<桶名> ← 对象存储才有
438
- - 区域:<区域> ← 华为云在终端节点里,可不填
439
- - 终端节点:<终端节点> ← 对象存储才有
440
- - 子目录规则:按【...】自动生成(YYYY/MM/DD)
441
-
442
- - 静态文件
443
- - 存储类型:<本地存储/...>
444
- - 存储实例:<实例名>
445
- - 存储路径:<路径> ← 本地存储才有
446
-
447
- - 当前租户
448
- - <没有单独覆盖,跟系统级一致> ← 跟 A/B 一致时
449
- - <单独挂的:<类型> - <实例名>...> ← 跟 A/B 不一致时
450
- ```
451
- - **格式说明**:**用 markdown `-` bullet 强制每项独立成行**——所有现代 chat 客户端都会把 `- ` 开头识别为列表项,**强制独占一行**,不会被"压缩单换行"合并
452
- - 顶层 3 段(业务/静态/租户)用 `-`(顶格 bullet)
453
- - 段内每个属性用 ` - `(2 空格缩进 bullet)
454
- - 段间用**单空行**分隔
455
- - 桶 / 区域 / 终端节点这三项仅在"对象存储(腾讯/阿里/华为/S3)"时才有,本地存储写"存储路径"即可
456
- - 区域对华为云可不填(信息在终端节点里,见硬性门禁 8)
457
- - 客户问"列出来本地环境的存储信息"实际就是"现在用什么"——不要把全部 21 个实例平铺出来,只讲"正在用的"
458
- - **反例(禁止的写法)**:表格里出现 id / usageType 列、正文里出现命令、罗列全部实例;长段落挤成几段;缩进 key:value;冒号分段;markdown 三级标题;纯换行(会被 chat 客户端压成空格)。**正确做法**:markdown `-` bullet 强制每项独立成行。
141
+ - 必填值话术:先要基础 6 项;用户选本地存储再追问压缩/加密(默认关),开了加密追问算法(默认 SM4);云存储不追问。
142
+
143
+ 7. **改/选存储实例:先列已有 + 让用户选**
144
+ - 用 `instance.list` 列出已有实例,每个给三要素:**名称 / 类型(本地/腾讯/阿里/华为/S3/FastDFS/HDFS)/ 启用状态**
145
+ - 问用户「选已有 / 去后台新建」——不要直接跳到新建;用户选已有时用 `instance.get` 给详情确认后再改规则里的实例字段
146
+ - 实例写入(新建/修改/删除、连通测试)当前不支持,一律引导后台
147
+
148
+ 8. **查询「现在系统是什么存储」:综合多处回答**
149
+ - 系统级默认规则(业务 + 静态)→ `rule.form`;静态落点实例详情 → `instance.get`;租户级默认规则 → `rule.form`
150
+ - 输出格式硬约束:**禁止出现 ID**(实例 ID / 规则 ID 等内部字段);**必须包含业务信息**(存储类型 / 实例名 / 桶名 / 区域 / 终端节点 / 存储路径 / 子目录规则);业务文件、静态文件、租户是否覆盖分三段写
151
+ - 租户级与系统级一致时不单独列租户段
152
+ - **标准输出模板**(用 markdown `-` 列表,每项独立成行):
153
+
154
+ ```markdown
155
+ 当前系统存储概况:
156
+
157
+ - 业务文件(租户业务 / 系统公共 / 临时文件)
158
+ - 存储类型:<腾讯云存储/本地存储/...>
159
+ - 存储实例:<实例名>
160
+ - 桶:<桶名> ← 对象存储才有
161
+ - 区域:<区域> ← 华为云在终端节点里,可不填
162
+ - 终端节点:<终端节点> ← 对象存储才有
163
+ - 子目录规则:按【...】自动生成
164
+
165
+ - 静态文件
166
+ - 存储类型:<本地存储/...>
167
+ - 存储实例:<实例名>
168
+ - 存储路径:<路径> ← 本地存储才有
169
+
170
+ - 当前租户
171
+ - <没有单独覆盖,跟系统级一致> ← 跟系统级一致时
172
+ - <单独挂的:<类型> - <实例名>...> ← 不一致时
173
+ ```
174
+ - 对象存储写「桶 / 区域 / 终端节点」,本地存储写「存储路径」;不要把全部实例平铺出来,只讲「正在用的」。
459
175
 
460
176
  ## 宿主
461
177
 
462
178
  CLI 入口:`weaver-work-cli caizhilian run caizhilian.setting-storage.<operation>`(操作清单见 SKILL.md 路由表)。
463
179
 
180
+ ## 与设置系列其它模块的关系
464
181
 
465
- ## 与 weaver-setting 系列其它 skill 的关系
182
+ 四个设置模块互相独立,同一环境可共存:
466
183
 
467
- 四个 skill **互相独立**,可在同一台机器共存:
468
-
469
- | | weaver-setting-attach | weaver-setting-encrypt | weaver-setting-backup | weaver-setting-storage |
184
+ | | 附件设置 | 加解密设置 | 备份设置 | 存储设置 |
470
185
  |---|---|---|---|---|
471
- | 改的页面 | 文件设置 → 附件设置 | 文件设置 → 加解密设置 | 文件设置 → 备份设置 | 租户平台 → 文件存储设置 |
472
- | 入口域名 | <your-e10-domain> | <your-e10-domain> | <your-e10-domain> | **<your-tenant-platform-domain>** |
473
- | 接口前缀 | api | api | api | **papi** |
474
- | 作用范围 | 租户 | 租户 | 租户 | **系统级(all_teams)** |
475
- | CLI 软链 | `setting-attach` | `setting-encrypt` | `setting-backup` | **`storage`** |
476
- | 共享 | 互相独立 `.env.local`;可共享同一 ETEAMSID(同 SSO 域) |
477
-
478
- ## 版本
479
-
480
- 版本号规则 `x.y.z`:
481
- - **x 升** — 大重构(GET/POST 模式变化、DTO 结构变化、字段大幅增删)
482
- - **y 升** — 新增字段、新增命令、新增子模块
483
- - **z 升** — 文案修正、门禁澄清、依赖注补充、不改行为的小修
484
- # 接口协议
485
-
486
- 范围:仅**租户平台 / 系统级**(papi + `all_teams`)。
487
-
488
- ## 端点
489
-
490
- ### 存储实例
491
-
492
- | 操作 | 方法 | URL | 入参 | 出参(data 字段) |
493
- |---|---|---|---|---|
494
- | 列实例 | `POST` | `{base}/papi/file/storage/listStorageInstance` | `{pageNo, pageSize}` | `{columns, operates, data[], total, current}` |
495
- | 单实例详情 | `POST` | `{base}/papi/file/storage/getStorageInstance` | `{id, instanceType?}` | `{weaForm, encFieldList, readOnly}` |
496
- | 保存实例 | `POST` | `{base}/papi/file/storage/saveStorageInstance` | `StorageInstanceConfigParam` | `{code, msg}` |
497
- | 测试连接 | `POST` | `{base}/papi/file/storage/testConnect` | `StorageConfigParam + StorageConfigInfo` | `true / false` |
498
-
499
- ### 存储规则
500
-
501
- | 操作 | 方法 | URL | 入参 | 出参 |
502
- |---|---|---|---|---|
503
- | 拉规则表单 | `GET` | `{base}/papi/file/storage/rule/frontComp/ruleForm?defaultRule=true&id=N&sysStorageRule=true` | query | `{defaultFsRuleWeaForm, fsRuleWeaForm, defaultStaticRuleWeaForm, ...}` |
504
- | 保存规则 | `POST` | `{base}/papi/file/storage/rule/saveData` | `{defaultRule, ruleInfoList[]}` | `{ruleInfoList[]}` |
505
- | 改顺序 | `POST` | `{base}/papi/file/storage/rule/saveOrder` | `{ruleIdList[]}` | `{}` |
506
- | 改启用 | `POST` | `{base}/papi/file/storage/rule/saveOpen` | `{ruleInfoList[]}` | `{}` |
507
- | 删除 | `POST` | `{base}/papi/file/storage/rule/delete` | `{ruleIdList[]}` | `{}` |
508
- | 高级搜索 | `POST` | `{base}/papi/file/storage/rule/search` | `{conditionArr[], ruleType?}` | `{ruleInfoList[]}` |
509
- | 拉规则表 | `GET` | `{base}/papi/file/storage/rule/frontComp/ruleTable` | (无) | `{defaultFsRuleWeaForm, fsRuleTable, ...}` |
510
-
511
- ### 浏览器辅助
512
-
513
- | 操作 | 方法 | URL | 入参 | 出参 |
514
- |---|---|---|---|---|
515
- | 选存储实例(browser) | `POST` | `{base}/papi/file/common/browser/associate/storageInstance` | `{browserMultiple, token, pageNo, pageSize, instanceType?}` | browser rows |
516
-
517
- ## 鉴权
518
-
519
- ```
520
- Cookie: ETEAMSID=<id>
521
- ```
522
-
523
- papi 端点都带 `?wea_link_keep_freepass=1&tenant_langType=zh_CN` 通用 query(browser 端点额外要 `token`)。
186
+ | 改的页面 | 文件设置 → 附件设置 | 文件设置 → 加解密设置 | 文件设置 → 备份设置 | 租户平台 → 文件存储设置 / 后台文件设置 → 存储设置 |
187
+ | 作用范围 | 租户 | 租户 | 租户 | 系统级 + 租户级 |
188
+ | 本文档 | `setting-attach.md` | `setting-encrypt.md` | `setting-backup.md` | `setting-storage.md` |
524
189
 
525
- ## POST 注意事项
190
+ ## 接口行为备查
526
191
 
527
- 1. **注意实例数据的作用范围**:实例字段值可能混有租户级 / 系统级内容;租户平台入口通常只应有读权限,写操作走本模块的实例操作。
528
- 2. **业务规则 vs 静态规则同时改**:调用 `rule/saveData` 时 `defaultRule=true` 会触发默认 / 静态默认规则的保存,
529
- 一次请求可同时改两条(业务 + 静态),按 `ruleType` 字段路由
530
- 3. **`staticNginxConfig` 是嵌套 JSON 子字段**:存在 `StoRuleInfo.expandRuleConfig`(JSON 字符串)里;
531
- 改 nginx 配置 → CLI 走子字段 merge,不能整段覆盖
532
- 4. **改默认规则会脱离系统默认**:前端弹窗原话
533
- "修改后将不再继承系统初始化的默认存储实例"
534
- 5. **保存后要 GET 校验**:保存接口不回显完整对象,只回 `ruleInfoList`;
535
- CLI 改完要 `GET ruleForm` 重新拉一遍
536
- 6. **`canSelect=false` 的实例不可选**:前端会显示 tooltip "系统级存储实例,不允许修改";
537
- CLI 改规则时如果 `storage-instance` 选了这类实例会被前端拒(实际后端按 usageType 过滤)
192
+ CLI 封装了后端接口,Agent 不手写请求体;以下是便于理解行为的备查信息:
538
193
 
194
+ - 存储实例:列表 / 详情查询(敏感字段掩码);实例写入与连通测试当前不开放
195
+ - 存储规则:表单 / 表 / 高级搜索查询;保存(`defaultRule=true` 时会同时处理默认业务规则与默认静态规则)、顺序、启停、删除
196
+ - 静态规则的 nginx 配置是嵌套配置子字段,保存时按子字段合并,不能整段覆盖
197
+ - 保存接口不回显完整对象,**保存后必须重新查询校验**
198
+ - 有些系统级实例不允许在规则里选(后端按使用类型过滤),选了会被拒绝