alepha 0.19.1 → 0.19.3

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 (531) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +6 -9
  3. package/dist/api/audits/index.d.ts +378 -346
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/files/index.d.ts +216 -184
  6. package/dist/api/files/index.d.ts.map +1 -1
  7. package/dist/api/jobs/index.d.ts +534 -502
  8. package/dist/api/jobs/index.d.ts.map +1 -1
  9. package/dist/api/jobs/index.js +13 -7
  10. package/dist/api/jobs/index.js.map +1 -1
  11. package/dist/api/keys/index.d.ts +202 -202
  12. package/dist/api/keys/index.d.ts.map +1 -1
  13. package/dist/api/notifications/index.d.ts +152 -152
  14. package/dist/api/notifications/index.d.ts.map +1 -1
  15. package/dist/api/organizations/index.browser.js +48 -0
  16. package/dist/api/organizations/index.browser.js.map +1 -0
  17. package/dist/api/organizations/index.d.ts +516 -0
  18. package/dist/api/organizations/index.d.ts.map +1 -0
  19. package/dist/api/organizations/index.js +202 -0
  20. package/dist/api/organizations/index.js.map +1 -0
  21. package/dist/api/parameters/index.d.ts +391 -358
  22. package/dist/api/parameters/index.d.ts.map +1 -1
  23. package/dist/api/parameters/index.js +5 -1
  24. package/dist/api/parameters/index.js.map +1 -1
  25. package/dist/api/users/index.browser.js +7 -5
  26. package/dist/api/users/index.browser.js.map +1 -1
  27. package/dist/api/users/index.d.ts +986 -931
  28. package/dist/api/users/index.d.ts.map +1 -1
  29. package/dist/api/users/index.js +160 -112
  30. package/dist/api/users/index.js.map +1 -1
  31. package/dist/api/verifications/index.d.ts +137 -137
  32. package/dist/api/verifications/index.d.ts.map +1 -1
  33. package/dist/api/verifications/index.js +2 -2
  34. package/dist/api/verifications/index.js.map +1 -1
  35. package/dist/batch/index.d.ts +6 -6
  36. package/dist/batch/index.d.ts.map +1 -1
  37. package/dist/billing/index.d.ts +1048 -0
  38. package/dist/billing/index.d.ts.map +1 -0
  39. package/dist/billing/index.js +713 -0
  40. package/dist/billing/index.js.map +1 -0
  41. package/dist/bin/index.js +0 -2
  42. package/dist/bin/index.js.map +1 -1
  43. package/dist/bucket/index.d.ts +10 -10
  44. package/dist/bucket/index.d.ts.map +1 -1
  45. package/dist/bucket/index.js +2 -2
  46. package/dist/bucket/index.js.map +1 -1
  47. package/dist/cache/core/index.d.ts +9 -9
  48. package/dist/cache/core/index.d.ts.map +1 -1
  49. package/dist/cache/core/index.js +2 -2
  50. package/dist/cache/core/index.js.map +1 -1
  51. package/dist/cache/core/index.workerd.js +2 -2
  52. package/dist/cache/core/index.workerd.js.map +1 -1
  53. package/dist/cache/redis/index.d.ts +6 -6
  54. package/dist/cache/redis/index.d.ts.map +1 -1
  55. package/dist/cache/redis/index.js +2 -2
  56. package/dist/cache/redis/index.js.map +1 -1
  57. package/dist/cli/config/index.d.ts +6 -18
  58. package/dist/cli/config/index.d.ts.map +1 -1
  59. package/dist/cli/config/index.js +5 -6
  60. package/dist/cli/config/index.js.map +1 -1
  61. package/dist/cli/core/index.d.ts +11811 -323
  62. package/dist/cli/core/index.d.ts.map +1 -1
  63. package/dist/cli/core/index.js +324 -98
  64. package/dist/cli/core/index.js.map +1 -1
  65. package/dist/cli/devtools/index.d.ts +50 -0
  66. package/dist/cli/devtools/index.d.ts.map +1 -0
  67. package/dist/cli/devtools/index.js +174 -0
  68. package/dist/cli/devtools/index.js.map +1 -0
  69. package/dist/cli/platform/index.d.ts +438 -542
  70. package/dist/cli/platform/index.d.ts.map +1 -1
  71. package/dist/cli/platform/index.js +46 -511
  72. package/dist/cli/platform/index.js.map +1 -1
  73. package/dist/cli/vendor/index.d.ts +201 -0
  74. package/dist/cli/vendor/index.d.ts.map +1 -0
  75. package/dist/cli/vendor/index.js +388 -0
  76. package/dist/cli/vendor/index.js.map +1 -0
  77. package/dist/command/index.d.ts +18 -18
  78. package/dist/command/index.d.ts.map +1 -1
  79. package/dist/command/index.js +2 -2
  80. package/dist/command/index.js.map +1 -1
  81. package/dist/core/index.browser.js +4 -4
  82. package/dist/core/index.browser.js.map +1 -1
  83. package/dist/core/index.d.ts +10 -10
  84. package/dist/core/index.d.ts.map +1 -1
  85. package/dist/core/index.js +8 -4
  86. package/dist/core/index.js.map +1 -1
  87. package/dist/core/index.native.js +8 -4
  88. package/dist/core/index.native.js.map +1 -1
  89. package/dist/core/index.workerd.js +8 -4
  90. package/dist/core/index.workerd.js.map +1 -1
  91. package/dist/crypto/index.d.ts +7 -7
  92. package/dist/crypto/index.d.ts.map +1 -1
  93. package/dist/datetime/index.d.ts +4 -4
  94. package/dist/datetime/index.d.ts.map +1 -1
  95. package/dist/email/brevo/index.d.ts +4 -4
  96. package/dist/email/brevo/index.d.ts.map +1 -1
  97. package/dist/email/core/index.d.ts +15 -11
  98. package/dist/email/core/index.d.ts.map +1 -1
  99. package/dist/email/core/index.js +12 -35
  100. package/dist/email/core/index.js.map +1 -1
  101. package/dist/email/smtp/index.d.ts +12 -12
  102. package/dist/email/smtp/index.d.ts.map +1 -1
  103. package/dist/email/smtp/index.js +7 -4
  104. package/dist/email/smtp/index.js.map +1 -1
  105. package/dist/fake/index.d.ts +4 -8
  106. package/dist/fake/index.d.ts.map +1 -1
  107. package/dist/fake/index.js +55 -889
  108. package/dist/fake/index.js.map +1 -1
  109. package/dist/lock/core/index.d.ts +13 -13
  110. package/dist/lock/core/index.d.ts.map +1 -1
  111. package/dist/lock/core/index.js +2 -2
  112. package/dist/lock/core/index.js.map +1 -1
  113. package/dist/lock/redis/index.d.ts +4 -4
  114. package/dist/lock/redis/index.d.ts.map +1 -1
  115. package/dist/logger/index.d.ts +16 -15
  116. package/dist/logger/index.d.ts.map +1 -1
  117. package/dist/logger/index.js +6 -3
  118. package/dist/logger/index.js.map +1 -1
  119. package/dist/mcp/index.d.ts +11 -11
  120. package/dist/mcp/index.d.ts.map +1 -1
  121. package/dist/mcp/index.js +2 -2
  122. package/dist/mcp/index.js.map +1 -1
  123. package/dist/orm/core/index.browser.js +11 -1
  124. package/dist/orm/core/index.browser.js.map +1 -1
  125. package/dist/orm/core/index.bun.js +78 -72
  126. package/dist/orm/core/index.bun.js.map +1 -1
  127. package/dist/orm/core/index.d.ts +103 -69
  128. package/dist/orm/core/index.d.ts.map +1 -1
  129. package/dist/orm/core/index.js +80 -70
  130. package/dist/orm/core/index.js.map +1 -1
  131. package/dist/orm/postgres/index.d.ts +19 -17
  132. package/dist/orm/postgres/index.d.ts.map +1 -1
  133. package/dist/queue/core/index.d.ts +14 -14
  134. package/dist/queue/core/index.d.ts.map +1 -1
  135. package/dist/queue/core/index.js +2 -2
  136. package/dist/queue/core/index.js.map +1 -1
  137. package/dist/queue/core/index.workerd.js +2 -2
  138. package/dist/queue/core/index.workerd.js.map +1 -1
  139. package/dist/queue/redis/index.d.ts +4 -4
  140. package/dist/queue/redis/index.d.ts.map +1 -1
  141. package/dist/queue/redis/index.js +2 -2
  142. package/dist/queue/redis/index.js.map +1 -1
  143. package/dist/react/auth/index.d.ts +9 -9
  144. package/dist/react/auth/index.d.ts.map +1 -1
  145. package/dist/react/core/index.d.ts +6 -6
  146. package/dist/react/core/index.d.ts.map +1 -1
  147. package/dist/react/core/index.js +5 -4
  148. package/dist/react/core/index.js.map +1 -1
  149. package/dist/react/form/index.d.ts +4 -4
  150. package/dist/react/form/index.d.ts.map +1 -1
  151. package/dist/react/head/index.d.ts +4 -4
  152. package/dist/react/head/index.d.ts.map +1 -1
  153. package/dist/react/i18n/index.d.ts +9 -9
  154. package/dist/react/i18n/index.d.ts.map +1 -1
  155. package/dist/react/intro/index.d.ts +2 -2
  156. package/dist/react/intro/index.d.ts.map +1 -1
  157. package/dist/react/intro/index.js +1 -1
  158. package/dist/react/intro/index.js.map +1 -1
  159. package/dist/react/router/index.browser.js +4 -5
  160. package/dist/react/router/index.browser.js.map +1 -1
  161. package/dist/react/router/index.d.ts +215 -215
  162. package/dist/react/router/index.d.ts.map +1 -1
  163. package/dist/react/router/index.js +6 -7
  164. package/dist/react/router/index.js.map +1 -1
  165. package/dist/react/testing/index.d.ts +2 -2
  166. package/dist/react/testing/index.d.ts.map +1 -1
  167. package/dist/react/testing/index.js +2 -4
  168. package/dist/react/testing/index.js.map +1 -1
  169. package/dist/redis/index.d.ts +19 -19
  170. package/dist/redis/index.d.ts.map +1 -1
  171. package/dist/retry/index.d.ts +4 -4
  172. package/dist/retry/index.d.ts.map +1 -1
  173. package/dist/scheduler/index.d.ts +13 -13
  174. package/dist/scheduler/index.d.ts.map +1 -1
  175. package/dist/scheduler/index.js +2 -2
  176. package/dist/scheduler/index.js.map +1 -1
  177. package/dist/scheduler/index.workerd.js +2 -2
  178. package/dist/scheduler/index.workerd.js.map +1 -1
  179. package/dist/security/index.browser.js +1 -1
  180. package/dist/security/index.browser.js.map +1 -1
  181. package/dist/security/index.d.ts +47 -47
  182. package/dist/security/index.d.ts.map +1 -1
  183. package/dist/security/index.js +9 -12
  184. package/dist/security/index.js.map +1 -1
  185. package/dist/server/auth/index.d.ts +170 -169
  186. package/dist/server/auth/index.d.ts.map +1 -1
  187. package/dist/server/auth/index.js +16 -2
  188. package/dist/server/auth/index.js.map +1 -1
  189. package/dist/server/cookies/index.d.ts +7 -7
  190. package/dist/server/cookies/index.d.ts.map +1 -1
  191. package/dist/server/core/index.d.ts +76 -76
  192. package/dist/server/core/index.d.ts.map +1 -1
  193. package/dist/server/core/index.js +23 -17
  194. package/dist/server/core/index.js.map +1 -1
  195. package/dist/server/cors/index.d.ts +13 -13
  196. package/dist/server/cors/index.d.ts.map +1 -1
  197. package/dist/server/cors/index.js +2 -2
  198. package/dist/server/cors/index.js.map +1 -1
  199. package/dist/server/etag/index.d.ts +9 -9
  200. package/dist/server/etag/index.d.ts.map +1 -1
  201. package/dist/server/health/index.d.ts +20 -20
  202. package/dist/server/health/index.d.ts.map +1 -1
  203. package/dist/server/links/index.browser.js +2 -2
  204. package/dist/server/links/index.browser.js.map +1 -1
  205. package/dist/server/links/index.d.ts +66 -66
  206. package/dist/server/links/index.d.ts.map +1 -1
  207. package/dist/server/links/index.js +4 -4
  208. package/dist/server/links/index.js.map +1 -1
  209. package/dist/server/metrics/index.d.ts +7 -7
  210. package/dist/server/metrics/index.d.ts.map +1 -1
  211. package/dist/server/proxy/index.d.ts +5 -5
  212. package/dist/server/proxy/index.d.ts.map +1 -1
  213. package/dist/server/rate-limit/index.d.ts +12 -12
  214. package/dist/server/rate-limit/index.d.ts.map +1 -1
  215. package/dist/server/rate-limit/index.js +2 -2
  216. package/dist/server/rate-limit/index.js.map +1 -1
  217. package/dist/server/static/index.d.ts +5 -5
  218. package/dist/server/static/index.d.ts.map +1 -1
  219. package/dist/server/swagger/index.d.ts +7 -7
  220. package/dist/server/swagger/index.d.ts.map +1 -1
  221. package/dist/server/swagger/index.js +2 -2
  222. package/dist/server/swagger/index.js.map +1 -1
  223. package/dist/sms/index.d.ts +11 -7
  224. package/dist/sms/index.d.ts.map +1 -1
  225. package/dist/sms/index.js +9 -15
  226. package/dist/sms/index.js.map +1 -1
  227. package/dist/system/index.d.ts +4 -4
  228. package/dist/system/index.d.ts.map +1 -1
  229. package/dist/topic/core/index.d.ts +6 -6
  230. package/dist/topic/core/index.d.ts.map +1 -1
  231. package/dist/topic/redis/index.d.ts +7 -7
  232. package/dist/topic/redis/index.d.ts.map +1 -1
  233. package/dist/topic/redis/index.js +2 -2
  234. package/dist/topic/redis/index.js.map +1 -1
  235. package/dist/websocket/index.d.ts +36 -36
  236. package/dist/websocket/index.d.ts.map +1 -1
  237. package/dist/websocket/index.js +2 -2
  238. package/dist/websocket/index.js.map +1 -1
  239. package/package.json +37 -15
  240. package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
  241. package/src/api/jobs/providers/JobProvider.ts +13 -9
  242. package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
  243. package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
  244. package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
  245. package/src/api/organizations/entities/organizations.ts +20 -0
  246. package/src/api/organizations/index.browser.ts +10 -0
  247. package/src/api/organizations/index.ts +31 -0
  248. package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
  249. package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
  250. package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
  251. package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
  252. package/src/api/organizations/services/OrganizationService.ts +75 -0
  253. package/src/api/parameters/services/ParameterProvider.ts +6 -1
  254. package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
  255. package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
  256. package/src/api/users/entities/users.ts +9 -3
  257. package/src/api/users/index.ts +23 -4
  258. package/src/api/users/primitives/$realm.ts +6 -4
  259. package/src/api/users/providers/RealmProvider.ts +1 -1
  260. package/src/api/users/services/RegistrationService.ts +1 -1
  261. package/src/api/users/services/SessionService.ts +92 -5
  262. package/src/api/users/services/UserService.ts +1 -1
  263. package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
  264. package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
  265. package/src/billing/__tests__/BillingService.spec.ts +136 -0
  266. package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
  267. package/src/billing/controllers/AdminBillingController.ts +149 -0
  268. package/src/billing/controllers/BillingController.ts +108 -0
  269. package/src/billing/entities/paymentIntents.ts +34 -0
  270. package/src/billing/entities/paymentMethods.ts +24 -0
  271. package/src/billing/entities/refunds.ts +22 -0
  272. package/src/billing/errors/BillingError.ts +5 -0
  273. package/src/billing/index.ts +76 -0
  274. package/src/billing/providers/BillingProvider.ts +79 -0
  275. package/src/billing/providers/MemoryBillingProvider.ts +139 -0
  276. package/src/billing/schemas/intentSchemas.ts +60 -0
  277. package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
  278. package/src/billing/schemas/refundSchemas.ts +6 -0
  279. package/src/billing/services/BillingService.ts +325 -0
  280. package/src/billing/services/PaymentMethodService.ts +82 -0
  281. package/src/bin/index.ts +0 -2
  282. package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
  283. package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
  284. package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
  285. package/src/cache/core/primitives/$cache.ts +2 -2
  286. package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
  287. package/src/cli/config/defineConfig.ts +17 -26
  288. package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
  289. package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
  290. package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
  291. package/src/cli/core/atoms/devOptions.ts +0 -5
  292. package/src/cli/core/commands/build.ts +2 -2
  293. package/src/cli/core/commands/dev.ts +165 -30
  294. package/src/cli/core/commands/gen/changelog.ts +2 -2
  295. package/src/cli/core/commands/init.ts +2 -7
  296. package/src/cli/core/commands/verify.ts +0 -1
  297. package/src/cli/core/providers/AppEntryProvider.ts +2 -2
  298. package/src/cli/core/providers/ViteDevServerProvider.ts +99 -69
  299. package/src/cli/core/services/PackageManagerUtils.ts +8 -1
  300. package/src/cli/core/services/ProjectScaffolder.ts +23 -23
  301. package/src/cli/core/tasks/BuildClientTask.ts +8 -0
  302. package/src/cli/core/tasks/BuildServerTask.ts +17 -4
  303. package/src/cli/core/templates/agentMd.ts +14 -5
  304. package/src/cli/core/templates/alephaConfigTs.ts +0 -6
  305. package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
  306. package/src/cli/core/templates/webAppRouterTs.ts +85 -2
  307. package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
  308. package/src/cli/devtools/index.ts +214 -0
  309. package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
  310. package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
  311. package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
  312. package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
  313. package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
  314. package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
  315. package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
  316. package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
  317. package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
  318. package/src/cli/platform/atoms/platformOptions.ts +2 -10
  319. package/src/cli/platform/commands/SecretsCommand.ts +2 -2
  320. package/src/cli/platform/commands/platform.ts +2 -11
  321. package/src/cli/platform/index.ts +55 -11
  322. package/src/cli/platform/services/PlatformInspector.ts +2 -2
  323. package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
  324. package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
  325. package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
  326. package/src/cli/vendor/commands/VendorCommand.ts +204 -0
  327. package/src/cli/vendor/index.ts +60 -0
  328. package/src/cli/vendor/services/VendorService.ts +338 -0
  329. package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
  330. package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
  331. package/src/command/providers/CliProvider.ts +2 -2
  332. package/src/core/Alepha.ts +10 -0
  333. package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
  334. package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
  335. package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
  336. package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
  337. package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
  338. package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
  339. package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
  340. package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
  341. package/src/core/index.shared.ts +1 -1
  342. package/src/core/primitives/{$use.ts → $state.ts} +4 -4
  343. package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
  344. package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
  345. package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
  346. package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
  347. package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
  348. package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
  349. package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
  350. package/src/email/core/providers/LocalEmailProvider.ts +13 -51
  351. package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
  352. package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
  353. package/src/lock/core/primitives/$lock.ts +2 -2
  354. package/src/logger/index.ts +16 -5
  355. package/src/mcp/transports/SseMcpTransport.ts +2 -2
  356. package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
  357. package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
  358. package/src/orm/__tests__/organization-tests.ts +200 -0
  359. package/src/orm/__tests__/organization.spec.ts +103 -0
  360. package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
  361. package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
  362. package/src/orm/core/index.shared.ts +1 -0
  363. package/src/orm/core/primitives/$entity.ts +31 -0
  364. package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
  365. package/src/orm/core/providers/DrizzleKitProvider.ts +57 -106
  366. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
  367. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
  368. package/src/orm/core/services/ModelBuilder.ts +11 -0
  369. package/src/orm/core/services/QueryManager.ts +16 -2
  370. package/src/orm/core/services/Repository.ts +70 -10
  371. package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
  372. package/src/queue/core/providers/WorkerProvider.ts +2 -2
  373. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
  374. package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
  375. package/src/react/core/hooks/useAction.ts +7 -6
  376. package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
  377. package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
  378. package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
  379. package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
  380. package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
  381. package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
  382. package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
  383. package/src/react/router/providers/ReactPageProvider.ts +2 -2
  384. package/src/react/router/providers/ReactServerProvider.ts +3 -3
  385. package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
  386. package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
  387. package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
  388. package/src/scheduler/primitives/$scheduler.ts +2 -2
  389. package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
  390. package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
  391. package/src/security/primitives/$issuer.ts +1 -1
  392. package/src/security/providers/JwtProvider.ts +6 -10
  393. package/src/security/providers/SecurityProvider.ts +6 -11
  394. package/src/security/schemas/userAccountInfoSchema.ts +3 -3
  395. package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
  396. package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
  397. package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
  398. package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
  399. package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
  400. package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
  401. package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
  402. package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
  403. package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
  404. package/src/server/core/primitives/$action.ts +2 -2
  405. package/src/server/core/primitives/$sse.ts +2 -2
  406. package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
  407. package/src/server/core/providers/ServerCompressProvider.ts +2 -2
  408. package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
  409. package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
  410. package/src/server/core/providers/ServerRouterProvider.ts +1 -5
  411. package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
  412. package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
  413. package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
  414. package/src/server/links/providers/LinkProvider.ts +2 -2
  415. package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
  416. package/src/server/links/providers/ServerLinksProvider.ts +2 -2
  417. package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
  418. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
  419. package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
  420. package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
  421. package/src/sms/providers/LocalSmsProvider.ts +13 -24
  422. package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
  423. package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
  424. package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
  425. package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
  426. package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
  427. package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
  428. package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
  429. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
  430. package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
  431. package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
  432. package/src/cli/platform/services/DockerSshService.ts +0 -61
  433. /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
  434. /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
  435. /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
  436. /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
  437. /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
  438. /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
  439. /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
  440. /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
  441. /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
  442. /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
  443. /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
  444. /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
  445. /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
  446. /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
  447. /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
  448. /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
  449. /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
  450. /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
  451. /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
  452. /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
  453. /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
  454. /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
  455. /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
  456. /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
  457. /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
  458. /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
  459. /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
  460. /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
  461. /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
  462. /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
  463. /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
  464. /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
  465. /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
  466. /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
  467. /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
  468. /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
  469. /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
  470. /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
  471. /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
  472. /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
  473. /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
  474. /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
  475. /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
  476. /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
  477. /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
  478. /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
  479. /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
  480. /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
  481. /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
  482. /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
  483. /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
  484. /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
  485. /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
  486. /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
  487. /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
  488. /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
  489. /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
  490. /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
  491. /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
  492. /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
  493. /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
  494. /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
  495. /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
  496. /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
  497. /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
  498. /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
  499. /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
  500. /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
  501. /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
  502. /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
  503. /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
  504. /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
  505. /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
  506. /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
  507. /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
  508. /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
  509. /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
  510. /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
  511. /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
  512. /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
  513. /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
  514. /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
  515. /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
  516. /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
  517. /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
  518. /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
  519. /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
  520. /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
  521. /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
  522. /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
  523. /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
  524. /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
  525. /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
  526. /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
  527. /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
  528. /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
  529. /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
  530. /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
  531. /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
@@ -1,11 +1,11 @@
1
1
  import { createRequire } from "node:module";
2
- import { $atom, $hook, $inject, $module, $use, Alepha, AlephaError, __alephaRef, t } from "alepha";
2
+ import { $atom, $hook, $inject, $module, $state, Alepha, AlephaError, __alephaRef, t } from "alepha";
3
3
  import { $command, CliProvider, EnvUtils, Runner } from "alepha/command";
4
4
  import { $logger, ConsoleColorProvider } from "alepha/logger";
5
5
  import { FileSystemProvider, ShellProvider } from "alepha/system";
6
6
  import { createHash } from "node:crypto";
7
7
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
8
- import { readFile } from "node:fs/promises";
8
+ import { readFile, readdir, stat } from "node:fs/promises";
9
9
  import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
10
10
  import { fileURLToPath, pathToFileURL } from "node:url";
11
11
  import { analyzer } from "vite-bundle-analyzer";
@@ -13,7 +13,7 @@ import { KV_DEFAULT_BINDING } from "alepha/cache";
13
13
  import { QUEUE_DEFAULT_BINDING } from "alepha/queue";
14
14
  import { promisify } from "node:util";
15
15
  import { brotliCompress, gzip } from "node:zlib";
16
- import { exec } from "node:child_process";
16
+ import { exec, spawn } from "node:child_process";
17
17
  import { ServerSwaggerProvider } from "alepha/server/swagger";
18
18
  //#region ../../src/cli/core/atoms/appEntryOptions.ts
19
19
  const appEntryOptions = $atom({
@@ -89,10 +89,7 @@ const buildOptions = $atom({
89
89
  const devOptions = $atom({
90
90
  name: "alepha.cli.dev.options",
91
91
  description: "Dev configuration options",
92
- schema: t.object({
93
- noDevtools: t.optional(t.boolean({ default: false })),
94
- noViteReactPlugin: t.optional(t.boolean({ default: false }))
95
- }),
92
+ schema: t.object({ noViteReactPlugin: t.optional(t.boolean({ default: false })) }),
96
93
  default: {}
97
94
  });
98
95
  //#endregion
@@ -104,7 +101,7 @@ const devOptions = $atom({
104
101
  */
105
102
  var AppEntryProvider = class {
106
103
  fs = $inject(FileSystemProvider);
107
- options = $use(appEntryOptions);
104
+ options = $state(appEntryOptions);
108
105
  serverEntries = [
109
106
  "main.server.ts",
110
107
  "main.server.tsx",
@@ -589,13 +586,13 @@ var AlephaCliUtils = class {
589
586
  //#endregion
590
587
  //#region ../../package.json
591
588
  var devDependencies = {
592
- "@biomejs/biome": "^2.4.8",
593
- "@electric-sql/pglite": "^0.4.0",
594
- "@faker-js/faker": "^10.3.0",
589
+ "@biomejs/biome": "^2.4.10",
590
+ "@electric-sql/pglite": "^0.4.3",
591
+ "@faker-js/faker": "^10.4.0",
595
592
  "@testing-library/dom": "^10.4.1",
596
593
  "@testing-library/react": "^16.3.2",
597
594
  "@types/bun": "^1.3.11",
598
- "@types/node": "^25.5.0",
595
+ "@types/node": "^25.5.2",
599
596
  "@types/nodemailer": "^7.0.11",
600
597
  "@types/react": "^19.2.14",
601
598
  "@types/react-dom": "^19.2.3",
@@ -603,15 +600,16 @@ var devDependencies = {
603
600
  "cron-schedule": "^6.0.0",
604
601
  "drizzle-kit": "^0.31.10",
605
602
  "jose": "^6.2.2",
606
- "jsdom": "^29.0.0",
607
- "nodemailer": "^8.0.3",
603
+ "jsdom": "^29.0.1",
604
+ "nodemailer": "^8.0.4",
608
605
  "openid-client": "^6.8.2",
609
606
  "prom-client": "^15.1.3",
610
607
  "react": "^19.2.4",
611
608
  "react-dom": "^19.2.4",
612
609
  "swagger-ui-dist": "^5.32.1",
613
- "tsdown": "^0.21.4",
614
- "vitest": "^4.1.0"
610
+ "tsdown": "^0.21.7",
611
+ "vite": "^8.0.3",
612
+ "vitest": "^4.1.2"
615
613
  };
616
614
  const version = JSON.parse(readFileSync(new URL("../../../package.json", import.meta.url), "utf-8")).version;
617
615
  //#endregion
@@ -864,7 +862,8 @@ var PackageManagerUtils = class {
864
862
  generatePackageJsonContent(modes) {
865
863
  const alephaDeps = devDependencies;
866
864
  const dependencies = { alepha: `^${version}` };
867
- const devDependencies$1 = { "drizzle-kit": alephaDeps["drizzle-kit"] };
865
+ const devDependencies$1 = { vite: alephaDeps.vite };
866
+ if (!(modes.react && !modes.ui)) devDependencies$1["drizzle-kit"] = alephaDeps["drizzle-kit"];
868
867
  if (!modes.isPackage) {
869
868
  devDependencies$1["@biomejs/biome"] = alephaDeps["@biomejs/biome"];
870
869
  if (modes.test) devDependencies$1.vitest = alephaDeps.vitest;
@@ -907,8 +906,12 @@ var PackageManagerUtils = class {
907
906
  const cliAssets = { logo: join(join(fileURLToPath(import.meta.url), "../../../.."), "assets/logo.svg") };
908
907
  //#endregion
909
908
  //#region ../../src/cli/core/templates/agentMd.ts
910
- const agentMd = (type) => {
911
- return `${type === "claude" ? `# CLAUDE.md` : `# AGENTS.md`}
909
+ const agentMd = (options) => {
910
+ const header = options.type === "claude" ? `# CLAUDE.md` : `# AGENTS.md`;
911
+ const docs = [`- Framework source: \`node_modules/alepha/src/\``];
912
+ if (options.ui) docs.push(`- UI components: \`node_modules/@alepha/ui/src/\``);
913
+ docs.push(`- Docs: https://alepha.dev/llms.txt`);
914
+ return `${header}
912
915
 
913
916
  This is an **Alepha** project.
914
917
 
@@ -930,9 +933,7 @@ alepha build # Build
930
933
 
931
934
  ## Documentation
932
935
 
933
- - Framework source: \`node_modules/alepha/src/\`
934
- - UI components: \`node_modules/@alepha/ui/src/\`
935
- - Docs: https://alepha.dev/llms.txt
936
+ ${docs.join("\n")}
936
937
  `.trim();
937
938
  };
938
939
  //#endregion
@@ -956,12 +957,6 @@ export default defineConfig({
956
957
  // runtime: "node",
957
958
  // },
958
959
  //
959
- // platform: {
960
- // environments: {
961
- // production: { adapter: "cloudflare" },
962
- // },
963
- // },
964
- //
965
960
  // env: {
966
961
  // VITE_BUILD_DATE: new Date().toISOString(),
967
962
  // VITE_VERSION: pkg.version,
@@ -1275,13 +1270,45 @@ export default defineConfig({
1275
1270
  `;
1276
1271
  };
1277
1272
  //#endregion
1273
+ //#region ../../src/cli/core/templates/webAdminDashboardTsx.ts
1274
+ const webAdminDashboardTsx = () => {
1275
+ return `import { Flex, Text } from "@alepha/ui";
1276
+
1277
+ const AdminDashboard = () => {
1278
+ return (
1279
+ <Flex direction="column" align="center" justify="center" mih="60vh" gap="md">
1280
+ <Text size="xl" fw={600}>
1281
+ Admin Panel
1282
+ </Text>
1283
+ <Text c="dimmed">Welcome to the admin panel.</Text>
1284
+ </Flex>
1285
+ );
1286
+ };
1287
+
1288
+ export default AdminDashboard;
1289
+ `;
1290
+ };
1291
+ //#endregion
1278
1292
  //#region ../../src/cli/core/templates/webAppRouterTs.ts
1279
1293
  const webAppRouterTs = (options) => {
1280
1294
  const imports = [];
1281
1295
  const classMembers = [];
1282
1296
  if (options.ui) imports.push("import { $ui } from \"@alepha/ui\";");
1283
1297
  if (options.auth) imports.push("import { $uiAuth } from \"@alepha/ui/auth\";");
1284
- if (options.admin) imports.push("import { $uiAdmin } from \"@alepha/ui/admin\";");
1298
+ if (options.admin) {
1299
+ imports.push("import { $uiAdmin } from \"@alepha/ui/admin\";");
1300
+ imports.push("import { AdminUserRouter } from \"@alepha/ui/admin-users\";");
1301
+ imports.push("import { AdminSessionRouter } from \"@alepha/ui/admin-sessions\";");
1302
+ imports.push("import { AdminAuditRouter } from \"@alepha/ui/admin-audits\";");
1303
+ imports.push("import { AdminFileRouter } from \"@alepha/ui/admin-files\";");
1304
+ imports.push("import { AdminParameterRouter } from \"@alepha/ui/admin-parameters\";");
1305
+ imports.push("import { AdminJobRouter } from \"@alepha/ui/admin-jobs\";");
1306
+ imports.push("import { AdminApiKeyRouter } from \"@alepha/ui/admin-keys\";");
1307
+ imports.push("import { AdminNotificationRouter } from \"@alepha/ui/admin-notifications\";");
1308
+ imports.push("import { AdminBillingRouter } from \"@alepha/ui/admin-billing\";");
1309
+ imports.push("import { $inject } from \"alepha\";");
1310
+ imports.push("import { IconLayoutDashboard, IconLockPassword, IconCreditCard } from \"@tabler/icons-react\";");
1311
+ }
1285
1312
  imports.push("import { $page } from \"alepha/react/router\";");
1286
1313
  if (options.api) {
1287
1314
  imports.push("import { $client } from \"alepha/server/links\";");
@@ -1291,7 +1318,69 @@ const webAppRouterTs = (options) => {
1291
1318
  if (options.ui) {
1292
1319
  classMembers.push(" ui = $ui();");
1293
1320
  if (options.auth) classMembers.push(" uiAuth = $uiAuth();");
1294
- if (options.admin) classMembers.push(" uiAdmin = $uiAdmin();");
1321
+ if (options.admin) classMembers.push(` // ── Admin Domain Routers ──────────────────────────
1322
+ protected users = $inject(AdminUserRouter);
1323
+ protected sessions = $inject(AdminSessionRouter);
1324
+ protected audits = $inject(AdminAuditRouter);
1325
+ protected files = $inject(AdminFileRouter);
1326
+ protected parameters = $inject(AdminParameterRouter);
1327
+ protected jobs = $inject(AdminJobRouter);
1328
+ protected apiKeys = $inject(AdminApiKeyRouter);
1329
+ protected notifications = $inject(AdminNotificationRouter);
1330
+ protected billing = $inject(AdminBillingRouter);
1331
+
1332
+ // ── Admin Panel ─────────────────────────────────
1333
+ admin = $uiAdmin({
1334
+ pages: [
1335
+ this.users.adminUsers,
1336
+ this.sessions.adminSessions,
1337
+ this.audits.adminAudits,
1338
+ this.files.adminFiles,
1339
+ this.parameters.adminParameters,
1340
+ this.jobs.adminJobs,
1341
+ this.apiKeys.adminApiKeys,
1342
+ this.notifications.adminNotifications,
1343
+ this.billing.adminBilling,
1344
+ ],
1345
+ sidebarItems: [
1346
+ {
1347
+ label: "Security",
1348
+ children: [
1349
+ { label: "Identity", icon: IconLockPassword, children: [
1350
+ this.users.adminUsers,
1351
+ this.sessions.adminSessions,
1352
+ this.apiKeys.adminApiKeys,
1353
+ ]},
1354
+ this.audits.adminAudits,
1355
+ ],
1356
+ },
1357
+ {
1358
+ label: "System",
1359
+ children: [
1360
+ this.files.adminFiles,
1361
+ this.jobs.adminJobs,
1362
+ this.notifications.adminNotifications,
1363
+ this.parameters.adminParameters,
1364
+ ],
1365
+ },
1366
+ {
1367
+ label: "Commerce",
1368
+ icon: IconCreditCard,
1369
+ children: [
1370
+ this.billing.adminBilling,
1371
+ ],
1372
+ },
1373
+ ],
1374
+ });
1375
+
1376
+ // ── Admin Dashboard ─────────────────────────────
1377
+ adminDashboard = $page({
1378
+ parent: this.admin.adminLayout,
1379
+ path: "/",
1380
+ label: "Dashboard",
1381
+ icon: IconLayoutDashboard,
1382
+ lazy: () => import("./components/AdminDashboard.tsx"),
1383
+ });`);
1295
1384
  classMembers.push(` layout = $page({
1296
1385
  parent: this.ui.root,
1297
1386
  children: () => [this.home],
@@ -1432,7 +1521,7 @@ var ProjectScaffolder = class {
1432
1521
  }
1433
1522
  async ensureAgentMd(root, options) {
1434
1523
  const filename = options.type === "claude" ? "CLAUDE.md" : "AGENTS.md";
1435
- await this.ensureFile(root, filename, agentMd(options.type), options.force);
1524
+ await this.ensureFile(root, filename, agentMd(options), options.force);
1436
1525
  }
1437
1526
  /**
1438
1527
  * Ensure alepha.config.ts exists with documented options.
@@ -1497,6 +1586,7 @@ var ProjectScaffolder = class {
1497
1586
  admin: opts.admin
1498
1587
  }), opts.force);
1499
1588
  await this.ensureFile(root, "src/web/components/Home.tsx", webHomeComponentTsx({ api: opts.api }), opts.force);
1589
+ if (opts.admin) await this.ensureFile(root, "src/web/components/AdminDashboard.tsx", webAdminDashboardTsx(), opts.force);
1500
1590
  await this.ensureFile(root, "src/main.browser.ts", mainBrowserTs(), opts.force);
1501
1591
  }
1502
1592
  /**
@@ -1520,21 +1610,20 @@ var ProjectScaffolder = class {
1520
1610
  root = this.fs.join(root, args);
1521
1611
  await this.fs.mkdir(root, { force: true });
1522
1612
  }
1523
- if (flags.admin) flags.auth = true;
1524
- if (flags.auth) {
1613
+ if (flags.saas) {
1525
1614
  flags.api = true;
1526
1615
  flags.ui = true;
1527
1616
  }
1528
1617
  if (flags.ui) flags.react = true;
1529
1618
  if (flags.tailwind) flags.react = true;
1530
- if ((flags.admin || flags.auth || flags.api || flags.ui || flags.react || flags.tailwind) && !flags.force) {
1619
+ if ((flags.saas || flags.api || flags.ui || flags.react || flags.tailwind) && !flags.force) {
1531
1620
  if ((await this.fs.ls(root)).filter((f) => f !== "package.json").length > 0) throw new AlephaError(`Target directory is not empty (${root}). Use --force to overwrite existing files.`);
1532
1621
  }
1533
1622
  const workspace = await this.pm.getWorkspaceContext(root);
1534
1623
  let agentType = false;
1535
1624
  if (!workspace.isPackage) agentType = await this.utils.isInstalledAsync("claude") ? "claude" : "agents";
1536
1625
  const isExpo = await this.pm.hasExpo(root);
1537
- const adminEmail = flags.auth ? await this.utils.getGitEmail() : void 0;
1626
+ const adminEmail = flags.saas ? await this.utils.getGitEmail() : void 0;
1538
1627
  const force = !!flags.force;
1539
1628
  await run({
1540
1629
  name: "ensuring configuration files",
@@ -1548,7 +1637,10 @@ var ProjectScaffolder = class {
1548
1637
  tsconfigJson: !workspace.config.tsconfigJson,
1549
1638
  biomeJson: true,
1550
1639
  editorconfig: !workspace.config.editorconfig,
1551
- agentMd: agentType ? { type: agentType } : false
1640
+ agentMd: agentType ? {
1641
+ type: agentType,
1642
+ ui: !!flags.ui
1643
+ } : false
1552
1644
  });
1553
1645
  await this.ensureAlephaConfig(root, { force });
1554
1646
  await this.ensureMainServerTs(root, {
@@ -1557,15 +1649,15 @@ var ProjectScaffolder = class {
1557
1649
  force
1558
1650
  });
1559
1651
  if (flags.api) await this.ensureApiProject(root, {
1560
- auth: !!flags.auth,
1652
+ auth: !!flags.saas,
1561
1653
  adminEmail,
1562
1654
  force
1563
1655
  });
1564
1656
  if (flags.react && !isExpo) await this.ensureWebProject(root, {
1565
1657
  api: !!flags.api,
1566
1658
  ui: !!flags.ui,
1567
- auth: !!flags.auth,
1568
- admin: !!flags.admin,
1659
+ auth: !!flags.saas,
1660
+ admin: !!flags.saas,
1569
1661
  tailwind: !!flags.tailwind,
1570
1662
  force
1571
1663
  });
@@ -1722,6 +1814,12 @@ var BuildClientTask = class extends BuildTask {
1722
1814
  mode: "production",
1723
1815
  logLevel: opts.silent ? "silent" : void 0,
1724
1816
  define: { "process.env.NODE_ENV": "\"production\"" },
1817
+ resolve: { dedupe: [
1818
+ "react",
1819
+ "react-dom",
1820
+ "react/jsx-runtime",
1821
+ "react/jsx-dev-runtime"
1822
+ ] },
1725
1823
  publicDir: "public",
1726
1824
  build: {
1727
1825
  outDir: opts.dist,
@@ -2193,6 +2291,7 @@ var BuildServerTask = class extends BuildTask {
2193
2291
  name: "build server",
2194
2292
  handler: async () => {
2195
2293
  await this.buildServer({
2294
+ root: ctx.root,
2196
2295
  entry: ctx.entry.server,
2197
2296
  distDir,
2198
2297
  clientDir: clientBuilt ? publicDir : void 0,
@@ -2225,6 +2324,12 @@ var BuildServerTask = class extends BuildTask {
2225
2324
  mode: "production",
2226
2325
  logLevel: opts.silent ? "silent" : void 0,
2227
2326
  define: { "process.env.NODE_ENV": "\"production\"" },
2327
+ resolve: { dedupe: [
2328
+ "react",
2329
+ "react-dom",
2330
+ "react/jsx-runtime",
2331
+ "react/jsx-dev-runtime"
2332
+ ] },
2228
2333
  publicDir: false,
2229
2334
  ssr: {
2230
2335
  noExternal: true,
@@ -2267,7 +2372,7 @@ var BuildServerTask = class extends BuildTask {
2267
2372
  const externals = [];
2268
2373
  if (Array.isArray(resolvedConfig?.ssr?.external)) externals.push(...resolvedConfig.ssr.external);
2269
2374
  await this.generateExternals(opts.distDir, externals);
2270
- const entryFile = this.extractEntryFromBundle(opts.entry, result);
2375
+ const entryFile = this.extractEntryFromBundle(opts.root, opts.entry, result);
2271
2376
  let manifest = "";
2272
2377
  let manifestData;
2273
2378
  if (opts.clientDir) {
@@ -2340,8 +2445,8 @@ var BuildServerTask = class extends BuildTask {
2340
2445
  };
2341
2446
  return stripped;
2342
2447
  }
2343
- extractEntryFromBundle(entry, result) {
2344
- const entryFilePath = isAbsolute(entry) ? entry : join(process.cwd(), entry);
2448
+ extractEntryFromBundle(root, entry, result) {
2449
+ const entryFilePath = isAbsolute(entry) ? entry : join(root, entry);
2345
2450
  const normalizedEntryPath = entryFilePath.replace(/\\/g, "/");
2346
2451
  const entryFile = (Array.isArray(result) ? result[0] : result).output.find((it) => "facadeModuleId" in it && it.facadeModuleId === normalizedEntryPath)?.fileName;
2347
2452
  if (!entryFile) throw new AlephaError(`Could not find the entry file "${entryFilePath}" in the build output. Please check your entry file and try again.`);
@@ -2608,7 +2713,7 @@ var BuildCommand = class {
2608
2713
  scaffolder = $inject(ProjectScaffolder);
2609
2714
  boot = $inject(AppEntryProvider);
2610
2715
  viteBuildProvider = $inject(ViteBuildProvider);
2611
- options = $use(buildOptions);
2716
+ options = $state(buildOptions);
2612
2717
  /**
2613
2718
  * Build pipeline: tasks run sequentially in this order.
2614
2719
  * Each task self-guards (checks target, hasClient, etc.).
@@ -3114,7 +3219,30 @@ var ViteDevServerProvider = class {
3114
3219
  isReloading = false;
3115
3220
  needsBrowserReload = false;
3116
3221
  currentReloadPromise = null;
3117
- devtoolsAssetsPath;
3222
+ extraVitePlugins = [];
3223
+ alephaLoadedHooks = [];
3224
+ /**
3225
+ * Register an additional Vite plugin.
3226
+ * Must be called before init().
3227
+ */
3228
+ addVitePlugin(plugin) {
3229
+ this.extraVitePlugins.push(plugin);
3230
+ }
3231
+ /**
3232
+ * Register a hook called after Alepha is loaded/reloaded.
3233
+ */
3234
+ onAlephaLoaded(hook) {
3235
+ this.alephaLoadedHooks.push(hook);
3236
+ }
3237
+ /**
3238
+ * Trigger a full Alepha reload programmatically.
3239
+ */
3240
+ reload() {
3241
+ this.hasError = true;
3242
+ this.needsBrowserReload = true;
3243
+ this.changedFiles.add("__manual_reload__");
3244
+ this.scheduleReload();
3245
+ }
3118
3246
  /**
3119
3247
  * Initialize the dev server and load Alepha.
3120
3248
  */
@@ -3138,10 +3266,8 @@ var ViteDevServerProvider = class {
3138
3266
  try {
3139
3267
  await this.alepha?.start();
3140
3268
  await this.listen();
3141
- console.log("");
3142
- this.server.printUrls();
3143
- this.server.bindCLIShortcuts({ print: true });
3144
- console.log("");
3269
+ const url = `http://localhost:${this.server.config.server.port ?? 5173}/`;
3270
+ (this.alepha?.log ?? this.log).info(`Listening on ${this.colors.set("CYAN", url)}`);
3145
3271
  } catch (err) {
3146
3272
  this.hasError = true;
3147
3273
  this.currentError = err instanceof Error ? err : new Error(String(err));
@@ -3173,6 +3299,7 @@ var ViteDevServerProvider = class {
3173
3299
  if (viteReact && !this.options.noViteReactPlugin) plugins.push(viteReact());
3174
3300
  plugins.push(this.viteUtils.createTsconfigPathsPlugin());
3175
3301
  plugins.push(this.viteUtils.createSsrPreloadPlugin());
3302
+ plugins.push(...this.extraVitePlugins);
3176
3303
  plugins.push(this.createAlephaPlugin());
3177
3304
  let port;
3178
3305
  if (process.env.SERVER_PORT) port = Number(process.env.SERVER_PORT);
@@ -3184,6 +3311,12 @@ var ViteDevServerProvider = class {
3184
3311
  root: this.options.root,
3185
3312
  plugins,
3186
3313
  appType: "custom",
3314
+ resolve: { dedupe: [
3315
+ "react",
3316
+ "react-dom",
3317
+ "react/jsx-runtime",
3318
+ "react/jsx-dev-runtime"
3319
+ ] },
3187
3320
  server: { port },
3188
3321
  optimizeDeps: { entries: [...this.options.entry.browser ? [this.options.entry.browser] : []] }
3189
3322
  });
@@ -3230,31 +3363,23 @@ var ViteDevServerProvider = class {
3230
3363
  return {
3231
3364
  name: "alepha",
3232
3365
  configureServer: (server) => {
3233
- if (!this.options.noDevtools) try {
3234
- this.devtoolsAssetsPath = join(dirname(createRequire(import.meta.url).resolve("@alepha/devtools/package.json")), "assets/ui");
3235
- process.env.VITE_ALEPHA_DEVTOOLS = "true";
3236
- } catch {
3237
- this.log.debug("@alepha/devtools not installed, skipping devtools");
3238
- }
3239
- if (this.devtoolsAssetsPath) {
3240
- const assetsPath = this.devtoolsAssetsPath;
3241
- server.middlewares.use(async (req, res, next) => {
3242
- if (!(req.url || "/").startsWith("/__devtools") || !req.headers.accept?.includes("text/html")) return next();
3243
- const indexPath = join(assetsPath, "index.html");
3244
- try {
3245
- let html = await readFile(indexPath, "utf-8");
3246
- html = html.replace("<head>", `<head><script type="module" src="/@vite/client"><\/script>`);
3247
- res.writeHead(200, { "content-type": "text/html" });
3248
- res.end(html);
3249
- } catch (err) {
3250
- this.log.error("Failed to serve devtools UI", err);
3251
- next();
3252
- }
3253
- });
3254
- }
3255
3366
  server.hot.on("connection", () => {
3256
3367
  if (this.currentError) setTimeout(() => this.sendErrorOverlay(this.currentError), 50);
3257
3368
  });
3369
+ server.middlewares.use(async (req, res, next) => {
3370
+ if (req.url !== "/__alepha/ready") {
3371
+ next();
3372
+ return;
3373
+ }
3374
+ if (this.currentReloadPromise) await this.currentReloadPromise;
3375
+ if (this.alepha?.isReady()) {
3376
+ res.writeHead(200, { "content-type": "text/plain" });
3377
+ res.end("ok");
3378
+ } else {
3379
+ res.writeHead(503, { "content-type": "text/plain" });
3380
+ res.end("not ready");
3381
+ }
3382
+ });
3258
3383
  return () => {
3259
3384
  server.middlewares.use(async (req, res, next) => {
3260
3385
  const url = req.url || "/";
@@ -3262,6 +3387,7 @@ var ViteDevServerProvider = class {
3262
3387
  next();
3263
3388
  return;
3264
3389
  }
3390
+ if (this.currentReloadPromise) await this.currentReloadPromise;
3265
3391
  if (this.hasError && !this.alepha) {
3266
3392
  if (req.headers.accept?.includes("text/html")) {
3267
3393
  res.writeHead(200, { "content-type": "text/html" });
@@ -3310,9 +3436,10 @@ var ViteDevServerProvider = class {
3310
3436
  }
3311
3437
  /**
3312
3438
  * Send full browser reload via Vite's HMR.
3439
+ * Uses a custom event so the client can poll for readiness before reloading.
3313
3440
  */
3314
3441
  sendBrowserReload() {
3315
- this.server.hot.send({ type: "full-reload" });
3442
+ this.server.hot.send("alepha:reload", {});
3316
3443
  }
3317
3444
  /**
3318
3445
  * Send error to Vite's native error overlay.
@@ -3401,12 +3528,7 @@ var ViteDevServerProvider = class {
3401
3528
  }
3402
3529
  const alepha = this.getLoadedAlepha();
3403
3530
  alepha.store.set("alepha.vite.server", this.server);
3404
- if (this.devtoolsAssetsPath) try {
3405
- const mod = await this.server.ssrLoadModule("@alepha/devtools");
3406
- alepha.with(mod.AlephaDevtools);
3407
- } catch (err) {
3408
- this.log.warn("Failed to load @alepha/devtools", err);
3409
- }
3531
+ for (const hook of this.alephaLoadedHooks) await hook(alepha, this.server);
3410
3532
  this.alepha = alepha;
3411
3533
  await this.setupAlepha();
3412
3534
  this.hasError = false;
@@ -3459,6 +3581,20 @@ var ViteDevServerProvider = class {
3459
3581
  const preamble = (await this.server.transformIndexHtml("/", "<!DOCTYPE html><html><head></head><body></body></html>")).match(/<head>([\s\S]*?)<\/head>/i)?.[1]?.trim() ?? "";
3460
3582
  const tags = [];
3461
3583
  if (preamble) tags.push(preamble);
3584
+ tags.push(`<script type="module">
3585
+ if (import.meta.hot) {
3586
+ import.meta.hot.on("alepha:reload", async () => {
3587
+ for (let i = 0; i < 50; i++) {
3588
+ try {
3589
+ const res = await fetch("/__alepha/ready");
3590
+ if (res.ok) { window.location.reload(); return; }
3591
+ } catch {}
3592
+ await new Promise(r => setTimeout(r, 200));
3593
+ }
3594
+ window.location.reload();
3595
+ });
3596
+ }
3597
+ <\/script>`);
3462
3598
  if (style) tags.push(`<link rel="stylesheet" href="/${style}">`);
3463
3599
  if (browser) tags.push(`<script type="module" src="/${browser}"><\/script>`);
3464
3600
  return tags.join("\n");
@@ -3563,10 +3699,12 @@ var ViteDevServerProvider = class {
3563
3699
  /**
3564
3700
  * Log a formatted error with stack trace.
3565
3701
  */
3566
- logError(title, _err) {
3702
+ logError(title, err) {
3567
3703
  const c = this.colors;
3568
3704
  console.log();
3569
3705
  console.log(c.set("RED", ` ✗ ${title}`));
3706
+ this.logErrorWithCause(err);
3707
+ console.log();
3570
3708
  console.log(c.set("GREY_DARK", " Waiting for file changes to retry..."));
3571
3709
  console.log();
3572
3710
  }
@@ -3601,32 +3739,122 @@ var DevCommand = class {
3601
3739
  alepha = $inject(Alepha);
3602
3740
  viteDevServer = $inject(ViteDevServerProvider);
3603
3741
  boot = $inject(AppEntryProvider);
3604
- options = $use(devOptions);
3742
+ options = $state(devOptions);
3605
3743
  /**
3606
3744
  * Will run the project in watch mode.
3745
+ *
3746
+ * When run from a workspace root (with apps/ directory), spawns all apps in parallel.
3747
+ * When run from an app directory, starts a single Vite dev server.
3607
3748
  */
3608
3749
  dev = $command({
3609
3750
  name: "dev",
3610
3751
  mode: true,
3611
3752
  description: "Run the project in development mode",
3612
- flags: t.object({
3613
- "no-devtools": t.optional(t.boolean({ description: "Disable devtools" })),
3614
- "no-vite-react-plugin": t.optional(t.boolean({ description: "Disable Vite React plugin" }))
3615
- }),
3753
+ flags: t.object({ only: t.optional(t.string({ description: "Run only specific apps (comma-separated: --only api,companion)" })) }),
3616
3754
  handler: async ({ root, flags }) => {
3617
- await this.scaffolder.ensureConfig(root, { tsconfigJson: true });
3618
- const entry = await this.boot.getAppEntry(root);
3619
- this.log.debug("Entry file found", { entry });
3620
- const options = this.options;
3621
- await this.viteDevServer.init({
3622
- root,
3623
- entry,
3624
- noDevtools: flags["no-devtools"] ?? options.noDevtools ?? false,
3625
- noViteReactPlugin: flags["no-vite-react-plugin"] ?? options.noViteReactPlugin ?? false
3626
- });
3627
- await this.viteDevServer.start();
3755
+ const apps = await this.discoverApps(root);
3756
+ if (apps.length > 0) await this.runMultiple(root, apps, flags);
3757
+ else await this.runSingle(root);
3628
3758
  }
3629
3759
  });
3760
+ /**
3761
+ * Discover apps in the workspace root.
3762
+ *
3763
+ * Looks for directories under apps/ that contain a package.json.
3764
+ * Supports scoped directories (e.g., apps/@passeo/api).
3765
+ * Returns empty array if not in a workspace root.
3766
+ */
3767
+ async discoverApps(root) {
3768
+ const appsDir = join(root, "apps");
3769
+ if (!await this.fs.exists(appsDir)) return [];
3770
+ const entries = await readdir(appsDir);
3771
+ const apps = [];
3772
+ for (const entry of entries) {
3773
+ const appPath = join(appsDir, entry);
3774
+ const pkgPath = join(appPath, "package.json");
3775
+ if (await this.fs.exists(pkgPath)) {
3776
+ apps.push({
3777
+ name: entry,
3778
+ path: appPath
3779
+ });
3780
+ continue;
3781
+ }
3782
+ if ((await stat(appPath).catch(() => null))?.isDirectory()) {
3783
+ const scopedEntries = await readdir(appPath);
3784
+ for (const scopedEntry of scopedEntries) {
3785
+ const scopedPath = join(appPath, scopedEntry);
3786
+ const scopedPkgPath = join(scopedPath, "package.json");
3787
+ if (await this.fs.exists(scopedPkgPath)) apps.push({
3788
+ name: scopedEntry,
3789
+ path: scopedPath
3790
+ });
3791
+ }
3792
+ }
3793
+ }
3794
+ return apps;
3795
+ }
3796
+ /**
3797
+ * Run a single app (existing behavior).
3798
+ */
3799
+ async runSingle(root) {
3800
+ await this.scaffolder.ensureConfig(root, { tsconfigJson: true });
3801
+ const entry = await this.boot.getAppEntry(root);
3802
+ this.log.debug("Entry file found", { entry });
3803
+ const options = this.options;
3804
+ await this.viteDevServer.init({
3805
+ root,
3806
+ entry,
3807
+ noViteReactPlugin: options.noViteReactPlugin ?? false
3808
+ });
3809
+ await this.viteDevServer.start();
3810
+ }
3811
+ /**
3812
+ * Run multiple apps in parallel with colored prefixed output.
3813
+ */
3814
+ async runMultiple(_root, apps, flags) {
3815
+ const only = flags.only;
3816
+ if (only) {
3817
+ const filter = only.split(",").map((s) => s.trim().toLowerCase());
3818
+ apps = apps.filter((app) => filter.includes(app.name.toLowerCase()));
3819
+ }
3820
+ if (apps.length === 0) {
3821
+ this.log.warn("No apps found to run");
3822
+ return;
3823
+ }
3824
+ this.log.debug(`Starting ${apps.length} apps: ${apps.map((a) => a.name).join(", ")}`);
3825
+ const basePort = 5173;
3826
+ const processes = apps.map((app, i) => this.spawnApp(app, basePort + i));
3827
+ const cleanup = () => {
3828
+ for (const proc of processes) proc.kill("SIGTERM");
3829
+ };
3830
+ process.once("SIGINT", cleanup);
3831
+ process.once("SIGTERM", cleanup);
3832
+ await Promise.allSettled(processes.map((proc) => new Promise((resolve) => {
3833
+ proc.on("exit", () => resolve());
3834
+ })));
3835
+ }
3836
+ /**
3837
+ * Spawn a single app process with inherited stdio.
3838
+ *
3839
+ * Each child process gets APP_NAME set, so the Alepha logger
3840
+ * handles prefixing automatically.
3841
+ */
3842
+ spawnApp(app, port) {
3843
+ const proc = spawn("yarn", ["alepha", "dev"], {
3844
+ cwd: app.path,
3845
+ stdio: "inherit",
3846
+ env: {
3847
+ ...process.env,
3848
+ APP_NAME: app.name.toUpperCase(),
3849
+ SERVER_PORT: String(port),
3850
+ FORCE_COLOR: "1"
3851
+ }
3852
+ });
3853
+ proc.on("exit", (code) => {
3854
+ if (code !== 0 && code !== null) this.log.error(`${app.name} exited with code ${code}`);
3855
+ });
3856
+ return proc;
3857
+ }
3630
3858
  };
3631
3859
  //#endregion
3632
3860
  //#region ../../src/cli/core/atoms/changelogOptions.ts
@@ -3737,7 +3965,7 @@ var ChangelogCommand = class {
3737
3965
  log = $logger();
3738
3966
  git = $inject(GitProvider);
3739
3967
  parser = $inject(GitMessageParser);
3740
- config = $use(changelogOptions);
3968
+ config = $state(changelogOptions);
3741
3969
  /**
3742
3970
  * Format a single commit line.
3743
3971
  * Example: `- **cli**: add new command (\`abc1234\`)`
@@ -3967,8 +4195,7 @@ var InitCommand = class {
3967
4195
  description: "Include React dependencies and web module (src/web/)"
3968
4196
  })),
3969
4197
  ui: t.optional(t.boolean({ description: "Include @alepha/ui (components, auth portal, admin portal)" })),
3970
- auth: t.optional(t.boolean({ description: "Include authentication (AppSecurity, $uiAuth). Implies --api --ui --react" })),
3971
- admin: t.optional(t.boolean({ description: "Include admin portal ($uiAdmin). Implies --auth" })),
4198
+ saas: t.optional(t.boolean({ description: "Include authentication, admin portal, API, UI, and React. Everything you need for a SaaS app." })),
3972
4199
  tailwind: t.optional(t.boolean({ description: "Include Tailwind CSS with Vite plugin. Implies --react" })),
3973
4200
  test: t.optional(t.boolean({ description: "Include Vitest and create test directory" })),
3974
4201
  force: t.optional(t.boolean({
@@ -4109,7 +4336,6 @@ var VerifyCommand = class {
4109
4336
  description: "Verify the Alepha project",
4110
4337
  handler: async ({ root, run }) => {
4111
4338
  await run("alepha clean");
4112
- await run("alepha format");
4113
4339
  await run("alepha lint");
4114
4340
  await run("alepha typecheck");
4115
4341
  if ((await this.pm.readPackageJson(root)).devDependencies?.vitest) await run("alepha test");