@punks/cli 0.1.16 → 1.0.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 (508) hide show
  1. package/AGENTS.md +10 -0
  2. package/README.md +64 -0
  3. package/dist/data/AGENTS.md +123 -0
  4. package/dist/data/catalog/lint.ts +349 -0
  5. package/dist/data/catalog/packs.ts +44 -0
  6. package/dist/data/catalog/skills.ts +47 -0
  7. package/dist/data/catalog/tools.ts +22 -0
  8. package/dist/data/hooks/format-edited-file.mjs +554 -0
  9. package/dist/data/hooks/format-edited-file.py +157 -0
  10. package/dist/data/hooks/format-edited-file.sh +37 -0
  11. package/dist/data/hooks/require-tests-for-pr.mjs +144 -0
  12. package/dist/data/scripts/sync-subagents.mjs +420 -0
  13. package/dist/data/subagents/manifest.mjs +253 -0
  14. package/dist/index.js +46415 -0
  15. package/dist/skills/agnostic/backend/backend-domain-structure/SKILL.md +50 -0
  16. package/dist/skills/agnostic/backend/backend-domain-structure/agents/openai.yaml +4 -0
  17. package/dist/skills/agnostic/backend/backend-domain-structure/references/layout.md +167 -0
  18. package/dist/skills/agnostic/backend/backend-recoverable-actions/SKILL.md +49 -0
  19. package/dist/skills/agnostic/backend/backend-recoverable-actions/agents/openai.yaml +4 -0
  20. package/dist/skills/agnostic/backend/backend-recoverable-actions/references/strategy-matrix.md +34 -0
  21. package/dist/skills/agnostic/backend/backend-recoverable-actions/references/test-matrix.md +34 -0
  22. package/dist/skills/agnostic/docs/docs-maintenance/SKILL.md +193 -0
  23. package/dist/skills/agnostic/docs/docs-maintenance/agents/openai.yaml +4 -0
  24. package/dist/skills/agnostic/docs/docs-maintenance/references/concept-pages.md +48 -0
  25. package/dist/skills/agnostic/docs/docs-maintenance/references/flow-pages.md +41 -0
  26. package/dist/skills/agnostic/frontend/agent-browser/.clawdhub/origin.json +7 -0
  27. package/dist/skills/agnostic/frontend/agent-browser/SKILL.md +229 -0
  28. package/dist/skills/agnostic/frontend/agent-browser/references/authentication.md +202 -0
  29. package/dist/skills/agnostic/frontend/agent-browser/references/commands.md +259 -0
  30. package/dist/skills/agnostic/frontend/agent-browser/references/proxy-support.md +188 -0
  31. package/dist/skills/agnostic/frontend/agent-browser/references/session-management.md +193 -0
  32. package/dist/skills/agnostic/frontend/agent-browser/references/snapshot-refs.md +194 -0
  33. package/dist/skills/agnostic/frontend/agent-browser/references/video-recording.md +173 -0
  34. package/dist/skills/agnostic/frontend/agent-browser/templates/authenticated-session.sh +97 -0
  35. package/dist/skills/agnostic/frontend/agent-browser/templates/capture-workflow.sh +69 -0
  36. package/dist/skills/agnostic/frontend/agent-browser/templates/form-automation.sh +62 -0
  37. package/dist/skills/agnostic/frontend/design-taste-frontend/SKILL.md +226 -0
  38. package/dist/skills/agnostic/frontend/frontend-domain-structure/SKILL.md +55 -0
  39. package/dist/skills/agnostic/frontend/frontend-domain-structure/agents/openai.yaml +4 -0
  40. package/dist/skills/agnostic/frontend/frontend-domain-structure/references/react/structure.md +102 -0
  41. package/dist/skills/agnostic/frontend/frontend-domain-structure/references/structure.md +257 -0
  42. package/dist/skills/agnostic/frontend/gpt-taste/SKILL.md +74 -0
  43. package/dist/skills/agnostic/frontend/image-taste-frontend/SKILL.md +1102 -0
  44. package/dist/skills/agnostic/frontend/redesign-existing-projects/SKILL.md +178 -0
  45. package/dist/skills/agnostic/planning/create-plan/REFERENCE.md +37 -0
  46. package/dist/skills/agnostic/planning/create-plan/SKILL.md +69 -0
  47. package/dist/skills/agnostic/planning/create-plan/references/backlog-sync.md +44 -0
  48. package/dist/skills/agnostic/planning/create-plan/references/grill-phase.md +86 -0
  49. package/dist/skills/agnostic/planning/create-plan/references/plan-schema.md +66 -0
  50. package/dist/skills/agnostic/planning/create-plan/references/planner-phase.md +39 -0
  51. package/dist/skills/agnostic/planning/create-plan/references/stop-conditions.md +18 -0
  52. package/dist/skills/agnostic/planning/create-plan/references/tdd-phase.md +26 -0
  53. package/dist/skills/agnostic/planning/create-spec/SKILL.md +57 -0
  54. package/dist/skills/agnostic/planning/create-spec/assets/SPEC-TEMPLATE.md +91 -0
  55. package/dist/skills/agnostic/planning/create-spec/references/discovery.md +44 -0
  56. package/dist/skills/agnostic/planning/create-spec/references/folder-naming.md +27 -0
  57. package/dist/skills/agnostic/planning/create-spec/references/handoff.md +47 -0
  58. package/dist/skills/agnostic/planning/create-spec/references/questioning.md +41 -0
  59. package/dist/skills/agnostic/planning/create-spec/references/spec-quality-bar.md +58 -0
  60. package/dist/skills/agnostic/planning/create-spec/references/wiki-bookkeeping.md +26 -0
  61. package/dist/skills/agnostic/planning/grill-me/SKILL.md +28 -0
  62. package/dist/skills/agnostic/planning/implement-spec/SKILL.md +72 -0
  63. package/dist/skills/agnostic/planning/implement-spec/assets/IMPLEMENTATION-NOTES-TEMPLATE.md +47 -0
  64. package/dist/skills/agnostic/planning/implement-spec/references/lifecycle.md +149 -0
  65. package/dist/skills/agnostic/planning/implement-spec/references/parallel-orchestration.md +102 -0
  66. package/dist/skills/agnostic/planning/implement-spec/references/parallel-worker-brief.md +65 -0
  67. package/dist/skills/agnostic/planning/implement-spec/references/parallel.md +56 -0
  68. package/dist/skills/agnostic/planning/implement-spec/references/sequential.md +28 -0
  69. package/dist/skills/agnostic/planning/swarm-planner/SKILL.md +179 -0
  70. package/dist/skills/agnostic/quality/simplify/SKILL.md +14 -0
  71. package/dist/skills/agnostic/quality/tdd/SKILL.md +107 -0
  72. package/dist/skills/agnostic/quality/tdd/deep-modules.md +33 -0
  73. package/dist/skills/agnostic/quality/tdd/interface-design.md +31 -0
  74. package/dist/skills/agnostic/quality/tdd/mocking.md +59 -0
  75. package/dist/skills/agnostic/quality/tdd/refactoring.md +10 -0
  76. package/dist/skills/agnostic/quality/tdd/tests.md +61 -0
  77. package/dist/skills/agnostic/requirements/requirements-grill/SKILL.md +42 -0
  78. package/dist/skills/agnostic/requirements/requirements-grill/references/artifact-output.md +73 -0
  79. package/dist/skills/agnostic/requirements/requirements-grill/references/grilling-flow.md +57 -0
  80. package/dist/skills/agnostic/requirements/requirements-grill/references/wiki-output.md +94 -0
  81. package/dist/skills/agnostic/requirements/write-backlog/EXAMPLES.md +67 -0
  82. package/dist/skills/agnostic/requirements/write-backlog/REFERENCE.md +253 -0
  83. package/dist/skills/agnostic/requirements/write-backlog/SKILL.md +68 -0
  84. package/dist/skills/agnostic/requirements/write-backlog/assets/concepts/backlog-model.md +69 -0
  85. package/dist/skills/agnostic/requirements/write-backlog/assets/concepts/story-shape.md +66 -0
  86. package/dist/skills/agnostic/requirements/write-backlog/assets/providers/azure-devops-create-payload.md +63 -0
  87. package/dist/skills/agnostic/requirements/write-backlog/assets/providers/github-issues-create-payload.md +48 -0
  88. package/dist/skills/agnostic/requirements/write-backlog/assets/providers/linear-create-payload.md +76 -0
  89. package/dist/skills/agnostic/research/improve-codebase-architecture/REFERENCE.md +78 -0
  90. package/dist/skills/agnostic/research/improve-codebase-architecture/SKILL.md +76 -0
  91. package/dist/skills/agnostic/research/parallel-research/SKILL.md +68 -0
  92. package/dist/skills/agnostic/research/parallel-research/agents/openai.yaml +4 -0
  93. package/dist/skills/agnostic/subagents/swarm-planner/SKILL.md +179 -0
  94. package/dist/skills/agnostic/write-a-skill/SKILL.md +117 -0
  95. package/dist/skills/frameworks/better-auth/better-auth-best-practices/SKILL.md +166 -0
  96. package/dist/skills/frameworks/better-auth/better-auth-security-best-practices/SKILL.MD +432 -0
  97. package/dist/skills/frameworks/effect/effect-authoring/SKILL.md +116 -0
  98. package/dist/skills/frameworks/effect/effect-authoring/references/branded-types.md +98 -0
  99. package/dist/skills/frameworks/effect/effect-authoring/references/effect-atom-patterns.md +257 -0
  100. package/dist/skills/frameworks/effect/effect-authoring/references/effect-primitives.md +144 -0
  101. package/dist/skills/frameworks/effect/effect-authoring/references/error-patterns.md +156 -0
  102. package/dist/skills/frameworks/effect/effect-authoring/references/otel-patterns.md +113 -0
  103. package/dist/skills/frameworks/effect/effect-authoring/references/test-patterns.md +146 -0
  104. package/dist/skills/frameworks/effect/effect-backend-structure/SKILL.md +96 -0
  105. package/dist/skills/frameworks/effect/effect-backend-structure/agents/openai.yaml +4 -0
  106. package/dist/skills/frameworks/effect/effect-backend-structure/references/layout.md +68 -0
  107. package/dist/skills/frameworks/effect/effect-best-practices/SKILL.md +517 -0
  108. package/dist/skills/frameworks/effect/effect-best-practices/references/anti-patterns.md +392 -0
  109. package/dist/skills/frameworks/effect/effect-best-practices/references/effect-atom-patterns.md +653 -0
  110. package/dist/skills/frameworks/effect/effect-best-practices/references/error-patterns.md +464 -0
  111. package/dist/skills/frameworks/effect/effect-best-practices/references/language-server.md +287 -0
  112. package/dist/skills/frameworks/effect/effect-best-practices/references/layer-patterns.md +495 -0
  113. package/dist/skills/frameworks/effect/effect-best-practices/references/observability-patterns.md +342 -0
  114. package/dist/skills/frameworks/effect/effect-best-practices/references/rpc-cluster-patterns.md +418 -0
  115. package/dist/skills/frameworks/effect/effect-best-practices/references/schema-patterns.md +353 -0
  116. package/dist/skills/frameworks/effect/effect-best-practices/references/service-patterns.md +299 -0
  117. package/dist/skills/frameworks/effect/effect-recoverable-actions/SKILL.md +65 -0
  118. package/dist/skills/frameworks/effect/effect-recoverable-actions/agents/openai.yaml +4 -0
  119. package/dist/skills/frameworks/effect/effect-recoverable-actions/references/flow-examples.md +154 -0
  120. package/dist/skills/frameworks/effect/effect-recoverable-actions/references/source-backed-primitives.md +104 -0
  121. package/dist/skills/frameworks/effect/effect-recoverable-actions/references/strategy-matrix.md +34 -0
  122. package/dist/skills/frameworks/effect/effect-recoverable-actions/references/test-matrix.md +36 -0
  123. package/dist/skills/frameworks/elysia/elysiajs/SKILL.md +475 -0
  124. package/dist/skills/frameworks/elysia/elysiajs/examples/basic.ts +9 -0
  125. package/dist/skills/frameworks/elysia/elysiajs/examples/body-parser.ts +33 -0
  126. package/dist/skills/frameworks/elysia/elysiajs/examples/complex.ts +112 -0
  127. package/dist/skills/frameworks/elysia/elysiajs/examples/cookie.ts +45 -0
  128. package/dist/skills/frameworks/elysia/elysiajs/examples/error.ts +38 -0
  129. package/dist/skills/frameworks/elysia/elysiajs/examples/file.ts +10 -0
  130. package/dist/skills/frameworks/elysia/elysiajs/examples/guard.ts +34 -0
  131. package/dist/skills/frameworks/elysia/elysiajs/examples/map-response.ts +15 -0
  132. package/dist/skills/frameworks/elysia/elysiajs/examples/redirect.ts +6 -0
  133. package/dist/skills/frameworks/elysia/elysiajs/examples/rename.ts +32 -0
  134. package/dist/skills/frameworks/elysia/elysiajs/examples/schema.ts +61 -0
  135. package/dist/skills/frameworks/elysia/elysiajs/examples/state.ts +6 -0
  136. package/dist/skills/frameworks/elysia/elysiajs/examples/upload-file.ts +20 -0
  137. package/dist/skills/frameworks/elysia/elysiajs/examples/websocket.ts +25 -0
  138. package/dist/skills/frameworks/elysia/elysiajs/integrations/ai-sdk.md +92 -0
  139. package/dist/skills/frameworks/elysia/elysiajs/integrations/astro.md +59 -0
  140. package/dist/skills/frameworks/elysia/elysiajs/integrations/better-auth.md +117 -0
  141. package/dist/skills/frameworks/elysia/elysiajs/integrations/cloudflare-worker.md +95 -0
  142. package/dist/skills/frameworks/elysia/elysiajs/integrations/deno.md +34 -0
  143. package/dist/skills/frameworks/elysia/elysiajs/integrations/drizzle.md +258 -0
  144. package/dist/skills/frameworks/elysia/elysiajs/integrations/expo.md +95 -0
  145. package/dist/skills/frameworks/elysia/elysiajs/integrations/nextjs.md +103 -0
  146. package/dist/skills/frameworks/elysia/elysiajs/integrations/nodejs.md +64 -0
  147. package/dist/skills/frameworks/elysia/elysiajs/integrations/nuxt.md +67 -0
  148. package/dist/skills/frameworks/elysia/elysiajs/integrations/prisma.md +93 -0
  149. package/dist/skills/frameworks/elysia/elysiajs/integrations/react-email.md +134 -0
  150. package/dist/skills/frameworks/elysia/elysiajs/integrations/sveltekit.md +53 -0
  151. package/dist/skills/frameworks/elysia/elysiajs/integrations/tanstack-start.md +87 -0
  152. package/dist/skills/frameworks/elysia/elysiajs/integrations/vercel.md +55 -0
  153. package/dist/skills/frameworks/elysia/elysiajs/patterns/mvc.md +380 -0
  154. package/dist/skills/frameworks/elysia/elysiajs/plugins/bearer.md +30 -0
  155. package/dist/skills/frameworks/elysia/elysiajs/plugins/cors.md +141 -0
  156. package/dist/skills/frameworks/elysia/elysiajs/plugins/cron.md +265 -0
  157. package/dist/skills/frameworks/elysia/elysiajs/plugins/graphql-apollo.md +90 -0
  158. package/dist/skills/frameworks/elysia/elysiajs/plugins/graphql-yoga.md +87 -0
  159. package/dist/skills/frameworks/elysia/elysiajs/plugins/html.md +188 -0
  160. package/dist/skills/frameworks/elysia/elysiajs/plugins/jwt.md +197 -0
  161. package/dist/skills/frameworks/elysia/elysiajs/plugins/openapi.md +246 -0
  162. package/dist/skills/frameworks/elysia/elysiajs/plugins/opentelemetry.md +167 -0
  163. package/dist/skills/frameworks/elysia/elysiajs/plugins/server-timing.md +71 -0
  164. package/dist/skills/frameworks/elysia/elysiajs/plugins/static.md +84 -0
  165. package/dist/skills/frameworks/elysia/elysiajs/references/bun-fullstack-dev-server.md +129 -0
  166. package/dist/skills/frameworks/elysia/elysiajs/references/cookie.md +187 -0
  167. package/dist/skills/frameworks/elysia/elysiajs/references/deployment.md +413 -0
  168. package/dist/skills/frameworks/elysia/elysiajs/references/eden.md +158 -0
  169. package/dist/skills/frameworks/elysia/elysiajs/references/lifecycle.md +198 -0
  170. package/dist/skills/frameworks/elysia/elysiajs/references/macro.md +83 -0
  171. package/dist/skills/frameworks/elysia/elysiajs/references/plugin.md +207 -0
  172. package/dist/skills/frameworks/elysia/elysiajs/references/route.md +331 -0
  173. package/dist/skills/frameworks/elysia/elysiajs/references/testing.md +385 -0
  174. package/dist/skills/frameworks/elysia/elysiajs/references/validation.md +491 -0
  175. package/dist/skills/frameworks/elysia/elysiajs/references/websocket.md +250 -0
  176. package/dist/skills/frameworks/nestjs/nestjs-best-practices/.github/workflows/branch-protection.yml +24 -0
  177. package/dist/skills/frameworks/nestjs/nestjs-best-practices/.github/workflows/deploy.yml +61 -0
  178. package/dist/skills/frameworks/nestjs/nestjs-best-practices/AGENTS.md +5958 -0
  179. package/dist/skills/frameworks/nestjs/nestjs-best-practices/SKILL.md +130 -0
  180. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/api-use-dto-serialization.md +182 -0
  181. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/api-use-interceptors.md +202 -0
  182. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/api-use-pipes.md +205 -0
  183. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/api-versioning.md +191 -0
  184. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/arch-avoid-circular-deps.md +80 -0
  185. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/arch-feature-modules.md +82 -0
  186. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/arch-module-sharing.md +141 -0
  187. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/arch-single-responsibility.md +106 -0
  188. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/arch-use-events.md +108 -0
  189. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/arch-use-repository-pattern.md +97 -0
  190. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/db-avoid-n-plus-one.md +139 -0
  191. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/db-use-migrations.md +129 -0
  192. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/db-use-transactions.md +140 -0
  193. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/devops-graceful-shutdown.md +222 -0
  194. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/devops-use-config-module.md +167 -0
  195. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/devops-use-logging.md +232 -0
  196. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/di-avoid-service-locator.md +104 -0
  197. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/di-interface-segregation.md +165 -0
  198. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/di-liskov-substitution.md +221 -0
  199. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/di-prefer-constructor-injection.md +86 -0
  200. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/di-scope-awareness.md +94 -0
  201. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/di-use-interfaces-tokens.md +101 -0
  202. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/error-handle-async-errors.md +125 -0
  203. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/error-throw-http-exceptions.md +114 -0
  204. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/error-use-exception-filters.md +140 -0
  205. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/micro-use-health-checks.md +226 -0
  206. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/micro-use-patterns.md +167 -0
  207. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/micro-use-queues.md +252 -0
  208. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/perf-async-hooks.md +109 -0
  209. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/perf-lazy-loading.md +121 -0
  210. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/perf-optimize-database.md +131 -0
  211. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/perf-use-caching.md +128 -0
  212. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/security-auth-jwt.md +146 -0
  213. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/security-rate-limiting.md +125 -0
  214. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/security-sanitize-output.md +139 -0
  215. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/security-use-guards.md +135 -0
  216. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/security-validate-all-input.md +150 -0
  217. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/test-e2e-supertest.md +178 -0
  218. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/test-mock-external-services.md +179 -0
  219. package/dist/skills/frameworks/nestjs/nestjs-best-practices/rules/test-use-testing-module.md +153 -0
  220. package/dist/skills/frameworks/nestjs/nestjs-best-practices/scripts/build-agents.ts +299 -0
  221. package/dist/skills/frameworks/nestjs/nestjs-best-practices/scripts/build.sh +16 -0
  222. package/dist/skills/frameworks/nestjs/nestjs-best-practices/scripts/package-lock.json +237 -0
  223. package/dist/skills/frameworks/nestjs/nestjs-best-practices/scripts/package.json +15 -0
  224. package/dist/skills/frameworks/nestjs/nestjs-expert/SKILL.md +208 -0
  225. package/dist/skills/frameworks/nestjs/nestjs-expert/references/authentication.md +166 -0
  226. package/dist/skills/frameworks/nestjs/nestjs-expert/references/controllers-routing.md +111 -0
  227. package/dist/skills/frameworks/nestjs/nestjs-expert/references/dtos-validation.md +153 -0
  228. package/dist/skills/frameworks/nestjs/nestjs-expert/references/migration-from-express.md +1237 -0
  229. package/dist/skills/frameworks/nestjs/nestjs-expert/references/services-di.md +140 -0
  230. package/dist/skills/frameworks/nestjs/nestjs-expert/references/testing-patterns.md +186 -0
  231. package/dist/skills/frameworks/nextjs/next-best-practices/SKILL.md +153 -0
  232. package/dist/skills/frameworks/nextjs/next-best-practices/async-patterns.md +87 -0
  233. package/dist/skills/frameworks/nextjs/next-best-practices/bundling.md +180 -0
  234. package/dist/skills/frameworks/nextjs/next-best-practices/data-patterns.md +297 -0
  235. package/dist/skills/frameworks/nextjs/next-best-practices/debug-tricks.md +105 -0
  236. package/dist/skills/frameworks/nextjs/next-best-practices/directives.md +73 -0
  237. package/dist/skills/frameworks/nextjs/next-best-practices/error-handling.md +227 -0
  238. package/dist/skills/frameworks/nextjs/next-best-practices/file-conventions.md +140 -0
  239. package/dist/skills/frameworks/nextjs/next-best-practices/font.md +245 -0
  240. package/dist/skills/frameworks/nextjs/next-best-practices/functions.md +108 -0
  241. package/dist/skills/frameworks/nextjs/next-best-practices/hydration-error.md +91 -0
  242. package/dist/skills/frameworks/nextjs/next-best-practices/image.md +173 -0
  243. package/dist/skills/frameworks/nextjs/next-best-practices/metadata.md +301 -0
  244. package/dist/skills/frameworks/nextjs/next-best-practices/parallel-routes.md +287 -0
  245. package/dist/skills/frameworks/nextjs/next-best-practices/route-handlers.md +146 -0
  246. package/dist/skills/frameworks/nextjs/next-best-practices/rsc-boundaries.md +159 -0
  247. package/dist/skills/frameworks/nextjs/next-best-practices/runtime-selection.md +39 -0
  248. package/dist/skills/frameworks/nextjs/next-best-practices/scripts.md +141 -0
  249. package/dist/skills/frameworks/nextjs/next-best-practices/self-hosting.md +371 -0
  250. package/dist/skills/frameworks/nextjs/next-best-practices/suspense-boundaries.md +67 -0
  251. package/dist/skills/frameworks/nextjs/next-cache-components/SKILL.md +360 -0
  252. package/dist/skills/frameworks/react/async-react-patterns/SKILL.md +78 -0
  253. package/dist/skills/frameworks/react/vercel-composition-patterns/AGENTS.md +946 -0
  254. package/dist/skills/frameworks/react/vercel-composition-patterns/SKILL.md +89 -0
  255. package/dist/skills/frameworks/react/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  256. package/dist/skills/frameworks/react/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  257. package/dist/skills/frameworks/react/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  258. package/dist/skills/frameworks/react/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  259. package/dist/skills/frameworks/react/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  260. package/dist/skills/frameworks/react/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  261. package/dist/skills/frameworks/react/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  262. package/dist/skills/frameworks/react/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  263. package/dist/skills/frameworks/react/vercel-react-best-practices/AGENTS.md +3750 -0
  264. package/dist/skills/frameworks/react/vercel-react-best-practices/SKILL.md +148 -0
  265. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
  266. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  267. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  268. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  269. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  270. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  271. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/async-defer-await.md +82 -0
  272. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  273. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/async-parallel.md +28 -0
  274. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  275. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
  276. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  277. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  278. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  279. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  280. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  281. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  282. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  283. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  284. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  285. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  286. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  287. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  288. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  289. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  290. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  291. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  292. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  293. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  294. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  295. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
  296. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  297. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  298. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  299. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  300. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  301. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  302. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  303. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  304. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  305. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  306. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  307. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  308. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  309. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  310. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  311. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  312. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  313. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  314. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  315. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  316. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  317. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  318. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  319. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  320. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  321. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  322. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  323. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  324. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  325. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  326. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  327. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  328. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  329. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
  330. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
  331. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  332. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  333. package/dist/skills/frameworks/react/vercel-react-best-practices/rules/server-serialization.md +38 -0
  334. package/dist/skills/frameworks/tanstack-query/tanstack-query/.claude-plugin/plugin.json +12 -0
  335. package/dist/skills/frameworks/tanstack-query/tanstack-query/SKILL.md +1058 -0
  336. package/dist/skills/frameworks/tanstack-query/tanstack-query/assets/example-template.txt +14 -0
  337. package/dist/skills/frameworks/tanstack-query/tanstack-query/references/best-practices.md +304 -0
  338. package/dist/skills/frameworks/tanstack-query/tanstack-query/references/common-patterns.md +271 -0
  339. package/dist/skills/frameworks/tanstack-query/tanstack-query/references/example-reference.md +26 -0
  340. package/dist/skills/frameworks/tanstack-query/tanstack-query/references/testing.md +282 -0
  341. package/dist/skills/frameworks/tanstack-query/tanstack-query/references/top-errors.md +332 -0
  342. package/dist/skills/frameworks/tanstack-query/tanstack-query/references/typescript-patterns.md +291 -0
  343. package/dist/skills/frameworks/tanstack-query/tanstack-query/references/v4-to-v5-migration.md +231 -0
  344. package/dist/skills/frameworks/tanstack-query/tanstack-query/rules/tanstack-query.md +126 -0
  345. package/dist/skills/frameworks/tanstack-query/tanstack-query/scripts/example-script.sh +15 -0
  346. package/dist/skills/frameworks/tanstack-query/tanstack-query/templates/custom-hooks-pattern.tsx +281 -0
  347. package/dist/skills/frameworks/tanstack-query/tanstack-query/templates/devtools-setup.tsx +248 -0
  348. package/dist/skills/frameworks/tanstack-query/tanstack-query/templates/error-boundary.tsx +243 -0
  349. package/dist/skills/frameworks/tanstack-query/tanstack-query/templates/package.json +31 -0
  350. package/dist/skills/frameworks/tanstack-query/tanstack-query/templates/provider-setup.tsx +50 -0
  351. package/dist/skills/frameworks/tanstack-query/tanstack-query/templates/query-client-config.ts +72 -0
  352. package/dist/skills/frameworks/tanstack-query/tanstack-query/templates/use-infinite-query.tsx +214 -0
  353. package/dist/skills/frameworks/tanstack-query/tanstack-query/templates/use-mutation-basic.tsx +201 -0
  354. package/dist/skills/frameworks/tanstack-query/tanstack-query/templates/use-mutation-optimistic.tsx +234 -0
  355. package/dist/skills/frameworks/tanstack-query/tanstack-query/templates/use-query-basic.tsx +119 -0
  356. package/dist/skills/frameworks/trpc/tanstack-query/.claude-plugin/plugin.json +12 -0
  357. package/dist/skills/frameworks/trpc/tanstack-query/SKILL.md +1058 -0
  358. package/dist/skills/frameworks/trpc/tanstack-query/assets/example-template.txt +14 -0
  359. package/dist/skills/frameworks/trpc/tanstack-query/references/best-practices.md +304 -0
  360. package/dist/skills/frameworks/trpc/tanstack-query/references/common-patterns.md +271 -0
  361. package/dist/skills/frameworks/trpc/tanstack-query/references/example-reference.md +26 -0
  362. package/dist/skills/frameworks/trpc/tanstack-query/references/testing.md +282 -0
  363. package/dist/skills/frameworks/trpc/tanstack-query/references/top-errors.md +332 -0
  364. package/dist/skills/frameworks/trpc/tanstack-query/references/typescript-patterns.md +291 -0
  365. package/dist/skills/frameworks/trpc/tanstack-query/references/v4-to-v5-migration.md +231 -0
  366. package/dist/skills/frameworks/trpc/tanstack-query/rules/tanstack-query.md +126 -0
  367. package/dist/skills/frameworks/trpc/tanstack-query/scripts/example-script.sh +15 -0
  368. package/dist/skills/frameworks/trpc/tanstack-query/templates/custom-hooks-pattern.tsx +281 -0
  369. package/dist/skills/frameworks/trpc/tanstack-query/templates/devtools-setup.tsx +248 -0
  370. package/dist/skills/frameworks/trpc/tanstack-query/templates/error-boundary.tsx +243 -0
  371. package/dist/skills/frameworks/trpc/tanstack-query/templates/package.json +31 -0
  372. package/dist/skills/frameworks/trpc/tanstack-query/templates/provider-setup.tsx +50 -0
  373. package/dist/skills/frameworks/trpc/tanstack-query/templates/query-client-config.ts +72 -0
  374. package/dist/skills/frameworks/trpc/tanstack-query/templates/use-infinite-query.tsx +214 -0
  375. package/dist/skills/frameworks/trpc/tanstack-query/templates/use-mutation-basic.tsx +201 -0
  376. package/dist/skills/frameworks/trpc/tanstack-query/templates/use-mutation-optimistic.tsx +234 -0
  377. package/dist/skills/frameworks/trpc/tanstack-query/templates/use-query-basic.tsx +119 -0
  378. package/dist/skills/frameworks/turborepo/turborepo/SKILL.md +914 -0
  379. package/dist/skills/frameworks/turborepo/turborepo/command/turborepo.md +70 -0
  380. package/dist/skills/frameworks/turborepo/turborepo/references/best-practices/RULE.md +241 -0
  381. package/dist/skills/frameworks/turborepo/turborepo/references/best-practices/dependencies.md +246 -0
  382. package/dist/skills/frameworks/turborepo/turborepo/references/best-practices/packages.md +335 -0
  383. package/dist/skills/frameworks/turborepo/turborepo/references/best-practices/structure.md +270 -0
  384. package/dist/skills/frameworks/turborepo/turborepo/references/boundaries/RULE.md +126 -0
  385. package/dist/skills/frameworks/turborepo/turborepo/references/caching/RULE.md +107 -0
  386. package/dist/skills/frameworks/turborepo/turborepo/references/caching/gotchas.md +169 -0
  387. package/dist/skills/frameworks/turborepo/turborepo/references/caching/remote-cache.md +127 -0
  388. package/dist/skills/frameworks/turborepo/turborepo/references/ci/RULE.md +79 -0
  389. package/dist/skills/frameworks/turborepo/turborepo/references/ci/github-actions.md +162 -0
  390. package/dist/skills/frameworks/turborepo/turborepo/references/ci/patterns.md +145 -0
  391. package/dist/skills/frameworks/turborepo/turborepo/references/ci/vercel.md +103 -0
  392. package/dist/skills/frameworks/turborepo/turborepo/references/cli/RULE.md +100 -0
  393. package/dist/skills/frameworks/turborepo/turborepo/references/cli/commands.md +297 -0
  394. package/dist/skills/frameworks/turborepo/turborepo/references/configuration/RULE.md +211 -0
  395. package/dist/skills/frameworks/turborepo/turborepo/references/configuration/global-options.md +187 -0
  396. package/dist/skills/frameworks/turborepo/turborepo/references/configuration/gotchas.md +348 -0
  397. package/dist/skills/frameworks/turborepo/turborepo/references/configuration/tasks.md +285 -0
  398. package/dist/skills/frameworks/turborepo/turborepo/references/environment/RULE.md +96 -0
  399. package/dist/skills/frameworks/turborepo/turborepo/references/environment/gotchas.md +141 -0
  400. package/dist/skills/frameworks/turborepo/turborepo/references/environment/modes.md +101 -0
  401. package/dist/skills/frameworks/turborepo/turborepo/references/filtering/RULE.md +148 -0
  402. package/dist/skills/frameworks/turborepo/turborepo/references/filtering/patterns.md +152 -0
  403. package/dist/skills/frameworks/turborepo/turborepo/references/watch/RULE.md +99 -0
  404. package/dist/tsconfig.tsbuildinfo +1 -0
  405. package/docs/README.md +20 -0
  406. package/docs/reference/dp-requirements.md +210 -0
  407. package/docs/runbooks/dp-cli-scaffolding.md +187 -0
  408. package/package.json +24 -50
  409. package/.eslintignore +0 -4
  410. package/.eslintrc +0 -127
  411. package/.prettierignore +0 -4
  412. package/.prettierrc +0 -7
  413. package/bin/abstractions/builder.d.ts +0 -4
  414. package/bin/abstractions/builder.js +0 -7
  415. package/bin/builders/dotnet/base.d.ts +0 -18
  416. package/bin/builders/dotnet/base.js +0 -47
  417. package/bin/builders/dotnet/entity-configuration/index.d.ts +0 -8
  418. package/bin/builders/dotnet/entity-configuration/index.js +0 -29
  419. package/bin/builders/dotnet/entity-converter/index.d.ts +0 -8
  420. package/bin/builders/dotnet/entity-converter/index.js +0 -29
  421. package/bin/builders/dotnet/entity-model-create/index.d.ts +0 -8
  422. package/bin/builders/dotnet/entity-model-create/index.js +0 -29
  423. package/bin/builders/dotnet/entity-model-dto/index.d.ts +0 -8
  424. package/bin/builders/dotnet/entity-model-dto/index.js +0 -29
  425. package/bin/builders/dotnet/entity-model-list-item-dto/index.d.ts +0 -8
  426. package/bin/builders/dotnet/entity-model-list-item-dto/index.js +0 -29
  427. package/bin/builders/dotnet/entity-model-update/index.d.ts +0 -8
  428. package/bin/builders/dotnet/entity-model-update/index.js +0 -29
  429. package/bin/builders/dotnet/entity-search-parameters/index.d.ts +0 -8
  430. package/bin/builders/dotnet/entity-search-parameters/index.js +0 -29
  431. package/bin/builders/dotnet/entity-search-query-builder/index.d.ts +0 -8
  432. package/bin/builders/dotnet/entity-search-query-builder/index.js +0 -29
  433. package/bin/builders/dotnet/firestore-connector/index.d.ts +0 -8
  434. package/bin/builders/dotnet/firestore-connector/index.js +0 -29
  435. package/bin/builders/dotnet/firestore-mapper/index.d.ts +0 -8
  436. package/bin/builders/dotnet/firestore-mapper/index.js +0 -29
  437. package/bin/builders/dotnet/types.d.ts +0 -10
  438. package/bin/builders/dotnet/types.js +0 -3
  439. package/bin/commands/entity-add/__test__/dotnet/common.d.ts +0 -2
  440. package/bin/commands/entity-add/__test__/dotnet/common.js +0 -11
  441. package/bin/commands/entity-add/__test__/dotnet/render.configuration.spec.d.ts +0 -1
  442. package/bin/commands/entity-add/__test__/dotnet/render.configuration.spec.js +0 -22
  443. package/bin/commands/entity-add/__test__/dotnet/render.converter.spec.d.ts +0 -1
  444. package/bin/commands/entity-add/__test__/dotnet/render.converter.spec.js +0 -22
  445. package/bin/commands/entity-add/__test__/dotnet/render.firestore-connector.spec.d.ts +0 -1
  446. package/bin/commands/entity-add/__test__/dotnet/render.firestore-connector.spec.js +0 -22
  447. package/bin/commands/entity-add/__test__/dotnet/render.firestore-mapper.spec.d.ts +0 -1
  448. package/bin/commands/entity-add/__test__/dotnet/render.firestore-mapper.spec.js +0 -22
  449. package/bin/commands/entity-add/__test__/dotnet/render.model-create.spec.d.ts +0 -1
  450. package/bin/commands/entity-add/__test__/dotnet/render.model-create.spec.js +0 -22
  451. package/bin/commands/entity-add/__test__/dotnet/render.model-dto.spec.d.ts +0 -1
  452. package/bin/commands/entity-add/__test__/dotnet/render.model-dto.spec.js +0 -22
  453. package/bin/commands/entity-add/__test__/dotnet/render.model-list-item-dto.spec.d.ts +0 -1
  454. package/bin/commands/entity-add/__test__/dotnet/render.model-list-item-dto.spec.js +0 -22
  455. package/bin/commands/entity-add/__test__/dotnet/render.model-update.spec.d.ts +0 -1
  456. package/bin/commands/entity-add/__test__/dotnet/render.model-update.spec.js +0 -22
  457. package/bin/commands/entity-add/__test__/dotnet/render.search-parameters.spec.d.ts +0 -1
  458. package/bin/commands/entity-add/__test__/dotnet/render.search-parameters.spec.js +0 -22
  459. package/bin/commands/entity-add/__test__/dotnet/render.search-query.spec.d.ts +0 -1
  460. package/bin/commands/entity-add/__test__/dotnet/render.search-query.spec.js +0 -22
  461. package/bin/commands/entity-add/index.d.ts +0 -26
  462. package/bin/commands/entity-add/index.js +0 -44
  463. package/bin/logging/index.d.ts +0 -8
  464. package/bin/logging/index.js +0 -28
  465. package/bin/providers/rendering/base.d.ts +0 -3
  466. package/bin/providers/rendering/base.js +0 -7
  467. package/bin/providers/rendering/factory.d.ts +0 -5
  468. package/bin/providers/rendering/factory.js +0 -16
  469. package/bin/providers/rendering/handlebars.d.ts +0 -4
  470. package/bin/providers/rendering/handlebars.js +0 -16
  471. package/bin/renderer/index.d.ts +0 -6
  472. package/bin/renderer/index.js +0 -27
  473. package/bin/run.d.ts +0 -2
  474. package/bin/run.js +0 -70
  475. package/bin/services/folders.d.ts +0 -1
  476. package/bin/services/folders.js +0 -31
  477. package/bin/types/commands.d.ts +0 -5
  478. package/bin/types/commands.js +0 -3
  479. package/bin/utils/collections.d.ts +0 -1
  480. package/bin/utils/collections.js +0 -6
  481. package/bin/utils/files.d.ts +0 -3
  482. package/bin/utils/files.js +0 -19
  483. package/bin/utils/strings.d.ts +0 -4
  484. package/bin/utils/strings.js +0 -22
  485. package/bin/utils/text.d.ts +0 -1
  486. package/bin/utils/text.js +0 -8
  487. package/em-cli +0 -0
  488. package/src/commands/entity-add/__test__/dotnet/__snapshots__/render.configuration.spec.ts.snap +0 -49
  489. package/src/commands/entity-add/__test__/dotnet/__snapshots__/render.converter.spec.ts.snap +0 -53
  490. package/src/commands/entity-add/__test__/dotnet/__snapshots__/render.firestore-connector.spec.ts.snap +0 -20
  491. package/src/commands/entity-add/__test__/dotnet/__snapshots__/render.firestore-mapper.spec.ts.snap +0 -29
  492. package/src/commands/entity-add/__test__/dotnet/__snapshots__/render.model-create.spec.ts.snap +0 -10
  493. package/src/commands/entity-add/__test__/dotnet/__snapshots__/render.model-dto.spec.ts.snap +0 -9
  494. package/src/commands/entity-add/__test__/dotnet/__snapshots__/render.model-list-item-dto.spec.ts.snap +0 -11
  495. package/src/commands/entity-add/__test__/dotnet/__snapshots__/render.model-update.spec.ts.snap +0 -11
  496. package/src/commands/entity-add/__test__/dotnet/__snapshots__/render.search-parameters.spec.ts.snap +0 -29
  497. package/src/commands/entity-add/__test__/dotnet/__snapshots__/render.search-query.spec.ts.snap +0 -42
  498. package/templates/dotnet/NewEntity/Configuration/<PluralizedEntity>Configuration.cs.template +0 -48
  499. package/templates/dotnet/NewEntity/Connectors/<PluralizedEntity>FirestoreConnector.cs.template +0 -15
  500. package/templates/dotnet/NewEntity/Converters/<PluralizedEntity>Converter.cs.template +0 -48
  501. package/templates/dotnet/NewEntity/Mappers/<PluralizedEntity>FirestoreMapper.cs.template +0 -25
  502. package/templates/dotnet/NewEntity/Models/<Entity>CreateInput.cs.template +0 -6
  503. package/templates/dotnet/NewEntity/Models/<Entity>Dto.cs.template +0 -5
  504. package/templates/dotnet/NewEntity/Models/<Entity>ListItemDto.cs.template +0 -6
  505. package/templates/dotnet/NewEntity/Models/<Entity>UpdateInput.cs.template +0 -6
  506. package/templates/dotnet/NewEntity/Search/<PluralizedEntity>QueryBuilder.cs.template +0 -38
  507. package/templates/dotnet/NewEntity/Search/<PluralizedEntity>SearchParameters.cs.template +0 -24
  508. package/tsconfig.json +0 -25
@@ -0,0 +1,191 @@
1
+ ---
2
+ title: Use API Versioning for Breaking Changes
3
+ impact: MEDIUM
4
+ impactDescription: Versioning allows you to evolve APIs without breaking existing clients
5
+ tags: api, versioning, breaking-changes, compatibility
6
+ ---
7
+
8
+ ## Use API Versioning for Breaking Changes
9
+
10
+ Use NestJS built-in versioning when making breaking changes to your API. Choose a versioning strategy (URI, header, or media type) and apply it consistently. This allows old clients to continue working while new clients use updated endpoints.
11
+
12
+ **Incorrect (breaking changes without versioning):**
13
+
14
+ ```typescript
15
+ // Breaking changes without versioning
16
+ @Controller('users')
17
+ export class UsersController {
18
+ @Get(':id')
19
+ async findOne(@Param('id') id: string): Promise<User> {
20
+ // Original response: { id, name, email }
21
+ // Later changed to: { id, firstName, lastName, emailAddress }
22
+ // Old clients break!
23
+ return this.usersService.findOne(id);
24
+ }
25
+ }
26
+
27
+ // Manual versioning in routes
28
+ @Controller('v1/users')
29
+ export class UsersV1Controller {}
30
+
31
+ @Controller('v2/users')
32
+ export class UsersV2Controller {}
33
+ // Inconsistent, error-prone, hard to maintain
34
+ ```
35
+
36
+ **Correct (use NestJS built-in versioning):**
37
+
38
+ ```typescript
39
+ // Enable versioning in main.ts
40
+ async function bootstrap() {
41
+ const app = await NestFactory.create(AppModule);
42
+
43
+ // URI versioning: /v1/users, /v2/users
44
+ app.enableVersioning({
45
+ type: VersioningType.URI,
46
+ defaultVersion: '1',
47
+ });
48
+
49
+ // Or header versioning: X-API-Version: 1
50
+ app.enableVersioning({
51
+ type: VersioningType.HEADER,
52
+ header: 'X-API-Version',
53
+ defaultVersion: '1',
54
+ });
55
+
56
+ // Or media type: Accept: application/json;v=1
57
+ app.enableVersioning({
58
+ type: VersioningType.MEDIA_TYPE,
59
+ key: 'v=',
60
+ defaultVersion: '1',
61
+ });
62
+
63
+ await app.listen(3000);
64
+ }
65
+
66
+ // Version-specific controllers
67
+ @Controller('users')
68
+ @Version('1')
69
+ export class UsersV1Controller {
70
+ @Get(':id')
71
+ async findOne(@Param('id') id: string): Promise<UserV1Response> {
72
+ const user = await this.usersService.findOne(id);
73
+ // V1 response format
74
+ return {
75
+ id: user.id,
76
+ name: user.name,
77
+ email: user.email,
78
+ };
79
+ }
80
+ }
81
+
82
+ @Controller('users')
83
+ @Version('2')
84
+ export class UsersV2Controller {
85
+ @Get(':id')
86
+ async findOne(@Param('id') id: string): Promise<UserV2Response> {
87
+ const user = await this.usersService.findOne(id);
88
+ // V2 response format with breaking changes
89
+ return {
90
+ id: user.id,
91
+ firstName: user.firstName,
92
+ lastName: user.lastName,
93
+ emailAddress: user.email,
94
+ createdAt: user.createdAt,
95
+ };
96
+ }
97
+ }
98
+
99
+ // Per-route versioning - different versions for different routes
100
+ @Controller('users')
101
+ export class UsersController {
102
+ @Get()
103
+ @Version('1')
104
+ findAllV1(): Promise<UserV1Response[]> {
105
+ return this.usersService.findAllV1();
106
+ }
107
+
108
+ @Get()
109
+ @Version('2')
110
+ findAllV2(): Promise<UserV2Response[]> {
111
+ return this.usersService.findAllV2();
112
+ }
113
+
114
+ @Get(':id')
115
+ @Version(['1', '2']) // Same handler for multiple versions
116
+ findOne(@Param('id') id: string): Promise<User> {
117
+ return this.usersService.findOne(id);
118
+ }
119
+
120
+ @Post()
121
+ @Version(VERSION_NEUTRAL) // Available in all versions
122
+ create(@Body() dto: CreateUserDto): Promise<User> {
123
+ return this.usersService.create(dto);
124
+ }
125
+ }
126
+
127
+ // Shared service with version-specific logic
128
+ @Injectable()
129
+ export class UsersService {
130
+ async findOne(id: string, version: string): Promise<any> {
131
+ const user = await this.repo.findOne({ where: { id } });
132
+
133
+ if (version === '1') {
134
+ return this.toV1Response(user);
135
+ }
136
+ return this.toV2Response(user);
137
+ }
138
+
139
+ private toV1Response(user: User): UserV1Response {
140
+ return {
141
+ id: user.id,
142
+ name: `${user.firstName} ${user.lastName}`,
143
+ email: user.email,
144
+ };
145
+ }
146
+
147
+ private toV2Response(user: User): UserV2Response {
148
+ return {
149
+ id: user.id,
150
+ firstName: user.firstName,
151
+ lastName: user.lastName,
152
+ emailAddress: user.email,
153
+ createdAt: user.createdAt,
154
+ };
155
+ }
156
+ }
157
+
158
+ // Controller extracts version
159
+ @Controller('users')
160
+ export class UsersController {
161
+ @Get(':id')
162
+ async findOne(
163
+ @Param('id') id: string,
164
+ @Headers('X-API-Version') version: string = '1',
165
+ ): Promise<any> {
166
+ return this.usersService.findOne(id, version);
167
+ }
168
+ }
169
+
170
+ // Deprecation strategy - mark old versions as deprecated
171
+ @Controller('users')
172
+ @Version('1')
173
+ @UseInterceptors(DeprecationInterceptor)
174
+ export class UsersV1Controller {
175
+ // All V1 routes will include deprecation warning
176
+ }
177
+
178
+ @Injectable()
179
+ export class DeprecationInterceptor implements NestInterceptor {
180
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
181
+ const response = context.switchToHttp().getResponse();
182
+ response.setHeader('Deprecation', 'true');
183
+ response.setHeader('Sunset', 'Sat, 1 Jan 2025 00:00:00 GMT');
184
+ response.setHeader('Link', '</v2/users>; rel="successor-version"');
185
+
186
+ return next.handle();
187
+ }
188
+ }
189
+ ```
190
+
191
+ Reference: [NestJS Versioning](https://docs.nestjs.com/techniques/versioning)
@@ -0,0 +1,80 @@
1
+ ---
2
+ title: Avoid Circular Dependencies
3
+ impact: CRITICAL
4
+ impactDescription: "#1 cause of runtime crashes"
5
+ tags: architecture, modules, dependencies
6
+ ---
7
+
8
+ ## Avoid Circular Dependencies
9
+
10
+ Circular dependencies occur when Module A imports Module B, and Module B imports Module A (directly or transitively). NestJS can sometimes resolve these through forward references, but they indicate architectural problems and should be avoided. This is the #1 cause of runtime crashes in NestJS applications.
11
+
12
+ **Incorrect (circular module imports):**
13
+
14
+ ```typescript
15
+ // users.module.ts
16
+ @Module({
17
+ imports: [OrdersModule], // Orders needs Users, Users needs Orders = circular
18
+ providers: [UsersService],
19
+ exports: [UsersService],
20
+ })
21
+ export class UsersModule {}
22
+
23
+ // orders.module.ts
24
+ @Module({
25
+ imports: [UsersModule], // Circular dependency!
26
+ providers: [OrdersService],
27
+ exports: [OrdersService],
28
+ })
29
+ export class OrdersModule {}
30
+ ```
31
+
32
+ **Correct (extract shared logic or use events):**
33
+
34
+ ```typescript
35
+ // Option 1: Extract shared logic to a third module
36
+ // shared.module.ts
37
+ @Module({
38
+ providers: [SharedService],
39
+ exports: [SharedService],
40
+ })
41
+ export class SharedModule {}
42
+
43
+ // users.module.ts
44
+ @Module({
45
+ imports: [SharedModule],
46
+ providers: [UsersService],
47
+ })
48
+ export class UsersModule {}
49
+
50
+ // orders.module.ts
51
+ @Module({
52
+ imports: [SharedModule],
53
+ providers: [OrdersService],
54
+ })
55
+ export class OrdersModule {}
56
+
57
+ // Option 2: Use events for decoupled communication
58
+ // users.service.ts
59
+ @Injectable()
60
+ export class UsersService {
61
+ constructor(private eventEmitter: EventEmitter2) {}
62
+
63
+ async createUser(data: CreateUserDto) {
64
+ const user = await this.userRepo.save(data);
65
+ this.eventEmitter.emit('user.created', user);
66
+ return user;
67
+ }
68
+ }
69
+
70
+ // orders.service.ts
71
+ @Injectable()
72
+ export class OrdersService {
73
+ @OnEvent('user.created')
74
+ handleUserCreated(user: User) {
75
+ // React to user creation without direct dependency
76
+ }
77
+ }
78
+ ```
79
+
80
+ Reference: [NestJS Circular Dependency](https://docs.nestjs.com/fundamentals/circular-dependency)
@@ -0,0 +1,82 @@
1
+ ---
2
+ title: Organize by Feature Modules
3
+ impact: CRITICAL
4
+ impactDescription: "3-5x faster onboarding and development"
5
+ tags: architecture, modules, organization
6
+ ---
7
+
8
+ ## Organize by Feature Modules
9
+
10
+ Organize your application into feature modules that encapsulate related functionality. Each feature module should be self-contained with its own controllers, services, entities, and DTOs. Avoid organizing by technical layer (all controllers together, all services together). This enables 3-5x faster onboarding and feature development.
11
+
12
+ **Incorrect (technical layer organization):**
13
+
14
+ ```typescript
15
+ // Technical layer organization (anti-pattern)
16
+ src/
17
+ ├── controllers/
18
+ │ ├── users.controller.ts
19
+ │ ├── orders.controller.ts
20
+ │ └── products.controller.ts
21
+ ├── services/
22
+ │ ├── users.service.ts
23
+ │ ├── orders.service.ts
24
+ │ └── products.service.ts
25
+ ├── entities/
26
+ │ ├── user.entity.ts
27
+ │ ├── order.entity.ts
28
+ │ └── product.entity.ts
29
+ └── app.module.ts // Imports everything directly
30
+ ```
31
+
32
+ **Correct (feature module organization):**
33
+
34
+ ```typescript
35
+ // Feature module organization
36
+ src/
37
+ ├── users/
38
+ │ ├── dto/
39
+ │ │ ├── create-user.dto.ts
40
+ │ │ └── update-user.dto.ts
41
+ │ ├── entities/
42
+ │ │ └── user.entity.ts
43
+ │ ├── users.controller.ts
44
+ │ ├── users.service.ts
45
+ │ ├── users.repository.ts
46
+ │ └── users.module.ts
47
+ ├── orders/
48
+ │ ├── dto/
49
+ │ ├── entities/
50
+ │ ├── orders.controller.ts
51
+ │ ├── orders.service.ts
52
+ │ └── orders.module.ts
53
+ ├── shared/
54
+ │ ├── guards/
55
+ │ ├── interceptors/
56
+ │ ├── filters/
57
+ │ └── shared.module.ts
58
+ └── app.module.ts
59
+
60
+ // users.module.ts
61
+ @Module({
62
+ imports: [TypeOrmModule.forFeature([User])],
63
+ controllers: [UsersController],
64
+ providers: [UsersService, UsersRepository],
65
+ exports: [UsersService], // Only export what others need
66
+ })
67
+ export class UsersModule {}
68
+
69
+ // app.module.ts
70
+ @Module({
71
+ imports: [
72
+ ConfigModule.forRoot(),
73
+ TypeOrmModule.forRoot(),
74
+ UsersModule,
75
+ OrdersModule,
76
+ SharedModule,
77
+ ],
78
+ })
79
+ export class AppModule {}
80
+ ```
81
+
82
+ Reference: [NestJS Modules](https://docs.nestjs.com/modules)
@@ -0,0 +1,141 @@
1
+ ---
2
+ title: Use Proper Module Sharing Patterns
3
+ impact: CRITICAL
4
+ impactDescription: Prevents duplicate instances, memory leaks, and state inconsistency
5
+ tags: architecture, modules, sharing, exports
6
+ ---
7
+
8
+ ## Use Proper Module Sharing Patterns
9
+
10
+ NestJS modules are singletons by default. When a service is properly exported from a module and that module is imported elsewhere, the same instance is shared. However, providing a service in multiple modules creates separate instances, leading to memory waste, state inconsistency, and confusing behavior. Always encapsulate services in dedicated modules, export them explicitly, and import the module where needed.
11
+
12
+ **Incorrect (service provided in multiple modules):**
13
+
14
+ ```typescript
15
+ // StorageService provided directly in multiple modules - WRONG
16
+ // storage.service.ts
17
+ @Injectable()
18
+ export class StorageService {
19
+ private cache = new Map(); // Each instance has separate state!
20
+
21
+ store(key: string, value: any) {
22
+ this.cache.set(key, value);
23
+ }
24
+ }
25
+
26
+ // app.module.ts
27
+ @Module({
28
+ providers: [StorageService], // Instance #1
29
+ controllers: [AppController],
30
+ })
31
+ export class AppModule {}
32
+
33
+ // videos.module.ts
34
+ @Module({
35
+ providers: [StorageService], // Instance #2 - different from AppModule!
36
+ controllers: [VideosController],
37
+ })
38
+ export class VideosModule {}
39
+
40
+ // Problems:
41
+ // 1. Two separate StorageService instances exist
42
+ // 2. cache.set() in VideosModule doesn't affect AppModule's cache
43
+ // 3. Memory wasted on duplicate instances
44
+ // 4. Debugging nightmares when state doesn't sync
45
+ ```
46
+
47
+ **Correct (dedicated module with exports):**
48
+
49
+ ```typescript
50
+ // storage/storage.module.ts
51
+ @Module({
52
+ providers: [StorageService],
53
+ exports: [StorageService], // Make available to importers
54
+ })
55
+ export class StorageModule {}
56
+
57
+ // videos/videos.module.ts
58
+ @Module({
59
+ imports: [StorageModule], // Import the module, not the service
60
+ controllers: [VideosController],
61
+ providers: [VideosService],
62
+ })
63
+ export class VideosModule {}
64
+
65
+ // channels/channels.module.ts
66
+ @Module({
67
+ imports: [StorageModule], // Same instance shared
68
+ controllers: [ChannelsController],
69
+ providers: [ChannelsService],
70
+ })
71
+ export class ChannelsModule {}
72
+
73
+ // app.module.ts
74
+ @Module({
75
+ imports: [
76
+ StorageModule, // Only if AppModule itself needs StorageService
77
+ VideosModule,
78
+ ChannelsModule,
79
+ ],
80
+ })
81
+ export class AppModule {}
82
+
83
+ // Now all modules share the SAME StorageService instance
84
+ ```
85
+
86
+ **When to use @Global() (sparingly):**
87
+
88
+ ```typescript
89
+ // ONLY for truly cross-cutting concerns
90
+ @Global()
91
+ @Module({
92
+ providers: [ConfigService, LoggerService],
93
+ exports: [ConfigService, LoggerService],
94
+ })
95
+ export class CoreModule {}
96
+
97
+ // Import once in AppModule
98
+ @Module({
99
+ imports: [CoreModule], // Registered globally, available everywhere
100
+ })
101
+ export class AppModule {}
102
+
103
+ // Other modules don't need to import CoreModule
104
+ @Module({
105
+ controllers: [UsersController],
106
+ providers: [UsersService], // Can inject ConfigService without importing
107
+ })
108
+ export class UsersModule {}
109
+
110
+ // WARNING: Don't make everything global!
111
+ // - Hides dependencies (can't see what a module needs from imports)
112
+ // - Makes testing harder
113
+ // - Reserve for: config, logging, database connections
114
+ ```
115
+
116
+ **Module re-exporting pattern:**
117
+
118
+ ```typescript
119
+ // common.module.ts - shared utilities
120
+ @Module({
121
+ providers: [DateService, ValidationService],
122
+ exports: [DateService, ValidationService],
123
+ })
124
+ export class CommonModule {}
125
+
126
+ // core.module.ts - re-exports common for convenience
127
+ @Module({
128
+ imports: [CommonModule, DatabaseModule],
129
+ exports: [CommonModule, DatabaseModule], // Re-export for consumers
130
+ })
131
+ export class CoreModule {}
132
+
133
+ // feature.module.ts - imports CoreModule, gets both
134
+ @Module({
135
+ imports: [CoreModule], // Gets CommonModule + DatabaseModule
136
+ controllers: [FeatureController],
137
+ })
138
+ export class FeatureModule {}
139
+ ```
140
+
141
+ Reference: [NestJS Modules](https://docs.nestjs.com/modules#shared-modules)
@@ -0,0 +1,106 @@
1
+ ---
2
+ title: Single Responsibility for Services
3
+ impact: CRITICAL
4
+ impactDescription: "40%+ improvement in testability"
5
+ tags: architecture, services, single-responsibility
6
+ ---
7
+
8
+ ## Single Responsibility for Services
9
+
10
+ Each service should have a single, well-defined responsibility. Avoid "god services" that handle multiple unrelated concerns. If a service name includes "And" or handles more than one domain concept, it likely violates single responsibility. This reduces complexity and improves testability by 40%+.
11
+
12
+ **Incorrect (god service anti-pattern):**
13
+
14
+ ```typescript
15
+ // God service anti-pattern
16
+ @Injectable()
17
+ export class UserAndOrderService {
18
+ constructor(
19
+ private userRepo: UserRepository,
20
+ private orderRepo: OrderRepository,
21
+ private mailer: MailService,
22
+ private payment: PaymentService,
23
+ ) {}
24
+
25
+ async createUser(dto: CreateUserDto) {
26
+ const user = await this.userRepo.save(dto);
27
+ await this.mailer.sendWelcome(user);
28
+ return user;
29
+ }
30
+
31
+ async createOrder(userId: string, dto: CreateOrderDto) {
32
+ const order = await this.orderRepo.save({ userId, ...dto });
33
+ await this.payment.charge(order);
34
+ await this.mailer.sendOrderConfirmation(order);
35
+ return order;
36
+ }
37
+
38
+ async calculateOrderStats(userId: string) {
39
+ // Stats logic mixed in
40
+ }
41
+
42
+ async validatePayment(orderId: string) {
43
+ // Payment logic mixed in
44
+ }
45
+ }
46
+ ```
47
+
48
+ **Correct (focused services with single responsibility):**
49
+
50
+ ```typescript
51
+ // Focused services with single responsibility
52
+ @Injectable()
53
+ export class UsersService {
54
+ constructor(private userRepo: UserRepository) {}
55
+
56
+ async create(dto: CreateUserDto): Promise<User> {
57
+ return this.userRepo.save(dto);
58
+ }
59
+
60
+ async findById(id: string): Promise<User> {
61
+ return this.userRepo.findOneOrFail({ where: { id } });
62
+ }
63
+ }
64
+
65
+ @Injectable()
66
+ export class OrdersService {
67
+ constructor(private orderRepo: OrderRepository) {}
68
+
69
+ async create(userId: string, dto: CreateOrderDto): Promise<Order> {
70
+ return this.orderRepo.save({ userId, ...dto });
71
+ }
72
+
73
+ async findByUser(userId: string): Promise<Order[]> {
74
+ return this.orderRepo.find({ where: { userId } });
75
+ }
76
+ }
77
+
78
+ @Injectable()
79
+ export class OrderStatsService {
80
+ constructor(private orderRepo: OrderRepository) {}
81
+
82
+ async calculateForUser(userId: string): Promise<OrderStats> {
83
+ // Focused stats calculation
84
+ }
85
+ }
86
+
87
+ // Orchestration in controller or dedicated orchestrator
88
+ @Controller('orders')
89
+ export class OrdersController {
90
+ constructor(
91
+ private orders: OrdersService,
92
+ private payment: PaymentService,
93
+ private notifications: NotificationService,
94
+ ) {}
95
+
96
+ @Post()
97
+ async create(@CurrentUser() user: User, @Body() dto: CreateOrderDto) {
98
+ const order = await this.orders.create(user.id, dto);
99
+ await this.payment.charge(order);
100
+ await this.notifications.sendOrderConfirmation(order);
101
+ return order;
102
+ }
103
+ }
104
+ ```
105
+
106
+ Reference: [NestJS Providers](https://docs.nestjs.com/providers)
@@ -0,0 +1,108 @@
1
+ ---
2
+ title: Use Event-Driven Architecture for Decoupling
3
+ impact: MEDIUM-HIGH
4
+ impactDescription: Enables async processing and modularity
5
+ tags: architecture, events, decoupling
6
+ ---
7
+
8
+ ## Use Event-Driven Architecture for Decoupling
9
+
10
+ Use `@nestjs/event-emitter` for intra-service events and message brokers for inter-service communication. Events allow modules to react to changes without direct dependencies, improving modularity and enabling async processing.
11
+
12
+ **Incorrect (direct service coupling):**
13
+
14
+ ```typescript
15
+ // Direct service coupling
16
+ @Injectable()
17
+ export class OrdersService {
18
+ constructor(
19
+ private inventoryService: InventoryService,
20
+ private emailService: EmailService,
21
+ private analyticsService: AnalyticsService,
22
+ private notificationService: NotificationService,
23
+ private loyaltyService: LoyaltyService,
24
+ ) {}
25
+
26
+ async createOrder(dto: CreateOrderDto): Promise<Order> {
27
+ const order = await this.repo.save(dto);
28
+
29
+ // Tight coupling - OrdersService knows about all consumers
30
+ await this.inventoryService.reserve(order.items);
31
+ await this.emailService.sendConfirmation(order);
32
+ await this.analyticsService.track('order_created', order);
33
+ await this.notificationService.push(order.userId, 'Order placed');
34
+ await this.loyaltyService.addPoints(order.userId, order.total);
35
+
36
+ // Adding new behavior requires modifying this service
37
+ return order;
38
+ }
39
+ }
40
+ ```
41
+
42
+ **Correct (event-driven decoupling):**
43
+
44
+ ```typescript
45
+ // Use EventEmitter for decoupling
46
+ import { EventEmitter2 } from '@nestjs/event-emitter';
47
+
48
+ // Define event
49
+ export class OrderCreatedEvent {
50
+ constructor(
51
+ public readonly orderId: string,
52
+ public readonly userId: string,
53
+ public readonly items: OrderItem[],
54
+ public readonly total: number,
55
+ ) {}
56
+ }
57
+
58
+ // Service emits events
59
+ @Injectable()
60
+ export class OrdersService {
61
+ constructor(
62
+ private eventEmitter: EventEmitter2,
63
+ private repo: Repository<Order>,
64
+ ) {}
65
+
66
+ async createOrder(dto: CreateOrderDto): Promise<Order> {
67
+ const order = await this.repo.save(dto);
68
+
69
+ // Emit event - no knowledge of consumers
70
+ this.eventEmitter.emit(
71
+ 'order.created',
72
+ new OrderCreatedEvent(order.id, order.userId, order.items, order.total),
73
+ );
74
+
75
+ return order;
76
+ }
77
+ }
78
+
79
+ // Listeners in separate modules
80
+ @Injectable()
81
+ export class InventoryListener {
82
+ @OnEvent('order.created')
83
+ async handleOrderCreated(event: OrderCreatedEvent): Promise<void> {
84
+ await this.inventoryService.reserve(event.items);
85
+ }
86
+ }
87
+
88
+ @Injectable()
89
+ export class EmailListener {
90
+ @OnEvent('order.created')
91
+ async handleOrderCreated(event: OrderCreatedEvent): Promise<void> {
92
+ await this.emailService.sendConfirmation(event.orderId);
93
+ }
94
+ }
95
+
96
+ @Injectable()
97
+ export class AnalyticsListener {
98
+ @OnEvent('order.created')
99
+ async handleOrderCreated(event: OrderCreatedEvent): Promise<void> {
100
+ await this.analyticsService.track('order_created', {
101
+ orderId: event.orderId,
102
+ total: event.total,
103
+ });
104
+ }
105
+ }
106
+ ```
107
+
108
+ Reference: [NestJS Events](https://docs.nestjs.com/techniques/events)