@oj-module/cli 0.2.53 → 0.2.54

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 (96) hide show
  1. package/devkit/SKILL.md +2 -2
  2. package/devkit/manual.md +32 -25
  3. package/package.json +2 -2
  4. package/shell-dist/assets/runtime.js +7 -4
  5. package/shell-dist/index.html +3 -3
  6. package/shell-dist/versions.json +3 -3
  7. package/src/__tests__/templates-tenant-scope.test.ts +3 -2
  8. package/src/config.ts +9 -0
  9. package/src/contract/__tests__/client-path.test.ts +30 -0
  10. package/src/contract/__tests__/emit-client.test.ts +18 -0
  11. package/src/contract/__tests__/handler-scan.test.ts +23 -0
  12. package/src/contract/check.ts +5 -5
  13. package/src/contract/client-path.ts +30 -0
  14. package/src/contract/emit-client.ts +18 -4
  15. package/src/contract/handler-scan.ts +40 -3
  16. package/src/contract/run.ts +5 -3
  17. package/src/init.ts +19 -1
  18. package/templates/README.md +40 -44
  19. package/templates/init.include.yaml +12 -8
  20. package/templates/openapi.json +1393 -34
  21. package/templates/src/_platform/api/contacts/api.ts +29 -1
  22. package/templates/src/_platform/api/contacts/detail/api.ts +25 -1
  23. package/templates/src/_platform/api/solutions/api.ts +60 -1
  24. package/templates/src/_platform/web/__client/api.schemas.ts +99 -35
  25. package/templates/src/_platform/web/__client/api.ts +103 -59
  26. package/templates/src/app/web/entry.ts +77 -0
  27. package/templates/src/{home/web → app/web/home}/__client/api.ts +5 -2
  28. package/templates/src/app/web/home/routes.ts +41 -0
  29. package/templates/src/app/web/login/routes.ts +71 -0
  30. package/templates/src/{notification/web → app/web/notification}/__client/api.schemas.ts +14 -0
  31. package/templates/src/{notification/web → app/web/notification}/__client/api.ts +67 -20
  32. package/templates/src/app/web/notification/routes.ts +70 -0
  33. package/templates/src/{personal-center/web → app/web/personal-center}/__client/api.ts +5 -2
  34. package/templates/src/app/web/personal-center/routes.ts +49 -0
  35. package/templates/src/{system/web → app/web/system}/__client/api.schemas.ts +28 -22
  36. package/templates/src/{system/web → app/web/system}/__client/api.ts +103 -58
  37. package/templates/src/{system/web → app/web/system}/pages/users/index.tsx +3 -3
  38. package/templates/src/{system/web → app/web/system}/pages/wecom/index.tsx +12 -3
  39. package/templates/src/{system/web/entry.ts → app/web/system/routes.ts} +24 -35
  40. package/templates/src/auth/api/api.ts +59 -0
  41. package/templates/src/auth/api/ldap-login/api.ts +37 -1
  42. package/templates/src/auth/api/wecom/api.ts +23 -0
  43. package/templates/src/auth/web/__client/api.schemas.ts +133 -13
  44. package/templates/src/auth/web/__client/api.ts +129 -31
  45. package/templates/src/notification/api/api.ts +17 -0
  46. package/templates/src/notification/api/del/api.ts +2 -0
  47. package/templates/src/system/api/roles/api.ts +3 -0
  48. package/templates/src/system/api/roles/bindings/api.ts +3 -0
  49. package/templates/src/system/api/settings/api.ts +3 -0
  50. package/templates/src/system/api/users/forbidden/api.ts +3 -0
  51. package/templates/src/system/api/users/password/api.ts +3 -0
  52. package/templates/src/system/api/users/roles/api.ts +3 -0
  53. package/templates/src/web/api/get-async-routes/api.ts +16 -1
  54. package/templates/src/web/api/hello/api.ts +13 -1
  55. package/templates/src/web/api/user-info/api.ts +21 -1
  56. package/templates/src/web/web/__client/api.schemas.ts +28 -0
  57. package/templates/src/web/web/__client/api.ts +33 -9
  58. package/templates/web.config.ts +21 -15
  59. package/vendor/host-versions.json +3 -3
  60. package/templates/src/home/web/entry.ts +0 -49
  61. package/templates/src/login/web/entry.ts +0 -79
  62. package/templates/src/notification/web/entry.ts +0 -84
  63. package/templates/src/personal-center/web/entry.ts +0 -60
  64. /package/templates/src/{home/web → app/web/home}/__client/api.schemas.ts +0 -0
  65. /package/templates/src/{home/web → app/web/home}/locales/en-US.json +0 -0
  66. /package/templates/src/{home/web → app/web/home}/locales/zh-CN.json +0 -0
  67. /package/templates/src/{home/web → app/web/home}/pages/components/bar-chart.tsx +0 -0
  68. /package/templates/src/{home/web → app/web/home}/pages/components/card-list.tsx +0 -0
  69. /package/templates/src/{home/web → app/web/home}/pages/components/line-chart.tsx +0 -0
  70. /package/templates/src/{home/web → app/web/home}/pages/components/pie-chart.tsx +0 -0
  71. /package/templates/src/{home/web → app/web/home}/pages/index.tsx +0 -0
  72. /package/templates/src/{login/web → app/web/login}/auth-provider.ts +0 -0
  73. /package/templates/src/{login/web → app/web/login}/locales/en-US.json +0 -0
  74. /package/templates/src/{login/web → app/web/login}/locales/zh-CN.json +0 -0
  75. /package/templates/src/{login/web → app/web/login}/pages/change-password.tsx +0 -0
  76. /package/templates/src/{login/web → app/web/login}/pages/login.tsx +0 -0
  77. /package/templates/src/{login/web → app/web/login}/wecom.ts +0 -0
  78. /package/templates/src/{notification/web → app/web/notification}/locales/en-US.json +0 -0
  79. /package/templates/src/{notification/web → app/web/notification}/locales/zh-CN.json +0 -0
  80. /package/templates/src/{notification/web → app/web/notification}/pages/center/index.tsx +0 -0
  81. /package/templates/src/{personal-center/web → app/web/personal-center}/__client/api.schemas.ts +0 -0
  82. /package/templates/src/{personal-center/web → app/web/personal-center}/locales/en-US.json +0 -0
  83. /package/templates/src/{personal-center/web → app/web/personal-center}/locales/zh-CN.json +0 -0
  84. /package/templates/src/{personal-center/web → app/web/personal-center}/pages/my-profile/index.tsx +0 -0
  85. /package/templates/src/{system/web → app/web/system}/locales/en-US.json +0 -0
  86. /package/templates/src/{system/web → app/web/system}/locales/zh-CN.json +0 -0
  87. /package/templates/src/{system/web → app/web/system}/pages/departments/index.tsx +0 -0
  88. /package/templates/src/{system/web → app/web/system}/pages/departments/sync-bar.tsx +0 -0
  89. /package/templates/src/{system/web → app/web/system}/pages/departments/tree.ts +0 -0
  90. /package/templates/src/{system/web → app/web/system}/pages/errors.ts +0 -0
  91. /package/templates/src/{system/web → app/web/system}/pages/forbidden.tsx +0 -0
  92. /package/templates/src/{system/web → app/web/system}/pages/login-methods/index.tsx +0 -0
  93. /package/templates/src/{system/web → app/web/system}/pages/oplog/index.tsx +0 -0
  94. /package/templates/src/{system/web → app/web/system}/pages/roles/index.tsx +0 -0
  95. /package/templates/src/{system/web → app/web/system}/pages/settings/index.tsx +0 -0
  96. /package/templates/src/{system/web → app/web/system}/pages/users/roles.tsx +0 -0
@@ -6,82 +6,78 @@
6
6
 
7
7
  ```bash
8
8
  pnpm install
9
- pnpm dev # 开发:前端 devServer + oj 后端(api/src 保存即热更)
9
+ pnpm dev # 开发:前端 devServer + oj 后端(src/*/api 保存即热更)
10
10
  pnpm build # 构建:oj build + 前端全站合并到 dist/web
11
11
  pnpm preview # 预览:oj migrate + server(release 产物)
12
12
  ```
13
13
 
14
- 登录账号:`admin` / `aA123456`(见 `api/src/_platform/seed.sql`)。
14
+ 登录账号:`admin` / `aA123456`(见 `src/_platform/api/seed.sql`)。
15
15
 
16
- ## 系统管理模块
16
+ ## 目录(一目录 = 一个模块)
17
17
 
18
- `web/src/system/`(用户管理 / 成员资格 / 角色权限 / 操作日志 / 站点设置 / 登录方式)
19
- 的前端 API 客户端 `__client/` **已随模板分发**(与 auth/notification 等一致),`pnpm dev`
20
- 开箱即用、「系统管理」菜单直接可见。
21
-
22
- `__client` 是从 `openapi.json`(模板自带,由 `api/src/system` 契约产出)生成的产物;
23
- 契约变更后刷新一次即可:
24
-
25
- ```bash
26
- bin/oj openapi -c config.yaml -d api/src -b /api -o openapi.json # 重产契约
27
- pnpm exec ojm api # 重新生成 web/src/*/__client(dev 检测到 openapi.json 变化也会自动重生成)
18
+ ```
19
+ config.yaml 站点/数据库/租户配置(init 现场签发证书到 config/)
20
+ src/<name>/api/ 后端模块(目录镜像路由:src/<name>/api/<路径>/api.ts)
21
+ src/<name>/web/ 前端模块(entry.ts 是入口;页面 / locales / __client 同目录)
22
+ src/app/web/ 框架内置页面聚合模块(多根:/home /login /personal-center /notification /system)
23
+ src/oj-market/web/ 解决方案市场(第一方能力,独立模块,删目录即下线)
24
+ dist/api/ oj build 后端产物
25
+ dist/web/ 站点产物(shell + modules + modules.json)
26
+ bin/ oj 二进制(init 解压,不入库)
28
27
  ```
29
28
 
30
- 成员资格页仅 superadmin 可见。改了 `api/src` 的 handler `.schema`/`.response` 后重跑这两条保持同步
31
- (`ojm api --check` 可对账,零漂移为发布门禁)。
29
+ `src/app/web` 是一个**多根模块**:一个 `entry.ts` 里挂五个顶层路由,各根按
30
+ `handle.order` 排菜单(与拆分时逐项一致),页面按根分目录
31
+ (`<root>/routes.ts` + `pages/` + `__client/`)。新增业务页面时建议单独建模块
32
+ (`pnpm exec ojm new <name>`),不要往聚合模块里塞。
32
33
 
33
- ## 目录
34
+ ## 契约与 `__client`
34
35
 
35
- ```
36
- bin/ oj 二进制(init 解压,不入库)
37
- api/src/ 后端模块源码(目录镜像路由:api/src/<模块>/<路径>/api.ts)
38
- dist/api/ oj build 产物
39
- web/src/ 前端模块源码
40
- dist/web/ 构建产物(完整站点)
36
+ 前端调后端一律走 `ojm api` 从 `openapi.json` 生成的 `__client/`(随模板分发,开箱即用)。
37
+ 改了 handler 的 `.schema`(入参)/ `.response`(出参)后刷新:
38
+
39
+ ```bash
40
+ bin/oj openapi -c config.yaml --module-root src -b /api -o openapi.json # 重产契约
41
+ pnpm exec ojm api # 重生成 */web/*/__client
41
42
  ```
42
43
 
44
+ 多根聚合模块的 client 归属由 `web.config.ts` 的 `clientOwners` 决定(`system → app`),
45
+ 生成物落 `src/app/web/system/__client`,与页面同级——页面相对导入 `../../__client` 不用改。
46
+ `ojm api --check` 可对账漂移(零漂移为发布门禁)。
47
+
43
48
  ## 注意
44
49
 
45
- - 改 `api/src` 下的 api.ts 保存即生效;**新增/删除后端模块目录、改
50
+ - 改 `src/*/api` 下的 api.ts 保存即生效;**新增/删除模块目录、改
46
51
  schema/migrations/config.yaml 需重启 `ojm dev`**(oj 热更边界)。
47
- - 后端开发请用 `/oj-api-dev` skill(`.claude/skills/oj-api-dev/`),
48
- 手册按章节按需读。
49
- - `api/config.yaml` 的证书为 init 现场签发的本地 dev 证书,不构成信任边界;
52
+ - 后端开发请用 `/oj-api-dev` skill(`.claude/skills/oj-api-dev/`),手册按章节按需读。
53
+ - `config/` 下的证书为 init 现场签发的本地 dev 证书,不构成信任边界;
50
54
  生产环境用 oj 仓库 `oj-cert gen` 全新签发并替换公钥。
51
55
 
52
56
  ## 排障 / 常见问题
53
57
 
54
- - **`pnpm dev` / `pnpm build` 报 `Could not resolve "./__client/api"`**
55
- 某前端模块的 `entry.ts` 引用了 `web/src/<模块>/__client/api`,但该目录不存在——它是
56
- `ojm api` 从 `openapi.json` 生成的产物。在工程根跑一次即可补齐:
58
+ - **`pnpm dev` / `pnpm build` 报 `Could not resolve "../../__client/api"`**
59
+ 对应根的 `__client` 缺失——它是 `ojm api` 的生成物。在工程根跑一次即可补齐:
57
60
 
58
61
  ```bash
59
- pnpm exec ojm api # 生成 web/src/*/__client(dev 检测到 openapi.json 变化也会自动重生成)
62
+ pnpm exec ojm api # dev 检测到 openapi.json 变化也会自动重生成
60
63
  ```
61
64
 
62
- 改完后端 `api/src` 的契约后,重产契约再刷新:
65
+ 改完后端契约后先重产契约再刷新:
63
66
 
64
67
  ```bash
65
- bin/oj openapi -c config.yaml -d api/src -b /api -o openapi.json
68
+ bin/oj openapi -c config.yaml --module-root src -b /api -o openapi.json
66
69
  pnpm exec ojm api
67
70
  ```
68
71
 
69
72
  - **`__client/` 下的文件能直接改吗?**
70
- 不能手改、也不入库——它是生成物,下次 `ojm api` 会覆盖你的手改。需要改接口就改
71
- `api/src` 的 handler `.schema`/`.response`,再跑上面的命令刷新。
72
- `ojm api --check` 可对账契约与产物的漂移(零漂移为发布门禁)。
73
+ 不能手改、也不入库——它是生成物,下次 `ojm api` 会覆盖。改接口就改 handler 的
74
+ `.schema`/`.response`,再跑上面的命令刷新。
73
75
 
74
76
  - **`pnpm dlx @oj-module/cli@latest init` 生成的脚手架缺模块 / 看起来很旧**
75
- pnpm dlx 会按首次解析到的版本**缓存** CLI 可执行文件。若某次 `@latest` 指向的是旧版
76
- (例如早于系统管理模块的 `0.1.x`),之后重跑仍可能命中旧缓存,生成的脚手架就会缺新模块、
77
- 模板偏旧(典型表现:`web/src` 下没有 `system` 目录)。
78
- 排查:`ls web/src` 看是否缺预期模块。
79
- 解决:清掉 dlx 缓存后重跑——
77
+ pnpm dlx 会按首次解析到的版本**缓存** CLI 可执行文件。排查:`ls src` 看是否缺预期模块。
78
+ 解决:清掉 dlx 缓存后显式指定版本重跑——
80
79
 
81
80
  ```bash
82
81
  rm -rf ~/Library/Caches/pnpm/dlx # macOS;其它平台见 pnpm 文档的 dlx-store 路径
83
- # 或:pnpm dlx clear @oj-module/cli
84
- pnpm dlx @oj-module/cli@<明确版本> init <工程名> --yes # 显式指定版本最稳
82
+ pnpm dlx @oj-module/cli@<明确版本> init <工程名> --yes
85
83
  ```
86
-
87
- 养成显式带版本号(如 `@oj-module/cli@0.2.4`)的习惯,可避免 `@latest` 缓存歧义。
@@ -101,14 +101,20 @@ include:
101
101
  - src/personal-center/api
102
102
  - src/system/api
103
103
  - src/web/api
104
- # —— web 前端模块(home 只列页面源码,__client 见顶部说明)——
104
+ # —— web 前端模块 ——
105
105
  - src/_platform/web
106
106
  - src/auth/web
107
- - src/home/web/entry.ts
108
- - src/home/web/locales
109
- - src/home/web/pages
110
- - src/login/web
111
- - src/notification/web
107
+ # 框架内置页面聚合为一个多根模块(首页/登录/个人中心/通知/系统管理)。
108
+ # home 只列 routes/locales/pages:其 api 模块是 demo-only 不进脚手架,__client
109
+ # 留着会指向不存在的端点(见顶部说明),故逐子路径收录而不是整棵 src/app/web。
110
+ - src/app/web/entry.ts
111
+ - src/app/web/home/routes.ts
112
+ - src/app/web/home/locales
113
+ - src/app/web/home/pages
114
+ - src/app/web/login
115
+ - src/app/web/notification
116
+ - src/app/web/personal-center
117
+ - src/app/web/system
112
118
  # 解决方案市场:默认第一方能力。逐子路径收录——__tests__ 不进脚手架
113
119
  # (用户工程无 web 侧 vitest 基建,拷了是死文件)
114
120
  - src/oj-market/web/entry.ts
@@ -119,6 +125,4 @@ include:
119
125
  - src/oj-market/web/locales
120
126
  - src/oj-market/web/pages
121
127
  - src/oj-market/web/utils
122
- - src/personal-center/web
123
- - src/system/web
124
128
  - src/web/web