@punks/cli 0.1.15 → 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 -51
  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,495 @@
1
+ # Layer Patterns
2
+
3
+ Layers are dependency application. An Effect requirement is like a function parameter: it stays unsatisfied and type-visible until a layer provides it. A good backend keeps this boundary explicit so production and tests use the same composition mechanism.
4
+
5
+ ## Dependencies in Effect.Service
6
+
7
+ **Critical rule:** Always declare dependencies in the `dependencies` array of `Effect.Service`. This ensures proper composition and avoids "leaked dependencies" that require manual wiring at usage sites.
8
+
9
+ ### Correct Pattern
10
+
11
+ ```typescript
12
+ export class OrderService extends Effect.Service<OrderService>()("OrderService", {
13
+ accessors: true,
14
+ dependencies: [
15
+ UserService.Default,
16
+ ProductService.Default,
17
+ InventoryService.Default,
18
+ PaymentService.Default,
19
+ ],
20
+ effect: Effect.gen(function* () {
21
+ const users = yield* UserService
22
+ const products = yield* ProductService
23
+ const inventory = yield* InventoryService
24
+ const payments = yield* PaymentService
25
+
26
+ // Service implementation...
27
+ return { /* methods */ }
28
+ }),
29
+ }) {}
30
+
31
+ // At app root - simple, flat composition
32
+ const AppLive = Layer.mergeAll(
33
+ OrderService.Default,
34
+ // Other top-level services
35
+ NotificationService.Default,
36
+ AnalyticsService.Default,
37
+ )
38
+ ```
39
+
40
+ ### Wrong Pattern (Leaked Dependencies)
41
+
42
+ ```typescript
43
+ // WRONG - Dependencies not declared
44
+ export class OrderService extends Effect.Service<OrderService>()("OrderService", {
45
+ accessors: true,
46
+ effect: Effect.gen(function* () {
47
+ const users = yield* UserService // Not in dependencies!
48
+ // ...
49
+ }),
50
+ }) {}
51
+
52
+ // Now every usage requires manual wiring
53
+ const program = OrderService.create(input).pipe(
54
+ Effect.provide(
55
+ OrderService.Default.pipe(
56
+ Layer.provide(UserService.Default),
57
+ Layer.provide(ProductService.Default),
58
+ // Easy to forget one, causes runtime errors
59
+ )
60
+ ),
61
+ )
62
+ ```
63
+
64
+ ## Infrastructure Layers
65
+
66
+ Infrastructure layers (Database, Redis, HTTP clients) are **acceptable** to leave as "leaked" dependencies because:
67
+
68
+ 1. They're provided once at the application root
69
+ 2. They don't change between test/production (different implementations, same interface)
70
+ 3. They're true infrastructure, not business logic
71
+
72
+ ```typescript
73
+ // Infrastructure can be provided at app root
74
+ import { PgClient } from "@effect/sql-pg"
75
+
76
+ const DatabaseLive = PgClient.layer({
77
+ host: Config.string("DB_HOST"),
78
+ port: Config.integer("DB_PORT"),
79
+ database: Config.string("DB_NAME"),
80
+ username: Config.string("DB_USER"),
81
+ password: Config.redacted("DB_PASSWORD"),
82
+ })
83
+
84
+ // Services use database but don't declare it in dependencies
85
+ export class UserRepo extends Effect.Service<UserRepo>()("UserRepo", {
86
+ accessors: true,
87
+ // No dependencies array - PgClient provided at app root
88
+ effect: Effect.gen(function* () {
89
+ const sql = yield* PgClient.PgClient
90
+
91
+ const findById = Effect.fn("UserRepo.findById")(function* (id: UserId) {
92
+ const rows = yield* sql`SELECT * FROM users WHERE id = ${id}`.pipe(Effect.orDie)
93
+ return rows[0] as User | undefined
94
+ })
95
+
96
+ return { findById }
97
+ }),
98
+ }) {}
99
+
100
+ // App root provides infrastructure once
101
+ const AppLive = Layer.mergeAll(
102
+ OrderService.Default,
103
+ UserService.Default,
104
+ ).pipe(
105
+ Layer.provide(DatabaseLive), // Infrastructure provided here
106
+ Layer.provide(RedisLive),
107
+ )
108
+ ```
109
+
110
+ ## Layer.mergeAll Over Nested Provides
111
+
112
+ **Use `Layer.mergeAll`** for composing layers at the same level:
113
+
114
+ ```typescript
115
+ // CORRECT - Flat composition
116
+ const ServicesLive = Layer.mergeAll(
117
+ UserService.Default,
118
+ OrderService.Default,
119
+ ProductService.Default,
120
+ NotificationService.Default,
121
+ )
122
+
123
+ const InfrastructureLive = Layer.mergeAll(
124
+ DatabaseLive,
125
+ RedisLive,
126
+ HttpClientLive,
127
+ )
128
+
129
+ const AppLive = ServicesLive.pipe(
130
+ Layer.provide(InfrastructureLive),
131
+ )
132
+ ```
133
+
134
+ ```typescript
135
+ // WRONG - Deeply nested, hard to read
136
+ const AppLive = UserService.Default.pipe(
137
+ Layer.provide(
138
+ OrderService.Default.pipe(
139
+ Layer.provide(
140
+ ProductService.Default.pipe(
141
+ Layer.provide(DatabaseLive),
142
+ ),
143
+ ),
144
+ ),
145
+ ),
146
+ )
147
+ ```
148
+
149
+ ## Layer.provideMerge for Sequential Composition
150
+
151
+ **Use `Layer.provideMerge`** when chaining layers that need incremental composition. Unlike `Layer.provide`, `provideMerge` merges the output into the current layer, producing flatter types.
152
+
153
+ ```typescript
154
+ // CORRECT - Layer.provideMerge chains for incremental composition
155
+ const MainLive = DatabaseLive.pipe(
156
+ Layer.provideMerge(ProxyConfigService.Default),
157
+ Layer.provideMerge(LoggerLive),
158
+ Layer.provideMerge(CacheLive),
159
+ Layer.provideMerge(TracerLive),
160
+ )
161
+
162
+ // WRONG - Multiple Layer.provide calls create nested types
163
+ const MainLive = DatabaseLive.pipe(
164
+ Layer.provide(ProxyConfigService.Default),
165
+ Layer.provide(LoggerLive), // Each provide creates deeper nesting
166
+ Layer.provide(CacheLive),
167
+ )
168
+ ```
169
+
170
+ **Key difference:** `Layer.provide(A, B)` provides B to A but outputs only A's services. `Layer.provideMerge(A, B)` provides B to A and outputs both A's and B's services merged together.
171
+
172
+ ## Layer Deduplication Benefits
173
+
174
+ Layers automatically memoize construction - the same service is instantiated only once regardless of how many times it appears in the dependency graph.
175
+
176
+ ```typescript
177
+ // Both UserRepo and OrderRepo depend on DatabaseLive
178
+ const RepoLive = Layer.mergeAll(
179
+ UserRepo.Default, // requires DatabaseLive
180
+ OrderRepo.Default, // requires DatabaseLive
181
+ )
182
+
183
+ // With Layer.mergeAll, DatabaseLive is constructed ONCE
184
+ const AppLive = RepoLive.pipe(
185
+ Layer.provide(DatabaseLive), // Single instance shared
186
+ )
187
+ ```
188
+
189
+ **`Effect.provide` does NOT deduplicate:**
190
+
191
+ ```typescript
192
+ // WRONG - Each provide creates a new instance
193
+ const program = myEffect.pipe(
194
+ Effect.provide(UserRepo.Default),
195
+ Effect.provide(OrderRepo.Default),
196
+ // If both repos need DatabaseLive, and you provide it separately,
197
+ // you may get TWO database connections!
198
+ )
199
+
200
+ // CORRECT - Use layers for deduplication
201
+ const program = myEffect.pipe(
202
+ Effect.provide(AppLive), // Single composed layer
203
+ )
204
+ ```
205
+
206
+ ## TypeScript LSP Performance
207
+
208
+ Deeply nested `Layer.provide` chains create complex recursive types that slow down the TypeScript Language Server.
209
+
210
+ ```typescript
211
+ // PROBLEMATIC - Deep nesting causes slow LSP
212
+ const AppLive = Layer1.pipe(
213
+ Layer.provide(Layer2.pipe(
214
+ Layer.provide(Layer3.pipe(
215
+ Layer.provide(Layer4.pipe(
216
+ Layer.provide(Layer5),
217
+ )),
218
+ )),
219
+ )),
220
+ )
221
+ // Type becomes: Layer<..., Layer<..., Layer<..., Layer<..., ...>>>>
222
+ ```
223
+
224
+ ```typescript
225
+ // BETTER - Flat composition with mergeAll produces simpler types
226
+ const InfraLive = Layer.mergeAll(Layer3, Layer4, Layer5)
227
+ const AppLive = Layer.mergeAll(Layer1, Layer2).pipe(
228
+ Layer.provide(InfraLive),
229
+ )
230
+ // Type is flatter and LSP responds faster
231
+ ```
232
+
233
+ **Recommendations:**
234
+ - Prefer `Layer.mergeAll` for layers at the same level
235
+ - Use `Layer.provideMerge` instead of chained `Layer.provide` calls
236
+ - Group related layers into intermediate compositions
237
+ - Keep nesting depth shallow (ideally 2-3 levels max)
238
+
239
+ ## layerConfig Pattern
240
+
241
+ For services that need configuration at construction time, use the `layerConfig` static method pattern:
242
+
243
+ ```typescript
244
+ import { Config, ConfigError, Effect, Layer } from "effect"
245
+
246
+ interface EventQueueConfig {
247
+ readonly maxRetries: number
248
+ readonly batchSize: number
249
+ readonly pollInterval: number
250
+ }
251
+
252
+ export class ElectricEventQueue extends Effect.Service<ElectricEventQueue>()(
253
+ "ElectricEventQueue",
254
+ {
255
+ accessors: true,
256
+ effect: Effect.gen(function* () {
257
+ // Default implementation
258
+ return { /* methods */ }
259
+ }),
260
+ }
261
+ ) {
262
+ // Static method for config-driven layer
263
+ static readonly layerConfig = (
264
+ config: Config.Config.Wrap<EventQueueConfig>,
265
+ ): Layer.Layer<ElectricEventQueue, ConfigError.ConfigError> =>
266
+ Layer.unwrapEffect(
267
+ Config.unwrap(config).pipe(
268
+ Effect.map((cfg) =>
269
+ Layer.succeed(
270
+ ElectricEventQueue,
271
+ new ElectricEventQueueImpl(cfg)
272
+ )
273
+ )
274
+ )
275
+ )
276
+ }
277
+
278
+ // Usage
279
+ const EventQueueLive = ElectricEventQueue.layerConfig({
280
+ maxRetries: Config.integer("EVENT_QUEUE_MAX_RETRIES").pipe(
281
+ Config.withDefault(3)
282
+ ),
283
+ batchSize: Config.integer("EVENT_QUEUE_BATCH_SIZE").pipe(
284
+ Config.withDefault(100)
285
+ ),
286
+ pollInterval: Config.integer("EVENT_QUEUE_POLL_INTERVAL").pipe(
287
+ Config.withDefault(1000)
288
+ ),
289
+ })
290
+ ```
291
+
292
+ This pattern:
293
+ - Separates configuration from implementation
294
+ - Returns `ConfigError` for missing/invalid config
295
+ - Allows different configs per environment
296
+ - Integrates cleanly with `Layer.mergeAll` and `Layer.provideMerge`
297
+
298
+ ## Layer Naming Conventions
299
+
300
+ Use suffixes to indicate layer type:
301
+
302
+ - `ServiceLive` - Production implementation
303
+ - `ServiceTest` - Test/mock implementation
304
+ - `ServiceLayer` - Generic layer (rare)
305
+
306
+ ```typescript
307
+ // Production
308
+ export const UserServiceLive = UserService.Default
309
+
310
+ // Test with mocks
311
+ export const UserServiceTest = Layer.succeed(
312
+ UserService,
313
+ UserService.of({
314
+ findById: (id) => Effect.succeed(mockUser),
315
+ create: (input) => Effect.succeed({ id: UserId.make("test-id"), ...input }),
316
+ })
317
+ )
318
+
319
+ // Test with in-memory state
320
+ export class UserServiceInMemory extends Effect.Service<UserService>()("UserService", {
321
+ accessors: true,
322
+ effect: Effect.gen(function* () {
323
+ const store = new Map<string, User>()
324
+
325
+ return {
326
+ findById: Effect.fn("UserService.findById")(function* (id) {
327
+ const user = store.get(id)
328
+ if (!user) return yield* Effect.fail(new UserNotFoundError({ userId: id }))
329
+ return user
330
+ }),
331
+ create: Effect.fn("UserService.create")(function* (input) {
332
+ const user = { id: UserId.make(crypto.randomUUID()), ...input }
333
+ store.set(user.id, user)
334
+ return user
335
+ }),
336
+ }
337
+ }),
338
+ }) {}
339
+ ```
340
+
341
+ ## Layer.unwrapEffect for Config-Dependent Layers
342
+
343
+ When a layer needs async configuration:
344
+
345
+ ```typescript
346
+ import { Config, Effect, Layer } from "effect"
347
+
348
+ // Layer that depends on config
349
+ const ApiClientLive = Layer.unwrapEffect(
350
+ Effect.gen(function* () {
351
+ const apiKey = yield* Config.string("API_KEY")
352
+ const baseUrl = yield* Config.string("API_BASE_URL")
353
+ const timeout = yield* Config.integer("API_TIMEOUT").pipe(
354
+ Config.withDefault(5000)
355
+ )
356
+
357
+ return Layer.succeed(
358
+ ApiClient,
359
+ new ApiClientImpl({ apiKey, baseUrl, timeout })
360
+ )
361
+ })
362
+ )
363
+
364
+ // Layer that validates config
365
+ const ValidatedConfigLive = Layer.unwrapEffect(
366
+ Effect.gen(function* () {
367
+ const config = yield* Config.all({
368
+ dbUrl: Config.string("DATABASE_URL"),
369
+ redisUrl: Config.string("REDIS_URL"),
370
+ port: Config.integer("PORT"),
371
+ })
372
+
373
+ // Validate config
374
+ if (!config.dbUrl.startsWith("postgresql://")) {
375
+ return yield* Effect.fail(new ConfigError({ message: "Invalid DATABASE_URL" }))
376
+ }
377
+
378
+ return Layer.succeed(AppConfig, config)
379
+ })
380
+ )
381
+ ```
382
+
383
+ ## Scoped Layers
384
+
385
+ For resources that need cleanup:
386
+
387
+ ```typescript
388
+ import { Effect, Layer, Scope } from "effect"
389
+
390
+ // Resource that needs cleanup
391
+ const DatabaseConnectionLive = Layer.scoped(
392
+ DatabaseConnection,
393
+ Effect.acquireRelease(
394
+ Effect.gen(function* () {
395
+ const pool = yield* createPool(config)
396
+ yield* Effect.log("Database pool created")
397
+ return pool
398
+ }),
399
+ (pool) =>
400
+ Effect.gen(function* () {
401
+ yield* pool.end()
402
+ yield* Effect.log("Database pool closed")
403
+ }).pipe(Effect.orDie)
404
+ )
405
+ )
406
+
407
+ // Service using scoped resource
408
+ export class UserRepo extends Effect.Service<UserRepo>()("UserRepo", {
409
+ accessors: true,
410
+ effect: Effect.gen(function* () {
411
+ const db = yield* DatabaseConnection
412
+
413
+ return {
414
+ findById: Effect.fn("UserRepo.findById")(function* (id) {
415
+ return yield* db.query("SELECT * FROM users WHERE id = $1", [id])
416
+ }),
417
+ }
418
+ }),
419
+ }) {}
420
+ ```
421
+
422
+ ## Testing Layer Composition
423
+
424
+ Test layers replace implementations at the service boundary. Prefer this over module mocks because the compiler still checks the service shape, required environment, and error channel.
425
+
426
+ ```typescript
427
+ // test/setup.ts
428
+ import { Layer } from "effect"
429
+
430
+ export const TestLive = Layer.mergeAll(
431
+ UserServiceTest,
432
+ OrderServiceTest,
433
+ ProductServiceTest,
434
+ ).pipe(
435
+ Layer.provide(InMemoryDatabaseLive),
436
+ )
437
+
438
+ // test/user.test.ts
439
+ import { Effect } from "effect"
440
+ import { TestLive } from "./setup"
441
+
442
+ describe("UserService", () => {
443
+ it("creates users", async () => {
444
+ const program = Effect.gen(function* () {
445
+ const user = yield* UserService.create({
446
+ email: "test@example.com",
447
+ name: "Test User",
448
+ })
449
+ expect(user.email).toBe("test@example.com")
450
+ })
451
+
452
+ await Effect.runPromise(program.pipe(Effect.provide(TestLive)))
453
+ })
454
+ })
455
+ ```
456
+
457
+ ## Layer.effect vs Layer.succeed
458
+
459
+ ```typescript
460
+ // Layer.succeed - for static values (no effects)
461
+ const ConfigLive = Layer.succeed(AppConfig, {
462
+ port: 3000,
463
+ env: "development",
464
+ })
465
+
466
+ // Layer.effect - when construction needs effects
467
+ const LoggerLive = Layer.effect(
468
+ Logger,
469
+ Effect.gen(function* () {
470
+ const config = yield* AppConfig
471
+ const transport = config.env === "production"
472
+ ? createCloudTransport()
473
+ : createConsoleTransport()
474
+ return new LoggerImpl(transport)
475
+ })
476
+ )
477
+ ```
478
+
479
+ ## Lazy Layers
480
+
481
+ For expensive initialization that should be deferred:
482
+
483
+ ```typescript
484
+ const ExpensiveServiceLive = Layer.lazy(() => {
485
+ // This code runs only when the layer is first used
486
+ return Layer.effect(
487
+ ExpensiveService,
488
+ Effect.gen(function* () {
489
+ yield* Effect.log("Initializing expensive service...")
490
+ const client = yield* createExpensiveClient()
491
+ return new ExpensiveServiceImpl(client)
492
+ })
493
+ )
494
+ })
495
+ ```