weaver-work-cli 0.1.25 → 0.1.26
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 +30 -30
- package/dist/cmd/root.js +1 -0
- package/dist/core/runtime-agent.js +19 -0
- package/dist/internal/e10/auth/commands.js +47 -27
- package/dist/internal/e10/auth/xiaoe.js +62 -43
- package/dist/internal/e10/context.js +5 -27
- package/dist/shortcuts/archive-oa/constants.js +66 -0
- package/dist/shortcuts/archive-oa/continuation.js +70 -0
- package/dist/shortcuts/archive-oa/errors.js +53 -0
- package/dist/shortcuts/archive-oa/host.js +157 -0
- package/dist/shortcuts/archive-oa/index.js +225 -0
- package/dist/shortcuts/archive-oa/manifest.js +62 -0
- package/dist/shortcuts/archive-oa/operations/borrow-car.js +159 -0
- package/dist/shortcuts/archive-oa/operations/borrow-url.js +108 -0
- package/dist/shortcuts/archive-oa/operations/confirm.js +48 -0
- package/dist/shortcuts/archive-oa/operations/contract.js +120 -0
- package/dist/shortcuts/archive-oa/operations/locate.js +50 -0
- package/dist/shortcuts/archive-oa/operations/registry.js +40 -0
- package/dist/shortcuts/archive-oa/operations/shared.js +181 -0
- package/dist/shortcuts/archive-oa/operations/types.js +45 -0
- package/dist/shortcuts/archive-oa/operations.js +13 -0
- package/dist/shortcuts/index.js +2 -0
- package/dist/shortcuts/invoice/host.js +2 -1
- package/dist/shortcuts/invoice/manifest.js +111 -0
- package/dist/shortcuts/invoice/operations/issuing-qys.js +361 -0
- package/dist/shortcuts/invoice/operations/issuing.js +5 -5
- package/dist/shortcuts/invoice/operations/registry.js +4 -0
- package/dist/shortcuts/workflow/endpoints.js +11 -0
- package/dist/shortcuts/workflow/host.js +2 -2
- package/dist/shortcuts/workflow/index.js +6 -36
- package/dist/shortcuts/workflow/operations/chatscene.js +270 -0
- package/dist/shortcuts/workflow/operations/form.js +899 -158
- package/dist/shortcuts/workflow/operations/read.js +111 -6
- package/dist/shortcuts/workflow/operations/sign-input.js +106 -0
- package/dist/shortcuts/workflow/operations/write.js +9 -1
- package/dist/shortcuts/workflow/stdout-compact.js +9 -1
- package/docs/archive-oa.md +79 -0
- package/docs/e10-auth.md +7 -6
- package/package.json +1 -1
- package/skill-template/business-info.json +16 -0
- package/skill-template/domains/archive-oa.md +19 -0
- package/skill-template/domains/yepiaotong.md +2 -2
- package/skills/weaver-e10-archive-oa/SKILL.md +159 -0
- package/skills/weaver-e10-archive-oa/references/archive-locate.md +49 -0
- package/skills/weaver-e10-archive-oa/references/borrow-car.md +76 -0
- package/skills/weaver-e10-archive-oa/references/borrow-flow.md +53 -0
- package/skills/weaver-e10-archive-oa/references/contract-search.md +63 -0
- package/skills/weaver-e10-archive-oa/references/disabled-capabilities.md +29 -0
- package/skills/weaver-e10-archive-oa/references/qys-contract-search.md +47 -0
- package/skills/weaver-e10-archive-oa/references/source-manifest.json +400 -0
- package/skills/weaver-e10-builder/SKILL.md +22 -0
- package/skills/weaver-e10-caizhilian/SKILL.md +37 -15
- package/skills/weaver-e10-caizhilian/references/agent-entry.md +7 -3
- package/skills/weaver-e10-caizhilian/references/collaboration.md +5 -3
- package/skills/weaver-e10-caizhilian/references/document.md +33 -11
- package/skills/weaver-e10-caizhilian/references/file-collection.md +4 -3
- package/skills/weaver-e10-caizhilian/references/file-upload.md +2 -3
- package/skills/weaver-e10-caizhilian/references/files.md +9 -3
- package/skills/weaver-e10-caizhilian/references/folder.md +48 -16
- package/skills/weaver-e10-caizhilian/references/setting-attach.md +13 -39
- package/skills/weaver-e10-caizhilian/references/setting-backup.md +13 -51
- package/skills/weaver-e10-caizhilian/references/setting-encrypt.md +20 -51
- package/skills/weaver-e10-caizhilian/references/setting-storage.md +82 -147
- package/skills/weaver-e10-caizhilian/references/withheld.md +20 -44
- package/skills/weaver-e10-shared/SKILL.md +22 -20
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +14 -15
- package/skills/weaver-e10-shared/references/non-interactive-environment.md +10 -10
- package/skills/weaver-e10-workflow/references/source-manifest.json +32 -22
- package/skills/weaver-e10-workflow/references/workflow-create.md +68 -28
- package/skills/weaver-e10-yepiaotong/SKILL.md +10 -7
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +49 -1
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-qys-ledger.md +66 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +59 -36
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +54 -509
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +182 -345
- package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +4 -5
- package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +153 -345
- package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +5 -5
- package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +182 -154
- package/skills/weaver-e10-yepiaotong/references/source-manifest.json +96 -0
- package/skills/weaver-e10-yepiaotong/references/reim-fast-path.md +0 -119
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
|
|
19
19
|
- `folder_id` 的根节点约定:`100`=系统、`200`=公共、`300`=个人;具体子文件夹 ID 用 `caizhilian.folder.query-by-name` 查。
|
|
20
20
|
- `include_sub_folder` 只在传了 `folder_id` 时才写入请求体,不传 `folder_id` 时该字段无效。
|
|
21
|
-
- `create_time` 支持枚举 `today` / `yesterday` / `this_week` / `last_week` / `this_month` / `last_month` / `this_year` / `last_year` / `last_7_days` / `last_30_days` / `last_90_days
|
|
21
|
+
- `create_time` 支持枚举 `today` / `yesterday` / `this_week` / `last_week` / `this_month` / `last_month` / `this_year` / `last_year` / `last_7_days` / `last_30_days` / `last_90_days`,
|
|
22
|
+
也支持 `last_<N>_days` 和显式区间 `YYYY-MM-DD HH:MM~YYYY-MM-DD HH:MM`;
|
|
23
|
+
无法解析报 `validation/time_range_invalid`。区间按东八区计算。
|
|
22
24
|
- `caizhilian.user.current` 返回当前登录人的 `employeeId` / `employeeName`,创建文档缺 `author_id` 时可先取它。
|
|
23
25
|
|
|
24
26
|
### 创建文档
|
|
@@ -30,12 +32,15 @@
|
|
|
30
32
|
| `caizhilian.document.create-office` | `file_path`、`folder_id`、`folder_type`、`author_id` | 只接受 `.doc/.docx/.xls/.xlsx/.ppt/.pptx`;`name` 缺省取文件名(不含扩展名) |
|
|
31
33
|
| `caizhilian.document.create-by-upload` | `file_paths`、`folder_id`、`folder_type` | `author_id` 缺省取当前登录人;`file_paths` 接受字符串或数组,去重保序,最多并发 8 个 |
|
|
32
34
|
|
|
33
|
-
公共可选字段:`participant_ids`、`abstract_text`、`keywords`、`auto_invalidate_date`(`YYYY-MM-DD`)、`tags`、`virtual_folder_ids`、`doc_category`(`0`=普通,`1
|
|
35
|
+
公共可选字段:`participant_ids`、`abstract_text`、`keywords`、`auto_invalidate_date`(`YYYY-MM-DD`)、`tags`、`virtual_folder_ids`、`doc_category`(`0`=普通,`1`=重要)、
|
|
36
|
+
`cover_picture_id`(`create-by-upload` 无 `cover_picture_id`)。
|
|
34
37
|
|
|
35
38
|
- `folder_type` 枚举:`company`=公共、`privy`=个人、`sys`=系统。
|
|
36
39
|
- `tags` 元素是对象,形如 `{"id":"1","privacy":false}`;`id` 用 `caizhilian.tag.search` 查。
|
|
37
40
|
- Markdown 文件按 UTF-8 严格解码,失败回退 GBK,两者都失败报 `validation/file_encoding_unknown`。
|
|
38
|
-
- **1:1 保留源行为(重要)**:`create-html` / `create-markdown` / `create-office` 的 prepare 会并发做「文件夹创建权限校验 + 文件夹默认值兜底 +
|
|
41
|
+
- **1:1 保留源行为(重要)**:`create-html` / `create-markdown` / `create-office` 的 prepare 会并发做「文件夹创建权限校验 + 文件夹默认值兜底 + 默认共享兜底」,但源逻辑让**共享兜底结果覆盖文件夹兜底结果**,
|
|
42
|
+
所以这三个操作实际不会把文件夹默认的 `participant_ids` / `virtual_folder_ids` 回填进请求体;
|
|
43
|
+
被丢弃时 prepare 会在 `warnings` 里明确提示。需要生效请显式传这两个字段,或改用 `caizhilian.document.create-by-upload`(不做共享兜底,文件夹默认值会回填)。
|
|
39
44
|
|
|
40
45
|
### 编辑文档
|
|
41
46
|
|
|
@@ -76,16 +81,33 @@ weaver-work-cli --json caizhilian run caizhilian.document.update-field.prepare -
|
|
|
76
81
|
|
|
77
82
|
## 输出处理
|
|
78
83
|
|
|
79
|
-
- `document.search` 返回 `{ total, page_no, page_size, has_next, documents[] }`;每条含 `id`、`name`、`docCreateTime`、`docLastUpdateTime`、`docAuthorId/Name`、`docCreatorId/Name`、`folderPathName
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
-
|
|
84
|
+
- `document.search` 返回 `{ total, page_no, page_size, has_next, documents[] }`;每条含 `id`、`name`、`docCreateTime`、`docLastUpdateTime`、`docAuthorId/Name`、`docCreatorId/Name`、`folderPathName`、
|
|
85
|
+
`belongFolderIds`、`type`、`size`、`docStatus`、
|
|
86
|
+
`docStatusName`。
|
|
87
|
+
回复默认用 Markdown 表格展示序号/标题/作者/所属文件夹/更新时间,`id` 只作为后续 operation 入参,不当作展示内容。
|
|
88
|
+
- `document.get` 返回文档基础信息:`docName`(名称)、`abstractText`(摘要)、`authorId`/`authorName`(负责人)、`creatorId`/`creatorName`(创建者)、`docStatus`(状态码)、`keywords`、`summary`(HTML 正文摘要)、`createTime`、`lastUpdateTime`、
|
|
89
|
+
`contentMainType`/`content`(正文文件 ID)/`contentType`(如 WORD / EXCEL / PPT / PDF)、`coordinate`(1=协同文档)、`parentFolders[]`(`id`/`name`/`namePath`/`type`)、
|
|
90
|
+
`attachments[]`(`id`/`name`/`extName`/`size`(bytes)/`createTime`)、`permission`(操作权限标志:`withEditPermission`、`canEditTitle`、`canEditContent`、`canDelete`、`canDownload`、`canMove`、`canUploadFile`、
|
|
91
|
+
`maxSize`(MB)、`replaceMainText` 等)、`operateMenuSettings[]`(可用操作菜单,
|
|
92
|
+
仅保留 `show=true` 且 `openStatus=1` 的项)。
|
|
93
|
+
字段较多时只摘要用户关心的部分;写操作前可用 `permission` 判断当前用户是否被允许,不要凭猜测。
|
|
94
|
+
- 创建类 `prepare` 返回 `data` 里的预览(`doc_type`、`content_type`、`name`、`folder_id`、`folder_type`、`author_id`、`content_length`、`tags_count`、`participant_ids`、`virtual_folder_ids`、`doc_share_list_count`、
|
|
95
|
+
`request`)+ `continuation` + `expires_in_ms` + `hint`,
|
|
96
|
+
`meta.status = "PREPARED"`。
|
|
97
|
+
向用户摘要时给出标题、目标文件夹、作者、正文长度和将要产生的副作用。
|
|
98
|
+
- 创建类 `apply` 返回 `{ doc_id }`(新文档 ID,可用 `document.get` 复核);`create-office.apply` 额外带 `file_id`;`create-by-upload.apply` 批量时返回 `{ results[], summary: { total, success, failed } }`,
|
|
99
|
+
单文件时返回 `{ doc_id, file_id, name, size, ext_name }`(`meta.batch=false`);
|
|
100
|
+
单个文件失败会写进 `results[].error` 和 `warnings`,不要当成整体失败重试。
|
|
101
|
+
- 编辑类 `apply` 返回变更回显:`update-field` → `{ doc_id, <field 对应字段名>: 新值 }`(`name` / `keywords` / `abstract_text` / `auto_invalidate_date`);`update-author` → `{ doc_id, user_id }`;
|
|
102
|
+
`update-html` → `{ doc_id, summary }`;
|
|
103
|
+
`replace-content` → 上传结果 `{ file_id, name, size, ext_name, version }`(`meta` 带 `doc_id` / `content_type`)。
|
|
84
104
|
|
|
85
105
|
## 注意
|
|
86
106
|
|
|
87
|
-
- 创建和编辑文档都是服务端写操作:`create-html` / `create-markdown` / `update-field` / `update-author` / `update-html` 是 `high-risk-write
|
|
88
|
-
-
|
|
107
|
+
- 创建和编辑文档都是服务端写操作:`create-html` / `create-markdown` / `update-field` / `update-author` / `update-html` 是 `high-risk-write`,
|
|
108
|
+
`create-office` / `create-by-upload` / `replace-content` 是 `read-with-upload`(会读本地文件并上传)。
|
|
109
|
+
- 创建文档前,服务端会校验**目标文件夹的新建文档权限与允许的文档类型**(合约中以 `permissions` 标记为 `folder.create-document`):无权限或类型不允许时返回 `folder_no_create_permission` / `doc_type_not_allowed`,原样转述给用户,不要重试;
|
|
110
|
+
需要提前确认时用 `caizhilian.folder.permission.query`。
|
|
89
111
|
- 执行任何读本地文件、上传文件、替换正文的操作前,必须先提醒用户:文件内容会被上传到 E10 采知连文档中心或文件服务器,并可能进入大模型上下文用于理解和处理;必须等用户明确确认后再继续。
|
|
90
112
|
- `update-html` 会生成新版本,`replace-content` 会替换正文文件;两者都不可撤销,确认摘要里必须写明目标 `doc_id` 与文档标题。
|
|
91
113
|
- 不要为了「补全信息」自动多查一遍:用户已给 `doc_id` 时直接 `document.get` 或对应 `prepare`。
|
|
@@ -108,4 +130,4 @@ weaver-work-cli --json caizhilian run caizhilian.document.update-field.prepare -
|
|
|
108
130
|
| `doc_info_unavailable` | 目标文档信息取不到 | 用 `document.get` 复核 `doc_id` |
|
|
109
131
|
| `plan_changed` | prepare 与 apply 之间文件内容/元信息变化 | 重新 prepare |
|
|
110
132
|
| `api/business_error` | 服务端业务失败 | 转述 message,不要重复提交写请求 |
|
|
111
|
-
| `partial/write_uncertain` | 创建/替换结果不确定 | 立即停止,最多补一次 `document.search` 或 `document.get` 只读回查,禁止自动重放 |
|
|
133
|
+
| `partial/write_uncertain` | 创建/替换结果不确定 | 立即停止,最多补一次 `document.search` 或 `document.get` 只读回查,禁止自动重放 |
|
|
@@ -13,13 +13,13 @@ metadata:
|
|
|
13
13
|
|
|
14
14
|
# 文件采集 FTP/SFTP
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
本模块通过 CLI 管理文件采集生命周期。正式 API 请求、动作流设计物化和任务 Payload 均由 CLI 生成,不手写正式结构。
|
|
17
17
|
|
|
18
18
|
## 前置依赖
|
|
19
19
|
|
|
20
20
|
### 认证前置(必须)
|
|
21
21
|
|
|
22
|
-
本模块通过 CLI 托管的认证获取凭证(base_url + Cookie + eteamsid + User-Agent
|
|
22
|
+
本模块通过 CLI 托管的认证获取凭证(base_url + Cookie + eteamsid + User-Agent),凭证契约见同级 `weaver-e10-shared` 技能的共享规则,不依赖手动配置文件,Agent 不得自己读取或输出凭证。
|
|
23
23
|
|
|
24
24
|
**使用前必须确保**:
|
|
25
25
|
1. CLI 已安装:`weaver-work-cli --version` 能正常输出版本号
|
|
@@ -68,7 +68,8 @@ weaver-work-cli auth set --eteamsid "PCACCOUNT_xxx"
|
|
|
68
68
|
2. 执行 `choose-file-only --phase collection_target_selection`;或执行 `choose-archive`,再调用全宗工具、`normalize-fonds` 和 `confirm-fonds`。
|
|
69
69
|
3. 执行 `choose-new-task` 或 `choose-existing-task`。已有任务的全宗更新仅适用于归档分支。
|
|
70
70
|
4. 新建任务时执行 `choose-existing-resource` 或 `create-new-resource`;标准新建直接调用 `create-ftp-resource`,缺少 `systemPk` 时 CLI 内部创建连接器并返回 `taskSourceId`。
|
|
71
|
-
5. 确定 `retainDirStruct=0|1`;执行 `choose-existing-workflow` 后 `search-action-flows`、用户确认、`inspect-action-flow --retain-dir-struct <0|1
|
|
71
|
+
5. 确定 `retainDirStruct=0|1`;执行 `choose-existing-workflow` 后 `search-action-flows`、用户确认、`inspect-action-flow --retain-dir-struct <0|1>`;
|
|
72
|
+
或执行 `create-new-workflow` 后直接调用标准 `create-action-flow --retain-dir-struct <0|1> [--archive]`。
|
|
72
73
|
6. 用相同目录选项和关联凭据执行 `save-task --retain-dir-struct <0|1> --source-id ... --workflow-selection-file ...`;归档分支额外传全宗确认文件。
|
|
73
74
|
7. 依次执行 `check-storage`、`scan --wait`、`run`;需要等待文件级结果时使用 `run --wait` 或 `run-progress`。
|
|
74
75
|
|
|
@@ -6,9 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
## 运行与认证
|
|
8
8
|
|
|
9
|
-
- 唯一运行时为 `weaver-work-cli
|
|
10
|
-
|
|
11
|
-
- 安装与登录遵守 `../../weaver-e10-shared/SKILL.md`。认证只使用 CLI 当前身份或连接器注入的身份。
|
|
9
|
+
- 唯一运行时为 `weaver-work-cli`,全部操作由 CLI 提供。
|
|
10
|
+
- 安装与登录遵守同级 `weaver-e10-shared` 技能的共享规则。认证只使用 CLI 当前身份或连接器注入的身份。
|
|
12
11
|
- 本模块不执行独立 Skill 的 `dist/weaver-file-upload.js`,不复用 `e10-login` 的会话,
|
|
13
12
|
不启动第二套 Chrome 登录;独立 Skill 的双登录模式不属于本 CLI 上传接口。
|
|
14
13
|
- 缺少会话或登录失效时按共享规则处理,不自行切换账号或环境。
|
|
@@ -96,12 +96,18 @@ weaver-work-cli --json caizhilian run caizhilian.compare.submit.prepare --input-
|
|
|
96
96
|
|
|
97
97
|
## 输出处理
|
|
98
98
|
|
|
99
|
-
- **prepare 返回**:`data` 含本地文件预览 `{ file_name, file_size, file_md5, ext_name }` + `upload` 预览块(`path`、`extra_body`、`allowed_ext`、`required_permission`、`deferred_to_apply: true`),外加 `continuation
|
|
100
|
-
|
|
99
|
+
- **prepare 返回**:`data` 含本地文件预览 `{ file_name, file_size, file_md5, ext_name }` + `upload` 预览块(`path`、`extra_body`、`allowed_ext`、`required_permission`、`deferred_to_apply: true`),外加 `continuation`、
|
|
100
|
+
`expires_in_ms`、`hint`,
|
|
101
|
+
`meta.status = "PREPARED"`。
|
|
102
|
+
向用户摘要时必须写清「哪个文件、多大、传到哪篇文档/做什么」。
|
|
103
|
+
- **上传类 apply 返回**:`{ file_id, name, size, ext_name, ... }`(`attachment.upload` 额外把源的 `uploadTime` 改名为 `upload_time` 放在最后;`attachment.replace` 与 `document.replace-content` 额外带 `version`(新版本号))。
|
|
104
|
+
命中服务端 MD5 秒传时不会真正传文件,
|
|
105
|
+
但返回结构一致。
|
|
101
106
|
- **下载类返回**:`{ file_path, file_name, file_size }`,`meta` 带 `{ doc_id, attachment_id }`。回复用户时给出**绝对路径 + 文件大小**,并提示已存在同名文件时被自动改名。
|
|
102
107
|
- `cover.upload.apply` 返回 `{ file_id, name, size, ext_name }`;`cover.set.apply` 返回 `{ doc_id, file_id, name }`;`cover.remove.apply` 返回 `{ doc_id, cover_picture_id }`(`cover_picture_id` 为删除后的空串)。
|
|
103
108
|
- `compare.list-file-objects` 返回 `{ attachments: [{ docId, file_id, ext_name, file_name, size, updateTime }] }`,其中 `file_id` 就是 `compare.submit` 需要的 ID;用 Markdown 表格摘要「文件名/类型/大小/更新时间」。
|
|
104
|
-
- `attachment.list-versions` 返回 `{ versions: [{ id, name, versionNumber, updateTime, describe, extName }], has_next }`;`updateTime` 已转为东八区时间字符串。用 Markdown 表格摘要「版本号/文件名/更新时间/版本说明」,`id`
|
|
109
|
+
- `attachment.list-versions` 返回 `{ versions: [{ id, name, versionNumber, updateTime, describe, extName }], has_next }`;`updateTime` 已转为东八区时间字符串。用 Markdown 表格摘要「版本号/文件名/更新时间/版本说明」,`id` 作为后续操作入参,
|
|
110
|
+
不作为展示主体。
|
|
105
111
|
- `compare.search-documents` 与 `document.search` 同构(`{ page_no, page_size, has_next, documents[] }`),参见 `document.md`。
|
|
106
112
|
- `compare.submit.apply` 返回 `{ compare_link }`,把链接原样交给用户,不要尝试抓取链接内容。
|
|
107
113
|
|
|
@@ -28,13 +28,21 @@
|
|
|
28
28
|
|
|
29
29
|
枚举取值(**拼写 1:1 沿用源接口,注意 `Premisstion` 是源的拼写,不要自行改成 `Permission`**):
|
|
30
30
|
|
|
31
|
-
- `permission_type`(8 项):`copyPermission`、`deletePremisstion`、`downloadPremisstion`、`folderDefaultParticipants`、`movePermission`、`newCreateDocPremisstion`、`newCreateFolderPremisstion
|
|
31
|
+
- `permission_type`(8 项):`copyPermission`、`deletePremisstion`、`downloadPremisstion`、`folderDefaultParticipants`、`movePermission`、`newCreateDocPremisstion`、`newCreateFolderPremisstion`、
|
|
32
|
+
`settingPermission`
|
|
32
33
|
- `setting_type`(9 项):上面 8 项 + `defaultShares`
|
|
33
|
-
- `permission_key`(9 项):上面 8 项,但把 `folderDefaultParticipants` 之外再加 `folderDefaultShareNew`(即 `copyPermission`、`deletePremisstion`、`downloadPremisstion`、`folderDefaultParticipants
|
|
34
|
+
- `permission_key`(9 项):上面 8 项,但把 `folderDefaultParticipants` 之外再加 `folderDefaultShareNew`(即 `copyPermission`、`deletePremisstion`、`downloadPremisstion`、`folderDefaultParticipants`、
|
|
35
|
+
`folderDefaultShareNew`、`movePermission`、`newCreateDocPremisstion`、`newCreateFolderPremisstion`、
|
|
36
|
+
`settingPermission`)
|
|
34
37
|
|
|
35
|
-
`query-by-permission` 的 `permissions` 是对象数组,元素形如 `{"object_type":"all"}` 或 `{"object_type":"resource","object_ids":["123"]}`;`object_type` 必填,`object_ids`
|
|
38
|
+
`query-by-permission` 的 `permissions` 是对象数组,元素形如 `{"object_type":"all"}` 或 `{"object_type":"resource","object_ids":["123"]}`;`object_type` 必填,`object_ids` 必须是正整数字符串。
|
|
39
|
+
`page_no` / `page_size` 传 `<=0` 会报 `validation/number_invalid`(源脚本是静默归一,
|
|
40
|
+
这里选择显式报错)。
|
|
36
41
|
|
|
37
|
-
`object_ids` 必须是**对象的真实 ID**:人员/部门/分部/角色/岗位/客户一律用 `caizhilian.org.search-*` 查出来的 `id`(每个对象都要是字符串,且不要用 JSON
|
|
42
|
+
`object_ids` 必须是**对象的真实 ID**:人员/部门/分部/角色/岗位/客户一律用 `caizhilian.org.search-*` 查出来的 `id`(每个对象都要是字符串,且不要用 JSON 数字传)。
|
|
43
|
+
**不要用 `default-share.list` / `get-settings` / `permission.list` 返回条目里的 `id`**——那是共享/权限条目的 ID,不是对象 ID,
|
|
44
|
+
拿它反查只会得到空结果。
|
|
45
|
+
不带 ID 的对象类型(`all`、`allExternal`、`createrSelf` 等)不传 `object_ids`。
|
|
38
46
|
|
|
39
47
|
### 写操作
|
|
40
48
|
|
|
@@ -57,7 +65,8 @@
|
|
|
57
65
|
| `caizhilian.folder.permission.sync-default-share` | `id`(文件夹 ID)、`sync_to_folder_docs`、`sync_to_all_folders`、`sync_to_all_sub_folder_docs`(至少选一个) | `keep_old_default_share_for_folder_docs`、`keep_old_non_default_share_for_folder_docs`、`keep_old_default_share_for_all_folders`、`keep_old_default_share_for_sub_folder_docs`、`keep_old_non_default_share_for_sub_folder_docs`(默认 true) |
|
|
58
66
|
|
|
59
67
|
- `folder.create` 的 `parent_type=privy`(个人)时,`sequence` 强制为 `0`、`inherit_parent` 强制为 `false`(源行为)。
|
|
60
|
-
- `obj_type` 与 `share_level` 不要猜:先用 `default-share.form` / `permission.form` 拿到 `obj_types[].id` 和级联参数,再决定要传哪些 `obj_id*`
|
|
68
|
+
- `obj_type` 与 `share_level` 不要猜:先用 `default-share.form` / `permission.form` 拿到 `obj_types[].id` 和级联参数,再决定要传哪些 `obj_id*` 字段;
|
|
69
|
+
传了 `obj_type` 未配置的对象字段会报 `validation/obj_type_not_configured` 或 `obj_type_not_supported`。
|
|
61
70
|
- `download` 在 `share_level != 1` 且未传时默认按 `["download"]` 处理(源行为)。
|
|
62
71
|
- `set-auth` 的 `value=user` 表示「按人员白名单」,此时白名单条目由 `permission.list` / `permission.add` 维护;`permission_auth_not_user` 表示当前权限类型不是 `user` 模式,需要先 `set-auth`。
|
|
63
72
|
|
|
@@ -107,16 +116,29 @@ weaver-work-cli --json caizhilian run caizhilian.folder.permission.sync-default-
|
|
|
107
116
|
|
|
108
117
|
- `query-by-name` 返回**展平后的路径列表**(源模板 `FlattenSearchResultFolderTree`),每项含文件夹 ID、名称与完整路径;同名文件夹可能出现在多个路径下,必须让用户确认选哪一个,不要默认取第一条。
|
|
109
118
|
- `search-virtual` 返回 `{ page_no, page_size, has_next, folders[] }`,每项含 `id`、`name`、`path`、`parent_folder_id`(源 `content` 形如 `名称[路径]`,CLI 已拆开)。
|
|
110
|
-
- `get-settings` 返回 `{ defaultVirtualFolder, folderDefaultParticipants, currentFolder, folderDefaultShareNew }`(`currentFolder` 含 `id`/`name`/`title`;参与人每项含 `id`/`content`/`_entityType
|
|
119
|
+
- `get-settings` 返回 `{ defaultVirtualFolder, folderDefaultParticipants, currentFolder, folderDefaultShareNew }`(`currentFolder` 含 `id`/`name`/`title`;参与人每项含 `id`/`content`/`_entityType`,
|
|
120
|
+
共享对象另含 `canDelete`),
|
|
121
|
+
创建文档时的兜底来源。
|
|
111
122
|
- `folder.create.apply` 返回 `{ folder_id, name, type, parent_id }`,新文件夹 ID 可直接用于后续创建文档。
|
|
112
123
|
- 文件夹侧共享/权限条目统一归一为 `{ id, object_type, object_name, share_level, sec_level }`(`sec_level` 空值显示为 `--`);文档级共享条目(`share.*`)另含 `download`、`can_delete`。
|
|
113
|
-
- `list-default-shares` → `{ defaultShares[] }`;`default-share.list` → `{ default_shares[] }`;`permission.list` → `{ add_visible, shares[] }`(`add_visible=false` 时不要再引导用户添加)。删除前必须从列表里取真实条目 `ids
|
|
124
|
+
- `list-default-shares` → `{ defaultShares[] }`;`default-share.list` → `{ default_shares[] }`;`permission.list` → `{ add_visible, shares[] }`(`add_visible=false` 时不要再引导用户添加)。删除前必须从列表里取真实条目 `ids`,
|
|
125
|
+
不要自己拼。
|
|
114
126
|
- `default-share.form` → `{ category, obj_types[], param_options }`;`permission.form` → `{ obj_types[], param_options }`。`obj_types[].id` 就是 `obj_type` 的合法取值,`param_options` 给出级联参数。
|
|
115
127
|
- `permission.get-auth` 返回 `{ permission_type, current_value }`(`true` / `user` / `false`)。
|
|
116
128
|
- `permission.detail` 返回 `{ title, current_setting, list_label, items[] }`;`setting_type=defaultShares` 时只返回 `{ title, items[] }`。
|
|
117
|
-
- `permission.query` 返回 `{ permissions }`:以 `folder_id` 为 key 的映射,每个 value 含 `isCreateDoc`、`isCreateFolder`、`canMoveDoc`、`canCopyDoc` 四个布尔标志与 `allowDocumentCreateTypes
|
|
118
|
-
|
|
119
|
-
-
|
|
129
|
+
- `permission.query` 返回 `{ permissions }`:以 `folder_id` 为 key 的映射,每个 value 含 `isCreateDoc`、`isCreateFolder`、`canMoveDoc`、`canCopyDoc` 四个布尔标志与 `allowDocumentCreateTypes`(允许创建的文档类型列表,无设置时为空数组)。
|
|
130
|
+
建文档前可用它确认目标文件夹是否允许创建及允许的文档类型。
|
|
131
|
+
- `query-by-permission` 返回 `{ total, page_no, page_size, has_next, folders[] }`,每项含 `folder_id`、`folder_name`、`folder_type`。返回空数组只表示「没有匹配到」:先按上文核对 `object_ids` 是不是对象的真实 ID,再如实把结果告诉用户;
|
|
132
|
+
**不要据此断定「反查不支持该权限类型」**。
|
|
133
|
+
返回里没有文件夹路径,需要展示路径时用 `get-settings` 的 `currentFolder.title` 或 `query-by-name` 补。
|
|
134
|
+
- 写操作 `apply` 返回结果回显:`default-share.add` → `{ added: true, default_shares }` 或 `{ added: false, message }`(服务端判定「已存在」不是失败,必须把 message 转述给用户);
|
|
135
|
+
`default-share.delete` → `{ deleted: true, default_shares }`;
|
|
136
|
+
`permission.add` → `{ added: true, shares }`;`permission.delete` → `{ deleted: true, shares }`;`permission.set-auth` → `{ permission_type, value, current_value }`;
|
|
137
|
+
`permission.sync-setting` → `{ existChildFolder }`;
|
|
138
|
+
`permission.sync-maintain` → `{ existChildFolder }`;`permission.sync-download` → `{ existChildFolder }`;`permission.sync-delete` → `{ existChildFolder }`;
|
|
139
|
+
`permission.sync-copy` → `{ existChildFolder }`;
|
|
140
|
+
`permission.sync-create` → `{ existChildFolder }`;`permission.sync-move` → `{ existChildFolder }`;`permission.sync-participant` → `{ existChildFolder, existChildDocument, asyncKey }`;
|
|
141
|
+
`permission.sync-default-share` → `{ existChildFolder, existChildDocument, asyncKey }`。
|
|
120
142
|
- 权限/共享类写操作的 `prepare` 返回请求体预览 + `continuation`;向用户摘要时必须写清「哪个文件夹、哪项权限、给谁、什么级别」,并说明删除类操作不可撤销。
|
|
121
143
|
- 列表类结果默认用 Markdown 表格摘要(文件夹名/路径/权限类型/对象/级别),不要原样贴 JSON。
|
|
122
144
|
|
|
@@ -125,11 +147,21 @@ weaver-work-cli --json caizhilian run caizhilian.folder.permission.sync-default-
|
|
|
125
147
|
- 文件夹权限与默认共享是**影响面很大的配置**:改错会导致整个知识库的下载、复制、新建权限对全员开放或全部收紧。`permission.set-auth` 从 `user` 改成 `true` 等于放开给所有人,确认摘要里必须显式写出这一后果。
|
|
126
148
|
- `folder.create` 会在服务端产生新节点;`inherit_parent=true` 会连带继承父文件夹的权限与默认设置,必须在确认摘要里说明。
|
|
127
149
|
- 删除类(`default-share.delete` / `permission.delete`)必须先做一次对应 `list` 只读查询,把待删条目的可读信息展示给用户后再 prepare。
|
|
128
|
-
- `permission.sync-setting`、`permission.sync-maintain`、`permission.sync-copy`、`permission.sync-create`、`permission.sync-move` 的 `keepOldSettingForAllFolders`
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
- `permission.sync-
|
|
150
|
+
- `permission.sync-setting`、`permission.sync-maintain`、`permission.sync-copy`、`permission.sync-create`、`permission.sync-move` 的 `keepOldSettingForAllFolders` 是**必填参数**,
|
|
151
|
+
必须明确传入 `true`(保留原有设置)或 `false`(不保留),
|
|
152
|
+
否则会报错。
|
|
153
|
+
执行前必须提醒用户此操作对系统性能可能有一定影响。
|
|
154
|
+
- `permission.sync-participant` 是**异步操作**,支持三种同步范围:同步到当前文件夹内的历史文档(`sync_to_folder_docs`)、同步到所有下级文件夹(`sync_to_all_folders`)、同步到所有下级文件夹内的历史文档(`sync_to_all_sub_folder_docs`),**至少选择一个**。
|
|
155
|
+
每个选中的范围对应的"原有参与人"参数(`keep_old_for_folder_docs`、`keep_old_for_all_folders`、
|
|
156
|
+
`keep_old_for_all_sub_folder_docs`)默认为 `true`(保留)。
|
|
157
|
+
执行后会自动轮询进度,超时时间为 300 秒。
|
|
158
|
+
- `permission.sync-default-share` 是**异步操作**,支持三种同步范围:同步到当前文件夹内的历史文档(`sync_to_folder_docs`)、同步到所有下级文件夹(`sync_to_all_folders`)、同步到所有下级文件夹内的历史文档(`sync_to_all_sub_folder_docs`),**至少选择一个**。
|
|
159
|
+
每个选中的范围对应的"原有默认共享人"和"原有非默认共享人"参数默认为 `true`(保留)。
|
|
160
|
+
执行后会自动轮询进度,超时时间为 300 秒。
|
|
161
|
+
- `permission.sync-download` 的行为取决于当前下载权限设置:当下载权限为"允许所有人下载"或"不允许下载"时,直接同步到所有下级文件夹,不需要 `keepOldSettingForAllFolders` 参数;当下载权限为"允许以下人员下载"时,`keepOldSettingForAllFolders` 是**必填参数**,
|
|
162
|
+
必须明确传入 `true`(保留原有下载权限设置)或 `false`(不保留)。
|
|
163
|
+
- `permission.sync-delete` 的行为取决于当前删除权限设置:当删除权限为"允许完全控制权限人员删除文档"时,直接同步到所有下级文件夹,不需要 `keepOldSettingForAllFolders` 参数;当删除权限为"允许以下人员删除文档"时,`keepOldSettingForAllFolders` 是**必填参数**,
|
|
164
|
+
必须明确传入 `true`(保留原有删除权限设置)或 `false`(不保留)。
|
|
133
165
|
- 本 reference 只覆盖文件夹与权限;文档级共享/参与人/标签见 `collaboration.md`。
|
|
134
166
|
|
|
135
167
|
## 失败处理
|
|
@@ -147,4 +179,4 @@ weaver-work-cli --json caizhilian run caizhilian.folder.permission.sync-default-
|
|
|
147
179
|
| `id_invalid` | `folder_id` / `object_ids` 等不是正整数 | 重新查真实 ID;反查的对象 ID 要来自 `org.search-*`,不是共享条目 ID |
|
|
148
180
|
| `range_invalid` / `number_invalid` | `sequence`、`seclevel_min/max`、分页越界 | 按范围修正 |
|
|
149
181
|
| `api/business_error` | 服务端业务失败(含权限不足) | 原样转述 message,不要重复提交 |
|
|
150
|
-
| `partial/write_uncertain` | 写结果不确定 | 立即停止,最多补一次 `permission.list` / `default-share.list` 只读回查,禁止自动重放 |
|
|
182
|
+
| `partial/write_uncertain` | 写结果不确定 | 立即停止,最多补一次 `permission.list` / `default-share.list` 只读回查,禁止自动重放 |
|
|
@@ -21,7 +21,7 @@ metadata:
|
|
|
21
21
|
|
|
22
22
|
### 认证前置(必须)
|
|
23
23
|
|
|
24
|
-
本模块通过 CLI 托管的认证获取凭证(base_url + Cookie + eteamsid + User-Agent
|
|
24
|
+
本模块通过 CLI 托管的认证获取凭证(base_url + Cookie + eteamsid + User-Agent),凭证契约见同级 `weaver-e10-shared` 技能的共享规则,不依赖手动配置文件,Agent 不得自己读取或输出凭证。
|
|
25
25
|
|
|
26
26
|
**使用前必须确保**:
|
|
27
27
|
1. CLI 已安装:`weaver-work-cli --version` 能正常输出版本号
|
|
@@ -115,7 +115,7 @@ weaver-work-cli --json caizhilian run caizhilian.setting-attach.search-workflows
|
|
|
115
115
|
| `shard-size` | `uploadShardSize` | 整数 MB | 1 ≤ n ≤ 50 |
|
|
116
116
|
| `format-mode` | `sysFormatWhitesEnable` | `whitelist` / `blacklist` | 切换模式后会自动迁移 `format-list` |
|
|
117
117
|
| `format-list` | `sysFormatWhites` 或 `sysFormatBlacks` | 逗号/分号分隔扩展名 | 自动按当前 mode 写到正确字段 |
|
|
118
|
-
| `non-image-open` | `sysNonImageMediaOpenType` | `newTab` / `popupWindow` |
|
|
118
|
+
| `non-image-open` | `sysNonImageMediaOpenType` | `newTab` / `popupWindow` | 后端实际只有这两个值 |
|
|
119
119
|
| `image-open` | `sysImageMediaOpenType` | `newTab` / `previewComponent` | |
|
|
120
120
|
| `show-attach-list` | `sysPreviewShowAttachmentList` | bool | |
|
|
121
121
|
| `attach-expand` | `sysAttachmentListDefaultExpand` | bool | |
|
|
@@ -129,9 +129,9 @@ weaver-work-cli --json caizhilian run caizhilian.setting-attach.search-workflows
|
|
|
129
129
|
| `version-size` | `sysFileVersionSize` | 整数(1-500) / `-1`(不限) | 每个文件最多保留多少个历史版本。**与 `version-time` 互斥**,由 `version-clean-type` 决定生效哪个 |
|
|
130
130
|
| `version-time` | `sysFileVersionTime` | 整数(1-1095) / `-1`(永久) | 每个文件的历史版本保留多少天。**与 `version-size` 互斥**,由 `version-clean-type` 决定生效哪个 |
|
|
131
131
|
| `print-pdf-types` | `sysPrintToPdfFileTypes` | 逗号分隔扩展名 | 打印时需要转 PDF 的扩展名(空 = 未启用,独立项) |
|
|
132
|
-
| `version-clean-type` | `sysAutoClearFileVersionType` | `versionSize` / `versionTime` | 版本清理方式(按份数 /
|
|
133
|
-
| `version-size-type` | `sysFileVersionSizeType` | `selected` / `custom` | 份数那一行 UI 状态(selected = 选下拉 / custom =
|
|
134
|
-
| `version-time-type` | `sysFileVersionTimeType` | `selected` / `custom` | 时间那一行 UI 状态(selected = 选下拉 / custom =
|
|
132
|
+
| `version-clean-type` | `sysAutoClearFileVersionType` | `versionSize` / `versionTime` | 版本清理方式(按份数 / 按时间)。**决定 `version-size` 和 `version-time` 哪个生效** |
|
|
133
|
+
| `version-size-type` | `sysFileVersionSizeType` | `selected` / `custom` | 份数那一行 UI 状态(selected = 选下拉 / custom = 自定义) |
|
|
134
|
+
| `version-time-type` | `sysFileVersionTimeType` | `selected` / `custom` | 时间那一行 UI 状态(selected = 选下拉 / custom = 自定义) |
|
|
135
135
|
|
|
136
136
|
### 版本清理设置规则(强制)
|
|
137
137
|
|
|
@@ -150,7 +150,7 @@ weaver-work-cli --json caizhilian run caizhilian.setting-attach.search-workflows
|
|
|
150
150
|
|
|
151
151
|
**单独设置 `version-size` 或 `version-time` 不会生效**,必须同时设置 `version-size-type` 和 `version-time-type` 为 `custom`。
|
|
152
152
|
|
|
153
|
-
|
|
153
|
+
完整别名表见本文「字段对照表」章节。
|
|
154
154
|
|
|
155
155
|
## 硬性门禁
|
|
156
156
|
|
|
@@ -242,27 +242,13 @@ weaver-work-cli --json caizhilian run caizhilian.setting-attach.search-workflows
|
|
|
242
242
|
|
|
243
243
|
## 宿主
|
|
244
244
|
|
|
245
|
-
CLI
|
|
246
|
-
|
|
247
|
-
```text
|
|
248
|
-
python3 scripts/attach_setting.py <cmd> [args]
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
装好后 `setting show / set ...` 即可直接调用。
|
|
245
|
+
CLI 入口:`weaver-work-cli caizhilian run caizhilian.setting-attach.<operation>`(操作清单见 SKILL.md 路由表)。
|
|
252
246
|
|
|
253
247
|
|
|
254
248
|
## 与 weaver-im 的关系
|
|
255
249
|
|
|
256
250
|
两者**不共享凭证**(`auth_opt2` 决策)。现在统一通过 CLI 托管的认证获取凭证。
|
|
257
251
|
|
|
258
|
-
## 版本
|
|
259
|
-
|
|
260
|
-
- 0.1.0(2026-08-06)首次创建。覆盖 eteams-file 截图"附件设置" Tab 的 11 字段。
|
|
261
|
-
- 0.2.0(2026-08-09)补 6 字段:图片压缩(`img-compress` / `img-compress-quality`)、
|
|
262
|
-
版本清理(`auto-clear-version` / `version-size` / `version-time`)、
|
|
263
|
-
打印转 PDF(`print-pdf-types`)。这 3 类功能实际也在附件设置同一页
|
|
264
|
-
(`AttachSet/index.tsx`),0.1.0 时只覆盖 11 项漏了。同时修 `mobile-block`
|
|
265
|
-
alias 的 `invert=True` 方向写反 bug(CLI true 现在直接对应 DTO true)。
|
|
266
252
|
# 接口协议
|
|
267
253
|
|
|
268
254
|
## 端点
|
|
@@ -282,7 +268,7 @@ CLI 自动从 `.env.local` / ENV 读取并塞进 Cookie。
|
|
|
282
268
|
|
|
283
269
|
## FileSettingDto 节选(11 字段 + 只读)
|
|
284
270
|
|
|
285
|
-
|
|
271
|
+
完整字段以服务端 DTO 为准。下面只列本 skill 关心的字段:
|
|
286
272
|
|
|
287
273
|
```json
|
|
288
274
|
{
|
|
@@ -315,25 +301,13 @@ CLI 自动从 `.env.local` / ENV 读取并塞进 Cookie。
|
|
|
315
301
|
| 401/403 | — | ETEAMSID 失效/没权限,重跑 `setting login --config <name>` |
|
|
316
302
|
| 5xx | — | 后端挂了,看日志 |
|
|
317
303
|
|
|
318
|
-
## 后端实现位置(参考)
|
|
319
|
-
|
|
320
|
-
- Controller:`eteams-file/src/main/java/com/weaver/teams/file/e10/mvc/web/FileSettingController.java`
|
|
321
|
-
- DTO:`com.weaver.teams.file.e10.dto.FileSettingDto` / `BaseSetDto`
|
|
322
|
-
- 设置项注册:`com.weaver.teams.file.e10.manager.set.FileSetFactory`
|
|
323
|
-
- 前端调用:`weapp-file/src/api/fileSetApi.ts` 中 `fileSetDatas` / `fileSetSave`
|
|
324
|
-
|
|
325
304
|
## POST 注意事项
|
|
326
305
|
|
|
327
|
-
1.
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
`IllegalArgumentException: No enum constant ...` 让整笔事务回滚。
|
|
333
|
-
3. **只 POST 改了的字段**。CLI 用 `field_map.diff` 算出 changed 字段后只发这一份。
|
|
334
|
-
4. **服务端会校验范围**:传超范围值会返回业务异常(status=false / code=500),
|
|
335
|
-
CLI 会原样打印 `detailErrorMessage`。
|
|
336
|
-
5. **操作日志**:`FileOpLogManager` 会记一条 `fileSetting` 日志(管理员可在"操作日志"里看到)。
|
|
306
|
+
1. **保存是逐字段更新,不是覆盖式全量**。只提交的字段会被修改;未指定字段**不会被清空**。
|
|
307
|
+
2. **绝对不能提交只读/虚拟字段**(如 `sysMaxSingleUploadLimitSize`),会直接报错并让整笔事务回滚。
|
|
308
|
+
3. **只提交改了的字段**,CLI 会自动只发变更字段。
|
|
309
|
+
4. **服务端会校验范围**:传超范围值会返回业务异常,CLI 会原样打印错误信息。
|
|
310
|
+
5. **操作日志**:会记一条附件设置日志(管理员可在"操作日志"里看到)。
|
|
337
311
|
# 字段对照表(11 项)
|
|
338
312
|
|
|
339
313
|
> 对应 eteams-file 后端 `BaseSetDto` / `FileSettingDto`。
|
|
@@ -23,7 +23,7 @@ metadata:
|
|
|
23
23
|
|
|
24
24
|
### 认证前置(必须)
|
|
25
25
|
|
|
26
|
-
本模块通过 CLI 托管的认证获取凭证(base_url + Cookie + eteamsid + User-Agent
|
|
26
|
+
本模块通过 CLI 托管的认证获取凭证(base_url + Cookie + eteamsid + User-Agent),凭证契约见同级 `weaver-e10-shared` 技能的共享规则,不依赖手动配置文件,Agent 不得自己读取或输出凭证。
|
|
27
27
|
|
|
28
28
|
**使用前必须确保**:
|
|
29
29
|
1. CLI 已安装:`weaver-work-cli --version` 能正常输出版本号
|
|
@@ -96,7 +96,7 @@ backup delete --id 2 --yes
|
|
|
96
96
|
2. **`prod` 必须 --yes**——防手滑。
|
|
97
97
|
3. **不开开关不能调规则**——`backup update/enable/disable/delete` 在
|
|
98
98
|
`sysLocalFileBackup=false` 时拒绝(关着的备份调规则没意义)。
|
|
99
|
-
4. **period 范围 60-1440
|
|
99
|
+
4. **period 范围 60-1440 分钟**(后端校验);
|
|
100
100
|
CLI 也做同样校验。
|
|
101
101
|
5. **新建规则不能走 CLI**——后端没 `/api/file/create/backup/rule` 端点(前端 bug);
|
|
102
102
|
唯一新建路径是 `backup on` 在无规则时自动建默认。
|
|
@@ -174,10 +174,8 @@ backup delete --id 2 --yes
|
|
|
174
174
|
和备份目录都必须是 E10 应用服务器能访问的目录(不能是客户本机的
|
|
175
175
|
`/Users/xxx`、不能是某个应用节点临时目录、不能是其他服务器的远程
|
|
176
176
|
路径),否则后端写不进去。改路径时 agent **必须**在话术里复述这个约束
|
|
177
|
-
- **改"备份目录"前必做本地预校验,不发注定失败的请求** —
|
|
178
|
-
|
|
179
|
-
(`src/main/java/com/weaver/teams/file/e10/manager/file/FileSettingManagerImpl.java:276-302`)
|
|
180
|
-
会拒 5 类路径,agent 改路径前**必须**在 CLI 端先把目标路径跑一遍
|
|
177
|
+
- **改"备份目录"前必做本地预校验,不发注定失败的请求** — 后端会拒 5 类路径,
|
|
178
|
+
agent 改路径前**必须**在 CLI 端先把目标路径跑一遍
|
|
181
179
|
等价校验,任一不过**直接告诉客户"后端会拒:<原因>",让客户重新给路径**,
|
|
182
180
|
**不要**静默发请求让后端报错。5 项校验:
|
|
183
181
|
|
|
@@ -187,9 +185,7 @@ backup delete --id 2 --yes
|
|
|
187
185
|
4. 不能等于源目录(源目录按 `;` 切分后逐个比较)
|
|
188
186
|
5. 不能是源目录的子目录(源目录末尾补 `/` 后取备份路径前 N 位对比)
|
|
189
187
|
|
|
190
|
-
CLI
|
|
191
|
-
`cmd_update` 在 `--backup-path` 显式传值时自动跑,错误打到 stderr 并
|
|
192
|
-
`return 4`,不发请求。常见客户语言:
|
|
188
|
+
CLI 会在 `--backup-path` 显式传值时自动跑这 5 项校验,不通过直接报错返回,不发请求。常见客户语言:
|
|
193
189
|
- "路径要以 / 开头"(CODE_20080)
|
|
194
190
|
- "路径不能含特殊字符 \* ? \" < > |"(CODE_20078)
|
|
195
191
|
- "路径不能含空白 / 分号 / 单引号 / 全角问号"(FILE_PATH 正则)
|
|
@@ -224,11 +220,7 @@ backup delete --id 2 --yes
|
|
|
224
220
|
|
|
225
221
|
## 宿主
|
|
226
222
|
|
|
227
|
-
CLI
|
|
228
|
-
|
|
229
|
-
```text
|
|
230
|
-
python3 scripts/backup_setting.py <cmd> [args]
|
|
231
|
-
```
|
|
223
|
+
CLI 入口:`weaver-work-cli caizhilian run caizhilian.setting-backup.<operation>`(操作清单见 SKILL.md 路由表)。
|
|
232
224
|
|
|
233
225
|
|
|
234
226
|
## 与 weaver-setting-attach / weaver-setting-encrypt 的关系
|
|
@@ -244,28 +236,6 @@ python3 scripts/backup_setting.py <cmd> [args]
|
|
|
244
236
|
|
|
245
237
|
## 版本
|
|
246
238
|
|
|
247
|
-
- 0.1.0(2026-08-06)首次创建。
|
|
248
|
-
- 0.2.0(2026-08-06)优化:对话式规则完整内联 6 条(去除外部仓库依赖),加上 backup
|
|
249
|
-
特有"业务前置 + 路径约束 + 典型部署模板"作为规则 6/7 整合;重写"与 attach/encrypt
|
|
250
|
-
关系"段(删开发内部决策);门禁 1 补对话确认说明;加版本号规则。
|
|
251
|
-
- 0.2.1(2026-08-09)优化:规则 3 `show` / `list` 规则详情输出格式改为按列表
|
|
252
|
-
逐项展示,规则名前不再显示 `规则 #<id>`,直接用规则名。
|
|
253
|
-
- 0.2.2(2026-08-09)澄清:业务上后端只支持 1 条"默认备份规则",不能
|
|
254
|
-
新建第二条。规则 6 改写为"只支持 1 条默认规则,不能新增",去掉
|
|
255
|
-
"新建规则没 CLI 入口"的旧表述(之前会让用户去找 weapp 后台手动加,
|
|
256
|
-
实际是后端根本不支持)。
|
|
257
|
-
- 0.2.3(2026-08-09)修 bug + 加预校验:
|
|
258
|
-
- `scripts/backup_api.py 的 `get_rule`` 参数从 `id` 改为 `backupId`(后端
|
|
259
|
-
`FileBackupServiceImpl.getBackupRule:88` 校验的是 `backupId`,传 `id`
|
|
260
|
-
被拒)
|
|
261
|
-
- `scripts/backup_setting.py 的 `cmd_update`` 拉详情时多下沉一层到 `weaForm.data`,
|
|
262
|
-
否则 `backupName` 等字段读到空串
|
|
263
|
-
- 规则 6 加"改备份目录前必做本地预校验":把后端
|
|
264
|
-
`FileSettingManagerImpl.checkBackupPath:276-302` 的 5 项校验
|
|
265
|
-
(`/` 开头 / 硬禁字符 / FILE_PATH 正则 / 不等于源路径 / 非源路径子目录)
|
|
266
|
-
搬到 CLI 端 `_validate_backup_path()`,update 前自动跑,错误直接
|
|
267
|
-
拦在客户端不发请求
|
|
268
|
-
|
|
269
239
|
版本号规则 `x.y.z`:
|
|
270
240
|
- **x 升** — 大重构(接口变化、DTO 结构变化、命令大幅增删)
|
|
271
241
|
- **y 升** — 新增命令、新增子模块、新增业务场景
|
|
@@ -292,7 +262,7 @@ python3 scripts/backup_setting.py <cmd> [args]
|
|
|
292
262
|
|
|
293
263
|
1. **开关是逐字段 update**:只传 `sysLocalFileBackup` 一个字段,后端不会清空
|
|
294
264
|
其它字段(参考 agent memory 中 weaver-setting-attach 的同款经验)。
|
|
295
|
-
2. **开开关 + 无规则 =
|
|
265
|
+
2. **开开关 + 无规则 = 自动建默认规则**:
|
|
296
266
|
```java
|
|
297
267
|
getInitFileBackup(tenantKey, newValue)
|
|
298
268
|
→ 取第一个 LOCAL_STORE 实例 → 构造 BackupRuleCreateParam
|
|
@@ -302,19 +272,12 @@ python3 scripts/backup_setting.py <cmd> [args]
|
|
|
302
272
|
3. **新建规则的端点不存在**——前端 `createBackupRule` 调的是
|
|
303
273
|
`/api/file/create/backup/rule`,后端 `FileBackupController` 里**没有**这个
|
|
304
274
|
端点。前端 bug,CLI 不暴露 `create`。
|
|
305
|
-
4. **period 范围 60-1440
|
|
275
|
+
4. **period 范围 60-1440 分钟**——后端校验。
|
|
306
276
|
5. **delete 是批量**——body 是 `{ids: [N1, N2, ...]}`;CLI 一次只支持一个
|
|
307
277
|
id,多个需要循环。
|
|
308
278
|
6. **enable 接口的字段是 `enableStatus`(Boolean),不是 `enabled`**——后端
|
|
309
279
|
`BackupRuleEnableParam` 用 `enableStatus` 字段。
|
|
310
280
|
|
|
311
|
-
## 后端实现位置
|
|
312
|
-
|
|
313
|
-
- Controller:`eteams-file/src/main/java/com/weaver/teams/file/e10/mvc/web/FileBackupController.java`
|
|
314
|
-
- 开关注册:`eteams-file/src/main/java/com/weaver/teams/file/e10/manager/set/impl/SysLocalFileBackup.java`
|
|
315
|
-
- 规则 CRUD:`eteams-file/src/main/java/com/weaver/teams/file/e10/service/web/impl/FileBackupServiceImpl.java`
|
|
316
|
-
- Param/DTO:`eteams-file/src/main/java/com/weaver/teams/file/e10/param/BackupRule*.java`
|
|
317
|
-
- 前端 UI:`weapp-file/src/components/pc/FileSet/components/BackupSet/`
|
|
318
281
|
# 字段说明
|
|
319
282
|
|
|
320
283
|
## 顶层:本地备份开关
|
|
@@ -322,7 +285,7 @@ python3 scripts/backup_setting.py <cmd> [args]
|
|
|
322
285
|
- **DTO 字段**:`sysLocalFileBackup`(Boolean)
|
|
323
286
|
- **GET 端点**:`POST /api/file/tenant/setting`
|
|
324
287
|
- **SAVE 端点**:`POST /api/file/tenant/setting/save`(只传这一个字段)
|
|
325
|
-
- **特殊行为**:开时如果当前无规则,**自动建默认规则**(用第一个本地存储实例的 path
|
|
288
|
+
- **特殊行为**:开时如果当前无规则,**自动建默认规则**(用第一个本地存储实例的 path)
|
|
326
289
|
|
|
327
290
|
## 备份规则字段
|
|
328
291
|
|
|
@@ -360,13 +323,12 @@ python3 scripts/backup_setting.py <cmd> [args]
|
|
|
360
323
|
|
|
361
324
|
## ⚠️ 已知坑
|
|
362
325
|
|
|
363
|
-
1. **没有"新建规则"
|
|
364
|
-
|
|
365
|
-
后端没实现,是个**前端 bug**。CLI 不暴露 `create` 子命令。
|
|
326
|
+
1. **没有"新建规则"接口**——后端没有新建规则端点(前端页面调了但后端没实现,是个**前端 bug**)。
|
|
327
|
+
CLI 不暴露 `create` 子命令。
|
|
366
328
|
2. **唯一新建路径**:`backup on` 开启本地备份时如果无规则会自动建默认
|
|
367
329
|
(用第一个本地存储实例的 path)。如果租户没有本地存储实例,
|
|
368
|
-
|
|
330
|
+
后端会报"没有可用的本地存储"错误。
|
|
369
331
|
3. **规则操作需要本地备份开启**——CLI 在 `update/enable/disable/delete` 前
|
|
370
332
|
会 GET 一次 settings 检查 `sysLocalFileBackup`,没开会拒绝并提示先 `on`。
|
|
371
|
-
4. **period 范围 60-1440
|
|
333
|
+
4. **period 范围 60-1440**(后端校验),
|
|
372
334
|
CLI 也做同样校验;非整数倍数的"1440"会被四舍五入(按分钟)。
|