weaver-e10-builder 1.5.11 → 1.5.13

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 (212) hide show
  1. package/README.md +212 -189
  2. package/assets/image-style-observation.schema.json +1355 -0
  3. package/assets/layout-spec.schema.json +52 -0
  4. package/dist/commands/designer-common.d.ts.map +1 -1
  5. package/dist/commands/designer-common.js +91 -0
  6. package/dist/commands/designer-common.js.map +1 -1
  7. package/dist/commands/form-add-detail-table.d.ts.map +1 -1
  8. package/dist/commands/form-add-detail-table.js +97 -1
  9. package/dist/commands/form-add-detail-table.js.map +1 -1
  10. package/dist/commands/form-field-linkage.d.ts +55 -0
  11. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  12. package/dist/commands/form-field-linkage.js +1026 -12
  13. package/dist/commands/form-field-linkage.js.map +1 -1
  14. package/dist/commands/form-formula-linkage.d.ts +36 -0
  15. package/dist/commands/form-formula-linkage.d.ts.map +1 -1
  16. package/dist/commands/form-formula-linkage.js +107 -7
  17. package/dist/commands/form-formula-linkage.js.map +1 -1
  18. package/dist/commands/form-formula.d.ts.map +1 -1
  19. package/dist/commands/form-formula.js +21 -4
  20. package/dist/commands/form-formula.js.map +1 -1
  21. package/dist/commands/form-layout-restore.d.ts +3 -0
  22. package/dist/commands/form-layout-restore.d.ts.map +1 -0
  23. package/dist/commands/form-layout-restore.js +217 -0
  24. package/dist/commands/form-layout-restore.js.map +1 -0
  25. package/dist/commands/form-layout.d.ts.map +1 -1
  26. package/dist/commands/form-layout.js +11 -1
  27. package/dist/commands/form-layout.js.map +1 -1
  28. package/dist/commands/form-obj-meta.d.ts +12 -0
  29. package/dist/commands/form-obj-meta.d.ts.map +1 -0
  30. package/dist/commands/form-obj-meta.js +116 -0
  31. package/dist/commands/form-obj-meta.js.map +1 -0
  32. package/dist/commands/form-validate.d.ts.map +1 -1
  33. package/dist/commands/form-validate.js +167 -35
  34. package/dist/commands/form-validate.js.map +1 -1
  35. package/dist/commands/form.d.ts.map +1 -1
  36. package/dist/commands/form.js +359 -27
  37. package/dist/commands/form.js.map +1 -1
  38. package/dist/commands/menu.d.ts.map +1 -1
  39. package/dist/commands/menu.js +5 -3
  40. package/dist/commands/menu.js.map +1 -1
  41. package/dist/commands/wf-form.d.ts.map +1 -1
  42. package/dist/commands/wf-form.js +215 -13
  43. package/dist/commands/wf-form.js.map +1 -1
  44. package/dist/commands/workflow.d.ts.map +1 -1
  45. package/dist/commands/workflow.js +18 -4
  46. package/dist/commands/workflow.js.map +1 -1
  47. package/dist/core/client.d.ts +2 -1
  48. package/dist/core/client.d.ts.map +1 -1
  49. package/dist/core/client.js +4 -2
  50. package/dist/core/client.js.map +1 -1
  51. package/dist/index.js +2 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/services/actionflow/calendar_mapper.d.ts.map +1 -1
  54. package/dist/services/actionflow/calendar_mapper.js +34 -14
  55. package/dist/services/actionflow/calendar_mapper.js.map +1 -1
  56. package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
  57. package/dist/services/actionflow/components/document_actions.js +113 -4
  58. package/dist/services/actionflow/components/document_actions.js.map +1 -1
  59. package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
  60. package/dist/services/actionflow/components/eb_get_data_by_id.js +18 -1
  61. package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
  62. package/dist/services/actionflow/components/index.d.ts.map +1 -1
  63. package/dist/services/actionflow/components/index.js +2 -1
  64. package/dist/services/actionflow/components/index.js.map +1 -1
  65. package/dist/services/actionflow/components/schedule_create.d.ts.map +1 -1
  66. package/dist/services/actionflow/components/schedule_create.js +22 -6
  67. package/dist/services/actionflow/components/schedule_create.js.map +1 -1
  68. package/dist/services/actionflow/components/workflow_actions.d.ts +1 -0
  69. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  70. package/dist/services/actionflow/components/workflow_actions.js +31 -6
  71. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  72. package/dist/services/actionflow/context_preflight.d.ts +5 -0
  73. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  74. package/dist/services/actionflow/context_preflight.js +88 -34
  75. package/dist/services/actionflow/context_preflight.js.map +1 -1
  76. package/dist/services/actionflow/document_source.d.ts +5 -0
  77. package/dist/services/actionflow/document_source.d.ts.map +1 -1
  78. package/dist/services/actionflow/document_source.js +16 -0
  79. package/dist/services/actionflow/document_source.js.map +1 -1
  80. package/dist/services/actionflow/filter_rules.d.ts.map +1 -1
  81. package/dist/services/actionflow/filter_rules.js +9 -8
  82. package/dist/services/actionflow/filter_rules.js.map +1 -1
  83. package/dist/services/actionflow/formula_service.d.ts +2 -1
  84. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  85. package/dist/services/actionflow/formula_service.js +52 -22
  86. package/dist/services/actionflow/formula_service.js.map +1 -1
  87. package/dist/services/actionflow/preflight_service.d.ts +5 -0
  88. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  89. package/dist/services/actionflow/preflight_service.js +128 -3
  90. package/dist/services/actionflow/preflight_service.js.map +1 -1
  91. package/dist/services/actionflow/save_workflow_draft.d.ts +7 -0
  92. package/dist/services/actionflow/save_workflow_draft.d.ts.map +1 -1
  93. package/dist/services/actionflow/save_workflow_draft.js +1 -1
  94. package/dist/services/actionflow/save_workflow_draft.js.map +1 -1
  95. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  96. package/dist/services/actionflow/workflow_compiler.js +51 -13
  97. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  98. package/dist/services/form-formula-linkage.d.ts +4 -0
  99. package/dist/services/form-formula-linkage.d.ts.map +1 -1
  100. package/dist/services/form-formula-linkage.js +3 -1
  101. package/dist/services/form-formula-linkage.js.map +1 -1
  102. package/dist/services/form-layout-io.d.ts +18 -0
  103. package/dist/services/form-layout-io.d.ts.map +1 -0
  104. package/dist/services/form-layout-io.js +89 -0
  105. package/dist/services/form-layout-io.js.map +1 -0
  106. package/dist/services/form-layout-source/artifact.d.ts +8 -0
  107. package/dist/services/form-layout-source/artifact.d.ts.map +1 -0
  108. package/dist/services/form-layout-source/artifact.js +52 -0
  109. package/dist/services/form-layout-source/artifact.js.map +1 -0
  110. package/dist/services/form-layout-source/binding.d.ts +10 -0
  111. package/dist/services/form-layout-source/binding.d.ts.map +1 -0
  112. package/dist/services/form-layout-source/binding.js +43 -0
  113. package/dist/services/form-layout-source/binding.js.map +1 -0
  114. package/dist/services/form-layout-source/compile.d.ts +7 -0
  115. package/dist/services/form-layout-source/compile.d.ts.map +1 -0
  116. package/dist/services/form-layout-source/compile.js +262 -0
  117. package/dist/services/form-layout-source/compile.js.map +1 -0
  118. package/dist/services/form-layout-source/creation.d.ts +18 -0
  119. package/dist/services/form-layout-source/creation.d.ts.map +1 -0
  120. package/dist/services/form-layout-source/creation.js +42 -0
  121. package/dist/services/form-layout-source/creation.js.map +1 -0
  122. package/dist/services/form-layout-source/excel-extractor.d.ts +7 -0
  123. package/dist/services/form-layout-source/excel-extractor.d.ts.map +1 -0
  124. package/dist/services/form-layout-source/excel-extractor.js +342 -0
  125. package/dist/services/form-layout-source/excel-extractor.js.map +1 -0
  126. package/dist/services/form-layout-source/image-border.d.ts +9 -0
  127. package/dist/services/form-layout-source/image-border.d.ts.map +1 -0
  128. package/dist/services/form-layout-source/image-border.js +128 -0
  129. package/dist/services/form-layout-source/image-border.js.map +1 -0
  130. package/dist/services/form-layout-source/image-observation.d.ts +14 -0
  131. package/dist/services/form-layout-source/image-observation.d.ts.map +1 -0
  132. package/dist/services/form-layout-source/image-observation.js +90 -0
  133. package/dist/services/form-layout-source/image-observation.js.map +1 -0
  134. package/dist/services/form-layout-source/image-review.d.ts +32 -0
  135. package/dist/services/form-layout-source/image-review.d.ts.map +1 -0
  136. package/dist/services/form-layout-source/image-review.js +266 -0
  137. package/dist/services/form-layout-source/image-review.js.map +1 -0
  138. package/dist/services/form-layout-source/image-style.d.ts +16 -0
  139. package/dist/services/form-layout-source/image-style.d.ts.map +1 -0
  140. package/dist/services/form-layout-source/image-style.js +539 -0
  141. package/dist/services/form-layout-source/image-style.js.map +1 -0
  142. package/dist/services/form-layout-source/json.d.ts +3 -0
  143. package/dist/services/form-layout-source/json.d.ts.map +1 -0
  144. package/dist/services/form-layout-source/json.js +33 -0
  145. package/dist/services/form-layout-source/json.js.map +1 -0
  146. package/dist/services/form-layout-source/presentation.d.ts +23 -0
  147. package/dist/services/form-layout-source/presentation.d.ts.map +1 -0
  148. package/dist/services/form-layout-source/presentation.js +174 -0
  149. package/dist/services/form-layout-source/presentation.js.map +1 -0
  150. package/dist/services/form-layout-source/preview.d.ts +4 -0
  151. package/dist/services/form-layout-source/preview.d.ts.map +1 -0
  152. package/dist/services/form-layout-source/preview.js +49 -0
  153. package/dist/services/form-layout-source/preview.js.map +1 -0
  154. package/dist/services/form-layout-source/schema.d.ts +20 -0
  155. package/dist/services/form-layout-source/schema.d.ts.map +1 -0
  156. package/dist/services/form-layout-source/schema.js +149 -0
  157. package/dist/services/form-layout-source/schema.js.map +1 -0
  158. package/dist/services/form-layout-source/source-grid.d.ts +8 -0
  159. package/dist/services/form-layout-source/source-grid.d.ts.map +1 -0
  160. package/dist/services/form-layout-source/source-grid.js +61 -0
  161. package/dist/services/form-layout-source/source-grid.js.map +1 -0
  162. package/dist/services/form-layout-source/types.d.ts +242 -0
  163. package/dist/services/form-layout-source/types.d.ts.map +1 -0
  164. package/dist/services/form-layout-source/types.js +2 -0
  165. package/dist/services/form-layout-source/types.js.map +1 -0
  166. package/dist/services/form-layout-source/verify.d.ts +14 -0
  167. package/dist/services/form-layout-source/verify.d.ts.map +1 -0
  168. package/dist/services/form-layout-source/verify.js +226 -0
  169. package/dist/services/form-layout-source/verify.js.map +1 -0
  170. package/dist/services/form-linkage-condition.d.ts +15 -0
  171. package/dist/services/form-linkage-condition.d.ts.map +1 -1
  172. package/dist/services/form-linkage-condition.js +19 -10
  173. package/dist/services/form-linkage-condition.js.map +1 -1
  174. package/dist/services/form-obj-meta.d.ts +72 -0
  175. package/dist/services/form-obj-meta.d.ts.map +1 -0
  176. package/dist/services/form-obj-meta.js +103 -0
  177. package/dist/services/form-obj-meta.js.map +1 -0
  178. package/dist/services/form-sub-detail.d.ts +25 -0
  179. package/dist/services/form-sub-detail.d.ts.map +1 -1
  180. package/dist/services/form-sub-detail.js +64 -0
  181. package/dist/services/form-sub-detail.js.map +1 -1
  182. package/dist/services/validate-help.d.ts +25 -0
  183. package/dist/services/validate-help.d.ts.map +1 -0
  184. package/dist/services/validate-help.js +29 -0
  185. package/dist/services/validate-help.js.map +1 -0
  186. package/dist/services/workflow-operator.d.ts +12 -5
  187. package/dist/services/workflow-operator.d.ts.map +1 -1
  188. package/dist/services/workflow-operator.js +41 -16
  189. package/dist/services/workflow-operator.js.map +1 -1
  190. package/package.json +3 -1
  191. package/skill-docs/SKILL.md +38 -165
  192. package/skill-docs/_catalog.md +4 -1
  193. package/skill-docs/actionflows/references/components/document/DocumentSave.md +17 -17
  194. package/skill-docs/actionflows/references/components/workflow/ApproveCompletelyDelete.md +29 -0
  195. package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +1 -1
  196. package/skill-docs/assets/schemas/image-style-observation.schema.json +1355 -0
  197. package/skill-docs/references/coding/guide-page-code.md +2 -0
  198. package/skill-docs/references/coding/ref-compile-rules.md +2 -0
  199. package/skill-docs/references/common/capability-boundaries.md +15 -0
  200. package/skill-docs/references/common/guide-install.md +44 -0
  201. package/skill-docs/references/common/guide-plan-template.md +167 -164
  202. package/skill-docs/references/common/map.md +9 -0
  203. package/skill-docs/references/common/ref-cli-commands.md +650 -635
  204. package/skill-docs/references/form/guide-create-form.md +2 -0
  205. package/skill-docs/references/form/guide-field-linkage.md +185 -58
  206. package/skill-docs/references/form/guide-form-formula-functions.md +354 -343
  207. package/skill-docs/references/form/guide-form-layout-planning.md +6 -0
  208. package/skill-docs/references/form/guide-form-layout-source.md +366 -0
  209. package/skill-docs/references/form/guide-form-linkage.md +56 -66
  210. package/skill-docs/references/form/guide-form-view.md +1 -1
  211. package/skill-docs/references/form/guide-formula-linkage.md +44 -1
  212. package/skill-docs/references/workflow/guide-workflow.md +1 -1
package/README.md CHANGED
@@ -1,189 +1,212 @@
1
- # e10-cli — 泛微 OA 命令行工具
2
-
3
- > 面向开发者和自动化场景的 Eteams/Ebuilder 命令行工具。一行命令完成应用创建、表单管理、代码部署,无需打开浏览器。
4
-
5
- ## 1. 产品定位
6
-
7
- 泛微 OA 的日常操作(建应用、建表单、导代码、搜员工)原本只能在 Web 后台点选完成。`e10-cli` 把这些操作封装为标准命令行,支持:
8
-
9
- - **人工使用**:终端里快速执行,比网页点击快 10 倍
10
- - **AI Agent 调用**:Claude Code Agent 通过 CLI 自动完成复杂任务
11
- - **CI/CD 集成**:脚本化批量操作
12
-
13
- ```
14
- # 创建应用 + 表单 + 流程,一条龙
15
- e10-cli app create 会议室管理
16
- e10-cli form create <appId> 会议室表单 ./project
17
- e10-cli workflow create <appId> <formObjId> 会议室审批
18
- ```
19
-
20
- ## 2. 命令全景
21
-
22
- ### 2.1 代码相关(Ecode 自定义页面)
23
-
24
- | 命令 | 说明 |
25
- |------|------|
26
- | `e10-cli project create <name> [desc]` | 新建 Ecode 项目 |
27
- | `e10-cli project import <projectId> <zip> --main-url <url>` | 导入代码包 |
28
- | `e10-cli project tree <parentId>` | 查看目录结构 |
29
- | `e10-cli project read <fileId>` | 读取代码文件 |
30
- | `e10-cli project update <fileId> <content>` | 更新代码文件 |
31
- | `e10-cli project create-file <name> <parentId>` | 新建文件 |
32
- | `e10-cli project create-folder <name> <parentId>` | 新建文件夹 |
33
- | `e10-cli project delete-file <fileId>` | 删除文件 |
34
- | `e10-cli project delete-folder <folderId>` | 删除文件夹 |
35
- | `e10-cli check [dir]` | 代码质量自检 |
36
-
37
- ### 2.2 Ebuilder 相关(应用 / 表单 / 流程 / 菜单)
38
-
39
- | 命令 | 说明 |
40
- |------|------|
41
- | `e10-cli app create <name> [desc]` | 新建 Ebuilder 应用 |
42
- | `e10-cli form read <objId> [dir]` | 读取表单字段 |
43
- | `e10-cli form list <appId>` | 列出应用表单 |
44
- | `e10-cli form create <appId> <name> <dir>` | 创建表单 |
45
- | `e10-cli form add-field <objId> <appId> <name> <type>` | 添加字段 |
46
- | `e10-cli form delete <objId> <appId>` | 删除表单 |
47
- | `e10-cli menu list <appId>` | 列出菜单 |
48
- | `e10-cli menu add <name> <path> <appId>` | 添加菜单 |
49
- | `e10-cli menu delete <menuId> <appId>` | 删除菜单 |
50
- | `e10-cli workflow create <appId> <formObjId> <name>` | 创建流程 |
51
- | `e10-cli form data add <objId> <json>` | 写入一条表单数据 |
52
- | `e10-cli form data list <objId>` | 查询表单数据 |
53
- | `e10-cli form data delete <objId> <dataId>` | 删除一条表单数据 |
54
-
55
- ### 2.3 其他(人员 / 图标)
56
-
57
- | 命令 | 说明 |
58
- |------|------|
59
- | `e10-cli user search <keyword> [count]` | 模糊搜索员工 |
60
- | `e10-cli icon search <keyword...>` | 搜索 Ebuilder 图标 |
61
-
62
- ## 3. 架构设计
63
-
64
- ```
65
- ┌─────────────────────────────────────────────┐
66
- │ e10-cli │
67
- │ │
68
- │ ┌──────────┐ ┌──────────┐ ┌────────────┐ │
69
- │ │ commands │ │ core │ │ types │ │
70
- │ │ │ │ │ │ │ │
71
- │ │ form │ │ auth ←──┼──┤ AuthData │ │
72
- │ │ project │ │ client │ │ Employee │ │
73
- │ │ app │ │ crypto │ │ MenuItem │ │
74
- │ │ menu │ │ │ │ ... │ │
75
- │ │ workflow │ └────┬─────┘ └────────────┘ │
76
- │ │ user │ │ │
77
- │ │ icon │ │ fetch + ETEAMSID │
78
- │ │ check │ │ │
79
- │ └──────────┘ ▼ │
80
- │ ┌──────────┐ │
81
- │ │ 泛微 API │ │
82
- │ │ (HTTPS) │ │
83
- │ └──────────┘ │
84
- └─────────────────────────────────────────────┘
85
- ```
86
-
87
- - **TypeScript 实现**,Node.js 18+ 运行,零外部运行时依赖
88
- - **Commander.js** 做命令行路由(npm 周下载量第一的 CLI 框架)
89
- - 每条命令对应一个函数,调用泛微 REST API,返回结构化结果
90
- - 支持 `--json` 输出机器可读格式,方便脚本管道
91
-
92
- ## 4. 认证与安全
93
-
94
- ### 4.1 设计原则
95
-
96
- > **命令行参数中永不出现凭证。**
97
-
98
- 凭证加密存储在操作系统密钥链中,CLI 参数只传 `--profile`(环境名)或 `--auth <文件路径>`,实际 token 在进程内存中解密后通过 HTTPS Header 发送。
99
-
100
- | 层面 | 实现 |
101
- |------|------|
102
- | **静态存储** | `.eteams-auth.json` 文件内容使用 AES-256-GCM 加密 |
103
- | **密钥来源** | 32 字节随机密钥存操作系统密钥链,**每台机器一把,源码与仓库中不含任何密钥材料** |
104
- | **无密钥链时** | 回退到本地密钥文件(文件权限 `0600`),密钥仍是随机生成、非源码内置 |
105
- | **CLI 参数** | 只接受 `--profile` / `--auth <文件路径>`,不接受任何形式的 token/密码 |
106
- | **内存中** | 运行时解密到进程内存,通过 HTTPS Header 发送 |
107
- | **传输** | 全程 HTTPS,ETEAMSID 作为 HTTP Header 发送 |
108
-
109
- ### 4.2 加密文件格式
110
-
111
- `.eteams-auth.json` 实际存储内容(加密后):
112
-
113
- ```json
114
- {
115
- "enc": true,
116
- "v": 1,
117
- "data": "<base64(iv 12字节 + AES-256-GCM密文 + 认证标签 16字节)>"
118
- }
119
- ```
120
-
121
- 解密后得到真实的认证数据:
122
-
123
- ```json
124
- {
125
- "cookies": { "ETEAMSID": "PCACCOUNT_xxx..." },
126
- "userId": "your_account",
127
- "tenantKey": "your_tenant_key",
128
- "baseUrl": "https://weapp.example.com",
129
- "passportUrl": "https://passport.example.com",
130
- "cookieSavedAt": 1783424987112
131
- }
132
- ```
133
-
134
- ### 4.3 威胁模型
135
-
136
- ```
137
- 攻击者能做什么 → 防护措施
138
- ─────────────────────────────────────────────
139
- 读取磁盘上的 auth 文件 → AES-256-GCM 加密,密钥不在文件里
140
- 查看进程命令行 (ps aux) → 命令行从不出现任何凭证
141
- 拦截网络传输 → 全程 HTTPS
142
- 拿到源码或整个仓库 → 密钥在本机密钥链里,源码中没有任何密钥材料
143
- 获取内存 dump → ETEAMSID 有时效性,过期自动失效
144
- ```
145
-
146
- ### 4.4 凭证生命周期
147
-
148
- ```
149
- Web 登录 (SSO / 账号密码)
150
- │
151
- ├─→ 泛微 passport 返回 ETEAMSID
152
- │
153
- ├─→ AES-256-GCM 加密写入 .eteams-auth.json
154
- │
155
- ├─→ CLI 运行时解密到内存
156
- │ │
157
- │ ├─→ 每次 API 调用注入 eteamsid header → HTTPS → 泛微服务端
158
- │ │
159
- │ └─→ cookie 过期检测(302 重定向)→ 可选自动续签
160
- │ │
161
- │ └─→ 通过环境变量 E10_ACCOUNT / E10_PASSWORD RSA 重新登录
162
- │ (未设置则提示用户通过 Web 页面重新登录)
163
- ```
164
-
165
- ## 5. 安装使用
166
-
167
- ```bash
168
- # 安装
169
- npm i -g weaver-e10-builder
170
-
171
- # 认证(通过 Web 登录一次,自动生成加密的 .eteams-auth.json)
172
- # 访问 http://localhost:7981 → SSO 登录 → 自动保存
173
-
174
- # 使用
175
- e10-cli user search 王晶
176
- e10-cli menu list 1289012843518550017 --json
177
- ```
178
-
179
- ## 6. 技术栈
180
-
181
- | 层 | 技术 |
182
- |----|------|
183
- | 语言 | TypeScript |
184
- | 运行时 | Node.js 18+ |
185
- | CLI 框架 | Commander.js |
186
- | HTTP | Node 内置 fetch |
187
- | 加密 | Node 内置 crypto (AES-256-GCM) |
188
- | 图标数据库 | sql.js (SQLite WASM) |
189
- | 打包 | tsc → 纯 JS,零依赖编译 |
1
+ # e10-cli — 泛微 OA 命令行工具
2
+
3
+ > 面向开发者和自动化场景的 Eteams/Ebuilder 命令行工具。一行命令完成应用创建、表单管理、代码部署,无需打开浏览器。
4
+
5
+ ## 1. 产品定位
6
+
7
+ 泛微 OA 的日常操作(建应用、建表单、导代码、搜员工)原本只能在 Web 后台点选完成。`e10-cli` 把这些操作封装为标准命令行,支持:
8
+
9
+ - **人工使用**:终端里快速执行,比网页点击快 10 倍
10
+ - **AI Agent 调用**:Claude Code Agent 通过 CLI 自动完成复杂任务
11
+ - **CI/CD 集成**:脚本化批量操作
12
+
13
+ ```
14
+ # 创建应用 + 表单 + 流程,一条龙
15
+ e10-cli app create 会议室管理
16
+ e10-cli form create <appId> 会议室表单 ./project
17
+ e10-cli workflow create <appId> <formObjId> 会议室审批
18
+ ```
19
+
20
+ ## 2. 命令全景
21
+
22
+ ### 2.1 代码相关(Ecode 自定义页面)
23
+
24
+ | 命令 | 说明 |
25
+ |------|------|
26
+ | `e10-cli project create <name> [desc]` | 新建 Ecode 项目 |
27
+ | `e10-cli project import <projectId> <zip> --main-url <url>` | 导入代码包 |
28
+ | `e10-cli project tree <parentId>` | 查看目录结构 |
29
+ | `e10-cli project read <fileId>` | 读取代码文件 |
30
+ | `e10-cli project update <fileId> <content>` | 更新代码文件 |
31
+ | `e10-cli project create-file <name> <parentId>` | 新建文件 |
32
+ | `e10-cli project create-folder <name> <parentId>` | 新建文件夹 |
33
+ | `e10-cli project delete-file <fileId>` | 删除文件 |
34
+ | `e10-cli project delete-folder <folderId>` | 删除文件夹 |
35
+ | `e10-cli check [dir]` | 代码质量自检 |
36
+
37
+ ### 2.2 Ebuilder 相关(应用 / 表单 / 流程 / 菜单)
38
+
39
+ | 命令 | 说明 |
40
+ |------|------|
41
+ | `e10-cli app create <name> [desc]` | 新建 Ebuilder 应用 |
42
+ | `e10-cli form read <objId> [dir]` | 读取表单字段 |
43
+ | `e10-cli form list <appId>` | 列出应用表单 |
44
+ | `e10-cli form create <appId> <name> <dir>` | 创建表单 |
45
+ | `e10-cli form add-field <objId> <appId> <name> <type>` | 添加字段 |
46
+ | `e10-cli form delete <objId> <appId>` | 删除表单 |
47
+ | `e10-cli menu list <appId>` | 列出菜单 |
48
+ | `e10-cli menu add <name> <path> <appId>` | 添加菜单 |
49
+ | `e10-cli menu delete <menuId> <appId>` | 删除菜单 |
50
+ | `e10-cli workflow create <appId> <formObjId> <name>` | 创建流程 |
51
+ | `e10-cli form data add <objId> <json>` | 写入一条表单数据 |
52
+ | `e10-cli form data list <objId>` | 查询表单数据 |
53
+ | `e10-cli form data delete <objId> <dataId>` | 删除一条表单数据 |
54
+
55
+ ### 2.3 其他(人员 / 图标)
56
+
57
+ | 命令 | 说明 |
58
+ |------|------|
59
+ | `e10-cli user search <keyword> [count]` | 模糊搜索员工 |
60
+ | `e10-cli icon search <keyword...>` | 搜索 Ebuilder 图标 |
61
+
62
+ ## 3. 架构设计
63
+
64
+ ```
65
+ ┌─────────────────────────────────────────────┐
66
+ │ e10-cli │
67
+ │ │
68
+ │ ┌──────────┐ ┌──────────┐ ┌────────────┐ │
69
+ │ │ commands │ │ core │ │ types │ │
70
+ │ │ │ │ │ │ │ │
71
+ │ │ form │ │ auth ←──┼──┤ AuthData │ │
72
+ │ │ project │ │ client │ │ Employee │ │
73
+ │ │ app │ │ crypto │ │ MenuItem │ │
74
+ │ │ menu │ │ │ │ ... │ │
75
+ │ │ workflow │ └────┬─────┘ └────────────┘ │
76
+ │ │ user │ │ │
77
+ │ │ icon │ │ fetch + ETEAMSID │
78
+ │ │ check │ │ │
79
+ │ └──────────┘ ▼ │
80
+ │ ┌──────────┐ │
81
+ │ │ 泛微 API │ │
82
+ │ │ (HTTPS) │ │
83
+ │ └──────────┘ │
84
+ └─────────────────────────────────────────────┘
85
+ ```
86
+
87
+ - **TypeScript 实现**,Node.js 18+ 运行,零外部运行时依赖
88
+ - **Commander.js** 做命令行路由(npm 周下载量第一的 CLI 框架)
89
+ - 每条命令对应一个函数,调用泛微 REST API,返回结构化结果
90
+ - 支持 `--json` 输出机器可读格式,方便脚本管道
91
+
92
+ ## 4. 认证与安全
93
+
94
+ ### 4.1 设计原则
95
+
96
+ > **命令行参数中永不出现凭证。**
97
+
98
+ 凭证加密存储在操作系统密钥链中,CLI 参数只传 `--profile`(环境名)或 `--auth <文件路径>`,实际 token 在进程内存中解密后通过 HTTPS Header 发送。
99
+
100
+ | 层面 | 实现 |
101
+ |------|------|
102
+ | **静态存储** | `.eteams-auth.json` 文件内容使用 AES-256-GCM 加密 |
103
+ | **密钥来源** | 32 字节随机密钥存操作系统密钥链,**每台机器一把,源码与仓库中不含任何密钥材料** |
104
+ | **无密钥链时** | 回退到本地密钥文件(文件权限 `0600`),密钥仍是随机生成、非源码内置 |
105
+ | **CLI 参数** | 只接受 `--profile` / `--auth <文件路径>`,不接受任何形式的 token/密码 |
106
+ | **内存中** | 运行时解密到进程内存,通过 HTTPS Header 发送 |
107
+ | **传输** | 全程 HTTPS,ETEAMSID 作为 HTTP Header 发送 |
108
+
109
+ ### 4.2 加密文件格式
110
+
111
+ `.eteams-auth.json` 实际存储内容(加密后):
112
+
113
+ ```json
114
+ {
115
+ "enc": true,
116
+ "v": 1,
117
+ "data": "<base64(iv 12字节 + AES-256-GCM密文 + 认证标签 16字节)>"
118
+ }
119
+ ```
120
+
121
+ 解密后得到真实的认证数据:
122
+
123
+ ```json
124
+ {
125
+ "cookies": { "ETEAMSID": "PCACCOUNT_xxx..." },
126
+ "userId": "your_account",
127
+ "tenantKey": "your_tenant_key",
128
+ "baseUrl": "https://weapp.example.com",
129
+ "passportUrl": "https://passport.example.com",
130
+ "cookieSavedAt": 1783424987112
131
+ }
132
+ ```
133
+
134
+ ### 4.3 威胁模型
135
+
136
+ ```
137
+ 攻击者能做什么 → 防护措施
138
+ ─────────────────────────────────────────────
139
+ 读取磁盘上的 auth 文件 → AES-256-GCM 加密,密钥不在文件里
140
+ 查看进程命令行 (ps aux) → 命令行从不出现任何凭证
141
+ 拦截网络传输 → 全程 HTTPS
142
+ 拿到源码或整个仓库 → 密钥在本机密钥链里,源码中没有任何密钥材料
143
+ 获取内存 dump → ETEAMSID 有时效性,过期自动失效
144
+ ```
145
+
146
+ ### 4.4 凭证生命周期
147
+
148
+ ```
149
+ Web 登录 (SSO / 账号密码)
150
+ │
151
+ ├─→ 泛微 passport 返回 ETEAMSID
152
+ │
153
+ ├─→ AES-256-GCM 加密写入 .eteams-auth.json
154
+ │
155
+ ├─→ CLI 运行时解密到内存
156
+ │ │
157
+ │ ├─→ 每次 API 调用注入 eteamsid header → HTTPS → 泛微服务端
158
+ │ │
159
+ │ └─→ cookie 过期检测(302 重定向)→ 可选自动续签
160
+ │ │
161
+ │ └─→ 通过环境变量 E10_ACCOUNT / E10_PASSWORD RSA 重新登录
162
+ │ (未设置则提示用户通过 Web 页面重新登录)
163
+ ```
164
+
165
+ ## 5. 安装使用
166
+
167
+ ```bash
168
+ # 安装
169
+ npm i -g weaver-e10-builder
170
+
171
+ # 认证(通过 Web 登录一次,自动生成加密的 .eteams-auth.json)
172
+ # 访问 http://localhost:7981 → SSO 登录 → 自动保存
173
+
174
+ # 使用
175
+ e10-cli user search 王晶
176
+ e10-cli menu list 1289012843518550017 --json
177
+ ```
178
+
179
+ ## 6. 技术栈
180
+
181
+ | 层 | 技术 |
182
+ |----|------|
183
+ | 语言 | TypeScript |
184
+ | 运行时 | Node.js 18+ |
185
+ | CLI 框架 | Commander.js |
186
+ | HTTP | Node 内置 fetch |
187
+ | 加密 | Node 内置 crypto (AES-256-GCM) |
188
+ | 图标数据库 | sql.js (SQLite WASM) |
189
+ | 打包 | tsc → 纯 JS,零依赖编译 |
190
+
191
+ ## 7. 图片和 XLSX 源样式还原
192
+
193
+ 现有表单和字段创建行为保持原样。新增布局命令把源样表绑定到已创建字段,生成 pageLayouts 和原生 workbook,通过 saveFormAndLayout 单次保存并独立回读。实现全部位于 CLI 内,不依赖 Form Engine 或 Python。
194
+
195
+ ```bash
196
+ e10-cli form layout extract sample.xlsx --out layout-source.json
197
+ e10-cli form layout compile <objId> --source @layout-source.json --spec @layout-spec.json --out layout-artifact.json
198
+ e10-cli form layout apply <objId> --artifact @layout-artifact.json --out layout-result.json
199
+ e10-cli form layout verify <objId> --artifact @layout-artifact.json
200
+ ```
201
+
202
+ 图片先用 `form layout image-context <file> --out image-context.json` 获取真实哈希,由 Agent 查看图片后按文档产出结构化观察,再通过 `extract --observation` 接入同一编译链。`inspect` 导出完整原生上下文,`compile --context` 支持无登录的离线编译。
203
+
204
+ 图片样式在保存前需经用户二次确认:`form layout style-review --source @json --spec @json --out <file>` 展示字体、字号、颜色及对齐;用户自然语言修改由 Agent 定位,`--overrides` 逐项转换,未知单项保留图片识别值。收到用户确认或明确修改后才使用 `--confirm`,再重新 compile。v4 同步几何区域的标题对齐到组件样式,并在图片保存前检查确认状态,Excel 和旧产物保持原行为。
205
+
206
+ `form create` 可加 `--layout-source`、`--layout-spec` 和 `--layout-artifact-out`,在字段补写与归组结束后衔接还原。布局失败保留已有表单并返回具体部分状态,不重新建表。
207
+
208
+ 当前范围为已有单个 PC EXCEL 页面、普通主表和完整原生普通明细。保留业务配置;未匹配字段、标题冲突、跨界合并、嵌套容器及不支持源样式会明确报告。独立回读证明结构和支持样式,图片像素一致性需另行渲染验收。详见 [源样式指南](skill/references/form/guide-form-layout-source.md) 和 [LayoutSpec Schema](assets/layout-spec.schema.json)。
209
+
210
+ 图片观察新增可选 `imageStyles`,支持颜色、字体粗细/字号、对齐、边框、页面背景及已有原生分类支持的组件外观。图片 extract 规范化 `align/bold` 别名,bold 不再被错误替换为下划线;compile 同步 workbook 与组件自定义样式,并输出 imageStyleReport。使用 `form layout style-audit <id> --artifact @json [--context @json]` 定位 cell/component/page 层的样式漂移。未观察到样式或分类不闭合默认阻断,不切换基础模板,也不修改字段业务属性。Schema 见 [图片样式观察](assets/image-style-observation.schema.json)。
211
+
212
+ v5 图片布局增加表格外框观察与回读检查:`imageStyles.tableBorders` 明确正文范围及四侧边线,区分有线、none 和 unknown;未观察不能保存。几何投影保留已声明的外围边线,外框落在正文边缘。`style-review` 展示表格线粗细清单,`gridBorderStyle` 支持对已声明表格的外框及内部线统一调整粗细/颜色/线型;控件输入框和标题区保持独立。新旧编译产物按各自版本校验。