weaver-work-cli 0.1.28 → 0.1.31

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 (219) hide show
  1. package/dist/chunks/archive-U766FTFH.js +2537 -0
  2. package/dist/chunks/archive-oa-DMWEKX3L.js +1317 -0
  3. package/dist/chunks/asset-TCR7VDEV.js +2109 -0
  4. package/dist/chunks/attachment-content-AQNX5N3S.js +23 -0
  5. package/dist/chunks/blog-EVZWGDVM.js +2157 -0
  6. package/dist/chunks/caizhilian-JOWS6SL5.js +10087 -0
  7. package/dist/chunks/calendar-5WNCV66Q.js +1195 -0
  8. package/dist/chunks/chunk-2DUV44UX.js +15606 -0
  9. package/dist/chunks/chunk-324YPTC2.js +1607 -0
  10. package/dist/chunks/chunk-65QMVWHS.js +231 -0
  11. package/dist/chunks/chunk-6V7ZLF34.js +387 -0
  12. package/dist/chunks/chunk-AC7KJWC5.js +358 -0
  13. package/dist/chunks/chunk-AJ62BGAW.js +29 -0
  14. package/dist/chunks/chunk-BUSC6UAE.js +43 -0
  15. package/dist/chunks/chunk-CVZ2JOSW.js +62 -0
  16. package/dist/chunks/chunk-D4LTJSJD.js +477 -0
  17. package/dist/chunks/chunk-EG6ZU444.js +654 -0
  18. package/dist/chunks/chunk-EZALDOQH.js +383 -0
  19. package/dist/chunks/chunk-FMPJJYYI.js +106 -0
  20. package/dist/chunks/chunk-G2JSIUWF.js +769 -0
  21. package/dist/chunks/chunk-GCG2NMWR.js +703 -0
  22. package/dist/chunks/chunk-GPMFD4RD.js +75 -0
  23. package/dist/chunks/chunk-H3WDBYJW.js +508 -0
  24. package/dist/chunks/chunk-H6XSTSLM.js +2357 -0
  25. package/dist/chunks/chunk-J7RJTZSV.js +5556 -0
  26. package/dist/chunks/chunk-LUSPKZKY.js +53 -0
  27. package/dist/chunks/chunk-NIAJ5ZCG.js +73 -0
  28. package/dist/chunks/chunk-NOODWMCL.js +584 -0
  29. package/dist/chunks/chunk-OOUTBLZ4.js +51 -0
  30. package/dist/chunks/chunk-P26ZWSKU.js +73 -0
  31. package/dist/chunks/chunk-QWY6PGL6.js +3472 -0
  32. package/dist/chunks/chunk-R2IJAK7T.js +464 -0
  33. package/dist/chunks/chunk-R7O5PUWO.js +205 -0
  34. package/dist/chunks/chunk-RCGYCOMG.js +6962 -0
  35. package/dist/chunks/chunk-VZTXRG6X.js +403 -0
  36. package/dist/chunks/chunk-WHD4XMRP.js +161 -0
  37. package/dist/chunks/chunk-YLCYX7LE.js +371 -0
  38. package/dist/chunks/chunk-ZEDWSH32.js +68 -0
  39. package/dist/chunks/continuation-2CKSBLA6.js +11 -0
  40. package/dist/chunks/continuation-HZIZRZBX.js +13 -0
  41. package/dist/chunks/continuation-NLECEJPX.js +11 -0
  42. package/dist/chunks/ebuilder-form-NJ4YK6CC.js +2276 -0
  43. package/dist/chunks/ehr-MMYN36VA.js +5241 -0
  44. package/dist/chunks/employee-SAK2QYXX.js +11 -0
  45. package/dist/chunks/esb-HIWHOU7Q.js +141 -0
  46. package/dist/chunks/fna-KBACQTA5.js +1444 -0
  47. package/dist/chunks/host-3OHS5QUX.js +21 -0
  48. package/dist/chunks/host-IG6KEH5Q.js +19 -0
  49. package/dist/chunks/host-KQL5N4HO.js +23 -0
  50. package/dist/chunks/host-LLSZQCWR.js +17 -0
  51. package/dist/chunks/hrm-LYEC67ZQ.js +244 -0
  52. package/dist/chunks/im-RN2UKAEU.js +252 -0
  53. package/dist/chunks/invoice-EEPHLAF6.js +5179 -0
  54. package/dist/chunks/jiuchuanhui-WVVZYSJE.js +1940 -0
  55. package/dist/chunks/lazy-dispatch-MDOFFL2S.js +28 -0
  56. package/dist/chunks/mail-LNQLTF6L.js +2695 -0
  57. package/dist/chunks/meeting-XSD3BDVQ.js +504 -0
  58. package/dist/chunks/msg-parse-4GSQ2WTO.js +41 -0
  59. package/dist/chunks/okr-TMWTIU2K.js +2482 -0
  60. package/dist/chunks/plan-A2FSFA7T.js +2025 -0
  61. package/dist/chunks/project-T26QLBQF.js +1361 -0
  62. package/dist/chunks/registry-2VLUAESA.js +14 -0
  63. package/dist/chunks/registry-JCFEYXOE.js +18 -0
  64. package/dist/chunks/registry-NYPYMZXG.js +16 -0
  65. package/dist/chunks/registry-Q7OQJ3SU.js +19 -0
  66. package/dist/chunks/registry-ZJMJVWFA.js +19 -0
  67. package/dist/chunks/room-recommend-UR4ZDZS6.js +20 -0
  68. package/dist/chunks/schedule-5L2PM4M6.js +24 -0
  69. package/dist/chunks/state-Y2XBP6YE.js +15 -0
  70. package/dist/chunks/workflow-TR6PG2SL.js +245 -0
  71. package/dist/cmd/argv.js +45 -0
  72. package/dist/cmd/docs/index.js +3 -3
  73. package/dist/cmd/lazy-dispatch.js +20 -0
  74. package/dist/cmd/root.js +2 -4
  75. package/dist/cmd/setup/index.js +2 -2
  76. package/dist/cmd/skills/index.js +2 -2
  77. package/dist/core/package-paths.js +47 -0
  78. package/dist/index.js +163 -7
  79. package/dist/internal/e10/auth/xiaoe.js +3 -3
  80. package/dist/internal/e10/request-runtime.js +18 -62
  81. package/dist/internal/skills/detector.js +2 -2
  82. package/dist/shortcuts/contract/data/performance-catalog.js +1306 -0
  83. package/dist/shortcuts/contract/host.js +91 -35
  84. package/dist/shortcuts/contract/index.js +213 -0
  85. package/dist/shortcuts/contract/manifest.js +928 -0
  86. package/dist/shortcuts/contract/ooxml/docx.js +295 -0
  87. package/dist/shortcuts/contract/ooxml/xlsx.js +221 -0
  88. package/dist/shortcuts/contract/ooxml/zip.js +158 -0
  89. package/dist/shortcuts/contract/operations/assistant.js +1156 -0
  90. package/dist/shortcuts/contract/operations/clause-library.js +522 -0
  91. package/dist/shortcuts/contract/operations/compare.js +193 -0
  92. package/dist/shortcuts/contract/operations/credit-page.js +34 -0
  93. package/dist/shortcuts/contract/operations/flow.js +98 -0
  94. package/dist/shortcuts/contract/operations/page.js +66 -0
  95. package/dist/shortcuts/contract/operations/performance.js +733 -0
  96. package/dist/shortcuts/contract/operations/quote.js +557 -0
  97. package/dist/shortcuts/contract/operations/recommend.js +78 -0
  98. package/dist/shortcuts/contract/operations/registry.js +18 -0
  99. package/dist/shortcuts/contract/operations/review.js +83 -0
  100. package/dist/shortcuts/contract/operations/shared.js +37 -0
  101. package/dist/shortcuts/contract/operations/upload.js +108 -0
  102. package/dist/shortcuts/contract/operations/write.js +3 -2
  103. package/dist/shortcuts/index.js +140 -40
  104. package/dist/shortcuts/invoice/host.js +2 -1
  105. package/dist/shortcuts/invoice/manifest.js +36 -12
  106. package/dist/shortcuts/invoice/operations/issuing-qys.js +132 -36
  107. package/dist/shortcuts/invoice/operations/reim-auto.js +9 -0
  108. package/dist/shortcuts/invoice/operations/reim.js +81 -5
  109. package/dist/shortcuts/invoice/operations/shared.js +12 -5
  110. package/dist/shortcuts/meeting/host.js +45 -3
  111. package/dist/shortcuts/meeting/invitation/docx.js +442 -0
  112. package/dist/shortcuts/meeting/operations/attachment-content.js +418 -0
  113. package/dist/shortcuts/meeting/operations/attachment.js +442 -0
  114. package/dist/shortcuts/meeting/operations/eb/cache.js +57 -0
  115. package/dist/shortcuts/meeting/operations/eb/catalog.js +343 -28
  116. package/dist/shortcuts/meeting/operations/eb/conflict.js +372 -11
  117. package/dist/shortcuts/meeting/operations/eb/create-flow.js +710 -0
  118. package/dist/shortcuts/meeting/operations/eb/decision.js +47 -1
  119. package/dist/shortcuts/meeting/operations/eb/factory.js +129 -11
  120. package/dist/shortcuts/meeting/operations/eb/index.js +122 -2
  121. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +378 -0
  122. package/dist/shortcuts/meeting/operations/eb/room-summary.js +84 -0
  123. package/dist/shortcuts/meeting/operations/eb/schedule.js +450 -0
  124. package/dist/shortcuts/meeting/operations/from-group-chat.js +576 -0
  125. package/dist/shortcuts/meeting/operations/invitation.js +458 -0
  126. package/dist/shortcuts/meeting/operations/minute-content.js +266 -0
  127. package/dist/shortcuts/meeting/operations/pipeline.js +489 -0
  128. package/dist/shortcuts/meeting/operations/qrcode.js +131 -0
  129. package/dist/shortcuts/meeting/operations/receipts.js +1 -1
  130. package/dist/shortcuts/meeting/operations/registry.js +18 -0
  131. package/dist/shortcuts/meeting/operations/summary.js +276 -0
  132. package/dist/shortcuts/meeting/operations/task-notify.js +325 -0
  133. package/dist/shortcuts/meeting/operations.js +42 -1
  134. package/dist/shortcuts/meeting/qr/encoder.js +427 -0
  135. package/dist/shortcuts/meeting/qr/render.js +103 -0
  136. package/dist/shortcuts/workflow/index.js +3 -0
  137. package/dist/shortcuts/workflow/operations/form.js +17 -5
  138. package/dist/shortcuts/workflow/operations/read.js +13 -6
  139. package/dist/shortcuts/workflow/operations/registry.js +2 -0
  140. package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +331 -0
  141. package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +133 -0
  142. package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +326 -0
  143. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +113 -0
  144. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +259 -0
  145. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoListRows.js +64 -0
  146. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoOutputPlanner.js +28 -0
  147. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.aggregate.js +70 -0
  148. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +267 -0
  149. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +392 -0
  150. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +165 -0
  151. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +448 -0
  152. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +348 -0
  153. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +222 -0
  154. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +66 -0
  155. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +502 -0
  156. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +540 -0
  157. package/docs/_catalog.md +1 -0
  158. package/docs/contract.md +39 -4
  159. package/docs/invoice.md +7 -7
  160. package/docs/todo-smart-convert/README.md +171 -0
  161. package/docs/todo-smart-convert/data-contract.md +236 -0
  162. package/docs/todo-smart-convert/mock/ai-todo-query-target.json +209 -0
  163. package/docs/todo-smart-convert/subgroup-rules.md +245 -0
  164. package/package.json +3 -2
  165. package/scripts/bundle.mjs +63 -0
  166. package/scripts/package-skill.mjs +1 -1
  167. package/skill-template/business-info.json +25 -4
  168. package/skill-template/domains/jinchengda.md +16 -3
  169. package/skill-template/domains/yepiaotong.md +3 -3
  170. package/skills/weaver-e10-jinchengda/SKILL.md +111 -31
  171. package/skills/weaver-e10-jinchengda/references/contract-agent-entry.md +7 -13
  172. package/skills/weaver-e10-jinchengda/references/contract-ai-assistant.md +150 -0
  173. package/skills/weaver-e10-jinchengda/references/contract-ai-review.md +87 -0
  174. package/skills/weaver-e10-jinchengda/references/contract-clause-library-crud.md +111 -0
  175. package/skills/weaver-e10-jinchengda/references/contract-clause-recommender.md +0 -15
  176. package/skills/weaver-e10-jinchengda/references/contract-clause-reference-save.md +0 -13
  177. package/skills/weaver-e10-jinchengda/references/contract-credit-page.md +50 -0
  178. package/skills/weaver-e10-jinchengda/references/contract-disabled-capabilities.md +4 -2
  179. package/skills/weaver-e10-jinchengda/references/contract-doc-compare.md +74 -0
  180. package/skills/weaver-e10-jinchengda/references/contract-flow-launch.md +84 -0
  181. package/skills/weaver-e10-jinchengda/references/contract-performance-query.md +29 -0
  182. package/skills/weaver-e10-jinchengda/references/contract-quote-to-contract.md +28 -0
  183. package/skills/weaver-e10-jinchengda/references/contract-request-status.md +2 -21
  184. package/skills/weaver-e10-jinchengda/references/contract-request-write.md +0 -24
  185. package/skills/weaver-e10-jinchengda/references/contract-signing-subjects.md +0 -15
  186. package/skills/weaver-e10-jinchengda/references/contract-subject-create.md +0 -17
  187. package/skills/weaver-e10-jinchengda/references/contract-template-recommend.md +70 -0
  188. package/skills/weaver-e10-jinchengda/references/contract-template-selector.md +0 -15
  189. package/skills/weaver-e10-jinchengda/references/contract-workflow-discovery.md +0 -15
  190. package/skills/weaver-e10-jinchengda/references/source-manifest.json +1168 -152
  191. package/skills/weaver-e10-meeting/SKILL.md +493 -17
  192. package/skills/weaver-e10-meeting/references/meeting-change.md +4 -4
  193. package/skills/weaver-e10-meeting/references/meeting-create.md +6 -6
  194. package/skills/weaver-e10-meeting/references/meeting-eb.md +503 -27
  195. package/skills/weaver-e10-meeting/references/meeting-invitation.md +113 -0
  196. package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +6 -6
  197. package/skills/weaver-e10-meeting/references/meeting-minute-file.md +425 -0
  198. package/skills/weaver-e10-meeting/references/meeting-queries.md +4 -4
  199. package/skills/weaver-e10-meeting/references/meeting-receipts-signs.md +15 -15
  200. package/skills/weaver-e10-meeting/references/meeting-verification.md +19 -11
  201. package/skills/weaver-e10-meeting.zip +0 -0
  202. package/skills/weaver-e10-workflow/SKILL.md +23 -1
  203. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +282 -0
  204. package/skills/weaver-e10-workflow/scripts/todo-summary.cjs +695 -0
  205. package/skills/weaver-e10-yepiaotong/SKILL.md +15 -11
  206. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +1 -1
  207. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +10 -7
  208. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +41 -14
  209. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +54 -26
  210. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +6 -5
  211. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +14 -11
  212. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +97 -56
  213. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +84 -60
  214. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +142 -105
  215. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +53 -194
  216. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +7 -7
  217. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +164 -72
  218. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +8 -2
  219. package/templates/meeting/invitation.docx +0 -0
@@ -0,0 +1,209 @@
1
+ {
2
+ "smartSummaryTitle": "黄经理,您当前有 149 条待办,清单如下:",
3
+ "totalCount": 149,
4
+ "wfIdGroup": [
5
+ {
6
+ "id": "priority",
7
+ "topPriority": true,
8
+ "title": "建议优先处理的流程",
9
+ "count": 2,
10
+ "defaultExpanded": true,
11
+ "displayItems": [
12
+ {
13
+ "type": "request",
14
+ "requestData": {
15
+ "requestId": 880000001,
16
+ "workflowId": 1003,
17
+ "userMasterId": 900001,
18
+ "isremark": 0,
19
+ "nodeId": 500301,
20
+ "overTime": true,
21
+ "userOverTime": "已超时",
22
+ "requestLevel": 2,
23
+ "requestLevelShow": "紧急",
24
+ "requestNameHtml": "客户晚宴招待(亚太区合作伙伴大会收官)",
25
+ "requestNameTitle": "客户晚宴招待(亚太区合作伙伴大会收官)",
26
+ "creater": 910026,
27
+ "createrName": "韩雪",
28
+ "summary": "为配合 11/08 亚太区合作伙伴大会收官,申请客户晚宴招待费用 ¥1,280。"
29
+ }
30
+ },
31
+ {
32
+ "type": "request",
33
+ "requestData": {
34
+ "requestId": 880000002,
35
+ "workflowId": 1001,
36
+ "userMasterId": 900002,
37
+ "isremark": 0,
38
+ "nodeId": 500302,
39
+ "overTime": false,
40
+ "userOverTime": "11-01到期",
41
+ "requestLevel": 2,
42
+ "requestLevelShow": "紧急",
43
+ "requestNameHtml": "产品经理实战训练营报名",
44
+ "requestNameTitle": "产品经理实战训练营报名",
45
+ "creater": 910027,
46
+ "createrName": "陈安",
47
+ "summary": "11 月产品经理实战训练营报名,需 11/01 前确认参训名单。"
48
+ }
49
+ }
50
+ ]
51
+ },
52
+ {
53
+ "id": "1001",
54
+ "topPriority": false,
55
+ "title": "内部留言",
56
+ "count": 3,
57
+ "defaultExpanded": false,
58
+ "displayItems": [
59
+ {
60
+ "type": "group",
61
+ "id": "1001-1",
62
+ "title": "培训通知",
63
+ "count": 2,
64
+ "summary": "含「11月产品经理实战训练营」等 2 条培训通知,由 陈安、林珂 发起,可展开逐条查看或直接汇总处理",
65
+ "defaultExpanded": false,
66
+ "requestDatas": [
67
+ {
68
+ "requestId": 880000003,
69
+ "workflowId": 1001,
70
+ "userMasterId": 900003,
71
+ "isremark": 0,
72
+ "nodeId": 500303,
73
+ "overTime": false,
74
+ "userOverTime": "",
75
+ "requestLevel": 0,
76
+ "requestLevelShow": "正常",
77
+ "requestNameHtml": "11月产品经理实战训练营报名",
78
+ "requestNameTitle": "11月产品经理实战训练营报名",
79
+ "creater": 910027,
80
+ "createrName": "陈安",
81
+ "summary": "训练营 11/12 开班,需 11/01 前报名。"
82
+ },
83
+ {
84
+ "requestId": 880000004,
85
+ "workflowId": 1001,
86
+ "userMasterId": 900004,
87
+ "isremark": 0,
88
+ "nodeId": 500304,
89
+ "overTime": false,
90
+ "userOverTime": "",
91
+ "requestLevel": 0,
92
+ "requestLevelShow": "正常",
93
+ "requestNameHtml": "E10 集训(第三期)通知",
94
+ "requestNameTitle": "E10 集训(第三期)通知",
95
+ "creater": 910028,
96
+ "createrName": "林珂",
97
+ "summary": "第三期 E10 集训 11/05 开课,请提前安排时间。"
98
+ }
99
+ ]
100
+ },
101
+ {
102
+ "type": "request",
103
+ "requestData": {
104
+ "requestId": 880000005,
105
+ "workflowId": 1001,
106
+ "userMasterId": 900005,
107
+ "isremark": 0,
108
+ "nodeId": 500305,
109
+ "overTime": false,
110
+ "userOverTime": "",
111
+ "requestLevel": 0,
112
+ "requestLevelShow": "正常",
113
+ "requestNameHtml": "华东区大客户成功案例分享",
114
+ "requestNameTitle": "华东区大客户成功案例分享",
115
+ "creater": 910029,
116
+ "createrName": "郑蔓",
117
+ "summary": "分享华东区大客户落地的 E10 多租户方案与实施要点。"
118
+ }
119
+ }
120
+ ]
121
+ },
122
+ {
123
+ "id": "1003",
124
+ "topPriority": false,
125
+ "title": "报销申请",
126
+ "count": 4,
127
+ "defaultExpanded": false,
128
+ "displayItems": [
129
+ {
130
+ "type": "group",
131
+ "id": "1003-1",
132
+ "title": "小额费用报销汇总(单笔 ≤ ¥100)",
133
+ "count": 3,
134
+ "summary": "单笔 ¥36 ~ ¥88,合计 ¥310,涵盖 3 类费用,由 郑楠、韩东、李哲 发起,可展开逐条查看或直接汇总处理",
135
+ "defaultExpanded": false,
136
+ "requestDatas": [
137
+ {
138
+ "requestId": 880000006,
139
+ "workflowId": 1003,
140
+ "userMasterId": 900006,
141
+ "isremark": 0,
142
+ "nodeId": 500306,
143
+ "overTime": false,
144
+ "userOverTime": "",
145
+ "requestLevel": 0,
146
+ "requestLevelShow": "正常",
147
+ "requestNameHtml": "市内交通报销",
148
+ "requestNameTitle": "市内交通报销",
149
+ "creater": 910030,
150
+ "createrName": "郑楠",
151
+ "summary": "市内交通费 ¥36"
152
+ },
153
+ {
154
+ "requestId": 880000007,
155
+ "workflowId": 1003,
156
+ "userMasterId": 900007,
157
+ "isremark": 0,
158
+ "nodeId": 500307,
159
+ "overTime": false,
160
+ "userOverTime": "",
161
+ "requestLevel": 0,
162
+ "requestLevelShow": "正常",
163
+ "requestNameHtml": "客户接待餐费报销",
164
+ "requestNameTitle": "客户接待餐费报销",
165
+ "creater": 910031,
166
+ "createrName": "韩东",
167
+ "summary": "客户接待餐费 ¥88"
168
+ },
169
+ {
170
+ "requestId": 880000008,
171
+ "workflowId": 1003,
172
+ "userMasterId": 900008,
173
+ "isremark": 0,
174
+ "nodeId": 500308,
175
+ "overTime": false,
176
+ "userOverTime": "",
177
+ "requestLevel": 0,
178
+ "requestLevelShow": "正常",
179
+ "requestNameHtml": "办公耗材采购报销",
180
+ "requestNameTitle": "办公耗材采购报销",
181
+ "creater": 910032,
182
+ "createrName": "李哲",
183
+ "summary": "打印纸 1 箱 ¥186"
184
+ }
185
+ ]
186
+ },
187
+ {
188
+ "type": "request",
189
+ "requestData": {
190
+ "requestId": 880000009,
191
+ "workflowId": 1003,
192
+ "userMasterId": 900009,
193
+ "isremark": 0,
194
+ "nodeId": 500309,
195
+ "overTime": false,
196
+ "userOverTime": "",
197
+ "requestLevel": 0,
198
+ "requestLevelShow": "正常",
199
+ "requestNameHtml": "Q4 标书打印与归档费用",
200
+ "requestNameTitle": "Q4 标书打印与归档费用",
201
+ "creater": 910033,
202
+ "createrName": "陈安",
203
+ "summary": "为应对 Q4 标书打印与归档高峰,申请专项打印装订费用 ¥1,860。"
204
+ }
205
+ }
206
+ ]
207
+ }
208
+ ]
209
+ }
@@ -0,0 +1,245 @@
1
+ # 二次分组(subgroup)规则
2
+
3
+ > 范围:`smartGroup` 阶段里把「工作流分组」再切成「汇总项 + 单条」的全部规则
4
+ > 源码:`todoSmartConvert.smartGroup.ts`、`businessRules.ts`、`todoSmartConvert.group.ts`
5
+ > 核对日期:2026-10-27(ai二次分组改造后定稿:删除 `other` 汇总项、<3 条硬门槛不再被计划覆盖、意图表驱动、详情缓存)
6
+
7
+ ## 0. 一句话
8
+
9
+ 大组是否做 ai二次分组、怎么分,由 **「业务类型」+「用户意图是否适用本组」+「有没有给本组计划」+「组内条数门槛」** 四个因素决定;CLI 负责判定与兜底,AI 只提供「子组怎么切、叫什么名」。
10
+
11
+ **没有计划就不产汇总项**——只有三类确定性汇总项(请假阈值组 / 财务阈值组 / 客户问题支持过期组)例外,其余一律平铺。
12
+
13
+ ## 1. 门槛与硬约束
14
+
15
+ | 规则 | 值 / 行为 |
16
+ |---|---|
17
+ | 最小条数 | `GROUP_MIN_ITEMS_FOR_SUBGROUP = 3`(`group.ts`) |
18
+ | 不足 3 条 | **一律平铺单条**,不产生任何汇总项;**即使给了 `aiGroups` 也忽略**并写 warning(硬门槛不再被计划覆盖) |
19
+ | 优先组 | 不做 ai二次分组;`aiGroups` 里出现 `groupId:"priority"` ⇒ 硬失败 `ai_group_priority_unsupported` |
20
+ | 计划作用范围 | 只作用于本组;本组是否采纳还受「业务类型 + 意图是否适用」限制(见 §2) |
21
+ | 全局开关已取消 | `aiGroups: []` 等价于「没传」,不再有单独的「兼容校验路径」 |
22
+ | 叠加视图影响 | 优先条目仍算进它所属工作流分组的条数,所以「原本 2 条 + 1 条超时」的组现在算 3 条,**会跨过门槛** |
23
+ | 空 `groupFocus` | 只影响「计划是否被采纳」;不影响 `<3` 门槛与确定性规则 |
24
+
25
+ ## 2. 决策顺序(每个非优先组,严格按代码顺序)
26
+
27
+ ```
28
+ kind = detectBusinessKind(group.title) // 组名判定,见 §5
29
+ groupHasFocus = hasFocus && focusAppliesToKind(groupFocus, kind) // 意图表,见 §4
30
+ plansAllowed = groupHasFocus || kind === 'internal-message' // 计划是否可能被采纳
31
+
32
+ D0 优先组 ─────────────────────────────────▶ 全部单条;defaultExpanded=true;结束
33
+ D1 满意度类 ───────────────────────────────▶ 全部单条;summary 用标题兜底(不调 AI);忽略计划 + warning
34
+ D2 组内 <3 条 ─────────────────────────────▶ 全部平铺;忽略计划 + warning(硬门槛)
35
+ D3 计划不被采纳(kind 非内部留言 且 意图不适用)
36
+ ───────────────────────────────────▶ 全部平铺 + warning(区分「意图不适用」与「本类型默认不分组」两种文案)
37
+ D4 计划被采纳但本组一条计划都没有
38
+ 内部留言 ─────────────────────────▶ **硬失败 `ai_groups_required`**(没有平铺这个第三态,必须补计划)
39
+ 其他类型 ─────────────────────────▶ warning「意图适用但模型未给本组计划,按无意图处理」→ 落到 D5
40
+ D5 无生效计划 ⇒ 只有三类确定性汇总项会产汇总项:
41
+ leave / finance ─────────────────────▶ 阈值组(≤1天 / ≤100元;**有命中才建**)+ 其余平铺
42
+ issue-support ───────────────────────▶ 「已过期及今天即将过期的流程」(**有命中才建**)+ 其余平铺
43
+ other ───────────────────────────────▶ 全部平铺(写一条 warning 说明原因)
44
+ (internal-message 到不了这里:D4 已硬失败)
45
+ D6 有生效计划 ⇒ 按计划切(见 §6):
46
+ a) 保留标题(1天以内/100元以内)逐条核阈值,超阈值剔出转平铺 + 点名
47
+ b) 子组 <2 条 ⇒ 解散,条目转平铺
48
+ c) 漏分条目 ⇒ 平铺(**不造 other**)
49
+ D7 排序:无 focus → 条数降序(稳定排序);有 focus → 沿用 AI 给的顺序
50
+ D8 编号:id = `${groupId}-${排序后下标+1}`
51
+ ```
52
+
53
+ > **结构恒定**:`displayItems` 只有两种形态——真子组(`type:"group"`)或平铺条目(`type:"request"`)。
54
+ > 不再出现「与父组同名」的整组汇总项,也不再出现 `other` 兜底汇总项。
55
+
56
+ ## 3. 行为矩阵(最容易 review 错的地方)
57
+
58
+ | 本组情况 | 无计划 · 无 focus | 无计划 · 意图适用 | 有本组计划 · 采纳 | 有本组计划 · 不采纳 |
59
+ |---|---|---|---|---|
60
+ | 优先组 | 全单条(置顶展开) | 同左 | 硬失败 | 硬失败 |
61
+ | 满意度类 | 全单条 + 标题摘要 | 全单条 + 标题摘要 | 全单条(忽略计划 + warning) | 同左 |
62
+ | **任意类型 <3 条** | 平铺 | 平铺 | **平铺(硬门槛,忽略计划)** | 平铺 |
63
+ | 内部留言 ≥3 条 | **必须给计划**:按流程标题分(缺计划 → `ai_groups_required`) | **必须给计划**:按侧重点+详情分 | **按计划细分** | —(总是采纳) |
64
+ | 请假/财务 ≥3 条 | 阈值组 + 其余平铺 | 按计划细分 | 按计划细分(保留标题仍在核阈值) | 阈值组 + 其余平铺 |
65
+ | 客户问题支持 ≥3 条 | 过期组 + 其余平铺 | 按计划细分 | 按计划细分 | 过期组 + 其余平铺 |
66
+ | 其他类 ≥3 条 | 平铺 + warning | 按计划细分 | 按计划细分 | **平铺**(本类型无 focus 时忽略计划) |
67
+
68
+ > **只有内部留言(无 focus)和「意图适用本组的任意类型」会消费 `aiGroups`**;其他类在无 focus 时给了计划也会被忽略并写 warning。
69
+
70
+ ## 4. 意图表 `INTENT_RULES`(`businessRules.ts`)
71
+
72
+ 用户意图不是「随便一句中文」,而是**按维度分类**的:专属意图只作用于对应业务类型,通用意图只作用于内部留言与其他类。
73
+
74
+ | id | 标签 | 命中词(正则片段) | 作用类型 `kinds` |
75
+ |---|---|---|---|
76
+ | `leave` | 请假维度 | 请假/休假/年假/调休/病假/事假/婚假/产假/陪产/丧假/探亲/工伤/哺乳/假别/假期/假种/天数 | `leave` |
77
+ | `finance` | 财务维度 | 报销/费用/金额/发票/差旅/借款/付款/请款/科目/票据/对公/核销 | `finance` |
78
+ | `issue-support` | 问题支持维度 | 问题/模块/处理阶段/客户问题/工单/支持 | `issue-support` |
79
+ | `generic` | 通用维度 | 客户/发起人/创建人/提交人/时间/日期/紧急/等级/优先级/主题/标题/类型/类别/状态/节点/内容 | `internal-message`、`other` |
80
+
81
+ 判定规则(`intentAppliesToKind`,顺序不可换):
82
+
83
+ 1. `groupFocus` 为空,或本组是满意度类 ⇒ **不适用**(= 无意图);
84
+ 2. 先看**专属意图**(`leave`/`finance`/`issue-support`):任一命中 ⇒ **只按专属的 `kinds` 判**,通用词同时出现也忽略;
85
+ 3. 专属都没命中才看通用意图;
86
+ 4. 都不命中 ⇒ **视为没有意图**:不报错、不喂 AI,按该类型的确定性规则处理。
87
+
88
+ > 推论:`"按费用类型"` 对财务类适用、对请假类**不**适用(专属「财务维度」不包含 `leave`);
89
+ > `"按客户"` 对内部留言/其他类适用、对请假/财务/问题支持**不**适用。
90
+ > 给错类型的意图不会硬失败,只会退回确定性规则并写 warning。
91
+
92
+ ## 5. 业务类型判定
93
+
94
+ 按**组名(= workflowName)**判定,顺序不可换(客户问题支持精确名优先、满意度次之,避免「费用报销满意度调查」被归为财务):
95
+
96
+ | 类型 | 判据 | 无计划时的分组行为 | 组摘要 / 单条摘要 |
97
+ |---|---|---|---|
98
+ | `issue-support` | **精确名**:`Ecology客户问题支持解决流程`、`E10客户问题支持解决流程` | 「已过期及今天即将过期的流程」一组,其余平铺;无命中则全平铺 | 过期组 = CLI 固定模板 |
99
+ | `satisfaction` | `满意度\|满意调查\|评价调查\|服务评价\|问卷调查` | 全部单条 | 单条 `summary` **= 条目标题**(不调 AI) |
100
+ | `internal-message` | `INTERNAL_MESSAGE_WORKFLOW_PATTERN`(内部留言/内部消息/留言板/意见建议…) | **平铺单条**(有计划才细分) | 计划子组留空交 AI |
101
+ | `leave` | 请假/休假/年假/调休/病假/事假/婚假/产假/陪产/丧假/探亲假/工伤假/哺乳假/公休 | ≤1 天合并,其余平铺 | 阈值组 = CLI 固定模板 |
102
+ | `finance` | 报销/费用/付款/请款/借款/发票/差旅/对公/资金/核销 | 单笔 ≤100 元合并,其余平铺 | 阈值组 = CLI 固定模板(金额区间/合计/费用类数) |
103
+ | `other` | 兜底 | **平铺单条** | 无汇总项 |
104
+
105
+ 阈值:`LEAVE_DAY_THRESHOLD = 1`、`FINANCE_AMOUNT_THRESHOLD = 100`;标题固定 `1天以内` / `100元以内`。
106
+
107
+ **指标(天数/金额)只来自流程详情数据**(`RowMetrics`),取不到时该条**平铺并点名**,不猜、不硬凑进阈值组。
108
+ 财务组一条金额都取不到时,组摘要退回「标题清单」模板,而不是编一个 `¥0 ~ ¥0`。
109
+
110
+ ## 6. `aiGroups` 的字段校验与切分细节
111
+
112
+ ### 6.1 入参校验(`readAiGroups`)
113
+
114
+ | 检查 | 失败 |
115
+ |---|---|
116
+ | 必须是数组 | `ai_groups_invalid` |
117
+ | 每项只允许 `groupId` / `title` / `requestIds` / `seq` | `ai_groups_invalid`(列出多余字段) |
118
+ | `groupId` / `title` 必须是非空字符串(19 位 ID 用数字会失真) | `ai_groups_invalid` |
119
+ | `groupId` 必须存在于本次分组结果 | `ai_group_unknown_group`(回传可用列表) |
120
+ | `groupId` 不能是 `priority` | `ai_group_priority_unsupported` |
121
+ | `requestIds` 与 `seq` 二选一,不能同时给、也不能都空 | `ai_groups_invalid` |
122
+ | `seq` 只接受 ≥1 的整数 | `ai_groups_invalid` |
123
+ | `seq` 越界 | `ai_group_seq_out_of_range` |
124
+ | `requestId` 不属于该组 | `ai_group_unknown_request` |
125
+ | 同一条被分进两个子组 | `ai_group_duplicate_request` |
126
+
127
+ `seq` 口径:**组内 1-based 下标**,顺序 = `group.requestDatas` 顺序(与 `collect` 的 `groupingBrief[].items[].idx` 同源)。叠加视图后优先条目也在该数组里,序号顺延。
128
+
129
+ ### 6.2 切分后的三道兜底
130
+
131
+ | 兜底 | 行为 |
132
+ |---|---|
133
+ | **保留标题核阈值** | 请假/财务组里,模型拿 `1天以内` / `100元以内` 当子组名时,逐条核 `metrics`;超阈值的**剔出→平铺**并点名(`不满足阈值` warning)。其它标题不核 |
134
+ | **子组 <2 解散** | 子组只剩 1 条不成立,解散后条目平铺;被解散的在同一条 warning 里报数量 |
135
+ | **漏分平铺** | 没被 `used` 标记的条目全部平铺,**不建 `other` 汇总项**,写 warning 报数量 |
136
+
137
+ > 三道兜底都不丢数据:任何条目要么在子组里,要么出现在 `displayItems` 的单条里。
138
+
139
+ ## 7. 排序与编号
140
+
141
+ - **无 focus**:子组按条数降序;`sort` 稳定,同条数保持 AI 给的先后。
142
+ - **有 focus**:完全沿用 AI 数组顺序。
143
+ - **编号**:`id = 父组id-序号`,序号 = **排序后**的下标(从 1 起)。因此条数变化导致排序变动时,`id` 会跟着变(已知问题,见 §11)。
144
+
145
+ ## 8. 组摘要 / 单条摘要由谁写
146
+
147
+ | 路径 | `summary` |
148
+ |---|---|
149
+ | 阈值组(`1天以内` / `100元以内`) | 组摘要 = CLI 固定模板,**即使本轮传了 `aiGroups` 也照写** |
150
+ | 客户问题支持过期组 | 组摘要 = CLI 固定模板 |
151
+ | AI 计划产生的子组(含请假/财务里自定义标题的子组) | 组摘要先留空串,由 `groupSummaryContext` → AI → `groupSummary` 回填 |
152
+ | 其他类 / 内部留言(无计划) | 无汇总项,不存在组摘要 |
153
+ | 满意度类单条 | **单条 summary = 条目标题**(确定性,不调 AI,保证非空) |
154
+ | 其余单条 | 由 `summary` 阶段 AI 写;详情为空时标题兜底 |
155
+
156
+ ### 8.1 三套固定模板原文(`businessRules.ts`)
157
+
158
+ 公共尾巴:`可展开逐条查看或直接汇总处理`(CLI 固定文案与喂模型的 `stats.tail` 共用同一个常量)
159
+
160
+ | 类型 | 模板 |
161
+ |---|---|
162
+ | 请假 | `共{N}条,涵盖{M}类假别(事假、病假、年假等),由A、B、C等发起。{尾巴}` |
163
+ | 财务 | `单笔 ¥{min} ~ ¥{max},合计 {红字}¥{sum}{/红字},涵盖{M}类费用(差旅、餐饮等),由A、B、C等发起。{尾巴}` |
164
+ | 问题支持 | `含 {N} 条已过期或今日到期的问题流程,由 A、B 等 N 人发起,其余 {M} 条按单条展示,{尾巴}` |
165
+
166
+ 三条口径(2026-10-27 用户定):
167
+
168
+ 1. **类别(假别/费用类别)去重后最多列 3 个,没列完才补「等」**——列全了不加「等」。
169
+ 一个类别都取不到时只说「1类假别」/「1类费用」,不编名字。
170
+ 2. **发起人超过 2 人才补「等」**(1~2 人把名字列全),最多列 3 个。
171
+ 3. 财务合计用**纯文本** `¥{金额}`,**不加任何 HTML 标签**(2026-10-27 用户要求;此前用 `<span style="color:#d9363e;font-weight:700">` 做红字,但载荷内联进聊天消息时会被当真实标签解析、吞掉后续内容)。
172
+
173
+ > 费用类别只来自**流程详情字段**(`费用类型`/`费用类别`/`报销类型`…)或**标题关键词**兜底。
174
+ > 租户表单若没有这类字段、标题也没有关键词,就只会输出「1类费用」——不猜。
175
+
176
+ ### 8.2 组摘要不缓存(规则)
177
+
178
+ 组摘要**每轮都重新生成**:组内条目变动频繁,按组缓存必然出现「文案说 3 条、卡片是 5 条」。
179
+ 缓存的只有单条摘要(`requestId` 粒度)。
180
+
181
+ ## 9. 错误码
182
+
183
+ `ai_groups_invalid` / `ai_group_unknown_group` / `ai_group_priority_unsupported` / `ai_group_seq_out_of_range` / `ai_group_unknown_request` / `ai_group_duplicate_request` / **`ai_groups_required`**
184
+
185
+ > `ai_groups_required`(2026-10-27):**内部留言 ≥3 条却没有本组计划**时硬失败(`retryAllowed=true`),报错里给出 `groupId` 与「1..N」可用序号,并说明默认维度是**流程标题**。
186
+ > `ai_groups_missing_group` **已删除**:**非内部留言**的类型「意图适用却没给计划」= 视为无意图 + warning(内部留言不走这条路)。
187
+
188
+ ## 10. 真实数据核对(近一年 77 条 / 17 组,2026-10-27)
189
+
190
+ | 组 | 条数 | 结果 |
191
+ |---|---|---|
192
+ | 公司重要通知 | 32 | **全部平铺**(其他类无 focus ⇒ 忽略计划/无计划都不分) |
193
+ | 安全问题处理工单 | 11 | **全部平铺** |
194
+ | 契约锁满意度调查反馈 / 满意度调查反馈 | 5 / 5 | 全平铺,`summary` = 标题 |
195
+ | 泛微请假流程 | 3 | `1天以内`(2) + 平铺 1 |
196
+ | 总部费用报销 | 4 | `100元以内`(2) + 平铺 2 |
197
+ | 内部留言 | 2 | <3 硬门槛 ⇒ 平铺 |
198
+ | 其余 11 组 | 各 1~5 | 平铺 |
199
+
200
+ 汇总项只剩 `1天以内(2)`、`100元以内(2)`;空摘要 0;`totalCount = 77`,Σ`count = 98`(差值 21 = 优先组的叠加条数)。
201
+
202
+ ## 11. review 关注点
203
+
204
+ ### 11.0 ✅ 2026-10-27(ai二次分组改造收口)
205
+
206
+ | 项 | 旧行为 | 新行为 |
207
+ |---|---|---|
208
+ | AI 漏分 | 并入/新建 `other` 汇总项(标题就是英文 `other`) | **全部平铺**,不造 `other` |
209
+ | 组内 <3 条但有计划 | 计划覆盖门槛,照分 | **硬门槛优先**,忽略计划 + warning |
210
+ | 意图适用却没给本组计划 | 硬失败 `ai_groups_missing_group` | **视为无意图** + warning,走确定性规则 |
211
+ | 意图判定 | 「没命中关键词就算通用」 | **意图表 `INTENT_RULES`**:专属只作用对应类型,通用只作用内部留言/其他 |
212
+ | 子组只剩 1 条 | 保留 | **解散 → 平铺** |
213
+ | 摘要命中 ⇒ 跳过详情 | 跳过(导致阈值指标拿不到,10.2 复发) | **摘要缓存只省 AI,不省详情**(详情缓存按 `requestId__lastFeedBackDateTime` 命中则零请求) |
214
+ | `formatInternalMessageOverflowSummary` | 残留导出 + 调用 | 已删(含 `SMART_UNCOVERED_TITLE` 的全部消费点) |
215
+
216
+ ### 11.1 ✅ 已修(2026-10-26):阈值组内容校验曾是死代码
217
+
218
+ 原条件用了 `explicitEmptyPlans`(`aiGroups` 长度为 0),却写在 `groupPlans.length > 0` 的分支里,**永远不成立**:
219
+ 3 条 500/1000/1500 元的报销,`aiGroups:[{title:"100元以内",…}]` 照样输出 `count=3` 且无 warning。
220
+ **修法**:条件改成 `plan.title === 保留标题`,模型用了保留标题才逐条核阈值。
221
+
222
+ ### 11.2 ✅ 已修(2026-10-26):阈值分组被「详情全空」误吞
223
+
224
+ 触发条件:本轮传了 `aiGroups` + 该组全部命中摘要缓存(⇒ 没拉详情)⇒ `fact === undefined` 被当成「详情为空」⇒ 整组走「沿用父组名整组展示」,阈值分支没机会执行。
225
+ **修法**:排除 `cachedIds`、阈值分支提前;2026-10-27 进一步改成「摘要命中不再跳过详情」(详情缓存兜住请求量),从根上消除这类判据混用。
226
+
227
+ ### 11.3 ⚠️ 满意度组的计划被静默忽略 → 已改为写 warning
228
+
229
+ `D1` 在其它判定之前 `return`,现在会明确写两条:`满意度类不做 ai二次分组,已忽略 aiGroups` + `summary 由标题兜底(不调 AI)`。
230
+
231
+ ### 11.4 ✅ 已修(2026-10-26):`aiGroups: []` 不再硬失败
232
+
233
+ 空数组与「未传」语义统一(都走业务类型确定性规则);原先的非阈值类硬失败已不存在。
234
+
235
+ ### 11.5 子组 `id` 不稳定
236
+
237
+ 编号基于**排序后**的下标,条数一变编号就漂移。如果前端拿 `id` 做展开状态记忆或 diff key,会出现「内容没变但 id 变了」。
238
+
239
+ ### 11.6 `other` 是英文标题 —— 已随 `other` 汇总项一起删除
240
+
241
+ `SMART_UNCOVERED_TITLE` 不再进入最终结构,卡片上不会再出现英文 `other`。
242
+
243
+ ### 11.7 门槛与叠加视图的相互作用
244
+
245
+ 优先条目也算进所属工作流组的条数,原本 2 条、含 1 条紧急的组现在算 3 条 —— 会**从平铺变成可二次分组**。近一年数据实测符合预期(`totalCount 77` / `Σcount 98`)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "weaver-work-cli",
3
- "version": "0.1.28",
3
+ "version": "0.1.31",
4
4
  "description": "面向泛微工作工具链的可扩展 TypeScript CLI 基础框架(E10 业票通等能力)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -19,7 +19,7 @@
19
19
  "scripts": {
20
20
  "dev": "tsx src/index.ts",
21
21
  "clean": "node scripts/clean.mjs",
22
- "build": "npm run clean && tsc && node scripts/postbuild.mjs",
22
+ "build": "npm run clean && tsc && node scripts/bundle.mjs && node scripts/postbuild.mjs",
23
23
  "test": "node --import tsx --test $(find test -name '*.test.ts' -type f | sort)",
24
24
  "start": "node dist/index.js",
25
25
  "build:skill": "node scripts/package-skill.mjs",
@@ -50,6 +50,7 @@
50
50
  ],
51
51
  "devDependencies": {
52
52
  "@types/node": "^22.0.0",
53
+ "esbuild": "^0.28.2",
53
54
  "tsx": "^4.19.0",
54
55
  "typescript": "^5.6.0"
55
56
  }
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+ // B 方案:把整个 CLI 打成一个 ESM 包(入口 dist/index.js + 按需分块),替代"几千个 js 文件各读一次"。
3
+ //
4
+ // 为什么要它:沙箱里每次 `stat`/`open`/`read` 都很贵,而 tsc 产物是 390 个 js 文件 ——
5
+ // 每条命令光是把这些文件一个个读进来就要几百次系统调用。打包后入口只有 1 个文件,
6
+ // 懒加载(A 方案)产生的那几个 shortcut 各成一个 chunk,仍然只在需要时才 import。
7
+ //
8
+ // 关键约定:
9
+ // - `@napi-rs/keyring` 必须保持 external:它是原生模块,不能内联进 bundle。
10
+ // - 用 `splitting` 保住动态 import 的边界,否则 A 方案的懒加载会被打回单文件。
11
+ // - 入口仍是 dist/index.js(package.json 的 bin 指向它),其余 tsc 产物保持不动。
12
+ import { createRequire } from 'node:module';
13
+ import { existsSync } from 'node:fs';
14
+ import path from 'node:path';
15
+ import { fileURLToPath } from 'node:url';
16
+
17
+ const require = createRequire(import.meta.url);
18
+ const esbuild = require('esbuild');
19
+
20
+ const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
21
+ const srcDir = path.join(repoRoot, 'src');
22
+ const outDir = process.argv[2] ? path.resolve(process.argv[2]) : path.join(repoRoot, 'dist');
23
+
24
+ /**
25
+ * tsc 的产物用 `.js` 后缀指源码(NodeNext 要求),但源码文件其实是 `.ts`。
26
+ * esbuild 不会自动做这个映射,这里补一个 onResolve:`.js` 不存在就换成同名的 `.ts`。
27
+ */
28
+ const tsFromJs = {
29
+ name: 'ts-from-js',
30
+ setup(build) {
31
+ build.onResolve({ filter: /\.js$/ }, (args) => {
32
+ if (args.kind === 'entry-point') return null;
33
+ if (!args.path.startsWith('.')) return null;
34
+ const absolute = path.resolve(args.resolveDir, args.path);
35
+ if (existsSync(absolute)) return null;
36
+ const asTs = absolute.replace(/\.js$/, '.ts');
37
+ if (existsSync(asTs)) return { path: asTs };
38
+ return null;
39
+ });
40
+ },
41
+ };
42
+
43
+ const startedAt = Date.now();
44
+ await esbuild.build({
45
+ entryPoints: [path.join(srcDir, 'index.ts')],
46
+ outdir: outDir,
47
+ bundle: true,
48
+ platform: 'node',
49
+ format: 'esm',
50
+ target: 'node18',
51
+ splitting: true,
52
+ chunkNames: 'chunks/[name]-[hash]',
53
+ external: ['@napi-rs/keyring'],
54
+ legalComments: 'none',
55
+ logLevel: 'warning',
56
+ // commander 是 CJS,内部会 `require('node:events')`。esbuild 的 ESM 输出在模块作用域里
57
+ // 找不到 `require` 就会抛 "Dynamic require of ... is not supported",所以给每个产物文件
58
+ // 补一个真正的 CJS require(banner 会加到 entry 与所有 chunk 上)。
59
+ banner: { js: "import { createRequire as __esbuildCreateRequire } from 'node:module';\nconst require = __esbuildCreateRequire(import.meta.url);" },
60
+ plugins: [tsFromJs],
61
+ });
62
+
63
+ console.log(`bundle: ${path.relative(repoRoot, outDir)}/index.js (+chunks) in ${Date.now() - startedAt} ms`);
@@ -77,7 +77,7 @@ function shouldSkip(entry, relativePath) {
77
77
  if (entry.name === '.DS_Store' || entry.name.startsWith('.')) return true
78
78
  if (relativePath === 'product.json') return true
79
79
  if (relativePath === 'references/source-manifest.json') return true
80
- if (entry.isDirectory() && ['assets', 'node_modules', 'scripts'].includes(entry.name)) return true
80
+ if (entry.isDirectory() && ['cache', 'assets', 'node_modules', 'scripts'].includes(entry.name)) return true
81
81
  return false
82
82
  }
83
83
 
@@ -444,19 +444,40 @@
444
444
  "weaver-e10-jinchengda": [
445
445
  "合同",
446
446
  "合同管理",
447
+ "今承达",
447
448
  "合同类型",
448
449
  "合同模板",
450
+ "模板推荐",
451
+ "范文推荐",
449
452
  "合同条款",
453
+ "条款分类",
454
+ "条款标签",
450
455
  "条款引用",
451
456
  "签约主体",
457
+ "我方签约主体",
458
+ "客户签约主体",
459
+ "供应商签约主体",
460
+ "合同智能审查",
461
+ "AI 审查",
462
+ "审查报告",
463
+ "风险点",
464
+ "内控问题",
465
+ "法审",
466
+ "纠错",
467
+ "合同比对",
468
+ "文档比对",
469
+ "版本对比",
470
+ "比对报告",
471
+ "企业资信",
472
+ "资信查询",
473
+ "合同发起",
452
474
  "合同审批",
453
- "发起审批",
454
- "保存审批",
475
+ "发起合同",
476
+ "保存合同表单",
455
477
  "提交审批",
456
478
  "催办",
457
479
  "审批进度",
458
- "审批意见",
459
- "今承达"
480
+ "审批意见"
460
481
  ],
461
482
  "weaver-e10-archive-oa": [
462
483
  "档案定位",
@@ -1,23 +1,36 @@
1
1
  本业务域用于泛微 E10 今承达合同管理。入口 `SKILL.md` 按飞书 `lark-approval` 风格组织:CRITICAL 共享前置、路由优先级、选命令表、处理链、执行原则、写操作失败决策树和“不在本 skill 范围”。具体用法拆到 `references/`:
2
2
 
3
3
  - `contract-agent-entry.md`:schema、`contract run` 统一入口、退出码与输入方式。
4
+ - `contract-ai-review.md`:合同智能审查的上传(`ebContract`)、审查页地址与审查记录导出。
5
+ - `contract-flow-launch.md`:四个合同流程的 page/launch,`workflow` 模块上传与 `automaticFormFilling`。
6
+ - `contract-template-recommend.md`:自然语言需求驱动的模板/范文推荐。
7
+ - `contract-doc-compare.md`:`docCompared` 上传、文档检索、历史版本、比对页与差异结果。
8
+ - `contract-credit-page.md`:企业资信页入口与主体全称规则。
4
9
  - `contract-template-selector.md`:合同类型树、模板分类树、模板列表与模板详情。
5
10
  - `contract-clause-recommender.md`:条款标签、条款分类树、条款搜索、条款列表与条款组。
11
+ - `contract-clause-library-crud.md`:条款库 `checkPermissionV2` 鉴权门,分类/条款/条款组的 `prepare → apply` 写入与回读复核。
12
+ - `contract-ai-assistant.md`:合同智能助手——助手/16 智能体/提示语/内控规则/要素抽取/关联流程与假成功防护。
13
+ - `contract-performance-query.md`:业绩核算六菜单过滤链接与来源/收款台账只读查询(needs_ui 不代操作、组合页不透传、total 取 Count)。
14
+ - `contract-quote-to-contract.md`:报价单转合同(sheet 用户选、真实模板硬门禁、分层打分、纵向合并数值列只归首行)。
6
15
  - `contract-clause-reference-save.md`:已引用条款查询与条款引用写入的 `prepare -> apply` 协议。
7
16
  - `contract-signing-subjects.md`:应用 Tag、表单 Tag、字段定义、字段选项与签约主体查询。
8
17
  - `contract-subject-create.md`:新建签约主体的 `prepare -> apply` 写入协议。
9
18
  - `contract-workflow-discovery.md`:workflowId、表单字段与字段选项的运行时解析链。
10
19
  - `contract-request-write.md`:创建、保存、提交、催办四个写操作的确认链与错误边界。
11
20
  - `contract-request-status.md`:流程状态、签字意见与 `flowStatus.code` 枚举。
12
- - `contract-disabled-capabilities.md`:企业资信、撤回/退回等未实现能力的处理边界。
21
+ - `contract-disabled-capabilities.md`:资信数据、撤回/退回等未实现能力的处理边界。
13
22
  - `source-manifest.json`:源资料指纹,用于后续更新检测。
14
23
 
15
24
  Agent 调优重点:
16
25
 
17
26
  - `weaver-work-cli contract schema` 是 operation 合约第一信息源。
18
27
  - 业务输入不得包含 `userid`、`userId`、Cookie、ETEAMSID、Token 或内部控制字段,用户 ID 由 CLI 从会话注入。
19
- - 环境相关 ID(`appId`、`objId`、`formId`、`workflowId`、`nodeId`)必须运行时解析,未找到就停止,不使用标准环境 ID 兜底。
20
- - 各接口成功码不统一(`code=0`、`code=200`、`message.code="0"`、`message.errcode="0"`),HTTP 200 不等于业务成功。
28
+ - 环境相关 ID(`appId`、`objId`、`formId`、`workflowId`、`nodeId`)必须运行时解析,未找到就停止,不使用标准环境 ID 兜底;固定业务常量(审查 `ai_id`、范文 `textObjId`、四个流程的 `workflowId`/`fieldId`、上传 `module`)反之禁止替换。
29
+ - 上传统一两段式:`preUploadCheck` → `module/upload`,三个场景的 `module`(`ebContract` / `workflow` / `docCompared`)不可混用;成功判据是非空 `fileId`。
30
+ - 页面地址不做整体编码:中文与 `[]` 字面保留,只有资信页 `name[N]` 的值编码一次。
31
+ - 各接口成功码不统一(`code=0`、`code=200`、`message.code="0"`、`message.errcode="0"`、文件服务无 message),HTTP 200 不等于业务成功。
32
+ - 条款库全部 operation 先过 `checkPermissionV2`(`data.checkPermission === true` 才放行);`clauseNum` 漏传会静默存空编号,必须在回读时校验。
21
33
  - 写操作只接受 CLI 生成的 continuation,不手工构造或复用;提交审批与催办需要与“创建并保存”分开的第二次确认。
22
34
  - 提交后必须回读 `contract.request.status` 的 `flowStatus.code`(1 审批中 / 3 已归档)才算生效。
23
35
  - 结果为 `partial/write_uncertain` 时停止,不自动重放写请求。
36
+ - 打开页面 ≠ 完成业务:不得把“已打开审查页/流程页”报告成“审查完成/流程已发起”。