@podosoft/podokit 0.17.3 → 1.0.1

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 (683) hide show
  1. package/README.md +70 -114
  2. package/dist/add.d.ts +3 -2
  3. package/dist/add.js +18 -8
  4. package/dist/assemble.d.ts +2 -0
  5. package/dist/assemble.js +18 -5
  6. package/dist/create.d.ts +8 -4
  7. package/dist/create.js +16 -6
  8. package/dist/deploy-compose-profile.js +1 -0
  9. package/dist/deploy-compose-render.d.ts +1 -1
  10. package/dist/deploy-compose-render.js +6 -3
  11. package/dist/deploy-compose-sync.d.ts +10 -14
  12. package/dist/deploy-compose-sync.js +21 -22
  13. package/dist/deploy-compose.js +4 -1
  14. package/dist/deploy-profile.d.ts +1 -0
  15. package/dist/deploy-profile.js +9 -1
  16. package/dist/deploy-render.js +23 -8
  17. package/dist/deploy-schema.js +6 -1
  18. package/dist/dev.d.ts +1 -0
  19. package/dist/dev.js +63 -14
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.js +15 -9
  22. package/dist/inspect.d.ts +3 -1
  23. package/dist/inspect.js +6 -4
  24. package/dist/lockfile.d.ts +8 -3
  25. package/dist/lockfile.js +18 -4
  26. package/dist/prompt.d.ts +5 -12
  27. package/dist/prompt.js +5 -22
  28. package/dist/remove.js +10 -5
  29. package/dist/templates/base/AGENTS.md +8 -6
  30. package/dist/templates/base/README.md +2 -2
  31. package/dist/templates/base/apps/api/src/main.ts +1 -1
  32. package/dist/templates/base/bunfig.toml +3 -0
  33. package/dist/templates/base/package.json +5 -4
  34. package/dist/templates/{fullstack-nest-svelte → fullstack}/AGENTS.md +19 -12
  35. package/dist/templates/fullstack/Dockerfile.dev +31 -0
  36. package/dist/templates/{fullstack-nest-svelte → fullstack}/README.md +35 -18
  37. package/dist/templates/fullstack/apps/api/Dockerfile +47 -0
  38. package/dist/templates/fullstack/apps/api/package.json +35 -0
  39. package/dist/templates/fullstack/apps/api/scripts/build.mjs +38 -0
  40. package/dist/templates/fullstack/apps/api/scripts/verify-api-contract.ts +37 -0
  41. package/dist/templates/fullstack/apps/api/src/app.extensions.ts +10 -0
  42. package/dist/templates/fullstack/apps/api/src/app.ts +162 -0
  43. package/dist/templates/{todo → fullstack}/apps/api/src/config/redis.connection.spec.ts +20 -2
  44. package/dist/templates/{todo → fullstack}/apps/api/src/config/redis.connection.ts +16 -0
  45. package/dist/templates/fullstack/apps/api/src/core/api-contract.spec.ts +59 -0
  46. package/dist/templates/fullstack/apps/api/src/core/api-contract.ts +169 -0
  47. package/dist/templates/fullstack/apps/api/src/core/services.spec.ts +90 -0
  48. package/dist/templates/fullstack/apps/api/src/core/services.ts +208 -0
  49. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/src/database/data-source.ts +8 -3
  50. package/dist/templates/fullstack/apps/api/src/database/database.ts +25 -0
  51. package/dist/templates/fullstack/apps/api/src/health/health.plugin.ts +28 -0
  52. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/src/health/readiness.service.spec.ts +1 -1
  53. package/dist/templates/{todo → fullstack}/apps/api/src/health/readiness.service.ts +0 -3
  54. package/dist/templates/fullstack/apps/api/src/main.ts +30 -0
  55. package/dist/templates/{todo → fullstack}/apps/api/tsconfig.json +1 -2
  56. package/dist/templates/fullstack/apps/web/Dockerfile +41 -0
  57. package/dist/templates/{todo → fullstack}/apps/web/components.json +3 -3
  58. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/package.json +13 -10
  59. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/app.html +0 -1
  60. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/alert/alert-action.svelte +1 -1
  61. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/alert/alert-description.svelte +1 -1
  62. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/alert/alert-title.svelte +1 -1
  63. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/alert/alert.svelte +1 -1
  64. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar-badge.svelte +1 -1
  65. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar-fallback.svelte +1 -1
  66. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar-group-count.svelte +1 -1
  67. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar-group.svelte +1 -1
  68. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar-image.svelte +1 -1
  69. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar.svelte +1 -1
  70. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/badge/badge.svelte +1 -1
  71. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/button/button.svelte +1 -1
  72. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/card/card-action.svelte +1 -1
  73. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/card/card-content.svelte +1 -1
  74. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/card/card-description.svelte +1 -1
  75. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/card/card-footer.svelte +1 -1
  76. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/card/card-header.svelte +1 -1
  77. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/card/card-title.svelte +1 -1
  78. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/card/card.svelte +1 -1
  79. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/checkbox/checkbox.svelte +1 -1
  80. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-content.svelte +2 -2
  81. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-description.svelte +1 -1
  82. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-footer.svelte +2 -2
  83. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-header.svelte +1 -1
  84. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-overlay.svelte +1 -1
  85. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-title.svelte +1 -1
  86. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -1
  87. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
  88. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +1 -1
  89. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
  90. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte +1 -1
  91. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  92. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte +1 -1
  93. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
  94. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  95. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  96. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/input/input.svelte +1 -1
  97. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/label/label.svelte +1 -1
  98. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-content.svelte +2 -2
  99. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/select/select-group-heading.svelte +1 -1
  100. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-group.svelte +1 -1
  101. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-item.svelte +1 -1
  102. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/select/select-label.svelte +1 -1
  103. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-scroll-down-button.svelte +1 -1
  104. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-scroll-up-button.svelte +1 -1
  105. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-separator.svelte +2 -2
  106. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/select/select-trigger.svelte +1 -1
  107. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/separator/separator.svelte +1 -1
  108. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/skeleton/skeleton.svelte +1 -1
  109. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/switch/switch.svelte +1 -1
  110. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-body.svelte +1 -1
  111. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-caption.svelte +1 -1
  112. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-cell.svelte +1 -1
  113. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/table/table-footer.svelte +1 -1
  114. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-head.svelte +1 -1
  115. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-header.svelte +1 -1
  116. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-row.svelte +1 -1
  117. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table.svelte +1 -1
  118. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tabs/tabs-content.svelte +1 -1
  119. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/tabs/tabs-list.svelte +1 -1
  120. package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/tabs/tabs-trigger.svelte +1 -1
  121. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tabs/tabs.svelte +1 -1
  122. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/tooltip-content.svelte +2 -2
  123. package/dist/templates/{todo → fullstack}/apps/web/src/lib/server/api.ts +9 -6
  124. package/dist/templates/{todo → fullstack}/apps/web/src/lib/server/backend-proxy.test.ts +25 -0
  125. package/dist/templates/{todo → fullstack}/apps/web/src/lib/server/backend-proxy.ts +8 -1
  126. package/dist/templates/fullstack/apps/web/src/routes/+layout.svelte +14 -0
  127. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/routes/+page.svelte +5 -5
  128. package/dist/templates/{todo → fullstack}/apps/web/src/routes/api/[...path]/+server.ts +1 -1
  129. package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/routes/api/auth/[...all]/+server.ts +1 -1
  130. package/dist/templates/{todo → fullstack}/apps/web/tsconfig.json +3 -2
  131. package/dist/templates/fullstack/apps/web/vite.config.ts +25 -0
  132. package/dist/templates/fullstack/bunfig.toml +3 -0
  133. package/dist/templates/{todo → fullstack}/compose.dev.yaml +8 -38
  134. package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy/SKILL.md +5 -5
  135. package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy/references/profile.md +5 -3
  136. package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy/references/rollback.md +2 -2
  137. package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy-fast/SKILL.md +3 -3
  138. package/dist/templates/{todo → fullstack}/dot-claude/skills/podokit-add-module/SKILL.md +2 -2
  139. package/dist/templates/fullstack/dot-claude/skills/podokit-elysia-endpoint/SKILL.md +27 -0
  140. package/dist/templates/{todo → fullstack}/dot-claude/skills/podokit-sveltekit-route/SKILL.md +4 -4
  141. package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-update/SKILL.md +3 -1
  142. package/dist/templates/{todo → fullstack}/dot-devcontainer/devcontainer.json +1 -1
  143. package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-env.example +1 -7
  144. package/dist/templates/{todo → fullstack}/dot-github/workflows/release.yml +5 -8
  145. package/dist/templates/fullstack/dot-mcp.json +8 -0
  146. package/dist/templates/fullstack/dot-podokit/dev.json +5 -0
  147. package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/docker/docker-compose.yml +2 -2
  148. package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/docker/sms-sink.mjs +2 -1
  149. package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/README.md +5 -0
  150. package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/configmap.yaml +2 -0
  151. package/dist/templates/fullstack/package.json +27 -0
  152. package/dist/templates/{fullstack-nest-svelte → fullstack}/tests/README.md +6 -6
  153. package/dist/templates/fullstack/tests/package.json +15 -0
  154. package/dist/templates/{fullstack-nest-svelte → fullstack}/tests/ui/smoke.ui.spec.ts +2 -1
  155. package/dist/templates/modules/admin-dashboard/files/apps/api/scripts/bootstrap-admin.mjs +4 -4
  156. package/dist/templates/modules/admin-dashboard/files/apps/api/src/admin.module.ts +153 -0
  157. package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.service.spec.ts +13 -13
  158. package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.service.ts +34 -22
  159. package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.validation.spec.ts +7 -7
  160. package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.validation.ts +5 -6
  161. package/dist/templates/modules/admin-dashboard/files/apps/api/src/site-settings/site-settings.service.ts +31 -29
  162. package/dist/templates/modules/admin-dashboard/files/apps/api/src/site-settings/site-settings.validation.spec.ts +22 -0
  163. package/dist/templates/modules/admin-dashboard/files/apps/api/src/site-settings/site-settings.validation.ts +73 -0
  164. package/dist/templates/modules/admin-dashboard/files/apps/web/src/app.d.ts +2 -2
  165. package/dist/templates/modules/admin-dashboard/files/apps/web/src/hooks.server.ts +7 -6
  166. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/admin/registry.svelte.ts +1 -1
  167. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/auth-redirect.ts +1 -1
  168. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/account-menu.svelte +6 -6
  169. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/account-page.svelte +16 -13
  170. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/admin-sidebar.svelte +3 -3
  171. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/data-table.svelte +4 -4
  172. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/impersonation-banner.svelte +24 -0
  173. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/language-switch.svelte +4 -4
  174. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/session-idle-timeout.svelte +1 -1
  175. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/settings/appearance-card.svelte +10 -10
  176. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/sidebar-user-menu.svelte +4 -4
  177. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/site-footer.svelte +2 -2
  178. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/site-runtime.svelte +3 -3
  179. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/table-pagination.svelte +1 -1
  180. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/table-toolbar.svelte +4 -4
  181. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/theme-toggle.svelte +3 -3
  182. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-content.svelte +1 -1
  183. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-ellipsis.svelte +1 -1
  184. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-item.svelte +1 -1
  185. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-link.svelte +2 -2
  186. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-next-button.svelte +1 -1
  187. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-next.svelte +2 -2
  188. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-prev-button.svelte +1 -1
  189. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-previous.svelte +2 -2
  190. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination.svelte +1 -1
  191. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-content.svelte +2 -2
  192. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-description.svelte +1 -1
  193. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-footer.svelte +1 -1
  194. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-header.svelte +1 -1
  195. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-overlay.svelte +1 -1
  196. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-title.svelte +1 -1
  197. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/context.svelte.ts +1 -1
  198. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-content.svelte +1 -1
  199. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-footer.svelte +1 -1
  200. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-group-action.svelte +1 -1
  201. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-group-content.svelte +1 -1
  202. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-group-label.svelte +1 -1
  203. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-group.svelte +1 -1
  204. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-header.svelte +1 -1
  205. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-input.svelte +2 -2
  206. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-inset.svelte +1 -1
  207. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-action.svelte +1 -1
  208. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-badge.svelte +1 -1
  209. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-button.svelte +2 -2
  210. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-item.svelte +1 -1
  211. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-skeleton.svelte +2 -2
  212. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-sub-button.svelte +1 -1
  213. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-sub-item.svelte +1 -1
  214. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-sub.svelte +1 -1
  215. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu.svelte +1 -1
  216. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-provider.svelte +2 -2
  217. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-rail.svelte +1 -1
  218. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-separator.svelte +2 -2
  219. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-trigger.svelte +2 -2
  220. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar.svelte +2 -2
  221. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/user-avatar.svelte +1 -1
  222. package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/i18n/index.ts +1 -1
  223. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/+layout.server.ts +2 -2
  224. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/+layout.svelte +8 -20
  225. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/+page.svelte +3 -3
  226. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/account/+page.svelte +1 -1
  227. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/audit/+page.server.ts +1 -1
  228. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/audit/+page.svelte +5 -5
  229. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/organizations/+page.server.ts +1 -1
  230. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/organizations/+page.svelte +10 -10
  231. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/sessions/+page.server.ts +1 -1
  232. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/sessions/+page.svelte +9 -9
  233. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/settings/+page.server.ts +1 -1
  234. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/settings/+page.svelte +13 -13
  235. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/settings/general-settings.svelte +10 -10
  236. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/users/+page.server.ts +1 -1
  237. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/users/+page.svelte +18 -17
  238. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(app)/+layout.server.ts +1 -1
  239. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(app)/accept-invitation/[id]/+page.svelte +4 -4
  240. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/+layout.svelte +2 -2
  241. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/forgot-password/+page.svelte +7 -7
  242. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/login/+page.svelte +10 -10
  243. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/pending-approval/+page.svelte +3 -3
  244. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/reset-password/+page.svelte +7 -7
  245. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/signup/+page.svelte +9 -9
  246. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/verify-email/+page.svelte +7 -7
  247. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/+layout.server.ts +3 -3
  248. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/+page.svelte +6 -6
  249. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/account/+page.server.ts +9 -2
  250. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/account/+page.svelte +12 -8
  251. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/maintenance/+page.svelte +4 -4
  252. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/oauth2/consent/+page.svelte +3 -3
  253. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/setup-2fa/+page.server.ts +2 -2
  254. package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/setup-2fa/+page.svelte +14 -10
  255. package/dist/templates/modules/admin-dashboard/files/dot-claude/skills/podokit-data-table/SKILL.md +3 -3
  256. package/dist/templates/modules/admin-dashboard/files/tests/helpers/accounts.ts +17 -2
  257. package/dist/templates/modules/admin-dashboard/files/tests/helpers/disposable-users.ts +29 -12
  258. package/dist/templates/modules/admin-dashboard/files/tests/helpers/hydration.ts +4 -4
  259. package/dist/templates/modules/admin-dashboard/files/tests/ui/account-flows.ui.spec.ts +4 -2
  260. package/dist/templates/modules/admin-dashboard/files/tests/ui/account.ui.spec.ts +51 -0
  261. package/dist/templates/modules/admin-dashboard/files/tests/ui/auth.ui.spec.ts +2 -2
  262. package/dist/templates/modules/admin-dashboard/files/tests/ui/impersonation.ui.spec.ts +4 -2
  263. package/dist/templates/modules/admin-dashboard/files/tests/ui/oidc.ui.spec.ts +16 -11
  264. package/dist/templates/modules/admin-dashboard/files/tests/ui/passkey.ui.spec.ts +3 -2
  265. package/dist/templates/modules/admin-dashboard/files/tests/ui/two-factor.ui.spec.ts +40 -7
  266. package/dist/templates/modules/admin-dashboard/module.manifest.json +14 -24
  267. package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key-verifier.spec.ts +1 -1
  268. package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key-verifier.ts +0 -2
  269. package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key.module.spec.ts +21 -0
  270. package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key.module.ts +36 -9
  271. package/dist/templates/modules/api-key-auth/module.manifest.json +4 -4
  272. package/dist/templates/modules/audit-log/files/apps/api/src/audit/README.md +17 -16
  273. package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit-events.ts +8 -6
  274. package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit-hook.ts +2 -2
  275. package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.module.ts +31 -12
  276. package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.service.spec.ts +48 -0
  277. package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.service.ts +76 -25
  278. package/dist/templates/modules/audit-log/module.manifest.json +12 -16
  279. package/dist/templates/modules/auth/files/apps/api/scripts/configure-auth.mjs +5 -5
  280. package/dist/templates/modules/auth/files/apps/api/scripts/run-migrations.mjs +14 -0
  281. package/dist/templates/modules/auth/files/apps/api/src/auth/auth-provider.ts +3 -6
  282. package/dist/templates/modules/auth/files/apps/api/src/auth/auth.module.ts +176 -0
  283. package/dist/templates/modules/auth/files/apps/api/src/auth/auth.openapi.spec.ts +20 -0
  284. package/dist/templates/modules/auth/files/apps/api/src/auth/auth.openapi.ts +22 -0
  285. package/dist/templates/modules/auth/files/apps/api/src/auth/auth.runtime.spec.ts +3 -3
  286. package/dist/templates/modules/auth/files/apps/api/src/auth/auth.service.spec.ts +52 -0
  287. package/dist/templates/modules/auth/files/apps/api/src/auth/auth.service.ts +78 -0
  288. package/dist/templates/modules/auth/files/apps/api/src/auth/auth.ts +4 -1
  289. package/dist/templates/modules/auth/files/apps/api/src/auth/user-delete-handlers.spec.ts +6 -6
  290. package/dist/templates/modules/auth/files/apps/api/src/auth-config/auth-config.service.ts +214 -100
  291. package/dist/templates/modules/auth/files/apps/api/src/migrations/1720400000000-InitAppSettings.ts +2 -1
  292. package/dist/templates/modules/auth/files/apps/api/src/settings/app-settings.migration.spec.ts +34 -0
  293. package/dist/templates/modules/auth/files/apps/api/src/settings/flag-defaults.ts +3 -3
  294. package/dist/templates/modules/auth/files/apps/api/src/settings/settings.service.ts +26 -30
  295. package/dist/templates/modules/auth/files/dot-claude/skills/podokit-configure-auth/SKILL.md +7 -7
  296. package/dist/templates/modules/auth/files/dot-claude/skills/podokit-configure-auth/references/bootstrap-admin.md +3 -3
  297. package/dist/templates/modules/auth/files/dot-claude/skills/podokit-configure-auth/references/google.md +3 -3
  298. package/dist/templates/modules/auth/module.manifest.json +24 -77
  299. package/dist/templates/modules/bullmq/files/apps/api/src/jobs/demo.processor.spec.ts +10 -0
  300. package/dist/templates/modules/bullmq/files/apps/api/src/jobs/demo.processor.ts +3 -9
  301. package/dist/templates/modules/bullmq/files/apps/api/src/jobs/jobs.module.ts +35 -13
  302. package/dist/templates/modules/bullmq/files/apps/api/src/jobs/worker.module.ts +18 -19
  303. package/dist/templates/modules/bullmq/files/apps/api/src/main-worker.ts +12 -10
  304. package/dist/templates/modules/bullmq/files/infra/docker/worker.compose.example.yml +1 -1
  305. package/dist/templates/modules/bullmq/files/infra/k3s/worker-deployment.yaml +1 -1
  306. package/dist/templates/modules/bullmq/module.manifest.json +8 -9
  307. package/dist/templates/modules/file-upload/files/apps/api/src/files/files.module.ts +28 -8
  308. package/dist/templates/modules/file-upload/files/tests/api/files.api.spec.ts +9 -4
  309. package/dist/templates/modules/file-upload/module.manifest.json +2 -5
  310. package/dist/templates/modules/job-progress/files/apps/api/src/progress/job-progress.module.ts +33 -11
  311. package/dist/templates/modules/job-progress/files/apps/api/src/progress/progress.bridge.spec.ts +6 -6
  312. package/dist/templates/modules/job-progress/files/apps/api/src/progress/progress.bridge.ts +5 -13
  313. package/dist/templates/modules/job-progress/files/apps/api/src/progress/progress.processor.ts +11 -18
  314. package/dist/templates/modules/job-progress/module.manifest.json +5 -8
  315. package/dist/templates/modules/logging/files/apps/api/src/logging/logging.module.ts +15 -28
  316. package/dist/templates/modules/logging/module.manifest.json +5 -6
  317. package/dist/templates/modules/mailer/module.manifest.json +2 -2
  318. package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.config.spec.ts +20 -0
  319. package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.config.ts +17 -21
  320. package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.module.ts +43 -9
  321. package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.service.ts +26 -35
  322. package/dist/templates/modules/object-storage-s3/module.manifest.json +3 -7
  323. package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.config.spec.ts +10 -4
  324. package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.config.ts +13 -0
  325. package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.identity.spec.ts +43 -103
  326. package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.identity.ts +19 -56
  327. package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.module.spec.ts +124 -212
  328. package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.module.ts +123 -87
  329. package/dist/templates/modules/rate-limit/files/tests/api/rate-limit.api.spec.ts +17 -1
  330. package/dist/templates/modules/rate-limit/module.manifest.json +17 -11
  331. package/dist/templates/modules/redis/files/apps/api/src/redis/redis.module.ts +41 -10
  332. package/dist/templates/modules/redis/files/apps/api/src/redis/redis.service.spec.ts +3 -3
  333. package/dist/templates/modules/redis/files/apps/api/src/redis/redis.service.ts +29 -51
  334. package/dist/templates/modules/redis/module.manifest.json +3 -12
  335. package/dist/templates/modules/sse/files/apps/api/src/events/events.module.ts +46 -17
  336. package/dist/templates/modules/sse/files/apps/api/src/events/events.service.spec.ts +19 -50
  337. package/dist/templates/modules/sse/files/apps/api/src/events/events.service.ts +40 -25
  338. package/dist/templates/modules/sse/files/apps/api/src/events/events.transport.ts +25 -79
  339. package/dist/templates/modules/sse/module.manifest.json +2 -5
  340. package/dist/templates/todo/AGENTS.md +15 -12
  341. package/dist/templates/todo/README.md +19 -13
  342. package/dist/templates/todo/apps/api/src/todos/todo.plugin.ts +59 -0
  343. package/dist/templates/todo/apps/api/src/todos/todo.repository.ts +69 -0
  344. package/dist/templates/todo/apps/web/src/routes/+page.svelte +7 -7
  345. package/dist/templates.js +4 -4
  346. package/dist/toolchain.d.ts +13 -0
  347. package/dist/toolchain.js +44 -0
  348. package/dist/update.d.ts +18 -1
  349. package/dist/update.js +50 -12
  350. package/dist/websocket-paths.d.ts +1 -0
  351. package/dist/websocket-paths.js +32 -0
  352. package/package.json +5 -4
  353. package/dist/templates/fullstack-nest-svelte/Dockerfile.dev +0 -58
  354. package/dist/templates/fullstack-nest-svelte/apps/api/Dockerfile +0 -88
  355. package/dist/templates/fullstack-nest-svelte/apps/api/nest-cli.json +0 -5
  356. package/dist/templates/fullstack-nest-svelte/apps/api/package.json +0 -66
  357. package/dist/templates/fullstack-nest-svelte/apps/api/src/app.extensions.ts +0 -21
  358. package/dist/templates/fullstack-nest-svelte/apps/api/src/app.module.ts +0 -26
  359. package/dist/templates/fullstack-nest-svelte/apps/api/src/common/all-exceptions.filter.ts +0 -43
  360. package/dist/templates/fullstack-nest-svelte/apps/api/src/config/redis.connection.spec.ts +0 -53
  361. package/dist/templates/fullstack-nest-svelte/apps/api/src/config/redis.connection.ts +0 -69
  362. package/dist/templates/fullstack-nest-svelte/apps/api/src/health/health.controller.ts +0 -38
  363. package/dist/templates/fullstack-nest-svelte/apps/api/src/health/health.module.ts +0 -11
  364. package/dist/templates/fullstack-nest-svelte/apps/api/src/health/readiness.service.ts +0 -33
  365. package/dist/templates/fullstack-nest-svelte/apps/api/src/main.ts +0 -29
  366. package/dist/templates/fullstack-nest-svelte/apps/api/tsconfig.json +0 -30
  367. package/dist/templates/fullstack-nest-svelte/apps/web/Dockerfile +0 -81
  368. package/dist/templates/fullstack-nest-svelte/apps/web/components.json +0 -15
  369. package/dist/templates/fullstack-nest-svelte/apps/web/server.js +0 -31
  370. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/alert/alert-description.svelte +0 -23
  371. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar-badge.svelte +0 -26
  372. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar-fallback.svelte +0 -20
  373. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar-group-count.svelte +0 -23
  374. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar-group.svelte +0 -23
  375. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar-image.svelte +0 -17
  376. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar.svelte +0 -26
  377. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/card/card-description.svelte +0 -20
  378. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/card/card-footer.svelte +0 -20
  379. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/card/card-title.svelte +0 -20
  380. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/checkbox/checkbox.svelte +0 -39
  381. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dialog/dialog-description.svelte +0 -17
  382. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dialog/dialog-header.svelte +0 -20
  383. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dialog/dialog-overlay.svelte +0 -17
  384. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dialog/dialog-title.svelte +0 -17
  385. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +0 -44
  386. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte +0 -31
  387. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte +0 -27
  388. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte +0 -17
  389. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +0 -17
  390. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +0 -29
  391. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/select/select-group-heading.svelte +0 -21
  392. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/select/select-label.svelte +0 -20
  393. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/select/select-trigger.svelte +0 -29
  394. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/separator/separator.svelte +0 -23
  395. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/skeleton/skeleton.svelte +0 -17
  396. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/table/table-footer.svelte +0 -20
  397. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/tabs/tabs-list.svelte +0 -20
  398. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/tabs/tabs-trigger.svelte +0 -20
  399. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/api.ts +0 -21
  400. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/backend-proxy.test.ts +0 -79
  401. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/backend-proxy.ts +0 -80
  402. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/ws-upgrade.js +0 -267
  403. package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/ws-upgrade.test.js +0 -134
  404. package/dist/templates/fullstack-nest-svelte/apps/web/src/routes/+layout.svelte +0 -9
  405. package/dist/templates/fullstack-nest-svelte/apps/web/src/routes/api/[...path]/+server.ts +0 -16
  406. package/dist/templates/fullstack-nest-svelte/apps/web/svelte.config.js +0 -15
  407. package/dist/templates/fullstack-nest-svelte/apps/web/tsconfig.json +0 -9
  408. package/dist/templates/fullstack-nest-svelte/apps/web/vite.config.ts +0 -29
  409. package/dist/templates/fullstack-nest-svelte/compose.dev.yaml +0 -162
  410. package/dist/templates/fullstack-nest-svelte/dot-claude/skills/podokit-add-module/SKILL.md +0 -27
  411. package/dist/templates/fullstack-nest-svelte/dot-claude/skills/podokit-nest-endpoint/SKILL.md +0 -23
  412. package/dist/templates/fullstack-nest-svelte/dot-claude/skills/podokit-sveltekit-route/SKILL.md +0 -23
  413. package/dist/templates/fullstack-nest-svelte/dot-devcontainer/devcontainer.json +0 -20
  414. package/dist/templates/fullstack-nest-svelte/dot-github/workflows/release.yml +0 -142
  415. package/dist/templates/fullstack-nest-svelte/dot-mcp.json +0 -8
  416. package/dist/templates/fullstack-nest-svelte/dot-podokit/dev.json +0 -4
  417. package/dist/templates/fullstack-nest-svelte/package.json +0 -21
  418. package/dist/templates/fullstack-nest-svelte/tests/package.json +0 -15
  419. package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image-upload.interceptor.ts +0 -39
  420. package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.controller.ts +0 -73
  421. package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.module.ts +0 -9
  422. package/dist/templates/modules/admin-dashboard/files/apps/api/src/site-settings/site-settings.controller.ts +0 -155
  423. package/dist/templates/modules/admin-dashboard/files/apps/api/src/site-settings/site-settings.module.ts +0 -14
  424. package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key.decorator.ts +0 -9
  425. package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key.guard.spec.ts +0 -49
  426. package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key.guard.ts +0 -21
  427. package/dist/templates/modules/api-key-auth/files/apps/api/src/machine/machine.controller.ts +0 -14
  428. package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit-log.entity.ts +0 -46
  429. package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.controller.ts +0 -21
  430. package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.decorator.ts +0 -23
  431. package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.interceptor.ts +0 -56
  432. package/dist/templates/modules/auth/files/apps/api/src/account/account.controller.ts +0 -101
  433. package/dist/templates/modules/auth/files/apps/api/src/account/account.module.ts +0 -6
  434. package/dist/templates/modules/auth/files/apps/api/src/auth/two-factor-required.guard.ts +0 -68
  435. package/dist/templates/modules/auth/files/apps/api/src/auth-config/auth-config.controller.ts +0 -33
  436. package/dist/templates/modules/auth/files/apps/api/src/auth-config/auth-config.entity.ts +0 -26
  437. package/dist/templates/modules/auth/files/apps/api/src/auth-config/auth-config.module.ts +0 -12
  438. package/dist/templates/modules/auth/files/apps/api/src/health/health.controller.ts +0 -41
  439. package/dist/templates/modules/auth/files/apps/api/src/settings/app-setting.entity.ts +0 -16
  440. package/dist/templates/modules/auth/files/apps/api/src/settings/settings.module.ts +0 -11
  441. package/dist/templates/modules/bullmq/files/apps/api/src/jobs/dto/create-job.dto.ts +0 -9
  442. package/dist/templates/modules/bullmq/files/apps/api/src/jobs/jobs.controller.ts +0 -29
  443. package/dist/templates/modules/file-upload/files/apps/api/src/files/files.controller.ts +0 -32
  444. package/dist/templates/modules/job-progress/files/apps/api/src/progress/dto/start-job.dto.ts +0 -11
  445. package/dist/templates/modules/job-progress/files/apps/api/src/progress/progress.controller.ts +0 -17
  446. package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/dto/put-object.dto.ts +0 -8
  447. package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.controller.ts +0 -29
  448. package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.service.spec.ts +0 -35
  449. package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.module.integration.spec.ts +0 -91
  450. package/dist/templates/modules/redis/files/apps/api/src/redis/cache.controller.ts +0 -21
  451. package/dist/templates/modules/redis/files/apps/api/src/redis/dto/set-cache.dto.ts +0 -14
  452. package/dist/templates/modules/sse/files/apps/api/src/events/dto/publish-event.dto.ts +0 -8
  453. package/dist/templates/modules/sse/files/apps/api/src/events/events.controller.ts +0 -39
  454. package/dist/templates/modules/sse/files/apps/api/src/events/events.transport.redis.spec.ts +0 -42
  455. package/dist/templates/modules/sse/files/apps/api/src/events/events.transport.spec.ts +0 -97
  456. package/dist/templates/todo/CLAUDE.md +0 -6
  457. package/dist/templates/todo/Dockerfile.dev +0 -58
  458. package/dist/templates/todo/apps/api/Dockerfile +0 -88
  459. package/dist/templates/todo/apps/api/nest-cli.json +0 -5
  460. package/dist/templates/todo/apps/api/package.json +0 -66
  461. package/dist/templates/todo/apps/api/scripts/.keep +0 -1
  462. package/dist/templates/todo/apps/api/src/app.extensions.ts +0 -21
  463. package/dist/templates/todo/apps/api/src/app.module.ts +0 -28
  464. package/dist/templates/todo/apps/api/src/common/all-exceptions.filter.ts +0 -43
  465. package/dist/templates/todo/apps/api/src/common/app-exception.ts +0 -4
  466. package/dist/templates/todo/apps/api/src/config/env.validation.ts +0 -23
  467. package/dist/templates/todo/apps/api/src/database/data-source.ts +0 -19
  468. package/dist/templates/todo/apps/api/src/database/migrate.ts +0 -16
  469. package/dist/templates/todo/apps/api/src/health/health.controller.ts +0 -38
  470. package/dist/templates/todo/apps/api/src/health/health.module.ts +0 -11
  471. package/dist/templates/todo/apps/api/src/health/readiness.service.spec.ts +0 -22
  472. package/dist/templates/todo/apps/api/src/main.ts +0 -29
  473. package/dist/templates/todo/apps/api/src/todos/dto/create-todo.dto.ts +0 -10
  474. package/dist/templates/todo/apps/api/src/todos/dto/update-todo.dto.ts +0 -10
  475. package/dist/templates/todo/apps/api/src/todos/todo.entity.ts +0 -16
  476. package/dist/templates/todo/apps/api/src/todos/todos.controller.ts +0 -38
  477. package/dist/templates/todo/apps/api/src/todos/todos.module.ts +0 -12
  478. package/dist/templates/todo/apps/api/src/todos/todos.service.ts +0 -41
  479. package/dist/templates/todo/apps/web/Dockerfile +0 -78
  480. package/dist/templates/todo/apps/web/package.json +0 -38
  481. package/dist/templates/todo/apps/web/server.js +0 -31
  482. package/dist/templates/todo/apps/web/src/app.css +0 -81
  483. package/dist/templates/todo/apps/web/src/app.d.ts +0 -11
  484. package/dist/templates/todo/apps/web/src/app.html +0 -13
  485. package/dist/templates/todo/apps/web/src/lib/api.ts +0 -5
  486. package/dist/templates/todo/apps/web/src/lib/components/site-runtime.svelte +0 -7
  487. package/dist/templates/todo/apps/web/src/lib/components/ui/alert/alert-action.svelte +0 -20
  488. package/dist/templates/todo/apps/web/src/lib/components/ui/alert/alert-title.svelte +0 -23
  489. package/dist/templates/todo/apps/web/src/lib/components/ui/alert/alert.svelte +0 -43
  490. package/dist/templates/todo/apps/web/src/lib/components/ui/alert/index.ts +0 -17
  491. package/dist/templates/todo/apps/web/src/lib/components/ui/avatar/index.ts +0 -22
  492. package/dist/templates/todo/apps/web/src/lib/components/ui/badge/badge.svelte +0 -49
  493. package/dist/templates/todo/apps/web/src/lib/components/ui/badge/index.ts +0 -2
  494. package/dist/templates/todo/apps/web/src/lib/components/ui/button/button.svelte +0 -82
  495. package/dist/templates/todo/apps/web/src/lib/components/ui/button/index.ts +0 -17
  496. package/dist/templates/todo/apps/web/src/lib/components/ui/card/card-action.svelte +0 -23
  497. package/dist/templates/todo/apps/web/src/lib/components/ui/card/card-content.svelte +0 -20
  498. package/dist/templates/todo/apps/web/src/lib/components/ui/card/card-header.svelte +0 -23
  499. package/dist/templates/todo/apps/web/src/lib/components/ui/card/card.svelte +0 -22
  500. package/dist/templates/todo/apps/web/src/lib/components/ui/card/index.ts +0 -25
  501. package/dist/templates/todo/apps/web/src/lib/components/ui/checkbox/index.ts +0 -6
  502. package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog-close.svelte +0 -11
  503. package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog-content.svelte +0 -48
  504. package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog-footer.svelte +0 -32
  505. package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog-portal.svelte +0 -7
  506. package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog-trigger.svelte +0 -11
  507. package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog.svelte +0 -7
  508. package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/index.ts +0 -34
  509. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +0 -16
  510. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +0 -22
  511. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte +0 -7
  512. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte +0 -24
  513. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte +0 -7
  514. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +0 -16
  515. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +0 -34
  516. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +0 -20
  517. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte +0 -7
  518. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +0 -7
  519. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte +0 -7
  520. package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/index.ts +0 -54
  521. package/dist/templates/todo/apps/web/src/lib/components/ui/input/index.ts +0 -7
  522. package/dist/templates/todo/apps/web/src/lib/components/ui/input/input.svelte +0 -48
  523. package/dist/templates/todo/apps/web/src/lib/components/ui/label/index.ts +0 -7
  524. package/dist/templates/todo/apps/web/src/lib/components/ui/label/label.svelte +0 -20
  525. package/dist/templates/todo/apps/web/src/lib/components/ui/select/index.ts +0 -37
  526. package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-content.svelte +0 -45
  527. package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-group.svelte +0 -17
  528. package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-item.svelte +0 -40
  529. package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-portal.svelte +0 -7
  530. package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-scroll-down-button.svelte +0 -20
  531. package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-scroll-up-button.svelte +0 -20
  532. package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-separator.svelte +0 -18
  533. package/dist/templates/todo/apps/web/src/lib/components/ui/select/select.svelte +0 -11
  534. package/dist/templates/todo/apps/web/src/lib/components/ui/separator/index.ts +0 -7
  535. package/dist/templates/todo/apps/web/src/lib/components/ui/skeleton/index.ts +0 -7
  536. package/dist/templates/todo/apps/web/src/lib/components/ui/sonner/index.ts +0 -1
  537. package/dist/templates/todo/apps/web/src/lib/components/ui/sonner/sonner.svelte +0 -34
  538. package/dist/templates/todo/apps/web/src/lib/components/ui/switch/index.ts +0 -7
  539. package/dist/templates/todo/apps/web/src/lib/components/ui/switch/switch.svelte +0 -29
  540. package/dist/templates/todo/apps/web/src/lib/components/ui/table/index.ts +0 -28
  541. package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-body.svelte +0 -15
  542. package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-caption.svelte +0 -20
  543. package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-cell.svelte +0 -15
  544. package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-head.svelte +0 -15
  545. package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-header.svelte +0 -20
  546. package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-row.svelte +0 -15
  547. package/dist/templates/todo/apps/web/src/lib/components/ui/table/table.svelte +0 -17
  548. package/dist/templates/todo/apps/web/src/lib/components/ui/tabs/index.ts +0 -16
  549. package/dist/templates/todo/apps/web/src/lib/components/ui/tabs/tabs-content.svelte +0 -17
  550. package/dist/templates/todo/apps/web/src/lib/components/ui/tabs/tabs.svelte +0 -19
  551. package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/index.ts +0 -19
  552. package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/tooltip-content.svelte +0 -52
  553. package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/tooltip-portal.svelte +0 -7
  554. package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/tooltip-provider.svelte +0 -7
  555. package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/tooltip-trigger.svelte +0 -7
  556. package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/tooltip.svelte +0 -7
  557. package/dist/templates/todo/apps/web/src/lib/i18n/README.md +0 -9
  558. package/dist/templates/todo/apps/web/src/lib/i18n/catalogs/app/en.json +0 -1
  559. package/dist/templates/todo/apps/web/src/lib/i18n/catalogs/app/ko.json +0 -1
  560. package/dist/templates/todo/apps/web/src/lib/i18n/locales/en.json +0 -6
  561. package/dist/templates/todo/apps/web/src/lib/i18n/locales/ko.json +0 -6
  562. package/dist/templates/todo/apps/web/src/lib/server/ws-upgrade.js +0 -267
  563. package/dist/templates/todo/apps/web/src/lib/server/ws-upgrade.test.js +0 -134
  564. package/dist/templates/todo/apps/web/src/lib/utils.ts +0 -11
  565. package/dist/templates/todo/apps/web/src/routes/+layout.svelte +0 -9
  566. package/dist/templates/todo/apps/web/src/routes/api/auth/[...all]/+server.ts +0 -16
  567. package/dist/templates/todo/apps/web/static/.gitkeep +0 -0
  568. package/dist/templates/todo/apps/web/static/favicon.svg +0 -13
  569. package/dist/templates/todo/apps/web/svelte.config.js +0 -15
  570. package/dist/templates/todo/apps/web/vite.config.ts +0 -29
  571. package/dist/templates/todo/dot-agents/skills/podokit-deploy/SKILL.md +0 -65
  572. package/dist/templates/todo/dot-agents/skills/podokit-deploy/agents/openai.yaml +0 -4
  573. package/dist/templates/todo/dot-agents/skills/podokit-deploy/references/profile.md +0 -75
  574. package/dist/templates/todo/dot-agents/skills/podokit-deploy/references/release.md +0 -64
  575. package/dist/templates/todo/dot-agents/skills/podokit-deploy/references/rollback.md +0 -5
  576. package/dist/templates/todo/dot-agents/skills/podokit-deploy-fast/SKILL.md +0 -92
  577. package/dist/templates/todo/dot-claude/skills/podokit-add-locale/SKILL.md +0 -63
  578. package/dist/templates/todo/dot-claude/skills/podokit-add-locale/agents/openai.yaml +0 -4
  579. package/dist/templates/todo/dot-claude/skills/podokit-add-locale/references/catalog-format.md +0 -49
  580. package/dist/templates/todo/dot-claude/skills/podokit-deploy/SKILL.md +0 -8
  581. package/dist/templates/todo/dot-claude/skills/podokit-deploy-fast/SKILL.md +0 -8
  582. package/dist/templates/todo/dot-claude/skills/podokit-nest-endpoint/SKILL.md +0 -23
  583. package/dist/templates/todo/dot-claude/skills/podokit-update/SKILL.md +0 -26
  584. package/dist/templates/todo/dot-cursor/rules/podokit.mdc +0 -11
  585. package/dist/templates/todo/dot-dockerignore +0 -15
  586. package/dist/templates/todo/dot-env.docker +0 -26
  587. package/dist/templates/todo/dot-env.example +0 -34
  588. package/dist/templates/todo/dot-github/copilot-instructions.md +0 -6
  589. package/dist/templates/todo/dot-gitignore +0 -23
  590. package/dist/templates/todo/dot-mcp.json +0 -8
  591. package/dist/templates/todo/dot-podokit/dev.json +0 -4
  592. package/dist/templates/todo/infra/docker/docker-compose.yml +0 -33
  593. package/dist/templates/todo/infra/k3s/README.md +0 -18
  594. package/dist/templates/todo/infra/k3s/api-deployment.yaml +0 -29
  595. package/dist/templates/todo/infra/k3s/configmap.yaml +0 -12
  596. package/dist/templates/todo/infra/k3s/ingress.yaml +0 -32
  597. package/dist/templates/todo/infra/k3s/namespace.yaml +0 -4
  598. package/dist/templates/todo/infra/k3s/secret.example.yaml +0 -10
  599. package/dist/templates/todo/infra/k3s/services.yaml +0 -21
  600. package/dist/templates/todo/infra/k3s/web-deployment.yaml +0 -30
  601. package/dist/templates/todo/infra/traefik/dynamic.yml +0 -17
  602. package/dist/templates/todo/package.json +0 -21
  603. package/dist/templates/todo/tests/README.md +0 -21
  604. package/dist/templates/todo/tests/api/health.api.spec.ts +0 -14
  605. package/dist/templates/todo/tests/package.json +0 -15
  606. package/dist/templates/todo/tests/playwright.config.ts +0 -27
  607. package/dist/templates/todo/tests/playwright.extensions.ts +0 -44
  608. package/dist/templates/todo/tests/ui/smoke.ui.spec.ts +0 -8
  609. /package/dist/templates/{fullstack-nest-svelte → fullstack}/CLAUDE.md +0 -0
  610. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/scripts/.keep +0 -0
  611. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/src/common/app-exception.ts +0 -0
  612. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/src/config/env.validation.ts +0 -0
  613. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/src/database/migrate.ts +0 -0
  614. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/app.css +0 -0
  615. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/app.d.ts +0 -0
  616. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/api.ts +0 -0
  617. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/site-runtime.svelte +0 -0
  618. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/alert/index.ts +0 -0
  619. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/avatar/index.ts +0 -0
  620. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/badge/index.ts +0 -0
  621. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/button/index.ts +0 -0
  622. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/card/index.ts +0 -0
  623. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/checkbox/index.ts +0 -0
  624. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-close.svelte +0 -0
  625. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-portal.svelte +0 -0
  626. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-trigger.svelte +0 -0
  627. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog.svelte +0 -0
  628. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/index.ts +0 -0
  629. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +0 -0
  630. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte +0 -0
  631. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte +0 -0
  632. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +0 -0
  633. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte +0 -0
  634. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +0 -0
  635. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte +0 -0
  636. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/index.ts +0 -0
  637. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/input/index.ts +0 -0
  638. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/label/index.ts +0 -0
  639. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/index.ts +0 -0
  640. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-portal.svelte +0 -0
  641. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select.svelte +0 -0
  642. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/separator/index.ts +0 -0
  643. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/skeleton/index.ts +0 -0
  644. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/sonner/index.ts +0 -0
  645. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/sonner/sonner.svelte +0 -0
  646. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/switch/index.ts +0 -0
  647. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/index.ts +0 -0
  648. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tabs/index.ts +0 -0
  649. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/index.ts +0 -0
  650. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/tooltip-portal.svelte +0 -0
  651. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/tooltip-provider.svelte +0 -0
  652. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/tooltip-trigger.svelte +0 -0
  653. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/tooltip.svelte +0 -0
  654. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/i18n/README.md +0 -0
  655. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/i18n/catalogs/app/en.json +0 -0
  656. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/i18n/catalogs/app/ko.json +0 -0
  657. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/i18n/locales/en.json +0 -0
  658. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/i18n/locales/ko.json +0 -0
  659. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/utils.ts +0 -0
  660. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/static/.gitkeep +0 -0
  661. /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/static/favicon.svg +0 -0
  662. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy/agents/openai.yaml +0 -0
  663. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy/references/release.md +0 -0
  664. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-add-locale/SKILL.md +0 -0
  665. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-add-locale/agents/openai.yaml +0 -0
  666. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-add-locale/references/catalog-format.md +0 -0
  667. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-deploy/SKILL.md +0 -0
  668. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-deploy-fast/SKILL.md +0 -0
  669. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-cursor/rules/podokit.mdc +0 -0
  670. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-dockerignore +0 -0
  671. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-env.docker +0 -0
  672. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-github/copilot-instructions.md +0 -0
  673. /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-gitignore +0 -0
  674. /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/api-deployment.yaml +0 -0
  675. /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/ingress.yaml +0 -0
  676. /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/namespace.yaml +0 -0
  677. /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/secret.example.yaml +0 -0
  678. /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/services.yaml +0 -0
  679. /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/web-deployment.yaml +0 -0
  680. /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/traefik/dynamic.yml +0 -0
  681. /package/dist/templates/{fullstack-nest-svelte → fullstack}/tests/api/health.api.spec.ts +0 -0
  682. /package/dist/templates/{fullstack-nest-svelte → fullstack}/tests/playwright.config.ts +0 -0
  683. /package/dist/templates/{fullstack-nest-svelte → fullstack}/tests/playwright.extensions.ts +0 -0
@@ -23,14 +23,11 @@ const HEALTH_POLL_INTERVAL_MS = 2_000;
23
23
  * What the images ship outside their dependency tree.
24
24
  *
25
25
  * Every entry mirrors a `COPY --from=build` line in the generated Dockerfiles, which
26
- * is what makes the copy equivalent to a rebuild for code-only changes. Two entries
27
- * exist for a reason worth keeping:
28
- *
29
- * - `apps/web/server.js` and `apps/web/src/lib/server` ship as SOURCE, outside the
30
- * bundle, because the entry point has to run before the adapter does. Syncing only
31
- * `build/` would leave a stale entry running new routes.
32
- * - `packages/*` are copied as real directories rather than the symlinks npm leaves
33
- * behind, so their `dist/` is a separate destination from the apps'.
26
+ * is what makes the copy equivalent to a rebuild for code-only changes. The web
27
+ * image is different from the API image: the official Bun adapter bundles the web
28
+ * application and its workspace dependencies into `apps/web/build`, so that one
29
+ * directory is the complete web payload. API and worker processes still load
30
+ * workspace package output separately.
34
31
  *
35
32
  * `node_modules` is deliberately absent: the image installs a production-only,
36
33
  * workspace-scoped tree for its own platform, and a developer's tree is neither.
@@ -47,14 +44,12 @@ function composeSyncArtifacts(projectRoot) {
47
44
  for (const entry of (0, node_fs_1.readdirSync)(packagesDir).sort()) {
48
45
  if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(packagesDir, entry, "package.json")))
49
46
  continue;
50
- push(`packages/${entry}/dist`, `/app/packages/${entry}/dist`, "directory", ["api", "web", "worker"]);
47
+ push(`packages/${entry}/dist`, `/app/packages/${entry}/dist`, "directory", ["api", "worker"]);
51
48
  }
52
49
  }
53
50
  push("apps/api/dist", "/app/apps/api/dist", "directory", ["api", "worker"]);
54
51
  push("apps/api/scripts", "/app/apps/api/scripts", "directory", ["api", "worker"]);
55
52
  push("apps/web/build", "/app/apps/web/build", "directory", ["web"]);
56
- push("apps/web/server.js", "/app/apps/web/server.js", "file", ["web"]);
57
- push("apps/web/src/lib/server", "/app/apps/web/src/lib/server", "directory", ["web"]);
58
53
  return artifacts;
59
54
  }
60
55
  /** The excludes that fall inside one artifact, as paths relative to it. */
@@ -67,12 +62,11 @@ function excludesWithin(artifact, excludes) {
67
62
  /**
68
63
  * Whether the image's dependency tree can still run this code.
69
64
  *
70
- * Only the runtime dependency sets matter: `npm ci --omit=dev` installed what these
71
- * declare and nothing else, so a change to any of them means the container is
72
- * missing a package the new code imports -- a failure that surfaces as a crash loop
73
- * after the restart rather than as a copy error. `devDependencies` are absent from
74
- * the image by design and a `version` bump changes nothing at runtime, so neither
75
- * takes part.
65
+ * Only the runtime dependency sets matter for API and worker images: their package
66
+ * manager installed what these manifests declare and nothing else, so a change can
67
+ * leave the container without a package the new code imports. The web image has no
68
+ * runtime dependency tree; the official Bun adapter includes those dependencies in
69
+ * the synced build instead. `devDependencies` and package versions do not take part.
76
70
  */
77
71
  function runtimeDependenciesOf(manifest) {
78
72
  return JSON.stringify({
@@ -83,9 +77,10 @@ function runtimeDependenciesOf(manifest) {
83
77
  }
84
78
  /** The manifests whose runtime dependencies a role's container was built from. */
85
79
  function manifestPathsFor(projectRoot, role) {
86
- const app = role === "web" ? "web" : "api";
80
+ if (role === "web")
81
+ return [];
87
82
  const pairs = [
88
- [(0, node_path_1.join)(projectRoot, "apps", app, "package.json"), `/app/apps/${app}/package.json`],
83
+ [(0, node_path_1.join)(projectRoot, "apps", "api", "package.json"), "/app/apps/api/package.json"],
89
84
  ];
90
85
  const packagesDir = (0, node_path_1.join)(projectRoot, "packages");
91
86
  if ((0, node_fs_1.existsSync)(packagesDir)) {
@@ -165,19 +160,23 @@ function planComposeSync(projectRoot, profileName, runner = deploy_compose_exec_
165
160
  */
166
161
  function buildArtifacts(projectRoot, runner) {
167
162
  const manifest = (0, lockfile_1.readManifest)(projectRoot);
168
- const pm = manifest?.packageManager ?? "npm";
163
+ const pm = manifest?.toolchain.packageManager ?? "npm";
169
164
  const packagesDir = (0, node_path_1.join)(projectRoot, "packages");
170
165
  if ((0, node_fs_1.existsSync)(packagesDir)) {
171
166
  for (const entry of (0, node_fs_1.readdirSync)(packagesDir).sort()) {
172
167
  if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(packagesDir, entry, "package.json")))
173
168
  continue;
174
- (0, deploy_compose_exec_1.checked)(runner, pm, ["run", "build", "--if-present", "--workspace", `packages/${entry}`], false);
169
+ (0, deploy_compose_exec_1.checked)(runner, pm, pm === "bun"
170
+ ? ["run", "--cwd", `packages/${entry}`, "--if-present", "build"]
171
+ : ["run", "build", "--if-present", "--workspace", `packages/${entry}`], false);
175
172
  }
176
173
  }
177
174
  for (const app of ["api", "web"]) {
178
175
  if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(projectRoot, "apps", app, "package.json")))
179
176
  continue;
180
- (0, deploy_compose_exec_1.checked)(runner, pm, ["run", "build", "--if-present", "--workspace", `apps/${app}`], false);
177
+ (0, deploy_compose_exec_1.checked)(runner, pm, pm === "bun"
178
+ ? ["run", "--cwd", `apps/${app}`, "--if-present", "build"]
179
+ : ["run", "build", "--if-present", "--workspace", `apps/${app}`], false);
181
180
  }
182
181
  }
183
182
  function assertNoManifestDrift(projectRoot, profile, targets, runner) {
@@ -17,6 +17,8 @@ const deploy_compose_sync_1 = require("./deploy-compose-sync");
17
17
  const deploy_compose_profile_1 = require("./deploy-compose-profile");
18
18
  const deploy_compose_render_1 = require("./deploy-compose-render");
19
19
  const deploy_driver_2 = require("./deploy-driver");
20
+ const lockfile_1 = require("./lockfile");
21
+ const toolchain_1 = require("./toolchain");
20
22
  /** How many rollback targets the ledger keeps. */
21
23
  const LEDGER_DEPTH = 10;
22
24
  function digest(parts) {
@@ -364,7 +366,8 @@ function planComposeDeployment(projectRoot, profileName, release, runner = deplo
364
366
  actions.push({
365
367
  order: order++,
366
368
  kind: "migration",
367
- description: `Run ${(profile.migration?.command ?? ["npm", "run", "migrate:all"]).join(" ")} using ${images.api}.`,
369
+ description: `Run ${(profile.migration?.command ??
370
+ (0, toolchain_1.toolchainMigrationCommand)((0, lockfile_1.readManifest)(projectRoot)?.toolchain ?? (0, toolchain_1.resolveToolchain)())).join(" ")} using ${images.api}.`,
368
371
  });
369
372
  actions.push({
370
373
  order: order++,
@@ -49,6 +49,7 @@ export interface DeployProfileV1 {
49
49
  host: string;
50
50
  ingressClassName: string;
51
51
  tlsSecretName: string | null;
52
+ webSocketPaths: string[];
52
53
  };
53
54
  workloads: {
54
55
  api: WorkloadProfile;
@@ -11,6 +11,7 @@ const node_fs_1 = require("node:fs");
11
11
  const node_path_1 = require("node:path");
12
12
  const lockfile_1 = require("./lockfile");
13
13
  const deploy_schema_1 = require("./deploy-schema");
14
+ const websocket_paths_1 = require("./websocket-paths");
14
15
  var deploy_schema_2 = require("./deploy-schema");
15
16
  Object.defineProperty(exports, "profileDirectory", { enumerable: true, get: function () { return deploy_schema_2.profileDirectory; } });
16
17
  Object.defineProperty(exports, "profilePath", { enumerable: true, get: function () { return deploy_schema_2.profilePath; } });
@@ -116,7 +117,7 @@ function parseProfile(value) {
116
117
  const runtimeConfig = (0, deploy_schema_1.requiredRecord)(value, "runtimeConfig");
117
118
  (0, deploy_schema_1.assertOnlyKeys)(target, ["context", "clusterFingerprint", "namespace", "release", "createNamespace"], "target");
118
119
  (0, deploy_schema_1.assertOnlyKeys)(release, ["strategy", "tagPattern", "apiRepository", "webRepository"], "release");
119
- (0, deploy_schema_1.assertOnlyKeys)(exposure, ["mode", "host", "ingressClassName", "tlsSecretName"], "exposure");
120
+ (0, deploy_schema_1.assertOnlyKeys)(exposure, ["mode", "host", "ingressClassName", "tlsSecretName", "webSocketPaths"], "exposure");
120
121
  (0, deploy_schema_1.assertOnlyKeys)(workloads, ["api", "web", "worker"], "workloads");
121
122
  (0, deploy_schema_1.assertOnlyKeys)(dependencies, ["postgres", "redis", "objectStorage"], "dependencies");
122
123
  (0, deploy_schema_1.assertOnlyKeys)(secrets, ["api", "web", "imagePull"], "secrets");
@@ -162,6 +163,10 @@ function parseProfile(value) {
162
163
  const tlsSecretName = (0, deploy_schema_1.optionalString)(exposure, "tlsSecretName");
163
164
  if (tlsSecretName)
164
165
  (0, deploy_schema_1.validateDnsSubdomain)(tlsSecretName, "exposure.tlsSecretName");
166
+ const webSocketPaths = (0, websocket_paths_1.parseExactWebSocketPaths)(exposure.webSocketPaths ?? [], "exposure.webSocketPaths");
167
+ if (exposureMode === "nodePort" && webSocketPaths.length > 0) {
168
+ throw new Error("Deployment exposure.webSocketPaths requires exposure.mode ingress.");
169
+ }
165
170
  const postgres = parseStatefulDependency((0, deploy_schema_1.requiredRecord)(dependencies, "postgres"), "dependencies.postgres");
166
171
  const redis = parseRedisDependency((0, deploy_schema_1.requiredRecord)(dependencies, "redis"), "dependencies.redis");
167
172
  const objectStorageRecord = (0, deploy_schema_1.requiredRecord)(dependencies, "objectStorage");
@@ -204,6 +209,7 @@ function parseProfile(value) {
204
209
  host,
205
210
  ingressClassName,
206
211
  tlsSecretName,
212
+ webSocketPaths,
207
213
  },
208
214
  workloads: {
209
215
  api: parseWorkload((0, deploy_schema_1.requiredRecord)(workloads, "api"), "workloads.api"),
@@ -301,6 +307,7 @@ function initializeDeploymentProfile(projectRoot, name, options) {
301
307
  host,
302
308
  ingressClassName: "traefik",
303
309
  tlsSecretName: null,
310
+ webSocketPaths: [],
304
311
  },
305
312
  workloads: {
306
313
  api: {
@@ -376,6 +383,7 @@ function initializeDeploymentProfile(projectRoot, name, options) {
376
383
  ...(modules.has("rate-limit")
377
384
  ? {
378
385
  RATE_LIMIT_TTL: "60",
386
+ RATE_LIMIT_KEY_PREFIX: "podokit:rate-limit",
379
387
  RATE_LIMIT_MAX: "300",
380
388
  RATE_LIMIT_AUTH_TTL: "60",
381
389
  RATE_LIMIT_AUTH_MAX: "20",
@@ -5,6 +5,8 @@ const node_fs_1 = require("node:fs");
5
5
  const node_crypto_1 = require("node:crypto");
6
6
  const node_path_1 = require("node:path");
7
7
  const deploy_profile_1 = require("./deploy-profile");
8
+ const lockfile_1 = require("./lockfile");
9
+ const toolchain_1 = require("./toolchain");
8
10
  function quote(value) {
9
11
  return JSON.stringify(value);
10
12
  }
@@ -351,6 +353,8 @@ function derivedRuntimeConfig(profile) {
351
353
  const result = {
352
354
  PORT: "3000",
353
355
  BACKEND_INTERNAL_URL: `http://${profile.target.release}-api:3000`,
356
+ PROTOCOL_HEADER: "x-forwarded-proto",
357
+ HOST_HEADER: "x-forwarded-host",
354
358
  ...profile.runtimeConfig,
355
359
  };
356
360
  if (profile.dependencies.postgres.mode === "inCluster") {
@@ -517,16 +521,17 @@ spec:
517
521
  `;
518
522
  }
519
523
  function exposure(profile) {
520
- const service = `${profile.target.release}-web`;
524
+ const webService = `${profile.target.release}-web`;
525
+ const apiService = `${profile.target.release}-api`;
521
526
  if (profile.exposure.mode === "nodePort") {
522
527
  return `apiVersion: v1
523
528
  kind: Service
524
529
  metadata:
525
- name: ${service}-public
530
+ name: ${webService}-public
526
531
  spec:
527
532
  type: NodePort
528
533
  selector:
529
- app.kubernetes.io/name: ${service}
534
+ app.kubernetes.io/name: ${webService}
530
535
  ports:
531
536
  - { name: http, port: 80, targetPort: 3000 }
532
537
  `;
@@ -537,6 +542,15 @@ spec:
537
542
  secretName: ${quote(profile.exposure.tlsSecretName)}
538
543
  `
539
544
  : "";
545
+ const webSocketPaths = profile.exposure.webSocketPaths
546
+ .map((path) => ` - path: ${quote(path)}
547
+ pathType: Exact
548
+ backend:
549
+ service:
550
+ name: ${apiService}
551
+ port: { number: 3000 }
552
+ `)
553
+ .join("");
540
554
  return `apiVersion: networking.k8s.io/v1
541
555
  kind: Ingress
542
556
  metadata:
@@ -547,11 +561,11 @@ ${tls} rules:
547
561
  - host: ${quote(profile.exposure.host)}
548
562
  http:
549
563
  paths:
550
- - path: /
564
+ ${webSocketPaths} - path: /
551
565
  pathType: Prefix
552
566
  backend:
553
567
  service:
554
- name: ${service}
568
+ name: ${webService}
555
569
  port: { number: 3000 }
556
570
  `;
557
571
  }
@@ -577,9 +591,9 @@ function migrationRuntimeEnv(profile) {
577
591
  value: ${quote(value)}`)
578
592
  .join("\n");
579
593
  }
580
- function migrationManifest(profile, release, images) {
594
+ function migrationManifest(profile, release, images, defaultCommand) {
581
595
  const releaseSlug = release.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
582
- const command = profile.migration?.command ?? ["npm", "run", "migrate:all"];
596
+ const command = profile.migration?.command ?? defaultCommand;
583
597
  return `apiVersion: batch/v1
584
598
  kind: Job
585
599
  metadata:
@@ -646,7 +660,8 @@ function renderDeployment(projectRoot, profileName, profile, release, resolvedIm
646
660
  const effectiveRolloutStateDigest = rolloutStateDigest ?? offlineRolloutStateDigest(profile);
647
661
  const dependencies = dependencyManifest(profile, images, effectiveRolloutStateDigest);
648
662
  const application = applicationManifest(profile, images, effectiveRolloutStateDigest);
649
- const migration = migrationManifest(profile, release, images);
663
+ const toolchain = (0, lockfile_1.readManifest)(projectRoot)?.toolchain ?? (0, toolchain_1.resolveToolchain)();
664
+ const migration = migrationManifest(profile, release, images, (0, toolchain_1.toolchainMigrationCommand)(toolchain));
650
665
  chart(dependencyChart, "podokit-dependencies", dependencies);
651
666
  chart(applicationChart, "podokit-application", application);
652
667
  (0, node_fs_1.writeFileSync)((0, node_path_1.join)(root, "migration.yaml"), migration);
@@ -29,7 +29,12 @@ const IMAGE_TAG = /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/;
29
29
  exports.SENSITIVE_KEY = /(password|passphrase|secret|token|private.?key|credential|access.?key|api.?keys?|signing.?key|encryption.?key)/i;
30
30
  exports.STABLE_SEMVER_TAG_PATTERN = "^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$";
31
31
  /** Keys PodoKit derives itself, so a profile may not set them. */
32
- exports.MANAGED_RUNTIME_CONFIG_KEYS = ["PORT", "BACKEND_INTERNAL_URL"];
32
+ exports.MANAGED_RUNTIME_CONFIG_KEYS = [
33
+ "PORT",
34
+ "BACKEND_INTERNAL_URL",
35
+ "PROTOCOL_HEADER",
36
+ "HOST_HEADER",
37
+ ];
33
38
  function containsUrlCredentials(value) {
34
39
  if (!value.includes("://"))
35
40
  return false;
package/dist/dev.d.ts CHANGED
@@ -2,6 +2,7 @@ export interface DevConfig {
2
2
  schemaVersion: 1;
3
3
  hostname: string;
4
4
  publicUrl?: string;
5
+ webSocketPaths: string[];
5
6
  }
6
7
  export interface DevRuntime {
7
8
  alias: string;
package/dist/dev.js CHANGED
@@ -12,9 +12,12 @@ const node_fs_1 = require("node:fs");
12
12
  const node_os_1 = require("node:os");
13
13
  const node_path_1 = require("node:path");
14
14
  const lockfile_1 = require("./lockfile");
15
+ const websocket_paths_1 = require("./websocket-paths");
15
16
  const GATEWAY_CONTAINER = "podokit-dev-gateway";
16
17
  const GATEWAY_IMAGE = "traefik:v3.5";
17
18
  const GATEWAY_LABEL = "io.podosoft.podokit.dev-gateway";
19
+ const GATEWAY_VERSION = "2";
20
+ const GATEWAY_VERSION_LABEL = "io.podosoft.podokit.dev-gateway.version";
18
21
  const GATEWAY_NETWORK = "podokit-dev-gateway";
19
22
  const RUNTIME_COMPOSE = ".podokit/runtime/dev.compose.yaml";
20
23
  const DEV_CONFIG = ".podokit/dev.json";
@@ -59,7 +62,12 @@ function validatePublicUrl(publicUrl) {
59
62
  catch {
60
63
  throw new Error(`Invalid publicUrl "${publicUrl}". Use an absolute HTTPS URL.`);
61
64
  }
62
- if (parsed.protocol !== "https:" || parsed.pathname !== "/" || parsed.search || parsed.hash) {
65
+ if (parsed.protocol !== "https:" ||
66
+ parsed.username ||
67
+ parsed.password ||
68
+ parsed.pathname !== "/" ||
69
+ parsed.search ||
70
+ parsed.hash) {
63
71
  throw new Error(`Invalid publicUrl "${publicUrl}". Use an HTTPS origin without a path.`);
64
72
  }
65
73
  }
@@ -73,14 +81,17 @@ function readDevConfig(projectRoot) {
73
81
  throw new Error("PodoKit manifest is missing answers.projectName.");
74
82
  const config = (0, node_fs_1.existsSync)(path)
75
83
  ? parseJson(path)
76
- : { schemaVersion: 1, hostname: `${fallbackName}.localhost` };
84
+ : { schemaVersion: 1, hostname: `${fallbackName}.localhost`, webSocketPaths: [] };
77
85
  if (config.schemaVersion !== 1) {
78
86
  throw new Error(`Unsupported ${DEV_CONFIG} schemaVersion: ${String(config.schemaVersion)}`);
79
87
  }
80
88
  validateHostname(config.hostname);
81
89
  if (config.publicUrl)
82
90
  validatePublicUrl(config.publicUrl);
83
- return config;
91
+ return {
92
+ ...config,
93
+ webSocketPaths: (0, websocket_paths_1.parseExactWebSocketPaths)(config.webSocketPaths ?? [], `${DEV_CONFIG}.webSocketPaths`),
94
+ };
84
95
  }
85
96
  function stableId(projectRoot) {
86
97
  return (0, node_crypto_1.createHash)("sha256").update(projectRoot).digest("hex").slice(0, 10);
@@ -113,11 +124,23 @@ function installedDevProfiles(projectRoot) {
113
124
  ];
114
125
  }
115
126
  function renderRuntimeCompose(runtime) {
116
- return `# Generated by podo dev. Do not edit.\nservices:\n traefik:\n profiles: [podokit-legacy-proxy]\n web:\n networks:\n ${GATEWAY_NETWORK}:\n aliases: [${runtime.alias}]\nnetworks:\n ${GATEWAY_NETWORK}:\n external: true\n name: ${GATEWAY_NETWORK}\n`;
127
+ const api = runtime.config.webSocketPaths.length
128
+ ? ` api:\n networks:\n ${GATEWAY_NETWORK}:\n aliases: [${runtime.alias}-api]\n`
129
+ : "";
130
+ return `# Generated by podo dev. Do not edit.\nservices:\n traefik:\n profiles: [podokit-legacy-proxy]\n web:\n networks:\n ${GATEWAY_NETWORK}:\n aliases: [${runtime.alias}]\n${api}networks:\n ${GATEWAY_NETWORK}:\n external: true\n name: ${GATEWAY_NETWORK}\n`;
117
131
  }
118
132
  function renderRoute(runtime) {
119
133
  const { alias, config, routeId } = runtime;
120
- return `http:\n routers:\n ${routeId}:\n entryPoints: [web]\n rule: Host(\`${config.hostname}\`)\n service: ${routeId}\n middlewares: [${routeId}-compression]\n services:\n ${routeId}:\n loadBalancer:\n servers:\n - url: http://${alias}:5001\n middlewares:\n ${routeId}-compression:\n compress: {}\n`;
134
+ const hosts = routeHosts(config);
135
+ const hostRule = hosts.map((host) => `Host(\`${host}\`)`).join(" || ");
136
+ const webSocketHostRule = hosts.length > 1 ? `(${hostRule})` : hostRule;
137
+ const webSocketRouter = config.webSocketPaths.length
138
+ ? ` ${routeId}-websocket:\n entryPoints: [web]\n rule: ${webSocketHostRule} && Path(${config.webSocketPaths.map((path) => `\`${path}\``).join(", ")})\n priority: 100\n service: ${routeId}-api\n`
139
+ : "";
140
+ const apiService = config.webSocketPaths.length
141
+ ? ` ${routeId}-api:\n loadBalancer:\n servers:\n - url: http://${alias}-api:5002\n`
142
+ : "";
143
+ return `http:\n routers:\n${webSocketRouter} ${routeId}:\n entryPoints: [web]\n rule: ${hostRule}\n service: ${routeId}\n middlewares: [${routeId}-compression]\n services:\n${apiService} ${routeId}:\n loadBalancer:\n servers:\n - url: http://${alias}:5001\n middlewares:\n ${routeId}-compression:\n compress: {}\n`;
121
144
  }
122
145
  function devHome() {
123
146
  return process.env.PODOKIT_DEV_HOME ?? (0, node_path_1.join)((0, node_os_1.homedir)(), ".podokit", "dev-gateway");
@@ -134,6 +157,14 @@ function registryPath(runtime) {
134
157
  function routePath(runtime) {
135
158
  return (0, node_path_1.join)(routesDirectory(), `${runtime.routeId}.yml`);
136
159
  }
160
+ function routeHosts(config) {
161
+ return [
162
+ ...new Set([
163
+ config.hostname,
164
+ ...(config.publicUrl ? [new URL(config.publicUrl).hostname] : []),
165
+ ]),
166
+ ];
167
+ }
137
168
  function activeEntries() {
138
169
  const dir = registryDirectory();
139
170
  if (!(0, node_fs_1.existsSync)(dir))
@@ -157,9 +188,12 @@ function writeRuntimeFiles(runtime) {
157
188
  }
158
189
  function registerRoute(runtime) {
159
190
  const entries = activeEntries();
160
- const collision = entries.find((entry) => entry.hostname === runtime.config.hostname && entry.projectRoot !== runtime.projectRoot);
191
+ const requestedHosts = new Set(routeHosts(runtime.config));
192
+ const collision = entries.find((entry) => entry.projectRoot !== runtime.projectRoot &&
193
+ routeHosts(entry).some((hostname) => requestedHosts.has(hostname)));
161
194
  if (collision) {
162
- throw new Error(`Development hostname ${runtime.config.hostname} is already registered by ${collision.projectRoot}. Change .podokit/dev.json or run podo dev down there.`);
195
+ const duplicate = routeHosts(collision).find((hostname) => requestedHosts.has(hostname));
196
+ throw new Error(`Development host ${duplicate ?? runtime.config.hostname} is already registered by ${collision.projectRoot}. Change .podokit/dev.json or run podo dev down there.`);
163
197
  }
164
198
  for (const stale of entries.filter((entry) => entry.projectRoot === runtime.projectRoot && entry.routeId !== runtime.routeId)) {
165
199
  (0, node_fs_1.rmSync)((0, node_path_1.join)(registryDirectory(), `${stale.routeId}.json`), { force: true });
@@ -170,6 +204,7 @@ function registerRoute(runtime) {
170
204
  (0, node_fs_1.writeFileSync)(routePath(runtime), renderRoute(runtime));
171
205
  const entry = {
172
206
  hostname: runtime.config.hostname,
207
+ ...(runtime.config.publicUrl ? { publicUrl: runtime.config.publicUrl } : {}),
173
208
  projectRoot: runtime.projectRoot,
174
209
  routeId: runtime.routeId,
175
210
  };
@@ -198,19 +233,30 @@ function ensureNetwork(runner) {
198
233
  }
199
234
  }
200
235
  function ensureGateway(runner) {
201
- const inspect = runner("docker", ["inspect", "--format", `{{ index .Config.Labels \"${GATEWAY_LABEL}\" }} {{.State.Running}}`, GATEWAY_CONTAINER], { capture: true });
236
+ const inspect = runner("docker", [
237
+ "inspect",
238
+ "--format",
239
+ `{{ index .Config.Labels \"${GATEWAY_LABEL}\" }} {{.State.Running}} {{ index .Config.Labels \"${GATEWAY_VERSION_LABEL}\" }}`,
240
+ GATEWAY_CONTAINER,
241
+ ], { capture: true });
202
242
  if (commandSucceeded(inspect)) {
203
- const [label, running] = inspect.stdout.trim().split(/\s+/);
243
+ const [label, running, version] = inspect.stdout.trim().split(/\s+/);
204
244
  if (label !== "1") {
205
245
  throw new Error(`Container ${GATEWAY_CONTAINER} exists but is not managed by PodoKit.`);
206
246
  }
207
- if (running !== "true") {
208
- const start = runner("docker", ["start", GATEWAY_CONTAINER], { capture: true });
209
- if (!commandSucceeded(start)) {
210
- throw new Error(`Cannot start ${GATEWAY_CONTAINER}: ${start.stderr.trim()}`);
247
+ if (version === GATEWAY_VERSION) {
248
+ if (running !== "true") {
249
+ const start = runner("docker", ["start", GATEWAY_CONTAINER], { capture: true });
250
+ if (!commandSucceeded(start)) {
251
+ throw new Error(`Cannot start ${GATEWAY_CONTAINER}: ${start.stderr.trim()}`);
252
+ }
211
253
  }
254
+ return;
255
+ }
256
+ const remove = runner("docker", ["rm", "--force", GATEWAY_CONTAINER], { capture: true });
257
+ if (!commandSucceeded(remove)) {
258
+ throw new Error(`Cannot upgrade ${GATEWAY_CONTAINER}: ${remove.stderr.trim()}`);
212
259
  }
213
- return;
214
260
  }
215
261
  (0, node_fs_1.mkdirSync)(routesDirectory(), { recursive: true });
216
262
  const run = runner("docker", [
@@ -220,6 +266,8 @@ function ensureGateway(runner) {
220
266
  GATEWAY_CONTAINER,
221
267
  "--label",
222
268
  `${GATEWAY_LABEL}=1`,
269
+ "--label",
270
+ `${GATEWAY_VERSION_LABEL}=${GATEWAY_VERSION}`,
223
271
  "--restart",
224
272
  "unless-stopped",
225
273
  "--network",
@@ -232,6 +280,7 @@ function ensureGateway(runner) {
232
280
  "--providers.file.directory=/etc/traefik/dynamic",
233
281
  "--providers.file.watch=true",
234
282
  "--entrypoints.web.address=:80",
283
+ "--entrypoints.web.forwardedheaders.insecure=true",
235
284
  "--api.dashboard=false",
236
285
  ], { capture: true });
237
286
  if (!commandSucceeded(run)) {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import { type PackageManager } from "./create";
3
2
  import { type LocaleDirection } from "./locale";
4
3
  import { type DeployDriver } from "./deploy-driver";
5
4
  interface ParsedArgs {
@@ -7,7 +6,8 @@ interface ParsedArgs {
7
6
  name?: string;
8
7
  template?: string;
9
8
  dir?: string;
10
- pm?: PackageManager;
9
+ pm?: string;
10
+ runtime?: string;
11
11
  from?: string;
12
12
  apply: boolean;
13
13
  adopt: boolean;
package/dist/index.js CHANGED
@@ -41,7 +41,7 @@ Usage:
41
41
  Options:
42
42
  --template <t> Template to scaffold (see below)
43
43
  --dir <path> Target directory (default: ./<name>)
44
- --pm <name> Package manager: npm | pnpm | yarn (default: npm)
44
+ --runtime bun Optional explicit Bun runtime selection
45
45
  --name <label> Display name for a locale
46
46
  --direction <direction> Text direction: ltr | rtl (default: ltr)
47
47
  --profile <name> Deployment profile name
@@ -63,7 +63,8 @@ ${(0, templates_1.templateListText)()}
63
63
  Example:
64
64
  npx @podosoft/podokit create my-app
65
65
  npx @podosoft/podokit create my-app --template todo
66
- cd my-app && npx @podosoft/podokit add auth
66
+ bunx --bun @podosoft/podokit create my-app
67
+ cd my-app && bunx --bun @podosoft/podokit add auth
67
68
  `;
68
69
  const DEPLOY_HELP = `podo deploy — release an application to Kubernetes or Docker Compose
69
70
 
@@ -139,6 +140,9 @@ function parseArgs(argv) {
139
140
  else if (arg === "--pm") {
140
141
  parsed.pm = argv[++i];
141
142
  }
143
+ else if (arg === "--runtime") {
144
+ parsed.runtime = argv[++i];
145
+ }
142
146
  else if (arg === "--name") {
143
147
  parsed.localeName = argv[++i];
144
148
  }
@@ -395,11 +399,13 @@ async function main(argv) {
395
399
  const s = (0, inspect_1.status)(process.cwd());
396
400
  const tiers = `managed ${s.tiers.managed}, assembled ${s.tiers.assembled}, owned ${s.tiers.owned}`;
397
401
  const modules = s.moduleDetails.map((module) => module.version ? `${module.name}@${module.version}` : module.name);
398
- process.stdout.write(`PodoKit ${s.podokitVersion} (template: ${s.template}, ${s.packageManager})\n` +
399
- `Modules: ${modules.length ? modules.join(", ") : "(none)"}\n` +
400
- `Files: ${tiers}\n` +
401
- `Edited: ${s.drifted.length} managed file(s)${s.missing.length ? `, ${s.missing.length} missing` : ""}\n` +
402
- (s.drifted.length ? s.drifted.map((f) => ` ~ ${f}`).join("\n") + "\n" : ""));
402
+ process.stdout.write(args.json
403
+ ? `${JSON.stringify(s, null, 2)}\n`
404
+ : `PodoKit ${s.podokitVersion} (template: ${s.template}, ${s.runtime} ${s.runtimeVersion}, ${s.packageManager})\n` +
405
+ `Modules: ${modules.length ? modules.join(", ") : "(none)"}\n` +
406
+ `Files: ${tiers}\n` +
407
+ `Edited: ${s.drifted.length} managed file(s)${s.missing.length ? `, ${s.missing.length} missing` : ""}\n` +
408
+ (s.drifted.length ? s.drifted.map((f) => ` ~ ${f}`).join("\n") + "\n" : ""));
403
409
  }
404
410
  catch (err) {
405
411
  fail(err.message);
@@ -681,13 +687,13 @@ async function main(argv) {
681
687
  }
682
688
  const templatesDir = (0, node_path_1.join)(__dirname, "templates");
683
689
  try {
684
- const resolved = await (0, prompt_1.resolveCreateOptions)({ template: args.template, pm: args.pm }, ask, interactive);
690
+ const resolved = await (0, prompt_1.resolveCreateOptions)({ template: args.template, pm: args.pm, runtime: args.runtime }, ask, interactive);
685
691
  const result = (0, create_1.create)({
686
692
  name: args.name,
687
693
  templatesDir,
688
694
  template: resolved.template,
689
695
  targetDir: args.dir,
690
- packageManager: resolved.packageManager,
696
+ runtime: resolved.toolchain.runtime,
691
697
  ai: args.ai,
692
698
  });
693
699
  const relPath = (0, node_path_1.relative)(process.cwd(), result.projectDir) || ".";
package/dist/inspect.d.ts CHANGED
@@ -7,6 +7,8 @@ export interface StatusReport {
7
7
  podokitVersion: string;
8
8
  template: string;
9
9
  packageManager: string;
10
+ runtime: string;
11
+ runtimeVersion: string;
10
12
  modules: string[];
11
13
  moduleDetails: {
12
14
  name: string;
@@ -43,6 +45,6 @@ export declare const SUPPORTED_FRAMEWORKS: Record<string, {
43
45
  range: string;
44
46
  majors: number[];
45
47
  }>;
46
- /** Parse the leading major from a semver range like `^11.1.0` or `>=1.6.23 <1.7`. */
48
+ /** Parse the leading major from a semver range like `^1.4.29` or `>=1.7.1 <1.8`. */
47
49
  export declare function leadingMajor(range: string): number | null;
48
50
  export declare function doctor(projectRoot: string): DoctorFinding[];
package/dist/inspect.js CHANGED
@@ -27,7 +27,9 @@ function status(projectRoot) {
27
27
  return {
28
28
  podokitVersion: manifest.podokitVersion,
29
29
  template: manifest.template,
30
- packageManager: manifest.packageManager,
30
+ packageManager: manifest.toolchain.packageManager,
31
+ runtime: manifest.toolchain.runtime,
32
+ runtimeVersion: manifest.toolchain.runtimeVersion,
31
33
  modules: manifest.modules.map((m) => m.name),
32
34
  moduleDetails: manifest.modules.map((m) => ({
33
35
  name: m.name,
@@ -51,8 +53,8 @@ function diff(projectRoot) {
51
53
  * `@podosoft/*` extensions still match.
52
54
  */
53
55
  exports.SUPPORTED_FRAMEWORKS = {
54
- "@nestjs/core": { app: "api", range: "^11", majors: [11] },
55
- "better-auth": { app: "api", range: ">=1.6.23 <1.7", majors: [1] },
56
+ elysia: { app: "api", range: "^1.4", majors: [1] },
57
+ "better-auth": { app: "api", range: ">=1.7.1 <1.8", majors: [1] },
56
58
  svelte: { app: "web", range: "^5", majors: [5] },
57
59
  };
58
60
  function declaredVersion(projectRoot, app, pkg) {
@@ -62,7 +64,7 @@ function declaredVersion(projectRoot, app, pkg) {
62
64
  const json = JSON.parse((0, node_fs_1.readFileSync)(file, "utf8"));
63
65
  return json.dependencies?.[pkg] ?? json.devDependencies?.[pkg] ?? null;
64
66
  }
65
- /** Parse the leading major from a semver range like `^11.1.0` or `>=1.6.23 <1.7`. */
67
+ /** Parse the leading major from a semver range like `^1.4.29` or `>=1.7.1 <1.8`. */
66
68
  function leadingMajor(range) {
67
69
  const match = range.match(/(\d+)\./);
68
70
  return match ? Number(match[1]) : null;
@@ -1,9 +1,11 @@
1
+ import type { TemplateVars } from "@podosoft/podokit-template-engine";
2
+ import { type Toolchain } from "./toolchain";
1
3
  /**
2
4
  * The generation lockfile (`.podokit/`) records how a project was assembled so
3
5
  * `podo update` can rebuild the same inputs and detect user edits. See
4
6
  * ADR-0009 (update mechanism) and ADR-0010 (ownership model).
5
7
  */
6
- export declare const LOCK_SCHEMA_VERSION = 2;
8
+ export declare const LOCK_SCHEMA_VERSION = 3;
7
9
  /** File ownership tier. See ADR-0010. */
8
10
  export type Tier = "managed" | "assembled" | "owned";
9
11
  export interface ManifestModule {
@@ -29,7 +31,8 @@ export interface PodokitManifest {
29
31
  schemaVersion: number;
30
32
  podokitVersion: string;
31
33
  template: string;
32
- packageManager: string;
34
+ /** Runtime and package manager selected for generated and converted projects. */
35
+ toolchain: Toolchain;
33
36
  /** Render vars / prompt answers, replayed on update (copier-style). */
34
37
  answers: Record<string, string>;
35
38
  modules: ManifestModule[];
@@ -63,6 +66,8 @@ export declare function manifestPath(projectRoot: string): string;
63
66
  export declare function filesLockPath(projectRoot: string): string;
64
67
  export declare function readManifest(projectRoot: string): PodokitManifest | null;
65
68
  export declare function writeManifest(projectRoot: string, manifest: PodokitManifest): void;
69
+ /** Complete replay variables for a Bun-only v1 project. */
70
+ export declare function manifestTemplateVars(manifest: PodokitManifest): TemplateVars;
66
71
  export declare function writeFilesLock(projectRoot: string, lock: FilesLock): void;
67
72
  /** Read the PodoKit CLI's own version to stamp into the manifest. */
68
73
  export declare function podokitVersion(): string;
@@ -89,7 +94,7 @@ export interface Drift {
89
94
  export declare function computeDrift(projectRoot: string): Drift;
90
95
  export interface InitLockOptions {
91
96
  template: string;
92
- packageManager: string;
97
+ toolchain?: Toolchain;
93
98
  answers: Record<string, string>;
94
99
  version?: string;
95
100
  ownedGlobs?: string[];