@ai-partner-x/aiko-boot-cli 0.1.4 → 0.1.5

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 (441) hide show
  1. package/dist/cli.js +2 -0
  2. package/dist/commands/add-api.js +9 -3
  3. package/dist/commands/add-app.js +0 -2
  4. package/dist/commands/env.d.ts +8 -0
  5. package/dist/commands/env.js +55 -0
  6. package/dist/commands/init.js +7 -9
  7. package/dist/core/project-config.d.ts +1 -0
  8. package/dist/core/prompts.d.ts +2 -0
  9. package/dist/core/prompts.js +33 -32
  10. package/dist/core/workspace.js +30 -9
  11. package/dist/scaffold.js +1 -1
  12. package/dist/usecases/add-api.usecase.d.ts +5 -2
  13. package/dist/usecases/add-api.usecase.js +83 -21
  14. package/dist/usecases/add-app.usecase.d.ts +0 -1
  15. package/dist/usecases/add-app.usecase.js +20 -10
  16. package/dist/usecases/add-feature.usecase.js +26 -23
  17. package/dist/usecases/env.usecase.d.ts +23 -0
  18. package/dist/usecases/env.usecase.js +284 -0
  19. package/dist/usecases/init-scaffold.usecase.d.ts +3 -4
  20. package/dist/usecases/init-scaffold.usecase.js +36 -49
  21. package/package.json +8 -3
  22. package/templates/api-clean/.env.example +3 -0
  23. package/templates/api-clean/app.config.ts +19 -0
  24. package/templates/{scaffold-default/packages/api → api-clean}/examples/security/README.md +2 -2
  25. package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/README.md +1 -1
  26. package/templates/{scaffold-default/packages/api → api-clean}/package.json +4 -16
  27. package/templates/api-clean/src/scripts/init-db.ts +50 -0
  28. package/templates/{scaffold-default/packages/api → api-clean}/src/server.ts +15 -11
  29. package/templates/api-clean/src/types/aiko-boot-starter-web.d.ts +8 -0
  30. package/templates/api-system/.env.example +11 -0
  31. package/templates/api-system/.eslintrc.json +6 -0
  32. package/templates/api-system/.swcrc +17 -0
  33. package/templates/api-system/app.config.ts +87 -0
  34. package/templates/api-system/docs/api-document.md +497 -0
  35. package/templates/api-system/docs/final-completion-report.md +565 -0
  36. package/templates/api-system/docs/permission-integration-summary.md +432 -0
  37. package/templates/api-system/examples/security/README.md +664 -0
  38. package/templates/api-system/examples/security/complete/.env.example +26 -0
  39. package/templates/api-system/examples/security/complete/PROJECT_STRUCTURE.md +220 -0
  40. package/templates/api-system/examples/security/complete/README.md +847 -0
  41. package/templates/api-system/examples/security/complete/app.config.ts +69 -0
  42. package/templates/api-system/examples/security/complete/app.ts +63 -0
  43. package/templates/api-system/examples/security/complete/controller/auth.controller.ts +131 -0
  44. package/templates/api-system/examples/security/complete/controller/index.ts +4 -0
  45. package/templates/api-system/examples/security/complete/controller/permission.controller.ts +41 -0
  46. package/templates/api-system/examples/security/complete/controller/role.controller.ts +53 -0
  47. package/templates/api-system/examples/security/complete/controller/user.controller.ts +53 -0
  48. package/templates/api-system/examples/security/complete/dto/change-password.dto.ts +10 -0
  49. package/templates/api-system/examples/security/complete/dto/create-permission.dto.ts +14 -0
  50. package/templates/api-system/examples/security/complete/dto/create-role.dto.ts +11 -0
  51. package/templates/api-system/examples/security/complete/dto/create-user.dto.ts +15 -0
  52. package/templates/api-system/examples/security/complete/dto/index.ts +7 -0
  53. package/templates/api-system/examples/security/complete/dto/login.dto.ts +10 -0
  54. package/templates/api-system/examples/security/complete/dto/oauth-profile.dto.ts +7 -0
  55. package/templates/api-system/examples/security/complete/dto/register.dto.ts +17 -0
  56. package/templates/api-system/examples/security/complete/entity/index.ts +6 -0
  57. package/templates/api-system/examples/security/complete/entity/oauth-account.entity.ts +39 -0
  58. package/templates/api-system/examples/security/complete/entity/permission.entity.ts +31 -0
  59. package/templates/api-system/examples/security/complete/entity/role-permission.entity.ts +19 -0
  60. package/templates/api-system/examples/security/complete/entity/role.entity.ts +25 -0
  61. package/templates/api-system/examples/security/complete/entity/user-role.entity.ts +19 -0
  62. package/templates/api-system/examples/security/complete/entity/user.entity.ts +46 -0
  63. package/templates/api-system/examples/security/complete/init.sql +81 -0
  64. package/templates/api-system/examples/security/complete/middleware/auth.interceptor.ts +39 -0
  65. package/templates/api-system/examples/security/complete/middleware/index.ts +2 -0
  66. package/templates/api-system/examples/security/complete/middleware/permission.interceptor.ts +61 -0
  67. package/templates/api-system/examples/security/complete/package.json +54 -0
  68. package/templates/api-system/examples/security/complete/seed.sql +42 -0
  69. package/templates/api-system/examples/security/complete/service/auth.service.ts +41 -0
  70. package/templates/api-system/examples/security/complete/service/index.ts +5 -0
  71. package/templates/api-system/examples/security/complete/service/oauth.service.ts +82 -0
  72. package/templates/api-system/examples/security/complete/service/permission.service.ts +113 -0
  73. package/templates/api-system/examples/security/complete/service/role.service.ts +85 -0
  74. package/templates/api-system/examples/security/complete/service/user.service.ts +132 -0
  75. package/templates/api-system/examples/security/complete/tests/TEST_REPORT.md +318 -0
  76. package/templates/api-system/examples/security/complete/tests/generate-report.js +335 -0
  77. package/templates/api-system/examples/security/complete/tests/helpers/api-helpers.ts +116 -0
  78. package/templates/api-system/examples/security/complete/tests/helpers/index.ts +2 -0
  79. package/templates/api-system/examples/security/complete/tests/helpers/test-helpers.ts +129 -0
  80. package/templates/api-system/examples/security/complete/tests/integration/auth.api.test.ts +429 -0
  81. package/templates/api-system/examples/security/complete/tests/integration/role.api.test.ts +400 -0
  82. package/templates/api-system/examples/security/complete/tests/integration/user.api.test.ts +459 -0
  83. package/templates/api-system/examples/security/complete/tests/jest.config.js +40 -0
  84. package/templates/api-system/examples/security/complete/tests/run-all-tests.js +135 -0
  85. package/templates/api-system/examples/security/complete/tests/run-tests.js +109 -0
  86. package/templates/api-system/examples/security/complete/tests/setup.ts +19 -0
  87. package/templates/api-system/examples/security/complete/tests/unit/auth.service.test.ts +199 -0
  88. package/templates/api-system/examples/security/complete/tests/unit/permission.service.test.ts +377 -0
  89. package/templates/api-system/examples/security/complete/tests/unit/user.service.test.ts +288 -0
  90. package/templates/api-system/examples/security/complete/tsconfig.json +35 -0
  91. package/templates/api-system/examples/security/jwt/README.md +424 -0
  92. package/templates/api-system/examples/security/local/README.md +499 -0
  93. package/templates/api-system/examples/security/oauth2/README.md +637 -0
  94. package/templates/api-system/examples/security/permission/README.md +943 -0
  95. package/templates/api-system/examples/security/session/README.md +753 -0
  96. package/templates/{api-base → api-system}/package.json +6 -5
  97. package/templates/{api-base → api-system}/scripts/codegen.cjs +0 -1
  98. package/templates/{api-base → api-system}/scripts/codegen.ts +0 -1
  99. package/templates/{scaffold-default/packages/api → api-system}/src/config/security-auto-configuration.ts +5 -2
  100. package/templates/api-system/src/scripts/simple-reset-admin.mjs +39 -0
  101. package/templates/api-system/src/server.ts +42 -0
  102. package/templates/api-system/src/types/aiko-boot-starter-web.d.ts +8 -0
  103. package/templates/api-system/src/types/sqljs.d.ts +18 -0
  104. package/templates/{api-base → api-system}/tsconfig.json +0 -1
  105. package/templates/api-system/tsup.config.ts +14 -0
  106. package/templates/api-system/uploads/.gitkeep +0 -0
  107. package/templates/app-admin/.env.example +18 -0
  108. package/templates/{scaffold-default/packages/admin → app-admin}/package.json +9 -3
  109. package/templates/{scaffold-default/packages/admin → app-admin}/tsconfig.json +1 -1
  110. package/templates/app-admin/vite.config.ts +31 -0
  111. package/templates/app-mobile/.env.example +5 -0
  112. package/templates/{scaffold-default/packages/mobile → app-mobile}/package.json +8 -2
  113. package/templates/{scaffold-default/packages/mobile → app-mobile}/src/main.tsx +2 -1
  114. package/templates/api-base/app.config.ts +0 -155
  115. package/templates/api-base/src/controller/auth.controller.ts +0 -160
  116. package/templates/api-base/src/controller/menu.controller.ts +0 -56
  117. package/templates/api-base/src/controller/role.controller.ts +0 -62
  118. package/templates/api-base/src/controller/user.controller.ts +0 -75
  119. package/templates/api-base/src/dto/auth.dto.ts +0 -31
  120. package/templates/api-base/src/dto/menu.dto.ts +0 -38
  121. package/templates/api-base/src/dto/role.dto.ts +0 -18
  122. package/templates/api-base/src/dto/user.dto.ts +0 -36
  123. package/templates/api-base/src/entity/menu.entity.ts +0 -35
  124. package/templates/api-base/src/entity/role-menu.entity.ts +0 -14
  125. package/templates/api-base/src/entity/role.entity.ts +0 -23
  126. package/templates/api-base/src/entity/user-role.entity.ts +0 -14
  127. package/templates/api-base/src/entity/user.entity.ts +0 -32
  128. package/templates/api-base/src/mapper/menu.mapper.ts +0 -7
  129. package/templates/api-base/src/mapper/role-menu.mapper.ts +0 -7
  130. package/templates/api-base/src/mapper/role.mapper.ts +0 -7
  131. package/templates/api-base/src/mapper/user-role.mapper.ts +0 -7
  132. package/templates/api-base/src/mapper/user.mapper.ts +0 -12
  133. package/templates/api-base/src/scripts/init-db.ts +0 -204
  134. package/templates/api-base/src/server.ts +0 -69
  135. package/templates/api-base/src/service/auth.service.ts +0 -144
  136. package/templates/api-base/src/service/log.request.service.ts +0 -72
  137. package/templates/api-base/src/service/menu.service.ts +0 -94
  138. package/templates/api-base/src/service/role.service.ts +0 -88
  139. package/templates/api-base/src/service/user.service.ts +0 -175
  140. package/templates/api-base/src/utils/jwt.util.ts +0 -39
  141. package/templates/scaffold-default/README.md +0 -114
  142. package/templates/scaffold-default/package.json +0 -26
  143. package/templates/scaffold-default/packages/admin/.env.dev +0 -1
  144. package/templates/scaffold-default/packages/admin/.env.prod +0 -4
  145. package/templates/scaffold-default/packages/admin/.env.stage +0 -4
  146. package/templates/scaffold-default/packages/admin/vite.config.ts +0 -26
  147. package/templates/scaffold-default/packages/api/app.config.ts +0 -163
  148. package/templates/scaffold-default/packages/api/src/controller/cache.controller.ts +0 -106
  149. package/templates/scaffold-default/packages/api/src/controller/mq.controller.ts +0 -35
  150. package/templates/scaffold-default/packages/api/src/controller/upload.controller.ts +0 -83
  151. package/templates/scaffold-default/packages/api/src/dto/cache.dto.ts +0 -24
  152. package/templates/scaffold-default/packages/api/src/dto/mq.dto.ts +0 -16
  153. package/templates/scaffold-default/packages/api/src/service/cache.service.ts +0 -80
  154. package/templates/scaffold-default/packages/api/src/service/log.request.service.ts +0 -158
  155. package/templates/scaffold-default/packages/api/src/service/log.service.ts +0 -123
  156. package/templates/scaffold-default/packages/api/src/service/mq.consumer.service.ts +0 -26
  157. package/templates/scaffold-default/pnpm-workspace.yaml +0 -2
  158. package/templates/scaffold-default/scripts/postinstall.cjs +0 -42
  159. package/templates/scaffold-default/scripts/rebuild-sqlite.cjs +0 -23
  160. /package/templates/{scaffold-default/packages/api → api-clean}/.eslintrc.json +0 -0
  161. /package/templates/{scaffold-default/packages/api → api-clean}/.swcrc +0 -0
  162. /package/templates/{scaffold-default/packages/api → api-clean}/docs/api-document.md +0 -0
  163. /package/templates/{scaffold-default/packages/api → api-clean}/docs/final-completion-report.md +0 -0
  164. /package/templates/{scaffold-default/packages/api → api-clean}/docs/permission-integration-summary.md +0 -0
  165. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/.env.example +0 -0
  166. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/PROJECT_STRUCTURE.md +0 -0
  167. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/app.config.ts +0 -0
  168. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/app.ts +0 -0
  169. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/controller/auth.controller.ts +0 -0
  170. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/controller/index.ts +0 -0
  171. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/controller/permission.controller.ts +0 -0
  172. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/controller/role.controller.ts +0 -0
  173. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/controller/user.controller.ts +0 -0
  174. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/change-password.dto.ts +0 -0
  175. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/create-permission.dto.ts +0 -0
  176. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/create-role.dto.ts +0 -0
  177. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/create-user.dto.ts +0 -0
  178. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/index.ts +0 -0
  179. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/login.dto.ts +0 -0
  180. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/oauth-profile.dto.ts +0 -0
  181. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/register.dto.ts +0 -0
  182. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/index.ts +0 -0
  183. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/oauth-account.entity.ts +0 -0
  184. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/permission.entity.ts +0 -0
  185. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/role-permission.entity.ts +0 -0
  186. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/role.entity.ts +0 -0
  187. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/user-role.entity.ts +0 -0
  188. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/user.entity.ts +0 -0
  189. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/init.sql +0 -0
  190. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/middleware/auth.interceptor.ts +0 -0
  191. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/middleware/index.ts +0 -0
  192. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/middleware/permission.interceptor.ts +0 -0
  193. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/package.json +0 -0
  194. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/seed.sql +0 -0
  195. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/auth.service.ts +0 -0
  196. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/index.ts +0 -0
  197. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/oauth.service.ts +0 -0
  198. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/permission.service.ts +0 -0
  199. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/role.service.ts +0 -0
  200. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/user.service.ts +0 -0
  201. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/TEST_REPORT.md +0 -0
  202. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/generate-report.js +0 -0
  203. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/helpers/api-helpers.ts +0 -0
  204. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/helpers/index.ts +0 -0
  205. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/helpers/test-helpers.ts +0 -0
  206. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/integration/auth.api.test.ts +0 -0
  207. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/integration/role.api.test.ts +0 -0
  208. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/integration/user.api.test.ts +0 -0
  209. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/jest.config.js +0 -0
  210. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/run-all-tests.js +0 -0
  211. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/run-tests.js +0 -0
  212. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/setup.ts +0 -0
  213. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/unit/auth.service.test.ts +0 -0
  214. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/unit/permission.service.test.ts +0 -0
  215. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/unit/user.service.test.ts +0 -0
  216. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tsconfig.json +0 -0
  217. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/jwt/README.md +0 -0
  218. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/local/README.md +0 -0
  219. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/oauth2/README.md +0 -0
  220. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/permission/README.md +0 -0
  221. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/session/README.md +0 -0
  222. /package/templates/{scaffold-default/packages/api → api-clean}/scripts/codegen.cjs +0 -0
  223. /package/templates/{scaffold-default/packages/api → api-clean}/scripts/codegen.ts +0 -0
  224. /package/templates/{scaffold-default/packages/api → api-clean}/src/scripts/simple-reset-admin.mjs +0 -0
  225. /package/templates/{scaffold-default/packages/api → api-clean}/src/types/sqljs.d.ts +0 -0
  226. /package/templates/{scaffold-default/packages/api → api-clean}/tsconfig.json +0 -0
  227. /package/templates/{scaffold-default/packages/api → api-clean}/tsup.config.ts +0 -0
  228. /package/templates/{scaffold-default/packages/api → api-clean}/uploads/.gitkeep +0 -0
  229. /package/templates/{scaffold-default/packages/api → api-system}/src/controller/auth.controller.ts +0 -0
  230. /package/templates/{scaffold-default/packages/api → api-system}/src/controller/menu.controller.ts +0 -0
  231. /package/templates/{scaffold-default/packages/api → api-system}/src/controller/role.controller.ts +0 -0
  232. /package/templates/{scaffold-default/packages/api → api-system}/src/controller/user.controller.ts +0 -0
  233. /package/templates/{scaffold-default/packages/api → api-system}/src/dto/auth.dto.ts +0 -0
  234. /package/templates/{scaffold-default/packages/api → api-system}/src/dto/menu.dto.ts +0 -0
  235. /package/templates/{scaffold-default/packages/api → api-system}/src/dto/role.dto.ts +0 -0
  236. /package/templates/{scaffold-default/packages/api → api-system}/src/dto/user.dto.ts +0 -0
  237. /package/templates/{scaffold-default/packages/api → api-system}/src/entity/menu.entity.ts +0 -0
  238. /package/templates/{scaffold-default/packages/api → api-system}/src/entity/role-menu.entity.ts +0 -0
  239. /package/templates/{scaffold-default/packages/api → api-system}/src/entity/role.entity.ts +0 -0
  240. /package/templates/{scaffold-default/packages/api → api-system}/src/entity/user-role.entity.ts +0 -0
  241. /package/templates/{scaffold-default/packages/api → api-system}/src/entity/user.entity.ts +0 -0
  242. /package/templates/{scaffold-default/packages/api → api-system}/src/mapper/menu.mapper.ts +0 -0
  243. /package/templates/{scaffold-default/packages/api → api-system}/src/mapper/role-menu.mapper.ts +0 -0
  244. /package/templates/{scaffold-default/packages/api → api-system}/src/mapper/role.mapper.ts +0 -0
  245. /package/templates/{scaffold-default/packages/api → api-system}/src/mapper/user-role.mapper.ts +0 -0
  246. /package/templates/{scaffold-default/packages/api → api-system}/src/mapper/user.mapper.ts +0 -0
  247. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/assign-role.ts +0 -0
  248. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/check-user-role.ts +0 -0
  249. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/check-users.mjs +0 -0
  250. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/demo-permissions.mjs +0 -0
  251. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/init-db.ts +0 -0
  252. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/reset-admin-password.mjs +0 -0
  253. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/reset-password.ts +0 -0
  254. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/test-db.ts +0 -0
  255. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/test-di.ts +0 -0
  256. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/test-permissions.mjs +0 -0
  257. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/update-admin-password.mjs +0 -0
  258. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/user-roles.ts +0 -0
  259. /package/templates/{scaffold-default/packages/api → api-system}/src/service/auth.service.ts +0 -0
  260. /package/templates/{scaffold-default/packages/api → api-system}/src/service/menu.service.ts +0 -0
  261. /package/templates/{scaffold-default/packages/api → api-system}/src/service/role.service.ts +0 -0
  262. /package/templates/{scaffold-default/packages/api → api-system}/src/service/user.service.ts +0 -0
  263. /package/templates/{scaffold-default/packages/api → api-system}/src/utils/auth.utils.js +0 -0
  264. /package/templates/{scaffold-default/packages/api → api-system}/src/utils/jwt.util.ts +0 -0
  265. /package/templates/{scaffold-default/packages/admin → app-admin}/Dockerfile +0 -0
  266. /package/templates/{scaffold-default/packages/admin → app-admin}/README.MD +0 -0
  267. /package/templates/{scaffold-default/packages/admin → app-admin}/components.json +0 -0
  268. /package/templates/{scaffold-default/packages/admin → app-admin}/eslint.config.js +0 -0
  269. /package/templates/{scaffold-default/packages/admin → app-admin}/index.html +0 -0
  270. /package/templates/{scaffold-default/packages/admin → app-admin}/public/vite.svg +0 -0
  271. /package/templates/{scaffold-default/packages/admin → app-admin}/src/App.css +0 -0
  272. /package/templates/{scaffold-default/packages/admin → app-admin}/src/App.tsx +0 -0
  273. /package/templates/{scaffold-default/packages/admin → app-admin}/src/app.config.ts +0 -0
  274. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/data-table/data-table-pagination.tsx +0 -0
  275. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/data-table/data-table-sorter.tsx +0 -0
  276. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/data-table/index.tsx +0 -0
  277. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/editable-table.tsx +0 -0
  278. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/form/input-password.tsx +0 -0
  279. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/form/sign-in-form.tsx +0 -0
  280. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/error-component.tsx +0 -0
  281. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/header.tsx +0 -0
  282. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/language-switcher.tsx +0 -0
  283. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/layout.tsx +0 -0
  284. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/loading-overlay.tsx +0 -0
  285. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/shell-bar.tsx +0 -0
  286. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/sidebar.tsx +0 -0
  287. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/user-avatar.tsx +0 -0
  288. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/list-report.tsx +0 -0
  289. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/master-detail.tsx +0 -0
  290. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/notification/toaster.tsx +0 -0
  291. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/notification/undoable-notification.tsx +0 -0
  292. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/object-page.tsx +0 -0
  293. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/theme/theme-provider.tsx +0 -0
  294. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/theme/theme-select.tsx +0 -0
  295. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/theme/theme-toggle.tsx +0 -0
  296. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/accordion.tsx +0 -0
  297. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/alert-dialog.tsx +0 -0
  298. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/alert.tsx +0 -0
  299. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/aspect-ratio.tsx +0 -0
  300. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/avatar.tsx +0 -0
  301. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/badge.tsx +0 -0
  302. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/breadcrumb.tsx +0 -0
  303. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/button.tsx +0 -0
  304. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/calendar.tsx +0 -0
  305. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/card.tsx +0 -0
  306. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/carousel.tsx +0 -0
  307. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/chart.tsx +0 -0
  308. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/checkbox.tsx +0 -0
  309. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/collapsible.tsx +0 -0
  310. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/command.tsx +0 -0
  311. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/context-menu.tsx +0 -0
  312. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/dialog.tsx +0 -0
  313. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/drawer.tsx +0 -0
  314. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/dropdown-menu.tsx +0 -0
  315. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/form.tsx +0 -0
  316. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/hover-card.tsx +0 -0
  317. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/input-otp.tsx +0 -0
  318. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/input.tsx +0 -0
  319. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/label.tsx +0 -0
  320. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/menubar.tsx +0 -0
  321. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/navigation-menu.tsx +0 -0
  322. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/pagination.tsx +0 -0
  323. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/popover.tsx +0 -0
  324. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/progress.tsx +0 -0
  325. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/radio-group.tsx +0 -0
  326. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/resizable.tsx +0 -0
  327. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/scroll-area.tsx +0 -0
  328. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/select.tsx +0 -0
  329. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/separator.tsx +0 -0
  330. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/sheet.tsx +0 -0
  331. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/sidebar.tsx +0 -0
  332. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/skeleton.tsx +0 -0
  333. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/slider.tsx +0 -0
  334. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/sonner.tsx +0 -0
  335. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/switch.tsx +0 -0
  336. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/table.tsx +0 -0
  337. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/tabs.tsx +0 -0
  338. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/textarea.tsx +0 -0
  339. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/toggle-group.tsx +0 -0
  340. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/toggle.tsx +0 -0
  341. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/tooltip.tsx +0 -0
  342. /package/templates/{scaffold-default/packages/admin → app-admin}/src/hooks/use-mobile.ts +0 -0
  343. /package/templates/{scaffold-default/packages/admin → app-admin}/src/i18n.ts +0 -0
  344. /package/templates/{scaffold-default/packages/admin → app-admin}/src/index.tsx +0 -0
  345. /package/templates/{scaffold-default/packages/admin → app-admin}/src/layouts/menu-layout.tsx +0 -0
  346. /package/templates/{scaffold-default/packages/admin → app-admin}/src/layouts/tile-layout.tsx +0 -0
  347. /package/templates/{scaffold-default/packages/admin → app-admin}/src/lib/utils.ts +0 -0
  348. /package/templates/{scaffold-default/packages/admin → app-admin}/src/locales/en.json +0 -0
  349. /package/templates/{scaffold-default/packages/admin → app-admin}/src/locales/zh.json +0 -0
  350. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/dashboard.tsx +0 -0
  351. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/goods-receipt/CreatePage.tsx +0 -0
  352. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/goods-receipt/EditPage.tsx +0 -0
  353. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/goods-receipt/ListPage.tsx +0 -0
  354. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/goods-receipt/ViewPage.tsx +0 -0
  355. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/goods-receipt/index.ts +0 -0
  356. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/home-page.tsx +0 -0
  357. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/cost-centers/index.tsx +0 -0
  358. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/currencies/index.tsx +0 -0
  359. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/materials/ListPage.tsx +0 -0
  360. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/materials/ViewPage.tsx +0 -0
  361. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/materials/index.ts +0 -0
  362. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/plants/ListPage.tsx +0 -0
  363. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/plants/ViewPage.tsx +0 -0
  364. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/plants/index.ts +0 -0
  365. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/purchase-organizations/index.tsx +0 -0
  366. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/units-of-measure/index.tsx +0 -0
  367. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/vendors/ListPage.tsx +0 -0
  368. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/vendors/ViewPage.tsx +0 -0
  369. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/vendors/index.ts +0 -0
  370. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/placeholder-page.tsx +0 -0
  371. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-orders/ListPage.tsx +0 -0
  372. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-orders/ViewPage.tsx +0 -0
  373. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-orders/index.ts +0 -0
  374. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/CreatePage.tsx +0 -0
  375. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/EditPage.tsx +0 -0
  376. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/ListPage.tsx +0 -0
  377. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/ViewPage.tsx +0 -0
  378. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/constants.ts +0 -0
  379. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/index.ts +0 -0
  380. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/reports/PurchaseOrderReport.tsx +0 -0
  381. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/reports/PurchaseRequisitionReport.tsx +0 -0
  382. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/reports/index.ts +0 -0
  383. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/settings-page.tsx +0 -0
  384. /package/templates/{scaffold-default/packages/admin → app-admin}/src/providers/app-config.tsx +0 -0
  385. /package/templates/{scaffold-default/packages/admin → app-admin}/src/providers/auth-provider.ts +0 -0
  386. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/auth.ts +0 -0
  387. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/index.ts +0 -0
  388. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/menu.ts +0 -0
  389. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/goods-receipt.ts +0 -0
  390. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/master-data.ts +0 -0
  391. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/purchase-orders.ts +0 -0
  392. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/purchase-requisitions.ts +0 -0
  393. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/reports.ts +0 -0
  394. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/settings.ts +0 -0
  395. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/withSuspense.tsx +0 -0
  396. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/amber.css +0 -0
  397. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/blue.css +0 -0
  398. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/default.css +0 -0
  399. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/fiori.css +0 -0
  400. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/green.css +0 -0
  401. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/index.css +0 -0
  402. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/rose.css +0 -0
  403. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/violet.css +0 -0
  404. /package/templates/{scaffold-default/packages/admin → app-admin}/src/vite-env.d.ts +0 -0
  405. /package/templates/{scaffold-default/packages/admin → app-admin}/tsconfig.node.json +0 -0
  406. /package/templates/{scaffold-default/packages/core → app-core}/package.json +0 -0
  407. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/auth-client-middleware.ts +0 -0
  408. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/auth-constants.ts +0 -0
  409. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/auth-service.ts +0 -0
  410. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/backend-auth-provider.ts +0 -0
  411. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/default-auth-provider.ts +0 -0
  412. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/index.ts +0 -0
  413. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/types.ts +0 -0
  414. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/authorization-client-middleware.ts +0 -0
  415. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/authorization-config.ts +0 -0
  416. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/authorization-provider.tsx +0 -0
  417. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/default-authorization-provider.ts +0 -0
  418. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/index.ts +0 -0
  419. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/types.ts +0 -0
  420. /package/templates/{scaffold-default/packages/core → app-core}/src/index.ts +0 -0
  421. /package/templates/{scaffold-default/packages/core → app-core}/src/utils/promise-result-cache.ts +0 -0
  422. /package/templates/{scaffold-default/packages/core → app-core}/tsconfig.json +0 -0
  423. /package/templates/{scaffold-default/packages/mobile → app-mobile}/README.md +0 -0
  424. /package/templates/{scaffold-default/packages/mobile → app-mobile}/index.html +0 -0
  425. /package/templates/{scaffold-default/packages/mobile → app-mobile}/postcss.config.mjs +0 -0
  426. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/App.tsx +0 -0
  427. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/app/globals.css +0 -0
  428. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/components/LoginForm.tsx +0 -0
  429. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/hooks/index.ts +0 -0
  430. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/lib/utils.ts +0 -0
  431. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/pages/HomePage.tsx +0 -0
  432. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/pages/LoginPage.tsx +0 -0
  433. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/pages/index.ts +0 -0
  434. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/routes/ProtectedRoute.tsx +0 -0
  435. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/routes/index.tsx +0 -0
  436. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/routes/routes.ts +0 -0
  437. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/types/index.ts +0 -0
  438. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/vite-env.d.ts +0 -0
  439. /package/templates/{scaffold-default/packages/mobile → app-mobile}/tsconfig.json +0 -0
  440. /package/templates/{scaffold-default/packages/mobile → app-mobile}/tsconfig.node.json +0 -0
  441. /package/templates/{scaffold-default/packages/mobile → app-mobile}/vite.config.ts +0 -0
@@ -0,0 +1,284 @@
1
+ import path from 'path';
2
+ import fs from 'fs-extra';
3
+ import { loadProjectConfig } from '../core/project-config.js';
4
+ function modeToNodeEnv(mode) {
5
+ return mode === 'dev' ? 'development' : 'production';
6
+ }
7
+ function setOrReplaceKey(text, key, value) {
8
+ const re = new RegExp(`^${key}=.*$`, 'm');
9
+ if (re.test(text))
10
+ return text.replace(re, `${key}=${value}`);
11
+ const prefix = text.endsWith('\n') ? '' : '\n';
12
+ return `${text}${prefix}${key}=${value}\n`;
13
+ }
14
+ function patchFrontendEnv(text, mode) {
15
+ let patched = setOrReplaceKey(text, 'APP_ENV', mode);
16
+ // Vite 不支持通过前端 .env 覆盖 NODE_ENV;移除避免警告/行为不一致
17
+ patched = patched.replace(/^NODE_ENV=.*$/m, '');
18
+ return patched;
19
+ }
20
+ function patchApiEnv(text, mode) {
21
+ const nodeEnv = modeToNodeEnv(mode);
22
+ let patched = setOrReplaceKey(text, 'APP_ENV', mode);
23
+ patched = setOrReplaceKey(patched, 'NODE_ENV', nodeEnv);
24
+ return patched;
25
+ }
26
+ function buildPnpmRootDevScript(args) {
27
+ const filters = args.pkgs.map((p) => `--filter "${p}"`).join(' ');
28
+ return `pnpm -r --parallel ${filters} dev:${args.mode}`;
29
+ }
30
+ function buildApiDevScript(mode) {
31
+ return `cross-env APP_ENV=${mode} NODE_ENV=${modeToNodeEnv(mode)} concurrently -n codegen,server -c blue,green "pnpm codegen:watch" "node --import @swc-node/register/esm-register --watch src/server.ts"`;
32
+ }
33
+ function buildApiStartScript(mode) {
34
+ return `cross-env APP_ENV=${mode} NODE_ENV=${modeToNodeEnv(mode)} node dist/server.js`;
35
+ }
36
+ function buildAdminDevScript(mode) {
37
+ return `vite --mode ${mode}`;
38
+ }
39
+ function buildAdminBuildScript(mode) {
40
+ return `tsc && vite build --mode ${mode}`;
41
+ }
42
+ function buildMobileDevScript(mode) {
43
+ return `vite --mode ${mode} --port 3002`;
44
+ }
45
+ function buildMobileBuildScript(mode) {
46
+ return `tsc --noEmit && vite build --mode ${mode}`;
47
+ }
48
+ export function createEnvUseCase(deps) {
49
+ const { logger } = deps;
50
+ function extractModesFromDirFiles(files) {
51
+ const modes = [];
52
+ for (const file of files) {
53
+ const m = file.match(/^\.env\.(.+)$/);
54
+ if (!m)
55
+ continue;
56
+ const suffix = m[1];
57
+ // .env.example 不符合这个正则,但我们也防御一下
58
+ if (!suffix || suffix === 'example')
59
+ continue;
60
+ modes.push(suffix);
61
+ }
62
+ return modes;
63
+ }
64
+ async function getTargets(rootDir) {
65
+ const config = await loadProjectConfig(rootDir);
66
+ if (!config) {
67
+ throw new Error('未找到 .aiko-boot.json,当前目录似乎不是脚手架根目录,请在 create 生成的根目录下执行。');
68
+ }
69
+ const scope = config.scope ?? 'scaffold';
70
+ const targets = [];
71
+ for (const api of config.apis ?? []) {
72
+ targets.push({ kind: 'api', name: api.name, relDir: api.path });
73
+ }
74
+ for (const app of config.apps ?? []) {
75
+ targets.push({
76
+ kind: 'app',
77
+ type: app.type,
78
+ name: app.name,
79
+ relDir: app.path,
80
+ });
81
+ }
82
+ return { config, scope, targets };
83
+ }
84
+ async function list(args) {
85
+ const { scope, targets } = await getTargets(args.rootDir);
86
+ void scope;
87
+ const modes = new Set();
88
+ const existence = {};
89
+ const targetKeys = targets.map((t) => `${t.kind}:${t.name}`);
90
+ for (const target of targets) {
91
+ const dir = path.join(args.rootDir, target.relDir);
92
+ const files = (await fs.pathExists(dir)) ? await fs.readdir(dir) : [];
93
+ const envModes = extractModesFromDirFiles(files);
94
+ for (const m of envModes)
95
+ modes.add(m);
96
+ }
97
+ const sorted = Array.from(modes).sort();
98
+ for (const m of sorted) {
99
+ existence[m] = {};
100
+ for (const key of targetKeys)
101
+ existence[m][key] = false;
102
+ for (const target of targets) {
103
+ const dir = path.join(args.rootDir, target.relDir);
104
+ const file = path.join(dir, `.env.${m}`);
105
+ const key = `${target.kind}:${target.name}`;
106
+ if (await fs.pathExists(file))
107
+ existence[m][key] = true;
108
+ }
109
+ }
110
+ logger.info('Available environments:');
111
+ for (const m of sorted) {
112
+ const parts = targets.map((t) => {
113
+ const key = `${t.kind}:${t.name}`;
114
+ return `${key}=${existence[m][key] ? 'yes' : 'no'}`;
115
+ });
116
+ logger.info(`- ${m}: ${parts.join(', ')}`);
117
+ }
118
+ if (sorted.length === 0) {
119
+ logger.info('- (none found)');
120
+ }
121
+ return sorted;
122
+ }
123
+ async function add(args) {
124
+ const { scope, targets } = await getTargets(args.rootDir);
125
+ const mode = args.mode;
126
+ const injectScripts = args.injectScripts ?? true;
127
+ const onExisting = args.onExisting ?? 'error';
128
+ const rootPkgPath = path.join(args.rootDir, 'package.json');
129
+ if (!(await fs.pathExists(rootPkgPath))) {
130
+ throw new Error(`未找到根 package.json:${rootPkgPath}`);
131
+ }
132
+ const rootPkg = await fs.readJson(rootPkgPath);
133
+ rootPkg.scripts = rootPkg.scripts ?? {};
134
+ const pkgsToRun = [];
135
+ for (const target of targets) {
136
+ const packageName = `@${scope}/${target.name}`;
137
+ if (target.kind === 'api')
138
+ pkgsToRun.push(packageName);
139
+ if (target.kind === 'app' && (target.type === 'admin' || target.type === 'mobile')) {
140
+ pkgsToRun.push(packageName);
141
+ }
142
+ }
143
+ // 1) env 文件生成
144
+ for (const target of targets) {
145
+ const dir = path.join(args.rootDir, target.relDir);
146
+ const templatePath = path.join(dir, '.env.example');
147
+ const outPath = path.join(dir, `.env.${mode}`);
148
+ if ((await fs.pathExists(outPath)) && !args.force) {
149
+ if (onExisting === 'skip') {
150
+ logger.info(`ℹ️ Skip existing env for ${target.kind}:${target.name} (${mode})`);
151
+ continue;
152
+ }
153
+ throw new Error(`目标 env 已存在:${outPath}(可用 --force 覆盖)`);
154
+ }
155
+ if (args.dryRun) {
156
+ logger.info(`[dry-run] Generate: ${path.relative(args.rootDir, outPath)}`);
157
+ continue;
158
+ }
159
+ if (!(await fs.pathExists(templatePath))) {
160
+ throw new Error(`缺少 .env.example:${templatePath}(请先在该应用/服务目录补齐环境模板文件)`);
161
+ }
162
+ let text = await fs.readFile(templatePath, 'utf8');
163
+ text = target.kind === 'api' ? patchApiEnv(text, mode) : patchFrontendEnv(text, mode);
164
+ await fs.writeFile(outPath, text, 'utf8');
165
+ logger.info(`✅ Generated: ${path.relative(args.rootDir, outPath)}`);
166
+ }
167
+ // 2) 脚本注入:根目录 dev:<mode>(不包含 dev 这个模式)
168
+ if (injectScripts) {
169
+ if (mode !== 'dev' && pkgsToRun.length > 0) {
170
+ rootPkg.scripts[`dev:${mode}`] = buildPnpmRootDevScript({
171
+ pkgs: pkgsToRun,
172
+ mode,
173
+ });
174
+ }
175
+ if (!args.dryRun) {
176
+ await fs.writeJson(rootPkgPath, rootPkg, { spaces: 2 });
177
+ }
178
+ // 3) 脚本注入:各包 dev:<mode> / build:<mode> / start:<mode>
179
+ for (const target of targets) {
180
+ if (target.kind === 'api') {
181
+ const pkgPath = path.join(args.rootDir, target.relDir, 'package.json');
182
+ if (!(await fs.pathExists(pkgPath)))
183
+ continue;
184
+ const pkg = await fs.readJson(pkgPath);
185
+ pkg.scripts = pkg.scripts ?? {};
186
+ pkg.scripts[`dev:${mode}`] = buildApiDevScript(mode);
187
+ pkg.scripts[`start:${mode}`] = buildApiStartScript(mode);
188
+ if (!args.dryRun) {
189
+ await fs.writeJson(pkgPath, pkg, { spaces: 2 });
190
+ }
191
+ }
192
+ else if (target.type === 'admin') {
193
+ const pkgPath = path.join(args.rootDir, target.relDir, 'package.json');
194
+ if (!(await fs.pathExists(pkgPath)))
195
+ continue;
196
+ const pkg = await fs.readJson(pkgPath);
197
+ pkg.scripts = pkg.scripts ?? {};
198
+ pkg.scripts[`dev:${mode}`] = buildAdminDevScript(mode);
199
+ pkg.scripts[`build:${mode}`] = buildAdminBuildScript(mode);
200
+ if (!args.dryRun) {
201
+ await fs.writeJson(pkgPath, pkg, { spaces: 2 });
202
+ }
203
+ }
204
+ else if (target.type === 'mobile') {
205
+ const pkgPath = path.join(args.rootDir, target.relDir, 'package.json');
206
+ if (!(await fs.pathExists(pkgPath)))
207
+ continue;
208
+ const pkg = await fs.readJson(pkgPath);
209
+ pkg.scripts = pkg.scripts ?? {};
210
+ pkg.scripts[`dev:${mode}`] = buildMobileDevScript(mode);
211
+ pkg.scripts[`build:${mode}`] = buildMobileBuildScript(mode);
212
+ if (!args.dryRun) {
213
+ await fs.writeJson(pkgPath, pkg, { spaces: 2 });
214
+ }
215
+ }
216
+ else {
217
+ logger.warn(`跳过未知应用类型(无法自动注入脚本):${target.kind}:${target.name} type=${target.type}`);
218
+ }
219
+ }
220
+ }
221
+ }
222
+ async function remove(args) {
223
+ const { scope, targets } = await getTargets(args.rootDir);
224
+ const mode = args.mode;
225
+ const rootPkgPath = path.join(args.rootDir, 'package.json');
226
+ if (!(await fs.pathExists(rootPkgPath))) {
227
+ throw new Error(`未找到根 package.json:${rootPkgPath}`);
228
+ }
229
+ const rootPkg = await fs.readJson(rootPkgPath);
230
+ rootPkg.scripts = rootPkg.scripts ?? {};
231
+ if (mode !== 'dev' && rootPkg.scripts[`dev:${mode}`]) {
232
+ delete rootPkg.scripts[`dev:${mode}`];
233
+ }
234
+ if (!args.dryRun) {
235
+ await fs.writeJson(rootPkgPath, rootPkg, { spaces: 2 });
236
+ }
237
+ for (const target of targets) {
238
+ const dir = path.join(args.rootDir, target.relDir);
239
+ const envPath = path.join(dir, `.env.${mode}`);
240
+ if (!(await fs.pathExists(envPath))) {
241
+ if (!args.force) {
242
+ throw new Error(`目标 env 不存在:${path.relative(args.rootDir, envPath)}`);
243
+ }
244
+ }
245
+ else if (args.dryRun) {
246
+ logger.info(`[dry-run] Remove: ${path.relative(args.rootDir, envPath)}`);
247
+ }
248
+ else {
249
+ await fs.remove(envPath);
250
+ logger.info(`🗑️ Removed: ${path.relative(args.rootDir, envPath)}`);
251
+ }
252
+ const pkgPath = path.join(dir, 'package.json');
253
+ if (!(await fs.pathExists(pkgPath)))
254
+ continue;
255
+ const pkg = await fs.readJson(pkgPath);
256
+ pkg.scripts = pkg.scripts ?? {};
257
+ if (target.kind === 'api') {
258
+ // api 的默认 dev 通常依赖 dev:dev(如 dev: "pnpm dev:dev")
259
+ // 因此 mode=dev 时不要删除 dev:dev/start:dev 脚本,避免破坏 pnpm dev。
260
+ if (mode !== 'dev') {
261
+ delete pkg.scripts[`dev:${mode}`];
262
+ delete pkg.scripts[`start:${mode}`];
263
+ }
264
+ }
265
+ else if (target.type === 'admin') {
266
+ delete pkg.scripts[`dev:${mode}`];
267
+ delete pkg.scripts[`build:${mode}`];
268
+ }
269
+ else if (target.type === 'mobile') {
270
+ delete pkg.scripts[`dev:${mode}`];
271
+ delete pkg.scripts[`build:${mode}`];
272
+ }
273
+ if (!args.dryRun) {
274
+ await fs.writeJson(pkgPath, pkg, { spaces: 2 });
275
+ }
276
+ }
277
+ void scope;
278
+ }
279
+ return {
280
+ list,
281
+ add,
282
+ remove,
283
+ };
284
+ }
@@ -3,11 +3,10 @@ import type { Prompter } from '../core/prompts.js';
3
3
  export type InitScaffoldInput = {
4
4
  targetDir?: string;
5
5
  name?: string;
6
+ withAdminSuite: boolean;
7
+ db?: string;
8
+ features?: string;
6
9
  empty: boolean;
7
- withAdmin: boolean;
8
- withMobile: boolean;
9
- withApi: boolean;
10
- templateDir?: string;
11
10
  dryRun: boolean;
12
11
  };
13
12
  export type InitScaffoldDeps = {
@@ -1,13 +1,9 @@
1
1
  import path from 'path';
2
- import { fileURLToPath } from 'url';
3
2
  import fs from 'fs-extra';
4
3
  import { saveProjectConfig, } from '../core/project-config.js';
5
4
  import { syncRootPackageJson } from '../core/workspace.js';
6
5
  import { createAddApiUseCase } from './add-api.usecase.js';
7
6
  import { createAddAppUseCase } from './add-app.usecase.js';
8
- // 在 ESM 环境中模拟 __dirname,兼容打包到 dist 后的运行时
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = path.dirname(__filename);
11
7
  export function createInitUseCase(deps) {
12
8
  const { logger, prompter } = deps;
13
9
  async function resolveInput(input) {
@@ -28,31 +24,25 @@ export function createInitUseCase(deps) {
28
24
  }
29
25
  const resolvedName = name;
30
26
  const resolvedTargetDir = targetDir;
31
- // 默认使用包内置模板:templates/scaffold-default
32
- // 这样发布到 npm 后也可以直接使用,而无需依赖仓库根目录的 ./scaffold。
33
- const defaultTemplateDir = path.resolve(__dirname, '../../templates/scaffold-default');
34
- const templateDir = input.templateDir ?? defaultTemplateDir;
35
27
  return {
36
28
  targetDir: resolvedTargetDir,
37
29
  name: resolvedName,
38
- templateDir,
39
30
  options: {
31
+ withAdminSuite: input.withAdminSuite,
32
+ db: input.db,
33
+ features: input.features,
40
34
  empty: input.empty,
41
- withAdmin: input.withAdmin,
42
- withMobile: input.withMobile,
43
- withApi: input.withApi,
44
35
  dryRun: input.dryRun,
45
36
  },
46
37
  };
47
38
  }
48
39
  async function execute(input) {
49
- const { targetDir, name, templateDir, options } = await resolveInput(input);
40
+ const { targetDir, name, options } = await resolveInput(input);
50
41
  if (options.dryRun) {
51
42
  logger.info('[dry-run] 将会创建脚手架:');
52
43
  logger.info(` name: ${name}`);
53
44
  logger.info(` targetDir: ${targetDir}`);
54
- logger.info(` templateDir: ${templateDir}`);
55
- logger.info(` empty: ${options.empty}, withAdmin: ${options.withAdmin}, withMobile: ${options.withMobile}, withApi: ${options.withApi}`);
45
+ logger.info(` empty: ${options.empty}, withAdminSuite: ${options.withAdminSuite}, db: ${options.db ?? '(default)'}, features: ${options.features ?? '(none)'}`);
56
46
  return;
57
47
  }
58
48
  logger.info(`创建 aiko-boot 脚手架到:${targetDir}`);
@@ -86,42 +76,39 @@ export function createInitUseCase(deps) {
86
76
  apis: [],
87
77
  };
88
78
  await saveProjectConfig(targetDir, config);
89
- // 步骤 3: 如果指定了 --with-api/--with-admin/--with-mobile,复用 add-api/add-app 的逻辑
90
- if (!options.empty) {
79
+ if (options.empty && options.withAdminSuite) {
80
+ throw new Error('--empty 和 --with-admin-suite 不能同时使用。');
81
+ }
82
+ // 步骤 3: with-admin-suite 时复用 add-api/add-app 逻辑,自动创建 admin+mobile+system(api)
83
+ if (options.withAdminSuite) {
91
84
  const addApiUseCase = createAddApiUseCase({ logger, prompter });
92
85
  const addAppUseCase = createAddAppUseCase({ logger, prompter });
93
- // 默认模板目录:使用内置的 scaffold-default(如果用户没指定)
94
- const defaultTemplateRoot = templateDir;
95
- if (options.withApi) {
96
- logger.info('正在添加 API 服务端...');
97
- await addApiUseCase.execute({
98
- name: 'api',
99
- db: 'sqlite',
100
- rootDir: targetDir,
101
- templateDir: undefined, // 使用 add-api 的默认内置模板 api-base
102
- dryRun: false,
103
- });
104
- }
105
- if (options.withAdmin) {
106
- logger.info('正在添加 Admin 应用...');
107
- await addAppUseCase.execute({
108
- name: 'admin',
109
- type: 'admin',
110
- rootDir: targetDir,
111
- templateDir: defaultTemplateRoot, // 从 scaffold-default/packages/admin 复制
112
- dryRun: false,
113
- });
114
- }
115
- if (options.withMobile) {
116
- logger.info('正在添加 Mobile 应用...');
117
- await addAppUseCase.execute({
118
- name: 'mobile',
119
- type: 'mobile',
120
- rootDir: targetDir,
121
- templateDir: defaultTemplateRoot, // 从 scaffold-default/packages/mobile 复制
122
- dryRun: false,
123
- });
124
- }
86
+ logger.info('正在添加 System API 服务端...');
87
+ const shouldPromptApiOptions = options.db === undefined || options.features === undefined;
88
+ await addApiUseCase.execute({
89
+ name: 'system',
90
+ preset: 'system',
91
+ db: options.db,
92
+ features: options.features,
93
+ yes: false,
94
+ interactive: shouldPromptApiOptions,
95
+ rootDir: targetDir,
96
+ dryRun: false,
97
+ });
98
+ logger.info('正在添加 Admin 应用...');
99
+ await addAppUseCase.execute({
100
+ name: 'admin',
101
+ type: 'admin',
102
+ rootDir: targetDir,
103
+ dryRun: false,
104
+ });
105
+ logger.info('正在添加 Mobile 应用...');
106
+ await addAppUseCase.execute({
107
+ name: 'mobile',
108
+ type: 'mobile',
109
+ rootDir: targetDir,
110
+ dryRun: false,
111
+ });
125
112
  }
126
113
  // 最后统一同步根 package.json(scripts / pnpm.onlyBuiltDependencies 等)
127
114
  await syncRootPackageJson(targetDir);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-partner-x/aiko-boot-cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "CLI to create aiko-boot scaffold project (monorepo with api, admin, mobile, shared)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -19,6 +19,7 @@
19
19
  "templates"
20
20
  ],
21
21
  "dependencies": {
22
+ "@inquirer/prompts": "^8.3.2",
22
23
  "commander": "^12.1.0",
23
24
  "fs-extra": "^11.2.0"
24
25
  },
@@ -37,7 +38,11 @@
37
38
  "scripts": {
38
39
  "build": "tsc",
39
40
  "dev": "tsc --watch",
40
- "sync:templates:scaffold-default": "node ./scripts/sync-scaffold-default.mjs",
41
- "sync:templates:scaffold-default:dry": "node ./scripts/sync-scaffold-default.mjs --dry-run"
41
+ "sync:templates:api-system": "node ./scripts/sync-api-system.mjs",
42
+ "sync:templates:api-system:dry": "node ./scripts/sync-api-system.mjs --dry-run",
43
+ "sync:templates:api-clean": "node ./scripts/sync-api-clean.mjs",
44
+ "sync:templates:api-clean:dry": "node ./scripts/sync-api-clean.mjs --dry-run",
45
+ "sync:templates:apps": "node ./scripts/sync-app-templates.mjs",
46
+ "sync:templates:apps:dry": "node ./scripts/sync-app-templates.mjs --dry-run"
42
47
  }
43
48
  }
@@ -0,0 +1,3 @@
1
+ NODE_ENV=production
2
+ APP_ENV=prod
3
+ PORT=3001
@@ -0,0 +1,19 @@
1
+ import type { AppConfig } from '@ai-partner-x/aiko-boot';
2
+
3
+ export default {
4
+ server: {
5
+ port: Number(process.env.PORT) || 3001,
6
+ servlet: {
7
+ contextPath: '/api',
8
+ },
9
+ shutdown: 'graceful',
10
+ },
11
+ database: {
12
+ type: 'sqlite',
13
+ filename: './data/app.db',
14
+ },
15
+ validation: {
16
+ enabled: true,
17
+ failFast: false,
18
+ },
19
+ } satisfies AppConfig;
@@ -247,7 +247,7 @@ export class UserController {
247
247
 
248
248
  ## 更多信息
249
249
 
250
- - [Aiko Boot 官方文档](https://github.com/ai-partner-x/aiko-boot)
250
+ - [Aiko Boot 官方文档](../../../../../docs/)
251
251
  - [项目分析报告](../../../../../项目分析报告.md)
252
252
  - [Security Starter README](../../../../../packages/aiko-boot-starter-security/README.md)
253
253
 
@@ -660,5 +660,5 @@ server {
660
660
 
661
661
  - [项目结构说明](complete/PROJECT_STRUCTURE.md)
662
662
  - [测试报告](complete/tests/TEST_REPORT.md)
663
- - [Aiko Boot 官方文档](https://github.com/ai-partner-x/aiko-boot)
663
+ - [Aiko Boot 官方文档](../../../../../docs/)
664
664
  - [Security Starter README](../../../../../packages/aiko-boot-starter-security/README.md)
@@ -842,6 +842,6 @@ export class HealthController {
842
842
 
843
843
  ## 更多信息
844
844
 
845
- - [Aiko Boot 官方文档](https://github.com/ai-partner-x/aiko-boot)
845
+ - [Aiko Boot 官方文档](../../../../../docs/)
846
846
  - [项目分析报告](../../../../../项目分析报告.md)
847
847
  - [Security Starter README](../../../../../packages/aiko-boot-starter-security/README.md)
@@ -10,7 +10,7 @@
10
10
  }
11
11
  },
12
12
  "scripts": {
13
- "dev": "concurrently -n codegen,server -c blue,green \"pnpm codegen:watch\" \"node --import @swc-node/register/esm-register --watch src/server.ts\"",
13
+ "dev": "node --import @swc-node/register/esm-register --watch src/server.ts",
14
14
  "dev:server": "node --import @swc-node/register/esm-register --watch src/server.ts",
15
15
  "codegen:watch": "node scripts/codegen.cjs --watch",
16
16
  "init-db": "node --import @swc-node/register/esm-register src/scripts/init-db.ts",
@@ -23,23 +23,14 @@
23
23
  "@ai-partner-x/aiko-boot": "workspace:*",
24
24
  "@ai-partner-x/aiko-boot-codegen": "workspace:*",
25
25
  "@ai-partner-x/aiko-boot-starter-orm": "workspace:*",
26
- "@ai-partner-x/aiko-boot-starter-cache": "workspace:*",
27
26
  "@ai-partner-x/aiko-boot-starter-validation": "workspace:*",
28
27
  "@ai-partner-x/aiko-boot-starter-web": "workspace:*",
29
- "@ai-partner-x/aiko-boot-starter-security": "workspace:*",
30
- "@ai-partner-x/aiko-boot-starter-storage": "workspace:*",
31
- "@ai-partner-x/aiko-boot-starter-mq": "workspace:*",
32
- "@ai-partner-x/aiko-boot-starter-log": "workspace:*",
33
- "bcryptjs": "^2.4.3",
34
- "jsonwebtoken": "^9.0.2",
35
28
  "better-sqlite3": "^12.6.2",
36
- "ioredis": "^5.4.2",
37
29
  "cors": "^2.8.5",
38
- "date-fns": "^4.1.0",
39
30
  "express": "^4.18.0",
40
31
  "axios": "^1.6.0",
41
- "multer": "^1.4.5-lts.1",
42
- "reflect-metadata": "^0.2.1"
32
+ "reflect-metadata": "^0.2.1",
33
+ "dotenv": "^17.2.3"
43
34
  },
44
35
  "devDependencies": {
45
36
  "concurrently": "^9.2.1",
@@ -47,12 +38,9 @@
47
38
  "@swc-node/register": "^1.11.1",
48
39
  "@swc/core": "^1.15.18",
49
40
  "@ai-partner-x/eslint-plugin-aiko-boot": "workspace:*",
50
- "@types/bcryptjs": "^2.4.6",
51
41
  "@types/better-sqlite3": "^7.6.13",
52
42
  "@types/cors": "^2.8.17",
53
43
  "@types/express": "^4.17.21",
54
- "@types/jsonwebtoken": "^9.0.5",
55
- "@types/multer": "^1.4.12",
56
44
  "@types/node": "^20.11.0",
57
45
  "@typescript-eslint/parser": "^6.21.0",
58
46
  "eslint": "^8.57.1",
@@ -60,4 +48,4 @@
60
48
  "tsx": "^4.7.0",
61
49
  "typescript": "^5.3.0"
62
50
  }
63
- }
51
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Initialize a clean database for api-clean template.
3
+ * Run: pnpm init-db
4
+ */
5
+ import 'reflect-metadata';
6
+ import { fileURLToPath } from 'url';
7
+ import { dirname, join } from 'path';
8
+ import { mkdirSync, existsSync } from 'fs';
9
+ import { createKyselyDatabase, getKyselyDatabase } from '@ai-partner-x/aiko-boot-starter-orm';
10
+
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const dbPath = join(__dirname, '../../data/app.db');
13
+ const dir = dirname(dbPath);
14
+
15
+ if (!existsSync(dir)) {
16
+ mkdirSync(dir, { recursive: true });
17
+ }
18
+
19
+ await createKyselyDatabase({
20
+ type: 'sqlite',
21
+ filename: dbPath,
22
+ });
23
+
24
+ const db = getKyselyDatabase();
25
+ await db.schema
26
+ .createTable('app_health')
27
+ .ifNotExists()
28
+ .addColumn('id', 'integer', (col: any) => col.primaryKey().autoIncrement())
29
+ .addColumn('status', 'varchar(32)', (col: any) => col.notNull())
30
+ .addColumn('created_at', 'datetime', (col: any) => col.notNull())
31
+ .execute();
32
+
33
+ const exists = await db
34
+ .selectFrom('app_health')
35
+ .selectAll()
36
+ .where('status', '=', 'ok')
37
+ .executeTakeFirst();
38
+
39
+ if (!exists) {
40
+ await db
41
+ .insertInto('app_health')
42
+ .values({
43
+ status: 'ok',
44
+ created_at: new Date().toISOString(),
45
+ })
46
+ .execute();
47
+ }
48
+
49
+ console.log('Database initialized at:', dbPath);
50
+ process.exit(0);
@@ -1,30 +1,34 @@
1
1
  import 'reflect-metadata';
2
2
  import express from 'express';
3
3
  import { createApp } from '@ai-partner-x/aiko-boot';
4
- import { autoInit, getLogger } from '@ai-partner-x/aiko-boot-starter-log';
5
-
6
- autoInit();
7
- const logger = getLogger('server');
8
-
9
- logger.info('Starting API server...');
10
-
4
+ import { config as loadDotenv } from 'dotenv';
5
+ import { existsSync } from 'fs';
11
6
  import { join } from 'path';
12
7
 
13
8
  const projectDir = process.cwd();
9
+ const appEnv = process.env.APP_ENV || 'dev';
10
+ const envFile = join(projectDir, `.env.${appEnv}`);
11
+ if (existsSync(envFile)) {
12
+ loadDotenv({ path: envFile, override: false });
13
+ console.log(`Loaded env file: ${envFile}`);
14
+ } else {
15
+ console.warn(`Env file not found: ${envFile}`);
16
+ }
17
+
14
18
  const srcDir = join(projectDir, 'src'); // Framework scans for controller/service/mapper relative to srcDir
15
19
  const configPath = projectDir; // configPath should point to the directory with node_modules
16
20
  const context = await createApp({ srcDir, configPath, verbose: true });
17
21
 
18
22
  if (!context) {
19
- logger.warn('ApplicationContext not available');
23
+ console.warn('ApplicationContext not available');
20
24
  } else {
21
- logger.info('Security enabled: ' + context.config.get('security.enabled', true));
25
+ console.log('Application context is ready');
22
26
  }
23
27
 
24
28
  const expressApp = await import('@ai-partner-x/aiko-boot-starter-web').then(m => m.getExpressApp());
25
29
 
26
30
  if (!expressApp) {
27
- logger.error('Express app not available');
31
+ console.error('Express app not available');
28
32
  process.exit(1);
29
33
  }
30
34
 
@@ -33,6 +37,6 @@ expressApp.use(express.json());
33
37
  const port = context.config.get('server.port', 3001);
34
38
 
35
39
  expressApp.listen(port, () => {
36
- logger.info('API Server started on port ' + port);
40
+ console.log('API Server started on port ' + port);
37
41
  console.log('📡 API: http://localhost:' + port + '/api');
38
42
  });