@oj-module/cli 0.2.63 → 0.2.66

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 (206) hide show
  1. package/devkit/README.md +9 -3
  2. package/devkit/SKILL.md +5 -2
  3. package/devkit/framework-dev.md +12 -7
  4. package/devkit/manual.md +123 -56
  5. package/devkit/menu-rules.md +4 -1
  6. package/package.json +3 -2
  7. package/shell-dist/assets/ahooks.2l850ymmh0.js +18 -0
  8. package/shell-dist/assets/antd-es-locale-zh_CN.1gjjsvxbf0.js +1 -0
  9. package/shell-dist/assets/antd-img-crop.196rkty480.js +99 -0
  10. package/shell-dist/assets/antd-locale-en_US.561tozx860.js +1 -0
  11. package/shell-dist/assets/antd-locale-zh_CN.1cmpmgzh70.js +1 -0
  12. package/shell-dist/assets/antd.uw1coq15l0.js +348 -0
  13. package/shell-dist/assets/clsx.jotilrt2e0.js +1 -0
  14. package/shell-dist/assets/contract-errors.2o17vz9u50.js +1 -0
  15. package/shell-dist/assets/contract.3h327o3mj0.js +57 -0
  16. package/shell-dist/assets/cssinjs.atgmhan7m0.js +3 -0
  17. package/shell-dist/assets/dayjs-plugin-advancedFormat.3vsyd2eis0.js +1 -0
  18. package/shell-dist/assets/dayjs-plugin-customParseFormat.13xhghv1d0.js +1 -0
  19. package/shell-dist/assets/dayjs-plugin-isoWeek.1fn1tw82p0.js +1 -0
  20. package/shell-dist/assets/dayjs-plugin-localeData.2rwbjp9nk0.js +1 -0
  21. package/shell-dist/assets/dayjs-plugin-quarterOfYear.2oqo1lcx80.js +1 -0
  22. package/shell-dist/assets/dayjs-plugin-relativeTime.2pqs3et4y0.js +1 -0
  23. package/shell-dist/assets/dayjs-plugin-weekOfYear.gvn9iph080.js +1 -0
  24. package/shell-dist/assets/dayjs-plugin-weekYear.2u78l3ex10.js +1 -0
  25. package/shell-dist/assets/dayjs-plugin-weekday.2d56a4tml0.js +1 -0
  26. package/shell-dist/assets/dayjs.pa60l6wjo0.js +1 -0
  27. package/shell-dist/assets/dnd-kit-core.1xyreig6r0.js +5 -0
  28. package/shell-dist/assets/dnd-kit-sortable.s94qciuft0.js +1 -0
  29. package/shell-dist/assets/dnd-kit-utilities.1umw4xphb0.js +1 -0
  30. package/shell-dist/assets/i18next.33zqofapj0.js +1 -0
  31. package/shell-dist/assets/icons-es-components-Context.365qmflwg0.js +1 -0
  32. package/shell-dist/assets/icons.159wjwals0.js +57 -0
  33. package/shell-dist/assets/{index-BKtXxIXz.js → index.i0kqbxp050.js} +11 -6
  34. package/shell-dist/assets/jsx-dev-runtime.3uibuc82f0.js +14 -0
  35. package/shell-dist/assets/jsx-runtime.h40xu4o5b0.js +14 -0
  36. package/shell-dist/assets/keepalive-for-react.xenu5vam70.js +1 -0
  37. package/shell-dist/assets/kit.37kr8ui390.js +1 -0
  38. package/shell-dist/assets/ky.1cgch7gu60.js +6 -0
  39. package/shell-dist/assets/motion-react.pjsxytvjs0.js +12 -0
  40. package/shell-dist/assets/motion.21tciqutg0.js +4 -0
  41. package/shell-dist/assets/nprogress.2nz76n9ny0.js +7 -0
  42. package/shell-dist/assets/ojm-dayjs-locale-zh-cn.3vr3beiyp0.js +9 -0
  43. package/shell-dist/assets/pinyin-pro.3v0mnxczn0.js +1 -0
  44. package/shell-dist/assets/pro-components.2kyot1vcl0.js +83 -0
  45. package/shell-dist/assets/react-countup.2x8idnr8y0.js +10 -0
  46. package/shell-dist/assets/react-dom-client.ick0v05ob0.js +43 -0
  47. package/shell-dist/assets/react-dom.2so9uxg3f0.js +22 -0
  48. package/shell-dist/assets/react-error-boundary.2dncdfj3b0.js +1 -0
  49. package/shell-dist/assets/react-i18next.auhvjhqv00.js +1 -0
  50. package/shell-dist/assets/react-jss.1ei6dr9e00.js +29 -0
  51. package/shell-dist/assets/react-query.3rln45ow00.js +1 -0
  52. package/shell-dist/assets/react-router-dom.3c6zld8h40.js +44 -0
  53. package/shell-dist/assets/react-router.2h9rebcv50.js +56 -0
  54. package/shell-dist/assets/react.1ew63mwts0.js +14 -0
  55. package/shell-dist/assets/runtime.1xfsxcajj0.js +21702 -0
  56. package/shell-dist/assets/simplebar-react.2g739uvai0.js +1 -0
  57. package/shell-dist/assets/spin-delay.yjeyj6iwp0.js +9 -0
  58. package/shell-dist/assets/tailwind-merge.125ehiqjw0.js +1 -0
  59. package/shell-dist/assets/use-sync-external-store-shim.1nz1pi9bb0.js +22 -0
  60. package/shell-dist/assets/zustand-middleware.1xaxjueme0.js +6 -0
  61. package/shell-dist/assets/zustand-react-shallow.pybayv1hx0.js +1 -0
  62. package/shell-dist/assets/zustand-react.9fsl9brxy0.js +1 -0
  63. package/shell-dist/assets/zustand-shallow.6cz0yyv9x0.js +1 -0
  64. package/shell-dist/assets/zustand-vanilla-shallow.3424monv50.js +1 -0
  65. package/shell-dist/assets/zustand-vanilla.1mo3ka3g30.js +1 -0
  66. package/shell-dist/assets/zustand.3gjgzlnqo0.js +1 -0
  67. package/shell-dist/index.html +67 -118
  68. package/shell-dist/versions.json +3 -3
  69. package/src/build/module-def.ts +1 -0
  70. package/src/esm-exports.ts +152 -70
  71. package/src/market/__tests__/bootstrap.test.ts +36 -1
  72. package/src/shared-deps.ts +69 -19
  73. package/src/site-base.ts +4 -0
  74. package/templates/src/app/web/home/pages/components/bar-chart.tsx +5 -3
  75. package/templates/src/app/web/home/pages/components/echarts-setup.ts +30 -0
  76. package/templates/src/app/web/home/pages/components/line-chart.tsx +5 -3
  77. package/templates/src/app/web/home/pages/components/pie-chart.tsx +6 -3
  78. package/templates/src/app/web/home/pages/index.tsx +3 -2
  79. package/templates/src/app/web/home/routes.ts +3 -2
  80. package/templates/src/app/web/personal-center/locales/en-US.json +15 -0
  81. package/templates/src/app/web/personal-center/locales/zh-CN.json +15 -0
  82. package/templates/src/app/web/personal-center/pages/my-profile/index.tsx +15 -13
  83. package/templates/src/app/web/system/locales/en-US.json +24 -3
  84. package/templates/src/app/web/system/locales/zh-CN.json +24 -3
  85. package/templates/src/app/web/system/pages/roles/index.tsx +13 -6
  86. package/templates/src/app/web/system/pages/settings/index.tsx +1 -1
  87. package/templates/src/app/web/system/pages/users/index.tsx +3 -3
  88. package/templates/src/app/web/system/pages/users/roles.tsx +1 -1
  89. package/templates/src/oj-market/web/locales/en-US.json +14 -1
  90. package/templates/src/oj-market/web/locales/zh-CN.json +14 -1
  91. package/vendor/host-versions.json +3 -3
  92. package/shell-dist/assets/ahooks.js +0 -6909
  93. package/shell-dist/assets/antd-es-locale-zh_CN.js +0 -257
  94. package/shell-dist/assets/antd-img-crop.js +0 -1495
  95. package/shell-dist/assets/antd-locale-en_US.js +0 -374
  96. package/shell-dist/assets/antd-locale-zh_CN.js +0 -379
  97. package/shell-dist/assets/antd.js +0 -106874
  98. package/shell-dist/assets/clsx.js +0 -33
  99. package/shell-dist/assets/contract-errors.js +0 -30
  100. package/shell-dist/assets/contract.js +0 -18900
  101. package/shell-dist/assets/cssinjs.js +0 -2595
  102. package/shell-dist/assets/dayjs-plugin-advancedFormat.js +0 -98
  103. package/shell-dist/assets/dayjs-plugin-customParseFormat.js +0 -173
  104. package/shell-dist/assets/dayjs-plugin-isoWeek.js +0 -77
  105. package/shell-dist/assets/dayjs-plugin-localeData.js +0 -126
  106. package/shell-dist/assets/dayjs-plugin-quarterOfYear.js +0 -77
  107. package/shell-dist/assets/dayjs-plugin-relativeTime.js +0 -92
  108. package/shell-dist/assets/dayjs-plugin-weekOfYear.js +0 -73
  109. package/shell-dist/assets/dayjs-plugin-weekYear.js +0 -63
  110. package/shell-dist/assets/dayjs-plugin-weekday.js +0 -63
  111. package/shell-dist/assets/dayjs.js +0 -326
  112. package/shell-dist/assets/dnd-kit-core.js +0 -3601
  113. package/shell-dist/assets/dnd-kit-sortable.js +0 -717
  114. package/shell-dist/assets/dnd-kit-utilities.js +0 -340
  115. package/shell-dist/assets/i18next.js +0 -2321
  116. package/shell-dist/assets/icons-es-components-Context.js +0 -20
  117. package/shell-dist/assets/icons.js +0 -34961
  118. package/shell-dist/assets/jsx-dev-runtime.js +0 -75
  119. package/shell-dist/assets/jsx-runtime.js +0 -97
  120. package/shell-dist/assets/keepalive-for-react.js +0 -283
  121. package/shell-dist/assets/kit.js +0 -151
  122. package/shell-dist/assets/ky.js +0 -1427
  123. package/shell-dist/assets/motion-react.js +0 -13589
  124. package/shell-dist/assets/motion.js +0 -9959
  125. package/shell-dist/assets/nprogress.js +0 -314
  126. package/shell-dist/assets/ojm--ant-design-icons-es-icons-BarsOutlined.js +0 -7
  127. package/shell-dist/assets/ojm--ant-design-icons-es-icons-CalendarOutlined.js +0 -7
  128. package/shell-dist/assets/ojm--ant-design-icons-es-icons-CaretDownFilled.js +0 -7
  129. package/shell-dist/assets/ojm--ant-design-icons-es-icons-CaretDownOutlined.js +0 -7
  130. package/shell-dist/assets/ojm--ant-design-icons-es-icons-CaretUpOutlined.js +0 -7
  131. package/shell-dist/assets/ojm--ant-design-icons-es-icons-CheckCircleFilled.js +0 -7
  132. package/shell-dist/assets/ojm--ant-design-icons-es-icons-CheckOutlined.js +0 -7
  133. package/shell-dist/assets/ojm--ant-design-icons-es-icons-ClockCircleOutlined.js +0 -7
  134. package/shell-dist/assets/ojm--ant-design-icons-es-icons-CloseCircleFilled.js +0 -7
  135. package/shell-dist/assets/ojm--ant-design-icons-es-icons-CloseOutlined.js +0 -7
  136. package/shell-dist/assets/ojm--ant-design-icons-es-icons-CopyOutlined.js +0 -7
  137. package/shell-dist/assets/ojm--ant-design-icons-es-icons-DeleteOutlined.js +0 -7
  138. package/shell-dist/assets/ojm--ant-design-icons-es-icons-DoubleLeftOutlined.js +0 -7
  139. package/shell-dist/assets/ojm--ant-design-icons-es-icons-DoubleRightOutlined.js +0 -7
  140. package/shell-dist/assets/ojm--ant-design-icons-es-icons-DownOutlined.js +0 -7
  141. package/shell-dist/assets/ojm--ant-design-icons-es-icons-DownloadOutlined.js +0 -7
  142. package/shell-dist/assets/ojm--ant-design-icons-es-icons-EditOutlined.js +0 -7
  143. package/shell-dist/assets/ojm--ant-design-icons-es-icons-EllipsisOutlined.js +0 -7
  144. package/shell-dist/assets/ojm--ant-design-icons-es-icons-EnterOutlined.js +0 -7
  145. package/shell-dist/assets/ojm--ant-design-icons-es-icons-ExclamationCircleFilled.js +0 -7
  146. package/shell-dist/assets/ojm--ant-design-icons-es-icons-EyeInvisibleOutlined.js +0 -7
  147. package/shell-dist/assets/ojm--ant-design-icons-es-icons-EyeOutlined.js +0 -7
  148. package/shell-dist/assets/ojm--ant-design-icons-es-icons-FileOutlined.js +0 -7
  149. package/shell-dist/assets/ojm--ant-design-icons-es-icons-FileTextOutlined.js +0 -7
  150. package/shell-dist/assets/ojm--ant-design-icons-es-icons-FilterFilled.js +0 -7
  151. package/shell-dist/assets/ojm--ant-design-icons-es-icons-FolderOpenOutlined.js +0 -7
  152. package/shell-dist/assets/ojm--ant-design-icons-es-icons-FolderOutlined.js +0 -7
  153. package/shell-dist/assets/ojm--ant-design-icons-es-icons-HolderOutlined.js +0 -7
  154. package/shell-dist/assets/ojm--ant-design-icons-es-icons-InfoCircleFilled.js +0 -7
  155. package/shell-dist/assets/ojm--ant-design-icons-es-icons-LeftOutlined.js +0 -7
  156. package/shell-dist/assets/ojm--ant-design-icons-es-icons-LoadingOutlined.js +0 -7
  157. package/shell-dist/assets/ojm--ant-design-icons-es-icons-MinusOutlined.js +0 -7
  158. package/shell-dist/assets/ojm--ant-design-icons-es-icons-MinusSquareOutlined.js +0 -7
  159. package/shell-dist/assets/ojm--ant-design-icons-es-icons-PaperClipOutlined.js +0 -7
  160. package/shell-dist/assets/ojm--ant-design-icons-es-icons-PictureOutlined.js +0 -7
  161. package/shell-dist/assets/ojm--ant-design-icons-es-icons-PlusOutlined.js +0 -7
  162. package/shell-dist/assets/ojm--ant-design-icons-es-icons-PlusSquareOutlined.js +0 -7
  163. package/shell-dist/assets/ojm--ant-design-icons-es-icons-QuestionCircleOutlined.js +0 -7
  164. package/shell-dist/assets/ojm--ant-design-icons-es-icons-ReloadOutlined.js +0 -7
  165. package/shell-dist/assets/ojm--ant-design-icons-es-icons-RightOutlined.js +0 -7
  166. package/shell-dist/assets/ojm--ant-design-icons-es-icons-RotateLeftOutlined.js +0 -7
  167. package/shell-dist/assets/ojm--ant-design-icons-es-icons-RotateRightOutlined.js +0 -7
  168. package/shell-dist/assets/ojm--ant-design-icons-es-icons-SearchOutlined.js +0 -7
  169. package/shell-dist/assets/ojm--ant-design-icons-es-icons-StarFilled.js +0 -7
  170. package/shell-dist/assets/ojm--ant-design-icons-es-icons-SwapOutlined.js +0 -7
  171. package/shell-dist/assets/ojm--ant-design-icons-es-icons-SwapRightOutlined.js +0 -7
  172. package/shell-dist/assets/ojm--ant-design-icons-es-icons-UpOutlined.js +0 -7
  173. package/shell-dist/assets/ojm--ant-design-icons-es-icons-VerticalAlignTopOutlined.js +0 -7
  174. package/shell-dist/assets/ojm--ant-design-icons-es-icons-WarningFilled.js +0 -7
  175. package/shell-dist/assets/ojm--ant-design-icons-es-icons-ZoomInOutlined.js +0 -7
  176. package/shell-dist/assets/ojm--ant-design-icons-es-icons-ZoomOutOutlined.js +0 -7
  177. package/shell-dist/assets/ojm-dayjs-locale-zh-cn.js +0 -81
  178. package/shell-dist/assets/pinyin-pro.js +0 -25175
  179. package/shell-dist/assets/pro-components.js +0 -44627
  180. package/shell-dist/assets/react-countup.js +0 -525
  181. package/shell-dist/assets/react-dom-client.js +0 -12134
  182. package/shell-dist/assets/react-dom.js +0 -266
  183. package/shell-dist/assets/react-error-boundary.js +0 -141
  184. package/shell-dist/assets/react-i18next.js +0 -1773
  185. package/shell-dist/assets/react-jss.js +0 -4089
  186. package/shell-dist/assets/react-query.js +0 -3072
  187. package/shell-dist/assets/react-router-dom.js +0 -9927
  188. package/shell-dist/assets/react-router.js +0 -14584
  189. package/shell-dist/assets/react.js +0 -590
  190. package/shell-dist/assets/runtime.js +0 -28294
  191. package/shell-dist/assets/simplebar-react.js +0 -1119
  192. package/shell-dist/assets/spin-delay.js +0 -111
  193. package/shell-dist/assets/tailwind-merge.js +0 -3364
  194. package/shell-dist/assets/use-sync-external-store-shim.js +0 -130
  195. package/shell-dist/assets/zustand-middleware.js +0 -513
  196. package/shell-dist/assets/zustand-react-shallow.js +0 -27
  197. package/shell-dist/assets/zustand-react.js +0 -39
  198. package/shell-dist/assets/zustand-shallow.js +0 -22
  199. package/shell-dist/assets/zustand-vanilla-shallow.js +0 -71
  200. package/shell-dist/assets/zustand-vanilla.js +0 -40
  201. package/shell-dist/assets/zustand.js +0 -32
  202. /package/shell-dist/assets/{nprogress-css.js → nprogress-css.1cq2pzkre0.js} +0 -0
  203. /package/shell-dist/assets/{ojm-antd-es-button.js → ojm-antd-es-button.2uriphio50.js} +0 -0
  204. /package/shell-dist/assets/{ojm-antd-es-modal.js → ojm-antd-es-modal.bf3tgdh8v0.js} +0 -0
  205. /package/shell-dist/assets/{ojm-antd-es-slider.js → ojm-antd-es-slider.xyvptuhid0.js} +0 -0
  206. /package/shell-dist/assets/{ojm-antd-es-upload.js → ojm-antd-es-upload.13gx45e0g0.js} +0 -0
package/devkit/README.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  面向用 `ojm` 开发前后端一体工程的开发者与 AI agent。本目录是**源文件**,
4
4
  发布时由 cli 的 `prepack`(`packages/cli/scripts/sync-devkit.mjs`)把其中
5
- **ojm 侧的 9 个文件**同步进 `packages/cli/devkit/`,随 `@oj-module/cli`
5
+ **ojm 侧的 10 个文件**同步进 `packages/cli/devkit/`,随 `@oj-module/cli`
6
6
  发布,再由 `ojm init` 分发到工程内。
7
7
 
8
8
  整棵树覆盖前后端两侧,但仍是**两套独立分发的 skill**(同名不同物,别混):
9
9
 
10
10
  | 侧 | 本仓位置 | 用户工程里的落点 | 分发链 |
11
11
  |---|---|---|---|
12
- | ojm 模块开发(前端模块、契约、前后端对接) | 本目录顶层 9 个文件 | `.claude/skills/ojm-module-dev/` | `@oj-module/cli` 包 → `ojm init` 第 4b 步 |
12
+ | ojm 模块开发(前端模块、契约、前后端对接) | 本目录顶层 10 个文件 | `.claude/skills/ojm-module-dev/` | `@oj-module/cli` 包(全部 10 个)→ `ojm init` 第 4b 步(只分发其中 6 个,见下) |
13
13
  | oj API 开发(后端 handler、全局对象、配置、测试) | `oj-api-dev/` 子目录(快照) | `.claude/skills/oj-api-dev/` | **oj 二进制自带**(`bin/devkit/`)→ `ojm init` 第 4 步 / `ojm vendor` 装·升后同步(0.2.57 起共用 `syncOjDevkit`,全量 `.md` **覆盖**——文档始终与已装 oj 版本一致) |
14
14
 
15
15
  > **`oj-api-dev/` 子目录是快照,不是本仓维护的文档**:它与本机 oj 的
@@ -33,6 +33,12 @@
33
33
  | `wecom-daikaifa.md` | 企业微信代开发集成:**凭据清单**(8 项 `vars`,按 Tier A/B/C 分层的来源与必填时序 + 可信域名/可信 IP 备案)、首次开通顺序(含 `suite_ticket` 依赖与引导期死锁的破法)、**用户 / 开发 / 部署三角色手册**、错误文案速查、与自建应用共存的语义变化 |
34
34
  | `wecom-internal-app.md` | 企业微信**企业内部应用(自建应用)**集成:5 项 `wecom_corp_*` 凭据 + 2 项复用、回调只填「通讯录同步」一处、「验证并接入」四步自检、可见范围与可信 IP/域名、单企业私有化的边界(自建应用收不到成员变更事件)、共存配置、故障速查 |
35
35
 
36
+ > 上表 9 项 + 本文件 `README.md` = 顶层 10 个文件,全部随 cli 包发货。
37
+ > `ojm init` 第 4b 步**只分发其中 6 个**给业务工程:`SKILL.md` / `manual.md` / `README.md` /
38
+ > `wecom-daikaifa.md` / `wecom-internal-app.md` / `publish-walkthrough.md`。
39
+ > 其余 4 个(`framework-dev.md`、`menu-rules.md`、`module-dev-and-cdn-playground.md`、
40
+ > `sql-builder-missing-capabilities-pr.md`)是框架贡献者或专题材料,只在 cli 包内可取。
41
+
36
42
  后端 handler 本身的写法(`json` 信封、`db` 查询、`manifest.yaml`、`oj test`)、
37
43
  站点挂载(`mounts`)、密钥信封(`secrets`)、vars、cors、schema 校验、broker/tasks/oidc/ws 等
38
44
  属于 **`oj-api-dev` skill** 的范围——`ojm init` 已把它装到工程的
@@ -115,6 +121,6 @@ flowchart LR
115
121
  框架贡献者要把本仓快照同步到新版:从 `~/.local/share/oj/devkit/` 整目录覆盖
116
122
  `docs/devkit/oj-api-dev/`(oj v0.1.116 起 12 个文件,保持逐字节一致以便对账)。
117
123
 
118
- > 本目录顶层 9 个文件是**自包含**的:业务工程拿到即可读懂,不需要工程仓库里的
124
+ > 本目录顶层 10 个文件是**自包含**的:业务工程拿到即可读懂,不需要工程仓库里的
119
125
  > 其它文档。`oj-api-dev/` 子目录是 oj 侧快照,同样自包含(其自身 README 即索引),
120
126
  > 但不随 cli 包发货、仅本仓参考。维护者视角的内容来源整理在 `framework-dev.md`(仅本仓)。
package/devkit/SKILL.md CHANGED
@@ -70,8 +70,10 @@ description: 用 ojm 开发前后端一体工程时使用——新增/修改前
70
70
  - **上传文件**:当前 `ojm api` 的 openapi 流水线不生成 form 通道的前端 client(文件部件不进 JSON Schema),
71
71
  惯例走 antd `Upload` **直连**后端(不经 JSON client),handler 用 `http.files` / `http.file(i)` 读字节,
72
72
  仅平级声明 `.response`。不要手写 `content-type`(运行时按 boundary 自动补)。
73
- - **前端模块的 import 只有三类**:`@oj-module/runtime`、宿主 importmap 提供的共享依赖、
74
- 自身相对路径。共享依赖不进工程 `dependencies`(宿主提供单例,模块不得打包副本)。
73
+ - **前端模块的 import 只有三类**:`@oj-module/runtime`、共享依赖(裸说明符)、自身相对路径。
74
+ 共享依赖分两档:**宿主 importmap 单例**(`react` / `antd` / `dayjs` …,模块不得打包副本)
75
+ 与**模块自打包**(`echarts` 家族 / `vditor` / `@plane/editor`,宿主不提供、模块自带,
76
+ 体积记在模块产物上)。两档都写 `devDependencies`;分档口径与体积控制见手册 §2.6。
75
77
  **拿用户/角色等信息:读走 `useUserStore` / `useAuthStore` / `useAccess`(`AccessControl` 门禁),
76
78
  写走契约 client(`ojm api` 生成模块自有 `__client`,或复用 runtime 导出的 `api/rbac` / `api/user`),
77
79
  绝不 import 框架 `#src/*`**——设计动机与红线见手册 §2.8。
@@ -208,6 +210,7 @@ description: 用 ojm 开发前后端一体工程时使用——新增/修改前
208
210
  | `oj build` 报 `#/_platform/...` 找不到模块 | 跨模块别名没在 `manifest.yaml` 的 `deps` 里声明 | 加 `_platform: ^0.1.0`(manual §14.2) |
209
211
  | 同步一轮之后本地手建的部门消失了 | 适配器漏了 `origin` 条件(同步与回收都必须只动自己的行) | `markSeen` / `reconcileHidden` 带 `origin`;回收只在「本轮完整零跳过」时执行(manual §14.5) |
210
212
  | 组织架构里有这个人,通讯录搜不到 | 他是同步建档(`activated=0`,从没登录过本站),通讯录只出活人 | 正确行为;让他登录一次,或走组织架构读面(manual §14.6) |
213
+ | 以为要外挂 nginx 才有 gzip/br 与长缓存 | `oj serve` 自 0.1.116 内建:br>gzip 协商 + 按文件名哈希判 `immutable`;0.1.118 起明文端口还有 h2c | 零配置即可;但**浏览器连不上 h2c**(只支持 prior knowledge、进程内无 TLS),要让浏览器走 h2 才需要前置 nginx/caddy TLS 终结。CDN 必须按 `Vary: Accept-Encoding` 分键(manual §7) |
211
214
 
212
215
  ## 手册
213
216
 
@@ -21,7 +21,8 @@
21
21
  > ⚠️ 那两份 guide 有**已知陈旧处**,以源码为准:
22
22
  > dev 端口实际是 **3333**(guide 写的 5173 已过时;注意与 `ojm dev` 的前端 devServer
23
23
  > **5174** 不是一回事——前者是本仓 vite,后者是业务工程 devServer);包版本以
24
- > `packages/*/package.json` 为准(撰写时实际 **0.2.47**,仅供参考,以当前 package.json 为准)。
24
+ > `packages/*/package.json` 为准(本文件随 cli 发布,**不写死包版本号**——版本每轮 lockstep
25
+ > 都会变,写死必然漂移)。
25
26
 
26
27
  ## §2 两包结构与依赖方向
27
28
 
@@ -38,7 +39,9 @@ pnpm 改写成**精确版本**,不是 `^` 范围)。
38
39
  - **双入口别搞混**:给模块作者用的加在 `src/index.ts`;框架自己怎么启动看 `src/index.tsx`。
39
40
  - `#src/*` alias 指向 `packages/runtime/src/*`(由 `packages/runtime/package.json`
40
41
  的 `imports` 字段与 vite alias **双声明**,即「模块仅 import 三类」不变式)。
41
- - 业务工程**不打包共享依赖**——宿主经 importmap 提供单例。
42
+ - 业务工程**不打包宿主共享依赖**——宿主经 importmap 提供单例。例外是 `shared-deps.ts` 里
43
+ 标了 `bundle: true` 的重型依赖(echarts 家族 / vditor / @plane/editor):宿主不提供,
44
+ 模块自带,见手册 §2.6。
42
45
 
43
46
  ## §3 常用命令
44
47
 
@@ -71,8 +74,9 @@ pnpm test tests/shell # 宿主全量
71
74
 
72
75
  ### 4.1 四条通用红线
73
76
 
74
- 1. **共享依赖只能有一个版本**:安装走 `catalog:`,产物走宿主(cli 内置
77
+ 1. **宿主共享依赖只能有一个版本**:安装走 `catalog:`,产物走宿主(cli 内置
75
78
  `shell-dist`)importmap 单例。私自写死 `react@18` 会导致「双 React」崩溃。
79
+ (`bundle: true` 的自打包档不在其列——它们本就由各模块自带。)
76
80
  2. **`packages/runtime/dist`、`packages/cli/shell-dist` 随仓库提交**
77
81
  (`.gitignore` 为它们开了例外)。**改了源码必须重建并提交产物**,
78
82
  否则本地/CI 跑的是旧产物——历史上多次出现「方法不存在」。
@@ -139,7 +143,7 @@ pnpm test tests/shell # 宿主全量
139
143
  **一键发布**:`node scripts/publish-packages.mjs`(lockstep 门禁 → 构建 → 守卫测试 →
140
144
  runtime → cli → registry 复核;`--dry-run` 只演练)。下面的手动步骤是它的展开参考。
141
145
 
142
- - **两包**同版本号(`@oj-module/runtime` + `@oj-module/cli`,当前 `0.2.47`),后续发版保持
146
+ - **两包**同版本号(`@oj-module/runtime` + `@oj-module/cli`,两处 `package.json` 恒等),后续发版保持
143
147
  lockstep;`@plane/kit` / `@plane/editor` 不在发布集内(脚本里已注释)。
144
148
  - **必须 `pnpm publish`**——用 `npm publish` 会漏出 `workspace:*` / `catalog:` 字面量。
145
149
  - **顺序:先 `runtime` 后 `cli`**。`runtime` 未公开时,新 `cli` 的精确依赖会悬空,
@@ -169,13 +173,14 @@ runtime → cli → registry 复核;`--dry-run` 只演练)。下面的手动
169
173
  `docs/devkit/` 归置进 cli 包 `packages/cli/devkit/`,随 `@oj-module/cli` 发布
170
174
  (`package.json#files` 白名单已含 `devkit`);
171
175
  - `packages/cli/src/init.ts` 第 4b 步:从 cli 包内置 devkit 多拷一份到
172
- 工程的 `.claude/skills/ojm-module-dev/`(拷 `SKILL.md` / `manual.md` /
173
- `README.md`,已存在则幂等跳过)。
176
+ 工程的 `.claude/skills/ojm-module-dev/`(连同企微两本手册与发布 walkthrough,共 6 个文件;
177
+ 已存在则幂等跳过)。`framework-dev.md` / `menu-rules.md` / 教学文档 / SQL 构造器 PR 记录
178
+ 只随 cli 包、不进业务工程——它们是框架贡献者或专题材料,`ojm init` 有意不分发。
174
179
 
175
180
  `packages/cli/devkit/` 是发布副本、由 prepack 生成,已加进 `.gitignore` 不入库;
176
181
  源仍是仓库 `docs/devkit/` 顶层,改文档只动那里一处。
177
182
 
178
- > `docs/devkit/oj-api-dev/` 是 **oj 侧 devkit 的快照**(10 个文件,与
183
+ > `docs/devkit/oj-api-dev/` 是 **oj 侧 devkit 的快照**(12 个文件,与
179
184
  > `~/.local/share/oj/devkit/` 逐字节一致),仅供本仓 grep 后端手册,
180
185
  > **不随 cli 包发货**(`sync-devkit.mjs` 只同步顶层文件)——用户工程的
181
186
  > `oj-api-dev` skill 由 oj 二进制分发。升级本机 oj 后要同步快照:
package/devkit/manual.md CHANGED
@@ -391,66 +391,113 @@ export default defineModule({
391
391
 
392
392
  ### 2.6 前端模块能 import 什么
393
393
 
394
- **只有三类**:
394
+ **只有三类来源**:
395
395
 
396
396
  1. `@oj-module/runtime`(含 `/contract`、`/contract/errors` 子路径);
397
- 2. 宿主 **importmap 提供的共享依赖**;
397
+ 2. 共享依赖(写法上都是裸说明符 import,见下表的两个档位);
398
398
  3. 自身相对路径。
399
399
 
400
- 框架内部的 `#src/*` 在构建期被拦。共享依赖由宿主提供**单例**,
401
- 模块工程**不得**打包自己的副本——只在 `devDependencies` 里对齐版本(供 `tsc` 用)。
402
-
403
- 共享依赖矩阵关键项:`react`、`react-dom`、`react-router`、`@tanstack/react-query`、
404
- `antd`(含 `locale/*`)、`@ant-design/icons`、`@ant-design/pro-components`、
405
- `i18next`、`react-i18next`、`zustand`、`dayjs`、`echarts`、`echarts-for-react`、
406
- `motion`、`@dnd-kit/*`、`keepalive-for-react`、`simplebar-react`、`nprogress`、
407
- `react-countup`、`ahooks`、`ky`、`clsx`、`tailwind-merge`、`pinyin-pro`、`vditor`。
408
- 查实际矩阵:`pnpm exec ojm info`。
409
-
410
- #### vditor(Markdown 编辑器,软共享)
411
-
412
- 模块侧写法不变:`import Vditor from "vditor"` + `import "vditor/dist/index.css"`。
413
- 两个说明符均由宿主 importmap 供包(`/assets/vditor.js`、`/assets/vditor-index-css.js`),
414
- 模块**不得**再把 vditor 写进 `dependencies` 自打包——放 `devDependencies` 对齐版本供 `tsc` 用。
415
- 资产惰性加载:importmap 只做映射,宿主自身不 import vditor,`/assets/vditor.js` 仅在
416
- 模块产物真正 import 它(进编辑器页)时才被浏览器拉取,不进宿主首屏。
417
-
418
- 注意:vditor 运行期还要按需加载 lute / i18n / 图标 / 主题 CSS 等资源(默认走第三方 CDN,
419
- 宿主 CSP 通常不放行)。这部分**不随共享资产分发**,由模块自行处理(自注入或指向宿主
420
- 可服务的同源路径)。直接 `import "vditor/dist/..."` 其它深路径会命中前缀 external 但无
421
- importmap 键,构建期报错——需要新深路径请联系框架方在共享表登记。
422
-
423
- ### 2.7 本版本共享依赖钉版(0.2.47 快照)
424
-
425
- 宿主经 importmap 提供以下单例(模块 `devDependencies` 须对齐,供 `tsc` 用);完整矩阵以
426
- `pnpm exec ojm info` 为准——**别抄本节表格当真相**,本表是撰写时的快照,升级 cli 后
427
- 以 `ojm info` 输出为准。
428
-
429
- | 包 | 钉版 |
430
- | --- | --- |
431
- | `react` / `react-dom` | 19.2.8 |
432
- | `react-router` | 7.18.2 |
433
- | `@tanstack/react-query` | 5.102.8 |
434
- | `antd` | 6.6.1 |
435
- | `@ant-design/icons` | 6.3.2 |
436
- | `@ant-design/pro-components` | 3.1.12-0 |
437
- | `i18next` / `react-i18next` | 26.4.0 / 17.0.12 |
438
- | `zustand` | 5.0.15 |
439
- | `dayjs` | 1.11.23 |
440
- | `echarts` / `echarts-for-react` | 6.1.0 / 3.0.6 |
441
- | `motion` | 12.43.0 |
442
- | `@dnd-kit/core` | 6.3.1 |
443
- | `keepalive-for-react` | 5.0.11 |
444
- | `simplebar-react` | 3.3.2 |
445
- | `nprogress` | 0.2.0 |
446
- | `react-countup` | 6.5.3 |
447
- | `ahooks` | 3.9.7 |
448
- | `ky` | 2.0.2 |
449
- | `clsx` / `tailwind-merge` | 2.1.1 / 3.6.0 |
450
- | `pinyin-pro` | 3.29.3 |
451
- | `vditor` | 4.0.0 |
452
-
453
- 框架包版本:`@oj-module/runtime` / `@oj-module/cli` 为 `0.2.47`(**双包 lockstep**,
400
+ 框架内部的 `#src/*` 在构建期被拦。
401
+
402
+ 共享依赖按**谁出这份 JS** 分两档。两档写法一样,体积责任与失败形态完全不同——
403
+ 把它们混为一谈,是「白屏」和「产物莫名变大一倍」的最常见来源:
404
+
405
+ | 档位 | 谁提供 | importmap 有键 | 典型包 |
406
+ | --- | --- | --- | --- |
407
+ | **宿主共享(单例)** | `shell-dist` 预构建资产 | 有 | `react` / `react-dom` / `react-router` / `antd`(含 `locale/*`)/ `@ant-design/icons` / `@ant-design/pro-components` / `i18next` / `react-i18next` / `zustand` / `dayjs` / `motion` / `@dnd-kit/*` / `keepalive-for-react` / `simplebar-react` / `nprogress` / `react-countup` / `ahooks` / `ky` / `clsx` / `tailwind-merge` / `pinyin-pro` |
408
+ | **模块自打包** | 模块自己的产物 | **无** | `echarts` 家族、`vditor`、`@plane/editor` |
409
+
410
+ - 第一档由宿主提供**单例**:模块工程**不得**打包自己的副本(多副本 = 双 store / 双 antd
411
+ context 树),只在 `devDependencies` 里对齐版本供 `tsc` 用。
412
+ - 第二档宿主**不提供**:模块必须自带,体积记在模块产物上。依赖同样放 `devDependencies`
413
+ (构建期能解析即可),但要自己控体积——见下面两节。
414
+
415
+ 判定口径:`packages/cli/src/shared-deps.ts` 里带 `bundle: true` 的条目就是第二档。
416
+ 版本矩阵查 `pnpm exec ojm info`(宿主 `versions.json`,两档都在里面,故它只回答「钉哪个版本」,
417
+ 不回答「谁提供 JS」)。
418
+
419
+ #### vditor(Markdown 编辑器,模块自打包)
420
+
421
+ 写法:`import Vditor from "vditor"` + `import "vditor/dist/index.css"`。
422
+
423
+ 但这两个说明符**没有 importmap 键**——宿主不预构建 `/assets/vditor.js`,构建时整份打进
424
+ 模块产物 `entry.js`(gzip ≈ 700 KiB)。由此有两条推论:
425
+
426
+ - 动态导入**不能**省这笔体积:模块产物是单文件(`codeSplitting: false`),
427
+ `import("vditor")` 会被内联回同一个文件。要把它从首屏摘掉,只能把编辑器页拆成独立模块/方案。
428
+ - 运行期还要按需加载 lute / i18n / 图标 / 主题 CSS(默认走第三方 CDN,宿主 CSP 通常不放行)。
429
+ 这部分**不随产物分发**,由模块自行处理(自注入或指向宿主可服务的同源路径);
430
+ 直接 `import "vditor/dist/..."` 其它深路径会命中前缀 external 但无 importmap 键,构建期报错。
431
+
432
+ #### echarts(图表,模块自打包 + 必须按需注册)
433
+
434
+ `echarts` / `echarts/charts` / `echarts/features.js` / `echarts-for-react` 同属第二档。
435
+ **默认写法会把整包打进去**:`import ReactECharts from "echarts-for-react"` 内部是
436
+ `import * as echarts from "echarts"`(index 全量),全部图表类型 + 组件 + 渲染器一起进
437
+ `entry.js`。脚手架实测:单文件 1,697,666 B 里 echarts 918 KB + zrender 221 KB,占 **87%**,
438
+ 而首页只画折线/柱状/饼图三种。
439
+
440
+ 按需注册写法(脚手架 `src/app/web/home/pages/components/echarts-setup.ts` 可整段照抄):
441
+
442
+ ```ts
443
+ // echarts-setup.ts —— 注册清单集中一处,新增图表类型只改这里
444
+ import { BarChart, LineChart, PieChart } from "echarts/charts";
445
+ import { GridComponent, LegendComponent, TooltipComponent } from "echarts/components";
446
+ import * as echarts from "echarts/core";
447
+ import { CanvasRenderer } from "echarts/renderers";
448
+
449
+ echarts.use([
450
+ BarChart, LineChart, PieChart,
451
+ GridComponent, LegendComponent, TooltipComponent,
452
+ CanvasRenderer,
453
+ ]);
454
+ export { echarts };
455
+ ```
456
+
457
+ ```tsx
458
+ import ReactEChartsCore from "echarts-for-react/esm/core";
459
+ import { echarts } from "./echarts-setup";
460
+
461
+ // 组件里渲染:把按需注册过的实例传进去(不传就走整包默认实例)
462
+ return <ReactEChartsCore echarts={echarts} option={option} opts={{ height: 320, width: "auto" }} />;
463
+ ```
464
+
465
+ 同一份页面实测:`entry.js` 1,697,666 → **918,319 B(−45.9%)**。
466
+
467
+ ⚠️ 按需注册最容易踩的坑是**静默空白**:少 `use()` 一个图表类型或组件(例如柱状图漏了
468
+ `GridComponent`、图例漏了 `LegendComponent`),echarts 不抛错、只是画不出来。新增图时
469
+ 先补注册清单,再用真页面看一眼。
470
+
471
+ ### 2.7 共享依赖钉版(快照,以 `ojm info` 为准)
472
+
473
+ 版本矩阵的真源是宿主 `versions.json`(`pnpm exec ojm info` 直接打印)。下表是撰写时的快照,
474
+ 升级 cli 后会变——**别抄表格当真相**;`档位` 列才是长期有效的信息。
475
+
476
+ | 包 | 钉版 | 档位 |
477
+ | --- | --- | --- |
478
+ | `react` / `react-dom` | 19.2.8 | 宿主 |
479
+ | `react-router` | 7.18.2 | 宿主 |
480
+ | `@tanstack/react-query` | 5.102.8 | 宿主 |
481
+ | `antd` | 6.6.1 | 宿主 |
482
+ | `@ant-design/icons` | 6.3.2 | 宿主 |
483
+ | `@ant-design/pro-components` | 3.1.12-0 | 宿主 |
484
+ | `i18next` / `react-i18next` | 26.4.0 / 17.0.12 | 宿主 |
485
+ | `zustand` | 5.0.15 | 宿主 |
486
+ | `dayjs` | 1.11.23 | 宿主 |
487
+ | `echarts` / `echarts-for-react` | 6.1.0 / 3.0.6 | **自打包** |
488
+ | `motion` | 12.43.0 | 宿主 |
489
+ | `@dnd-kit/core` | 6.3.1 | 宿主 |
490
+ | `keepalive-for-react` | 5.0.11 | 宿主 |
491
+ | `simplebar-react` | 3.3.2 | 宿主 |
492
+ | `nprogress` | 0.2.0 | 宿主 |
493
+ | `react-countup` | 6.5.3 | 宿主 |
494
+ | `ahooks` | 3.9.7 | 宿主 |
495
+ | `ky` | 2.0.2 | 宿主 |
496
+ | `clsx` / `tailwind-merge` | 2.1.1 / 3.6.0 | 宿主 |
497
+ | `pinyin-pro` | 3.29.3 | 宿主 |
498
+ | `vditor` | 4.0.0 | **自打包** |
499
+
500
+ 框架包版本:`@oj-module/runtime` / `@oj-module/cli` 为 `0.2.66`(**双包 lockstep**,
454
501
  以 `packages/*/package.json` 或 `ojm info` 为准——本表是撰写时快照);
455
502
  `@plane/kit` / `@plane/editor` 是独立版本线(当前 `0.1.20`,随宿主 importmap 提供,
456
503
  不参与 lockstep)。`oj` 二进制最低版本门禁 `MIN_OJ_VERSION = 0.1.85`——这个版本带来
@@ -1490,6 +1537,26 @@ flowchart LR
1490
1537
  例如 `ojm migrate -d api/dist`、`ojm schema diff` 等价于带绝对 `-c` 的 `oj` 调用——
1491
1538
  不用再手敲 `-c`。**完整命令参考与「oj 原生命令 vs ojm 透传」的差异区分见 §10。**
1492
1539
 
1540
+ **静态层与传输(oj ≥ 0.1.116 内建,0.1.118 起支持 h2c)**:单服务部署时 `oj serve` 自己就是
1541
+ 静态服务器,压缩与缓存不必靠外挂 nginx,下面四条直接决定首屏体验:
1542
+
1543
+ - **压缩**:默认开,协商 br > gzip,可压资源恒带 `Vary: Accept-Encoding`;压缩产物落
1544
+ `<config_dir>/compress-cache/`(派生数据,可整删重建;只读根设 `compress_cache_dir: ""`
1545
+ 走内存直压)。`server.static.brotli_quality` 默认 5(1..=11),q11 能再省约 12% 字节,
1546
+ 代价是**每个新版本资产的第一个请求要在线冷压**(实测 antd 单文件 2.2MB 约 1.4s)——
1547
+ 流量入口集中、首访敏感就别拉满。
1548
+ - **缓存按文件名判**:stem 末段 ≥8 位且数字字母兼具 → `public, max-age=31536000, immutable`;
1549
+ 其余一律 `no-cache` 恒校验(`config-production.js` 这类纯字母词不会被误钉)。**所以产物里的
1550
+ 共享资产与入口 chunk 必须内容寻址命名**,否则跨版本要么全量重下、要么全量 304。
1551
+ 本仓构建期已强制(`hashifySharedAssets` / `hashifyHostEntry`)。
1552
+ - **传输**:0.1.118 起明文端口上 h2c(HTTP/2 prior knowledge)与 HTTP/1.1 **同端口共存**,
1553
+ 零配置;但**只支持 prior knowledge,没有 `Upgrade: h2c` 路径**,且进程内无 TLS 终结——
1554
+ **浏览器连不上 h2c**。要让浏览器走 h2,必须前置 nginx/caddy 做 TLS-ALPN,反代到源站那一跳
1555
+ 可选 h2c。WS 握手仍必须走 HTTP/1.1(无 RFC 8441)。
1556
+ - **前置缓存层**:CDN/反代**必须按 `Vary: Accept-Encoding` 分键**;确认不了就让
1557
+ `server.static.compression: false`,压缩交给前置层一家做——两层都压等于白费 CPU 且易出
1558
+ 「br 解成乱码」。
1559
+
1493
1560
  **按路由注入 HTML(`htmlTransform`,SEO / IM 链接预览)**:SPA 的服务端只有一份
1494
1561
  `index.html`——想让 `/issues/<id>` 这类路由带自己的 `<title>`/`og:*`(微信、Slack、飞书预览
1495
1562
  与不执行 JS 的爬虫只看服务端 HTML,客户端 `document.title` 无效),在 `web.config.ts` 配:
@@ -278,7 +278,7 @@ export default {
278
278
 
279
279
  | 位置 | 动作 | 不配的后果 |
280
280
  |---|---|---|
281
- | `<dist>/index.html` | importmap 映射值、`<script src>`、`<link href>` 统一加 `/oj` 前缀 | HTML 指向 `/assets/react.js`,在 `/oj` 挂载下 404 → 白屏 |
281
+ | `<dist>/index.html` | importmap 映射值、`<script src>`、`<link href>` 统一加 `/oj` 前缀 | HTML 指向 `/assets/react.<hash>.js`,在 `/oj` 挂载下 404 → 白屏 |
282
282
  | `<dist>/index.html` | `<head>` 注入 `<script nonce>window.__OJ_BASE__="/oj/"</script>`(复用 importmap 的 nonce,否则被 CSP 拦掉) | 运行期拿不到真实部署前缀 |
283
283
  | 运行期 Router | runtime 与宿主 shell 都经 `resolveSiteBase()` 取 basename,即 `window.__OJ_BASE__` | Router 不剥 `/oj`,`/oj/wiki/...` 匹配不到 `/wiki/...`(深链刷新落 404 页) |
284
284
 
@@ -302,6 +302,9 @@ export default {
302
302
 
303
303
  实测依据(2026-10-21,站点以 `mounts: [{prefix: /oj, web: web/dist, spa: true}]` 挂起):
304
304
 
305
+ > 下表的资产文件名是当时的 `/assets/react.js`。当前产物改为内容寻址命名
306
+ > (`/assets/react.<hash>.js`,10 位 base36),**前缀判断逻辑不变**,只是文件名多一段哈希。
307
+
305
308
  | 请求 | 结果 | 说明 |
306
309
  |---|---|---|
307
310
  | `GET /oj/wiki/space/3/doc/12` | `200 text/html` | 深链回落本身是通的,前提是该挂载显式 `spa: true` |
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oj-module/cli",
3
3
  "type": "module",
4
- "version": "0.2.63",
4
+ "version": "0.2.66",
5
5
  "description": "React Antd 模块工程命令行工具(含预构建宿主 shell-dist)",
6
6
  "license": "MIT",
7
7
  "exports": {
@@ -49,10 +49,11 @@
49
49
  ],
50
50
  "dependencies": {
51
51
  "@faker-js/faker": "^10.4.0",
52
- "@oj-module/runtime": "0.2.63",
52
+ "@oj-module/runtime": "0.2.66",
53
53
  "@redocly/cli": "^2.51.0",
54
54
  "@tailwindcss/vite": "^4.3.0",
55
55
  "cac": "^6.7.14",
56
+ "es-module-lexer": "^2.3.2",
56
57
  "esbuild": "^0.28.2",
57
58
  "tailwindcss": "^4.3.0",
58
59
  "tsx": "^4.23.12",