@dewtech/dare-cli 3.3.0 → 3.4.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 (582) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +764 -764
  3. package/dist/__tests__/confidence.test.js +13 -13
  4. package/dist/__tests__/dag-converter.test.js +56 -56
  5. package/dist/__tests__/mcp-server/server.test.js +3 -16
  6. package/dist/__tests__/mcp-server/server.test.js.map +1 -1
  7. package/dist/__tests__/project-generator.test.js +2 -2
  8. package/dist/__tests__/project-generator.test.js.map +1 -1
  9. package/dist/__tests__/refine.test.js +49 -49
  10. package/dist/__tests__/reverse-collection.test.js +6 -6
  11. package/dist/__tests__/review.test.js +38 -38
  12. package/dist/__tests__/security-hardening.test.d.ts +2 -0
  13. package/dist/__tests__/security-hardening.test.d.ts.map +1 -0
  14. package/dist/__tests__/security-hardening.test.js +101 -0
  15. package/dist/__tests__/security-hardening.test.js.map +1 -0
  16. package/dist/__tests__/validate.test.js +65 -65
  17. package/dist/bin/dare.js +0 -0
  18. package/dist/commands/__tests__/init-validation.test.d.ts +2 -0
  19. package/dist/commands/__tests__/init-validation.test.d.ts.map +1 -0
  20. package/dist/commands/__tests__/init-validation.test.js +81 -0
  21. package/dist/commands/__tests__/init-validation.test.js.map +1 -0
  22. package/dist/commands/__tests__/init.integration.spec.js +6 -4
  23. package/dist/commands/__tests__/init.integration.spec.js.map +1 -1
  24. package/dist/commands/__tests__/init.spec.d.ts +2 -0
  25. package/dist/commands/__tests__/init.spec.d.ts.map +1 -0
  26. package/dist/commands/__tests__/init.spec.js +88 -0
  27. package/dist/commands/__tests__/init.spec.js.map +1 -0
  28. package/dist/commands/blueprint.js +122 -122
  29. package/dist/commands/design.js +20 -20
  30. package/dist/commands/init-validation.d.ts +22 -0
  31. package/dist/commands/init-validation.d.ts.map +1 -0
  32. package/dist/commands/init-validation.js +54 -0
  33. package/dist/commands/init-validation.js.map +1 -0
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +26 -10
  36. package/dist/commands/init.js.map +1 -1
  37. package/dist/graphrag/graph-rag.js +24 -24
  38. package/dist/mcp-server/__tests__/auth.test.d.ts +2 -0
  39. package/dist/mcp-server/__tests__/auth.test.d.ts.map +1 -0
  40. package/dist/mcp-server/__tests__/auth.test.js +72 -0
  41. package/dist/mcp-server/__tests__/auth.test.js.map +1 -0
  42. package/dist/mcp-server/__tests__/boot-config.test.d.ts +2 -0
  43. package/dist/mcp-server/__tests__/boot-config.test.d.ts.map +1 -0
  44. package/dist/mcp-server/__tests__/boot-config.test.js +29 -0
  45. package/dist/mcp-server/__tests__/boot-config.test.js.map +1 -0
  46. package/dist/mcp-server/__tests__/error-sanitize.test.d.ts +2 -0
  47. package/dist/mcp-server/__tests__/error-sanitize.test.d.ts.map +1 -0
  48. package/dist/mcp-server/__tests__/error-sanitize.test.js +66 -0
  49. package/dist/mcp-server/__tests__/error-sanitize.test.js.map +1 -0
  50. package/dist/mcp-server/__tests__/path-confinement.test.d.ts +2 -0
  51. package/dist/mcp-server/__tests__/path-confinement.test.d.ts.map +1 -0
  52. package/dist/mcp-server/__tests__/path-confinement.test.js +135 -0
  53. package/dist/mcp-server/__tests__/path-confinement.test.js.map +1 -0
  54. package/dist/mcp-server/bin/server.js +18 -6
  55. package/dist/mcp-server/bin/server.js.map +1 -1
  56. package/dist/mcp-server/boot-config.d.ts +6 -0
  57. package/dist/mcp-server/boot-config.d.ts.map +1 -0
  58. package/dist/mcp-server/boot-config.js +17 -0
  59. package/dist/mcp-server/boot-config.js.map +1 -0
  60. package/dist/mcp-server/middleware/auth.d.ts +10 -0
  61. package/dist/mcp-server/middleware/auth.d.ts.map +1 -0
  62. package/dist/mcp-server/middleware/auth.js +44 -0
  63. package/dist/mcp-server/middleware/auth.js.map +1 -0
  64. package/dist/mcp-server/middleware/cors.d.ts +6 -0
  65. package/dist/mcp-server/middleware/cors.d.ts.map +1 -0
  66. package/dist/mcp-server/middleware/cors.js +30 -0
  67. package/dist/mcp-server/middleware/cors.js.map +1 -0
  68. package/dist/mcp-server/middleware/error-handler.d.ts +11 -0
  69. package/dist/mcp-server/middleware/error-handler.d.ts.map +1 -0
  70. package/dist/mcp-server/middleware/error-handler.js +14 -0
  71. package/dist/mcp-server/middleware/error-handler.js.map +1 -0
  72. package/dist/mcp-server/server.d.ts +7 -2
  73. package/dist/mcp-server/server.d.ts.map +1 -1
  74. package/dist/mcp-server/server.js +185 -105
  75. package/dist/mcp-server/server.js.map +1 -1
  76. package/dist/skills/registry-mock.json +109 -109
  77. package/dist/skills/tests/manifest.spec.js +20 -20
  78. package/dist/stacks/__tests__/dna-emitter.spec.js +6 -6
  79. package/dist/stacks/dna-emitter.js +69 -69
  80. package/dist/stacks/ruby-rails-8/scaffold.js +15 -15
  81. package/dist/utils/project-generator.d.ts.map +1 -1
  82. package/dist/utils/project-generator.js +254 -252
  83. package/dist/utils/project-generator.js.map +1 -1
  84. package/dist/utils/stack-bootstrap.js +371 -371
  85. package/dist/utils/templates.js +394 -394
  86. package/dist/verification/__tests__/anti-tamper.test.js +13 -13
  87. package/package.json +96 -93
  88. package/templates/DARE-dag-example.yaml +280 -280
  89. package/templates/UPDATE-MANIFEST.json +68 -68
  90. package/templates/backend/node-nestjs/.env.example +9 -9
  91. package/templates/backend/node-nestjs/nest-cli.json +8 -8
  92. package/templates/backend/node-nestjs/package.json +50 -50
  93. package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
  94. package/templates/backend/node-nestjs/src/app.module.ts +15 -15
  95. package/templates/backend/node-nestjs/src/app.service.ts +8 -8
  96. package/templates/backend/node-nestjs/src/main.ts +24 -24
  97. package/templates/backend/node-nestjs/tsconfig.json +21 -21
  98. package/templates/backend/php-laravel/.env.example +22 -22
  99. package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
  100. package/templates/backend/php-laravel/composer.json +40 -40
  101. package/templates/backend/python-fastapi/.env.example +4 -4
  102. package/templates/backend/python-fastapi/app/api/router.py +8 -8
  103. package/templates/backend/python-fastapi/app/core/config.py +20 -20
  104. package/templates/backend/python-fastapi/main.py +35 -35
  105. package/templates/backend/python-fastapi/requirements.txt +13 -13
  106. package/templates/backend/rust-axum/.env.example +3 -3
  107. package/templates/backend/rust-axum/Cargo.toml +23 -23
  108. package/templates/backend/rust-axum/src/errors.rs +30 -30
  109. package/templates/backend/rust-axum/src/main.rs +32 -32
  110. package/templates/backend/rust-axum/src/routes.rs +6 -6
  111. package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
  112. package/templates/frontend/leptos-csr/Cargo.toml +16 -16
  113. package/templates/frontend/leptos-csr/Trunk.toml +10 -10
  114. package/templates/frontend/leptos-csr/index.html +11 -11
  115. package/templates/frontend/leptos-csr/src/lib.rs +20 -20
  116. package/templates/frontend/leptos-csr/style/main.scss +19 -19
  117. package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
  118. package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
  119. package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
  120. package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
  121. package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
  122. package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
  123. package/templates/frontend/react/index.html +12 -12
  124. package/templates/frontend/react/package.json +35 -35
  125. package/templates/frontend/react/src/App.tsx +25 -25
  126. package/templates/frontend/react/src/main.tsx +9 -9
  127. package/templates/frontend/vue/package.json +32 -32
  128. package/templates/frontend/vue/src/App.vue +7 -7
  129. package/templates/frontend/vue/src/main.ts +10 -10
  130. package/templates/frontend/vue/src/router/index.ts +14 -14
  131. package/templates/frontend/vue/src/views/HomeView.vue +6 -6
  132. package/templates/hooks/pre-commit-dare-validate +24 -24
  133. package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -152
  134. package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -21
  135. package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +368 -368
  136. package/templates/ide/antigravity/.agents/skills/dare-bootstrap/SKILL.md +32 -32
  137. package/templates/ide/antigravity/.agents/skills/dare-bugfix-design/SKILL.md +76 -76
  138. package/templates/ide/antigravity/.agents/skills/dare-dag/SKILL.md +32 -32
  139. package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -154
  140. package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -130
  141. package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
  142. package/templates/ide/antigravity/.agents/skills/dare-design/SKILL.md +180 -180
  143. package/templates/ide/antigravity/.agents/skills/dare-discover/SKILL.md +33 -33
  144. package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -63
  145. package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -315
  146. package/templates/ide/antigravity/.agents/skills/dare-execute/SKILL.md +264 -264
  147. package/templates/ide/antigravity/.agents/skills/dare-feature-design/SKILL.md +74 -74
  148. package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -192
  149. package/templates/ide/antigravity/.agents/skills/dare-graph/SKILL.md +35 -35
  150. package/templates/ide/antigravity/.agents/skills/dare-info/SKILL.md +31 -31
  151. package/templates/ide/antigravity/.agents/skills/dare-init/SKILL.md +35 -35
  152. package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -337
  153. package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -166
  154. package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -217
  155. package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -61
  156. package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -187
  157. package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -217
  158. package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
  159. package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -108
  160. package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
  161. package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -263
  162. package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
  163. package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -274
  164. package/templates/ide/antigravity/.agents/skills/dare-skill/SKILL.md +35 -35
  165. package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
  166. package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -188
  167. package/templates/ide/antigravity/.agents/skills/dare-update/SKILL.md +33 -33
  168. package/templates/ide/antigravity/.agents/skills/dare-validate/SKILL.md +33 -33
  169. package/templates/ide/antigravity/.agents/skills/dare-welcome/SKILL.md +30 -30
  170. package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -343
  171. package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -377
  172. package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -382
  173. package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -326
  174. package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -393
  175. package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
  176. package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
  177. package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -141
  178. package/templates/ide/antigravity/templates/TASKS-template.md +26 -26
  179. package/templates/ide/antigravity/templates/TELEMETRY-template.md +125 -125
  180. package/templates/ide/claude/.claude/commands/dare-ax.md +131 -131
  181. package/templates/ide/claude/.claude/commands/dare-bench.md +18 -18
  182. package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
  183. package/templates/ide/claude/.claude/commands/dare-bootstrap.md +27 -27
  184. package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -119
  185. package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
  186. package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
  187. package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -117
  188. package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
  189. package/templates/ide/claude/.claude/commands/dare-dag.md +27 -27
  190. package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
  191. package/templates/ide/claude/.claude/commands/dare-discover.md +28 -28
  192. package/templates/ide/claude/.claude/commands/dare-dna.md +75 -75
  193. package/templates/ide/claude/.claude/commands/dare-docker.md +207 -207
  194. package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
  195. package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -147
  196. package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -149
  197. package/templates/ide/claude/.claude/commands/dare-graph.md +30 -30
  198. package/templates/ide/claude/.claude/commands/dare-info.md +26 -26
  199. package/templates/ide/claude/.claude/commands/dare-init.md +30 -30
  200. package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -211
  201. package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -124
  202. package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -148
  203. package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -72
  204. package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -166
  205. package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -159
  206. package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
  207. package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -139
  208. package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
  209. package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
  210. package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
  211. package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
  212. package/templates/ide/claude/.claude/commands/dare-skill.md +30 -30
  213. package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
  214. package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -132
  215. package/templates/ide/claude/.claude/commands/dare-update.md +28 -28
  216. package/templates/ide/claude/.claude/commands/dare-validate.md +28 -28
  217. package/templates/ide/claude/.claude/commands/dare-welcome.md +25 -25
  218. package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -205
  219. package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -232
  220. package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -228
  221. package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -210
  222. package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -236
  223. package/templates/ide/claude/.claude/settings.example.json +35 -35
  224. package/templates/ide/claude/CLAUDE.md +146 -146
  225. package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
  226. package/templates/ide/claude/templates/DESIGN-template.md +129 -129
  227. package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -141
  228. package/templates/ide/claude/templates/TASKS-template.md +26 -26
  229. package/templates/ide/claude/templates/TELEMETRY-template.md +125 -125
  230. package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -18
  231. package/templates/ide/cursor/.cursor/commands/dare-blueprint.md +86 -86
  232. package/templates/ide/cursor/.cursor/commands/dare-bootstrap.md +27 -27
  233. package/templates/ide/cursor/.cursor/commands/dare-bugfix-design.md +64 -64
  234. package/templates/ide/cursor/.cursor/commands/dare-dag-run.md +110 -110
  235. package/templates/ide/cursor/.cursor/commands/dare-dag-viz.md +139 -139
  236. package/templates/ide/cursor/.cursor/commands/dare-dag.md +27 -27
  237. package/templates/ide/cursor/.cursor/commands/dare-design.md +35 -35
  238. package/templates/ide/cursor/.cursor/commands/dare-discover.md +28 -28
  239. package/templates/ide/cursor/.cursor/commands/dare-dna.md +75 -75
  240. package/templates/ide/cursor/.cursor/commands/dare-docker-compose.md +18 -18
  241. package/templates/ide/cursor/.cursor/commands/dare-dockerfile.md +17 -17
  242. package/templates/ide/cursor/.cursor/commands/dare-execute.md +19 -19
  243. package/templates/ide/cursor/.cursor/commands/dare-feature-design.md +64 -64
  244. package/templates/ide/cursor/.cursor/commands/dare-graph.md +30 -30
  245. package/templates/ide/cursor/.cursor/commands/dare-info.md +26 -26
  246. package/templates/ide/cursor/.cursor/commands/dare-init.md +30 -30
  247. package/templates/ide/cursor/.cursor/commands/dare-migrate.md +72 -72
  248. package/templates/ide/cursor/.cursor/commands/dare-refine.md +107 -107
  249. package/templates/ide/cursor/.cursor/commands/dare-reverse.md +139 -139
  250. package/templates/ide/cursor/.cursor/commands/dare-review.md +91 -91
  251. package/templates/ide/cursor/.cursor/commands/dare-skill.md +30 -30
  252. package/templates/ide/cursor/.cursor/commands/dare-tasks.md +184 -184
  253. package/templates/ide/cursor/.cursor/commands/dare-telemetry.md +42 -42
  254. package/templates/ide/cursor/.cursor/commands/dare-update.md +28 -28
  255. package/templates/ide/cursor/.cursor/commands/dare-validate.md +28 -28
  256. package/templates/ide/cursor/.cursor/commands/dare-welcome.md +25 -25
  257. package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -263
  258. package/templates/ide/cursor/.cursor/rules/skill-bugfix-design.mdc +51 -51
  259. package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -173
  260. package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -134
  261. package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
  262. package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -63
  263. package/templates/ide/cursor/.cursor/rules/skill-docker.mdc +33 -33
  264. package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -352
  265. package/templates/ide/cursor/.cursor/rules/skill-feature-design.mdc +43 -43
  266. package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -244
  267. package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -371
  268. package/templates/ide/cursor/.cursor/rules/skill-laravel-api.mdc +44 -44
  269. package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -266
  270. package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -295
  271. package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -367
  272. package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -58
  273. package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -346
  274. package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -248
  275. package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -400
  276. package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -262
  277. package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -107
  278. package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -281
  279. package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
  280. package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
  281. package/templates/ide/cursor/.cursor/rules/skill-telemetry.mdc +156 -156
  282. package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
  283. package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
  284. package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -141
  285. package/templates/ide/cursor/templates/TASKS-template.md +26 -26
  286. package/templates/ide/cursor/templates/TELEMETRY-template.md +125 -125
  287. package/templates/shared/docker-compose.yml +41 -41
  288. package/templates/stacks/go-gin/.dare/skills.yml +11 -11
  289. package/templates/stacks/go-gin/.env.example +24 -24
  290. package/templates/stacks/go-gin/.github/workflows/dare-ci.yml +42 -42
  291. package/templates/stacks/go-gin/README.md.tpl +38 -38
  292. package/templates/stacks/go-gin/cmd/server/main.go.tpl +78 -78
  293. package/templates/stacks/go-gin/db/migrations/0001_create_users.down.sql +2 -2
  294. package/templates/stacks/go-gin/db/migrations/0001_create_users.up.sql +12 -12
  295. package/templates/stacks/go-gin/db/queries/users.sql +23 -23
  296. package/templates/stacks/go-gin/gitignore +7 -7
  297. package/templates/stacks/go-gin/go.mod.tpl +17 -17
  298. package/templates/stacks/go-gin/internal/config/config.go +41 -41
  299. package/templates/stacks/go-gin/internal/db/postgres.go.tpl +25 -25
  300. package/templates/stacks/go-gin/internal/handler/auth_handler.go.tpl +72 -72
  301. package/templates/stacks/go-gin/internal/handler/users_handler.go.tpl +72 -72
  302. package/templates/stacks/go-gin/internal/handler/ws_handler.go +37 -37
  303. package/templates/stacks/go-gin/internal/llm/dummy.go +14 -14
  304. package/templates/stacks/go-gin/internal/llm/provider.go +8 -8
  305. package/templates/stacks/go-gin/internal/middleware/jwt.go.tpl +58 -58
  306. package/templates/stacks/go-gin/internal/middleware/rate_limit.go +55 -55
  307. package/templates/stacks/go-gin/internal/model/user.go +17 -17
  308. package/templates/stacks/go-gin/internal/repository/users_repository.go.tpl +79 -79
  309. package/templates/stacks/go-gin/internal/service/auth_service.go.tpl +55 -55
  310. package/templates/stacks/go-gin/internal/service/users_service.go.tpl +53 -53
  311. package/templates/stacks/go-gin/llms.txt.tpl +54 -54
  312. package/templates/stacks/go-gin/openapi.json.tpl +46 -46
  313. package/templates/stacks/go-gin/sqlc.yaml +14 -14
  314. package/templates/stacks/go-gin/tests/smoke_test.go.tpl +22 -22
  315. package/templates/stacks/go-stdlib/.dare/skills.yml +11 -11
  316. package/templates/stacks/go-stdlib/.env.example +24 -24
  317. package/templates/stacks/go-stdlib/.github/workflows/dare-ci.yml +42 -42
  318. package/templates/stacks/go-stdlib/README.md.tpl +41 -41
  319. package/templates/stacks/go-stdlib/cmd/server/main.go.tpl +82 -82
  320. package/templates/stacks/go-stdlib/db/migrations/0001_create_users.down.sql +2 -2
  321. package/templates/stacks/go-stdlib/db/migrations/0001_create_users.up.sql +12 -12
  322. package/templates/stacks/go-stdlib/db/queries/users.sql +23 -23
  323. package/templates/stacks/go-stdlib/gitignore +6 -6
  324. package/templates/stacks/go-stdlib/go.mod.tpl +15 -15
  325. package/templates/stacks/go-stdlib/internal/config/config.go +41 -41
  326. package/templates/stacks/go-stdlib/internal/db/postgres.go.tpl +24 -24
  327. package/templates/stacks/go-stdlib/internal/handler/auth_handler.go.tpl +71 -71
  328. package/templates/stacks/go-stdlib/internal/handler/users_handler.go.tpl +84 -84
  329. package/templates/stacks/go-stdlib/internal/handler/ws_handler.go +36 -36
  330. package/templates/stacks/go-stdlib/internal/httpx/json.go +32 -32
  331. package/templates/stacks/go-stdlib/internal/llm/dummy.go +14 -14
  332. package/templates/stacks/go-stdlib/internal/llm/provider.go +8 -8
  333. package/templates/stacks/go-stdlib/internal/middleware/chain.go +21 -21
  334. package/templates/stacks/go-stdlib/internal/middleware/cors.go +27 -27
  335. package/templates/stacks/go-stdlib/internal/middleware/jwt.go.tpl +51 -51
  336. package/templates/stacks/go-stdlib/internal/middleware/rate_limit.go +81 -81
  337. package/templates/stacks/go-stdlib/internal/model/user.go +17 -17
  338. package/templates/stacks/go-stdlib/internal/repository/users_repository.go.tpl +75 -75
  339. package/templates/stacks/go-stdlib/internal/service/auth_service.go.tpl +55 -55
  340. package/templates/stacks/go-stdlib/internal/service/users_service.go.tpl +53 -53
  341. package/templates/stacks/go-stdlib/llms.txt.tpl +60 -60
  342. package/templates/stacks/go-stdlib/openapi.json.tpl +46 -46
  343. package/templates/stacks/go-stdlib/sqlc.yaml +14 -14
  344. package/templates/stacks/go-stdlib/tests/smoke_test.go.tpl +45 -45
  345. package/templates/stacks/mcp-go/.dare/skills.yml +8 -8
  346. package/templates/stacks/mcp-go/.env.example +14 -14
  347. package/templates/stacks/mcp-go/.github/workflows/dare-ci.yml +42 -42
  348. package/templates/stacks/mcp-go/README.md.tpl +50 -50
  349. package/templates/stacks/mcp-go/cmd/server/main.go.tpl +62 -62
  350. package/templates/stacks/mcp-go/gitignore +6 -6
  351. package/templates/stacks/mcp-go/go.mod.tpl +9 -9
  352. package/templates/stacks/mcp-go/internal/prompts/summarize.go +9 -9
  353. package/templates/stacks/mcp-go/internal/server/server.go.tpl +80 -80
  354. package/templates/stacks/mcp-go/internal/tools/echo.go +15 -15
  355. package/templates/stacks/mcp-go/internal/transports/http.go.tpl +21 -21
  356. package/templates/stacks/mcp-go/internal/transports/sse.go.tpl +17 -17
  357. package/templates/stacks/mcp-go/internal/transports/stdio.go.tpl +14 -14
  358. package/templates/stacks/mcp-go/llms.txt.tpl +60 -60
  359. package/templates/stacks/mcp-go/openapi.json.tpl +31 -31
  360. package/templates/stacks/mcp-go/tests/echo_test.go.tpl +37 -37
  361. package/templates/stacks/mcp-node-ts/.dare/skills.yml +8 -8
  362. package/templates/stacks/mcp-node-ts/.env.example +16 -16
  363. package/templates/stacks/mcp-node-ts/.github/workflows/dare-ci.yml +54 -54
  364. package/templates/stacks/mcp-node-ts/README.md.hbs +49 -49
  365. package/templates/stacks/mcp-node-ts/gitignore +7 -7
  366. package/templates/stacks/mcp-node-ts/llms.txt.hbs +61 -61
  367. package/templates/stacks/mcp-node-ts/openapi.json.hbs +39 -39
  368. package/templates/stacks/mcp-node-ts/package.json.hbs +35 -35
  369. package/templates/stacks/mcp-node-ts/src/cli.ts.hbs +71 -71
  370. package/templates/stacks/mcp-node-ts/src/prompts/index.ts +36 -36
  371. package/templates/stacks/mcp-node-ts/src/server.ts.hbs +45 -45
  372. package/templates/stacks/mcp-node-ts/src/tools/echo.ts +23 -23
  373. package/templates/stacks/mcp-node-ts/src/tools/index.ts +18 -18
  374. package/templates/stacks/mcp-node-ts/src/transports/http.ts +68 -68
  375. package/templates/stacks/mcp-node-ts/src/transports/sse.ts +58 -58
  376. package/templates/stacks/mcp-node-ts/src/transports/stdio.ts +5 -5
  377. package/templates/stacks/mcp-node-ts/tests/echo.test.ts +50 -50
  378. package/templates/stacks/mcp-node-ts/tsconfig.json +17 -17
  379. package/templates/stacks/mcp-python/.dare/skills.yml +8 -8
  380. package/templates/stacks/mcp-python/.env.example +14 -14
  381. package/templates/stacks/mcp-python/.github/workflows/dare-ci.yml +42 -42
  382. package/templates/stacks/mcp-python/README.md.j2 +49 -49
  383. package/templates/stacks/mcp-python/gitignore +12 -12
  384. package/templates/stacks/mcp-python/llms.txt.j2 +56 -56
  385. package/templates/stacks/mcp-python/openapi.json.j2 +33 -33
  386. package/templates/stacks/mcp-python/pyproject.toml.j2 +37 -37
  387. package/templates/stacks/mcp-python/src/cli.py.j2 +68 -68
  388. package/templates/stacks/mcp-python/src/prompts/summarize.py +10 -10
  389. package/templates/stacks/mcp-python/src/server.py.j2 +28 -28
  390. package/templates/stacks/mcp-python/src/tools/echo.py +12 -12
  391. package/templates/stacks/mcp-python/src/transports/http.py +12 -12
  392. package/templates/stacks/mcp-python/src/transports/sse.py +13 -13
  393. package/templates/stacks/mcp-python/src/transports/stdio.py +6 -6
  394. package/templates/stacks/mcp-python/tests/test_echo.py +28 -28
  395. package/templates/stacks/mcp-rust/.dare/skills.yml +8 -8
  396. package/templates/stacks/mcp-rust/.env.example +14 -14
  397. package/templates/stacks/mcp-rust/.github/workflows/dare-ci.yml +38 -38
  398. package/templates/stacks/mcp-rust/Cargo.toml.tera +35 -35
  399. package/templates/stacks/mcp-rust/README.md.tera +50 -50
  400. package/templates/stacks/mcp-rust/gitignore +5 -5
  401. package/templates/stacks/mcp-rust/llms.txt.tera +60 -60
  402. package/templates/stacks/mcp-rust/openapi.json.tera +31 -31
  403. package/templates/stacks/mcp-rust/src/cli.rs.tera +33 -33
  404. package/templates/stacks/mcp-rust/src/lib.rs +6 -6
  405. package/templates/stacks/mcp-rust/src/main.rs.tera +30 -30
  406. package/templates/stacks/mcp-rust/src/prompts/mod.rs +1 -1
  407. package/templates/stacks/mcp-rust/src/prompts/summarize.rs +5 -5
  408. package/templates/stacks/mcp-rust/src/server.rs.tera +38 -38
  409. package/templates/stacks/mcp-rust/src/tools/echo.rs +18 -18
  410. package/templates/stacks/mcp-rust/src/tools/mod.rs +22 -22
  411. package/templates/stacks/mcp-rust/src/transports/http.rs +27 -27
  412. package/templates/stacks/mcp-rust/src/transports/mod.rs +3 -3
  413. package/templates/stacks/mcp-rust/src/transports/sse.rs +33 -33
  414. package/templates/stacks/mcp-rust/src/transports/stdio.rs +14 -14
  415. package/templates/stacks/mcp-rust/tests/echo_test.rs.tera +27 -27
  416. package/templates/stacks/node-nestjs/.dare/skills.yml +11 -11
  417. package/templates/stacks/node-nestjs/.env.example +21 -21
  418. package/templates/stacks/node-nestjs/.github/workflows/dare-ci.yml +54 -54
  419. package/templates/stacks/node-nestjs/README.md.hbs +35 -35
  420. package/templates/stacks/node-nestjs/gitignore +7 -7
  421. package/templates/stacks/node-nestjs/llms.txt.hbs +47 -47
  422. package/templates/stacks/node-nestjs/nest-cli.json +16 -16
  423. package/templates/stacks/node-nestjs/openapi.json.hbs +75 -75
  424. package/templates/stacks/node-nestjs/package.json.hbs +57 -57
  425. package/templates/stacks/node-nestjs/prisma/schema.prisma +25 -25
  426. package/templates/stacks/node-nestjs/prisma/seed.ts.hbs +25 -25
  427. package/templates/stacks/node-nestjs/src/app.module.ts +39 -39
  428. package/templates/stacks/node-nestjs/src/auth/auth.controller.ts +29 -29
  429. package/templates/stacks/node-nestjs/src/auth/auth.module.ts +25 -25
  430. package/templates/stacks/node-nestjs/src/auth/auth.service.ts +36 -36
  431. package/templates/stacks/node-nestjs/src/auth/dto/login-response.dto.ts +9 -9
  432. package/templates/stacks/node-nestjs/src/auth/dto/login.dto.ts +17 -17
  433. package/templates/stacks/node-nestjs/src/auth/jwt.strategy.ts +25 -25
  434. package/templates/stacks/node-nestjs/src/common/filters/problem-details.filter.ts +38 -38
  435. package/templates/stacks/node-nestjs/src/common/interceptors/json-response.interceptor.ts +13 -13
  436. package/templates/stacks/node-nestjs/src/main.ts.hbs +44 -44
  437. package/templates/stacks/node-nestjs/src/prisma/prisma.module.ts +9 -9
  438. package/templates/stacks/node-nestjs/src/prisma/prisma.service.ts +9 -9
  439. package/templates/stacks/node-nestjs/src/users/dto/create-user.dto.ts +22 -22
  440. package/templates/stacks/node-nestjs/src/users/dto/user.dto.ts +15 -15
  441. package/templates/stacks/node-nestjs/src/users/users.controller.ts +41 -41
  442. package/templates/stacks/node-nestjs/src/users/users.module.ts +11 -11
  443. package/templates/stacks/node-nestjs/src/users/users.repository.ts +38 -38
  444. package/templates/stacks/node-nestjs/src/users/users.service.ts +38 -38
  445. package/templates/stacks/node-nestjs/tsconfig.build.json +4 -4
  446. package/templates/stacks/node-nestjs/tsconfig.json +28 -28
  447. package/templates/stacks/php-laravel/.dare/skills.yml +11 -11
  448. package/templates/stacks/php-laravel/.env.example +41 -41
  449. package/templates/stacks/php-laravel/.github/workflows/dare-ci.yml +43 -43
  450. package/templates/stacks/php-laravel/README.md.hbs +36 -36
  451. package/templates/stacks/php-laravel/app/Http/Controllers/Api/AuthController.php +36 -36
  452. package/templates/stacks/php-laravel/app/Http/Controllers/Api/UsersController.php +33 -33
  453. package/templates/stacks/php-laravel/app/Http/Requests/CreateUserRequest.php +26 -26
  454. package/templates/stacks/php-laravel/app/Http/Requests/LoginRequest.php +34 -34
  455. package/templates/stacks/php-laravel/app/Llm/Contracts/LlmProvider.php +12 -12
  456. package/templates/stacks/php-laravel/app/Llm/Providers/DummyProvider.php +13 -13
  457. package/templates/stacks/php-laravel/app/Llm/Providers/OpenAiProvider.php +33 -33
  458. package/templates/stacks/php-laravel/app/Models/User.php +44 -44
  459. package/templates/stacks/php-laravel/app/Repositories/UsersRepository.php +32 -32
  460. package/templates/stacks/php-laravel/app/Services/AuthService.php +37 -37
  461. package/templates/stacks/php-laravel/app/Services/UsersService.php +57 -57
  462. package/templates/stacks/php-laravel/artisan +12 -12
  463. package/templates/stacks/php-laravel/bootstrap/app.php +29 -29
  464. package/templates/stacks/php-laravel/bootstrap/providers.php +5 -5
  465. package/templates/stacks/php-laravel/composer.json.hbs +58 -58
  466. package/templates/stacks/php-laravel/config/l5-swagger.php +41 -41
  467. package/templates/stacks/php-laravel/config/reverb.php +34 -34
  468. package/templates/stacks/php-laravel/config/sanctum.php +15 -15
  469. package/templates/stacks/php-laravel/database/migrations/2026_06_01_000001_create_users_table.php +27 -27
  470. package/templates/stacks/php-laravel/database/seeders/DatabaseSeeder.php +21 -21
  471. package/templates/stacks/php-laravel/gitignore +23 -23
  472. package/templates/stacks/php-laravel/llms.txt.hbs +53 -53
  473. package/templates/stacks/php-laravel/openapi.json.hbs +43 -43
  474. package/templates/stacks/php-laravel/phpstan.neon +9 -9
  475. package/templates/stacks/php-laravel/routes/api.php +13 -13
  476. package/templates/stacks/php-laravel/routes/channels.php +7 -7
  477. package/templates/stacks/php-laravel/tests/Feature/AuthTest.php +35 -35
  478. package/templates/stacks/php-laravel/tests/Feature/UsersTest.php +30 -30
  479. package/templates/stacks/php-laravel/tests/Pest.php +5 -5
  480. package/templates/stacks/python-fastapi/.dare/skills.yml +11 -11
  481. package/templates/stacks/python-fastapi/.env.example +21 -21
  482. package/templates/stacks/python-fastapi/.github/workflows/dare-ci.yml +43 -43
  483. package/templates/stacks/python-fastapi/README.md.j2 +35 -35
  484. package/templates/stacks/python-fastapi/alembic/env.py +46 -46
  485. package/templates/stacks/python-fastapi/alembic/script.py.mako +26 -26
  486. package/templates/stacks/python-fastapi/alembic/versions/0001_create_users.py.j2 +37 -37
  487. package/templates/stacks/python-fastapi/alembic.ini.j2 +39 -39
  488. package/templates/stacks/python-fastapi/app/core/config.py +24 -24
  489. package/templates/stacks/python-fastapi/app/core/security.py +34 -34
  490. package/templates/stacks/python-fastapi/app/db/session.py +22 -22
  491. package/templates/stacks/python-fastapi/app/main.py.j2 +36 -36
  492. package/templates/stacks/python-fastapi/app/models/__init__.py +3 -3
  493. package/templates/stacks/python-fastapi/app/models/user.py +30 -30
  494. package/templates/stacks/python-fastapi/app/repositories/user_repository.py +34 -34
  495. package/templates/stacks/python-fastapi/app/routers/auth.py +37 -37
  496. package/templates/stacks/python-fastapi/app/routers/users.py +46 -46
  497. package/templates/stacks/python-fastapi/app/schemas/user.py +56 -56
  498. package/templates/stacks/python-fastapi/app/services/auth_service.py +22 -22
  499. package/templates/stacks/python-fastapi/app/services/user_service.py +31 -31
  500. package/templates/stacks/python-fastapi/gitignore +12 -12
  501. package/templates/stacks/python-fastapi/llms.txt.j2 +53 -53
  502. package/templates/stacks/python-fastapi/openapi.json.j2 +43 -43
  503. package/templates/stacks/python-fastapi/pyproject.toml.j2 +45 -45
  504. package/templates/stacks/python-fastapi/tests/test_auth.py +22 -22
  505. package/templates/stacks/ruby-rails-8/.dare/skills.yml +50 -50
  506. package/templates/stacks/ruby-rails-8/.env.example +20 -20
  507. package/templates/stacks/ruby-rails-8/.github/workflows/dare-ci.yml +112 -112
  508. package/templates/stacks/ruby-rails-8/Gemfile.erb +61 -61
  509. package/templates/stacks/ruby-rails-8/app/channels/application_cable/channel.rb +11 -11
  510. package/templates/stacks/ruby-rails-8/app/channels/application_cable/connection.rb +34 -34
  511. package/templates/stacks/ruby-rails-8/app/channels/dare_updates_channel.rb +18 -18
  512. package/templates/stacks/ruby-rails-8/app/channels/user_updates_channel.rb +23 -23
  513. package/templates/stacks/ruby-rails-8/app/controllers/application_controller.rb +44 -44
  514. package/templates/stacks/ruby-rails-8/app/controllers/concerns/problem_details.rb +93 -93
  515. package/templates/stacks/ruby-rails-8/app/handlers/summarize_handler.rb +33 -33
  516. package/templates/stacks/ruby-rails-8/app/handlers/users_handler.rb +68 -68
  517. package/templates/stacks/ruby-rails-8/app/llm/cache/llm_cache.rb +44 -44
  518. package/templates/stacks/ruby-rails-8/app/llm/prompts/prompt_loader.rb +54 -54
  519. package/templates/stacks/ruby-rails-8/app/llm/prompts/summarize_v1.jinja2 +12 -12
  520. package/templates/stacks/ruby-rails-8/app/llm/providers/dummy_provider.rb +35 -35
  521. package/templates/stacks/ruby-rails-8/app/llm/providers/llm_provider.rb +67 -67
  522. package/templates/stacks/ruby-rails-8/app/llm/providers/openai_provider.rb +62 -62
  523. package/templates/stacks/ruby-rails-8/app/llm/rate_limit/token_bucket.rb +82 -82
  524. package/templates/stacks/ruby-rails-8/app/llm/validators/summarize_output_schema.json +21 -21
  525. package/templates/stacks/ruby-rails-8/app/llm/validators/validator.rb +52 -52
  526. package/templates/stacks/ruby-rails-8/app/models/user.rb +36 -36
  527. package/templates/stacks/ruby-rails-8/app/presenters/user_presenter.rb +48 -48
  528. package/templates/stacks/ruby-rails-8/app/repositories/document_repository.rb +57 -57
  529. package/templates/stacks/ruby-rails-8/app/repositories/user_repository.rb +73 -73
  530. package/templates/stacks/ruby-rails-8/app/services/create_user_service.rb +67 -67
  531. package/templates/stacks/ruby-rails-8/app/services/realtime_service.rb +53 -53
  532. package/templates/stacks/ruby-rails-8/app/services/summarize_document_service.rb +57 -57
  533. package/templates/stacks/ruby-rails-8/config/dare.yml +42 -42
  534. package/templates/stacks/ruby-rails-8/config/initializers/dare.rb +31 -31
  535. package/templates/stacks/ruby-rails-8/config/initializers/rack_attack.rb +64 -64
  536. package/templates/stacks/ruby-rails-8/config/initializers/rswag_api.rb +12 -12
  537. package/templates/stacks/ruby-rails-8/lib/tasks/dare.rake +159 -159
  538. package/templates/stacks/ruby-rails-8/llms.txt.erb +69 -69
  539. package/templates/stacks/ruby-rails-8/spec/api/summarize_spec.rb +56 -56
  540. package/templates/stacks/ruby-rails-8/spec/api/users_spec.rb +72 -72
  541. package/templates/stacks/ruby-rails-8/spec/channels/dare_updates_channel_spec.rb +61 -61
  542. package/templates/stacks/ruby-rails-8/spec/channels/user_updates_channel_spec.rb +56 -56
  543. package/templates/stacks/ruby-rails-8/spec/factories/users.rb +27 -27
  544. package/templates/stacks/ruby-rails-8/spec/handlers/users_handler_spec.rb +88 -88
  545. package/templates/stacks/ruby-rails-8/spec/rails_helper.rb +31 -31
  546. package/templates/stacks/ruby-rails-8/spec/services/create_user_service_spec.rb +88 -88
  547. package/templates/stacks/ruby-rails-8/spec/services/summarize_document_service_spec.rb +142 -142
  548. package/templates/stacks/ruby-rails-8/spec/swagger_helper.rb +73 -73
  549. package/templates/stacks/rust-axum/.dare/skills.yml +11 -11
  550. package/templates/stacks/rust-axum/.env.example +26 -26
  551. package/templates/stacks/rust-axum/.github/workflows/dare-ci.yml +40 -40
  552. package/templates/stacks/rust-axum/Cargo.toml.tera +53 -53
  553. package/templates/stacks/rust-axum/README.md.tera +37 -37
  554. package/templates/stacks/rust-axum/gitignore +5 -5
  555. package/templates/stacks/rust-axum/llms.txt.tera +54 -54
  556. package/templates/stacks/rust-axum/migrations/0001_create_users.sql +13 -13
  557. package/templates/stacks/rust-axum/openapi.json.tera +46 -46
  558. package/templates/stacks/rust-axum/src/config.rs +45 -45
  559. package/templates/stacks/rust-axum/src/errors.rs +48 -48
  560. package/templates/stacks/rust-axum/src/handlers/auth.rs +48 -48
  561. package/templates/stacks/rust-axum/src/handlers/mod.rs +3 -3
  562. package/templates/stacks/rust-axum/src/handlers/users.rs +81 -81
  563. package/templates/stacks/rust-axum/src/handlers/ws.rs +24 -24
  564. package/templates/stacks/rust-axum/src/lib.rs +19 -19
  565. package/templates/stacks/rust-axum/src/llm/mod.rs +1 -1
  566. package/templates/stacks/rust-axum/src/llm/provider.rs +48 -48
  567. package/templates/stacks/rust-axum/src/main.rs.tera +64 -64
  568. package/templates/stacks/rust-axum/src/middleware/auth.rs +20 -20
  569. package/templates/stacks/rust-axum/src/middleware/mod.rs +2 -2
  570. package/templates/stacks/rust-axum/src/middleware/rate_limit.rs +27 -27
  571. package/templates/stacks/rust-axum/src/models/mod.rs +1 -1
  572. package/templates/stacks/rust-axum/src/models/user.rs +13 -13
  573. package/templates/stacks/rust-axum/src/repositories/mod.rs +1 -1
  574. package/templates/stacks/rust-axum/src/repositories/user_repository.rs +62 -62
  575. package/templates/stacks/rust-axum/src/services/auth_service.rs +50 -50
  576. package/templates/stacks/rust-axum/src/services/mod.rs +2 -2
  577. package/templates/stacks/rust-axum/src/services/user_service.rs +53 -53
  578. package/templates/stacks/rust-axum/tests/integration_test.rs.tera +13 -13
  579. package/dist/commands/new.d.ts +0 -16
  580. package/dist/commands/new.d.ts.map +0 -1
  581. package/dist/commands/new.js +0 -104
  582. package/dist/commands/new.js.map +0 -1
@@ -1,326 +1,326 @@
1
- ---
2
- name: skill-nestjs-api
3
- description: Padrões DARE para APIs REST em NestJS + TypeScript + Prisma + Swagger. Modules, Controllers, Services, DTOs com class-validator, Guards, Interceptors, exceções globais, Jest + Supertest, OpenAPI auto-gerado, rate limiting com @nestjs/throttler.
4
- ---
5
-
6
- # DARE NestJS API Skill
7
-
8
- Você é um desenvolvedor sênior TypeScript / NestJS especializado em APIs REST. Seu objetivo é gerar código **idiomático Nest, fortemente tipado, com auth/autz robustos e OpenAPI auto-gerado**, seguindo Layered Design DARE.
9
-
10
- ## Quando usar
11
-
12
- - Projeto NestJS novo via DARE
13
- - Adicionar feature em API NestJS existente
14
- - Migrar API Express clássica para NestJS
15
- - Auditar projeto NestJS para conformidade DARE
16
-
17
- ## Stack canônica
18
-
19
- - **TypeScript 5.5+** com `strict: true`
20
- - **NestJS 11.x** (módulos, providers, DI)
21
- - **Prisma 5.x** ORM (PostgreSQL ou MySQL)
22
- - **class-validator + class-transformer** para DTOs
23
- - **@nestjs/swagger** para OpenAPI auto-gerado
24
- - **@nestjs/throttler** para rate limiting
25
- - **@nestjs/passport + @nestjs/jwt** para auth
26
- - **Jest + Supertest** para testes
27
- - **ESLint + Prettier** para formatação
28
-
29
- ## Layered Design em NestJS
30
-
31
- Cada módulo segue:
32
-
33
- ```
34
- src/<feature>/
35
- ├── <feature>.module.ts ← define providers, controllers
36
- ├── <feature>.controller.ts ← Handler
37
- ├── <feature>.service.ts ← Service (uma operação) ou facade
38
- ├── <feature>.repository.ts ← Repository (Prisma)
39
- ├── dto/
40
- │ ├── create-<feature>.dto.ts ← class-validator
41
- │ └── update-<feature>.dto.ts
42
- ├── entities/
43
- │ └── <feature>.entity.ts ← Model
44
- └── tests/
45
- ├── <feature>.service.spec.ts ← unit
46
- └── <feature>.e2e-spec.ts ← E2E
47
- ```
48
-
49
- ## Controllers (Handler)
50
-
51
- ```typescript
52
- import { Body, Controller, Post, UseGuards } from '@nestjs/common';
53
- import { ApiTags, ApiOperation, ApiCreatedResponse } from '@nestjs/swagger';
54
- import { JwtAuthGuard } from '@/auth/jwt-auth.guard';
55
- import { CreateUserDto } from './dto/create-user.dto';
56
- import { UserResponseDto } from './dto/user-response.dto';
57
- import { RegisterUserService } from './register-user.service';
58
-
59
- @ApiTags('users')
60
- @Controller('users')
61
- @UseGuards(JwtAuthGuard)
62
- export class UsersController {
63
- constructor(private readonly register: RegisterUserService) {}
64
-
65
- @Post()
66
- @ApiOperation({ summary: 'Criar novo usuário' })
67
- @ApiCreatedResponse({ type: UserResponseDto })
68
- async create(@Body() dto: CreateUserDto): Promise<UserResponseDto> {
69
- const user = await this.register.execute(dto);
70
- return UserResponseDto.from(user);
71
- }
72
- }
73
- ```
74
-
75
- ## DTOs (validação)
76
-
77
- ```typescript
78
- import { IsEmail, IsString, MinLength } from 'class-validator';
79
- import { ApiProperty } from '@nestjs/swagger';
80
-
81
- export class CreateUserDto {
82
- @ApiProperty({ example: 'jane@example.com' })
83
- @IsEmail()
84
- email!: string;
85
-
86
- @ApiProperty({ example: 'Jane Doe' })
87
- @IsString()
88
- name!: string;
89
-
90
- @ApiProperty({ minLength: 12 })
91
- @IsString()
92
- @MinLength(12)
93
- password!: string;
94
- }
95
- ```
96
-
97
- `main.ts` ativa global pipe:
98
- ```typescript
99
- app.useGlobalPipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true }));
100
- ```
101
-
102
- ## Services (Business Logic)
103
-
104
- Uma operação por classe:
105
-
106
- ```typescript
107
- import { Injectable } from '@nestjs/common';
108
- import { hash } from '@node-rs/argon2';
109
- import { UsersRepository } from './users.repository';
110
- import { CreateUserDto } from './dto/create-user.dto';
111
- import { User } from './entities/user.entity';
112
- import { UserAlreadyExistsError } from './errors';
113
-
114
- @Injectable()
115
- export class RegisterUserService {
116
- constructor(private readonly repo: UsersRepository) {}
117
-
118
- async execute(dto: CreateUserDto): Promise<User> {
119
- if (await this.repo.existsByEmail(dto.email)) {
120
- throw new UserAlreadyExistsError();
121
- }
122
- return this.repo.create({
123
- ...dto,
124
- password: await hash(dto.password),
125
- });
126
- }
127
- }
128
- ```
129
-
130
- ## Repositories (Prisma)
131
-
132
- ```typescript
133
- import { Injectable } from '@nestjs/common';
134
- import { PrismaService } from '@/prisma/prisma.service';
135
-
136
- @Injectable()
137
- export class UsersRepository {
138
- constructor(private readonly prisma: PrismaService) {}
139
-
140
- async existsByEmail(email: string): Promise<boolean> {
141
- return !!(await this.prisma.user.findUnique({ where: { email } }));
142
- }
143
-
144
- async create(data: { email: string; name: string; password: string }) {
145
- return this.prisma.user.create({ data });
146
- }
147
- }
148
- ```
149
-
150
- ## Tratamento global de exceções
151
-
152
- ```typescript
153
- // src/common/filters/all-exceptions.filter.ts
154
- @Catch()
155
- export class AllExceptionsFilter implements ExceptionFilter {
156
- catch(exception: unknown, host: ArgumentsHost) {
157
- const ctx = host.switchToHttp();
158
- const response = ctx.getResponse<Response>();
159
-
160
- if (exception instanceof UserAlreadyExistsError) {
161
- return response.status(409).json({ error: 'USER_EXISTS' });
162
- }
163
- if (exception instanceof HttpException) {
164
- return response.status(exception.getStatus()).json(exception.getResponse());
165
- }
166
- // log + 500 genérico
167
- return response.status(500).json({ error: 'INTERNAL' });
168
- }
169
- }
170
-
171
- // main.ts
172
- app.useGlobalFilters(new AllExceptionsFilter());
173
- ```
174
-
175
- ## OpenAPI auto-gerado
176
-
177
- ```typescript
178
- // main.ts
179
- import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
180
-
181
- const config = new DocumentBuilder()
182
- .setTitle('Projeto API')
183
- .setVersion('1.0')
184
- .addBearerAuth()
185
- .build();
186
-
187
- const document = SwaggerModule.createDocument(app, config);
188
- SwaggerModule.setup('docs', app, document); // UI em /docs
189
- writeFileSync('./public/openapi.json', JSON.stringify(document));
190
- ```
191
-
192
- ## Rate limiting
193
-
194
- ```typescript
195
- import { ThrottlerModule } from '@nestjs/throttler';
196
-
197
- @Module({
198
- imports: [
199
- ThrottlerModule.forRoot([{ ttl: 60_000, limit: 100 }]),
200
- ],
201
- })
202
-
203
- // Endpoint sensível
204
- @Throttle({ default: { limit: 5, ttl: 900_000 } }) // 5/15min
205
- @Post('login')
206
- async login() {...}
207
- ```
208
-
209
- ## Auth (JWT + Passport)
210
-
211
- ```typescript
212
- @Injectable()
213
- export class JwtAuthGuard extends AuthGuard('jwt') {}
214
-
215
- @Injectable()
216
- export class JwtStrategy extends PassportStrategy(Strategy) {
217
- constructor(config: ConfigService) {
218
- super({
219
- jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
220
- secretOrKey: config.getOrThrow('JWT_SECRET'),
221
- });
222
- }
223
- async validate(payload: any) {
224
- return { id: payload.sub, email: payload.email };
225
- }
226
- }
227
- ```
228
-
229
- ## Testes
230
-
231
- ### Unit (service)
232
-
233
- ```typescript
234
- describe('RegisterUserService', () => {
235
- it('falha se email já existe', async () => {
236
- const repo = { existsByEmail: jest.fn().mockResolvedValue(true) } as any;
237
- const sut = new RegisterUserService(repo);
238
- await expect(sut.execute({ email: 'x@y.com', name: 'X', password: 'longsecret123' }))
239
- .rejects.toThrow(UserAlreadyExistsError);
240
- });
241
- });
242
- ```
243
-
244
- ### E2E (Supertest)
245
-
246
- ```typescript
247
- describe('POST /users', () => {
248
- it('cria usuário com sucesso', async () => {
249
- const res = await request(app.getHttpServer())
250
- .post('/users')
251
- .set('Authorization', `Bearer ${adminToken}`)
252
- .send({ email: 'jane@example.com', name: 'Jane', password: 'longsecret123' });
253
- expect(res.status).toBe(201);
254
- expect(res.body.email).toBe('jane@example.com');
255
- });
256
- });
257
- ```
258
-
259
- ## Antipatterns
260
-
261
- | AP | Antipattern | Correção |
262
- |---|---|---|
263
- | AP-01 | Validação inline no Controller | DTO + ValidationPipe |
264
- | AP-02 | Prisma direto no Controller | Repository |
265
- | AP-03 | Lógica no Controller | Service |
266
- | AP-04 | Sem DTO de saída | `UserResponseDto.from(user)` |
267
- | AP-05 | `JwtStrategy` com secret hardcoded | `ConfigService.getOrThrow` |
268
- | AP-06 | Sem `@nestjs/throttler` em login | rate limit obrigatório |
269
- | AP-07 | OpenAPI escrito à mão | `@nestjs/swagger` decorators |
270
- | AP-08 | Erros sem filter global | inconsistência de response |
271
-
272
- ## Segurança (combinar com `dare-security`)
273
-
274
- - Hash com `@node-rs/argon2` (Argon2id)
275
- - JWT: RS256 para tokens públicos, HS256 + secret ≥256 bits para internos
276
- - `helmet` middleware para headers
277
- - CORS específico, nunca `*`
278
- - Rate limit em login (5/15min) + APIs públicas
279
- - Refresh token com rotação no DB
280
-
281
- ## Validação no CI
282
-
283
- ```bash
284
- npm run lint
285
- npm run test
286
- npm run test:e2e
287
- npm run build
288
- npx prisma migrate deploy --dry-run # valida migrations
289
- npm audit --audit-level=high
290
- ```
291
-
292
- ## Como aplicar
293
-
294
- ### Passo 1: Audit
295
-
296
- ```bash
297
- grep -rn "@Body()" src/ | grep -v "Dto" # AP-01
298
- grep -rn "prisma\." src/*/controllers/ # AP-02
299
- grep -rn "JwtStrategy" src/ | grep -v Config # AP-05
300
- ```
301
-
302
- ### Passo 2: Migrar para DTOs
303
-
304
- Para cada `@Body() body: any`, criar DTO com class-validator + `@ApiProperty`.
305
-
306
- ### Passo 3: Extrair Services
307
-
308
- Toda lógica > 5 linhas em Controller → Service injetável.
309
-
310
- ### Passo 4: Adicionar Repositories
311
-
312
- Encapsular Prisma. Controller chama Service, Service chama Repository.
313
-
314
- ### Passo 5: Configurar Swagger + throttler
315
-
316
- `main.ts` com `SwaggerModule.setup` e exportar `public/openapi.json`. Adicionar `ThrottlerModule` global.
317
-
318
- ## Dicas
319
-
320
- - **Combine** com `dare-docker` para PHP-FPM-style separação (Node + Postgres + Redis)
321
- - **Use** `dare-llm-integration` se houver chamadas LLM
322
- - **Para realtime**, use `@nestjs/websockets` + skill `dare-realtime`
323
-
324
- ---
325
-
326
- Esta skill é parte do DARE Method e está sob licença MIT.
1
+ ---
2
+ name: skill-nestjs-api
3
+ description: Padrões DARE para APIs REST em NestJS + TypeScript + Prisma + Swagger. Modules, Controllers, Services, DTOs com class-validator, Guards, Interceptors, exceções globais, Jest + Supertest, OpenAPI auto-gerado, rate limiting com @nestjs/throttler.
4
+ ---
5
+
6
+ # DARE NestJS API Skill
7
+
8
+ Você é um desenvolvedor sênior TypeScript / NestJS especializado em APIs REST. Seu objetivo é gerar código **idiomático Nest, fortemente tipado, com auth/autz robustos e OpenAPI auto-gerado**, seguindo Layered Design DARE.
9
+
10
+ ## Quando usar
11
+
12
+ - Projeto NestJS novo via DARE
13
+ - Adicionar feature em API NestJS existente
14
+ - Migrar API Express clássica para NestJS
15
+ - Auditar projeto NestJS para conformidade DARE
16
+
17
+ ## Stack canônica
18
+
19
+ - **TypeScript 5.5+** com `strict: true`
20
+ - **NestJS 11.x** (módulos, providers, DI)
21
+ - **Prisma 5.x** ORM (PostgreSQL ou MySQL)
22
+ - **class-validator + class-transformer** para DTOs
23
+ - **@nestjs/swagger** para OpenAPI auto-gerado
24
+ - **@nestjs/throttler** para rate limiting
25
+ - **@nestjs/passport + @nestjs/jwt** para auth
26
+ - **Jest + Supertest** para testes
27
+ - **ESLint + Prettier** para formatação
28
+
29
+ ## Layered Design em NestJS
30
+
31
+ Cada módulo segue:
32
+
33
+ ```
34
+ src/<feature>/
35
+ ├── <feature>.module.ts ← define providers, controllers
36
+ ├── <feature>.controller.ts ← Handler
37
+ ├── <feature>.service.ts ← Service (uma operação) ou facade
38
+ ├── <feature>.repository.ts ← Repository (Prisma)
39
+ ├── dto/
40
+ │ ├── create-<feature>.dto.ts ← class-validator
41
+ │ └── update-<feature>.dto.ts
42
+ ├── entities/
43
+ │ └── <feature>.entity.ts ← Model
44
+ └── tests/
45
+ ├── <feature>.service.spec.ts ← unit
46
+ └── <feature>.e2e-spec.ts ← E2E
47
+ ```
48
+
49
+ ## Controllers (Handler)
50
+
51
+ ```typescript
52
+ import { Body, Controller, Post, UseGuards } from '@nestjs/common';
53
+ import { ApiTags, ApiOperation, ApiCreatedResponse } from '@nestjs/swagger';
54
+ import { JwtAuthGuard } from '@/auth/jwt-auth.guard';
55
+ import { CreateUserDto } from './dto/create-user.dto';
56
+ import { UserResponseDto } from './dto/user-response.dto';
57
+ import { RegisterUserService } from './register-user.service';
58
+
59
+ @ApiTags('users')
60
+ @Controller('users')
61
+ @UseGuards(JwtAuthGuard)
62
+ export class UsersController {
63
+ constructor(private readonly register: RegisterUserService) {}
64
+
65
+ @Post()
66
+ @ApiOperation({ summary: 'Criar novo usuário' })
67
+ @ApiCreatedResponse({ type: UserResponseDto })
68
+ async create(@Body() dto: CreateUserDto): Promise<UserResponseDto> {
69
+ const user = await this.register.execute(dto);
70
+ return UserResponseDto.from(user);
71
+ }
72
+ }
73
+ ```
74
+
75
+ ## DTOs (validação)
76
+
77
+ ```typescript
78
+ import { IsEmail, IsString, MinLength } from 'class-validator';
79
+ import { ApiProperty } from '@nestjs/swagger';
80
+
81
+ export class CreateUserDto {
82
+ @ApiProperty({ example: 'jane@example.com' })
83
+ @IsEmail()
84
+ email!: string;
85
+
86
+ @ApiProperty({ example: 'Jane Doe' })
87
+ @IsString()
88
+ name!: string;
89
+
90
+ @ApiProperty({ minLength: 12 })
91
+ @IsString()
92
+ @MinLength(12)
93
+ password!: string;
94
+ }
95
+ ```
96
+
97
+ `main.ts` ativa global pipe:
98
+ ```typescript
99
+ app.useGlobalPipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true }));
100
+ ```
101
+
102
+ ## Services (Business Logic)
103
+
104
+ Uma operação por classe:
105
+
106
+ ```typescript
107
+ import { Injectable } from '@nestjs/common';
108
+ import { hash } from '@node-rs/argon2';
109
+ import { UsersRepository } from './users.repository';
110
+ import { CreateUserDto } from './dto/create-user.dto';
111
+ import { User } from './entities/user.entity';
112
+ import { UserAlreadyExistsError } from './errors';
113
+
114
+ @Injectable()
115
+ export class RegisterUserService {
116
+ constructor(private readonly repo: UsersRepository) {}
117
+
118
+ async execute(dto: CreateUserDto): Promise<User> {
119
+ if (await this.repo.existsByEmail(dto.email)) {
120
+ throw new UserAlreadyExistsError();
121
+ }
122
+ return this.repo.create({
123
+ ...dto,
124
+ password: await hash(dto.password),
125
+ });
126
+ }
127
+ }
128
+ ```
129
+
130
+ ## Repositories (Prisma)
131
+
132
+ ```typescript
133
+ import { Injectable } from '@nestjs/common';
134
+ import { PrismaService } from '@/prisma/prisma.service';
135
+
136
+ @Injectable()
137
+ export class UsersRepository {
138
+ constructor(private readonly prisma: PrismaService) {}
139
+
140
+ async existsByEmail(email: string): Promise<boolean> {
141
+ return !!(await this.prisma.user.findUnique({ where: { email } }));
142
+ }
143
+
144
+ async create(data: { email: string; name: string; password: string }) {
145
+ return this.prisma.user.create({ data });
146
+ }
147
+ }
148
+ ```
149
+
150
+ ## Tratamento global de exceções
151
+
152
+ ```typescript
153
+ // src/common/filters/all-exceptions.filter.ts
154
+ @Catch()
155
+ export class AllExceptionsFilter implements ExceptionFilter {
156
+ catch(exception: unknown, host: ArgumentsHost) {
157
+ const ctx = host.switchToHttp();
158
+ const response = ctx.getResponse<Response>();
159
+
160
+ if (exception instanceof UserAlreadyExistsError) {
161
+ return response.status(409).json({ error: 'USER_EXISTS' });
162
+ }
163
+ if (exception instanceof HttpException) {
164
+ return response.status(exception.getStatus()).json(exception.getResponse());
165
+ }
166
+ // log + 500 genérico
167
+ return response.status(500).json({ error: 'INTERNAL' });
168
+ }
169
+ }
170
+
171
+ // main.ts
172
+ app.useGlobalFilters(new AllExceptionsFilter());
173
+ ```
174
+
175
+ ## OpenAPI auto-gerado
176
+
177
+ ```typescript
178
+ // main.ts
179
+ import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
180
+
181
+ const config = new DocumentBuilder()
182
+ .setTitle('Projeto API')
183
+ .setVersion('1.0')
184
+ .addBearerAuth()
185
+ .build();
186
+
187
+ const document = SwaggerModule.createDocument(app, config);
188
+ SwaggerModule.setup('docs', app, document); // UI em /docs
189
+ writeFileSync('./public/openapi.json', JSON.stringify(document));
190
+ ```
191
+
192
+ ## Rate limiting
193
+
194
+ ```typescript
195
+ import { ThrottlerModule } from '@nestjs/throttler';
196
+
197
+ @Module({
198
+ imports: [
199
+ ThrottlerModule.forRoot([{ ttl: 60_000, limit: 100 }]),
200
+ ],
201
+ })
202
+
203
+ // Endpoint sensível
204
+ @Throttle({ default: { limit: 5, ttl: 900_000 } }) // 5/15min
205
+ @Post('login')
206
+ async login() {...}
207
+ ```
208
+
209
+ ## Auth (JWT + Passport)
210
+
211
+ ```typescript
212
+ @Injectable()
213
+ export class JwtAuthGuard extends AuthGuard('jwt') {}
214
+
215
+ @Injectable()
216
+ export class JwtStrategy extends PassportStrategy(Strategy) {
217
+ constructor(config: ConfigService) {
218
+ super({
219
+ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
220
+ secretOrKey: config.getOrThrow('JWT_SECRET'),
221
+ });
222
+ }
223
+ async validate(payload: any) {
224
+ return { id: payload.sub, email: payload.email };
225
+ }
226
+ }
227
+ ```
228
+
229
+ ## Testes
230
+
231
+ ### Unit (service)
232
+
233
+ ```typescript
234
+ describe('RegisterUserService', () => {
235
+ it('falha se email já existe', async () => {
236
+ const repo = { existsByEmail: jest.fn().mockResolvedValue(true) } as any;
237
+ const sut = new RegisterUserService(repo);
238
+ await expect(sut.execute({ email: 'x@y.com', name: 'X', password: 'longsecret123' }))
239
+ .rejects.toThrow(UserAlreadyExistsError);
240
+ });
241
+ });
242
+ ```
243
+
244
+ ### E2E (Supertest)
245
+
246
+ ```typescript
247
+ describe('POST /users', () => {
248
+ it('cria usuário com sucesso', async () => {
249
+ const res = await request(app.getHttpServer())
250
+ .post('/users')
251
+ .set('Authorization', `Bearer ${adminToken}`)
252
+ .send({ email: 'jane@example.com', name: 'Jane', password: 'longsecret123' });
253
+ expect(res.status).toBe(201);
254
+ expect(res.body.email).toBe('jane@example.com');
255
+ });
256
+ });
257
+ ```
258
+
259
+ ## Antipatterns
260
+
261
+ | AP | Antipattern | Correção |
262
+ |---|---|---|
263
+ | AP-01 | Validação inline no Controller | DTO + ValidationPipe |
264
+ | AP-02 | Prisma direto no Controller | Repository |
265
+ | AP-03 | Lógica no Controller | Service |
266
+ | AP-04 | Sem DTO de saída | `UserResponseDto.from(user)` |
267
+ | AP-05 | `JwtStrategy` com secret hardcoded | `ConfigService.getOrThrow` |
268
+ | AP-06 | Sem `@nestjs/throttler` em login | rate limit obrigatório |
269
+ | AP-07 | OpenAPI escrito à mão | `@nestjs/swagger` decorators |
270
+ | AP-08 | Erros sem filter global | inconsistência de response |
271
+
272
+ ## Segurança (combinar com `dare-security`)
273
+
274
+ - Hash com `@node-rs/argon2` (Argon2id)
275
+ - JWT: RS256 para tokens públicos, HS256 + secret ≥256 bits para internos
276
+ - `helmet` middleware para headers
277
+ - CORS específico, nunca `*`
278
+ - Rate limit em login (5/15min) + APIs públicas
279
+ - Refresh token com rotação no DB
280
+
281
+ ## Validação no CI
282
+
283
+ ```bash
284
+ npm run lint
285
+ npm run test
286
+ npm run test:e2e
287
+ npm run build
288
+ npx prisma migrate deploy --dry-run # valida migrations
289
+ npm audit --audit-level=high
290
+ ```
291
+
292
+ ## Como aplicar
293
+
294
+ ### Passo 1: Audit
295
+
296
+ ```bash
297
+ grep -rn "@Body()" src/ | grep -v "Dto" # AP-01
298
+ grep -rn "prisma\." src/*/controllers/ # AP-02
299
+ grep -rn "JwtStrategy" src/ | grep -v Config # AP-05
300
+ ```
301
+
302
+ ### Passo 2: Migrar para DTOs
303
+
304
+ Para cada `@Body() body: any`, criar DTO com class-validator + `@ApiProperty`.
305
+
306
+ ### Passo 3: Extrair Services
307
+
308
+ Toda lógica > 5 linhas em Controller → Service injetável.
309
+
310
+ ### Passo 4: Adicionar Repositories
311
+
312
+ Encapsular Prisma. Controller chama Service, Service chama Repository.
313
+
314
+ ### Passo 5: Configurar Swagger + throttler
315
+
316
+ `main.ts` com `SwaggerModule.setup` e exportar `public/openapi.json`. Adicionar `ThrottlerModule` global.
317
+
318
+ ## Dicas
319
+
320
+ - **Combine** com `dare-docker` para PHP-FPM-style separação (Node + Postgres + Redis)
321
+ - **Use** `dare-llm-integration` se houver chamadas LLM
322
+ - **Para realtime**, use `@nestjs/websockets` + skill `dare-realtime`
323
+
324
+ ---
325
+
326
+ Esta skill é parte do DARE Method e está sob licença MIT.