devstack 0.1.0

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 (1450) hide show
  1. package/README.md +253 -0
  2. package/bin/audit-template-deps.ts +267 -0
  3. package/bin/cli.ts +5 -0
  4. package/bin/validate-tanstack-scaffold.ts +67 -0
  5. package/package.json +85 -0
  6. package/src/builders/index.ts +1 -0
  7. package/src/builders/separated.ts +1 -0
  8. package/src/builders/shared.ts +608 -0
  9. package/src/builders/tanstack-start.ts +2683 -0
  10. package/src/builders/types.ts +10 -0
  11. package/src/cli.ts +106 -0
  12. package/src/generator.ts +2946 -0
  13. package/src/index.ts +23 -0
  14. package/src/modules/auth.ts +33 -0
  15. package/src/modules/email.ts +38 -0
  16. package/src/modules/index.ts +30 -0
  17. package/src/modules/inngest.ts +58 -0
  18. package/src/modules/observability.ts +30 -0
  19. package/src/modules/organizations.ts +23 -0
  20. package/src/modules/redis.ts +35 -0
  21. package/src/modules/storage.ts +39 -0
  22. package/src/modules/storybook.ts +33 -0
  23. package/src/modules/stripe.ts +39 -0
  24. package/src/modules/types.ts +368 -0
  25. package/src/utils/files.ts +198 -0
  26. package/src/utils/packages.ts +59 -0
  27. package/src/utils/template-dependency-audit.ts +218 -0
  28. package/src/utils/template.ts +31 -0
  29. package/templates/base/backend/drizzle.config.ts +12 -0
  30. package/templates/base/backend/src/app.ts +65 -0
  31. package/templates/base/backend/src/db/index.ts +10 -0
  32. package/templates/base/backend/src/db/schema/index.ts +2 -0
  33. package/templates/base/backend/src/db/schema/items.ts +18 -0
  34. package/templates/base/backend/src/env.ts +78 -0
  35. package/templates/base/backend/src/index.ts +23 -0
  36. package/templates/base/backend/src/lib/errors.ts +205 -0
  37. package/templates/base/backend/src/lib/id.ts +5 -0
  38. package/templates/base/backend/src/lib/lazy.ts +14 -0
  39. package/templates/base/backend/src/lib/logger.ts +168 -0
  40. package/templates/base/backend/src/lib/openapi-schemas.ts +123 -0
  41. package/templates/base/backend/src/lib/openapi.ts +113 -0
  42. package/templates/base/backend/src/lib/pagination.ts +75 -0
  43. package/templates/base/backend/src/lib/response.ts +23 -0
  44. package/templates/base/backend/src/modules/items/index.ts +1 -0
  45. package/templates/base/backend/src/modules/items/model.ts +26 -0
  46. package/templates/base/backend/src/modules/items/repository.ts +30 -0
  47. package/templates/base/backend/src/modules/items/route.ts +93 -0
  48. package/templates/base/backend/src/modules/items/usecases.ts +67 -0
  49. package/templates/base/backend/src/plugins/error.ts +40 -0
  50. package/templates/base/backend/src/plugins/index.ts +7 -0
  51. package/templates/base/backend/src/plugins/logging.ts +20 -0
  52. package/templates/base/backend/src/plugins/metrics.ts +155 -0
  53. package/templates/base/backend/src/plugins/openapi.ts +17 -0
  54. package/templates/base/backend/src/plugins/request-id.ts +35 -0
  55. package/templates/base/backend/src/routes/health.ts +72 -0
  56. package/templates/base/backend/src/test-setup.ts +36 -0
  57. package/templates/base/backend/src/test-utils/db.ts +212 -0
  58. package/templates/base/backend/src/test-utils/factories.ts +16 -0
  59. package/templates/base/backend/src/test-utils/index.ts +3 -0
  60. package/templates/base/backend/src/test-utils/request.ts +72 -0
  61. package/templates/base/backend/src/types/index.ts +1 -0
  62. package/templates/base/backend/tsconfig.json +21 -0
  63. package/templates/base/backend/vitest.config.ts +26 -0
  64. package/templates/base/claude/skills/agent-browser/SKILL.md +629 -0
  65. package/templates/base/claude/skills/agent-browser/references/authentication.md +306 -0
  66. package/templates/base/claude/skills/agent-browser/references/commands.md +264 -0
  67. package/templates/base/claude/skills/agent-browser/references/profiling.md +120 -0
  68. package/templates/base/claude/skills/agent-browser/references/proxy-support.md +194 -0
  69. package/templates/base/claude/skills/agent-browser/references/session-management.md +194 -0
  70. package/templates/base/claude/skills/agent-browser/references/snapshot-refs.md +196 -0
  71. package/templates/base/claude/skills/agent-browser/references/video-recording.md +173 -0
  72. package/templates/base/claude/skills/agent-browser/templates/authenticated-session.sh +105 -0
  73. package/templates/base/claude/skills/agent-browser/templates/capture-workflow.sh +69 -0
  74. package/templates/base/claude/skills/agent-browser/templates/form-automation.sh +62 -0
  75. package/templates/base/claude/skills/alpine-js/SKILL.md +107 -0
  76. package/templates/base/claude/skills/better-auth-best-practices/SKILL.md +183 -0
  77. package/templates/base/claude/skills/es-toolkit/SKILL.md +281 -0
  78. package/templates/base/claude/skills/es-toolkit/references/api-catalog.md +234 -0
  79. package/templates/base/claude/skills/es-toolkit/references/lodash-migration.md +131 -0
  80. package/templates/base/claude/skills/hono/SKILL.md +90 -0
  81. package/templates/base/claude/skills/organization-best-practices/SKILL.md +478 -0
  82. package/templates/base/claude/skills/stripe-best-practices/SKILL.md +30 -0
  83. package/templates/base/claude/skills/stripe-integration/SKILL.md +492 -0
  84. package/templates/base/claude/skills/stripe-subscriptions/SKILL.md +54 -0
  85. package/templates/base/claude/skills/stripe-webhooks/SKILL.md +163 -0
  86. package/templates/base/claude/skills/stripe-webhooks/examples/express/.env.example +5 -0
  87. package/templates/base/claude/skills/stripe-webhooks/examples/express/README.md +64 -0
  88. package/templates/base/claude/skills/stripe-webhooks/examples/express/package.json +19 -0
  89. package/templates/base/claude/skills/stripe-webhooks/examples/express/src/index.js +75 -0
  90. package/templates/base/claude/skills/stripe-webhooks/examples/express/test/webhook.test.js +129 -0
  91. package/templates/base/claude/skills/stripe-webhooks/examples/fastapi/.env.example +5 -0
  92. package/templates/base/claude/skills/stripe-webhooks/examples/fastapi/README.md +69 -0
  93. package/templates/base/claude/skills/stripe-webhooks/examples/fastapi/main.py +75 -0
  94. package/templates/base/claude/skills/stripe-webhooks/examples/fastapi/requirements.txt +6 -0
  95. package/templates/base/claude/skills/stripe-webhooks/examples/fastapi/test_webhook.py +121 -0
  96. package/templates/base/claude/skills/stripe-webhooks/examples/nextjs/.env.example +5 -0
  97. package/templates/base/claude/skills/stripe-webhooks/examples/nextjs/README.md +62 -0
  98. package/templates/base/claude/skills/stripe-webhooks/examples/nextjs/app/webhooks/stripe/route.ts +63 -0
  99. package/templates/base/claude/skills/stripe-webhooks/examples/nextjs/package.json +23 -0
  100. package/templates/base/claude/skills/stripe-webhooks/examples/nextjs/test/webhook.test.ts +139 -0
  101. package/templates/base/claude/skills/stripe-webhooks/examples/nextjs/vitest.config.ts +8 -0
  102. package/templates/base/claude/skills/stripe-webhooks/references/overview.md +62 -0
  103. package/templates/base/claude/skills/stripe-webhooks/references/setup.md +99 -0
  104. package/templates/base/claude/skills/stripe-webhooks/references/verification.md +154 -0
  105. package/templates/base/claude/skills/svelte-code-writer/SKILL.md +66 -0
  106. package/templates/base/claude/skills/zod/AGENTS.md +97 -0
  107. package/templates/base/claude/skills/zod/README.md +79 -0
  108. package/templates/base/claude/skills/zod/SKILL.md +128 -0
  109. package/templates/base/claude/skills/zod/references/compose-intersection.md +143 -0
  110. package/templates/base/claude/skills/zod/references/compose-lazy-recursive.md +138 -0
  111. package/templates/base/claude/skills/zod/references/compose-pipe.md +114 -0
  112. package/templates/base/claude/skills/zod/references/compose-preprocess.md +131 -0
  113. package/templates/base/claude/skills/zod/references/compose-shared-schemas.md +142 -0
  114. package/templates/base/claude/skills/zod/references/error-avoid-throwing-in-refine.md +134 -0
  115. package/templates/base/claude/skills/zod/references/error-custom-messages.md +127 -0
  116. package/templates/base/claude/skills/zod/references/error-i18n.md +140 -0
  117. package/templates/base/claude/skills/zod/references/error-path-for-nested.md +135 -0
  118. package/templates/base/claude/skills/zod/references/error-use-flatten.md +135 -0
  119. package/templates/base/claude/skills/zod/references/object-discriminated-unions.md +136 -0
  120. package/templates/base/claude/skills/zod/references/object-extend-for-composition.md +146 -0
  121. package/templates/base/claude/skills/zod/references/object-optional-vs-nullable.md +120 -0
  122. package/templates/base/claude/skills/zod/references/object-partial-for-updates.md +124 -0
  123. package/templates/base/claude/skills/zod/references/object-pick-omit.md +147 -0
  124. package/templates/base/claude/skills/zod/references/object-strict-vs-strip.md +122 -0
  125. package/templates/base/claude/skills/zod/references/parse-async-for-async-refinements.md +127 -0
  126. package/templates/base/claude/skills/zod/references/parse-avoid-double-validation.md +130 -0
  127. package/templates/base/claude/skills/zod/references/parse-handle-all-issues.md +126 -0
  128. package/templates/base/claude/skills/zod/references/parse-never-trust-json.md +116 -0
  129. package/templates/base/claude/skills/zod/references/parse-use-safeparse.md +103 -0
  130. package/templates/base/claude/skills/zod/references/parse-validate-early.md +125 -0
  131. package/templates/base/claude/skills/zod/references/perf-arrays.md +154 -0
  132. package/templates/base/claude/skills/zod/references/perf-avoid-dynamic-creation.md +142 -0
  133. package/templates/base/claude/skills/zod/references/perf-cache-schemas.md +143 -0
  134. package/templates/base/claude/skills/zod/references/perf-lazy-loading.md +136 -0
  135. package/templates/base/claude/skills/zod/references/perf-zod-mini.md +118 -0
  136. package/templates/base/claude/skills/zod/references/refine-add-path.md +149 -0
  137. package/templates/base/claude/skills/zod/references/refine-catch.md +138 -0
  138. package/templates/base/claude/skills/zod/references/refine-defaults.md +132 -0
  139. package/templates/base/claude/skills/zod/references/refine-transform-coerce.md +103 -0
  140. package/templates/base/claude/skills/zod/references/refine-vs-superrefine.md +159 -0
  141. package/templates/base/claude/skills/zod/references/schema-avoid-optional-abuse.md +94 -0
  142. package/templates/base/claude/skills/zod/references/schema-coercion-for-form-data.md +89 -0
  143. package/templates/base/claude/skills/zod/references/schema-string-validations.md +87 -0
  144. package/templates/base/claude/skills/zod/references/schema-use-enums.md +106 -0
  145. package/templates/base/claude/skills/zod/references/schema-use-primitives-correctly.md +63 -0
  146. package/templates/base/claude/skills/zod/references/schema-use-unknown-not-any.md +86 -0
  147. package/templates/base/claude/skills/zod/references/type-branded-types.md +106 -0
  148. package/templates/base/claude/skills/zod/references/type-enable-strict-mode.md +132 -0
  149. package/templates/base/claude/skills/zod/references/type-export-schemas-and-types.md +117 -0
  150. package/templates/base/claude/skills/zod/references/type-input-vs-output.md +116 -0
  151. package/templates/base/claude/skills/zod/references/type-use-z-infer.md +113 -0
  152. package/templates/base/frontend/components.json +25 -0
  153. package/templates/base/frontend/index.html +17 -0
  154. package/templates/base/frontend/src/App.test.tsx +13 -0
  155. package/templates/base/frontend/src/App.tsx +11 -0
  156. package/templates/base/frontend/src/components/app-sidebar.tsx +89 -0
  157. package/templates/base/frontend/src/components/app-topbar.tsx +28 -0
  158. package/templates/base/frontend/src/components/nav-secondary.tsx +38 -0
  159. package/templates/base/frontend/src/components/nav-user.tsx +93 -0
  160. package/templates/base/frontend/src/components/theme-toggle.tsx +29 -0
  161. package/templates/base/frontend/src/components/ui/accordion.tsx +72 -0
  162. package/templates/base/frontend/src/components/ui/alert-dialog.tsx +160 -0
  163. package/templates/base/frontend/src/components/ui/alert.tsx +69 -0
  164. package/templates/base/frontend/src/components/ui/aspect-ratio.tsx +22 -0
  165. package/templates/base/frontend/src/components/ui/avatar.tsx +91 -0
  166. package/templates/base/frontend/src/components/ui/badge.tsx +50 -0
  167. package/templates/base/frontend/src/components/ui/banner.tsx +34 -0
  168. package/templates/base/frontend/src/components/ui/breadcrumb.tsx +103 -0
  169. package/templates/base/frontend/src/components/ui/button-group.tsx +78 -0
  170. package/templates/base/frontend/src/components/ui/button.tsx +61 -0
  171. package/templates/base/frontend/src/components/ui/calendar.tsx +185 -0
  172. package/templates/base/frontend/src/components/ui/card.tsx +92 -0
  173. package/templates/base/frontend/src/components/ui/carousel.tsx +229 -0
  174. package/templates/base/frontend/src/components/ui/chart.tsx +323 -0
  175. package/templates/base/frontend/src/components/ui/checkbox.tsx +28 -0
  176. package/templates/base/frontend/src/components/ui/collapsible.tsx +15 -0
  177. package/templates/base/frontend/src/components/ui/combobox.tsx +273 -0
  178. package/templates/base/frontend/src/components/ui/command.tsx +179 -0
  179. package/templates/base/frontend/src/components/ui/context-menu.tsx +245 -0
  180. package/templates/base/frontend/src/components/ui/dialog.tsx +138 -0
  181. package/templates/base/frontend/src/components/ui/direction.tsx +1 -0
  182. package/templates/base/frontend/src/components/ui/drawer.tsx +118 -0
  183. package/templates/base/frontend/src/components/ui/dropdown-menu.tsx +258 -0
  184. package/templates/base/frontend/src/components/ui/empty.tsx +94 -0
  185. package/templates/base/frontend/src/components/ui/field.tsx +224 -0
  186. package/templates/base/frontend/src/components/ui/hover-card.tsx +44 -0
  187. package/templates/base/frontend/src/components/ui/input-group.tsx +146 -0
  188. package/templates/base/frontend/src/components/ui/input-otp.tsx +86 -0
  189. package/templates/base/frontend/src/components/ui/input.tsx +20 -0
  190. package/templates/base/frontend/src/components/ui/item.tsx +188 -0
  191. package/templates/base/frontend/src/components/ui/kbd.tsx +26 -0
  192. package/templates/base/frontend/src/components/ui/label.tsx +20 -0
  193. package/templates/base/frontend/src/components/ui/menubar.tsx +265 -0
  194. package/templates/base/frontend/src/components/ui/native-select.tsx +43 -0
  195. package/templates/base/frontend/src/components/ui/navigation-menu.tsx +161 -0
  196. package/templates/base/frontend/src/components/ui/pagination.tsx +118 -0
  197. package/templates/base/frontend/src/components/ui/popover.tsx +77 -0
  198. package/templates/base/frontend/src/components/ui/progress.tsx +64 -0
  199. package/templates/base/frontend/src/components/ui/radio-group.tsx +38 -0
  200. package/templates/base/frontend/src/components/ui/resizable.tsx +40 -0
  201. package/templates/base/frontend/src/components/ui/scroll-area.tsx +50 -0
  202. package/templates/base/frontend/src/components/ui/select.tsx +188 -0
  203. package/templates/base/frontend/src/components/ui/separator.tsx +19 -0
  204. package/templates/base/frontend/src/components/ui/sheet.tsx +123 -0
  205. package/templates/base/frontend/src/components/ui/sidebar.tsx +694 -0
  206. package/templates/base/frontend/src/components/ui/skeleton.tsx +13 -0
  207. package/templates/base/frontend/src/components/ui/slider.tsx +52 -0
  208. package/templates/base/frontend/src/components/ui/sonner.tsx +43 -0
  209. package/templates/base/frontend/src/components/ui/spinner.tsx +15 -0
  210. package/templates/base/frontend/src/components/ui/surface.tsx +15 -0
  211. package/templates/base/frontend/src/components/ui/switch.tsx +30 -0
  212. package/templates/base/frontend/src/components/ui/table.tsx +98 -0
  213. package/templates/base/frontend/src/components/ui/tabs.tsx +75 -0
  214. package/templates/base/frontend/src/components/ui/textarea.tsx +18 -0
  215. package/templates/base/frontend/src/components/ui/toggle-group.tsx +87 -0
  216. package/templates/base/frontend/src/components/ui/toggle.tsx +42 -0
  217. package/templates/base/frontend/src/components/ui/tooltip.tsx +54 -0
  218. package/templates/base/frontend/src/hooks/use-mobile.ts +19 -0
  219. package/templates/base/frontend/src/integrations/tanstack-query/devtools.tsx +6 -0
  220. package/templates/base/frontend/src/integrations/tanstack-query/root-provider.tsx +18 -0
  221. package/templates/base/frontend/src/lib/utils.ts +6 -0
  222. package/templates/base/frontend/src/main.tsx +39 -0
  223. package/templates/base/frontend/src/routeTree.gen.ts +102 -0
  224. package/templates/base/frontend/src/routes/__root.tsx +16 -0
  225. package/templates/base/frontend/src/routes/_app/index.tsx +122 -0
  226. package/templates/base/frontend/src/routes/_app/settings.tsx +137 -0
  227. package/templates/base/frontend/src/routes/_app.tsx +19 -0
  228. package/templates/base/frontend/src/stores/use-theme-store.ts +92 -0
  229. package/templates/base/frontend/src/styles.css +146 -0
  230. package/templates/base/frontend/src/test-setup.ts +24 -0
  231. package/templates/base/frontend/tsconfig.json +27 -0
  232. package/templates/base/frontend/vite.config.ts +30 -0
  233. package/templates/base/frontend/vitest.config.ts +20 -0
  234. package/templates/base/root/.editorconfig +35 -0
  235. package/templates/base/root/.github/actions/setup-bun/action.yml +48 -0
  236. package/templates/base/root/.github/workflows/ci.yaml +66 -0
  237. package/templates/base/root/.husky/commit-msg +4 -0
  238. package/templates/base/root/.husky/pre-commit +4 -0
  239. package/templates/base/root/.nvmrc +2 -0
  240. package/templates/base/root/.oxfmtrc.json +33 -0
  241. package/templates/base/root/.oxlintrc.json +179 -0
  242. package/templates/base/root/CLAUDE.md +40 -0
  243. package/templates/base/root/Makefile +57 -0
  244. package/templates/base/root/commitlint.config.ts +3 -0
  245. package/templates/base/root/docker/postgres/init-test-db.sh +12 -0
  246. package/templates/base/root/lint-plugins/react-component-complexity.mjs +282 -0
  247. package/templates/base/root/lint-plugins/react-hooks-separation-codemod.mjs +1078 -0
  248. package/templates/base/root/lint-plugins/react-hooks-separation.mjs +243 -0
  249. package/templates/base/root/lint-plugins/test-file-location.mjs +104 -0
  250. package/templates/base/root/tsconfig.base.json +15 -0
  251. package/templates/base/root/tsconfig.json +16 -0
  252. package/templates/modules/auth/packages/backend/src/db/schema/auth.ts +145 -0
  253. package/templates/modules/auth/packages/backend/src/lib/auth/auth-context.ts +28 -0
  254. package/templates/modules/auth/packages/backend/src/lib/auth/auth.ts +97 -0
  255. package/templates/modules/auth/packages/backend/src/plugins/auth.ts +82 -0
  256. package/templates/modules/auth/src/db/schema/auth.ts +87 -0
  257. package/templates/modules/auth/src/lib/auth/auth-context.ts +23 -0
  258. package/templates/modules/auth/src/lib/auth/auth.ts +53 -0
  259. package/templates/modules/auth/src/lib/auth/index.ts +2 -0
  260. package/templates/modules/auth/src/plugins/auth.ts +52 -0
  261. package/templates/modules/email/packages/backend/src/lib/emails/send.tsx +58 -0
  262. package/templates/modules/email/packages/backend/src/lib/emails/templates/base.tsx +26 -0
  263. package/templates/modules/email/src/lib/emails/index.ts +1 -0
  264. package/templates/modules/email/src/lib/emails/send.ts +63 -0
  265. package/templates/modules/email/src/lib/emails/templates/layout.tsx +34 -0
  266. package/templates/modules/email/src/lib/integrations/resend.ts +10 -0
  267. package/templates/modules/inngest/packages/backend/src/jobs/example.ts +12 -0
  268. package/templates/modules/inngest/packages/backend/src/jobs/index.ts +3 -0
  269. package/templates/modules/inngest/packages/backend/src/lib/inngest.ts +39 -0
  270. package/templates/modules/inngest/src/jobs/example.ts +12 -0
  271. package/templates/modules/inngest/src/jobs/index.ts +3 -0
  272. package/templates/modules/inngest/src/lib/inngest.ts +28 -0
  273. package/templates/modules/observability/packages/backend/src/lib/sentry.ts +25 -0
  274. package/templates/modules/observability/packages/backend/src/lib/tracing.ts +125 -0
  275. package/templates/modules/observability/src/lib/sentry.ts +20 -0
  276. package/templates/modules/observability/src/lib/tracing.ts +77 -0
  277. package/templates/modules/organizations/packages/backend/src/lib/auth/org-context.ts +33 -0
  278. package/templates/modules/organizations/packages/backend/src/lib/auth/permissions.ts +43 -0
  279. package/templates/modules/organizations/src/db/schema/auth.ts +147 -0
  280. package/templates/modules/organizations/src/lib/auth/auth.ts +90 -0
  281. package/templates/modules/organizations/src/lib/auth/org-context.ts +33 -0
  282. package/templates/modules/organizations/src/lib/auth/permissions.ts +47 -0
  283. package/templates/modules/organizations/src/plugins/auth.ts +68 -0
  284. package/templates/modules/redis/packages/backend/src/lib/redis.ts +65 -0
  285. package/templates/modules/redis/packages/backend/src/plugins/rate-limiter.ts +51 -0
  286. package/templates/modules/redis/src/lib/redis.ts +30 -0
  287. package/templates/modules/redis/src/plugins/rate-limiter.ts +60 -0
  288. package/templates/modules/storage/packages/backend/src/lib/storage/client.ts +64 -0
  289. package/templates/modules/storage/packages/backend/src/lib/storage/index.ts +2 -0
  290. package/templates/modules/storage/packages/backend/src/lib/storage/init.ts +30 -0
  291. package/templates/modules/storage/src/lib/storage/client.ts +42 -0
  292. package/templates/modules/storage/src/lib/storage/index.ts +1 -0
  293. package/templates/modules/storybook/packages/frontend/.storybook/main.ts +17 -0
  294. package/templates/modules/storybook/packages/frontend/.storybook/preview.tsx +17 -0
  295. package/templates/modules/storybook/packages/frontend/src/components/ui/button.stories.tsx +17 -0
  296. package/templates/modules/stripe/packages/backend/src/db/schema/billing.ts +102 -0
  297. package/templates/modules/stripe/packages/backend/src/lib/billing.ts +31 -0
  298. package/templates/modules/stripe/packages/backend/src/lib/integrations/stripe.ts +52 -0
  299. package/templates/modules/stripe/packages/backend/src/modules/billing/index.ts +1 -0
  300. package/templates/modules/stripe/packages/backend/src/modules/billing/model.ts +45 -0
  301. package/templates/modules/stripe/packages/backend/src/modules/billing/repository.ts +87 -0
  302. package/templates/modules/stripe/packages/backend/src/modules/billing/route.ts +42 -0
  303. package/templates/modules/stripe/packages/backend/src/modules/billing/usecases.ts +97 -0
  304. package/templates/modules/stripe/packages/backend/src/routes/webhooks.ts +25 -0
  305. package/templates/modules/stripe/src/db/schema/billing.ts +90 -0
  306. package/templates/modules/stripe/src/lib/billing.ts +33 -0
  307. package/templates/modules/stripe/src/lib/integrations/stripe.ts +46 -0
  308. package/templates/modules/stripe/src/modules/billing/index.ts +1 -0
  309. package/templates/modules/stripe/src/modules/billing/model.ts +55 -0
  310. package/templates/modules/stripe/src/modules/billing/repository.ts +48 -0
  311. package/templates/modules/stripe/src/modules/billing/route.ts +97 -0
  312. package/templates/modules/stripe/src/modules/billing/usecases.ts +92 -0
  313. package/templates/modules/stripe/src/routes/webhooks.ts +57 -0
  314. package/vendor/skills/README.md +244 -0
  315. package/vendor/skills/skills/a11y-testing/SKILL.md +169 -0
  316. package/vendor/skills/skills/a11y-testing/checklists/a11y-testing-checklist.md +298 -0
  317. package/vendor/skills/skills/a11y-testing/examples/a11y-testing-examples.md +615 -0
  318. package/vendor/skills/skills/a11y-testing/references/a11y-testing-tools.md +383 -0
  319. package/vendor/skills/skills/a11y-testing/templates/a11y-test-template.ts +470 -0
  320. package/vendor/skills/skills/adversarial-review/SKILL.md +140 -0
  321. package/vendor/skills/skills/adversarial-review/references/reviewer-lenses.md +38 -0
  322. package/vendor/skills/skills/agent-browser/SKILL.md +151 -0
  323. package/vendor/skills/skills/agent-identifier/SKILL.md +438 -0
  324. package/vendor/skills/skills/agent-identifier/examples/agent-creation-prompt.md +250 -0
  325. package/vendor/skills/skills/agent-identifier/examples/complete-agent-examples.md +458 -0
  326. package/vendor/skills/skills/agent-identifier/references/agent-creation-system-prompt.md +216 -0
  327. package/vendor/skills/skills/agent-identifier/references/system-prompt-design.md +464 -0
  328. package/vendor/skills/skills/agent-identifier/references/triggering-examples.md +508 -0
  329. package/vendor/skills/skills/agent-identifier/scripts/validate-agent.sh +217 -0
  330. package/vendor/skills/skills/agent-md-refactor/README.md +234 -0
  331. package/vendor/skills/skills/agent-md-refactor/SKILL.md +309 -0
  332. package/vendor/skills/skills/ai-pdf-builder/README.md +40 -0
  333. package/vendor/skills/skills/ai-pdf-builder/SKILL.md +210 -0
  334. package/vendor/skills/skills/ai-pdf-builder/_meta.json +22 -0
  335. package/vendor/skills/skills/ai-sdk/SKILL.md +53 -0
  336. package/vendor/skills/skills/ai-sdk/references/ai-gateway.md +41 -0
  337. package/vendor/skills/skills/ai-sdk/references/common-errors.md +167 -0
  338. package/vendor/skills/skills/alex-hormozi-pitch/SKILL.md +69 -0
  339. package/vendor/skills/skills/alex-hormozi-pitch/metadata.json +14 -0
  340. package/vendor/skills/skills/app-renderer-systems/SKILL.md +177 -0
  341. package/vendor/skills/skills/app-renderer-systems/references/directory-layout.md +120 -0
  342. package/vendor/skills/skills/app-renderer-systems/references/patterns.md +509 -0
  343. package/vendor/skills/skills/architectural-analysis/SKILL.md +720 -0
  344. package/vendor/skills/skills/argocd-expert/SKILL.md +767 -0
  345. package/vendor/skills/skills/bencium-innovative-ux-designer/ACCESSIBILITY.md +112 -0
  346. package/vendor/skills/skills/bencium-innovative-ux-designer/DESIGN-SYSTEM-TEMPLATE.md +631 -0
  347. package/vendor/skills/skills/bencium-innovative-ux-designer/MOTION-SPEC.md +74 -0
  348. package/vendor/skills/skills/bencium-innovative-ux-designer/RESPONSIVE-DESIGN.md +95 -0
  349. package/vendor/skills/skills/bencium-innovative-ux-designer/SKILL.md +772 -0
  350. package/vendor/skills/skills/better-auth-best-practices/SKILL.md +174 -0
  351. package/vendor/skills/skills/brainstorming/SKILL.md +101 -0
  352. package/vendor/skills/skills/brand-storytelling/SKILL.md +86 -0
  353. package/vendor/skills/skills/brand-storytelling/references/guest-insights.md +722 -0
  354. package/vendor/skills/skills/building-components/SKILL.md +37 -0
  355. package/vendor/skills/skills/building-components/references/accessibility.mdx +794 -0
  356. package/vendor/skills/skills/building-components/references/as-child.mdx +318 -0
  357. package/vendor/skills/skills/building-components/references/composition.mdx +229 -0
  358. package/vendor/skills/skills/building-components/references/data-attributes.mdx +409 -0
  359. package/vendor/skills/skills/building-components/references/definitions.mdx +256 -0
  360. package/vendor/skills/skills/building-components/references/design-tokens.mdx +57 -0
  361. package/vendor/skills/skills/building-components/references/docs.mdx +153 -0
  362. package/vendor/skills/skills/building-components/references/marketplaces.mdx +144 -0
  363. package/vendor/skills/skills/building-components/references/npm.mdx +166 -0
  364. package/vendor/skills/skills/building-components/references/polymorphism.mdx +576 -0
  365. package/vendor/skills/skills/building-components/references/principles.mdx +61 -0
  366. package/vendor/skills/skills/building-components/references/registry.mdx +169 -0
  367. package/vendor/skills/skills/building-components/references/state.mdx +95 -0
  368. package/vendor/skills/skills/building-components/references/styling.mdx +271 -0
  369. package/vendor/skills/skills/building-components/references/types.mdx +189 -0
  370. package/vendor/skills/skills/centrifugo/SKILL.md +362 -0
  371. package/vendor/skills/skills/centrifugo/references/authentication.md +187 -0
  372. package/vendor/skills/skills/centrifugo/references/channels.md +172 -0
  373. package/vendor/skills/skills/centrifugo/references/client-sdk.md +242 -0
  374. package/vendor/skills/skills/centrifugo/references/configuration.md +201 -0
  375. package/vendor/skills/skills/centrifugo/references/engines.md +203 -0
  376. package/vendor/skills/skills/centrifugo/references/proxy.md +301 -0
  377. package/vendor/skills/skills/centrifugo/references/server-api.md +209 -0
  378. package/vendor/skills/skills/cloudflare/SKILL.md +238 -0
  379. package/vendor/skills/skills/cloudflare/references/agents-sdk/README.md +95 -0
  380. package/vendor/skills/skills/cloudflare/references/agents-sdk/api.md +195 -0
  381. package/vendor/skills/skills/cloudflare/references/agents-sdk/configuration.md +178 -0
  382. package/vendor/skills/skills/cloudflare/references/agents-sdk/gotchas.md +173 -0
  383. package/vendor/skills/skills/cloudflare/references/agents-sdk/patterns.md +215 -0
  384. package/vendor/skills/skills/cloudflare/references/ai-gateway/README.md +176 -0
  385. package/vendor/skills/skills/cloudflare/references/ai-gateway/configuration.md +117 -0
  386. package/vendor/skills/skills/cloudflare/references/ai-gateway/dynamic-routing.md +88 -0
  387. package/vendor/skills/skills/cloudflare/references/ai-gateway/features.md +96 -0
  388. package/vendor/skills/skills/cloudflare/references/ai-gateway/sdk-integration.md +110 -0
  389. package/vendor/skills/skills/cloudflare/references/ai-gateway/troubleshooting.md +90 -0
  390. package/vendor/skills/skills/cloudflare/references/ai-search/README.md +145 -0
  391. package/vendor/skills/skills/cloudflare/references/ai-search/api.md +87 -0
  392. package/vendor/skills/skills/cloudflare/references/ai-search/configuration.md +91 -0
  393. package/vendor/skills/skills/cloudflare/references/ai-search/gotchas.md +92 -0
  394. package/vendor/skills/skills/cloudflare/references/ai-search/patterns.md +87 -0
  395. package/vendor/skills/skills/cloudflare/references/analytics-engine/README.md +96 -0
  396. package/vendor/skills/skills/cloudflare/references/analytics-engine/api.md +112 -0
  397. package/vendor/skills/skills/cloudflare/references/analytics-engine/configuration.md +107 -0
  398. package/vendor/skills/skills/cloudflare/references/analytics-engine/gotchas.md +87 -0
  399. package/vendor/skills/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
  400. package/vendor/skills/skills/cloudflare/references/api/README.md +66 -0
  401. package/vendor/skills/skills/cloudflare/references/api/api.md +205 -0
  402. package/vendor/skills/skills/cloudflare/references/api/configuration.md +158 -0
  403. package/vendor/skills/skills/cloudflare/references/api/gotchas.md +231 -0
  404. package/vendor/skills/skills/cloudflare/references/api/patterns.md +208 -0
  405. package/vendor/skills/skills/cloudflare/references/api-shield/README.md +44 -0
  406. package/vendor/skills/skills/cloudflare/references/api-shield/api.md +153 -0
  407. package/vendor/skills/skills/cloudflare/references/api-shield/configuration.md +210 -0
  408. package/vendor/skills/skills/cloudflare/references/api-shield/gotchas.md +132 -0
  409. package/vendor/skills/skills/cloudflare/references/api-shield/patterns.md +185 -0
  410. package/vendor/skills/skills/cloudflare/references/argo-smart-routing/README.md +96 -0
  411. package/vendor/skills/skills/cloudflare/references/argo-smart-routing/api.md +253 -0
  412. package/vendor/skills/skills/cloudflare/references/argo-smart-routing/configuration.md +205 -0
  413. package/vendor/skills/skills/cloudflare/references/argo-smart-routing/gotchas.md +115 -0
  414. package/vendor/skills/skills/cloudflare/references/argo-smart-routing/patterns.md +107 -0
  415. package/vendor/skills/skills/cloudflare/references/bindings/README.md +127 -0
  416. package/vendor/skills/skills/cloudflare/references/bindings/api.md +214 -0
  417. package/vendor/skills/skills/cloudflare/references/bindings/configuration.md +200 -0
  418. package/vendor/skills/skills/cloudflare/references/bindings/gotchas.md +210 -0
  419. package/vendor/skills/skills/cloudflare/references/bindings/patterns.md +205 -0
  420. package/vendor/skills/skills/cloudflare/references/bot-management/README.md +95 -0
  421. package/vendor/skills/skills/cloudflare/references/bot-management/api.md +175 -0
  422. package/vendor/skills/skills/cloudflare/references/bot-management/configuration.md +175 -0
  423. package/vendor/skills/skills/cloudflare/references/bot-management/gotchas.md +116 -0
  424. package/vendor/skills/skills/cloudflare/references/bot-management/patterns.md +181 -0
  425. package/vendor/skills/skills/cloudflare/references/browser-rendering/README.md +84 -0
  426. package/vendor/skills/skills/cloudflare/references/browser-rendering/api.md +108 -0
  427. package/vendor/skills/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
  428. package/vendor/skills/skills/cloudflare/references/browser-rendering/gotchas.md +91 -0
  429. package/vendor/skills/skills/cloudflare/references/browser-rendering/patterns.md +94 -0
  430. package/vendor/skills/skills/cloudflare/references/c3/README.md +111 -0
  431. package/vendor/skills/skills/cloudflare/references/c3/api.md +71 -0
  432. package/vendor/skills/skills/cloudflare/references/c3/configuration.md +85 -0
  433. package/vendor/skills/skills/cloudflare/references/c3/gotchas.md +97 -0
  434. package/vendor/skills/skills/cloudflare/references/c3/patterns.md +84 -0
  435. package/vendor/skills/skills/cloudflare/references/cache-reserve/README.md +150 -0
  436. package/vendor/skills/skills/cloudflare/references/cache-reserve/api.md +184 -0
  437. package/vendor/skills/skills/cloudflare/references/cache-reserve/configuration.md +170 -0
  438. package/vendor/skills/skills/cloudflare/references/cache-reserve/gotchas.md +136 -0
  439. package/vendor/skills/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
  440. package/vendor/skills/skills/cloudflare/references/containers/README.md +87 -0
  441. package/vendor/skills/skills/cloudflare/references/containers/api.md +197 -0
  442. package/vendor/skills/skills/cloudflare/references/containers/configuration.md +191 -0
  443. package/vendor/skills/skills/cloudflare/references/containers/gotchas.md +182 -0
  444. package/vendor/skills/skills/cloudflare/references/containers/patterns.md +204 -0
  445. package/vendor/skills/skills/cloudflare/references/cron-triggers/README.md +101 -0
  446. package/vendor/skills/skills/cloudflare/references/cron-triggers/api.md +224 -0
  447. package/vendor/skills/skills/cloudflare/references/cron-triggers/configuration.md +190 -0
  448. package/vendor/skills/skills/cloudflare/references/cron-triggers/gotchas.md +207 -0
  449. package/vendor/skills/skills/cloudflare/references/cron-triggers/patterns.md +277 -0
  450. package/vendor/skills/skills/cloudflare/references/d1/README.md +137 -0
  451. package/vendor/skills/skills/cloudflare/references/d1/api.md +213 -0
  452. package/vendor/skills/skills/cloudflare/references/d1/configuration.md +198 -0
  453. package/vendor/skills/skills/cloudflare/references/d1/gotchas.md +98 -0
  454. package/vendor/skills/skills/cloudflare/references/d1/patterns.md +242 -0
  455. package/vendor/skills/skills/cloudflare/references/ddos/README.md +42 -0
  456. package/vendor/skills/skills/cloudflare/references/ddos/api.md +158 -0
  457. package/vendor/skills/skills/cloudflare/references/ddos/configuration.md +94 -0
  458. package/vendor/skills/skills/cloudflare/references/ddos/gotchas.md +114 -0
  459. package/vendor/skills/skills/cloudflare/references/ddos/patterns.md +222 -0
  460. package/vendor/skills/skills/cloudflare/references/do-storage/README.md +79 -0
  461. package/vendor/skills/skills/cloudflare/references/do-storage/api.md +107 -0
  462. package/vendor/skills/skills/cloudflare/references/do-storage/configuration.md +114 -0
  463. package/vendor/skills/skills/cloudflare/references/do-storage/gotchas.md +153 -0
  464. package/vendor/skills/skills/cloudflare/references/do-storage/patterns.md +210 -0
  465. package/vendor/skills/skills/cloudflare/references/do-storage/testing.md +186 -0
  466. package/vendor/skills/skills/cloudflare/references/durable-objects/README.md +194 -0
  467. package/vendor/skills/skills/cloudflare/references/durable-objects/api.md +205 -0
  468. package/vendor/skills/skills/cloudflare/references/durable-objects/configuration.md +160 -0
  469. package/vendor/skills/skills/cloudflare/references/durable-objects/gotchas.md +200 -0
  470. package/vendor/skills/skills/cloudflare/references/durable-objects/patterns.md +205 -0
  471. package/vendor/skills/skills/cloudflare/references/email-routing/README.md +89 -0
  472. package/vendor/skills/skills/cloudflare/references/email-routing/api.md +192 -0
  473. package/vendor/skills/skills/cloudflare/references/email-routing/configuration.md +187 -0
  474. package/vendor/skills/skills/cloudflare/references/email-routing/gotchas.md +203 -0
  475. package/vendor/skills/skills/cloudflare/references/email-routing/patterns.md +241 -0
  476. package/vendor/skills/skills/cloudflare/references/email-workers/README.md +153 -0
  477. package/vendor/skills/skills/cloudflare/references/email-workers/api.md +227 -0
  478. package/vendor/skills/skills/cloudflare/references/email-workers/configuration.md +115 -0
  479. package/vendor/skills/skills/cloudflare/references/email-workers/gotchas.md +133 -0
  480. package/vendor/skills/skills/cloudflare/references/email-workers/patterns.md +108 -0
  481. package/vendor/skills/skills/cloudflare/references/graphql-api/README.md +147 -0
  482. package/vendor/skills/skills/cloudflare/references/graphql-api/api.md +175 -0
  483. package/vendor/skills/skills/cloudflare/references/graphql-api/configuration.md +151 -0
  484. package/vendor/skills/skills/cloudflare/references/graphql-api/gotchas.md +111 -0
  485. package/vendor/skills/skills/cloudflare/references/graphql-api/patterns.md +276 -0
  486. package/vendor/skills/skills/cloudflare/references/hyperdrive/README.md +84 -0
  487. package/vendor/skills/skills/cloudflare/references/hyperdrive/api.md +149 -0
  488. package/vendor/skills/skills/cloudflare/references/hyperdrive/configuration.md +166 -0
  489. package/vendor/skills/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
  490. package/vendor/skills/skills/cloudflare/references/hyperdrive/patterns.md +203 -0
  491. package/vendor/skills/skills/cloudflare/references/images/README.md +65 -0
  492. package/vendor/skills/skills/cloudflare/references/images/api.md +101 -0
  493. package/vendor/skills/skills/cloudflare/references/images/configuration.md +206 -0
  494. package/vendor/skills/skills/cloudflare/references/images/gotchas.md +106 -0
  495. package/vendor/skills/skills/cloudflare/references/images/patterns.md +126 -0
  496. package/vendor/skills/skills/cloudflare/references/kv/README.md +90 -0
  497. package/vendor/skills/skills/cloudflare/references/kv/api.md +163 -0
  498. package/vendor/skills/skills/cloudflare/references/kv/configuration.md +148 -0
  499. package/vendor/skills/skills/cloudflare/references/kv/gotchas.md +133 -0
  500. package/vendor/skills/skills/cloudflare/references/kv/patterns.md +195 -0
  501. package/vendor/skills/skills/cloudflare/references/miniflare/README.md +113 -0
  502. package/vendor/skills/skills/cloudflare/references/miniflare/api.md +204 -0
  503. package/vendor/skills/skills/cloudflare/references/miniflare/configuration.md +174 -0
  504. package/vendor/skills/skills/cloudflare/references/miniflare/gotchas.md +179 -0
  505. package/vendor/skills/skills/cloudflare/references/miniflare/patterns.md +187 -0
  506. package/vendor/skills/skills/cloudflare/references/network-interconnect/README.md +104 -0
  507. package/vendor/skills/skills/cloudflare/references/network-interconnect/api.md +220 -0
  508. package/vendor/skills/skills/cloudflare/references/network-interconnect/configuration.md +123 -0
  509. package/vendor/skills/skills/cloudflare/references/network-interconnect/gotchas.md +175 -0
  510. package/vendor/skills/skills/cloudflare/references/network-interconnect/patterns.md +174 -0
  511. package/vendor/skills/skills/cloudflare/references/observability/README.md +93 -0
  512. package/vendor/skills/skills/cloudflare/references/observability/api.md +168 -0
  513. package/vendor/skills/skills/cloudflare/references/observability/configuration.md +178 -0
  514. package/vendor/skills/skills/cloudflare/references/observability/gotchas.md +125 -0
  515. package/vendor/skills/skills/cloudflare/references/observability/patterns.md +105 -0
  516. package/vendor/skills/skills/cloudflare/references/pages/README.md +92 -0
  517. package/vendor/skills/skills/cloudflare/references/pages/api.md +205 -0
  518. package/vendor/skills/skills/cloudflare/references/pages/configuration.md +216 -0
  519. package/vendor/skills/skills/cloudflare/references/pages/gotchas.md +218 -0
  520. package/vendor/skills/skills/cloudflare/references/pages/patterns.md +215 -0
  521. package/vendor/skills/skills/cloudflare/references/pages-functions/README.md +104 -0
  522. package/vendor/skills/skills/cloudflare/references/pages-functions/api.md +159 -0
  523. package/vendor/skills/skills/cloudflare/references/pages-functions/configuration.md +130 -0
  524. package/vendor/skills/skills/cloudflare/references/pages-functions/gotchas.md +102 -0
  525. package/vendor/skills/skills/cloudflare/references/pages-functions/patterns.md +148 -0
  526. package/vendor/skills/skills/cloudflare/references/pipelines/README.md +109 -0
  527. package/vendor/skills/skills/cloudflare/references/pipelines/api.md +214 -0
  528. package/vendor/skills/skills/cloudflare/references/pipelines/configuration.md +98 -0
  529. package/vendor/skills/skills/cloudflare/references/pipelines/gotchas.md +84 -0
  530. package/vendor/skills/skills/cloudflare/references/pipelines/patterns.md +87 -0
  531. package/vendor/skills/skills/cloudflare/references/pulumi/README.md +113 -0
  532. package/vendor/skills/skills/cloudflare/references/pulumi/api.md +230 -0
  533. package/vendor/skills/skills/cloudflare/references/pulumi/configuration.md +213 -0
  534. package/vendor/skills/skills/cloudflare/references/pulumi/gotchas.md +205 -0
  535. package/vendor/skills/skills/cloudflare/references/pulumi/patterns.md +260 -0
  536. package/vendor/skills/skills/cloudflare/references/queues/README.md +99 -0
  537. package/vendor/skills/skills/cloudflare/references/queues/api.md +211 -0
  538. package/vendor/skills/skills/cloudflare/references/queues/configuration.md +151 -0
  539. package/vendor/skills/skills/cloudflare/references/queues/gotchas.md +210 -0
  540. package/vendor/skills/skills/cloudflare/references/queues/patterns.md +220 -0
  541. package/vendor/skills/skills/cloudflare/references/r2/README.md +97 -0
  542. package/vendor/skills/skills/cloudflare/references/r2/api.md +235 -0
  543. package/vendor/skills/skills/cloudflare/references/r2/configuration.md +176 -0
  544. package/vendor/skills/skills/cloudflare/references/r2/gotchas.md +190 -0
  545. package/vendor/skills/skills/cloudflare/references/r2/patterns.md +203 -0
  546. package/vendor/skills/skills/cloudflare/references/r2-data-catalog/README.md +157 -0
  547. package/vendor/skills/skills/cloudflare/references/r2-data-catalog/api.md +199 -0
  548. package/vendor/skills/skills/cloudflare/references/r2-data-catalog/configuration.md +205 -0
  549. package/vendor/skills/skills/cloudflare/references/r2-data-catalog/gotchas.md +170 -0
  550. package/vendor/skills/skills/cloudflare/references/r2-data-catalog/patterns.md +191 -0
  551. package/vendor/skills/skills/cloudflare/references/r2-sql/README.md +138 -0
  552. package/vendor/skills/skills/cloudflare/references/r2-sql/SKILL.md.backup +512 -0
  553. package/vendor/skills/skills/cloudflare/references/r2-sql/api.md +159 -0
  554. package/vendor/skills/skills/cloudflare/references/r2-sql/configuration.md +152 -0
  555. package/vendor/skills/skills/cloudflare/references/r2-sql/gotchas.md +228 -0
  556. package/vendor/skills/skills/cloudflare/references/r2-sql/patterns.md +230 -0
  557. package/vendor/skills/skills/cloudflare/references/realtime-sfu/README.md +66 -0
  558. package/vendor/skills/skills/cloudflare/references/realtime-sfu/api.md +164 -0
  559. package/vendor/skills/skills/cloudflare/references/realtime-sfu/configuration.md +141 -0
  560. package/vendor/skills/skills/cloudflare/references/realtime-sfu/gotchas.md +138 -0
  561. package/vendor/skills/skills/cloudflare/references/realtime-sfu/patterns.md +187 -0
  562. package/vendor/skills/skills/cloudflare/references/realtimekit/README.md +118 -0
  563. package/vendor/skills/skills/cloudflare/references/realtimekit/api.md +237 -0
  564. package/vendor/skills/skills/cloudflare/references/realtimekit/configuration.md +226 -0
  565. package/vendor/skills/skills/cloudflare/references/realtimekit/gotchas.md +206 -0
  566. package/vendor/skills/skills/cloudflare/references/realtimekit/patterns.md +240 -0
  567. package/vendor/skills/skills/cloudflare/references/sandbox/README.md +104 -0
  568. package/vendor/skills/skills/cloudflare/references/sandbox/api.md +200 -0
  569. package/vendor/skills/skills/cloudflare/references/sandbox/configuration.md +154 -0
  570. package/vendor/skills/skills/cloudflare/references/sandbox/gotchas.md +201 -0
  571. package/vendor/skills/skills/cloudflare/references/sandbox/patterns.md +195 -0
  572. package/vendor/skills/skills/cloudflare/references/secrets-store/README.md +77 -0
  573. package/vendor/skills/skills/cloudflare/references/secrets-store/api.md +199 -0
  574. package/vendor/skills/skills/cloudflare/references/secrets-store/configuration.md +187 -0
  575. package/vendor/skills/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
  576. package/vendor/skills/skills/cloudflare/references/secrets-store/patterns.md +218 -0
  577. package/vendor/skills/skills/cloudflare/references/smart-placement/README.md +143 -0
  578. package/vendor/skills/skills/cloudflare/references/smart-placement/api.md +192 -0
  579. package/vendor/skills/skills/cloudflare/references/smart-placement/configuration.md +202 -0
  580. package/vendor/skills/skills/cloudflare/references/smart-placement/gotchas.md +180 -0
  581. package/vendor/skills/skills/cloudflare/references/smart-placement/patterns.md +194 -0
  582. package/vendor/skills/skills/cloudflare/references/snippets/README.md +74 -0
  583. package/vendor/skills/skills/cloudflare/references/snippets/api.md +214 -0
  584. package/vendor/skills/skills/cloudflare/references/snippets/configuration.md +239 -0
  585. package/vendor/skills/skills/cloudflare/references/snippets/gotchas.md +104 -0
  586. package/vendor/skills/skills/cloudflare/references/snippets/patterns.md +135 -0
  587. package/vendor/skills/skills/cloudflare/references/spectrum/README.md +52 -0
  588. package/vendor/skills/skills/cloudflare/references/spectrum/api.md +184 -0
  589. package/vendor/skills/skills/cloudflare/references/spectrum/configuration.md +203 -0
  590. package/vendor/skills/skills/cloudflare/references/spectrum/gotchas.md +155 -0
  591. package/vendor/skills/skills/cloudflare/references/spectrum/patterns.md +206 -0
  592. package/vendor/skills/skills/cloudflare/references/static-assets/README.md +65 -0
  593. package/vendor/skills/skills/cloudflare/references/static-assets/api.md +201 -0
  594. package/vendor/skills/skills/cloudflare/references/static-assets/configuration.md +186 -0
  595. package/vendor/skills/skills/cloudflare/references/static-assets/gotchas.md +164 -0
  596. package/vendor/skills/skills/cloudflare/references/static-assets/patterns.md +189 -0
  597. package/vendor/skills/skills/cloudflare/references/stream/README.md +123 -0
  598. package/vendor/skills/skills/cloudflare/references/stream/api-live.md +202 -0
  599. package/vendor/skills/skills/cloudflare/references/stream/api.md +206 -0
  600. package/vendor/skills/skills/cloudflare/references/stream/configuration.md +151 -0
  601. package/vendor/skills/skills/cloudflare/references/stream/gotchas.md +139 -0
  602. package/vendor/skills/skills/cloudflare/references/stream/patterns.md +217 -0
  603. package/vendor/skills/skills/cloudflare/references/tail-workers/README.md +92 -0
  604. package/vendor/skills/skills/cloudflare/references/tail-workers/api.md +203 -0
  605. package/vendor/skills/skills/cloudflare/references/tail-workers/configuration.md +178 -0
  606. package/vendor/skills/skills/cloudflare/references/tail-workers/gotchas.md +206 -0
  607. package/vendor/skills/skills/cloudflare/references/tail-workers/patterns.md +190 -0
  608. package/vendor/skills/skills/cloudflare/references/terraform/README.md +100 -0
  609. package/vendor/skills/skills/cloudflare/references/terraform/api.md +178 -0
  610. package/vendor/skills/skills/cloudflare/references/terraform/configuration.md +197 -0
  611. package/vendor/skills/skills/cloudflare/references/terraform/gotchas.md +150 -0
  612. package/vendor/skills/skills/cloudflare/references/terraform/patterns.md +174 -0
  613. package/vendor/skills/skills/cloudflare/references/tunnel/README.md +137 -0
  614. package/vendor/skills/skills/cloudflare/references/tunnel/api.md +205 -0
  615. package/vendor/skills/skills/cloudflare/references/tunnel/configuration.md +163 -0
  616. package/vendor/skills/skills/cloudflare/references/tunnel/gotchas.md +159 -0
  617. package/vendor/skills/skills/cloudflare/references/tunnel/networking.md +174 -0
  618. package/vendor/skills/skills/cloudflare/references/tunnel/patterns.md +199 -0
  619. package/vendor/skills/skills/cloudflare/references/turn/README.md +86 -0
  620. package/vendor/skills/skills/cloudflare/references/turn/api.md +236 -0
  621. package/vendor/skills/skills/cloudflare/references/turn/configuration.md +181 -0
  622. package/vendor/skills/skills/cloudflare/references/turn/gotchas.md +236 -0
  623. package/vendor/skills/skills/cloudflare/references/turn/patterns.md +228 -0
  624. package/vendor/skills/skills/cloudflare/references/turnstile/README.md +102 -0
  625. package/vendor/skills/skills/cloudflare/references/turnstile/api.md +253 -0
  626. package/vendor/skills/skills/cloudflare/references/turnstile/configuration.md +243 -0
  627. package/vendor/skills/skills/cloudflare/references/turnstile/gotchas.md +253 -0
  628. package/vendor/skills/skills/cloudflare/references/turnstile/patterns.md +195 -0
  629. package/vendor/skills/skills/cloudflare/references/vectorize/README.md +133 -0
  630. package/vendor/skills/skills/cloudflare/references/vectorize/api.md +89 -0
  631. package/vendor/skills/skills/cloudflare/references/vectorize/configuration.md +91 -0
  632. package/vendor/skills/skills/cloudflare/references/vectorize/gotchas.md +83 -0
  633. package/vendor/skills/skills/cloudflare/references/vectorize/patterns.md +92 -0
  634. package/vendor/skills/skills/cloudflare/references/waf/README.md +125 -0
  635. package/vendor/skills/skills/cloudflare/references/waf/api.md +203 -0
  636. package/vendor/skills/skills/cloudflare/references/waf/configuration.md +215 -0
  637. package/vendor/skills/skills/cloudflare/references/waf/gotchas.md +208 -0
  638. package/vendor/skills/skills/cloudflare/references/waf/patterns.md +236 -0
  639. package/vendor/skills/skills/cloudflare/references/web-analytics/README.md +149 -0
  640. package/vendor/skills/skills/cloudflare/references/web-analytics/configuration.md +81 -0
  641. package/vendor/skills/skills/cloudflare/references/web-analytics/gotchas.md +86 -0
  642. package/vendor/skills/skills/cloudflare/references/web-analytics/integration.md +63 -0
  643. package/vendor/skills/skills/cloudflare/references/web-analytics/patterns.md +98 -0
  644. package/vendor/skills/skills/cloudflare/references/workerd/README.md +85 -0
  645. package/vendor/skills/skills/cloudflare/references/workerd/api.md +219 -0
  646. package/vendor/skills/skills/cloudflare/references/workerd/configuration.md +200 -0
  647. package/vendor/skills/skills/cloudflare/references/workerd/gotchas.md +151 -0
  648. package/vendor/skills/skills/cloudflare/references/workerd/patterns.md +205 -0
  649. package/vendor/skills/skills/cloudflare/references/workers/README.md +110 -0
  650. package/vendor/skills/skills/cloudflare/references/workers/api.md +197 -0
  651. package/vendor/skills/skills/cloudflare/references/workers/configuration.md +184 -0
  652. package/vendor/skills/skills/cloudflare/references/workers/frameworks.md +200 -0
  653. package/vendor/skills/skills/cloudflare/references/workers/gotchas.md +145 -0
  654. package/vendor/skills/skills/cloudflare/references/workers/patterns.md +220 -0
  655. package/vendor/skills/skills/cloudflare/references/workers-ai/README.md +206 -0
  656. package/vendor/skills/skills/cloudflare/references/workers-ai/api.md +115 -0
  657. package/vendor/skills/skills/cloudflare/references/workers-ai/configuration.md +98 -0
  658. package/vendor/skills/skills/cloudflare/references/workers-ai/gotchas.md +130 -0
  659. package/vendor/skills/skills/cloudflare/references/workers-ai/patterns.md +122 -0
  660. package/vendor/skills/skills/cloudflare/references/workers-for-platforms/README.md +95 -0
  661. package/vendor/skills/skills/cloudflare/references/workers-for-platforms/api.md +212 -0
  662. package/vendor/skills/skills/cloudflare/references/workers-for-platforms/configuration.md +178 -0
  663. package/vendor/skills/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
  664. package/vendor/skills/skills/cloudflare/references/workers-for-platforms/patterns.md +210 -0
  665. package/vendor/skills/skills/cloudflare/references/workers-playground/README.md +131 -0
  666. package/vendor/skills/skills/cloudflare/references/workers-playground/api.md +101 -0
  667. package/vendor/skills/skills/cloudflare/references/workers-playground/configuration.md +169 -0
  668. package/vendor/skills/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
  669. package/vendor/skills/skills/cloudflare/references/workers-playground/patterns.md +134 -0
  670. package/vendor/skills/skills/cloudflare/references/workers-vpc/README.md +130 -0
  671. package/vendor/skills/skills/cloudflare/references/workers-vpc/api.md +196 -0
  672. package/vendor/skills/skills/cloudflare/references/workers-vpc/configuration.md +151 -0
  673. package/vendor/skills/skills/cloudflare/references/workers-vpc/gotchas.md +171 -0
  674. package/vendor/skills/skills/cloudflare/references/workers-vpc/patterns.md +235 -0
  675. package/vendor/skills/skills/cloudflare/references/workflows/README.md +72 -0
  676. package/vendor/skills/skills/cloudflare/references/workflows/api.md +240 -0
  677. package/vendor/skills/skills/cloudflare/references/workflows/configuration.md +160 -0
  678. package/vendor/skills/skills/cloudflare/references/workflows/gotchas.md +97 -0
  679. package/vendor/skills/skills/cloudflare/references/workflows/patterns.md +245 -0
  680. package/vendor/skills/skills/cloudflare/references/wrangler/README.md +143 -0
  681. package/vendor/skills/skills/cloudflare/references/wrangler/api.md +188 -0
  682. package/vendor/skills/skills/cloudflare/references/wrangler/configuration.md +198 -0
  683. package/vendor/skills/skills/cloudflare/references/wrangler/gotchas.md +212 -0
  684. package/vendor/skills/skills/cloudflare/references/wrangler/patterns.md +211 -0
  685. package/vendor/skills/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +131 -0
  686. package/vendor/skills/skills/cloudflare/references/zaraz/README.md +114 -0
  687. package/vendor/skills/skills/cloudflare/references/zaraz/api.md +118 -0
  688. package/vendor/skills/skills/cloudflare/references/zaraz/configuration.md +94 -0
  689. package/vendor/skills/skills/cloudflare/references/zaraz/gotchas.md +88 -0
  690. package/vendor/skills/skills/cloudflare/references/zaraz/patterns.md +77 -0
  691. package/vendor/skills/skills/content-research-writer/SKILL.md +595 -0
  692. package/vendor/skills/skills/copywriting/SKILL.md +287 -0
  693. package/vendor/skills/skills/copywriting/references/copy-frameworks.md +385 -0
  694. package/vendor/skills/skills/copywriting/references/natural-transitions.md +255 -0
  695. package/vendor/skills/skills/crafting-effective-readmes/README.md +180 -0
  696. package/vendor/skills/skills/crafting-effective-readmes/SKILL.md +82 -0
  697. package/vendor/skills/skills/crafting-effective-readmes/references/art-of-readme.md +518 -0
  698. package/vendor/skills/skills/crafting-effective-readmes/references/make-a-readme.md +119 -0
  699. package/vendor/skills/skills/crafting-effective-readmes/references/standard-readme-example-maximal.md +70 -0
  700. package/vendor/skills/skills/crafting-effective-readmes/references/standard-readme-example-minimal.md +23 -0
  701. package/vendor/skills/skills/crafting-effective-readmes/references/standard-readme-spec.md +290 -0
  702. package/vendor/skills/skills/crafting-effective-readmes/section-checklist.md +17 -0
  703. package/vendor/skills/skills/crafting-effective-readmes/style-guide.md +13 -0
  704. package/vendor/skills/skills/crafting-effective-readmes/templates/internal.md +106 -0
  705. package/vendor/skills/skills/crafting-effective-readmes/templates/oss.md +77 -0
  706. package/vendor/skills/skills/crafting-effective-readmes/templates/personal.md +51 -0
  707. package/vendor/skills/skills/crafting-effective-readmes/templates/xdg-config.md +71 -0
  708. package/vendor/skills/skills/crafting-effective-readmes/using-references.md +37 -0
  709. package/vendor/skills/skills/creating-spec/SKILL.md +343 -0
  710. package/vendor/skills/skills/deep-research/SKILL.md +96 -0
  711. package/vendor/skills/skills/design-spec-extraction/SKILL.md +1402 -0
  712. package/vendor/skills/skills/design-spec-extraction/references/design-tokens-schema.json +1145 -0
  713. package/vendor/skills/skills/design-spec-extraction/references/extraction-patterns.md +1044 -0
  714. package/vendor/skills/skills/develop-ai-functions-example/SKILL.md +225 -0
  715. package/vendor/skills/skills/devops-engineer/SKILL.md +147 -0
  716. package/vendor/skills/skills/devops-engineer/references/deployment-strategies.md +245 -0
  717. package/vendor/skills/skills/devops-engineer/references/docker-patterns.md +113 -0
  718. package/vendor/skills/skills/devops-engineer/references/github-actions.md +142 -0
  719. package/vendor/skills/skills/devops-engineer/references/incident-response.md +345 -0
  720. package/vendor/skills/skills/devops-engineer/references/kubernetes.md +154 -0
  721. package/vendor/skills/skills/devops-engineer/references/platform-engineering.md +417 -0
  722. package/vendor/skills/skills/devops-engineer/references/release-automation.md +527 -0
  723. package/vendor/skills/skills/devops-engineer/references/terraform-iac.md +141 -0
  724. package/vendor/skills/skills/dispatching-parallel-agents/SKILL.md +191 -0
  725. package/vendor/skills/skills/drizzle-orm/SKILL.md +116 -0
  726. package/vendor/skills/skills/drizzle-orm/references/patterns.md +750 -0
  727. package/vendor/skills/skills/drizzle-safe-migrations/SKILL.md +68 -0
  728. package/vendor/skills/skills/drizzle-safe-migrations/agents/openai.yaml +4 -0
  729. package/vendor/skills/skills/drizzle-safe-migrations/references/production-playbook.md +47 -0
  730. package/vendor/skills/skills/effect-ts/SKILL.md +232 -0
  731. package/vendor/skills/skills/effect-ts/references/api-platform-observability.md +194 -0
  732. package/vendor/skills/skills/effect-ts/references/batching-and-caching.md +208 -0
  733. package/vendor/skills/skills/effect-ts/references/class-patterns.md +711 -0
  734. package/vendor/skills/skills/effect-ts/references/concurrency-and-resources.md +199 -0
  735. package/vendor/skills/skills/effect-ts/references/construction-and-style.md +138 -0
  736. package/vendor/skills/skills/effect-ts/references/control-flow-and-runtime.md +216 -0
  737. package/vendor/skills/skills/effect-ts/references/core-patterns.md +48 -0
  738. package/vendor/skills/skills/effect-ts/references/data-and-testing.md +200 -0
  739. package/vendor/skills/skills/effect-ts/references/data-types.md +705 -0
  740. package/vendor/skills/skills/effect-ts/references/error-handling-patterns.md +498 -0
  741. package/vendor/skills/skills/effect-ts/references/foundations.md +171 -0
  742. package/vendor/skills/skills/effect-ts/references/library-development-patterns.md +441 -0
  743. package/vendor/skills/skills/effect-ts/references/pattern-matching.md +363 -0
  744. package/vendor/skills/skills/effect-ts/references/quality-tooling-and-resources.md +240 -0
  745. package/vendor/skills/skills/effect-ts/references/schema-errors-config.md +486 -0
  746. package/vendor/skills/skills/effect-ts/references/schema-transforms-and-filters.md +293 -0
  747. package/vendor/skills/skills/effect-ts/references/sink.md +282 -0
  748. package/vendor/skills/skills/effect-ts/references/streams-deep-dive.md +649 -0
  749. package/vendor/skills/skills/effect-ts/references/testing-patterns.md +566 -0
  750. package/vendor/skills/skills/electron-builder/SKILL.md +447 -0
  751. package/vendor/skills/skills/electron-builder/references/auto-update.md +250 -0
  752. package/vendor/skills/skills/electron-builder/references/code-signing.md +213 -0
  753. package/vendor/skills/skills/electron-builder/references/configuration.md +229 -0
  754. package/vendor/skills/skills/electron-builder/references/hooks-and-programmatic.md +337 -0
  755. package/vendor/skills/skills/electron-builder/references/platform-targets.md +324 -0
  756. package/vendor/skills/skills/electron-builder/references/publishing.md +263 -0
  757. package/vendor/skills/skills/electron-dev/SKILL.md +195 -0
  758. package/vendor/skills/skills/electron-dev/references/patterns.md +825 -0
  759. package/vendor/skills/skills/electron-release/SKILL.md +216 -0
  760. package/vendor/skills/skills/electron-release/references/patterns.md +464 -0
  761. package/vendor/skills/skills/elysia/SKILL.md +155 -0
  762. package/vendor/skills/skills/elysia/references/patterns.md +569 -0
  763. package/vendor/skills/skills/es-toolkit/SKILL.md +45 -0
  764. package/vendor/skills/skills/es-toolkit/references/patterns.md +136 -0
  765. package/vendor/skills/skills/evolution-api/SKILL.md +312 -0
  766. package/vendor/skills/skills/evolution-api/references/api-endpoints.md +174 -0
  767. package/vendor/skills/skills/evolution-api/references/environment-variables.md +156 -0
  768. package/vendor/skills/skills/evolution-api/references/events.md +101 -0
  769. package/vendor/skills/skills/exa-web-search-free/.clawhub/origin.json +7 -0
  770. package/vendor/skills/skills/exa-web-search-free/SKILL.md +96 -0
  771. package/vendor/skills/skills/exa-web-search-free/references/examples.md +156 -0
  772. package/vendor/skills/skills/executing-plans/SKILL.md +87 -0
  773. package/vendor/skills/skills/find-rules/SKILL.md +184 -0
  774. package/vendor/skills/skills/find-skills/SKILL.md +133 -0
  775. package/vendor/skills/skills/firecrawl/SKILL.md +126 -0
  776. package/vendor/skills/skills/firecrawl/rules/install.md +63 -0
  777. package/vendor/skills/skills/firecrawl/rules/security.md +26 -0
  778. package/vendor/skills/skills/fix-coderabbit-review/SKILL.md +116 -0
  779. package/vendor/skills/skills/fix-coderabbit-review/agents/openai.yaml +3 -0
  780. package/vendor/skills/skills/fix-coderabbit-review/scripts/pr-review.ts +1182 -0
  781. package/vendor/skills/skills/fix-coderabbit-review/scripts/resolve_pr_issues.sh +228 -0
  782. package/vendor/skills/skills/fixing-motion-performance/SKILL.md +128 -0
  783. package/vendor/skills/skills/frontend-design/SKILL.md +45 -0
  784. package/vendor/skills/skills/fundraising/README.md +14 -0
  785. package/vendor/skills/skills/fundraising/SKILL.md +136 -0
  786. package/vendor/skills/skills/fundraising/references/CHECKLISTS.md +49 -0
  787. package/vendor/skills/skills/fundraising/references/EXAMPLES.md +10 -0
  788. package/vendor/skills/skills/fundraising/references/INTAKE.md +38 -0
  789. package/vendor/skills/skills/fundraising/references/RUBRIC.md +39 -0
  790. package/vendor/skills/skills/fundraising/references/SOURCE_SUMMARY.md +23 -0
  791. package/vendor/skills/skills/fundraising/references/TEMPLATES.md +201 -0
  792. package/vendor/skills/skills/fundraising/references/WORKFLOW.md +84 -0
  793. package/vendor/skills/skills/fundraising/skillpack.json +13 -0
  794. package/vendor/skills/skills/game-changing-features/README.md +230 -0
  795. package/vendor/skills/skills/game-changing-features/SKILL.md +287 -0
  796. package/vendor/skills/skills/git-rebase/SKILL.md +422 -0
  797. package/vendor/skills/skills/git-rebase/references/automation.md +25 -0
  798. package/vendor/skills/skills/git-rebase/references/resolution-patterns.md +76 -0
  799. package/vendor/skills/skills/git-rebase/references/scripts-tools.md +49 -0
  800. package/vendor/skills/skills/git-rebase/references/strategies.md +367 -0
  801. package/vendor/skills/skills/git-rebase/references/troubleshooting.md +70 -0
  802. package/vendor/skills/skills/git-rebase/scripts/analyze-conflicts.sh +107 -0
  803. package/vendor/skills/skills/git-rebase/scripts/pre-rebase-backup.sh +94 -0
  804. package/vendor/skills/skills/git-rebase/scripts/validate-merge.sh +106 -0
  805. package/vendor/skills/skills/google-ads/SKILL.md +197 -0
  806. package/vendor/skills/skills/google-ads/_meta.json +22 -0
  807. package/vendor/skills/skills/google-ads/references/api-setup.md +337 -0
  808. package/vendor/skills/skills/google-ads/references/browser-workflows.md +294 -0
  809. package/vendor/skills/skills/helm-chart-scaffolding/SKILL.md +566 -0
  810. package/vendor/skills/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
  811. package/vendor/skills/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
  812. package/vendor/skills/skills/helm-chart-scaffolding/references/chart-structure.md +509 -0
  813. package/vendor/skills/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
  814. package/vendor/skills/skills/hetzner-server/SKILL.md +278 -0
  815. package/vendor/skills/skills/hono/SKILL.md +90 -0
  816. package/vendor/skills/skills/hormozi-ad-factory/SKILL.md +153 -0
  817. package/vendor/skills/skills/hormozi-ad-factory/assets/output-template.md +132 -0
  818. package/vendor/skills/skills/hormozi-ad-factory/references/cta-templates.md +84 -0
  819. package/vendor/skills/skills/hormozi-ad-factory/references/hook-formulas.md +137 -0
  820. package/vendor/skills/skills/hormozi-ad-factory/references/meat-formats.md +133 -0
  821. package/vendor/skills/skills/humanizer/README.md +122 -0
  822. package/vendor/skills/skills/humanizer/SKILL.md +493 -0
  823. package/vendor/skills/skills/inngest/SKILL.md +62 -0
  824. package/vendor/skills/skills/interface-design/SKILL.md +402 -0
  825. package/vendor/skills/skills/interface-design/references/critique.md +67 -0
  826. package/vendor/skills/skills/interface-design/references/example.md +87 -0
  827. package/vendor/skills/skills/interface-design/references/principles.md +235 -0
  828. package/vendor/skills/skills/interface-design/references/validation.md +51 -0
  829. package/vendor/skills/skills/k8s-security-policies/SKILL.md +352 -0
  830. package/vendor/skills/skills/k8s-security-policies/assets/network-policy-template.yaml +176 -0
  831. package/vendor/skills/skills/k8s-security-policies/references/rbac-patterns.md +199 -0
  832. package/vendor/skills/skills/kubernetes-specialist/SKILL.md +244 -0
  833. package/vendor/skills/skills/kubernetes-specialist/references/configuration.md +452 -0
  834. package/vendor/skills/skills/kubernetes-specialist/references/cost-optimization.md +458 -0
  835. package/vendor/skills/skills/kubernetes-specialist/references/custom-operators.md +563 -0
  836. package/vendor/skills/skills/kubernetes-specialist/references/gitops.md +531 -0
  837. package/vendor/skills/skills/kubernetes-specialist/references/helm-charts.md +912 -0
  838. package/vendor/skills/skills/kubernetes-specialist/references/multi-cluster.md +507 -0
  839. package/vendor/skills/skills/kubernetes-specialist/references/networking.md +447 -0
  840. package/vendor/skills/skills/kubernetes-specialist/references/service-mesh.md +459 -0
  841. package/vendor/skills/skills/kubernetes-specialist/references/storage.md +535 -0
  842. package/vendor/skills/skills/kubernetes-specialist/references/troubleshooting.md +416 -0
  843. package/vendor/skills/skills/kubernetes-specialist/references/workloads.md +377 -0
  844. package/vendor/skills/skills/landing-page-design/SKILL.md +243 -0
  845. package/vendor/skills/skills/lesson-learned/README.md +65 -0
  846. package/vendor/skills/skills/lesson-learned/SKILL.md +107 -0
  847. package/vendor/skills/skills/lesson-learned/references/anti-patterns.md +55 -0
  848. package/vendor/skills/skills/lesson-learned/references/se-principles.md +109 -0
  849. package/vendor/skills/skills/mastra/SKILL.md +173 -0
  850. package/vendor/skills/skills/mastra/references/common-errors.md +535 -0
  851. package/vendor/skills/skills/mastra/references/create-mastra.md +220 -0
  852. package/vendor/skills/skills/mastra/references/embedded-docs.md +99 -0
  853. package/vendor/skills/skills/mastra/references/migration-guide.md +180 -0
  854. package/vendor/skills/skills/mastra/references/remote-docs.md +193 -0
  855. package/vendor/skills/skills/mermaid-diagrams/README.md +246 -0
  856. package/vendor/skills/skills/mermaid-diagrams/SKILL.md +228 -0
  857. package/vendor/skills/skills/mermaid-diagrams/references/advanced-features.md +567 -0
  858. package/vendor/skills/skills/mermaid-diagrams/references/architecture-diagrams.md +192 -0
  859. package/vendor/skills/skills/mermaid-diagrams/references/c4-diagrams.md +416 -0
  860. package/vendor/skills/skills/mermaid-diagrams/references/class-diagrams.md +376 -0
  861. package/vendor/skills/skills/mermaid-diagrams/references/erd-diagrams.md +519 -0
  862. package/vendor/skills/skills/mermaid-diagrams/references/flowcharts.md +478 -0
  863. package/vendor/skills/skills/mermaid-diagrams/references/sequence-diagrams.md +406 -0
  864. package/vendor/skills/skills/motion/.claude-plugin/plugin.json +12 -0
  865. package/vendor/skills/skills/motion/SKILL.md +874 -0
  866. package/vendor/skills/skills/motion/references/common-patterns.md +247 -0
  867. package/vendor/skills/skills/motion/references/motion-vs-auto-animate.md +714 -0
  868. package/vendor/skills/skills/motion/references/nextjs-integration.md +694 -0
  869. package/vendor/skills/skills/motion/references/performance-optimization.md +898 -0
  870. package/vendor/skills/skills/motion/rules/motion.md +91 -0
  871. package/vendor/skills/skills/motion/scripts/init-motion.sh +241 -0
  872. package/vendor/skills/skills/motion/scripts/optimize-bundle.sh +215 -0
  873. package/vendor/skills/skills/motion/templates/layout-transitions.tsx +608 -0
  874. package/vendor/skills/skills/motion/templates/motion-nextjs-client.tsx +490 -0
  875. package/vendor/skills/skills/motion/templates/motion-vite-basic.tsx +366 -0
  876. package/vendor/skills/skills/motion/templates/scroll-parallax.tsx +506 -0
  877. package/vendor/skills/skills/motion/templates/ui-components.tsx +723 -0
  878. package/vendor/skills/skills/motion-react/SKILL.md +376 -0
  879. package/vendor/skills/skills/motion-react/references/animation-api.md +231 -0
  880. package/vendor/skills/skills/motion-react/references/gestures-and-drag.md +179 -0
  881. package/vendor/skills/skills/motion-react/references/hooks-and-motion-values.md +333 -0
  882. package/vendor/skills/skills/motion-react/references/layout-animations.md +208 -0
  883. package/vendor/skills/skills/motion-react/references/scroll-animations.md +229 -0
  884. package/vendor/skills/skills/motion-react/references/transitions-api.md +162 -0
  885. package/vendor/skills/skills/nano-banana-pro/SKILL.md +58 -0
  886. package/vendor/skills/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  887. package/vendor/skills/skills/nano-banana-prompting/SKILL.md +149 -0
  888. package/vendor/skills/skills/nano-banana-prompting/references/guide.md +403 -0
  889. package/vendor/skills/skills/next-best-practices/SKILL.md +171 -0
  890. package/vendor/skills/skills/next-best-practices/async-patterns.md +84 -0
  891. package/vendor/skills/skills/next-best-practices/bundling.md +182 -0
  892. package/vendor/skills/skills/next-best-practices/data-patterns.md +300 -0
  893. package/vendor/skills/skills/next-best-practices/debug-tricks.md +122 -0
  894. package/vendor/skills/skills/next-best-practices/directives.md +74 -0
  895. package/vendor/skills/skills/next-best-practices/error-handling.md +228 -0
  896. package/vendor/skills/skills/next-best-practices/file-conventions.md +141 -0
  897. package/vendor/skills/skills/next-best-practices/font.md +246 -0
  898. package/vendor/skills/skills/next-best-practices/functions.md +108 -0
  899. package/vendor/skills/skills/next-best-practices/hydration-error.md +86 -0
  900. package/vendor/skills/skills/next-best-practices/image.md +173 -0
  901. package/vendor/skills/skills/next-best-practices/metadata.md +292 -0
  902. package/vendor/skills/skills/next-best-practices/parallel-routes.md +286 -0
  903. package/vendor/skills/skills/next-best-practices/route-handlers.md +143 -0
  904. package/vendor/skills/skills/next-best-practices/rsc-boundaries.md +160 -0
  905. package/vendor/skills/skills/next-best-practices/runtime-selection.md +40 -0
  906. package/vendor/skills/skills/next-best-practices/scripts.md +137 -0
  907. package/vendor/skills/skills/next-best-practices/self-hosting.md +375 -0
  908. package/vendor/skills/skills/next-best-practices/suspense-boundaries.md +67 -0
  909. package/vendor/skills/skills/no-workarounds/SKILL.md +447 -0
  910. package/vendor/skills/skills/no-workarounds/references/philosophical-foundations.md +111 -0
  911. package/vendor/skills/skills/no-workarounds/references/workaround-catalog.md +565 -0
  912. package/vendor/skills/skills/organization-best-practices/SKILL.md +478 -0
  913. package/vendor/skills/skills/outside-to-issue/SKILL.md +105 -0
  914. package/vendor/skills/skills/pal/SKILL.md +184 -0
  915. package/vendor/skills/skills/pal/references/analyze.md +77 -0
  916. package/vendor/skills/skills/pal/references/debug.md +78 -0
  917. package/vendor/skills/skills/pal/references/planner.md +101 -0
  918. package/vendor/skills/skills/pal/references/refactor.md +88 -0
  919. package/vendor/skills/skills/pal/references/review.md +61 -0
  920. package/vendor/skills/skills/pal/references/tracer.md +66 -0
  921. package/vendor/skills/skills/perplexity/README.md +212 -0
  922. package/vendor/skills/skills/perplexity/SKILL.md +143 -0
  923. package/vendor/skills/skills/pitch-deck/SKILL.md +259 -0
  924. package/vendor/skills/skills/pitch-deck/index.js +9 -0
  925. package/vendor/skills/skills/pitch-deck/package.json +11 -0
  926. package/vendor/skills/skills/pitch-deck/references/pitch_deck_best_practices.md +241 -0
  927. package/vendor/skills/skills/pitch-deck/scripts/create_pitch_deck.py +298 -0
  928. package/vendor/skills/skills/pitch-deck-visuals/SKILL.md +215 -0
  929. package/vendor/skills/skills/pitch-deck-visuals/_meta.json +11 -0
  930. package/vendor/skills/skills/pitch-gen/README.md +22 -0
  931. package/vendor/skills/skills/pitch-gen/SKILL.md +78 -0
  932. package/vendor/skills/skills/pitch-gen/_meta.json +11 -0
  933. package/vendor/skills/skills/pitch-gen/package-lock.json +876 -0
  934. package/vendor/skills/skills/pitch-gen/package.json +35 -0
  935. package/vendor/skills/skills/pitch-gen/src/cli.ts +26 -0
  936. package/vendor/skills/skills/pitch-gen/src/index.ts +18 -0
  937. package/vendor/skills/skills/pitch-gen/tsconfig.json +13 -0
  938. package/vendor/skills/skills/postgres-drizzle/SKILL.md +190 -0
  939. package/vendor/skills/skills/postgres-drizzle/references/CHEATSHEET.md +424 -0
  940. package/vendor/skills/skills/postgres-drizzle/references/MIGRATIONS.md +545 -0
  941. package/vendor/skills/skills/postgres-drizzle/references/PERFORMANCE.md +564 -0
  942. package/vendor/skills/skills/postgres-drizzle/references/POSTGRES.md +590 -0
  943. package/vendor/skills/skills/postgres-drizzle/references/QUERIES.md +701 -0
  944. package/vendor/skills/skills/postgres-drizzle/references/RELATIONS.md +651 -0
  945. package/vendor/skills/skills/postgres-drizzle/references/SCHEMA.md +574 -0
  946. package/vendor/skills/skills/pptx-creator/SKILL.md +239 -0
  947. package/vendor/skills/skills/pptx-creator/_meta.json +11 -0
  948. package/vendor/skills/skills/pptx-creator/references/outline-format.md +127 -0
  949. package/vendor/skills/skills/pptx-creator/scripts/analyze_template.py +182 -0
  950. package/vendor/skills/skills/pptx-creator/scripts/create_pptx.py +488 -0
  951. package/vendor/skills/skills/pptx-creator/scripts/create_template.py +427 -0
  952. package/vendor/skills/skills/pptx-creator/scripts/use_template.py +195 -0
  953. package/vendor/skills/skills/pptx-creator/templates/templates.json +70 -0
  954. package/vendor/skills/skills/professional-communication/README.md +234 -0
  955. package/vendor/skills/skills/professional-communication/SKILL.md +272 -0
  956. package/vendor/skills/skills/professional-communication/references/email-templates.md +300 -0
  957. package/vendor/skills/skills/professional-communication/references/jargon-simplification.md +164 -0
  958. package/vendor/skills/skills/professional-communication/references/meeting-structures.md +333 -0
  959. package/vendor/skills/skills/professional-communication/references/remote-async-communication.md +310 -0
  960. package/vendor/skills/skills/promo-video/SKILL.md +465 -0
  961. package/vendor/skills/skills/promo-video/metallic-swoosh.md +94 -0
  962. package/vendor/skills/skills/promo-video/music/inspired-ambient-141686.mp3 +0 -0
  963. package/vendor/skills/skills/promo-video/music/motivational-day-112790.mp3 +0 -0
  964. package/vendor/skills/skills/promo-video/music/the-upbeat-inspiring-corporate-142313.mp3 +0 -0
  965. package/vendor/skills/skills/promo-video/promo-patterns.md +184 -0
  966. package/vendor/skills/skills/promo-video/scripts/generate_voiceover.py +266 -0
  967. package/vendor/skills/skills/promo-video/voiceover.md +358 -0
  968. package/vendor/skills/skills/qa-test-planner/README.md +394 -0
  969. package/vendor/skills/skills/qa-test-planner/SKILL.md +827 -0
  970. package/vendor/skills/skills/qa-test-planner/references/bug_report_templates.md +457 -0
  971. package/vendor/skills/skills/qa-test-planner/references/figma_validation.md +381 -0
  972. package/vendor/skills/skills/qa-test-planner/references/regression_testing.md +406 -0
  973. package/vendor/skills/skills/qa-test-planner/references/test_case_templates.md +457 -0
  974. package/vendor/skills/skills/qa-test-planner/scripts/create_bug_report.sh +276 -0
  975. package/vendor/skills/skills/qa-test-planner/scripts/generate_test_cases.sh +302 -0
  976. package/vendor/skills/skills/ratatui-tui/SKILL.md +422 -0
  977. package/vendor/skills/skills/ratatui-tui/assets/templates/async-app/Cargo.lock +1914 -0
  978. package/vendor/skills/skills/ratatui-tui/assets/templates/async-app/Cargo.toml +11 -0
  979. package/vendor/skills/skills/ratatui-tui/assets/templates/async-app/src/main.rs +122 -0
  980. package/vendor/skills/skills/ratatui-tui/assets/templates/component-app/Cargo.lock +2433 -0
  981. package/vendor/skills/skills/ratatui-tui/assets/templates/component-app/Cargo.toml +24 -0
  982. package/vendor/skills/skills/ratatui-tui/assets/templates/component-app/src/action.rs +16 -0
  983. package/vendor/skills/skills/ratatui-tui/assets/templates/component-app/src/app.rs +97 -0
  984. package/vendor/skills/skills/ratatui-tui/assets/templates/component-app/src/config.rs +67 -0
  985. package/vendor/skills/skills/ratatui-tui/assets/templates/component-app/src/event.rs +44 -0
  986. package/vendor/skills/skills/ratatui-tui/assets/templates/component-app/src/logging.rs +34 -0
  987. package/vendor/skills/skills/ratatui-tui/assets/templates/component-app/src/main.rs +51 -0
  988. package/vendor/skills/skills/ratatui-tui/assets/templates/component-app/src/tui.rs +59 -0
  989. package/vendor/skills/skills/ratatui-tui/assets/templates/component-app/src/ui.rs +65 -0
  990. package/vendor/skills/skills/ratatui-tui/assets/templates/hello-world/Cargo.lock +1511 -0
  991. package/vendor/skills/skills/ratatui-tui/assets/templates/hello-world/Cargo.toml +8 -0
  992. package/vendor/skills/skills/ratatui-tui/assets/templates/hello-world/src/main.rs +23 -0
  993. package/vendor/skills/skills/ratatui-tui/assets/templates/simple-app/Cargo.lock +1692 -0
  994. package/vendor/skills/skills/ratatui-tui/assets/templates/simple-app/Cargo.toml +9 -0
  995. package/vendor/skills/skills/ratatui-tui/assets/templates/simple-app/src/main.rs +100 -0
  996. package/vendor/skills/skills/ratatui-tui/references/architecture-patterns.md +448 -0
  997. package/vendor/skills/skills/ratatui-tui/references/async-patterns.md +426 -0
  998. package/vendor/skills/skills/ratatui-tui/references/image-integration.md +395 -0
  999. package/vendor/skills/skills/ratatui-tui/references/style-guide.md +249 -0
  1000. package/vendor/skills/skills/react/SKILL.md +195 -0
  1001. package/vendor/skills/skills/react/references/best-practices.md +1093 -0
  1002. package/vendor/skills/skills/react/references/useeffect-patterns.md +620 -0
  1003. package/vendor/skills/skills/receiving-code-review/SKILL.md +226 -0
  1004. package/vendor/skills/skills/remotion-best-practices/SKILL.md +61 -0
  1005. package/vendor/skills/skills/remotion-best-practices/rules/3d.md +86 -0
  1006. package/vendor/skills/skills/remotion-best-practices/rules/animations.md +27 -0
  1007. package/vendor/skills/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +165 -0
  1008. package/vendor/skills/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +89 -0
  1009. package/vendor/skills/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +101 -0
  1010. package/vendor/skills/skills/remotion-best-practices/rules/assets.md +78 -0
  1011. package/vendor/skills/skills/remotion-best-practices/rules/audio-visualization.md +195 -0
  1012. package/vendor/skills/skills/remotion-best-practices/rules/audio.md +167 -0
  1013. package/vendor/skills/skills/remotion-best-practices/rules/calculate-metadata.md +118 -0
  1014. package/vendor/skills/skills/remotion-best-practices/rules/can-decode.md +75 -0
  1015. package/vendor/skills/skills/remotion-best-practices/rules/charts.md +116 -0
  1016. package/vendor/skills/skills/remotion-best-practices/rules/compositions.md +153 -0
  1017. package/vendor/skills/skills/remotion-best-practices/rules/display-captions.md +176 -0
  1018. package/vendor/skills/skills/remotion-best-practices/rules/extract-frames.md +217 -0
  1019. package/vendor/skills/skills/remotion-best-practices/rules/ffmpeg.md +34 -0
  1020. package/vendor/skills/skills/remotion-best-practices/rules/fonts.md +152 -0
  1021. package/vendor/skills/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  1022. package/vendor/skills/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  1023. package/vendor/skills/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
  1024. package/vendor/skills/skills/remotion-best-practices/rules/gifs.md +135 -0
  1025. package/vendor/skills/skills/remotion-best-practices/rules/images.md +130 -0
  1026. package/vendor/skills/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
  1027. package/vendor/skills/skills/remotion-best-practices/rules/light-leaks.md +73 -0
  1028. package/vendor/skills/skills/remotion-best-practices/rules/lottie.md +67 -0
  1029. package/vendor/skills/skills/remotion-best-practices/rules/maps.md +405 -0
  1030. package/vendor/skills/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
  1031. package/vendor/skills/skills/remotion-best-practices/rules/measuring-text.md +140 -0
  1032. package/vendor/skills/skills/remotion-best-practices/rules/parameters.md +109 -0
  1033. package/vendor/skills/skills/remotion-best-practices/rules/sequencing.md +118 -0
  1034. package/vendor/skills/skills/remotion-best-practices/rules/sfx.md +26 -0
  1035. package/vendor/skills/skills/remotion-best-practices/rules/subtitles.md +36 -0
  1036. package/vendor/skills/skills/remotion-best-practices/rules/tailwind.md +11 -0
  1037. package/vendor/skills/skills/remotion-best-practices/rules/text-animations.md +20 -0
  1038. package/vendor/skills/skills/remotion-best-practices/rules/timing.md +179 -0
  1039. package/vendor/skills/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
  1040. package/vendor/skills/skills/remotion-best-practices/rules/transitions.md +193 -0
  1041. package/vendor/skills/skills/remotion-best-practices/rules/transparent-videos.md +102 -0
  1042. package/vendor/skills/skills/remotion-best-practices/rules/trimming.md +51 -0
  1043. package/vendor/skills/skills/remotion-best-practices/rules/videos.md +169 -0
  1044. package/vendor/skills/skills/remotion-best-practices/rules/voiceover.md +94 -0
  1045. package/vendor/skills/skills/requirements-clarity/README.md +275 -0
  1046. package/vendor/skills/skills/requirements-clarity/SKILL.md +358 -0
  1047. package/vendor/skills/skills/rivetkit/SKILL.md +1058 -0
  1048. package/vendor/skills/skills/rivetkit/index.json +540 -0
  1049. package/vendor/skills/skills/rivetkit/openapi.json +1223 -0
  1050. package/vendor/skills/skills/rivetkit/reference/actors/access-control.md +133 -0
  1051. package/vendor/skills/skills/rivetkit/reference/actors/actions.md +386 -0
  1052. package/vendor/skills/skills/rivetkit/reference/actors/ai-and-user-generated-actors.md +309 -0
  1053. package/vendor/skills/skills/rivetkit/reference/actors/appearance.md +186 -0
  1054. package/vendor/skills/skills/rivetkit/reference/actors/authentication.md +598 -0
  1055. package/vendor/skills/skills/rivetkit/reference/actors/communicating-between-actors.md +335 -0
  1056. package/vendor/skills/skills/rivetkit/reference/actors/connections.md +444 -0
  1057. package/vendor/skills/skills/rivetkit/reference/actors/debugging.md +378 -0
  1058. package/vendor/skills/skills/rivetkit/reference/actors/design-patterns.md +630 -0
  1059. package/vendor/skills/skills/rivetkit/reference/actors/destroy.md +116 -0
  1060. package/vendor/skills/skills/rivetkit/reference/actors/ephemeral-variables.md +178 -0
  1061. package/vendor/skills/skills/rivetkit/reference/actors/errors.md +442 -0
  1062. package/vendor/skills/skills/rivetkit/reference/actors/events.md +393 -0
  1063. package/vendor/skills/skills/rivetkit/reference/actors/fetch-and-websocket-handler.md +9 -0
  1064. package/vendor/skills/skills/rivetkit/reference/actors/helper-types.md +9 -0
  1065. package/vendor/skills/skills/rivetkit/reference/actors/http-api.md +11 -0
  1066. package/vendor/skills/skills/rivetkit/reference/actors/input.md +308 -0
  1067. package/vendor/skills/skills/rivetkit/reference/actors/keys.md +269 -0
  1068. package/vendor/skills/skills/rivetkit/reference/actors/kv.md +126 -0
  1069. package/vendor/skills/skills/rivetkit/reference/actors/lifecycle.md +1052 -0
  1070. package/vendor/skills/skills/rivetkit/reference/actors/limits.md +143 -0
  1071. package/vendor/skills/skills/rivetkit/reference/actors/metadata.md +149 -0
  1072. package/vendor/skills/skills/rivetkit/reference/actors/postgres.md +262 -0
  1073. package/vendor/skills/skills/rivetkit/reference/actors/queues.md +414 -0
  1074. package/vendor/skills/skills/rivetkit/reference/actors/quickstart/backend.md +164 -0
  1075. package/vendor/skills/skills/rivetkit/reference/actors/quickstart/cloudflare-workers.md +412 -0
  1076. package/vendor/skills/skills/rivetkit/reference/actors/quickstart/next-js.md +122 -0
  1077. package/vendor/skills/skills/rivetkit/reference/actors/quickstart/react.md +144 -0
  1078. package/vendor/skills/skills/rivetkit/reference/actors/request-handler.md +241 -0
  1079. package/vendor/skills/skills/rivetkit/reference/actors/scaling.md +9 -0
  1080. package/vendor/skills/skills/rivetkit/reference/actors/schedule.md +102 -0
  1081. package/vendor/skills/skills/rivetkit/reference/actors/sharing-and-joining-state.md +9 -0
  1082. package/vendor/skills/skills/rivetkit/reference/actors/sqlite-drizzle.md +245 -0
  1083. package/vendor/skills/skills/rivetkit/reference/actors/sqlite.md +237 -0
  1084. package/vendor/skills/skills/rivetkit/reference/actors/state.md +204 -0
  1085. package/vendor/skills/skills/rivetkit/reference/actors/testing.md +237 -0
  1086. package/vendor/skills/skills/rivetkit/reference/actors/types.md +106 -0
  1087. package/vendor/skills/skills/rivetkit/reference/actors/versions.md +109 -0
  1088. package/vendor/skills/skills/rivetkit/reference/actors/websocket-handler.md +320 -0
  1089. package/vendor/skills/skills/rivetkit/reference/actors/workflows.md +1958 -0
  1090. package/vendor/skills/skills/rivetkit/reference/clients/javascript.md +236 -0
  1091. package/vendor/skills/skills/rivetkit/reference/clients/react.md +270 -0
  1092. package/vendor/skills/skills/rivetkit/reference/clients/swift.md +459 -0
  1093. package/vendor/skills/skills/rivetkit/reference/clients/swiftui.md +364 -0
  1094. package/vendor/skills/skills/rivetkit/reference/connect/aws-ecs.md +14 -0
  1095. package/vendor/skills/skills/rivetkit/reference/connect/aws-lambda.md +9 -0
  1096. package/vendor/skills/skills/rivetkit/reference/connect/cloudflare-workers.md +125 -0
  1097. package/vendor/skills/skills/rivetkit/reference/connect/freestyle.md +132 -0
  1098. package/vendor/skills/skills/rivetkit/reference/connect/gcp-cloud-run.md +75 -0
  1099. package/vendor/skills/skills/rivetkit/reference/connect/hetzner.md +9 -0
  1100. package/vendor/skills/skills/rivetkit/reference/connect/kubernetes.md +109 -0
  1101. package/vendor/skills/skills/rivetkit/reference/connect/railway.md +44 -0
  1102. package/vendor/skills/skills/rivetkit/reference/connect/supabase.md +9 -0
  1103. package/vendor/skills/skills/rivetkit/reference/connect/vercel.md +158 -0
  1104. package/vendor/skills/skills/rivetkit/reference/connect/vm-and-bare-metal.md +89 -0
  1105. package/vendor/skills/skills/rivetkit/reference/cookbook/multiplayer-game.md +714 -0
  1106. package/vendor/skills/skills/rivetkit/reference/general/actor-configuration.md +42 -0
  1107. package/vendor/skills/skills/rivetkit/reference/general/architecture.md +452 -0
  1108. package/vendor/skills/skills/rivetkit/reference/general/cors.md +71 -0
  1109. package/vendor/skills/skills/rivetkit/reference/general/docs-for-llms.md +56 -0
  1110. package/vendor/skills/skills/rivetkit/reference/general/edge.md +40 -0
  1111. package/vendor/skills/skills/rivetkit/reference/general/endpoints.md +129 -0
  1112. package/vendor/skills/skills/rivetkit/reference/general/environment-variables.md +73 -0
  1113. package/vendor/skills/skills/rivetkit/reference/general/http-server.md +144 -0
  1114. package/vendor/skills/skills/rivetkit/reference/general/logging.md +153 -0
  1115. package/vendor/skills/skills/rivetkit/reference/general/registry-configuration.md +98 -0
  1116. package/vendor/skills/skills/rivetkit/reference/general/runtime-modes.md +156 -0
  1117. package/vendor/skills/skills/rivetkit/reference/self-hosting/configuration.md +53 -0
  1118. package/vendor/skills/skills/rivetkit/reference/self-hosting/docker-compose.md +148 -0
  1119. package/vendor/skills/skills/rivetkit/reference/self-hosting/docker-container.md +93 -0
  1120. package/vendor/skills/skills/rivetkit/reference/self-hosting/filesystem.md +48 -0
  1121. package/vendor/skills/skills/rivetkit/reference/self-hosting/install.md +33 -0
  1122. package/vendor/skills/skills/rivetkit/reference/self-hosting/kubernetes.md +496 -0
  1123. package/vendor/skills/skills/rivetkit/reference/self-hosting/multi-region.md +11 -0
  1124. package/vendor/skills/skills/rivetkit/reference/self-hosting/postgres.md +193 -0
  1125. package/vendor/skills/skills/rivetkit/reference/self-hosting/railway.md +71 -0
  1126. package/vendor/skills/skills/rivetkit-client-javascript/SKILL.md +259 -0
  1127. package/vendor/skills/skills/rivetkit-client-javascript/index.json +7 -0
  1128. package/vendor/skills/skills/rivetkit-client-react/SKILL.md +293 -0
  1129. package/vendor/skills/skills/rivetkit-client-react/index.json +7 -0
  1130. package/vendor/skills/skills/rust-async-patterns/SKILL.md +519 -0
  1131. package/vendor/skills/skills/rust-best-practices/SKILL.md +104 -0
  1132. package/vendor/skills/skills/rust-best-practices/references/chapter_01.md +591 -0
  1133. package/vendor/skills/skills/rust-best-practices/references/chapter_02.md +119 -0
  1134. package/vendor/skills/skills/rust-best-practices/references/chapter_03.md +226 -0
  1135. package/vendor/skills/skills/rust-best-practices/references/chapter_04.md +187 -0
  1136. package/vendor/skills/skills/rust-best-practices/references/chapter_05.md +406 -0
  1137. package/vendor/skills/skills/rust-best-practices/references/chapter_06.md +168 -0
  1138. package/vendor/skills/skills/rust-best-practices/references/chapter_07.md +231 -0
  1139. package/vendor/skills/skills/rust-best-practices/references/chapter_08.md +276 -0
  1140. package/vendor/skills/skills/rust-best-practices/references/chapter_09.md +259 -0
  1141. package/vendor/skills/skills/rust-coding-guidelines/SKILL.md +95 -0
  1142. package/vendor/skills/skills/rust-coding-guidelines/index/rules-index.md +7 -0
  1143. package/vendor/skills/skills/rust-engineer/SKILL.md +89 -0
  1144. package/vendor/skills/skills/rust-engineer/references/async.md +458 -0
  1145. package/vendor/skills/skills/rust-engineer/references/error-handling.md +334 -0
  1146. package/vendor/skills/skills/rust-engineer/references/ownership.md +278 -0
  1147. package/vendor/skills/skills/rust-engineer/references/testing.md +470 -0
  1148. package/vendor/skills/skills/rust-engineer/references/traits.md +413 -0
  1149. package/vendor/skills/skills/sales-methodology-implementer/SKILL.md +735 -0
  1150. package/vendor/skills/skills/sentry-cli/SKILL.md +459 -0
  1151. package/vendor/skills/skills/shadcn/SKILL.md +141 -0
  1152. package/vendor/skills/skills/shadcn/references/patterns.md +587 -0
  1153. package/vendor/skills/skills/shadcn-ui/SKILL.md +1911 -0
  1154. package/vendor/skills/skills/shadcn-ui/references/chart.md +303 -0
  1155. package/vendor/skills/skills/shadcn-ui/references/learn.md +150 -0
  1156. package/vendor/skills/skills/shadcn-ui/references/official-ui-reference.md +1721 -0
  1157. package/vendor/skills/skills/shadcn-ui/references/reference.md +608 -0
  1158. package/vendor/skills/skills/shadcn-ui/references/ui-reference.md +1588 -0
  1159. package/vendor/skills/skills/ship-learn-next/README.md +191 -0
  1160. package/vendor/skills/skills/ship-learn-next/SKILL.md +359 -0
  1161. package/vendor/skills/skills/skill-writter/SKILL.md +408 -0
  1162. package/vendor/skills/skills/skills-best-practices/SKILL.md +51 -0
  1163. package/vendor/skills/skills/skills-best-practices/assets/SKILL.template.md +24 -0
  1164. package/vendor/skills/skills/skills-best-practices/references/checklist.md +37 -0
  1165. package/vendor/skills/skills/skills-best-practices/scripts/validate-metadata.py +46 -0
  1166. package/vendor/skills/skills/sourcebot/SKILL.md +89 -0
  1167. package/vendor/skills/skills/startup-validator/SKILL.md +425 -0
  1168. package/vendor/skills/skills/startup-validator/index.js +9 -0
  1169. package/vendor/skills/skills/startup-validator/package.json +11 -0
  1170. package/vendor/skills/skills/startup-validator/references/frameworks.md +134 -0
  1171. package/vendor/skills/skills/startup-validator/references/research_templates.md +191 -0
  1172. package/vendor/skills/skills/startup-validator/scripts/market_analyzer.py +290 -0
  1173. package/vendor/skills/skills/storybook/SKILL.md +440 -0
  1174. package/vendor/skills/skills/storybook-stories/SKILL.md +359 -0
  1175. package/vendor/skills/skills/storybook-stories/references/patterns.md +60 -0
  1176. package/vendor/skills/skills/stripe-best-practices/SKILL.md +30 -0
  1177. package/vendor/skills/skills/stripe-integration/SKILL.md +492 -0
  1178. package/vendor/skills/skills/stripe-subscriptions/SKILL.md +54 -0
  1179. package/vendor/skills/skills/stripe-webhooks/SKILL.md +163 -0
  1180. package/vendor/skills/skills/stripe-webhooks/examples/express/.env.example +5 -0
  1181. package/vendor/skills/skills/stripe-webhooks/examples/express/README.md +64 -0
  1182. package/vendor/skills/skills/stripe-webhooks/examples/express/package.json +19 -0
  1183. package/vendor/skills/skills/stripe-webhooks/examples/express/src/index.js +75 -0
  1184. package/vendor/skills/skills/stripe-webhooks/examples/express/test/webhook.test.js +129 -0
  1185. package/vendor/skills/skills/stripe-webhooks/examples/fastapi/.env.example +5 -0
  1186. package/vendor/skills/skills/stripe-webhooks/examples/fastapi/README.md +69 -0
  1187. package/vendor/skills/skills/stripe-webhooks/examples/fastapi/main.py +75 -0
  1188. package/vendor/skills/skills/stripe-webhooks/examples/fastapi/requirements.txt +6 -0
  1189. package/vendor/skills/skills/stripe-webhooks/examples/fastapi/test_webhook.py +121 -0
  1190. package/vendor/skills/skills/stripe-webhooks/examples/nextjs/.env.example +5 -0
  1191. package/vendor/skills/skills/stripe-webhooks/examples/nextjs/README.md +62 -0
  1192. package/vendor/skills/skills/stripe-webhooks/examples/nextjs/app/webhooks/stripe/route.ts +63 -0
  1193. package/vendor/skills/skills/stripe-webhooks/examples/nextjs/package.json +23 -0
  1194. package/vendor/skills/skills/stripe-webhooks/examples/nextjs/test/webhook.test.ts +139 -0
  1195. package/vendor/skills/skills/stripe-webhooks/examples/nextjs/vitest.config.ts +8 -0
  1196. package/vendor/skills/skills/stripe-webhooks/references/overview.md +62 -0
  1197. package/vendor/skills/skills/stripe-webhooks/references/setup.md +99 -0
  1198. package/vendor/skills/skills/stripe-webhooks/references/verification.md +154 -0
  1199. package/vendor/skills/skills/sync-provider/SKILL.md +348 -0
  1200. package/vendor/skills/skills/systematic-debugging/CREATION-LOG.md +133 -0
  1201. package/vendor/skills/skills/systematic-debugging/SKILL.md +305 -0
  1202. package/vendor/skills/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  1203. package/vendor/skills/skills/systematic-debugging/condition-based-waiting.md +120 -0
  1204. package/vendor/skills/skills/systematic-debugging/defense-in-depth.md +128 -0
  1205. package/vendor/skills/skills/systematic-debugging/find-polluter.sh +63 -0
  1206. package/vendor/skills/skills/systematic-debugging/root-cause-tracing.md +183 -0
  1207. package/vendor/skills/skills/systematic-debugging/test-academic.md +14 -0
  1208. package/vendor/skills/skills/systematic-debugging/test-pressure-1.md +65 -0
  1209. package/vendor/skills/skills/systematic-debugging/test-pressure-2.md +75 -0
  1210. package/vendor/skills/skills/systematic-debugging/test-pressure-3.md +75 -0
  1211. package/vendor/skills/skills/tailwindcss/SKILL.md +122 -0
  1212. package/vendor/skills/skills/tailwindcss/references/patterns.md +439 -0
  1213. package/vendor/skills/skills/tanstack/SKILL.md +278 -0
  1214. package/vendor/skills/skills/tanstack/references/form-patterns.md +638 -0
  1215. package/vendor/skills/skills/tanstack/references/query-patterns.md +343 -0
  1216. package/vendor/skills/skills/tanstack/references/router-patterns.md +373 -0
  1217. package/vendor/skills/skills/tanstack-query-best-practices/SKILL.md +115 -0
  1218. package/vendor/skills/skills/tanstack-query-best-practices/rules/cache-gc-time.md +93 -0
  1219. package/vendor/skills/skills/tanstack-query-best-practices/rules/cache-invalidation.md +114 -0
  1220. package/vendor/skills/skills/tanstack-query-best-practices/rules/cache-placeholder-vs-initial.md +152 -0
  1221. package/vendor/skills/skills/tanstack-query-best-practices/rules/cache-stale-time.md +80 -0
  1222. package/vendor/skills/skills/tanstack-query-best-practices/rules/err-error-boundaries.md +147 -0
  1223. package/vendor/skills/skills/tanstack-query-best-practices/rules/inf-page-params.md +119 -0
  1224. package/vendor/skills/skills/tanstack-query-best-practices/rules/mut-invalidate-queries.md +118 -0
  1225. package/vendor/skills/skills/tanstack-query-best-practices/rules/mut-mutation-state.md +164 -0
  1226. package/vendor/skills/skills/tanstack-query-best-practices/rules/mut-optimistic-updates.md +131 -0
  1227. package/vendor/skills/skills/tanstack-query-best-practices/rules/network-mode.md +168 -0
  1228. package/vendor/skills/skills/tanstack-query-best-practices/rules/parallel-use-queries.md +154 -0
  1229. package/vendor/skills/skills/tanstack-query-best-practices/rules/perf-select-transform.md +144 -0
  1230. package/vendor/skills/skills/tanstack-query-best-practices/rules/persist-queries.md +192 -0
  1231. package/vendor/skills/skills/tanstack-query-best-practices/rules/pf-intent-prefetch.md +137 -0
  1232. package/vendor/skills/skills/tanstack-query-best-practices/rules/qk-array-structure.md +50 -0
  1233. package/vendor/skills/skills/tanstack-query-best-practices/rules/qk-factory-pattern.md +104 -0
  1234. package/vendor/skills/skills/tanstack-query-best-practices/rules/qk-hierarchical-organization.md +76 -0
  1235. package/vendor/skills/skills/tanstack-query-best-practices/rules/qk-include-dependencies.md +62 -0
  1236. package/vendor/skills/skills/tanstack-query-best-practices/rules/qk-serializable.md +97 -0
  1237. package/vendor/skills/skills/tanstack-query-best-practices/rules/query-cancellation.md +168 -0
  1238. package/vendor/skills/skills/tanstack-query-best-practices/rules/ssr-dehydration.md +154 -0
  1239. package/vendor/skills/skills/tanstack-router-best-practices/SKILL.md +114 -0
  1240. package/vendor/skills/skills/tanstack-router-best-practices/rules/ctx-root-context.md +170 -0
  1241. package/vendor/skills/skills/tanstack-router-best-practices/rules/err-not-found.md +194 -0
  1242. package/vendor/skills/skills/tanstack-router-best-practices/rules/load-ensure-query-data.md +147 -0
  1243. package/vendor/skills/skills/tanstack-router-best-practices/rules/load-parallel.md +186 -0
  1244. package/vendor/skills/skills/tanstack-router-best-practices/rules/load-use-loaders.md +148 -0
  1245. package/vendor/skills/skills/tanstack-router-best-practices/rules/nav-link-component.md +171 -0
  1246. package/vendor/skills/skills/tanstack-router-best-practices/rules/nav-route-masks.md +195 -0
  1247. package/vendor/skills/skills/tanstack-router-best-practices/rules/org-virtual-routes.md +133 -0
  1248. package/vendor/skills/skills/tanstack-router-best-practices/rules/preload-intent.md +133 -0
  1249. package/vendor/skills/skills/tanstack-router-best-practices/rules/router-default-options.md +159 -0
  1250. package/vendor/skills/skills/tanstack-router-best-practices/rules/search-custom-serializer.md +198 -0
  1251. package/vendor/skills/skills/tanstack-router-best-practices/rules/search-validation.md +154 -0
  1252. package/vendor/skills/skills/tanstack-router-best-practices/rules/split-lazy-routes.md +148 -0
  1253. package/vendor/skills/skills/tanstack-router-best-practices/rules/ts-register-router.md +113 -0
  1254. package/vendor/skills/skills/tanstack-router-best-practices/rules/ts-use-from-param.md +130 -0
  1255. package/vendor/skills/skills/tanstack-start-best-practices/SKILL.md +110 -0
  1256. package/vendor/skills/skills/tanstack-start-best-practices/rules/api-routes.md +236 -0
  1257. package/vendor/skills/skills/tanstack-start-best-practices/rules/auth-route-protection.md +188 -0
  1258. package/vendor/skills/skills/tanstack-start-best-practices/rules/auth-session-management.md +189 -0
  1259. package/vendor/skills/skills/tanstack-start-best-practices/rules/deploy-adapters.md +197 -0
  1260. package/vendor/skills/skills/tanstack-start-best-practices/rules/env-functions.md +207 -0
  1261. package/vendor/skills/skills/tanstack-start-best-practices/rules/err-server-errors.md +189 -0
  1262. package/vendor/skills/skills/tanstack-start-best-practices/rules/file-separation.md +151 -0
  1263. package/vendor/skills/skills/tanstack-start-best-practices/rules/mw-request-middleware.md +157 -0
  1264. package/vendor/skills/skills/tanstack-start-best-practices/rules/sf-create-server-fn.md +146 -0
  1265. package/vendor/skills/skills/tanstack-start-best-practices/rules/sf-input-validation.md +168 -0
  1266. package/vendor/skills/skills/tanstack-start-best-practices/rules/ssr-hydration-safety.md +184 -0
  1267. package/vendor/skills/skills/tanstack-start-best-practices/rules/ssr-prerender.md +190 -0
  1268. package/vendor/skills/skills/tanstack-start-best-practices/rules/ssr-streaming.md +201 -0
  1269. package/vendor/skills/skills/tauri-v2/README.md +157 -0
  1270. package/vendor/skills/skills/tauri-v2/SKILL.md +378 -0
  1271. package/vendor/skills/skills/tauri-v2/assets/README.md +18 -0
  1272. package/vendor/skills/skills/tauri-v2/references/README.md +10 -0
  1273. package/vendor/skills/skills/tauri-v2/references/capabilities-reference.md +310 -0
  1274. package/vendor/skills/skills/tauri-v2/references/ipc-patterns.md +484 -0
  1275. package/vendor/skills/skills/tauri-v2/scripts/README.md +31 -0
  1276. package/vendor/skills/skills/tech-logos/SKILL.md +88 -0
  1277. package/vendor/skills/skills/terraform-style-guide/SKILL.md +357 -0
  1278. package/vendor/skills/skills/test-antipatterns/SKILL.md +309 -0
  1279. package/vendor/skills/skills/to-prompt/SKILL.md +90 -0
  1280. package/vendor/skills/skills/typescript-advanced/SKILL.md +760 -0
  1281. package/vendor/skills/skills/typescript-advanced/references/best-practices.md +358 -0
  1282. package/vendor/skills/skills/ui-ux-pro-max/SKILL.md +404 -0
  1283. package/vendor/skills/skills/ui-ux-pro-max/data/charts.csv +26 -0
  1284. package/vendor/skills/skills/ui-ux-pro-max/data/colors.csv +97 -0
  1285. package/vendor/skills/skills/ui-ux-pro-max/data/icons.csv +101 -0
  1286. package/vendor/skills/skills/ui-ux-pro-max/data/landing.csv +31 -0
  1287. package/vendor/skills/skills/ui-ux-pro-max/data/products.csv +97 -0
  1288. package/vendor/skills/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  1289. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  1290. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  1291. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  1292. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  1293. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  1294. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  1295. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  1296. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  1297. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  1298. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  1299. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  1300. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  1301. package/vendor/skills/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  1302. package/vendor/skills/skills/ui-ux-pro-max/data/styles.csv +68 -0
  1303. package/vendor/skills/skills/ui-ux-pro-max/data/typography.csv +58 -0
  1304. package/vendor/skills/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  1305. package/vendor/skills/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  1306. package/vendor/skills/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  1307. package/vendor/skills/skills/ui-ux-pro-max/scripts/core.py +253 -0
  1308. package/vendor/skills/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  1309. package/vendor/skills/skills/ui-ux-pro-max/scripts/search.py +114 -0
  1310. package/vendor/skills/skills/vercel-composition-patterns/AGENTS.md +917 -0
  1311. package/vendor/skills/skills/vercel-composition-patterns/SKILL.md +88 -0
  1312. package/vendor/skills/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +94 -0
  1313. package/vendor/skills/skills/vercel-composition-patterns/rules/architecture-compound-components.md +108 -0
  1314. package/vendor/skills/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +84 -0
  1315. package/vendor/skills/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +94 -0
  1316. package/vendor/skills/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  1317. package/vendor/skills/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  1318. package/vendor/skills/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +103 -0
  1319. package/vendor/skills/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  1320. package/vendor/skills/skills/vercel-react-best-practices/AGENTS.md +2367 -0
  1321. package/vendor/skills/skills/vercel-react-best-practices/SKILL.md +127 -0
  1322. package/vendor/skills/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  1323. package/vendor/skills/skills/vercel-react-best-practices/rules/advanced-use-latest.md +49 -0
  1324. package/vendor/skills/skills/vercel-react-best-practices/rules/async-api-routes.md +35 -0
  1325. package/vendor/skills/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  1326. package/vendor/skills/skills/vercel-react-best-practices/rules/async-dependencies.md +37 -0
  1327. package/vendor/skills/skills/vercel-react-best-practices/rules/async-parallel.md +24 -0
  1328. package/vendor/skills/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  1329. package/vendor/skills/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  1330. package/vendor/skills/skills/vercel-react-best-practices/rules/bundle-conditional.md +37 -0
  1331. package/vendor/skills/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +48 -0
  1332. package/vendor/skills/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +34 -0
  1333. package/vendor/skills/skills/vercel-react-best-practices/rules/bundle-preload.md +44 -0
  1334. package/vendor/skills/skills/vercel-react-best-practices/rules/client-event-listeners.md +78 -0
  1335. package/vendor/skills/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +74 -0
  1336. package/vendor/skills/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  1337. package/vendor/skills/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  1338. package/vendor/skills/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +57 -0
  1339. package/vendor/skills/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  1340. package/vendor/skills/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  1341. package/vendor/skills/skills/vercel-react-best-practices/rules/js-cache-storage.md +68 -0
  1342. package/vendor/skills/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  1343. package/vendor/skills/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  1344. package/vendor/skills/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  1345. package/vendor/skills/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  1346. package/vendor/skills/skills/vercel-react-best-practices/rules/js-length-check-first.md +50 -0
  1347. package/vendor/skills/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  1348. package/vendor/skills/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  1349. package/vendor/skills/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  1350. package/vendor/skills/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  1351. package/vendor/skills/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
  1352. package/vendor/skills/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +32 -0
  1353. package/vendor/skills/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  1354. package/vendor/skills/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +36 -0
  1355. package/vendor/skills/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +72 -0
  1356. package/vendor/skills/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  1357. package/vendor/skills/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  1358. package/vendor/skills/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  1359. package/vendor/skills/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  1360. package/vendor/skills/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +77 -0
  1361. package/vendor/skills/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +56 -0
  1362. package/vendor/skills/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  1363. package/vendor/skills/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  1364. package/vendor/skills/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  1365. package/vendor/skills/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  1366. package/vendor/skills/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  1367. package/vendor/skills/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  1368. package/vendor/skills/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  1369. package/vendor/skills/skills/verification-before-completion/SKILL.md +147 -0
  1370. package/vendor/skills/skills/vitest/GENERATION.md +5 -0
  1371. package/vendor/skills/skills/vitest/SKILL.md +53 -0
  1372. package/vendor/skills/skills/vitest/references/advanced-environments.md +264 -0
  1373. package/vendor/skills/skills/vitest/references/advanced-projects.md +300 -0
  1374. package/vendor/skills/skills/vitest/references/advanced-type-testing.md +242 -0
  1375. package/vendor/skills/skills/vitest/references/advanced-vi.md +249 -0
  1376. package/vendor/skills/skills/vitest/references/core-cli.md +167 -0
  1377. package/vendor/skills/skills/vitest/references/core-config.md +177 -0
  1378. package/vendor/skills/skills/vitest/references/core-describe.md +193 -0
  1379. package/vendor/skills/skills/vitest/references/core-expect.md +207 -0
  1380. package/vendor/skills/skills/vitest/references/core-hooks.md +245 -0
  1381. package/vendor/skills/skills/vitest/references/core-test-api.md +237 -0
  1382. package/vendor/skills/skills/vitest/references/features-concurrency.md +250 -0
  1383. package/vendor/skills/skills/vitest/references/features-context.md +240 -0
  1384. package/vendor/skills/skills/vitest/references/features-coverage.md +202 -0
  1385. package/vendor/skills/skills/vitest/references/features-filtering.md +208 -0
  1386. package/vendor/skills/skills/vitest/references/features-mocking.md +272 -0
  1387. package/vendor/skills/skills/vitest/references/features-snapshots.md +207 -0
  1388. package/vendor/skills/skills/web-design-guidelines/SKILL.md +40 -0
  1389. package/vendor/skills/skills/workflow/SKILL.md +373 -0
  1390. package/vendor/skills/skills/wrangler/SKILL.md +871 -0
  1391. package/vendor/skills/skills/writing-clearly-and-concisely/README.md +167 -0
  1392. package/vendor/skills/skills/writing-clearly-and-concisely/SKILL.md +93 -0
  1393. package/vendor/skills/skills/writing-clearly-and-concisely/elements-of-style/01-introductory.md +3 -0
  1394. package/vendor/skills/skills/writing-clearly-and-concisely/elements-of-style/02-elementary-rules-of-usage.md +214 -0
  1395. package/vendor/skills/skills/writing-clearly-and-concisely/elements-of-style/03-elementary-principles-of-composition.md +398 -0
  1396. package/vendor/skills/skills/writing-clearly-and-concisely/elements-of-style/04-a-few-matters-of-form.md +89 -0
  1397. package/vendor/skills/skills/writing-clearly-and-concisely/elements-of-style/05-words-and-expressions-commonly-misused.md +348 -0
  1398. package/vendor/skills/skills/writing-clearly-and-concisely/signs-of-ai-writing.md +900 -0
  1399. package/vendor/skills/skills/xstate/SKILL.md +374 -0
  1400. package/vendor/skills/skills/xstate/references/machine-patterns.md +914 -0
  1401. package/vendor/skills/skills/xstate/references/query-patterns.md +661 -0
  1402. package/vendor/skills/skills/xstate/references/store-patterns.md +1032 -0
  1403. package/vendor/skills/skills/zod/AGENTS.md +97 -0
  1404. package/vendor/skills/skills/zod/README.md +79 -0
  1405. package/vendor/skills/skills/zod/SKILL.md +128 -0
  1406. package/vendor/skills/skills/zod/references/compose-intersection.md +143 -0
  1407. package/vendor/skills/skills/zod/references/compose-lazy-recursive.md +138 -0
  1408. package/vendor/skills/skills/zod/references/compose-pipe.md +114 -0
  1409. package/vendor/skills/skills/zod/references/compose-preprocess.md +131 -0
  1410. package/vendor/skills/skills/zod/references/compose-shared-schemas.md +142 -0
  1411. package/vendor/skills/skills/zod/references/error-avoid-throwing-in-refine.md +134 -0
  1412. package/vendor/skills/skills/zod/references/error-custom-messages.md +127 -0
  1413. package/vendor/skills/skills/zod/references/error-i18n.md +140 -0
  1414. package/vendor/skills/skills/zod/references/error-path-for-nested.md +135 -0
  1415. package/vendor/skills/skills/zod/references/error-use-flatten.md +135 -0
  1416. package/vendor/skills/skills/zod/references/object-discriminated-unions.md +136 -0
  1417. package/vendor/skills/skills/zod/references/object-extend-for-composition.md +146 -0
  1418. package/vendor/skills/skills/zod/references/object-optional-vs-nullable.md +120 -0
  1419. package/vendor/skills/skills/zod/references/object-partial-for-updates.md +124 -0
  1420. package/vendor/skills/skills/zod/references/object-pick-omit.md +147 -0
  1421. package/vendor/skills/skills/zod/references/object-strict-vs-strip.md +122 -0
  1422. package/vendor/skills/skills/zod/references/parse-async-for-async-refinements.md +127 -0
  1423. package/vendor/skills/skills/zod/references/parse-avoid-double-validation.md +130 -0
  1424. package/vendor/skills/skills/zod/references/parse-handle-all-issues.md +126 -0
  1425. package/vendor/skills/skills/zod/references/parse-never-trust-json.md +116 -0
  1426. package/vendor/skills/skills/zod/references/parse-use-safeparse.md +103 -0
  1427. package/vendor/skills/skills/zod/references/parse-validate-early.md +125 -0
  1428. package/vendor/skills/skills/zod/references/perf-arrays.md +154 -0
  1429. package/vendor/skills/skills/zod/references/perf-avoid-dynamic-creation.md +142 -0
  1430. package/vendor/skills/skills/zod/references/perf-cache-schemas.md +143 -0
  1431. package/vendor/skills/skills/zod/references/perf-lazy-loading.md +136 -0
  1432. package/vendor/skills/skills/zod/references/perf-zod-mini.md +118 -0
  1433. package/vendor/skills/skills/zod/references/refine-add-path.md +149 -0
  1434. package/vendor/skills/skills/zod/references/refine-catch.md +138 -0
  1435. package/vendor/skills/skills/zod/references/refine-defaults.md +132 -0
  1436. package/vendor/skills/skills/zod/references/refine-transform-coerce.md +103 -0
  1437. package/vendor/skills/skills/zod/references/refine-vs-superrefine.md +159 -0
  1438. package/vendor/skills/skills/zod/references/schema-avoid-optional-abuse.md +94 -0
  1439. package/vendor/skills/skills/zod/references/schema-coercion-for-form-data.md +89 -0
  1440. package/vendor/skills/skills/zod/references/schema-string-validations.md +87 -0
  1441. package/vendor/skills/skills/zod/references/schema-use-enums.md +106 -0
  1442. package/vendor/skills/skills/zod/references/schema-use-primitives-correctly.md +63 -0
  1443. package/vendor/skills/skills/zod/references/schema-use-unknown-not-any.md +86 -0
  1444. package/vendor/skills/skills/zod/references/type-branded-types.md +106 -0
  1445. package/vendor/skills/skills/zod/references/type-enable-strict-mode.md +132 -0
  1446. package/vendor/skills/skills/zod/references/type-export-schemas-and-types.md +117 -0
  1447. package/vendor/skills/skills/zod/references/type-input-vs-output.md +116 -0
  1448. package/vendor/skills/skills/zod/references/type-use-z-infer.md +113 -0
  1449. package/vendor/skills/skills/zustand/SKILL.md +154 -0
  1450. package/vendor/skills/skills/zustand/references/patterns.md +924 -0
@@ -0,0 +1,2683 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { MODULE_REGISTRY } from "../modules/index.ts";
4
+ import {
5
+ copyDirectoryWithTemplates as copyDirectory,
6
+ ensureDir,
7
+ pathExists,
8
+ writeTextFile,
9
+ } from "../utils/files.ts";
10
+ import { mergePackageJson, type PackageJsonShape } from "../utils/packages.ts";
11
+ import { replaceTemplateTokens } from "../utils/template.ts";
12
+ import {
13
+ type ClaudeMdBuilder,
14
+ buildClaudeMd,
15
+ buildClaudeSettings,
16
+ buildCommitlintConfig,
17
+ buildDockerCompose,
18
+ buildGitignore,
19
+ buildInitTestDbScript,
20
+ buildMakefile,
21
+ copySkillsToAgentDirs,
22
+ patchPluginNames,
23
+ resolveSkillsForModules,
24
+ SKILLS_DIR,
25
+ TEMPLATES_DIR,
26
+ toJson,
27
+ writeInstructionFiles,
28
+ } from "./shared.ts";
29
+ import type { GenerateContext } from "./types.ts";
30
+
31
+ const BASE_ROOT_DIR = path.join(TEMPLATES_DIR, "base", "root");
32
+ const BASE_FRONTEND_DIR = path.join(TEMPLATES_DIR, "base", "frontend");
33
+ const BASE_BACKEND_DIR = path.join(TEMPLATES_DIR, "base", "backend");
34
+
35
+ // ---------------------------------------------------------------------------
36
+ // Public API
37
+ // ---------------------------------------------------------------------------
38
+
39
+ export async function generateTanStackStart(context: GenerateContext) {
40
+ // 1. Copy shared root templates (monorepo root: .husky, .github, lint-plugins, tsconfig etc.)
41
+ await copyDirectory(BASE_ROOT_DIR, context.targetDir, context.tokens);
42
+
43
+ // 2. Copy shared frontend UI components (shadcn/ui) into packages/app/src/
44
+ await copyFrontendSharedAssets(context);
45
+
46
+ // 3. Copy module skills
47
+ await copyModuleSkills(context);
48
+
49
+ // 4. Write all dynamic files
50
+ await writeSharedDynamicFiles(context);
51
+ await writeAppDynamicFiles(context);
52
+ await writeServerFiles(context);
53
+ await writeModuleFiles(context);
54
+ }
55
+
56
+ // ---------------------------------------------------------------------------
57
+ // Template copying
58
+ // ---------------------------------------------------------------------------
59
+
60
+ async function copyFrontendSharedAssets(context: GenerateContext) {
61
+ const appSrcDir = path.join(context.targetDir, "packages/app/src");
62
+ await ensureDir(appSrcDir);
63
+
64
+ // Copy shared UI components, hooks, and lib from the frontend base template
65
+ const sharedDirs = ["components", "hooks", "lib"];
66
+ for (const dir of sharedDirs) {
67
+ const srcDir = path.join(BASE_FRONTEND_DIR, "src", dir);
68
+ if (await pathExists(srcDir)) {
69
+ await copyDirectory(srcDir, path.join(appSrcDir, dir), context.tokens);
70
+ }
71
+ }
72
+
73
+ const sharedFiles = ["test-setup.ts"];
74
+ for (const fileName of sharedFiles) {
75
+ const sourcePath = path.join(BASE_FRONTEND_DIR, "src", fileName);
76
+ if (await pathExists(sourcePath)) {
77
+ const content = await readFile(sourcePath, "utf8");
78
+ await writeTextFile(
79
+ path.join(appSrcDir, fileName),
80
+ replaceTemplateTokens(content, context.tokens)
81
+ );
82
+ }
83
+ }
84
+ }
85
+
86
+ async function copyBackendSharedAssets(context: GenerateContext) {
87
+ const fileMappings = new Map<string, string>([
88
+ ["src/lib/errors.ts", "server/lib/errors.ts"],
89
+ ["src/lib/id.ts", "server/lib/id.ts"],
90
+ ["src/lib/lazy.ts", "server/lib/lazy.ts"],
91
+ ["src/lib/logger.ts", "server/lib/logger.ts"],
92
+ ["src/lib/pagination.ts", "server/lib/pagination.ts"],
93
+ ["src/lib/response.ts", "server/lib/response.ts"],
94
+ ["src/test-utils/db.ts", "server/test-utils/db.ts"],
95
+ ["src/test-utils/request.ts", "server/test-utils/request.ts"],
96
+ ]);
97
+
98
+ await Promise.all(
99
+ Array.from(fileMappings.entries()).map(async ([sourcePath, targetPath]) => {
100
+ const absoluteSourcePath = path.join(BASE_BACKEND_DIR, sourcePath);
101
+
102
+ if (!(await pathExists(absoluteSourcePath))) {
103
+ return;
104
+ }
105
+
106
+ const content = await readFile(absoluteSourcePath, "utf8");
107
+ await writeTextFile(
108
+ path.join(context.targetDir, "packages/app", targetPath),
109
+ replaceTemplateTokens(content, context.tokens)
110
+ );
111
+ })
112
+ );
113
+ }
114
+
115
+ async function copyModuleSkills(context: GenerateContext) {
116
+ if (!(await pathExists(SKILLS_DIR))) {
117
+ throw new Error(
118
+ "Skills submodule not initialized. Run: git submodule update --init --recursive"
119
+ );
120
+ }
121
+ const selectedSkills = resolveSkillsForModules(context.resolvedModules, context.stackModel);
122
+
123
+ if (selectedSkills.size === 0) {
124
+ return;
125
+ }
126
+
127
+ await copySkillsToAgentDirs(context.targetDir, selectedSkills, context);
128
+ }
129
+
130
+ // ---------------------------------------------------------------------------
131
+ // Shared dynamic files (root-level: package.json, turbo, docker, claude, etc.)
132
+ // ---------------------------------------------------------------------------
133
+
134
+ async function writeSharedDynamicFiles(context: GenerateContext) {
135
+ await ensureDir(path.join(context.targetDir, ".github/workflows"));
136
+ await ensureDir(path.join(context.targetDir, ".husky"));
137
+ await ensureDir(path.join(context.targetDir, "docker/postgres"));
138
+ await ensureDir(path.join(context.targetDir, ".claude"));
139
+ await ensureDir(path.join(context.targetDir, ".agents"));
140
+
141
+ await patchPluginNames(context);
142
+
143
+ const builder: ClaudeMdBuilder = {
144
+ buildClaudeMdArchitectureSection: buildArchitectureSection,
145
+ buildSkillEnforcementBackendSection: buildSkillEnforcementBackend,
146
+ buildBackendArchitectureRules: buildServerArchitectureRules,
147
+ };
148
+
149
+ await writeTextFile(
150
+ path.join(context.targetDir, "package.json"),
151
+ toJson(buildRootPackageJson(context))
152
+ );
153
+ await writeTextFile(
154
+ path.join(context.targetDir, "turbo.json"),
155
+ toJson(buildTurboConfig(context))
156
+ );
157
+ await writeTextFile(path.join(context.targetDir, ".gitignore"), buildGitignore());
158
+ await writeTextFile(path.join(context.targetDir, ".oxlintrc.json"), buildOxlintConfig(context));
159
+ await writeTextFile(
160
+ path.join(context.targetDir, "commitlint.config.ts"),
161
+ buildCommitlintConfig()
162
+ );
163
+ await writeTextFile(path.join(context.targetDir, "Makefile"), buildMakefile(context));
164
+ await writeTextFile(
165
+ path.join(context.targetDir, "docker-compose.yml"),
166
+ buildDockerCompose(context)
167
+ );
168
+ await writeTextFile(
169
+ path.join(context.targetDir, "docker/postgres/init-test-db.sh"),
170
+ buildInitTestDbScript(context)
171
+ );
172
+ await writeInstructionFiles(context.targetDir, buildClaudeMd(context, builder));
173
+ await writeTextFile(path.join(context.targetDir, ".claude/settings.json"), buildClaudeSettings());
174
+ await writeTextFile(path.join(context.targetDir, ".github/workflows/ci.yaml"), buildCiWorkflow());
175
+ await writeTextFile(
176
+ path.join(context.targetDir, ".husky/pre-commit"),
177
+ "#!/usr/bin/env sh\nbunx lint-staged\n"
178
+ );
179
+ await writeTextFile(
180
+ path.join(context.targetDir, ".husky/commit-msg"),
181
+ '#!/usr/bin/env sh\nbunx --no -- commitlint --edit "$1"\n'
182
+ );
183
+ }
184
+
185
+ // ---------------------------------------------------------------------------
186
+ // App-level dynamic files (packages/app/*)
187
+ // ---------------------------------------------------------------------------
188
+
189
+ async function writeAppDynamicFiles(context: GenerateContext) {
190
+ const appDir = path.join(context.targetDir, "packages/app");
191
+ await ensureDir(path.join(appDir, "src/routes/_dashboard"));
192
+ await ensureDir(path.join(appDir, "src/stores"));
193
+ await ensureDir(path.join(appDir, "src/integrations/tanstack-query"));
194
+
195
+ await writeTextFile(path.join(appDir, "package.json"), toJson(buildAppPackageJson(context)));
196
+ await writeTextFile(path.join(appDir, "vite.config.ts"), buildAppViteConfig());
197
+ await writeTextFile(path.join(appDir, "tsconfig.json"), toJson(buildAppTsConfig()));
198
+ await writeTextFile(path.join(appDir, "drizzle.config.ts"), buildDrizzleConfig());
199
+ await writeTextFile(path.join(appDir, "vitest.config.ts"), buildVitestConfig(context));
200
+
201
+ // Entry points
202
+ await writeTextFile(path.join(appDir, "src/client.tsx"), buildClientEntry());
203
+ await writeTextFile(path.join(appDir, "src/server.ts"), buildServerEntry(context));
204
+ await writeTextFile(path.join(appDir, "src/router.tsx"), buildRouterEntry());
205
+ await writeTextFile(path.join(appDir, "src/routeTree.gen.ts"), buildRouteTree(context));
206
+
207
+ // Routes
208
+ await writeTextFile(path.join(appDir, "src/routes/__root.tsx"), buildRootRoute(context));
209
+ await writeTextFile(
210
+ path.join(appDir, "src/routes/_dashboard.tsx"),
211
+ buildDashboardLayout(context)
212
+ );
213
+ await writeTextFile(
214
+ path.join(appDir, "src/routes/_dashboard/index.tsx"),
215
+ buildDashboardIndex(context)
216
+ );
217
+ await writeTextFile(path.join(appDir, "src/routes/_dashboard/settings.tsx"), buildSettingsPage());
218
+
219
+ // Styles, stores, integrations
220
+ await writeTextFile(path.join(appDir, "src/styles.css"), buildStyles());
221
+ await writeTextFile(path.join(appDir, "src/stores/use-theme-store.ts"), buildThemeStore(context));
222
+ await writeTextFile(
223
+ path.join(appDir, "src/integrations/tanstack-query/root-provider.tsx"),
224
+ buildQueryProvider()
225
+ );
226
+ }
227
+
228
+ // ---------------------------------------------------------------------------
229
+ // Server-side files (packages/app/server/*)
230
+ // ---------------------------------------------------------------------------
231
+
232
+ async function writeServerFiles(context: GenerateContext) {
233
+ const serverDir = path.join(context.targetDir, "packages/app/server");
234
+ await ensureDir(path.join(serverDir, "db/schema"));
235
+ await ensureDir(path.join(serverDir, "lib"));
236
+ await ensureDir(path.join(serverDir, "functions"));
237
+ await copyBackendSharedAssets(context);
238
+
239
+ // API route for health
240
+ await ensureDir(path.join(context.targetDir, "packages/app/src/routes/api"));
241
+ await writeTextFile(
242
+ path.join(context.targetDir, "packages/app/src/routes/api/health.ts"),
243
+ buildHealthApiRoute(context)
244
+ );
245
+
246
+ // DB
247
+ await writeTextFile(path.join(serverDir, "db/index.ts"), buildDbIndex());
248
+ await writeTextFile(path.join(serverDir, "db/schema/index.ts"), buildDbSchemaIndex(context));
249
+ await writeTextFile(path.join(serverDir, "db/schema/items.ts"), buildItemsSchema());
250
+
251
+ // Lib
252
+ await writeTextFile(path.join(serverDir, "lib/env.ts"), buildEnvTs(context));
253
+ await writeTextFile(path.join(serverDir, "lib/request-context.ts"), buildRequestContextLib());
254
+ await writeTextFile(path.join(serverDir, "test-utils/factories.ts"), buildTestItemFactory());
255
+ await writeTextFile(path.join(serverDir, "test-utils/index.ts"), buildTestUtilsIndex());
256
+
257
+ // Server functions
258
+ await writeTextFile(path.join(serverDir, "functions/items.ts"), buildItemsFunctions());
259
+
260
+ // .env.example
261
+ await writeTextFile(
262
+ path.join(context.targetDir, "packages/app/.env.example"),
263
+ buildEnvExample(context)
264
+ );
265
+ }
266
+
267
+ // ---------------------------------------------------------------------------
268
+ // Module files
269
+ // ---------------------------------------------------------------------------
270
+
271
+ async function writeModuleFiles(context: GenerateContext) {
272
+ const appDir = path.join(context.targetDir, "packages/app");
273
+
274
+ if (context.resolvedModules.includes("auth")) {
275
+ await ensureDir(path.join(appDir, "server/lib/auth"));
276
+ await ensureDir(path.join(appDir, "server/middleware"));
277
+ await ensureDir(path.join(appDir, "src/routes/api/auth"));
278
+ await writeTextFile(path.join(appDir, "server/lib/auth/auth.ts"), buildAuthConfig(context));
279
+ await writeTextFile(path.join(appDir, "server/middleware/auth.ts"), buildAuthMiddleware());
280
+ await writeTextFile(path.join(appDir, "src/routes/api/auth/$.ts"), buildAuthApiRoute());
281
+ await writeTextFile(path.join(appDir, "server/db/schema/auth.ts"), buildAuthSchema());
282
+ }
283
+
284
+ if (context.resolvedModules.includes("organizations")) {
285
+ await writeTextFile(path.join(appDir, "server/lib/auth/org-context.ts"), buildOrgContext());
286
+ await writeTextFile(path.join(appDir, "server/lib/auth/permissions.ts"), buildPermissions());
287
+ }
288
+
289
+ if (context.resolvedModules.includes("stripe")) {
290
+ await ensureDir(path.join(appDir, "server/lib/integrations"));
291
+ await ensureDir(path.join(appDir, "server/lib/billing"));
292
+ await ensureDir(path.join(appDir, "src/routes/api/webhooks"));
293
+ await writeTextFile(
294
+ path.join(appDir, "server/lib/integrations/stripe.ts"),
295
+ buildStripeClient()
296
+ );
297
+ await writeTextFile(path.join(appDir, "server/lib/billing/index.ts"), buildBillingLib());
298
+ await writeTextFile(path.join(appDir, "server/db/schema/billing.ts"), buildBillingSchema());
299
+ await writeTextFile(path.join(appDir, "server/functions/billing.ts"), buildBillingFunctions());
300
+ await writeTextFile(
301
+ path.join(appDir, "src/routes/api/webhooks/stripe.ts"),
302
+ buildStripeWebhookRoute()
303
+ );
304
+ }
305
+
306
+ if (context.resolvedModules.includes("storage")) {
307
+ await ensureDir(path.join(appDir, "server/lib/storage"));
308
+ await writeTextFile(path.join(appDir, "server/lib/storage/client.ts"), buildStorageClient());
309
+ await writeTextFile(path.join(appDir, "server/lib/storage/index.ts"), buildStorageIndex());
310
+ }
311
+
312
+ if (context.resolvedModules.includes("email")) {
313
+ await ensureDir(path.join(appDir, "server/lib/emails/templates"));
314
+ await ensureDir(path.join(appDir, "server/lib/integrations"));
315
+ await writeTextFile(path.join(appDir, "server/lib/emails/send.ts"), buildEmailSend());
316
+ await writeTextFile(
317
+ path.join(appDir, "server/lib/emails/templates/layout.tsx"),
318
+ buildEmailLayout()
319
+ );
320
+ await writeTextFile(
321
+ path.join(appDir, "server/lib/integrations/resend.ts"),
322
+ buildResendClient()
323
+ );
324
+ }
325
+
326
+ if (context.resolvedModules.includes("inngest")) {
327
+ await ensureDir(path.join(appDir, "server/jobs"));
328
+ await writeTextFile(path.join(appDir, "server/lib/inngest.ts"), buildInngestClient());
329
+ await writeTextFile(path.join(appDir, "server/jobs/index.ts"), buildInngestJobsIndex());
330
+ await writeTextFile(path.join(appDir, "server/jobs/example.ts"), buildInngestExampleJob());
331
+ await writeTextFile(path.join(appDir, "src/routes/api/inngest.ts"), buildInngestApiRoute());
332
+ }
333
+
334
+ if (context.resolvedModules.includes("observability")) {
335
+ await writeTextFile(path.join(appDir, "server/lib/tracing.ts"), buildTracingLib(context));
336
+ await writeTextFile(path.join(appDir, "server/lib/sentry.ts"), buildSentryLib());
337
+ }
338
+
339
+ if (context.resolvedModules.includes("redis")) {
340
+ await ensureDir(path.join(appDir, "server/middleware"));
341
+ await writeTextFile(path.join(appDir, "server/lib/redis.ts"), buildRedisClient());
342
+ await writeTextFile(
343
+ path.join(appDir, "server/middleware/rate-limit.ts"),
344
+ buildRateLimitMiddleware()
345
+ );
346
+ }
347
+
348
+ if (context.resolvedModules.includes("storybook")) {
349
+ await ensureDir(path.join(appDir, ".storybook"));
350
+ await writeTextFile(path.join(appDir, ".storybook/main.ts"), buildStorybookMain());
351
+ await writeTextFile(path.join(appDir, ".storybook/preview.tsx"), buildStorybookPreview());
352
+ }
353
+ }
354
+
355
+ // ---------------------------------------------------------------------------
356
+ // Root-level builders
357
+ // ---------------------------------------------------------------------------
358
+
359
+ function buildRootPackageJson(context: GenerateContext): PackageJsonShape {
360
+ const base: PackageJsonShape = {
361
+ name: context.projectName,
362
+ private: true,
363
+ workspaces: ["packages/*"],
364
+ scripts: {
365
+ prepare: "husky",
366
+ dev: "turbo run dev --filter=./packages/app",
367
+ build: "turbo run build",
368
+ lint: "bun run format && bunx oxlint",
369
+ typecheck: "bunx tsgo --project tsconfig.json --noEmit && turbo run typecheck",
370
+ format: "bunx oxfmt --write .",
371
+ "format:check": "bunx oxfmt --check .",
372
+ test: "turbo run test",
373
+ "db:generate": "turbo run db:generate",
374
+ "db:migrate": "turbo run db:migrate",
375
+ },
376
+ devDependencies: {
377
+ "@commitlint/cli": "^20.5.0",
378
+ "@commitlint/config-conventional": "^20.5.0",
379
+ "@tanstack/router-plugin": "1.166.12",
380
+ "@testing-library/jest-dom": "^6.9.1",
381
+ "@types/jsdom": "^28.0.0",
382
+ "@types/node": "^25.5.0",
383
+ "@types/react": "19.2.14",
384
+ "@types/react-dom": "19.2.3",
385
+ "@typescript/native-preview": "^7.0.0-dev.20260316.1",
386
+ "@vitest/ui": "4.1.0",
387
+ husky: "9.1.7",
388
+ jsdom: "^28.1.0",
389
+ "lint-staged": "16.4.0",
390
+ oxfmt: "^0.40.0",
391
+ oxlint: "1.55.0",
392
+ tailwindcss: "4.2.1",
393
+ turbo: "^2.8.16",
394
+ vite: "^8.0.0",
395
+ vitest: "4.1.0",
396
+ },
397
+ "lint-staged": {
398
+ "*.{js,jsx,ts,tsx}": ["oxfmt", "oxlint"],
399
+ "*.{css,scss,html,json,jsonc,yaml,yml,md,markdown}": ["oxfmt"],
400
+ },
401
+ engines: { node: ">=22.0.0 <25" },
402
+ packageManager: "bun@1.3.4",
403
+ };
404
+
405
+ const fragments = context.resolvedModules.map(m => ({
406
+ scripts: MODULE_REGISTRY[m].root?.scripts,
407
+ dependencies: MODULE_REGISTRY[m].root?.dependencies,
408
+ devDependencies: MODULE_REGISTRY[m].root?.devDependencies,
409
+ }));
410
+
411
+ return mergePackageJson(base, ...fragments);
412
+ }
413
+
414
+ function buildTurboConfig(context: GenerateContext) {
415
+ const tasks: Record<string, Record<string, unknown>> = {
416
+ build: { dependsOn: ["^build"], outputs: ["dist/**", ".output/**"] },
417
+ dev: { cache: false, persistent: true },
418
+ lint: { dependsOn: ["^lint"] },
419
+ typecheck: { dependsOn: ["^typecheck"] },
420
+ test: { cache: false },
421
+ "db:generate": { cache: false },
422
+ "db:migrate": { cache: false },
423
+ };
424
+
425
+ if (context.resolvedModules.includes("storybook")) {
426
+ tasks.storybook = { cache: false, persistent: true };
427
+ tasks["build-storybook"] = { dependsOn: ["^build"], outputs: ["storybook-static/**"] };
428
+ }
429
+
430
+ return { $schema: "https://turbo.build/schema.json", tasks };
431
+ }
432
+
433
+ function buildOxlintConfig(context: GenerateContext) {
434
+ return toJson({
435
+ $schema: "./node_modules/oxlint/configuration_schema.json",
436
+ plugins: ["unicorn", "typescript", "oxc"],
437
+ jsPlugins: [
438
+ "./lint-plugins/react-component-complexity.mjs",
439
+ "./lint-plugins/react-hooks-separation.mjs",
440
+ "./lint-plugins/test-file-location.mjs",
441
+ ],
442
+ rules: {
443
+ "no-unused-vars": "error",
444
+ "no-unused-private-class-members": "error",
445
+ "unicorn/no-empty-file": "warn",
446
+ },
447
+ overrides: [
448
+ {
449
+ files: ["packages/app/src/**/*.tsx"],
450
+ rules: {
451
+ [`${context.projectName}-react/max-component-complexity`]: [
452
+ "error",
453
+ { maxHooks: 5, maxHandlers: 3, maxTotal: 7 },
454
+ ],
455
+ [`${context.projectName}-react-hooks/no-mixed-hooks-and-components`]: "warn",
456
+ },
457
+ },
458
+ {
459
+ files: ["packages/app/src/**/*.{ts,tsx}"],
460
+ rules: {
461
+ [`${context.projectName}-react-hooks/hooks-in-hooks-folder`]: "warn",
462
+ },
463
+ },
464
+ {
465
+ files: ["packages/app/src/components/ui/**/*.{ts,tsx}"],
466
+ rules: {
467
+ [`${context.projectName}-react/max-component-complexity`]: "off",
468
+ [`${context.projectName}-react-hooks/no-mixed-hooks-and-components`]: "off",
469
+ [`${context.projectName}-react-hooks/hooks-in-hooks-folder`]: "off",
470
+ },
471
+ },
472
+ {
473
+ files: ["**/*.test.{ts,tsx}", "**/__tests__/**/*.{ts,tsx}", "**/*.stories.{ts,tsx}"],
474
+ rules: {
475
+ [`${context.projectName}-react/max-component-complexity`]: "off",
476
+ [`${context.projectName}-react-hooks/no-mixed-hooks-and-components`]: "off",
477
+ [`${context.projectName}-react-hooks/hooks-in-hooks-folder`]: "off",
478
+ },
479
+ },
480
+ ],
481
+ });
482
+ }
483
+
484
+ function buildCiWorkflow() {
485
+ const scopes = ["repo", "app", "ui", "auth", "billing", "docs", "test"];
486
+ return [
487
+ "name: CI",
488
+ "",
489
+ "on:",
490
+ " pull_request:",
491
+ " branches:",
492
+ " - main",
493
+ " push:",
494
+ " branches:",
495
+ " - main",
496
+ "",
497
+ "jobs:",
498
+ " validate-title:",
499
+ " runs-on: ubuntu-latest",
500
+ " if: github.event_name == 'pull_request'",
501
+ " steps:",
502
+ " - uses: amannn/action-semantic-pull-request@v6",
503
+ " env:",
504
+ " GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}",
505
+ " with:",
506
+ " requireScope: true",
507
+ " types: |",
508
+ " build",
509
+ " ci",
510
+ " docs",
511
+ " feat",
512
+ " fix",
513
+ " refactor",
514
+ " test",
515
+ " scopes: |",
516
+ ...scopes.map(s => ` ${s}`),
517
+ " check:",
518
+ " runs-on: ubuntu-latest",
519
+ " steps:",
520
+ " - uses: actions/checkout@v5",
521
+ " - uses: ./.github/actions/setup-bun",
522
+ " - run: bun install --frozen-lockfile",
523
+ " - run: make check",
524
+ ].join("\n");
525
+ }
526
+
527
+ // ---------------------------------------------------------------------------
528
+ // CLAUDE.md sections
529
+ // ---------------------------------------------------------------------------
530
+
531
+ function buildArchitectureSection(context: GenerateContext): string {
532
+ return replaceTemplateTokens(
533
+ [
534
+ "## Architecture",
535
+ "",
536
+ "**{{projectTitle}}** is a fullstack monorepo using TanStack Start, orchestrated by Turborepo and managed with Bun.",
537
+ "",
538
+ "### Monorepo Structure",
539
+ "",
540
+ "```",
541
+ "packages/",
542
+ "└── app/ # TanStack Start fullstack app (SSR + Server Functions)",
543
+ "```",
544
+ "",
545
+ "### Path Aliases",
546
+ "",
547
+ "- `~/*` maps to `./` root of the app package",
548
+ "",
549
+ "### App Structure (`packages/app`)",
550
+ "",
551
+ "```",
552
+ "src/",
553
+ "├── client.tsx # Client-side hydration entry",
554
+ "├── server.ts # Server entry point",
555
+ "├── router.tsx # TanStack Router configuration",
556
+ "├── routeTree.gen.ts # Auto-generated route tree (never edit)",
557
+ "├── routes/ # File-based routes (TanStack Router)",
558
+ "│ ├── __root.tsx # Root layout",
559
+ "│ ├── _dashboard.tsx # Dashboard layout",
560
+ "│ └── api/ # API routes (webhooks, health, auth)",
561
+ "├── components/ # React components (ui/, feature-specific/)",
562
+ "├── hooks/ # Shared React hooks",
563
+ "├── stores/ # Zustand stores",
564
+ "└── styles.css # Tailwind v4 theme",
565
+ "",
566
+ "server/",
567
+ "├── db/ # Drizzle ORM schema, client",
568
+ "│ ├── index.ts # Database client",
569
+ "│ └── schema/ # Table definitions",
570
+ "├── lib/ # Server utilities (errors, env, auth, integrations)",
571
+ "├── functions/ # Server Functions (createServerFn)",
572
+ "├── middleware/ # Composable auth/rate-limit helpers",
573
+ "└── jobs/ # Background jobs (Inngest)",
574
+ "```",
575
+ "",
576
+ "### Data Flow",
577
+ "",
578
+ "- **Client**: TanStack Query for server state; Zustand for shared client state",
579
+ "- **Server**: Server Functions (`createServerFn`) for data mutations and queries",
580
+ "- **API Routes**: Only for webhooks, health checks, and auth handler endpoints",
581
+ "- **Database**: PostgreSQL 16 via Drizzle ORM",
582
+ "",
583
+ "### Tooling",
584
+ "",
585
+ "- **Package manager**: Bun",
586
+ "- **Monorepo orchestration**: Turborepo",
587
+ "- **Framework**: TanStack Start (Vite-based SSR)",
588
+ "- **Linting**: Oxlint",
589
+ "- **Formatting**: Oxfmt (printWidth: 100)",
590
+ "- **Type checking**: tsc",
591
+ "- **Testing**: Vitest + Testing Library",
592
+ "- **Commits**: Conventional Commits + commitlint + husky + lint-staged",
593
+ ].join("\n"),
594
+ context.tokens
595
+ );
596
+ }
597
+
598
+ function buildSkillEnforcementBackend(_context: GenerateContext): string[] {
599
+ return [
600
+ "### Server & Database",
601
+ "",
602
+ "- **Server Functions (createServerFn)**: Use `tanstack-start-best-practices` skill",
603
+ "- **Database/schema/queries**: Use `postgres-drizzle` skill",
604
+ "- **Drizzle ORM patterns**: Use `drizzle-orm` skill",
605
+ "- **Drizzle migrations**: Use `drizzle-safe-migrations` skill",
606
+ "- **Validation (Zod schemas)**: Use `zod` skill",
607
+ "- **Utility functions (es-toolkit)**: Use `es-toolkit` skill",
608
+ "",
609
+ ];
610
+ }
611
+
612
+ function buildServerArchitectureRules(): string {
613
+ return [
614
+ "## Server Architecture Rules",
615
+ "",
616
+ "- Use Server Functions (`createServerFn`) for all data access from routes",
617
+ "- API routes (`src/routes/api/`) are reserved for webhooks, health checks, and third-party integrations",
618
+ "- Server Functions should validate inputs with `.inputValidator()` or Zod schemas",
619
+ "- Repository functions handle all database operations via Drizzle",
620
+ "- Never import server-only code directly in route components — always go through Server Functions",
621
+ "- Never edit files in the `drizzle/` folder (auto-generated)",
622
+ ].join("\n");
623
+ }
624
+
625
+ // ---------------------------------------------------------------------------
626
+ // App package.json
627
+ // ---------------------------------------------------------------------------
628
+
629
+ function buildAppPackageJson(context: GenerateContext): PackageJsonShape {
630
+ const base: PackageJsonShape = {
631
+ name: "app",
632
+ private: true,
633
+ type: "module",
634
+ scripts: {
635
+ dev: "vite dev",
636
+ build: "vite build",
637
+ start: "node .output/server/index.mjs",
638
+ test: "bunx vitest run",
639
+ typecheck: "bunx tsgo --noEmit",
640
+ "db:generate": "bunx drizzle-kit generate",
641
+ "db:migrate": "bunx drizzle-kit migrate",
642
+ },
643
+ dependencies: {
644
+ "@base-ui/react": "^1.3.0",
645
+ "@fontsource-variable/geist": "^5.2.8",
646
+ "@fontsource/bricolage-grotesque": "^5.2.10",
647
+ "@hookform/resolvers": "^5.2.2",
648
+ "@logtape/logtape": "^2.0.4",
649
+ "@opentelemetry/api": "^1.9.0",
650
+ "@tabler/icons-react": "^3.40.0",
651
+ "@tanstack/react-query": "^5.90.21",
652
+ "@tanstack/react-query-devtools": "^5.91.3",
653
+ "@tanstack/react-router": "^1.167.3",
654
+ "@tanstack/react-router-devtools": "^1.166.9",
655
+ "@tanstack/react-start": "^1.166.14",
656
+ "class-variance-authority": "^0.7.1",
657
+ clsx: "^2.1.1",
658
+ cmdk: "^1.1.1",
659
+ "date-fns": "^4.1.0",
660
+ "drizzle-orm": "^0.45.1",
661
+ "embla-carousel-react": "^8.6.0",
662
+ "es-toolkit": "^1.45.1",
663
+ "input-otp": "^1.4.2",
664
+ "lucide-react": "^0.577.0",
665
+ "next-themes": "^0.4.6",
666
+ postgres: "^3.4.8",
667
+ react: "^19.2.4",
668
+ "react-day-picker": "^9.14.0",
669
+ "react-dom": "^19.2.4",
670
+ "react-hook-form": "^7.71.2",
671
+ "react-resizable-panels": "^4.7.3",
672
+ recharts: "2.15.4",
673
+ sonner: "^2.0.7",
674
+ "tailwind-merge": "^3.5.0",
675
+ tailwindcss: "^4.2.1",
676
+ "tw-animate-css": "^1.4.0",
677
+ uuid: "^13.0.0",
678
+ vaul: "^1.1.2",
679
+ zod: "^4.3.6",
680
+ zustand: "^5.0.11",
681
+ },
682
+ devDependencies: {
683
+ "@tailwindcss/vite": "^4.2.1",
684
+ "@testing-library/dom": "^10.4.1",
685
+ "@testing-library/react": "^16.3.2",
686
+ "@vitejs/plugin-react": "^6.0.1",
687
+ "drizzle-kit": "^0.31.9",
688
+ dotenv: "^17.3.1",
689
+ "vite-tsconfig-paths": "^6.1.1",
690
+ vitest: "4.1.0",
691
+ },
692
+ };
693
+
694
+ const fragments = context.resolvedModules.map(m => {
695
+ const mod = MODULE_REGISTRY[m];
696
+ // Use app-specific contributions if defined, otherwise merge backend + frontend deps
697
+ if (mod.app) {
698
+ return {
699
+ scripts: mod.app.scripts,
700
+ dependencies: mod.app.dependencies,
701
+ devDependencies: mod.app.devDependencies,
702
+ };
703
+ }
704
+ return {
705
+ scripts: { ...mod.frontend?.scripts, ...mod.backend?.scripts },
706
+ dependencies: { ...mod.frontend?.dependencies, ...mod.backend?.dependencies },
707
+ devDependencies: { ...mod.frontend?.devDependencies, ...mod.backend?.devDependencies },
708
+ };
709
+ });
710
+
711
+ return mergePackageJson(base, ...fragments);
712
+ }
713
+
714
+ // ---------------------------------------------------------------------------
715
+ // App config files
716
+ // ---------------------------------------------------------------------------
717
+
718
+ function buildAppViteConfig() {
719
+ return [
720
+ 'import tailwindcss from "@tailwindcss/vite";',
721
+ 'import { tanstackStart } from "@tanstack/react-start/plugin/vite";',
722
+ 'import viteReact from "@vitejs/plugin-react";',
723
+ 'import { defineConfig } from "vite";',
724
+ 'import tsConfigPaths from "vite-tsconfig-paths";',
725
+ "",
726
+ "export default defineConfig({",
727
+ " server: {",
728
+ " port: 3000,",
729
+ " },",
730
+ " plugins: [",
731
+ " tailwindcss(),",
732
+ ' tsConfigPaths({ projects: ["./tsconfig.json"] }),',
733
+ " tanstackStart({",
734
+ ' srcDirectory: "src",',
735
+ " }),",
736
+ " viteReact(),",
737
+ " ],",
738
+ "});",
739
+ "",
740
+ ].join("\n");
741
+ }
742
+
743
+ function buildAppTsConfig() {
744
+ return {
745
+ compilerOptions: {
746
+ target: "ES2022",
747
+ module: "ESNext",
748
+ moduleResolution: "bundler",
749
+ allowImportingTsExtensions: true,
750
+ jsx: "react-jsx",
751
+ strict: true,
752
+ esModuleInterop: true,
753
+ skipLibCheck: true,
754
+ forceConsistentCasingInFileNames: true,
755
+ resolveJsonModule: true,
756
+ isolatedModules: true,
757
+ noEmit: true,
758
+ types: ["vite/client"],
759
+ paths: {
760
+ "@/*": ["./src/*"],
761
+ "~/*": ["./*"],
762
+ },
763
+ },
764
+ include: ["src", "server", "vite.config.ts"],
765
+ };
766
+ }
767
+
768
+ function buildDrizzleConfig() {
769
+ return [
770
+ 'import { defineConfig } from "drizzle-kit";',
771
+ "",
772
+ "export default defineConfig({",
773
+ ' schema: "./server/db/schema",',
774
+ ' out: "./server/db/migrations",',
775
+ ' dialect: "postgresql",',
776
+ " dbCredentials: {",
777
+ " url: process.env.DATABASE_URL!,",
778
+ " },",
779
+ "});",
780
+ "",
781
+ ].join("\n");
782
+ }
783
+
784
+ function buildVitestConfig(context: GenerateContext) {
785
+ return replaceTemplateTokens(
786
+ [
787
+ '/// <reference types="vitest" />',
788
+ 'import { defineConfig } from "vitest/config";',
789
+ 'import tsconfigPaths from "vite-tsconfig-paths";',
790
+ "",
791
+ "export default defineConfig({",
792
+ " plugins: [tsconfigPaths()],",
793
+ " test: {",
794
+ ' environment: "jsdom",',
795
+ " globals: true,",
796
+ ' setupFiles: ["./src/test-setup.ts"],',
797
+ " },",
798
+ "});",
799
+ "",
800
+ ].join("\n"),
801
+ context.tokens
802
+ );
803
+ }
804
+
805
+ // ---------------------------------------------------------------------------
806
+ // Entry points
807
+ // ---------------------------------------------------------------------------
808
+
809
+ function buildClientEntry() {
810
+ return [
811
+ 'import { StartClient } from "@tanstack/react-start/client";',
812
+ 'import { StrictMode } from "react";',
813
+ 'import { hydrateRoot } from "react-dom/client";',
814
+ "",
815
+ "hydrateRoot(",
816
+ " document,",
817
+ " <StrictMode>",
818
+ " <StartClient />",
819
+ " </StrictMode>,",
820
+ ");",
821
+ "",
822
+ ].join("\n");
823
+ }
824
+
825
+ function buildServerEntry(context: GenerateContext) {
826
+ const lines = [
827
+ 'import { withContext } from "@logtape/logtape";',
828
+ 'import handler, { createServerEntry } from "@tanstack/react-start/server-entry";',
829
+ 'import { configureBackendLogger, logger } from "~/server/lib/logger.ts";',
830
+ 'import { REQUEST_ID_HEADER, resolveRequestId } from "~/server/lib/request-context.ts";',
831
+ ];
832
+
833
+ if (context.resolvedModules.includes("observability")) {
834
+ lines.push(
835
+ 'import { initializeSentry } from "~/server/lib/sentry.ts";',
836
+ 'import { initializeTracing, shutdownTracing } from "~/server/lib/tracing.ts";'
837
+ );
838
+ }
839
+
840
+ lines.push("", "configureBackendLogger();", "");
841
+
842
+ if (context.resolvedModules.includes("observability")) {
843
+ lines.push(
844
+ "let shutdownHandlersRegistered = false;",
845
+ "const startup = initializeServerRuntime();",
846
+ "",
847
+ "async function initializeServerRuntime() {",
848
+ " initializeSentry();",
849
+ " await initializeTracing();",
850
+ " registerShutdownHandlers();",
851
+ "}",
852
+ "",
853
+ "function registerShutdownHandlers() {",
854
+ ' if (shutdownHandlersRegistered || process.env.NODE_ENV === "test") {',
855
+ " return;",
856
+ " }",
857
+ "",
858
+ " shutdownHandlersRegistered = true;",
859
+ ' for (const signal of ["SIGINT", "SIGTERM"] as const) {',
860
+ " process.once(signal, () => {",
861
+ " void shutdownTracing();",
862
+ " });",
863
+ " }",
864
+ "}",
865
+ ""
866
+ );
867
+ } else {
868
+ lines.push("const startup = Promise.resolve();", "");
869
+ }
870
+
871
+ lines.push(
872
+ "function withRequestIdHeader(response: Response, requestId: string) {",
873
+ " const headers = new Headers(response.headers);",
874
+ " headers.set(REQUEST_ID_HEADER, requestId);",
875
+ " return new Response(response.body, {",
876
+ " status: response.status,",
877
+ " statusText: response.statusText,",
878
+ " headers,",
879
+ " });",
880
+ "}",
881
+ "",
882
+ "export default createServerEntry({",
883
+ " async fetch(request) {",
884
+ " await startup;",
885
+ "",
886
+ ' const requestId = resolveRequestId(request.headers.get("x-request-id"));',
887
+ " const requestUrl = new URL(request.url);",
888
+ " const startedAt = performance.now();",
889
+ "",
890
+ " return withContext({ requestId }, async () => {",
891
+ " try {",
892
+ " const response = await handler.fetch(request);",
893
+ " const responseWithHeaders = withRequestIdHeader(response, requestId);",
894
+ "",
895
+ ' logger.info("HTTP request completed", {',
896
+ " durationMs: Number((performance.now() - startedAt).toFixed(3)),",
897
+ " method: request.method,",
898
+ " path: requestUrl.pathname,",
899
+ " requestId,",
900
+ " statusCode: responseWithHeaders.status,",
901
+ " });",
902
+ "",
903
+ " return responseWithHeaders;",
904
+ " } catch (error) {",
905
+ ' logger.error("HTTP request failed", {',
906
+ " error,",
907
+ " method: request.method,",
908
+ " path: requestUrl.pathname,",
909
+ " requestId,",
910
+ " });",
911
+ " throw error;",
912
+ " }",
913
+ " });",
914
+ " },",
915
+ "});",
916
+ ""
917
+ );
918
+
919
+ return lines.join("\n");
920
+ }
921
+
922
+ function buildRouterEntry() {
923
+ return [
924
+ 'import { createRouter } from "@tanstack/react-router";',
925
+ 'import { routeTree } from "./routeTree.gen";',
926
+ "",
927
+ "export function getRouter() {",
928
+ " const router = createRouter({",
929
+ " routeTree,",
930
+ " scrollRestoration: true,",
931
+ ' defaultPreload: "intent",',
932
+ " defaultStructuralSharing: true,",
933
+ " defaultPreloadStaleTime: 0,",
934
+ " });",
935
+ "",
936
+ " return router;",
937
+ "}",
938
+ "",
939
+ 'declare module "@tanstack/react-router" {',
940
+ " interface Register {",
941
+ " router: ReturnType<typeof getRouter>;",
942
+ " }",
943
+ "}",
944
+ "",
945
+ ].join("\n");
946
+ }
947
+
948
+ type TanStackRouteDefinition = {
949
+ filePath: string;
950
+ fileRoutePath: string;
951
+ fileRouteId: string;
952
+ fullPath: string;
953
+ importName: string;
954
+ importPath: string;
955
+ parentRoute: "rootRouteImport" | "DashboardRoute";
956
+ path: string;
957
+ };
958
+
959
+ function buildRouteTree(context: GenerateContext) {
960
+ const routes: TanStackRouteDefinition[] = [
961
+ {
962
+ filePath: "/_dashboard",
963
+ fileRoutePath: "",
964
+ fileRouteId: "/_dashboard",
965
+ fullPath: "/",
966
+ importName: "DashboardRoute",
967
+ importPath: "./routes/_dashboard",
968
+ parentRoute: "rootRouteImport",
969
+ path: "",
970
+ },
971
+ {
972
+ filePath: "/_dashboard/",
973
+ fileRoutePath: "/",
974
+ fileRouteId: "/",
975
+ fullPath: "/",
976
+ importName: "DashboardIndexRoute",
977
+ importPath: "./routes/_dashboard/index",
978
+ parentRoute: "DashboardRoute",
979
+ path: "/",
980
+ },
981
+ {
982
+ filePath: "/api/health",
983
+ fileRoutePath: "/api/health",
984
+ fileRouteId: "/api/health",
985
+ fullPath: "/api/health",
986
+ importName: "ApiHealthRoute",
987
+ importPath: "./routes/api/health",
988
+ parentRoute: "rootRouteImport",
989
+ path: "/api/health",
990
+ },
991
+ {
992
+ filePath: "/_dashboard/settings",
993
+ fileRoutePath: "/settings",
994
+ fileRouteId: "/settings",
995
+ fullPath: "/settings",
996
+ importName: "DashboardSettingsRoute",
997
+ importPath: "./routes/_dashboard/settings",
998
+ parentRoute: "DashboardRoute",
999
+ path: "/settings",
1000
+ },
1001
+ ];
1002
+
1003
+ if (context.resolvedModules.includes("auth")) {
1004
+ routes.push({
1005
+ filePath: "/api/auth/$",
1006
+ fileRoutePath: "/api/auth/$",
1007
+ fileRouteId: "/api/auth/$",
1008
+ fullPath: "/api/auth/$",
1009
+ importName: "ApiAuthSplatRoute",
1010
+ importPath: "./routes/api/auth/$",
1011
+ parentRoute: "rootRouteImport",
1012
+ path: "/api/auth/$",
1013
+ });
1014
+ }
1015
+
1016
+ if (context.resolvedModules.includes("stripe")) {
1017
+ routes.push({
1018
+ filePath: "/api/webhooks/stripe",
1019
+ fileRoutePath: "/api/webhooks/stripe",
1020
+ fileRouteId: "/api/webhooks/stripe",
1021
+ fullPath: "/api/webhooks/stripe",
1022
+ importName: "ApiWebhooksStripeRoute",
1023
+ importPath: "./routes/api/webhooks/stripe",
1024
+ parentRoute: "rootRouteImport",
1025
+ path: "/api/webhooks/stripe",
1026
+ });
1027
+ }
1028
+
1029
+ if (context.resolvedModules.includes("inngest")) {
1030
+ routes.push({
1031
+ filePath: "/api/inngest",
1032
+ fileRoutePath: "/api/inngest",
1033
+ fileRouteId: "/api/inngest",
1034
+ fullPath: "/api/inngest",
1035
+ importName: "ApiInngestRoute",
1036
+ importPath: "./routes/api/inngest",
1037
+ parentRoute: "rootRouteImport",
1038
+ path: "/api/inngest",
1039
+ });
1040
+ }
1041
+
1042
+ const dashboardLayoutRoute = routes.find(route => route.importName === "DashboardRoute");
1043
+ const dashboardChildRoutes = routes.filter(route => route.parentRoute === "DashboardRoute");
1044
+ const rootLeafRoutes = routes.filter(
1045
+ route => route.parentRoute === "rootRouteImport" && route.importName !== "DashboardRoute"
1046
+ );
1047
+ const addressableRoutes = routes.filter(route => route.importName !== "DashboardRoute");
1048
+ const fileRouteIdEntries = [
1049
+ ' "__root__": typeof rootRouteImport;',
1050
+ ` "${dashboardLayoutRoute?.filePath}": typeof DashboardRouteWithChildren;`,
1051
+ ...addressableRoutes.map(route => ` "${route.filePath}": typeof ${route.importName};`),
1052
+ ];
1053
+ const fileRouteTypeIds = [
1054
+ '"__root__"',
1055
+ `"${dashboardLayoutRoute?.filePath}"`,
1056
+ ...addressableRoutes.map(route => `"${route.filePath}"`),
1057
+ ];
1058
+ const fullPaths = Array.from(new Set(addressableRoutes.map(route => route.fullPath)));
1059
+ const rootChildren = [
1060
+ "DashboardRoute: typeof DashboardRouteWithChildren;",
1061
+ ...rootLeafRoutes.map(route => `${route.importName}: typeof ${route.importName};`),
1062
+ ];
1063
+ const dashboardChildren = dashboardChildRoutes.map(
1064
+ route => `${route.importName}: typeof ${route.importName};`
1065
+ );
1066
+
1067
+ return [
1068
+ "/* eslint-disable */",
1069
+ "",
1070
+ "// @ts-nocheck",
1071
+ "",
1072
+ "// noinspection JSUnusedGlobalSymbols",
1073
+ "",
1074
+ "// This file was automatically generated by Devstack for the initial scaffold.",
1075
+ "// TanStack Start may update it during development or build as routes evolve.",
1076
+ "",
1077
+ 'import { Route as rootRouteImport } from "./routes/__root";',
1078
+ ...routes.map(
1079
+ route => `import { Route as ${route.importName}Import } from "${route.importPath}";`
1080
+ ),
1081
+ "",
1082
+ ...routes.map(route =>
1083
+ [
1084
+ `const ${route.importName} = ${route.importName}Import.update({`,
1085
+ ` id: "${route.fileRouteId}",`,
1086
+ route.path ? ` path: "${route.path}",` : undefined,
1087
+ ` getParentRoute: () => ${route.parentRoute},`,
1088
+ "} as any);",
1089
+ ]
1090
+ .filter(Boolean)
1091
+ .join("\n")
1092
+ ),
1093
+ "",
1094
+ "export interface FileRoutesByFullPath {",
1095
+ ...addressableRoutes.map(route => ` "${route.fullPath}": typeof ${route.importName};`),
1096
+ "}",
1097
+ "export interface FileRoutesByTo {",
1098
+ ...addressableRoutes.map(route => ` "${route.fullPath}": typeof ${route.importName};`),
1099
+ "}",
1100
+ "export interface FileRoutesById {",
1101
+ ...fileRouteIdEntries,
1102
+ "}",
1103
+ "export interface FileRouteTypes {",
1104
+ " fileRoutesByFullPath: FileRoutesByFullPath;",
1105
+ ` fullPaths: ${fullPaths.map(fullPath => `"${fullPath}"`).join(" | ")};`,
1106
+ " fileRoutesByTo: FileRoutesByTo;",
1107
+ ` to: ${fullPaths.map(fullPath => `"${fullPath}"`).join(" | ")};`,
1108
+ ` id: ${fileRouteTypeIds.join(" | ")};`,
1109
+ " fileRoutesById: FileRoutesById;",
1110
+ "}",
1111
+ "export interface RootRouteChildren {",
1112
+ ...rootChildren.map(line => ` ${line}`),
1113
+ "}",
1114
+ "",
1115
+ 'declare module "@tanstack/react-router" {',
1116
+ " interface FileRoutesByPath {",
1117
+ ...routes.map(route =>
1118
+ [
1119
+ ` "${route.filePath}": {`,
1120
+ ` id: "${route.filePath}",`,
1121
+ ` path: "${route.fileRoutePath}",`,
1122
+ ` fullPath: "${route.fullPath}",`,
1123
+ ` preLoaderRoute: typeof ${route.importName}Import,`,
1124
+ ` parentRoute: typeof ${route.parentRoute};`,
1125
+ " };",
1126
+ ].join("\n")
1127
+ ),
1128
+ " }",
1129
+ "}",
1130
+ "",
1131
+ "interface DashboardRouteChildren {",
1132
+ ...dashboardChildren.map(line => ` ${line}`),
1133
+ "}",
1134
+ "",
1135
+ "const DashboardRouteChildren: DashboardRouteChildren = {",
1136
+ ...dashboardChildRoutes.map(route => ` ${route.importName}: ${route.importName},`),
1137
+ "};",
1138
+ "",
1139
+ "const DashboardRouteWithChildren = DashboardRoute._addFileChildren(DashboardRouteChildren);",
1140
+ "",
1141
+ "const rootRouteChildren: RootRouteChildren = {",
1142
+ " DashboardRoute: DashboardRouteWithChildren,",
1143
+ ...rootLeafRoutes.map(route => ` ${route.importName}: ${route.importName},`),
1144
+ "};",
1145
+ "",
1146
+ "export const routeTree = rootRouteImport",
1147
+ " ._addFileChildren(rootRouteChildren)",
1148
+ " ._addFileTypes<FileRouteTypes>();",
1149
+ "",
1150
+ 'import type { getRouter } from "./router.tsx";',
1151
+ 'import type { createStart } from "@tanstack/react-start";',
1152
+ "",
1153
+ 'declare module "@tanstack/react-start" {',
1154
+ " interface Register {",
1155
+ " ssr: true;",
1156
+ " router: Awaited<ReturnType<typeof getRouter>>;",
1157
+ " }",
1158
+ "}",
1159
+ "",
1160
+ ].join("\n");
1161
+ }
1162
+
1163
+ function buildRequestContextLib() {
1164
+ return [
1165
+ 'export const REQUEST_ID_HEADER = "X-Request-Id";',
1166
+ "",
1167
+ "export function resolveRequestId(headerValue: string | null | undefined) {",
1168
+ " const trimmedValue = headerValue?.trim();",
1169
+ "",
1170
+ " if (trimmedValue) {",
1171
+ " return trimmedValue;",
1172
+ " }",
1173
+ "",
1174
+ " return crypto.randomUUID();",
1175
+ "}",
1176
+ "",
1177
+ ].join("\n");
1178
+ }
1179
+
1180
+ function buildTestItemFactory() {
1181
+ return [
1182
+ 'import { toMerged } from "es-toolkit/object";',
1183
+ 'import { items } from "~/server/db/schema/index.ts";',
1184
+ "",
1185
+ "type NewItem = typeof items.$inferInsert;",
1186
+ "",
1187
+ "export function createTestItem(overrides: Partial<NewItem> = {}): NewItem {",
1188
+ " return toMerged(",
1189
+ " {",
1190
+ ' name: "Test Item",',
1191
+ " description: null,",
1192
+ " } satisfies NewItem,",
1193
+ " overrides",
1194
+ " );",
1195
+ "}",
1196
+ "",
1197
+ ].join("\n");
1198
+ }
1199
+
1200
+ function buildTestUtilsIndex() {
1201
+ return [
1202
+ 'export { getTestDb, setupTestDatabase, teardownTestDatabase, withTestTransaction } from "./db.ts";',
1203
+ 'export { createTestItem } from "./factories.ts";',
1204
+ 'export { testRequest } from "./request.ts";',
1205
+ "",
1206
+ ].join("\n");
1207
+ }
1208
+
1209
+ // ---------------------------------------------------------------------------
1210
+ // Routes
1211
+ // ---------------------------------------------------------------------------
1212
+
1213
+ function buildRootRoute(context: GenerateContext) {
1214
+ return replaceTemplateTokens(
1215
+ [
1216
+ '/// <reference types="vite/client" />',
1217
+ 'import { HeadContent, Outlet, Scripts, createRootRoute } from "@tanstack/react-router";',
1218
+ 'import type { ReactNode } from "react";',
1219
+ 'import appCss from "~/src/styles.css?url";',
1220
+ "",
1221
+ 'const faviconHref = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 64 64%27%3E%3Crect width=%2764%27 height=%2764%27 rx=%2716%27 fill=%27%23131211%27/%3E%3Cpath d=%27M19 21h14c7.18 0 13 5.82 13 13s-5.82 13-13 13H19V21zm13.2 19c3.98 0 7.2-3.22 7.2-7.2s-3.22-7.2-7.2-7.2h-6.8V40h6.8z%27 fill=%27%23F7A94A%27/%3E%3C/svg%3E";',
1222
+ "",
1223
+ "export const Route = createRootRoute({",
1224
+ " head: () => ({",
1225
+ " meta: [",
1226
+ ' { charSet: "utf-8" },',
1227
+ ' { name: "viewport", content: "width=device-width, initial-scale=1" },',
1228
+ ' { title: "{{projectTitle}}" },',
1229
+ " ],",
1230
+ " links: [",
1231
+ ' { rel: "icon", href: faviconHref, type: "image/svg+xml" },',
1232
+ ' { rel: "stylesheet", href: appCss },',
1233
+ " ],",
1234
+ " }),",
1235
+ " shellComponent: RootDocument,",
1236
+ " component: RootComponent,",
1237
+ "});",
1238
+ "",
1239
+ "function RootComponent() {",
1240
+ " return <Outlet />;",
1241
+ "}",
1242
+ "",
1243
+ "function RootDocument({ children }: Readonly<{ children: ReactNode }>) {",
1244
+ " return (",
1245
+ ' <html lang="en">',
1246
+ " <head>",
1247
+ " <HeadContent />",
1248
+ " </head>",
1249
+ " <body>",
1250
+ " {children}",
1251
+ " <Scripts />",
1252
+ " </body>",
1253
+ " </html>",
1254
+ " );",
1255
+ "}",
1256
+ "",
1257
+ ].join("\n"),
1258
+ context.tokens
1259
+ );
1260
+ }
1261
+
1262
+ function buildDashboardLayout(context: GenerateContext) {
1263
+ return replaceTemplateTokens(
1264
+ [
1265
+ 'import { Outlet, createFileRoute } from "@tanstack/react-router";',
1266
+ 'import { SidebarInset, SidebarProvider } from "~/src/components/ui/sidebar";',
1267
+ 'import { AppSidebar } from "~/src/components/app-sidebar";',
1268
+ "",
1269
+ 'export const Route = createFileRoute("/_dashboard")({',
1270
+ " component: DashboardLayout,",
1271
+ "});",
1272
+ "",
1273
+ "function DashboardLayout() {",
1274
+ " return (",
1275
+ " <SidebarProvider>",
1276
+ " <AppSidebar />",
1277
+ " <SidebarInset>",
1278
+ " <Outlet />",
1279
+ " </SidebarInset>",
1280
+ " </SidebarProvider>",
1281
+ " );",
1282
+ "}",
1283
+ "",
1284
+ ].join("\n"),
1285
+ context.tokens
1286
+ );
1287
+ }
1288
+
1289
+ function buildDashboardIndex(context: GenerateContext) {
1290
+ return replaceTemplateTokens(
1291
+ [
1292
+ 'import { createFileRoute } from "@tanstack/react-router";',
1293
+ "",
1294
+ 'export const Route = createFileRoute("/_dashboard/")({',
1295
+ " component: DashboardIndex,",
1296
+ "});",
1297
+ "",
1298
+ "function DashboardIndex() {",
1299
+ " return (",
1300
+ ' <div className="flex flex-1 flex-col gap-4 p-4">',
1301
+ ' <h1 className="text-2xl font-bold font-display">Welcome to {{projectTitle}}</h1>',
1302
+ ' <p className="text-muted-foreground">Your dashboard is ready.</p>',
1303
+ " </div>",
1304
+ " );",
1305
+ "}",
1306
+ "",
1307
+ ].join("\n"),
1308
+ context.tokens
1309
+ );
1310
+ }
1311
+
1312
+ function buildSettingsPage() {
1313
+ return [
1314
+ 'import { createFileRoute } from "@tanstack/react-router";',
1315
+ "",
1316
+ 'export const Route = createFileRoute("/_dashboard/settings")({',
1317
+ " component: SettingsPage,",
1318
+ "});",
1319
+ "",
1320
+ "function SettingsPage() {",
1321
+ " return (",
1322
+ ' <div className="flex flex-1 flex-col gap-4 p-4">',
1323
+ ' <h1 className="text-2xl font-bold font-display">Settings</h1>',
1324
+ ' <p className="text-muted-foreground">Manage your application settings here.</p>',
1325
+ " </div>",
1326
+ " );",
1327
+ "}",
1328
+ "",
1329
+ ].join("\n");
1330
+ }
1331
+
1332
+ // ---------------------------------------------------------------------------
1333
+ // Styles, stores, integrations
1334
+ // ---------------------------------------------------------------------------
1335
+
1336
+ function buildStyles() {
1337
+ return [
1338
+ '@import "tailwindcss";',
1339
+ '@import "tw-animate-css";',
1340
+ '@import "@fontsource-variable/geist";',
1341
+ '@import "@fontsource/bricolage-grotesque/500.css";',
1342
+ '@import "@fontsource/bricolage-grotesque/700.css";',
1343
+ "",
1344
+ "@custom-variant dark (&:is(.dark *));",
1345
+ "",
1346
+ ":root {",
1347
+ " --background: oklch(0.99 0.01 95);",
1348
+ " --foreground: oklch(0.22 0.02 95);",
1349
+ " --primary: oklch(0.66 0.16 53);",
1350
+ " --primary-foreground: oklch(0.99 0.01 95);",
1351
+ " --secondary: oklch(0.95 0.01 90);",
1352
+ " --secondary-foreground: oklch(0.28 0.02 95);",
1353
+ " --muted: oklch(0.95 0.01 90);",
1354
+ " --muted-foreground: oklch(0.55 0.02 95);",
1355
+ " --accent: oklch(0.93 0.02 72);",
1356
+ " --accent-foreground: oklch(0.28 0.02 95);",
1357
+ " --destructive: oklch(0.62 0.24 26);",
1358
+ " --border: oklch(0.9 0.01 92);",
1359
+ " --input: oklch(0.9 0.01 92);",
1360
+ " --ring: oklch(0.72 0.04 70);",
1361
+ " --radius: 1rem;",
1362
+ " --card: oklch(0.995 0.008 95);",
1363
+ " --card-foreground: oklch(0.22 0.02 95);",
1364
+ " --popover: oklch(0.995 0.008 95);",
1365
+ " --popover-foreground: oklch(0.22 0.02 95);",
1366
+ " --sidebar: oklch(0.985 0.01 92);",
1367
+ " --sidebar-foreground: oklch(0.22 0.02 95);",
1368
+ " --sidebar-primary: oklch(0.66 0.16 53);",
1369
+ " --sidebar-primary-foreground: oklch(0.99 0.01 95);",
1370
+ " --sidebar-accent: oklch(0.93 0.02 72);",
1371
+ " --sidebar-accent-foreground: oklch(0.28 0.02 95);",
1372
+ " --sidebar-border: oklch(0.9 0.01 92);",
1373
+ " --sidebar-ring: oklch(0.72 0.04 70);",
1374
+ "}",
1375
+ "",
1376
+ ".dark {",
1377
+ " --background: oklch(0.18 0.01 92);",
1378
+ " --foreground: oklch(0.98 0.01 95);",
1379
+ " --primary: oklch(0.72 0.17 62);",
1380
+ " --primary-foreground: oklch(0.19 0.01 92);",
1381
+ " --secondary: oklch(0.28 0.01 92);",
1382
+ " --secondary-foreground: oklch(0.98 0.01 95);",
1383
+ " --muted: oklch(0.28 0.01 92);",
1384
+ " --muted-foreground: oklch(0.72 0.01 95);",
1385
+ " --accent: oklch(0.28 0.02 80);",
1386
+ " --accent-foreground: oklch(0.98 0.01 95);",
1387
+ " --destructive: oklch(0.7 0.19 22);",
1388
+ " --border: oklch(1 0 0 / 10%);",
1389
+ " --input: oklch(1 0 0 / 15%);",
1390
+ " --ring: oklch(0.62 0.04 70);",
1391
+ " --card: oklch(0.22 0.01 92);",
1392
+ " --card-foreground: oklch(0.98 0.01 95);",
1393
+ " --popover: oklch(0.22 0.01 92);",
1394
+ " --popover-foreground: oklch(0.98 0.01 95);",
1395
+ " --sidebar: oklch(0.18 0.01 92);",
1396
+ " --sidebar-foreground: oklch(0.98 0.01 95);",
1397
+ " --sidebar-primary: oklch(0.72 0.17 62);",
1398
+ " --sidebar-primary-foreground: oklch(0.19 0.01 92);",
1399
+ " --sidebar-accent: oklch(0.28 0.02 80);",
1400
+ " --sidebar-accent-foreground: oklch(0.98 0.01 95);",
1401
+ " --sidebar-border: oklch(1 0 0 / 10%);",
1402
+ " --sidebar-ring: oklch(0.62 0.04 70);",
1403
+ "}",
1404
+ "",
1405
+ "@theme inline {",
1406
+ ' --font-sans: "Geist Variable", sans-serif;',
1407
+ ' --font-display: "Bricolage Grotesque", sans-serif;',
1408
+ " --color-background: var(--background);",
1409
+ " --color-foreground: var(--foreground);",
1410
+ " --color-primary: var(--primary);",
1411
+ " --color-primary-foreground: var(--primary-foreground);",
1412
+ " --color-secondary: var(--secondary);",
1413
+ " --color-secondary-foreground: var(--secondary-foreground);",
1414
+ " --color-muted: var(--muted);",
1415
+ " --color-muted-foreground: var(--muted-foreground);",
1416
+ " --color-accent: var(--accent);",
1417
+ " --color-accent-foreground: var(--accent-foreground);",
1418
+ " --color-destructive: var(--destructive);",
1419
+ " --color-border: var(--border);",
1420
+ " --color-input: var(--input);",
1421
+ " --color-ring: var(--ring);",
1422
+ " --color-card: var(--card);",
1423
+ " --color-card-foreground: var(--card-foreground);",
1424
+ " --color-popover: var(--popover);",
1425
+ " --color-popover-foreground: var(--popover-foreground);",
1426
+ " --color-sidebar: var(--sidebar);",
1427
+ " --color-sidebar-foreground: var(--sidebar-foreground);",
1428
+ " --color-sidebar-primary: var(--sidebar-primary);",
1429
+ " --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);",
1430
+ " --color-sidebar-accent: var(--sidebar-accent);",
1431
+ " --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);",
1432
+ " --color-sidebar-border: var(--sidebar-border);",
1433
+ " --color-sidebar-ring: var(--sidebar-ring);",
1434
+ " --radius-sm: calc(var(--radius) - 4px);",
1435
+ " --radius-md: calc(var(--radius) - 2px);",
1436
+ " --radius-lg: var(--radius);",
1437
+ " --radius-xl: calc(var(--radius) + 4px);",
1438
+ "}",
1439
+ "",
1440
+ "@layer base {",
1441
+ " * {",
1442
+ " @apply border-border outline-ring/50;",
1443
+ " }",
1444
+ "",
1445
+ " body {",
1446
+ " @apply bg-background font-sans text-foreground antialiased;",
1447
+ " }",
1448
+ "}",
1449
+ "",
1450
+ ].join("\n");
1451
+ }
1452
+
1453
+ function buildThemeStore(context: GenerateContext) {
1454
+ return replaceTemplateTokens(
1455
+ [
1456
+ 'import { create } from "zustand";',
1457
+ 'import { createJSONStorage, persist } from "zustand/middleware";',
1458
+ "",
1459
+ 'type Theme = "light" | "dark" | "system";',
1460
+ "",
1461
+ "type ThemeState = {",
1462
+ " theme: Theme;",
1463
+ " setTheme: (theme: Theme) => void;",
1464
+ "};",
1465
+ "",
1466
+ 'function getSystemTheme(): "light" | "dark" {',
1467
+ ' if (typeof window === "undefined") return "light";',
1468
+ ' return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";',
1469
+ "}",
1470
+ "",
1471
+ "function applyTheme(theme: Theme) {",
1472
+ " const root = window.document.documentElement;",
1473
+ ' root.classList.remove("light", "dark");',
1474
+ ' root.classList.add(theme === "system" ? getSystemTheme() : theme);',
1475
+ "}",
1476
+ "",
1477
+ "export const useThemeStore = create<ThemeState>()(persist(",
1478
+ " (set) => ({",
1479
+ ' theme: "system",',
1480
+ " setTheme: (theme) => {",
1481
+ " applyTheme(theme);",
1482
+ " set({ theme });",
1483
+ " },",
1484
+ " }),",
1485
+ " {",
1486
+ ' name: "{{projectName}}-theme",',
1487
+ " storage: createJSONStorage(() => localStorage),",
1488
+ " onRehydrateStorage: () => (state) => {",
1489
+ ' if (state) applyTheme(state.theme ?? "system");',
1490
+ " },",
1491
+ " },",
1492
+ "));",
1493
+ "",
1494
+ ].join("\n"),
1495
+ context.tokens
1496
+ );
1497
+ }
1498
+
1499
+ function buildQueryProvider() {
1500
+ return [
1501
+ 'import { QueryClient, QueryClientProvider } from "@tanstack/react-query";',
1502
+ 'import { ReactQueryDevtools } from "@tanstack/react-query-devtools";',
1503
+ 'import type { ReactNode } from "react";',
1504
+ "",
1505
+ "const queryClient = new QueryClient({",
1506
+ " defaultOptions: {",
1507
+ " queries: {",
1508
+ " staleTime: 1000 * 60,",
1509
+ " retry: 1,",
1510
+ " },",
1511
+ " },",
1512
+ "});",
1513
+ "",
1514
+ "export function QueryProvider({ children }: { children: ReactNode }) {",
1515
+ " return (",
1516
+ " <QueryClientProvider client={queryClient}>",
1517
+ " {children}",
1518
+ " <ReactQueryDevtools />",
1519
+ " </QueryClientProvider>",
1520
+ " );",
1521
+ "}",
1522
+ "",
1523
+ ].join("\n");
1524
+ }
1525
+
1526
+ // ---------------------------------------------------------------------------
1527
+ // Server files
1528
+ // ---------------------------------------------------------------------------
1529
+
1530
+ function buildDbIndex() {
1531
+ return [
1532
+ 'import { drizzle } from "drizzle-orm/postgres-js";',
1533
+ 'import postgres from "postgres";',
1534
+ 'import * as schema from "./schema/index.ts";',
1535
+ "",
1536
+ "const connectionString = process.env.DATABASE_URL!;",
1537
+ "const client = postgres(connectionString, {",
1538
+ " onnotice: () => {},",
1539
+ "});",
1540
+ "export const db = drizzle(client, { schema });",
1541
+ "export type Database = typeof db;",
1542
+ "",
1543
+ ].join("\n");
1544
+ }
1545
+
1546
+ function buildDbSchemaIndex(context: GenerateContext) {
1547
+ const exports = ['export * from "./items.ts";'];
1548
+ if (context.resolvedModules.includes("auth")) {
1549
+ exports.push('export * from "./auth.ts";');
1550
+ }
1551
+ if (context.resolvedModules.includes("stripe")) {
1552
+ exports.push('export * from "./billing.ts";');
1553
+ }
1554
+ return exports.join("\n") + "\n";
1555
+ }
1556
+
1557
+ function buildItemsSchema() {
1558
+ return [
1559
+ 'import { pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";',
1560
+ "",
1561
+ 'export const items = pgTable("items", {',
1562
+ ' id: uuid("id").defaultRandom().primaryKey(),',
1563
+ ' name: text("name").notNull(),',
1564
+ ' description: text("description"),',
1565
+ ' createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),',
1566
+ ' updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow().notNull(),',
1567
+ "});",
1568
+ "",
1569
+ ].join("\n");
1570
+ }
1571
+
1572
+ function buildEnvTs(context: GenerateContext) {
1573
+ const fields: string[] = [
1574
+ " DATABASE_URL: z.string().url(),",
1575
+ " DATABASE_URL_TEST: z.string().url().optional(),",
1576
+ ' NODE_ENV: z.enum(["development", "production", "test"]).default("development"),',
1577
+ " PORT: z.coerce.number().default(3000),",
1578
+ ' APP_URL: z.string().url().default("http://localhost:3000"),',
1579
+ ' LOG_FORMAT: z.enum(["json", "text"]).optional(),',
1580
+ ' LOG_LEVEL: z.enum(["debug", "error", "info"]).optional(),',
1581
+ ];
1582
+
1583
+ if (context.resolvedModules.includes("auth")) {
1584
+ fields.push(" BETTER_AUTH_SECRET: z.string(),");
1585
+ fields.push(' BETTER_AUTH_URL: z.string().url().default("http://localhost:3000"),');
1586
+ }
1587
+ if (context.resolvedModules.includes("stripe")) {
1588
+ fields.push(" STRIPE_SECRET_KEY: z.string(),");
1589
+ fields.push(" STRIPE_WEBHOOK_SECRET: z.string(),");
1590
+ }
1591
+ if (context.resolvedModules.includes("storage")) {
1592
+ fields.push(" S3_ENDPOINT: z.string().url(),");
1593
+ fields.push(" S3_ACCESS_KEY_ID: z.string(),");
1594
+ fields.push(" S3_SECRET_ACCESS_KEY: z.string(),");
1595
+ fields.push(' S3_BUCKET: z.string().default("uploads"),');
1596
+ fields.push(' S3_REGION: z.string().default("us-east-1"),');
1597
+ }
1598
+ if (context.resolvedModules.includes("email")) {
1599
+ fields.push(" RESEND_API_KEY: z.string(),");
1600
+ fields.push(' EMAIL_FROM: z.string().default("noreply@example.com"),');
1601
+ }
1602
+ if (context.resolvedModules.includes("inngest")) {
1603
+ fields.push(" INNGEST_EVENT_KEY: z.string().optional(),");
1604
+ fields.push(" INNGEST_SIGNING_KEY: z.string().optional(),");
1605
+ }
1606
+ if (context.resolvedModules.includes("observability")) {
1607
+ fields.push(" SENTRY_DSN: z.string().url().optional(),");
1608
+ fields.push(" SENTRY_ENVIRONMENT: z.string().optional(),");
1609
+ fields.push(" SENTRY_RELEASE: z.string().optional(),");
1610
+ fields.push(" SENTRY_TRACES_SAMPLE_RATE: z.string().optional(),");
1611
+ fields.push(' TRACING_ENABLED: z.enum(["0", "1"]).optional(),');
1612
+ fields.push(' OTEL_TRACES_ENABLED: z.enum(["0", "1"]).optional(),');
1613
+ fields.push(" OTEL_EXPORTER_OTLP_ENDPOINT: z.string().url().optional(),");
1614
+ fields.push(" OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: z.string().url().optional(),");
1615
+ fields.push(" OTEL_SERVICE_NAME: z.string().optional(),");
1616
+ fields.push(" OTEL_SERVICE_VERSION: z.string().optional(),");
1617
+ }
1618
+ if (context.resolvedModules.includes("inngest")) {
1619
+ fields.push(" INNGEST_BASE_URL: z.string().url().optional(),");
1620
+ fields.push(' INNGEST_DEV: z.enum(["0", "1"]).optional(),');
1621
+ }
1622
+ if (context.resolvedModules.includes("redis")) {
1623
+ fields.push(' REDIS_URL: z.string().default("redis://localhost:6379"),');
1624
+ fields.push(" RATE_LIMIT_WINDOW_MS: z.coerce.number().int().positive().default(60000),");
1625
+ fields.push(
1626
+ " RATE_LIMIT_AUTHENTICATED_LIMIT: z.coerce.number().int().positive().default(300),"
1627
+ );
1628
+ fields.push(" RATE_LIMIT_PUBLIC_LIMIT: z.coerce.number().int().positive().default(30),");
1629
+ fields.push(" RATE_LIMIT_WEBHOOK_LIMIT: z.coerce.number().int().positive().default(120),");
1630
+ }
1631
+
1632
+ return [
1633
+ 'import { z } from "zod";',
1634
+ "",
1635
+ "const envSchema = z.object({",
1636
+ ...fields,
1637
+ "});",
1638
+ "",
1639
+ "export const env = envSchema.parse(process.env);",
1640
+ "",
1641
+ ].join("\n");
1642
+ }
1643
+
1644
+ function buildItemsFunctions() {
1645
+ return [
1646
+ 'import { createServerFn } from "@tanstack/react-start";',
1647
+ 'import { eq } from "drizzle-orm";',
1648
+ 'import { db } from "~/server/db/index.ts";',
1649
+ 'import { items } from "~/server/db/schema/index.ts";',
1650
+ "",
1651
+ 'export const listItems = createServerFn({ method: "GET" }).handler(async () => {',
1652
+ " return db.select().from(items).orderBy(items.createdAt);",
1653
+ "});",
1654
+ "",
1655
+ 'export const getItem = createServerFn({ method: "GET" })',
1656
+ " .inputValidator((id: string) => id)",
1657
+ " .handler(async ({ data: id }) => {",
1658
+ " const [item] = await db.select().from(items).where(eq(items.id, id));",
1659
+ " return item ?? null;",
1660
+ " });",
1661
+ "",
1662
+ 'export const createItem = createServerFn({ method: "POST" })',
1663
+ " .inputValidator((input: { name: string; description?: string }) => input)",
1664
+ " .handler(async ({ data }) => {",
1665
+ " const [item] = await db.insert(items).values(data).returning();",
1666
+ " return item;",
1667
+ " });",
1668
+ "",
1669
+ ].join("\n");
1670
+ }
1671
+
1672
+ function buildHealthApiRoute(context: GenerateContext) {
1673
+ const lines = [
1674
+ 'import { sql } from "drizzle-orm";',
1675
+ 'import { createFileRoute } from "@tanstack/react-router";',
1676
+ 'import { db } from "~/server/db/index.ts";',
1677
+ ];
1678
+
1679
+ if (context.resolvedModules.includes("redis")) {
1680
+ lines.push('import { getRedisClient } from "~/server/lib/redis.ts";');
1681
+ }
1682
+
1683
+ lines.push(
1684
+ "",
1685
+ "const READINESS_TIMEOUT_MS = 5_000;",
1686
+ "",
1687
+ "function withReadinessTimeout<T>(label: string, task: () => Promise<T>) {",
1688
+ " let timeoutId: ReturnType<typeof setTimeout> | undefined;",
1689
+ "",
1690
+ " const timeoutPromise = new Promise<never>((_, reject) => {",
1691
+ " timeoutId = setTimeout(() => {",
1692
+ " reject(new Error(`${label} readiness check timed out after ${READINESS_TIMEOUT_MS}ms`));",
1693
+ " }, READINESS_TIMEOUT_MS);",
1694
+ "",
1695
+ " timeoutId.unref?.();",
1696
+ " });",
1697
+ "",
1698
+ " return Promise.race([task(), timeoutPromise]).finally(() => {",
1699
+ " if (timeoutId) {",
1700
+ " clearTimeout(timeoutId);",
1701
+ " }",
1702
+ " });",
1703
+ "}",
1704
+ "",
1705
+ "async function checkPostgresReadiness() {",
1706
+ ' await withReadinessTimeout("postgres", async () => {',
1707
+ " await db.execute(sql`select 1`);",
1708
+ " });",
1709
+ "}",
1710
+ ""
1711
+ );
1712
+
1713
+ if (context.resolvedModules.includes("redis")) {
1714
+ lines.push(
1715
+ "async function checkRedisReadiness() {",
1716
+ ' await withReadinessTimeout("redis", async () => {',
1717
+ " const pong = await getRedisClient().ping();",
1718
+ ' if (pong !== "PONG") {',
1719
+ ' throw new Error("Redis did not respond with PONG");',
1720
+ " }",
1721
+ " });",
1722
+ "}",
1723
+ ""
1724
+ );
1725
+ }
1726
+
1727
+ lines.push(
1728
+ 'export const Route = createFileRoute("/api/health")({',
1729
+ " server: {",
1730
+ " handlers: {",
1731
+ " GET: async () => {",
1732
+ " const timestamp = new Date().toISOString();",
1733
+ "",
1734
+ ' const checks: Record<string, "ok" | "error"> = {',
1735
+ ' postgres: "ok",'
1736
+ );
1737
+
1738
+ if (context.resolvedModules.includes("redis")) {
1739
+ lines.push(' redis: "ok",');
1740
+ }
1741
+
1742
+ lines.push(
1743
+ " };",
1744
+ "",
1745
+ " try {",
1746
+ " await checkPostgresReadiness();",
1747
+ " } catch {",
1748
+ ' checks.postgres = "error";',
1749
+ " }",
1750
+ ""
1751
+ );
1752
+
1753
+ if (context.resolvedModules.includes("redis")) {
1754
+ lines.push(
1755
+ " try {",
1756
+ " await checkRedisReadiness();",
1757
+ " } catch {",
1758
+ ' checks.redis = "error";',
1759
+ " }",
1760
+ ""
1761
+ );
1762
+ }
1763
+
1764
+ lines.push(
1765
+ ' if (Object.values(checks).every(status => status === "ok")) {',
1766
+ " return Response.json({",
1767
+ ' status: "ready",',
1768
+ " checks,",
1769
+ " timestamp,",
1770
+ " });",
1771
+ " }",
1772
+ "",
1773
+ " return Response.json(",
1774
+ " {",
1775
+ ' status: "not_ready",',
1776
+ " checks,",
1777
+ " timestamp,",
1778
+ " },",
1779
+ " { status: 503 }",
1780
+ " );",
1781
+ " },",
1782
+ " },",
1783
+ " },",
1784
+ "});",
1785
+ ""
1786
+ );
1787
+
1788
+ return replaceTemplateTokens(lines.join("\n"), context.tokens);
1789
+ }
1790
+
1791
+ function buildEnvExample(context: GenerateContext) {
1792
+ const lines = [
1793
+ "# App",
1794
+ "APP_URL=http://localhost:3000",
1795
+ "PORT=3000",
1796
+ "NODE_ENV=development",
1797
+ "LOG_FORMAT=text",
1798
+ "LOG_LEVEL=info",
1799
+ "",
1800
+ "# Database",
1801
+ `DATABASE_URL=postgresql://postgres:postgres@localhost:5432/${context.projectName}`,
1802
+ `DATABASE_URL_TEST=postgresql://postgres:postgres@localhost:5432/${context.projectName}_test`,
1803
+ "",
1804
+ ];
1805
+
1806
+ if (context.resolvedModules.includes("auth")) {
1807
+ lines.push(
1808
+ "# Auth",
1809
+ "BETTER_AUTH_SECRET=change-me-to-a-random-secret",
1810
+ "BETTER_AUTH_URL=http://localhost:3000",
1811
+ ""
1812
+ );
1813
+ }
1814
+ if (context.resolvedModules.includes("stripe")) {
1815
+ lines.push("# Stripe", "STRIPE_SECRET_KEY=sk_test_...", "STRIPE_WEBHOOK_SECRET=whsec_...", "");
1816
+ }
1817
+ if (context.resolvedModules.includes("storage")) {
1818
+ lines.push(
1819
+ "# Storage",
1820
+ "S3_ENDPOINT=http://localhost:9000",
1821
+ "S3_ACCESS_KEY_ID=minioadmin",
1822
+ "S3_SECRET_ACCESS_KEY=minioadmin",
1823
+ "S3_BUCKET=uploads",
1824
+ "S3_REGION=us-east-1",
1825
+ ""
1826
+ );
1827
+ }
1828
+ if (context.resolvedModules.includes("email")) {
1829
+ lines.push("# Email", "RESEND_API_KEY=re_...", "EMAIL_FROM=noreply@example.com", "");
1830
+ }
1831
+ if (context.resolvedModules.includes("inngest")) {
1832
+ lines.push(
1833
+ "# Inngest",
1834
+ "INNGEST_EVENT_KEY=",
1835
+ "INNGEST_SIGNING_KEY=",
1836
+ "INNGEST_BASE_URL=http://localhost:8288",
1837
+ "INNGEST_DEV=1",
1838
+ ""
1839
+ );
1840
+ }
1841
+ if (context.resolvedModules.includes("observability")) {
1842
+ lines.push(
1843
+ "# Observability",
1844
+ "SENTRY_DSN=",
1845
+ "SENTRY_ENVIRONMENT=development",
1846
+ "SENTRY_RELEASE=",
1847
+ "SENTRY_TRACES_SAMPLE_RATE=0.1",
1848
+ "TRACING_ENABLED=0",
1849
+ "OTEL_TRACES_ENABLED=0",
1850
+ "OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317",
1851
+ `OTEL_SERVICE_NAME=${context.projectName}-backend`,
1852
+ "OTEL_SERVICE_VERSION=",
1853
+ ""
1854
+ );
1855
+ }
1856
+ if (context.resolvedModules.includes("redis")) {
1857
+ lines.push(
1858
+ "# Redis",
1859
+ "REDIS_URL=redis://localhost:6379",
1860
+ "RATE_LIMIT_WINDOW_MS=60000",
1861
+ "RATE_LIMIT_AUTHENTICATED_LIMIT=300",
1862
+ "RATE_LIMIT_PUBLIC_LIMIT=30",
1863
+ "RATE_LIMIT_WEBHOOK_LIMIT=120",
1864
+ ""
1865
+ );
1866
+ }
1867
+
1868
+ return lines.join("\n");
1869
+ }
1870
+
1871
+ // ---------------------------------------------------------------------------
1872
+ // Module: Auth
1873
+ // ---------------------------------------------------------------------------
1874
+
1875
+ function buildAuthConfig(context: GenerateContext) {
1876
+ const hasOrgs = context.resolvedModules.includes("organizations");
1877
+ return [
1878
+ 'import { betterAuth } from "better-auth";',
1879
+ 'import { drizzleAdapter } from "better-auth/adapters/drizzle";',
1880
+ hasOrgs ? 'import { organization } from "better-auth/plugins";' : "",
1881
+ 'import { db } from "~/server/db/index.ts";',
1882
+ "",
1883
+ "export const auth = betterAuth({",
1884
+ ' database: drizzleAdapter(db, { provider: "pg" }),',
1885
+ " emailAndPassword: { enabled: true },",
1886
+ hasOrgs ? " plugins: [organization()]," : "",
1887
+ "});",
1888
+ "",
1889
+ ]
1890
+ .filter(Boolean)
1891
+ .join("\n");
1892
+ }
1893
+
1894
+ function buildAuthMiddleware() {
1895
+ return [
1896
+ 'import { auth } from "~/server/lib/auth/auth.ts";',
1897
+ 'import { UnauthorizedError } from "~/server/lib/errors.ts";',
1898
+ "",
1899
+ "export type AuthContext = {",
1900
+ ' user: NonNullable<Awaited<ReturnType<typeof auth.api.getSession>>>["user"];',
1901
+ ' session: NonNullable<Awaited<ReturnType<typeof auth.api.getSession>>>["session"];',
1902
+ "};",
1903
+ "",
1904
+ "export async function getAuthContext(request: Request): Promise<AuthContext | null> {",
1905
+ " const result = await auth.api.getSession({ headers: request.headers });",
1906
+ " if (!result) return null;",
1907
+ " return { user: result.user, session: result.session };",
1908
+ "}",
1909
+ "",
1910
+ "export async function requireAuth(request: Request): Promise<AuthContext> {",
1911
+ " const ctx = await getAuthContext(request);",
1912
+ ' if (!ctx) throw new UnauthorizedError("Authentication required");',
1913
+ " return ctx;",
1914
+ "}",
1915
+ "",
1916
+ ].join("\n");
1917
+ }
1918
+
1919
+ function buildAuthApiRoute() {
1920
+ return [
1921
+ 'import { createFileRoute } from "@tanstack/react-router";',
1922
+ 'import { auth } from "~/server/lib/auth/auth.ts";',
1923
+ "",
1924
+ 'export const Route = createFileRoute("/api/auth/$")({',
1925
+ " handler: async ({ request }) => {",
1926
+ " return auth.handler(request);",
1927
+ " },",
1928
+ "});",
1929
+ "",
1930
+ ].join("\n");
1931
+ }
1932
+
1933
+ function buildAuthSchema() {
1934
+ return [
1935
+ 'import { pgTable, text, timestamp, boolean, uuid } from "drizzle-orm/pg-core";',
1936
+ "",
1937
+ 'export const user = pgTable("user", {',
1938
+ ' id: uuid("id").defaultRandom().primaryKey(),',
1939
+ ' name: text("name").notNull(),',
1940
+ ' email: text("email").notNull().unique(),',
1941
+ ' emailVerified: boolean("email_verified").notNull().default(false),',
1942
+ ' image: text("image"),',
1943
+ ' createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),',
1944
+ ' updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow().notNull(),',
1945
+ "});",
1946
+ "",
1947
+ 'export const session = pgTable("session", {',
1948
+ ' id: uuid("id").defaultRandom().primaryKey(),',
1949
+ ' expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(),',
1950
+ ' token: text("token").notNull().unique(),',
1951
+ ' ipAddress: text("ip_address"),',
1952
+ ' userAgent: text("user_agent"),',
1953
+ ' userId: uuid("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),',
1954
+ ' activeOrganizationId: text("active_organization_id"),',
1955
+ ' createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),',
1956
+ ' updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow().notNull(),',
1957
+ "});",
1958
+ "",
1959
+ 'export const account = pgTable("account", {',
1960
+ ' id: uuid("id").defaultRandom().primaryKey(),',
1961
+ ' accountId: text("account_id").notNull(),',
1962
+ ' providerId: text("provider_id").notNull(),',
1963
+ ' userId: uuid("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),',
1964
+ ' accessToken: text("access_token"),',
1965
+ ' refreshToken: text("refresh_token"),',
1966
+ ' idToken: text("id_token"),',
1967
+ ' accessTokenExpiresAt: timestamp("access_token_expires_at", { withTimezone: true }),',
1968
+ ' refreshTokenExpiresAt: timestamp("refresh_token_expires_at", { withTimezone: true }),',
1969
+ ' scope: text("scope"),',
1970
+ ' password: text("password"),',
1971
+ ' createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),',
1972
+ ' updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow().notNull(),',
1973
+ "});",
1974
+ "",
1975
+ 'export const verification = pgTable("verification", {',
1976
+ ' id: uuid("id").defaultRandom().primaryKey(),',
1977
+ ' identifier: text("identifier").notNull(),',
1978
+ ' value: text("value").notNull(),',
1979
+ ' expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(),',
1980
+ ' createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),',
1981
+ ' updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow().notNull(),',
1982
+ "});",
1983
+ "",
1984
+ ].join("\n");
1985
+ }
1986
+
1987
+ // ---------------------------------------------------------------------------
1988
+ // Module: Organizations
1989
+ // ---------------------------------------------------------------------------
1990
+
1991
+ function buildOrgContext() {
1992
+ return [
1993
+ 'import type { AuthContext } from "~/server/middleware/auth.ts";',
1994
+ 'import { ValidationError } from "~/server/lib/errors.ts";',
1995
+ "",
1996
+ "export function getOrgId(ctx: AuthContext, orgIdHeader?: string | null): string {",
1997
+ " if (orgIdHeader) return orgIdHeader;",
1998
+ " const orgId = ctx.session.activeOrganizationId;",
1999
+ ' if (!orgId) throw new ValidationError("No active organization");',
2000
+ " return orgId;",
2001
+ "}",
2002
+ "",
2003
+ ].join("\n");
2004
+ }
2005
+
2006
+ function buildPermissions() {
2007
+ return [
2008
+ 'export type Role = "owner" | "admin" | "member";',
2009
+ 'export type Resource = "billing" | "members" | "settings";',
2010
+ 'export type Action = "read" | "write" | "delete";',
2011
+ "",
2012
+ "const PERMISSIONS: Record<Role, Record<Resource, Action[]>> = {",
2013
+ ' owner: { billing: ["read", "write", "delete"], members: ["read", "write", "delete"], settings: ["read", "write", "delete"] },',
2014
+ ' admin: { billing: ["read", "write"], members: ["read", "write"], settings: ["read", "write"] },',
2015
+ ' member: { billing: ["read"], members: ["read"], settings: ["read"] },',
2016
+ "};",
2017
+ "",
2018
+ "export function hasPermission(role: Role, resource: Resource, action: Action): boolean {",
2019
+ " return PERMISSIONS[role]?.[resource]?.includes(action) ?? false;",
2020
+ "}",
2021
+ "",
2022
+ ].join("\n");
2023
+ }
2024
+
2025
+ // ---------------------------------------------------------------------------
2026
+ // Module: Stripe (stubs)
2027
+ // ---------------------------------------------------------------------------
2028
+
2029
+ function buildStripeClient() {
2030
+ return [
2031
+ 'import Stripe from "stripe";',
2032
+ "",
2033
+ "export function getStripeClient() {",
2034
+ ' return new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: "2025-04-30.basil" });',
2035
+ "}",
2036
+ "",
2037
+ ].join("\n");
2038
+ }
2039
+
2040
+ function buildBillingLib() {
2041
+ return [
2042
+ 'export { getStripeClient } from "~/server/lib/integrations/stripe.ts";',
2043
+ "",
2044
+ "// Add billing logic here (checkout sessions, subscription management, etc.)",
2045
+ "",
2046
+ ].join("\n");
2047
+ }
2048
+
2049
+ function buildBillingSchema() {
2050
+ return [
2051
+ 'import { pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";',
2052
+ 'import { user } from "./auth.ts";',
2053
+ "",
2054
+ 'export const subscriptions = pgTable("subscriptions", {',
2055
+ ' id: uuid("id").defaultRandom().primaryKey(),',
2056
+ ' userId: uuid("user_id").notNull().references(() => user.id),',
2057
+ ' stripeSubscriptionId: text("stripe_subscription_id").unique(),',
2058
+ ' stripeCustomerId: text("stripe_customer_id"),',
2059
+ ' status: text("status").notNull(),',
2060
+ ' planId: text("plan_id"),',
2061
+ ' createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),',
2062
+ ' updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow().notNull(),',
2063
+ "});",
2064
+ "",
2065
+ ].join("\n");
2066
+ }
2067
+
2068
+ function buildBillingFunctions() {
2069
+ return [
2070
+ 'import { createServerFn } from "@tanstack/react-start";',
2071
+ 'import { getStripeClient } from "~/server/lib/integrations/stripe.ts";',
2072
+ "",
2073
+ 'export const createCheckoutSession = createServerFn({ method: "POST" })',
2074
+ " .inputValidator((input: { priceId: string; successUrl: string; cancelUrl: string }) => input)",
2075
+ " .handler(async ({ data }) => {",
2076
+ " const stripe = getStripeClient();",
2077
+ " const session = await stripe.checkout.sessions.create({",
2078
+ ' mode: "subscription",',
2079
+ " line_items: [{ price: data.priceId, quantity: 1 }],",
2080
+ " success_url: data.successUrl,",
2081
+ " cancel_url: data.cancelUrl,",
2082
+ " });",
2083
+ " return { url: session.url };",
2084
+ " });",
2085
+ "",
2086
+ ].join("\n");
2087
+ }
2088
+
2089
+ function buildStripeWebhookRoute() {
2090
+ return [
2091
+ 'import { createFileRoute } from "@tanstack/react-router";',
2092
+ 'import { getStripeClient } from "~/server/lib/integrations/stripe.ts";',
2093
+ "",
2094
+ 'export const Route = createFileRoute("/api/webhooks/stripe")({',
2095
+ " handler: async ({ request }) => {",
2096
+ " const rawBody = await request.text();",
2097
+ ' const signature = request.headers.get("stripe-signature");',
2098
+ " if (!signature) {",
2099
+ ' return Response.json({ error: "Missing signature" }, { status: 400 });',
2100
+ " }",
2101
+ "",
2102
+ " const stripe = getStripeClient();",
2103
+ " const event = stripe.webhooks.constructEvent(",
2104
+ " rawBody,",
2105
+ " signature,",
2106
+ " process.env.STRIPE_WEBHOOK_SECRET!,",
2107
+ " );",
2108
+ "",
2109
+ " // Handle event types",
2110
+ " switch (event.type) {",
2111
+ ' case "checkout.session.completed":',
2112
+ " // Handle checkout completion",
2113
+ " break;",
2114
+ ' case "customer.subscription.updated":',
2115
+ " // Handle subscription update",
2116
+ " break;",
2117
+ " }",
2118
+ "",
2119
+ " return Response.json({ received: true });",
2120
+ " },",
2121
+ "});",
2122
+ "",
2123
+ ].join("\n");
2124
+ }
2125
+
2126
+ // ---------------------------------------------------------------------------
2127
+ // Module: Storage
2128
+ // ---------------------------------------------------------------------------
2129
+
2130
+ function buildStorageClient() {
2131
+ return [
2132
+ 'import { S3Client } from "@aws-sdk/client-s3";',
2133
+ "",
2134
+ "export function getS3Client() {",
2135
+ " return new S3Client({",
2136
+ " endpoint: process.env.S3_ENDPOINT,",
2137
+ " region: process.env.S3_REGION,",
2138
+ " credentials: {",
2139
+ " accessKeyId: process.env.S3_ACCESS_KEY_ID!,",
2140
+ " secretAccessKey: process.env.S3_SECRET_ACCESS_KEY!,",
2141
+ " },",
2142
+ " forcePathStyle: true,",
2143
+ " });",
2144
+ "}",
2145
+ "",
2146
+ ].join("\n");
2147
+ }
2148
+
2149
+ function buildStorageIndex() {
2150
+ return [
2151
+ 'export { getS3Client } from "./client.ts";',
2152
+ "",
2153
+ "// Add presigned URL helpers, upload/download utilities here",
2154
+ "",
2155
+ ].join("\n");
2156
+ }
2157
+
2158
+ // ---------------------------------------------------------------------------
2159
+ // Module: Email
2160
+ // ---------------------------------------------------------------------------
2161
+
2162
+ function buildEmailSend() {
2163
+ return [
2164
+ 'import { getResendClient } from "~/server/lib/integrations/resend.ts";',
2165
+ "",
2166
+ "export async function sendEmail(options: {",
2167
+ " to: string;",
2168
+ " subject: string;",
2169
+ " html: string;",
2170
+ "}) {",
2171
+ " const resend = getResendClient();",
2172
+ " return resend.emails.send({",
2173
+ " from: process.env.EMAIL_FROM!,",
2174
+ " ...options,",
2175
+ " });",
2176
+ "}",
2177
+ "",
2178
+ ].join("\n");
2179
+ }
2180
+
2181
+ function buildEmailLayout() {
2182
+ return [
2183
+ "export function EmailLayout({ children }: { children: React.ReactNode }) {",
2184
+ " return (",
2185
+ ' <div style={{ fontFamily: "system-ui, sans-serif", padding: "20px" }}>',
2186
+ " {children}",
2187
+ " </div>",
2188
+ " );",
2189
+ "}",
2190
+ "",
2191
+ ].join("\n");
2192
+ }
2193
+
2194
+ function buildResendClient() {
2195
+ return [
2196
+ 'import { Resend } from "resend";',
2197
+ "",
2198
+ "export function getResendClient() {",
2199
+ " return new Resend(process.env.RESEND_API_KEY);",
2200
+ "}",
2201
+ "",
2202
+ ].join("\n");
2203
+ }
2204
+
2205
+ // ---------------------------------------------------------------------------
2206
+ // Module: Inngest
2207
+ // ---------------------------------------------------------------------------
2208
+
2209
+ function buildInngestClient() {
2210
+ return [
2211
+ 'import { Inngest } from "inngest";',
2212
+ "",
2213
+ 'export const inngest = new Inngest({ id: "app" });',
2214
+ "",
2215
+ ].join("\n");
2216
+ }
2217
+
2218
+ function buildInngestJobsIndex() {
2219
+ return [
2220
+ 'import { exampleJob } from "./example.ts";',
2221
+ "",
2222
+ "export const functions = [exampleJob];",
2223
+ "",
2224
+ ].join("\n");
2225
+ }
2226
+
2227
+ function buildInngestExampleJob() {
2228
+ return [
2229
+ 'import { inngest } from "~/server/lib/inngest.ts";',
2230
+ "",
2231
+ "export const exampleJob = inngest.createFunction(",
2232
+ ' { id: "example-job" },',
2233
+ ' { event: "app/example.run" },',
2234
+ " async ({ event, step }) => {",
2235
+ ' await step.run("process", async () => {',
2236
+ " // your job logic here",
2237
+ " return { success: true };",
2238
+ " });",
2239
+ " },",
2240
+ ");",
2241
+ "",
2242
+ ].join("\n");
2243
+ }
2244
+
2245
+ function buildInngestApiRoute() {
2246
+ return [
2247
+ 'import { createFileRoute } from "@tanstack/react-router";',
2248
+ 'import { serve } from "inngest/express";',
2249
+ 'import { inngest } from "~/server/lib/inngest.ts";',
2250
+ 'import { functions } from "~/server/jobs/index.ts";',
2251
+ "",
2252
+ "const inngestHandler = serve({ client: inngest, functions });",
2253
+ "",
2254
+ 'export const Route = createFileRoute("/api/inngest")({',
2255
+ " handler: async ({ request }) => {",
2256
+ " // Inngest needs the standard handler",
2257
+ " return inngestHandler(request);",
2258
+ " },",
2259
+ "});",
2260
+ "",
2261
+ ].join("\n");
2262
+ }
2263
+
2264
+ // ---------------------------------------------------------------------------
2265
+ // Module: Observability
2266
+ // ---------------------------------------------------------------------------
2267
+
2268
+ function buildTracingLib(context: GenerateContext) {
2269
+ return replaceTemplateTokens(
2270
+ [
2271
+ 'import { trace } from "@opentelemetry/api";',
2272
+ 'import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-grpc";',
2273
+ 'import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";',
2274
+ 'import { resourceFromAttributes } from "@opentelemetry/resources";',
2275
+ 'import { NodeSDK } from "@opentelemetry/sdk-node";',
2276
+ 'import { BatchSpanProcessor, SimpleSpanProcessor, type SpanExporter, type SpanProcessor } from "@opentelemetry/sdk-trace-base";',
2277
+ 'import { z } from "zod";',
2278
+ "",
2279
+ 'const DEFAULT_OTEL_EXPORTER_URL = "http://localhost:4317";',
2280
+ 'const DEFAULT_SERVICE_NAME = "{{projectName}}-backend";',
2281
+ 'const TRACER_NAME = "{{projectName}}-backend";',
2282
+ "",
2283
+ "const tracingEnvironmentSchema = z.object({",
2284
+ " NODE_ENV: z.string().trim().min(1).optional(),",
2285
+ " OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: z.string().trim().url().optional(),",
2286
+ " OTEL_EXPORTER_OTLP_ENDPOINT: z.string().trim().url().optional(),",
2287
+ " OTEL_SERVICE_NAME: z.string().trim().min(1).optional(),",
2288
+ " OTEL_SERVICE_VERSION: z.string().trim().min(1).optional(),",
2289
+ ' OTEL_TRACES_ENABLED: z.enum(["0", "1"]).optional(),',
2290
+ ' TRACING_ENABLED: z.enum(["0", "1"]).optional(),',
2291
+ " SENTRY_RELEASE: z.string().trim().min(1).optional(),",
2292
+ "});",
2293
+ "",
2294
+ "type TracingRawEnv = Record<string, string | undefined>;",
2295
+ "",
2296
+ "export interface TracingEnvironment {",
2297
+ " enabled: boolean;",
2298
+ " environment: string;",
2299
+ " exporterUrl: string;",
2300
+ " serviceName: string;",
2301
+ " serviceVersion?: string;",
2302
+ "}",
2303
+ "",
2304
+ "interface CreateTracingSdkOptions {",
2305
+ " rawEnv?: TracingRawEnv;",
2306
+ " spanProcessors?: SpanProcessor[];",
2307
+ " traceExporter?: SpanExporter;",
2308
+ "}",
2309
+ "",
2310
+ "let tracingSdk: NodeSDK | null = null;",
2311
+ "",
2312
+ "function getEnvironmentName(rawValue: string | undefined) {",
2313
+ ' return rawValue || "development";',
2314
+ "}",
2315
+ "",
2316
+ "export function getTracer() {",
2317
+ " return trace.getTracer(TRACER_NAME);",
2318
+ "}",
2319
+ "",
2320
+ "export function resolveTracingEnvironment(rawEnv: TracingRawEnv = process.env): TracingEnvironment {",
2321
+ " const parsedEnv = tracingEnvironmentSchema.parse(rawEnv);",
2322
+ " const environment = getEnvironmentName(parsedEnv.NODE_ENV);",
2323
+ "",
2324
+ " return {",
2325
+ " enabled:",
2326
+ ' parsedEnv.TRACING_ENABLED !== "0" &&',
2327
+ ' parsedEnv.OTEL_TRACES_ENABLED !== "0" &&',
2328
+ ' environment !== "test",',
2329
+ " environment,",
2330
+ " exporterUrl:",
2331
+ " parsedEnv.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ??",
2332
+ " parsedEnv.OTEL_EXPORTER_OTLP_ENDPOINT ??",
2333
+ " DEFAULT_OTEL_EXPORTER_URL,",
2334
+ " serviceName: parsedEnv.OTEL_SERVICE_NAME ?? DEFAULT_SERVICE_NAME,",
2335
+ " serviceVersion: parsedEnv.OTEL_SERVICE_VERSION ?? parsedEnv.SENTRY_RELEASE,",
2336
+ " };",
2337
+ "}",
2338
+ "",
2339
+ "export function createTracingSdk(options: CreateTracingSdkOptions = {}) {",
2340
+ " const environment = resolveTracingEnvironment(options.rawEnv);",
2341
+ " const traceExporter =",
2342
+ " options.traceExporter ??",
2343
+ " new OTLPTraceExporter({",
2344
+ " url: environment.exporterUrl,",
2345
+ " });",
2346
+ " const spanProcessors = options.spanProcessors ?? [",
2347
+ " options.traceExporter",
2348
+ " ? new SimpleSpanProcessor(traceExporter)",
2349
+ " : new BatchSpanProcessor(traceExporter),",
2350
+ " ];",
2351
+ "",
2352
+ " return new NodeSDK({",
2353
+ " autoDetectResources: false,",
2354
+ " resource: resourceFromAttributes({",
2355
+ ' "deployment.environment.name": environment.environment,',
2356
+ ' "service.name": environment.serviceName,',
2357
+ " ...(environment.serviceVersion",
2358
+ " ? {",
2359
+ ' "service.version": environment.serviceVersion,',
2360
+ " }",
2361
+ " : {}),",
2362
+ " }),",
2363
+ " spanProcessors,",
2364
+ " instrumentations: [new HttpInstrumentation()],",
2365
+ " });",
2366
+ "}",
2367
+ "",
2368
+ "export async function initializeTracing(",
2369
+ " rawEnv: TracingRawEnv = process.env,",
2370
+ ' options: Omit<CreateTracingSdkOptions, "rawEnv"> = {}',
2371
+ ") {",
2372
+ " const environment = resolveTracingEnvironment(rawEnv);",
2373
+ "",
2374
+ " if (!environment.enabled) {",
2375
+ " return false;",
2376
+ " }",
2377
+ "",
2378
+ " if (tracingSdk) {",
2379
+ " return true;",
2380
+ " }",
2381
+ "",
2382
+ " tracingSdk = createTracingSdk({",
2383
+ " ...options,",
2384
+ " rawEnv,",
2385
+ " });",
2386
+ " await tracingSdk.start();",
2387
+ " return true;",
2388
+ "}",
2389
+ "",
2390
+ "export async function shutdownTracing() {",
2391
+ " if (!tracingSdk) {",
2392
+ " return;",
2393
+ " }",
2394
+ "",
2395
+ " const sdk = tracingSdk;",
2396
+ " tracingSdk = null;",
2397
+ " await sdk.shutdown();",
2398
+ "}",
2399
+ "",
2400
+ "export async function shutdownTracingForTests() {",
2401
+ " await shutdownTracing();",
2402
+ "}",
2403
+ "",
2404
+ ].join("\n"),
2405
+ context.tokens
2406
+ );
2407
+ }
2408
+
2409
+ function buildSentryLib() {
2410
+ return [
2411
+ 'import * as Sentry from "@sentry/bun";',
2412
+ "",
2413
+ "interface SentryRawEnv {",
2414
+ " NODE_ENV?: string;",
2415
+ " SENTRY_DSN?: string;",
2416
+ " SENTRY_ENVIRONMENT?: string;",
2417
+ " SENTRY_RELEASE?: string;",
2418
+ " SENTRY_TRACES_SAMPLE_RATE?: string;",
2419
+ "}",
2420
+ "",
2421
+ "let isSentryInitialized = false;",
2422
+ "",
2423
+ "function parseTracesSampleRate(rawValue: string | undefined) {",
2424
+ " if (!rawValue) {",
2425
+ " return 0.1;",
2426
+ " }",
2427
+ "",
2428
+ " const parsedValue = Number(rawValue);",
2429
+ "",
2430
+ " return Number.isFinite(parsedValue) && parsedValue >= 0 && parsedValue <= 1 ? parsedValue : 0.1;",
2431
+ "}",
2432
+ "",
2433
+ "export function initializeSentry(rawEnv: SentryRawEnv = process.env) {",
2434
+ " const dsn = rawEnv.SENTRY_DSN?.trim();",
2435
+ "",
2436
+ " if (!dsn || isSentryInitialized) {",
2437
+ " return Boolean(dsn);",
2438
+ " }",
2439
+ "",
2440
+ " Sentry.init({",
2441
+ " dsn,",
2442
+ " enabled: true,",
2443
+ ' environment: rawEnv.SENTRY_ENVIRONMENT ?? rawEnv.NODE_ENV ?? "development",',
2444
+ " release: rawEnv.SENTRY_RELEASE,",
2445
+ " tracesSampleRate: parseTracesSampleRate(rawEnv.SENTRY_TRACES_SAMPLE_RATE),",
2446
+ " });",
2447
+ "",
2448
+ " isSentryInitialized = true;",
2449
+ " return true;",
2450
+ "}",
2451
+ "",
2452
+ "export function resetSentryForTests() {",
2453
+ " isSentryInitialized = false;",
2454
+ "}",
2455
+ "",
2456
+ ].join("\n");
2457
+ }
2458
+
2459
+ // ---------------------------------------------------------------------------
2460
+ // Module: Redis
2461
+ // ---------------------------------------------------------------------------
2462
+
2463
+ function buildRedisClient() {
2464
+ return [
2465
+ 'import type { RedisClient as RateLimitRedisClient } from "@hono-rate-limiter/redis";',
2466
+ 'import { z } from "zod";',
2467
+ "",
2468
+ 'const DEFAULT_REDIS_URL = "redis://localhost:6379";',
2469
+ "",
2470
+ "const redisEnvironmentSchema = z.object({",
2471
+ " REDIS_URL: z.string().trim().min(1).optional(),",
2472
+ "});",
2473
+ "",
2474
+ "type RedisRawEnv = Record<string, string | undefined>;",
2475
+ 'type BunRedisClient = import("bun").RedisClient;',
2476
+ 'type BunRedisConstructor = typeof import("bun").RedisClient;',
2477
+ "",
2478
+ "export interface RedisEnvironment {",
2479
+ " url: string;",
2480
+ "}",
2481
+ "",
2482
+ "let sharedRedisClient: BunRedisClient | null = null;",
2483
+ "let sharedRedisUrl: string | null = null;",
2484
+ "",
2485
+ "export function hasBunRedisClient() {",
2486
+ " const bun = globalThis as typeof globalThis & {",
2487
+ " Bun?: {",
2488
+ " RedisClient?: BunRedisConstructor;",
2489
+ " };",
2490
+ " };",
2491
+ "",
2492
+ ' return typeof bun.Bun?.RedisClient === "function";',
2493
+ "}",
2494
+ "",
2495
+ "function stringifyRedisArgument(value: unknown): string {",
2496
+ ' if (typeof value === "string") {',
2497
+ " return value;",
2498
+ " }",
2499
+ "",
2500
+ ' if (typeof value === "number" || typeof value === "bigint" || typeof value === "boolean") {',
2501
+ " return String(value);",
2502
+ " }",
2503
+ "",
2504
+ ' throw new TypeError("Redis command arguments must be strings, numbers, bigints, or booleans");',
2505
+ "}",
2506
+ "",
2507
+ "export function resolveRedisEnvironment(rawEnv: RedisRawEnv = process.env): RedisEnvironment {",
2508
+ " const parsedEnv = redisEnvironmentSchema.parse(rawEnv);",
2509
+ "",
2510
+ " return {",
2511
+ " url: parsedEnv.REDIS_URL ?? DEFAULT_REDIS_URL,",
2512
+ " };",
2513
+ "}",
2514
+ "",
2515
+ "export function createRedisClient(rawEnv: RedisRawEnv = process.env): BunRedisClient {",
2516
+ " const { url } = resolveRedisEnvironment(rawEnv);",
2517
+ " const bun = globalThis as typeof globalThis & {",
2518
+ " Bun?: {",
2519
+ " RedisClient?: BunRedisConstructor;",
2520
+ " };",
2521
+ " };",
2522
+ " const RedisClient = bun.Bun?.RedisClient;",
2523
+ "",
2524
+ " if (!RedisClient) {",
2525
+ ' throw new Error("Bun RedisClient is unavailable outside the Bun runtime");',
2526
+ " }",
2527
+ "",
2528
+ " return new RedisClient(url);",
2529
+ "}",
2530
+ "",
2531
+ "export function getRedisClient(rawEnv: RedisRawEnv = process.env): BunRedisClient {",
2532
+ " const { url } = resolveRedisEnvironment(rawEnv);",
2533
+ "",
2534
+ " if (!sharedRedisClient || sharedRedisUrl !== url) {",
2535
+ " sharedRedisClient?.close();",
2536
+ " sharedRedisClient = createRedisClient({",
2537
+ " REDIS_URL: url,",
2538
+ " });",
2539
+ " sharedRedisUrl = url;",
2540
+ " }",
2541
+ "",
2542
+ " return sharedRedisClient;",
2543
+ "}",
2544
+ "",
2545
+ "export function createRedisRateLimitClient(",
2546
+ " rawEnv: RedisRawEnv = process.env",
2547
+ "): RateLimitRedisClient {",
2548
+ " const client = getRedisClient(rawEnv);",
2549
+ "",
2550
+ " return {",
2551
+ " async scriptLoad(script: string) {",
2552
+ ' const result = await client.send("SCRIPT", ["LOAD", script]);',
2553
+ "",
2554
+ ' if (typeof result !== "string") {',
2555
+ ' throw new TypeError("Redis SCRIPT LOAD returned a non-string response");',
2556
+ " }",
2557
+ "",
2558
+ " return result;",
2559
+ " },",
2560
+ " async evalsha<TArgs extends unknown[], TData = unknown>(",
2561
+ " sha1: string,",
2562
+ " keys: string[],",
2563
+ " args: TArgs",
2564
+ " ) {",
2565
+ ' return client.send("EVALSHA", [',
2566
+ " sha1,",
2567
+ " keys.length.toString(),",
2568
+ " ...keys,",
2569
+ " ...args.map(stringifyRedisArgument),",
2570
+ " ]) as Promise<TData>;",
2571
+ " },",
2572
+ " decr(key: string) {",
2573
+ " return client.decr(key);",
2574
+ " },",
2575
+ " del(key: string) {",
2576
+ " return client.del(key);",
2577
+ " },",
2578
+ " };",
2579
+ "}",
2580
+ "",
2581
+ "export function resetRedisClientForTests() {",
2582
+ " sharedRedisClient?.close();",
2583
+ " sharedRedisClient = null;",
2584
+ " sharedRedisUrl = null;",
2585
+ "}",
2586
+ "",
2587
+ ].join("\n");
2588
+ }
2589
+
2590
+ function buildRateLimitMiddleware() {
2591
+ return [
2592
+ 'import { env } from "~/server/lib/env.ts";',
2593
+ 'import { getRedisClient } from "~/server/lib/redis.ts";',
2594
+ "",
2595
+ "type RateLimitConfig = {",
2596
+ " keyPrefix: string;",
2597
+ " windowMs: number;",
2598
+ " limit: number;",
2599
+ " keyGenerator: (request: Request) => string;",
2600
+ "};",
2601
+ "",
2602
+ "export function getClientIp(request: Request): string {",
2603
+ ' return request.headers.get("x-forwarded-for")?.split(",")[0]?.trim()',
2604
+ ' ?? request.headers.get("x-real-ip")',
2605
+ ' ?? "unknown";',
2606
+ "}",
2607
+ "",
2608
+ "export const publicRateLimitConfig: RateLimitConfig = {",
2609
+ ' keyPrefix: "public",',
2610
+ " windowMs: env.RATE_LIMIT_WINDOW_MS,",
2611
+ " limit: env.RATE_LIMIT_PUBLIC_LIMIT,",
2612
+ " keyGenerator: req => getClientIp(req),",
2613
+ "};",
2614
+ "",
2615
+ "export const authenticatedRateLimitConfig: RateLimitConfig = {",
2616
+ ' keyPrefix: "authenticated",',
2617
+ " windowMs: env.RATE_LIMIT_WINDOW_MS,",
2618
+ " limit: env.RATE_LIMIT_AUTHENTICATED_LIMIT,",
2619
+ ' keyGenerator: req => req.headers.get("x-user-id")?.trim() || getClientIp(req),',
2620
+ "};",
2621
+ "",
2622
+ "export const webhookRateLimitConfig: RateLimitConfig = {",
2623
+ ' keyPrefix: "webhook",',
2624
+ " windowMs: env.RATE_LIMIT_WINDOW_MS,",
2625
+ " limit: env.RATE_LIMIT_WEBHOOK_LIMIT,",
2626
+ ' keyGenerator: req => req.headers.get("stripe-signature")?.trim() || getClientIp(req),',
2627
+ "};",
2628
+ "",
2629
+ "export async function checkRateLimit(request: Request, config: RateLimitConfig) {",
2630
+ " const client = getRedisClient();",
2631
+ " const key = `rate-limit:${config.keyPrefix}:${config.keyGenerator(request)}`;",
2632
+ " const current = await client.incr(key);",
2633
+ "",
2634
+ " if (current === 1) {",
2635
+ " await client.pexpire(key, config.windowMs);",
2636
+ " }",
2637
+ "",
2638
+ " return {",
2639
+ " isAllowed: current <= config.limit,",
2640
+ " key,",
2641
+ " remaining: Math.max(config.limit - current, 0),",
2642
+ " resetAfterMs: config.windowMs,",
2643
+ " };",
2644
+ "}",
2645
+ "",
2646
+ ].join("\n");
2647
+ }
2648
+
2649
+ // ---------------------------------------------------------------------------
2650
+ // Module: Storybook
2651
+ // ---------------------------------------------------------------------------
2652
+
2653
+ function buildStorybookMain() {
2654
+ return [
2655
+ 'import type { StorybookConfig } from "@storybook/react-vite";',
2656
+ "",
2657
+ "const config: StorybookConfig = {",
2658
+ ' stories: ["../src/**/*.stories.@(ts|tsx)"],',
2659
+ " addons: [",
2660
+ ' "@storybook/addon-essentials",',
2661
+ ' "@storybook/addon-interactions",',
2662
+ " ],",
2663
+ " framework: {",
2664
+ ' name: "@storybook/react-vite",',
2665
+ " options: {},",
2666
+ " },",
2667
+ "};",
2668
+ "",
2669
+ "export default config;",
2670
+ "",
2671
+ ].join("\n");
2672
+ }
2673
+
2674
+ function buildStorybookPreview() {
2675
+ return [
2676
+ 'import "../src/styles.css";',
2677
+ "",
2678
+ "export const parameters = {",
2679
+ ' layout: "centered",',
2680
+ "};",
2681
+ "",
2682
+ ].join("\n");
2683
+ }