@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,312 +1,312 @@
1
- ---
2
- description: Decisão e migração de Cargo workspace multi-crate para projetos Rust/Axum. Use durante design/blueprint para decidir o layout, ou quando um projeto single-crate cresceu além do que comporta confortavelmente.
3
- globs: src/**/*.rs,Cargo.toml,DARE/DESIGN.md,DARE/BLUEPRINT.md
4
- alwaysApply: false
5
- ---
6
-
7
- # Skill: Rust workspace — single-crate vs multi-crate
8
-
9
- Esta skill cobre dois cenários relacionados:
10
-
11
- - **Cenário A** — você está gerando `DESIGN.md`/`BLUEPRINT.md` de um projeto
12
- Rust/Axum e precisa decidir desde já se ele nasce single-crate ou em
13
- workspace.
14
- - **Cenário B** — o projeto Rust **já existe** em single-crate e cresceu ao
15
- ponto de doer (compilação lenta, fronteiras arquiteturais erodindo,
16
- workers acoplados ao API server). Você precisa propor um plano de
17
- migração para workspace.
18
-
19
- A regra geral: **comece simples, migre quando os critérios objetivos
20
- abaixo aparecerem.** Workspace é a estrutura idiomática Rust para projetos
21
- maduros, mas é overengineering para o "hello world".
22
-
23
- ---
24
-
25
- ## Cenário A — Decisão na fase Design/Blueprint
26
-
27
- Antes de escrever o BLUEPRINT da stack `rust-axum`, decida: single-crate
28
- ou workspace? Os critérios são objetivos:
29
-
30
- ### Comece **single-crate** quando TODOS forem verdadeiros
31
-
32
- - Apenas **1 binário** (HTTP server).
33
- - Estimativa de **< 30 arquivos `.rs`** no `src/`.
34
- - **1–2 sistemas externos** (apenas DB; ou DB + cache).
35
- - **Equipe ≤ 2 devs** trabalhando ativamente.
36
- - Nenhum requisito de deploy independente para subcomponentes.
37
-
38
- ### Comece **workspace multi-crate** quando QUALQUER um for verdadeiro
39
-
40
- - **≥ 2 binários** previstos (API + worker; API + admin; API + CLI).
41
- - **Múltiplos sistemas externos** (3+: PG + Redis + Rabbit + Qdrant +
42
- Neo4j + …).
43
- - **Deploy independente** desejado (workers em pods separados no k8s,
44
- scaling independente).
45
- - **Fronteiras arquiteturais** críticas (domain puro sem HTTP/DB; SDK que
46
- vai virar crate público; biblioteca de cliente compartilhada com outras
47
- apps).
48
- - **Equipe ≥ 3 devs** trabalhando em módulos diferentes em paralelo.
49
-
50
- ### Layout convencional para workspace
51
-
52
- Use o prefixo do projeto (`<p>`) como namespace de todos os crates — por
53
- exemplo `wa-` para uma `wa-business-api`, `agent-` para um `agent-ai`,
54
- `chat-` para um `chat-service`.
55
-
56
- ```
57
- projeto/
58
- ├── Cargo.toml # workspace root, deps centralizadas
59
- ├── docker-compose.yml
60
- ├── Dockerfile
61
- ├── crates/
62
- │ ├── <p>-domain/ (lib) # entities puras: structs, errors, types
63
- │ ├── <p>-config/ (lib) # AppConfig::from_env()
64
- │ ├── <p>-db/ (lib) # sqlx pool, migrations
65
- │ ├── <p>-cache/ (lib) # redis/moka (se houver)
66
- │ ├── <p>-queue/ (lib) # lapin/kafka (se houver)
67
- │ ├── <p>-crypto/ (lib) # bcrypt, jwt, aes (se aplicável)
68
- │ ├── <p>-meta-client/ (lib) # cliente externo (Meta API, Stripe…)
69
- │ ├── <p>-services/ (lib) # business logic, sem HTTP
70
- │ ├── <p>-api/ (bin + lib) # HTTP server (handlers, router, mw)
71
- │ ├── <p>-worker-<X>/ (bin) # 1 binário por tipo de worker
72
- │ ├── <p>-admin/ (bin) # CLI admin (se houver)
73
- │ └── <p>-e2e/ (tests) # integration tests cross-crate
74
- └── xtask/ # scripts de build/dev em Rust
75
- ```
76
-
77
- Granularidade: **um crate por bounded context**, não por arquivo. Resista
78
- ao "crate util" / "crate common" — vira lixeira.
79
-
80
- ### Template de `Cargo.toml` raiz (workspace)
81
-
82
- ```toml
83
- [workspace]
84
- resolver = "2"
85
- members = [
86
- "crates/<p>-domain",
87
- "crates/<p>-config",
88
- "crates/<p>-db",
89
- "crates/<p>-services",
90
- "crates/<p>-api",
91
- "crates/<p>-worker-x",
92
- "crates/<p>-e2e",
93
- "xtask",
94
- ]
95
-
96
- [workspace.package]
97
- version = "0.1.0"
98
- edition = "2021"
99
- rust-version = "1.80"
100
- license = "Proprietary"
101
-
102
- [workspace.dependencies]
103
- # Runtime
104
- tokio = { version = "1.40", features = ["full"] }
105
- async-trait = "0.1"
106
-
107
- # Web
108
- axum = { version = "0.7", features = ["macros"] }
109
- tower = "0.5"
110
- tower-http = { version = "0.6", features = ["cors", "trace", "timeout"] }
111
-
112
- # Serialization
113
- serde = { version = "1.0", features = ["derive"] }
114
- serde_json = "1.0"
115
-
116
- # Database
117
- sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "uuid", "chrono", "migrate"] }
118
-
119
- # Errors / observability
120
- thiserror = "1.0"
121
- anyhow = "1.0"
122
- tracing = "0.1"
123
- tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
124
-
125
- # Types
126
- uuid = { version = "1.10", features = ["v4", "serde"] }
127
- chrono = { version = "0.4", features = ["serde"] }
128
-
129
- [profile.release]
130
- opt-level = 3
131
- lto = "thin"
132
- codegen-units = 1
133
- strip = true
134
- ```
135
-
136
- Cada crate filho herda via `version.workspace = true` e
137
- `<dep> = { workspace = true }` — assim você atualiza axum/tokio/etc. em
138
- **uma linha** no root.
139
-
140
- ### Diagrama no BLUEPRINT.md
141
-
142
- Sempre desenhe o grafo de dependências em Mermaid. Exemplo:
143
-
144
- ```mermaid
145
- graph TD
146
- api[<p>-api]
147
- admin[<p>-admin]
148
- worker[<p>-worker-flow]
149
- services[<p>-services]
150
- db[<p>-db]
151
- cache[<p>-cache]
152
- queue[<p>-queue]
153
- domain[<p>-domain]
154
-
155
- api --> services
156
- admin --> services
157
- worker --> services
158
- services --> db
159
- services --> cache
160
- services --> queue
161
- services --> domain
162
- db --> domain
163
- ```
164
-
165
- Regras de seta:
166
- - **`<p>-domain` no fundo:** ninguém depende para baixo dele.
167
- - **`<p>-services` no meio:** depende de domain/db/cache/queue, NUNCA de api.
168
- - **Binários (api, admin, worker) no topo:** dependem de services, nunca
169
- um do outro.
170
-
171
- ---
172
-
173
- ## Cenário B — Migração de single-crate para workspace
174
-
175
- Use quando você herda um projeto single-crate maduro e percebe que está
176
- apertando.
177
-
178
- ### Sintomas objetivos de "hora de migrar"
179
-
180
- - `src/` tem **> 30 arquivos `.rs`** ou **> 6 subpastas top-level**.
181
- - Existem múltiplos "domínios verticais" misturados (`handlers`, `services`,
182
- `repositories`, `workers`, `integrators`, `mcp`, `acp`, `skills`, `tools`…).
183
- - Workers usam `tokio::spawn` no mesmo processo do API server (não
184
- conseguem escalar independente).
185
- - `cargo build` incremental > 10s.
186
- - Múltiplas pessoas mexem no mesmo crate, gerando conflitos de merge
187
- frequentes.
188
- - Quer expor parte do código (cliente, SDK) como crate publicável.
189
-
190
- ### Plano de migração em 4 PRs
191
-
192
- Migração **incremental**, NUNCA big-bang. Cada PR deve passar build/test
193
- no fim e ser deployável.
194
-
195
- #### PR 1 — Workers (mais isolados, menor risco)
196
-
197
- ```
198
- src/workers/ → crates/<p>-worker-<nome>/
199
- ├── Cargo.toml
200
- └── src/main.rs (era workers/<nome>.rs)
201
- ```
202
-
203
- - Cada `tokio::spawn(worker_x)` que estava no `main.rs` da API vira um
204
- **binário próprio**.
205
- - O API server **para de fazer `start_workers()`** — workers sobem como
206
- processo independente.
207
- - `docker-compose.yml` ganha um `service` novo por worker, com `command:
208
- ["./<p>-worker-<nome>"]`.
209
- - Em produção (k8s), cada worker vira um Deployment com seu próprio
210
- scaling.
211
-
212
- #### PR 2 — Integrators (clientes externos)
213
-
214
- ```
215
- src/integrators/{llm, neo4j, qdrant}.rs → crates/<p>-integrators/src/lib.rs
216
- ```
217
-
218
- - Tudo que fala com o mundo externo (LLM, Neo4j, Qdrant, Stripe, Meta,
219
- …) vira lib.
220
- - API e workers passam a importar via `<p>-integrators = { path = "../<p>-integrators" }`.
221
- - `<p>-integrators` NÃO depende de domain/services — é folha do grafo, só
222
- conhece os tipos de request/response da API externa.
223
-
224
- #### PR 3 — Domain (entidades puras)
225
-
226
- ```
227
- src/models/ \
228
- src/dto/ → crates/<p>-domain/src/lib.rs
229
- src/error.rs (parte que é DomainError) /
230
- ```
231
-
232
- - `<p>-domain` tem **dependências MÍNIMAS** no Cargo.toml: apenas `serde`,
233
- `uuid`, `chrono`, `thiserror`. Nada de axum, sqlx, redis.
234
- - Force a regra fazendo `cargo build -p <p>-domain` falhar se alguém
235
- importar HTTP/DB.
236
- - API, services, workers, integrators todos passam a usar
237
- `<p>-domain = { path = "../<p>-domain" }` em vez de `crate::models::`.
238
-
239
- #### PR 4 — API e raiz do workspace
240
-
241
- ```
242
- Cargo.toml (raiz) → vira [workspace] puro, sem [package]
243
- src/ (resto) → crates/<p>-api/src/
244
- ├── main.rs
245
- ├── lib.rs
246
- ├── handlers/
247
- ├── routes.rs
248
- └── middleware/
249
- ```
250
-
251
- - `Cargo.toml` raiz só tem `[workspace]`, `[workspace.package]`,
252
- `[workspace.dependencies]`, e `[profile.*]`.
253
- - API (binário principal) vai pra `crates/<p>-api/`.
254
- - Centralize todas as deps em `workspace.dependencies` — cada crate herda
255
- com `<dep> = { workspace = true }`.
256
-
257
- ### Validação após CADA PR
258
-
259
- ```bash
260
- cargo build --workspace --all-targets
261
- cargo test --workspace
262
- cargo clippy --workspace --all-targets -- -D warnings
263
- ```
264
-
265
- Mais o smoke E2E do projeto (subir compose, hitar `/healthz`, login,
266
- operação CRUD básica). Se algum quebrar, o PR está incompleto.
267
-
268
- ### Antipatterns ao migrar
269
-
270
- | Antipattern | Por que evitar |
271
- |-------------|----------------|
272
- | Big-bang (1 PR mexe em tudo) | Impossível revisar; impossível reverter; quebra histórico do git blame |
273
- | Crate `common` / `shared` / `utils` | Vira lixeira; ninguém sabe onde colocar; viola SRP |
274
- | Crate por arquivo (granularidade demais) | 50 crates de 100 linhas cada vai parar a build |
275
- | Refactor de lógica + migração no mesmo PR | Não dá pra revisar; bug fica escondido |
276
- | Mover testes em PR separado | Crate sem test em produção é bug em standby |
277
- | Não atualizar `xtask`/scripts CI | Pipeline quebra; deploy vira pesadelo |
278
-
279
- ### Tradução de imports
280
-
281
- | Antes (single-crate) | Depois (workspace) |
282
- |----------------------|--------------------|
283
- | `use crate::models::User;` | `use <p>_domain::User;` |
284
- | `use crate::services::auth::login;` | `use <p>_services::auth::login;` |
285
- | `use crate::handlers::health::router;` | `use crate::handlers::health::router;` *(stay — está dentro do mesmo crate)* |
286
- | `use crate::integrators::llm::Gemini;` | `use <p>_integrators::llm::Gemini;` |
287
-
288
- Note os hifens viram underlines (Cargo names → Rust idents).
289
-
290
- ---
291
-
292
- ## Quando NÃO migrar
293
-
294
- - Projeto < 30 arquivos com 1 binário e 1 dev → single-crate é mais
295
- simples, manutenção é trivial.
296
- - Você está no meio de um sprint crítico → migração é refactor estrutural,
297
- não combina com prazo.
298
- - Não há sinais reais de dor (build < 5s, sem conflitos, sem segundo
299
- binário planejado).
300
-
301
- A migração tem custo. Faça quando o ganho compensar.
302
-
303
- ## Checklist final (qualquer cenário)
304
-
305
- - [ ] Critérios objetivos de decisão documentados no BLUEPRINT
306
- - [ ] Lista de crates com responsabilidade de cada um
307
- - [ ] Diagrama Mermaid do grafo de dependências
308
- - [ ] `Cargo.toml` workspace com `workspace.dependencies` centralizadas
309
- - [ ] `<p>-domain` sem dependência de framework HTTP/DB
310
- - [ ] Cada binário com `[[bin]]` e `path = "src/main.rs"` no seu Cargo.toml
311
- - [ ] Migração planejada em PRs incrementais, não big-bang
312
- - [ ] Ralph Loop verde após cada PR (`cargo build/test/clippy --workspace`)
1
+ ---
2
+ description: Decisão e migração de Cargo workspace multi-crate para projetos Rust/Axum. Use durante design/blueprint para decidir o layout, ou quando um projeto single-crate cresceu além do que comporta confortavelmente.
3
+ globs: src/**/*.rs,Cargo.toml,DARE/DESIGN.md,DARE/BLUEPRINT.md
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Skill: Rust workspace — single-crate vs multi-crate
8
+
9
+ Esta skill cobre dois cenários relacionados:
10
+
11
+ - **Cenário A** — você está gerando `DESIGN.md`/`BLUEPRINT.md` de um projeto
12
+ Rust/Axum e precisa decidir desde já se ele nasce single-crate ou em
13
+ workspace.
14
+ - **Cenário B** — o projeto Rust **já existe** em single-crate e cresceu ao
15
+ ponto de doer (compilação lenta, fronteiras arquiteturais erodindo,
16
+ workers acoplados ao API server). Você precisa propor um plano de
17
+ migração para workspace.
18
+
19
+ A regra geral: **comece simples, migre quando os critérios objetivos
20
+ abaixo aparecerem.** Workspace é a estrutura idiomática Rust para projetos
21
+ maduros, mas é overengineering para o "hello world".
22
+
23
+ ---
24
+
25
+ ## Cenário A — Decisão na fase Design/Blueprint
26
+
27
+ Antes de escrever o BLUEPRINT da stack `rust-axum`, decida: single-crate
28
+ ou workspace? Os critérios são objetivos:
29
+
30
+ ### Comece **single-crate** quando TODOS forem verdadeiros
31
+
32
+ - Apenas **1 binário** (HTTP server).
33
+ - Estimativa de **< 30 arquivos `.rs`** no `src/`.
34
+ - **1–2 sistemas externos** (apenas DB; ou DB + cache).
35
+ - **Equipe ≤ 2 devs** trabalhando ativamente.
36
+ - Nenhum requisito de deploy independente para subcomponentes.
37
+
38
+ ### Comece **workspace multi-crate** quando QUALQUER um for verdadeiro
39
+
40
+ - **≥ 2 binários** previstos (API + worker; API + admin; API + CLI).
41
+ - **Múltiplos sistemas externos** (3+: PG + Redis + Rabbit + Qdrant +
42
+ Neo4j + …).
43
+ - **Deploy independente** desejado (workers em pods separados no k8s,
44
+ scaling independente).
45
+ - **Fronteiras arquiteturais** críticas (domain puro sem HTTP/DB; SDK que
46
+ vai virar crate público; biblioteca de cliente compartilhada com outras
47
+ apps).
48
+ - **Equipe ≥ 3 devs** trabalhando em módulos diferentes em paralelo.
49
+
50
+ ### Layout convencional para workspace
51
+
52
+ Use o prefixo do projeto (`<p>`) como namespace de todos os crates — por
53
+ exemplo `wa-` para uma `wa-business-api`, `agent-` para um `agent-ai`,
54
+ `chat-` para um `chat-service`.
55
+
56
+ ```
57
+ projeto/
58
+ ├── Cargo.toml # workspace root, deps centralizadas
59
+ ├── docker-compose.yml
60
+ ├── Dockerfile
61
+ ├── crates/
62
+ │ ├── <p>-domain/ (lib) # entities puras: structs, errors, types
63
+ │ ├── <p>-config/ (lib) # AppConfig::from_env()
64
+ │ ├── <p>-db/ (lib) # sqlx pool, migrations
65
+ │ ├── <p>-cache/ (lib) # redis/moka (se houver)
66
+ │ ├── <p>-queue/ (lib) # lapin/kafka (se houver)
67
+ │ ├── <p>-crypto/ (lib) # bcrypt, jwt, aes (se aplicável)
68
+ │ ├── <p>-meta-client/ (lib) # cliente externo (Meta API, Stripe…)
69
+ │ ├── <p>-services/ (lib) # business logic, sem HTTP
70
+ │ ├── <p>-api/ (bin + lib) # HTTP server (handlers, router, mw)
71
+ │ ├── <p>-worker-<X>/ (bin) # 1 binário por tipo de worker
72
+ │ ├── <p>-admin/ (bin) # CLI admin (se houver)
73
+ │ └── <p>-e2e/ (tests) # integration tests cross-crate
74
+ └── xtask/ # scripts de build/dev em Rust
75
+ ```
76
+
77
+ Granularidade: **um crate por bounded context**, não por arquivo. Resista
78
+ ao "crate util" / "crate common" — vira lixeira.
79
+
80
+ ### Template de `Cargo.toml` raiz (workspace)
81
+
82
+ ```toml
83
+ [workspace]
84
+ resolver = "2"
85
+ members = [
86
+ "crates/<p>-domain",
87
+ "crates/<p>-config",
88
+ "crates/<p>-db",
89
+ "crates/<p>-services",
90
+ "crates/<p>-api",
91
+ "crates/<p>-worker-x",
92
+ "crates/<p>-e2e",
93
+ "xtask",
94
+ ]
95
+
96
+ [workspace.package]
97
+ version = "0.1.0"
98
+ edition = "2021"
99
+ rust-version = "1.80"
100
+ license = "Proprietary"
101
+
102
+ [workspace.dependencies]
103
+ # Runtime
104
+ tokio = { version = "1.40", features = ["full"] }
105
+ async-trait = "0.1"
106
+
107
+ # Web
108
+ axum = { version = "0.7", features = ["macros"] }
109
+ tower = "0.5"
110
+ tower-http = { version = "0.6", features = ["cors", "trace", "timeout"] }
111
+
112
+ # Serialization
113
+ serde = { version = "1.0", features = ["derive"] }
114
+ serde_json = "1.0"
115
+
116
+ # Database
117
+ sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "uuid", "chrono", "migrate"] }
118
+
119
+ # Errors / observability
120
+ thiserror = "1.0"
121
+ anyhow = "1.0"
122
+ tracing = "0.1"
123
+ tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
124
+
125
+ # Types
126
+ uuid = { version = "1.10", features = ["v4", "serde"] }
127
+ chrono = { version = "0.4", features = ["serde"] }
128
+
129
+ [profile.release]
130
+ opt-level = 3
131
+ lto = "thin"
132
+ codegen-units = 1
133
+ strip = true
134
+ ```
135
+
136
+ Cada crate filho herda via `version.workspace = true` e
137
+ `<dep> = { workspace = true }` — assim você atualiza axum/tokio/etc. em
138
+ **uma linha** no root.
139
+
140
+ ### Diagrama no BLUEPRINT.md
141
+
142
+ Sempre desenhe o grafo de dependências em Mermaid. Exemplo:
143
+
144
+ ```mermaid
145
+ graph TD
146
+ api[<p>-api]
147
+ admin[<p>-admin]
148
+ worker[<p>-worker-flow]
149
+ services[<p>-services]
150
+ db[<p>-db]
151
+ cache[<p>-cache]
152
+ queue[<p>-queue]
153
+ domain[<p>-domain]
154
+
155
+ api --> services
156
+ admin --> services
157
+ worker --> services
158
+ services --> db
159
+ services --> cache
160
+ services --> queue
161
+ services --> domain
162
+ db --> domain
163
+ ```
164
+
165
+ Regras de seta:
166
+ - **`<p>-domain` no fundo:** ninguém depende para baixo dele.
167
+ - **`<p>-services` no meio:** depende de domain/db/cache/queue, NUNCA de api.
168
+ - **Binários (api, admin, worker) no topo:** dependem de services, nunca
169
+ um do outro.
170
+
171
+ ---
172
+
173
+ ## Cenário B — Migração de single-crate para workspace
174
+
175
+ Use quando você herda um projeto single-crate maduro e percebe que está
176
+ apertando.
177
+
178
+ ### Sintomas objetivos de "hora de migrar"
179
+
180
+ - `src/` tem **> 30 arquivos `.rs`** ou **> 6 subpastas top-level**.
181
+ - Existem múltiplos "domínios verticais" misturados (`handlers`, `services`,
182
+ `repositories`, `workers`, `integrators`, `mcp`, `acp`, `skills`, `tools`…).
183
+ - Workers usam `tokio::spawn` no mesmo processo do API server (não
184
+ conseguem escalar independente).
185
+ - `cargo build` incremental > 10s.
186
+ - Múltiplas pessoas mexem no mesmo crate, gerando conflitos de merge
187
+ frequentes.
188
+ - Quer expor parte do código (cliente, SDK) como crate publicável.
189
+
190
+ ### Plano de migração em 4 PRs
191
+
192
+ Migração **incremental**, NUNCA big-bang. Cada PR deve passar build/test
193
+ no fim e ser deployável.
194
+
195
+ #### PR 1 — Workers (mais isolados, menor risco)
196
+
197
+ ```
198
+ src/workers/ → crates/<p>-worker-<nome>/
199
+ ├── Cargo.toml
200
+ └── src/main.rs (era workers/<nome>.rs)
201
+ ```
202
+
203
+ - Cada `tokio::spawn(worker_x)` que estava no `main.rs` da API vira um
204
+ **binário próprio**.
205
+ - O API server **para de fazer `start_workers()`** — workers sobem como
206
+ processo independente.
207
+ - `docker-compose.yml` ganha um `service` novo por worker, com `command:
208
+ ["./<p>-worker-<nome>"]`.
209
+ - Em produção (k8s), cada worker vira um Deployment com seu próprio
210
+ scaling.
211
+
212
+ #### PR 2 — Integrators (clientes externos)
213
+
214
+ ```
215
+ src/integrators/{llm, neo4j, qdrant}.rs → crates/<p>-integrators/src/lib.rs
216
+ ```
217
+
218
+ - Tudo que fala com o mundo externo (LLM, Neo4j, Qdrant, Stripe, Meta,
219
+ …) vira lib.
220
+ - API e workers passam a importar via `<p>-integrators = { path = "../<p>-integrators" }`.
221
+ - `<p>-integrators` NÃO depende de domain/services — é folha do grafo, só
222
+ conhece os tipos de request/response da API externa.
223
+
224
+ #### PR 3 — Domain (entidades puras)
225
+
226
+ ```
227
+ src/models/ \
228
+ src/dto/ → crates/<p>-domain/src/lib.rs
229
+ src/error.rs (parte que é DomainError) /
230
+ ```
231
+
232
+ - `<p>-domain` tem **dependências MÍNIMAS** no Cargo.toml: apenas `serde`,
233
+ `uuid`, `chrono`, `thiserror`. Nada de axum, sqlx, redis.
234
+ - Force a regra fazendo `cargo build -p <p>-domain` falhar se alguém
235
+ importar HTTP/DB.
236
+ - API, services, workers, integrators todos passam a usar
237
+ `<p>-domain = { path = "../<p>-domain" }` em vez de `crate::models::`.
238
+
239
+ #### PR 4 — API e raiz do workspace
240
+
241
+ ```
242
+ Cargo.toml (raiz) → vira [workspace] puro, sem [package]
243
+ src/ (resto) → crates/<p>-api/src/
244
+ ├── main.rs
245
+ ├── lib.rs
246
+ ├── handlers/
247
+ ├── routes.rs
248
+ └── middleware/
249
+ ```
250
+
251
+ - `Cargo.toml` raiz só tem `[workspace]`, `[workspace.package]`,
252
+ `[workspace.dependencies]`, e `[profile.*]`.
253
+ - API (binário principal) vai pra `crates/<p>-api/`.
254
+ - Centralize todas as deps em `workspace.dependencies` — cada crate herda
255
+ com `<dep> = { workspace = true }`.
256
+
257
+ ### Validação após CADA PR
258
+
259
+ ```bash
260
+ cargo build --workspace --all-targets
261
+ cargo test --workspace
262
+ cargo clippy --workspace --all-targets -- -D warnings
263
+ ```
264
+
265
+ Mais o smoke E2E do projeto (subir compose, hitar `/healthz`, login,
266
+ operação CRUD básica). Se algum quebrar, o PR está incompleto.
267
+
268
+ ### Antipatterns ao migrar
269
+
270
+ | Antipattern | Por que evitar |
271
+ |-------------|----------------|
272
+ | Big-bang (1 PR mexe em tudo) | Impossível revisar; impossível reverter; quebra histórico do git blame |
273
+ | Crate `common` / `shared` / `utils` | Vira lixeira; ninguém sabe onde colocar; viola SRP |
274
+ | Crate por arquivo (granularidade demais) | 50 crates de 100 linhas cada vai parar a build |
275
+ | Refactor de lógica + migração no mesmo PR | Não dá pra revisar; bug fica escondido |
276
+ | Mover testes em PR separado | Crate sem test em produção é bug em standby |
277
+ | Não atualizar `xtask`/scripts CI | Pipeline quebra; deploy vira pesadelo |
278
+
279
+ ### Tradução de imports
280
+
281
+ | Antes (single-crate) | Depois (workspace) |
282
+ |----------------------|--------------------|
283
+ | `use crate::models::User;` | `use <p>_domain::User;` |
284
+ | `use crate::services::auth::login;` | `use <p>_services::auth::login;` |
285
+ | `use crate::handlers::health::router;` | `use crate::handlers::health::router;` *(stay — está dentro do mesmo crate)* |
286
+ | `use crate::integrators::llm::Gemini;` | `use <p>_integrators::llm::Gemini;` |
287
+
288
+ Note os hifens viram underlines (Cargo names → Rust idents).
289
+
290
+ ---
291
+
292
+ ## Quando NÃO migrar
293
+
294
+ - Projeto < 30 arquivos com 1 binário e 1 dev → single-crate é mais
295
+ simples, manutenção é trivial.
296
+ - Você está no meio de um sprint crítico → migração é refactor estrutural,
297
+ não combina com prazo.
298
+ - Não há sinais reais de dor (build < 5s, sem conflitos, sem segundo
299
+ binário planejado).
300
+
301
+ A migração tem custo. Faça quando o ganho compensar.
302
+
303
+ ## Checklist final (qualquer cenário)
304
+
305
+ - [ ] Critérios objetivos de decisão documentados no BLUEPRINT
306
+ - [ ] Lista de crates com responsabilidade de cada um
307
+ - [ ] Diagrama Mermaid do grafo de dependências
308
+ - [ ] `Cargo.toml` workspace com `workspace.dependencies` centralizadas
309
+ - [ ] `<p>-domain` sem dependência de framework HTTP/DB
310
+ - [ ] Cada binário com `[[bin]]` e `path = "src/main.rs"` no seu Cargo.toml
311
+ - [ ] Migração planejada em PRs incrementais, não big-bang
312
+ - [ ] Ralph Loop verde após cada PR (`cargo build/test/clippy --workspace`)