@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,371 +1,371 @@
1
- ---
2
- description: Padrões DARE para APIs REST em Go + Gin (ou stdlib net/http) + sqlc + PostgreSQL. Handlers, services, repositories, middleware, validação via binding tags, JWT, rate limit, swag OpenAPI, testify + httptest.
3
- globs: **/*.go,go.mod,go.sum,sqlc.yaml,db/queries/*.sql
4
- alwaysApply: false
5
- ---
6
-
7
- # Skill: Go/Gin API DARE
8
-
9
- Você é um desenvolvedor sênior Go especialista em APIs REST. Esta skill garante código **idiomático Go, com erros tipados, contexto sempre propagado, queries seguras via sqlc**, seguindo Layered Design DARE.
10
-
11
- ## Stack canônica
12
-
13
- - **Go 1.22+** (`slog`, `errors.Is/As`, generics)
14
- - **Gin** (preferido) ou **stdlib net/http** (Go 1.22+ roteamento OK)
15
- - **sqlc** para queries seguras (gera código tipado de SQL)
16
- - **pgx v5** como driver Postgres
17
- - **go-playground/validator** (via Gin binding tags)
18
- - **golang-jwt/jwt v5**
19
- - **swaggo/swag** para OpenAPI
20
- - **testify** + **httptest**
21
- - **golangci-lint** + **govulncheck**
22
-
23
- ---
24
-
25
- ## Estrutura
26
-
27
- ```
28
- .
29
- ├── cmd/server/main.go
30
- ├── internal/
31
- │ ├── handlers/ ← Handler
32
- │ ├── services/ ← Service
33
- │ ├── repositories/ ← Repository
34
- │ ├── domain/ ← Models + erros sentinela
35
- │ ├── middleware/ ← auth, logging, recovery
36
- │ └── config/
37
- ├── db/
38
- │ ├── migrations/ ← golang-migrate
39
- │ └── queries/ ← arquivos .sql para sqlc
40
- ├── sqlc.yaml
41
- └── docs/ ← gerado pelo swag
42
- ```
43
-
44
- ---
45
-
46
- ## Handlers
47
-
48
- ```go
49
- package handlers
50
-
51
- import (
52
- "errors"
53
- "net/http"
54
- "github.com/gin-gonic/gin"
55
- "myapp/internal/domain"
56
- "myapp/internal/services"
57
- )
58
-
59
- type UserHandler struct {
60
- register *services.RegisterUser
61
- }
62
-
63
- func NewUserHandler(r *services.RegisterUser) *UserHandler {
64
- return &UserHandler{register: r}
65
- }
66
-
67
- // @Summary Create user
68
- // @Tags users
69
- // @Accept json
70
- // @Produce json
71
- // @Param user body CreateUserDTO true "user payload"
72
- // @Success 201 {object} UserResponse
73
- // @Failure 409
74
- // @Router /users [post]
75
- func (h *UserHandler) Create(c *gin.Context) {
76
- var dto CreateUserDTO
77
- if err := c.ShouldBindJSON(&dto); err != nil {
78
- c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
79
- return
80
- }
81
- user, err := h.register.Execute(c.Request.Context(), dto.ToService())
82
- if err != nil {
83
- if errors.Is(err, domain.ErrUserAlreadyExists) {
84
- c.JSON(http.StatusConflict, gin.H{"error": "USER_EXISTS"})
85
- return
86
- }
87
- c.JSON(http.StatusInternalServerError, gin.H{"error": "INTERNAL"})
88
- return
89
- }
90
- c.JSON(http.StatusCreated, ToUserResponse(user))
91
- }
92
- ```
93
-
94
- ---
95
-
96
- ## DTOs (binding tags)
97
-
98
- ```go
99
- type CreateUserDTO struct {
100
- Email string `json:"email" binding:"required,email"`
101
- Name string `json:"name" binding:"required,min=1,max=255"`
102
- Password string `json:"password" binding:"required,min=12"`
103
- }
104
-
105
- func (d CreateUserDTO) ToService() services.RegisterUserInput {
106
- return services.RegisterUserInput{Email: d.Email, Name: d.Name, Password: d.Password}
107
- }
108
-
109
- type UserResponse struct {
110
- ID int64 `json:"id"`
111
- Email string `json:"email"`
112
- Name string `json:"name"`
113
- CreatedAt time.Time `json:"createdAt"`
114
- }
115
- ```
116
-
117
- ---
118
-
119
- ## Services
120
-
121
- ```go
122
- type RegisterUser struct {
123
- repo *repositories.UserRepository
124
- }
125
-
126
- type RegisterUserInput struct {
127
- Email, Name, Password string
128
- }
129
-
130
- func (s *RegisterUser) Execute(ctx context.Context, in RegisterUserInput) (*domain.User, error) {
131
- exists, err := s.repo.ExistsByEmail(ctx, in.Email)
132
- if err != nil { return nil, err }
133
- if exists { return nil, domain.ErrUserAlreadyExists }
134
- return s.repo.Create(ctx, repositories.CreateUserParams{
135
- Email: in.Email,
136
- Name: in.Name,
137
- PasswordHash: hashPassword(in.Password),
138
- })
139
- }
140
- ```
141
-
142
- ---
143
-
144
- ## Repositories (sqlc)
145
-
146
- ```sql
147
- -- db/queries/users.sql
148
- -- name: ExistsUserByEmail :one
149
- SELECT EXISTS(SELECT 1 FROM users WHERE email = $1);
150
-
151
- -- name: CreateUser :one
152
- INSERT INTO users (email, name, password_hash)
153
- VALUES ($1, $2, $3)
154
- RETURNING id, email, name, created_at;
155
- ```
156
-
157
- ```go
158
- type UserRepository struct {
159
- q *sqlc.Queries
160
- }
161
-
162
- func (r *UserRepository) ExistsByEmail(ctx context.Context, email string) (bool, error) {
163
- return r.q.ExistsUserByEmail(ctx, email)
164
- }
165
- ```
166
-
167
- ---
168
-
169
- ## Domain
170
-
171
- ```go
172
- package domain
173
-
174
- import (
175
- "errors"
176
- "time"
177
- )
178
-
179
- var (
180
- ErrUserAlreadyExists = errors.New("user already exists")
181
- ErrUserNotFound = errors.New("user not found")
182
- )
183
-
184
- type User struct {
185
- ID int64
186
- Email string
187
- Name string
188
- CreatedAt time.Time
189
- }
190
- ```
191
-
192
- ---
193
-
194
- ## Middleware (JWT)
195
-
196
- ```go
197
- func AuthRequired(secret []byte) gin.HandlerFunc {
198
- return func(c *gin.Context) {
199
- tokenStr := strings.TrimPrefix(c.GetHeader("Authorization"), "Bearer ")
200
- token, err := jwt.Parse(tokenStr, func(t *jwt.Token) (any, error) { return secret, nil })
201
- if err != nil || !token.Valid {
202
- c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
203
- return
204
- }
205
- c.Set("user_id", token.Claims.(jwt.MapClaims)["sub"])
206
- c.Next()
207
- }
208
- }
209
- ```
210
-
211
- ---
212
-
213
- ## Rate limiting
214
-
215
- ```go
216
- import "github.com/gin-contrib/limit"
217
-
218
- router.Use(limit.MaxAllowed(20)) // global
219
- login := router.Group("/auth").Use(myRateLimiter("5/15m"))
220
- login.POST("/login", authHandler.Login)
221
- ```
222
-
223
- ---
224
-
225
- ## OpenAPI (swag)
226
-
227
- ```bash
228
- swag init -g cmd/server/main.go -o docs
229
- ```
230
-
231
- ```go
232
- // cmd/server/main.go
233
- // @title Projeto API
234
- // @version 1.0
235
- import _ "myapp/docs"
236
- import (
237
- ginSwagger "github.com/swaggo/gin-swagger"
238
- swaggerFiles "github.com/swaggo/files"
239
- )
240
-
241
- router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
242
- router.GET("/openapi.json", func(c *gin.Context) {
243
- c.File("docs/swagger.json")
244
- })
245
- ```
246
-
247
- ---
248
-
249
- ## Config (env)
250
-
251
- ```go
252
- type Config struct {
253
- DatabaseURL string
254
- JWTSecret []byte
255
- }
256
-
257
- func Load() (*Config, error) {
258
- return &Config{
259
- DatabaseURL: os.Getenv("DATABASE_URL"),
260
- JWTSecret: []byte(os.Getenv("JWT_SECRET")),
261
- }, nil
262
- }
263
- ```
264
-
265
- ---
266
-
267
- ## Testes
268
-
269
- ```go
270
- // Service unit
271
- func TestRegisterUser_DuplicateEmail(t *testing.T) {
272
- repo := &mocks.UserRepository{}
273
- repo.On("ExistsByEmail", mock.Anything, "jane@example.com").Return(true, nil)
274
- svc := services.NewRegisterUser(repo)
275
- _, err := svc.Execute(ctx, services.RegisterUserInput{Email: "jane@example.com"})
276
- assert.ErrorIs(t, err, domain.ErrUserAlreadyExists)
277
- }
278
-
279
- // Handler via httptest
280
- func TestUserHandler_Create(t *testing.T) {
281
- r := gin.New()
282
- r.POST("/users", h.Create)
283
- body := `{"email":"jane@example.com","name":"Jane","password":"longsecret123"}`
284
- req := httptest.NewRequest("POST", "/users", strings.NewReader(body))
285
- req.Header.Set("Content-Type", "application/json")
286
- w := httptest.NewRecorder()
287
- r.ServeHTTP(w, req)
288
- assert.Equal(t, http.StatusCreated, w.Code)
289
- }
290
- ```
291
-
292
- ---
293
-
294
- ## Antipatterns
295
-
296
- | AP | Antipattern | Correção |
297
- |---|---|---|
298
- | AP-01 | `database/sql` no handler | Repository + sqlc |
299
- | AP-02 | Validação manual | `binding:` tags + validator |
300
- | AP-03 | Lógica no handler | Service |
301
- | AP-04 | Retornar `db.User` direto | `UserResponse` DTO |
302
- | AP-05 | Secret hardcoded | `os.Getenv` ou viper |
303
- | AP-06 | Sem rate limit em login | middleware |
304
- | AP-07 | `panic` em handler | recovery middleware |
305
- | AP-08 | Context não propagado | sempre `ctx context.Context` |
306
- | AP-09 | SQL com `fmt.Sprintf` | sqlc / parametrizado |
307
- | AP-10 | `errors.New` espalhado | sentinela em `domain/errors.go` |
308
-
309
- ---
310
-
311
- ## Segurança
312
-
313
- - Senhas: `argon2.IDKey` (`golang.org/x/crypto/argon2`)
314
- - JWT: HS256 secret ≥ 32 bytes, ou RS256 par de chaves
315
- - Headers: `secure` middleware
316
- - CORS: `github.com/gin-contrib/cors` com origens específicas
317
- - Rate limit em login (5/15min)
318
-
319
- ---
320
-
321
- ## CI
322
-
323
- ```bash
324
- go vet ./...
325
- golangci-lint run
326
- go test ./... -race -cover
327
- govulncheck ./...
328
- ```
329
-
330
- ---
331
-
332
- ## Aplicação por fase DARE
333
-
334
- ### Design
335
- - Endpoints REST com método/path/auth
336
- - Schemas de input/output
337
- - Erros sentinela esperados
338
-
339
- ### Blueprint
340
- - Estrutura `internal/{handlers,services,repositories,domain}`
341
- - `sqlc.yaml` configurado
342
- - Migrations `golang-migrate`
343
-
344
- ### Tasks
345
- - Por feature: 5 tasks (Migration, sqlc query, Repository, Service, Handler+DTO)
346
- - Task de configuração middleware + swag + golangci-lint
347
-
348
- ### Execute
349
- - Ralph Loop:
350
- ```bash
351
- go vet ./... && golangci-lint run && go test ./... -race && govulncheck ./...
352
- ```
353
-
354
- ---
355
-
356
- ## Checklist final
357
-
358
- - [ ] Go 1.22+, golangci-lint configurado
359
- - [ ] sqlc gerando queries a partir de SQL
360
- - [ ] Handlers magros (apenas bind + chamada Service)
361
- - [ ] Services com `ctx context.Context` como 1º param
362
- - [ ] Erros sentinela em `domain/errors.go`
363
- - [ ] DTOs com `binding:` tags
364
- - [ ] JWT secret via env
365
- - [ ] Rate limit em login
366
- - [ ] OpenAPI gerado em `docs/swagger.json`
367
- - [ ] Cobertura ≥ 70%
368
-
369
- ---
370
-
371
- Skill licenciada MIT — parte do DARE Method v3.
1
+ ---
2
+ description: Padrões DARE para APIs REST em Go + Gin (ou stdlib net/http) + sqlc + PostgreSQL. Handlers, services, repositories, middleware, validação via binding tags, JWT, rate limit, swag OpenAPI, testify + httptest.
3
+ globs: **/*.go,go.mod,go.sum,sqlc.yaml,db/queries/*.sql
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Skill: Go/Gin API DARE
8
+
9
+ Você é um desenvolvedor sênior Go especialista em APIs REST. Esta skill garante código **idiomático Go, com erros tipados, contexto sempre propagado, queries seguras via sqlc**, seguindo Layered Design DARE.
10
+
11
+ ## Stack canônica
12
+
13
+ - **Go 1.22+** (`slog`, `errors.Is/As`, generics)
14
+ - **Gin** (preferido) ou **stdlib net/http** (Go 1.22+ roteamento OK)
15
+ - **sqlc** para queries seguras (gera código tipado de SQL)
16
+ - **pgx v5** como driver Postgres
17
+ - **go-playground/validator** (via Gin binding tags)
18
+ - **golang-jwt/jwt v5**
19
+ - **swaggo/swag** para OpenAPI
20
+ - **testify** + **httptest**
21
+ - **golangci-lint** + **govulncheck**
22
+
23
+ ---
24
+
25
+ ## Estrutura
26
+
27
+ ```
28
+ .
29
+ ├── cmd/server/main.go
30
+ ├── internal/
31
+ │ ├── handlers/ ← Handler
32
+ │ ├── services/ ← Service
33
+ │ ├── repositories/ ← Repository
34
+ │ ├── domain/ ← Models + erros sentinela
35
+ │ ├── middleware/ ← auth, logging, recovery
36
+ │ └── config/
37
+ ├── db/
38
+ │ ├── migrations/ ← golang-migrate
39
+ │ └── queries/ ← arquivos .sql para sqlc
40
+ ├── sqlc.yaml
41
+ └── docs/ ← gerado pelo swag
42
+ ```
43
+
44
+ ---
45
+
46
+ ## Handlers
47
+
48
+ ```go
49
+ package handlers
50
+
51
+ import (
52
+ "errors"
53
+ "net/http"
54
+ "github.com/gin-gonic/gin"
55
+ "myapp/internal/domain"
56
+ "myapp/internal/services"
57
+ )
58
+
59
+ type UserHandler struct {
60
+ register *services.RegisterUser
61
+ }
62
+
63
+ func NewUserHandler(r *services.RegisterUser) *UserHandler {
64
+ return &UserHandler{register: r}
65
+ }
66
+
67
+ // @Summary Create user
68
+ // @Tags users
69
+ // @Accept json
70
+ // @Produce json
71
+ // @Param user body CreateUserDTO true "user payload"
72
+ // @Success 201 {object} UserResponse
73
+ // @Failure 409
74
+ // @Router /users [post]
75
+ func (h *UserHandler) Create(c *gin.Context) {
76
+ var dto CreateUserDTO
77
+ if err := c.ShouldBindJSON(&dto); err != nil {
78
+ c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
79
+ return
80
+ }
81
+ user, err := h.register.Execute(c.Request.Context(), dto.ToService())
82
+ if err != nil {
83
+ if errors.Is(err, domain.ErrUserAlreadyExists) {
84
+ c.JSON(http.StatusConflict, gin.H{"error": "USER_EXISTS"})
85
+ return
86
+ }
87
+ c.JSON(http.StatusInternalServerError, gin.H{"error": "INTERNAL"})
88
+ return
89
+ }
90
+ c.JSON(http.StatusCreated, ToUserResponse(user))
91
+ }
92
+ ```
93
+
94
+ ---
95
+
96
+ ## DTOs (binding tags)
97
+
98
+ ```go
99
+ type CreateUserDTO struct {
100
+ Email string `json:"email" binding:"required,email"`
101
+ Name string `json:"name" binding:"required,min=1,max=255"`
102
+ Password string `json:"password" binding:"required,min=12"`
103
+ }
104
+
105
+ func (d CreateUserDTO) ToService() services.RegisterUserInput {
106
+ return services.RegisterUserInput{Email: d.Email, Name: d.Name, Password: d.Password}
107
+ }
108
+
109
+ type UserResponse struct {
110
+ ID int64 `json:"id"`
111
+ Email string `json:"email"`
112
+ Name string `json:"name"`
113
+ CreatedAt time.Time `json:"createdAt"`
114
+ }
115
+ ```
116
+
117
+ ---
118
+
119
+ ## Services
120
+
121
+ ```go
122
+ type RegisterUser struct {
123
+ repo *repositories.UserRepository
124
+ }
125
+
126
+ type RegisterUserInput struct {
127
+ Email, Name, Password string
128
+ }
129
+
130
+ func (s *RegisterUser) Execute(ctx context.Context, in RegisterUserInput) (*domain.User, error) {
131
+ exists, err := s.repo.ExistsByEmail(ctx, in.Email)
132
+ if err != nil { return nil, err }
133
+ if exists { return nil, domain.ErrUserAlreadyExists }
134
+ return s.repo.Create(ctx, repositories.CreateUserParams{
135
+ Email: in.Email,
136
+ Name: in.Name,
137
+ PasswordHash: hashPassword(in.Password),
138
+ })
139
+ }
140
+ ```
141
+
142
+ ---
143
+
144
+ ## Repositories (sqlc)
145
+
146
+ ```sql
147
+ -- db/queries/users.sql
148
+ -- name: ExistsUserByEmail :one
149
+ SELECT EXISTS(SELECT 1 FROM users WHERE email = $1);
150
+
151
+ -- name: CreateUser :one
152
+ INSERT INTO users (email, name, password_hash)
153
+ VALUES ($1, $2, $3)
154
+ RETURNING id, email, name, created_at;
155
+ ```
156
+
157
+ ```go
158
+ type UserRepository struct {
159
+ q *sqlc.Queries
160
+ }
161
+
162
+ func (r *UserRepository) ExistsByEmail(ctx context.Context, email string) (bool, error) {
163
+ return r.q.ExistsUserByEmail(ctx, email)
164
+ }
165
+ ```
166
+
167
+ ---
168
+
169
+ ## Domain
170
+
171
+ ```go
172
+ package domain
173
+
174
+ import (
175
+ "errors"
176
+ "time"
177
+ )
178
+
179
+ var (
180
+ ErrUserAlreadyExists = errors.New("user already exists")
181
+ ErrUserNotFound = errors.New("user not found")
182
+ )
183
+
184
+ type User struct {
185
+ ID int64
186
+ Email string
187
+ Name string
188
+ CreatedAt time.Time
189
+ }
190
+ ```
191
+
192
+ ---
193
+
194
+ ## Middleware (JWT)
195
+
196
+ ```go
197
+ func AuthRequired(secret []byte) gin.HandlerFunc {
198
+ return func(c *gin.Context) {
199
+ tokenStr := strings.TrimPrefix(c.GetHeader("Authorization"), "Bearer ")
200
+ token, err := jwt.Parse(tokenStr, func(t *jwt.Token) (any, error) { return secret, nil })
201
+ if err != nil || !token.Valid {
202
+ c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
203
+ return
204
+ }
205
+ c.Set("user_id", token.Claims.(jwt.MapClaims)["sub"])
206
+ c.Next()
207
+ }
208
+ }
209
+ ```
210
+
211
+ ---
212
+
213
+ ## Rate limiting
214
+
215
+ ```go
216
+ import "github.com/gin-contrib/limit"
217
+
218
+ router.Use(limit.MaxAllowed(20)) // global
219
+ login := router.Group("/auth").Use(myRateLimiter("5/15m"))
220
+ login.POST("/login", authHandler.Login)
221
+ ```
222
+
223
+ ---
224
+
225
+ ## OpenAPI (swag)
226
+
227
+ ```bash
228
+ swag init -g cmd/server/main.go -o docs
229
+ ```
230
+
231
+ ```go
232
+ // cmd/server/main.go
233
+ // @title Projeto API
234
+ // @version 1.0
235
+ import _ "myapp/docs"
236
+ import (
237
+ ginSwagger "github.com/swaggo/gin-swagger"
238
+ swaggerFiles "github.com/swaggo/files"
239
+ )
240
+
241
+ router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
242
+ router.GET("/openapi.json", func(c *gin.Context) {
243
+ c.File("docs/swagger.json")
244
+ })
245
+ ```
246
+
247
+ ---
248
+
249
+ ## Config (env)
250
+
251
+ ```go
252
+ type Config struct {
253
+ DatabaseURL string
254
+ JWTSecret []byte
255
+ }
256
+
257
+ func Load() (*Config, error) {
258
+ return &Config{
259
+ DatabaseURL: os.Getenv("DATABASE_URL"),
260
+ JWTSecret: []byte(os.Getenv("JWT_SECRET")),
261
+ }, nil
262
+ }
263
+ ```
264
+
265
+ ---
266
+
267
+ ## Testes
268
+
269
+ ```go
270
+ // Service unit
271
+ func TestRegisterUser_DuplicateEmail(t *testing.T) {
272
+ repo := &mocks.UserRepository{}
273
+ repo.On("ExistsByEmail", mock.Anything, "jane@example.com").Return(true, nil)
274
+ svc := services.NewRegisterUser(repo)
275
+ _, err := svc.Execute(ctx, services.RegisterUserInput{Email: "jane@example.com"})
276
+ assert.ErrorIs(t, err, domain.ErrUserAlreadyExists)
277
+ }
278
+
279
+ // Handler via httptest
280
+ func TestUserHandler_Create(t *testing.T) {
281
+ r := gin.New()
282
+ r.POST("/users", h.Create)
283
+ body := `{"email":"jane@example.com","name":"Jane","password":"longsecret123"}`
284
+ req := httptest.NewRequest("POST", "/users", strings.NewReader(body))
285
+ req.Header.Set("Content-Type", "application/json")
286
+ w := httptest.NewRecorder()
287
+ r.ServeHTTP(w, req)
288
+ assert.Equal(t, http.StatusCreated, w.Code)
289
+ }
290
+ ```
291
+
292
+ ---
293
+
294
+ ## Antipatterns
295
+
296
+ | AP | Antipattern | Correção |
297
+ |---|---|---|
298
+ | AP-01 | `database/sql` no handler | Repository + sqlc |
299
+ | AP-02 | Validação manual | `binding:` tags + validator |
300
+ | AP-03 | Lógica no handler | Service |
301
+ | AP-04 | Retornar `db.User` direto | `UserResponse` DTO |
302
+ | AP-05 | Secret hardcoded | `os.Getenv` ou viper |
303
+ | AP-06 | Sem rate limit em login | middleware |
304
+ | AP-07 | `panic` em handler | recovery middleware |
305
+ | AP-08 | Context não propagado | sempre `ctx context.Context` |
306
+ | AP-09 | SQL com `fmt.Sprintf` | sqlc / parametrizado |
307
+ | AP-10 | `errors.New` espalhado | sentinela em `domain/errors.go` |
308
+
309
+ ---
310
+
311
+ ## Segurança
312
+
313
+ - Senhas: `argon2.IDKey` (`golang.org/x/crypto/argon2`)
314
+ - JWT: HS256 secret ≥ 32 bytes, ou RS256 par de chaves
315
+ - Headers: `secure` middleware
316
+ - CORS: `github.com/gin-contrib/cors` com origens específicas
317
+ - Rate limit em login (5/15min)
318
+
319
+ ---
320
+
321
+ ## CI
322
+
323
+ ```bash
324
+ go vet ./...
325
+ golangci-lint run
326
+ go test ./... -race -cover
327
+ govulncheck ./...
328
+ ```
329
+
330
+ ---
331
+
332
+ ## Aplicação por fase DARE
333
+
334
+ ### Design
335
+ - Endpoints REST com método/path/auth
336
+ - Schemas de input/output
337
+ - Erros sentinela esperados
338
+
339
+ ### Blueprint
340
+ - Estrutura `internal/{handlers,services,repositories,domain}`
341
+ - `sqlc.yaml` configurado
342
+ - Migrations `golang-migrate`
343
+
344
+ ### Tasks
345
+ - Por feature: 5 tasks (Migration, sqlc query, Repository, Service, Handler+DTO)
346
+ - Task de configuração middleware + swag + golangci-lint
347
+
348
+ ### Execute
349
+ - Ralph Loop:
350
+ ```bash
351
+ go vet ./... && golangci-lint run && go test ./... -race && govulncheck ./...
352
+ ```
353
+
354
+ ---
355
+
356
+ ## Checklist final
357
+
358
+ - [ ] Go 1.22+, golangci-lint configurado
359
+ - [ ] sqlc gerando queries a partir de SQL
360
+ - [ ] Handlers magros (apenas bind + chamada Service)
361
+ - [ ] Services com `ctx context.Context` como 1º param
362
+ - [ ] Erros sentinela em `domain/errors.go`
363
+ - [ ] DTOs com `binding:` tags
364
+ - [ ] JWT secret via env
365
+ - [ ] Rate limit em login
366
+ - [ ] OpenAPI gerado em `docs/swagger.json`
367
+ - [ ] Cobertura ≥ 70%
368
+
369
+ ---
370
+
371
+ Skill licenciada MIT — parte do DARE Method v3.