@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,217 +1,217 @@
1
- ---
2
- name: dare-realtime
3
- description: Comunicação real-time (WebSocket, SSE) em projetos DARE. Fornece schema validation de eventos, registro central de tipos, reconexão com exponential backoff, e gerenciamento de subscriptions com limpeza garantida (zero ghost listeners).
4
- ---
5
-
6
- # DARE Realtime Skill
7
-
8
- Você é um especialista em comunicação real-time. Seu papel é garantir que toda integração WebSocket/SSE em projeto DARE seja **tipada, autorizada, reconectável e sem ghost listeners**.
9
-
10
- ## Quando usar esta skill
11
-
12
- - Projeto precisa de WebSocket (chat, notifications, live updates)
13
- - Projeto precisa de SSE (logs streaming, métricas em tempo real)
14
- - Você está auditando ghost listeners (memória crescendo após desconexão)
15
- - Você está revisando código que faz `socket.on('event', ...)` sem cleanup
16
-
17
- ## Arquitetura recomendada
18
-
19
- ```
20
- ┌─────────────────────────────────────────────────────────┐
21
- │ Event Registry │
22
- │ - Tipos de evento com schema JSON │
23
- │ - Versionamento (v1, v2…) │
24
- │ - Autorização por evento │
25
- └─────────────────────────────────────────────────────────┘
26
-
27
- ┌─────────────────────────────────────────────────────────┐
28
- │ Subscription Manager │
29
- │ - Map<connection_id, Set<event_type>> │
30
- │ - Cleanup garantido on disconnect │
31
- └─────────────────────────────────────────────────────────┘
32
-
33
- ┌─────────────────────────────────────────────────────────┐
34
- │ Reconnect Strategy │
35
- │ - Exponential backoff (1s, 2s, 4s, 8s, max 30s) │
36
- │ - Jitter para evitar thundering herd │
37
- │ - Resync de estado após reconectar │
38
- └─────────────────────────────────────────────────────────┘
39
- ```
40
-
41
- ## Os 4 pilares
42
-
43
- ### 1. Schema validation de eventos
44
-
45
- Todo evento WebSocket/SSE tem schema JSON:
46
-
47
- ```typescript
48
- // event_registry.ts
49
- const events = {
50
- 'user.created.v1': z.object({
51
- id: z.string().uuid(),
52
- email: z.string().email(),
53
- createdAt: z.string().datetime(),
54
- }),
55
- 'message.sent.v1': z.object({
56
- conversationId: z.string().uuid(),
57
- senderId: z.string().uuid(),
58
- body: z.string().max(2000),
59
- sentAt: z.string().datetime(),
60
- }),
61
- };
62
- ```
63
-
64
- Server valida antes de emitir, client valida antes de processar. Evento inválido = log + drop.
65
-
66
- ### 2. Registro central de tipos
67
-
68
- Um único `event_registry.ts/py/rs` lista todos os event types. Adicionar evento novo passa por PR explícito. Versionamento via sufixo (`.v1`, `.v2`).
69
-
70
- ### 3. Reconexão com exponential backoff
71
-
72
- ```typescript
73
- class ReconnectStrategy {
74
- private attempt = 0;
75
- next(): number {
76
- const base = Math.min(1000 * 2 ** this.attempt, 30_000);
77
- const jitter = Math.random() * 1000;
78
- this.attempt++;
79
- return base + jitter;
80
- }
81
- reset() { this.attempt = 0; }
82
- }
83
- ```
84
-
85
- Após reconectar, **resync de estado** — buscar eventos perdidos via REST ou pedir snapshot via WS.
86
-
87
- ### 4. Subscription manager (zero ghost listeners)
88
-
89
- Cada subscription rastreada em map, com cleanup automático:
90
-
91
- ```typescript
92
- class SubscriptionManager {
93
- private subs = new Map<string, Set<string>>(); // connectionId → events
94
-
95
- subscribe(connId: string, event: string) {
96
- if (!this.subs.has(connId)) this.subs.set(connId, new Set());
97
- this.subs.get(connId)!.add(event);
98
- }
99
-
100
- unsubscribeAll(connId: string) {
101
- this.subs.delete(connId);
102
- }
103
-
104
- // Forçar limpeza on disconnect — SEMPRE
105
- onDisconnect(connId: string) {
106
- this.unsubscribeAll(connId);
107
- }
108
- }
109
- ```
110
-
111
- ## Métricas obrigatórias
112
-
113
- | ID | Métrica | Como medir |
114
- |---|---|---|
115
- | M-01 | 100% de event types com JSON Schema definido | grep no registry |
116
- | M-02 | 100% de subscriptions autorizadas | verificar `authorize()` antes de `subscribe()` |
117
- | M-03 | 0 ghost listeners após desconexão | métrica `subs.size` por conexão = 0 após disconnect |
118
- | M-04 | Estratégia de reconexão configurada | grep por `ReconnectStrategy` ou similar |
119
-
120
- ## Antipatterns
121
-
122
- | AP | Antipattern | Sinal | Correção |
123
- |---|---|---|---|
124
- | AP-01 | Evento sem schema | `socket.emit('foo', anything)` | Adicionar schema no registry |
125
- | AP-02 | `socket.on(...)` sem cleanup | listener fica vivo após disconnect | Usar SubscriptionManager |
126
- | AP-03 | Reconexão sem backoff | reconecta imediatamente em loop | Exponential backoff + jitter |
127
- | AP-04 | Sem autorização de subscription | usuário ouve eventos de outro tenant | `authorize(user, event)` antes de `subscribe()` |
128
- | AP-05 | Broadcast sem filtro | `io.emit()` para todos | Use rooms / channels por tenant |
129
- | AP-06 | Estado não recuperado após reconectar | UI mostra dados stale | Resync via REST ou snapshot |
130
-
131
- ## Como aplicar
132
-
133
- ### Passo 1: Criar event registry
134
-
135
- ```typescript
136
- // src/realtime/event_registry.ts
137
- export const EventRegistry = {
138
- 'user.created.v1': { schema: UserCreatedSchema, requires: 'admin' },
139
- 'message.sent.v1': { schema: MessageSentSchema, requires: 'participant' },
140
- };
141
- ```
142
-
143
- ### Passo 2: Implementar subscription manager
144
-
145
- Use `packages/skills/dare-realtime/subscription_manager.ts` como template. Garante cleanup on disconnect.
146
-
147
- ### Passo 3: Configurar reconexão no client
148
-
149
- ```typescript
150
- const strategy = new ReconnectStrategy({ base: 1000, max: 30_000 });
151
- socket.on('disconnect', () => {
152
- setTimeout(() => socket.connect(), strategy.next());
153
- });
154
- socket.on('connect', () => {
155
- strategy.reset();
156
- resyncState(); // fetch via REST eventos perdidos
157
- });
158
- ```
159
-
160
- ### Passo 4: Adicionar autorização
161
-
162
- ```typescript
163
- socket.on('subscribe', (eventType) => {
164
- if (!authorize(socket.user, eventType)) {
165
- socket.emit('error', { code: 'FORBIDDEN' });
166
- return;
167
- }
168
- subscriptionManager.subscribe(socket.id, eventType);
169
- });
170
- ```
171
-
172
- ### Passo 5: Validar eventos no client e server
173
-
174
- Server antes de emitir:
175
- ```typescript
176
- const schema = EventRegistry[eventType].schema;
177
- const valid = schema.safeParse(payload);
178
- if (!valid.success) { log.error(...); return; }
179
- io.to(room).emit(eventType, valid.data);
180
- ```
181
-
182
- Client antes de processar:
183
- ```typescript
184
- socket.on(eventType, (payload) => {
185
- const valid = EventRegistry[eventType].schema.safeParse(payload);
186
- if (!valid.success) { log.warn(...); return; }
187
- handleEvent(valid.data);
188
- });
189
- ```
190
-
191
- ## Boas práticas
192
-
193
- 1. **WebSocket vs SSE** — SSE para server→client unidirecional (logs, métricas). WS para bidirectional (chat).
194
- 2. **Rooms/channels por tenant** — evita broadcast cross-tenant
195
- 3. **Heartbeat / ping-pong** — detectar conexão zumbi (network OK mas peer não responde)
196
- 4. **Backpressure** — se client lento, fila no server explode. Drop eventos antigos ou aplicar rate limit.
197
- 5. **Replay limitado** — guardar últimos N eventos por room para reconexão recente, não histórico completo
198
-
199
- ## Stack recomendada
200
-
201
- | Stack | WebSocket | SSE |
202
- |---|---|---|
203
- | Node | `socket.io`, `ws` | `eventsource` (client) + endpoint custom |
204
- | Rails | Action Cable | Rack streaming |
205
- | Rust/Axum | `tokio-tungstenite`, `axum` ws | `axum::sse::Sse` |
206
- | FastAPI | `fastapi.WebSocket` | `EventSourceResponse` |
207
- | Go | `gorilla/websocket`, `melody` | stdlib `http.Flusher` |
208
-
209
- ## Dicas
210
-
211
- - **Leia** `docs/design/skills/dare-realtime/DESIGN.md`
212
- - **Combine** com `dare-security` para autorização
213
- - **Use** os templates em `packages/skills/dare-realtime/`
214
-
215
- ---
216
-
217
- Esta skill é parte do DARE Method e está sob licença MIT.
1
+ ---
2
+ name: dare-realtime
3
+ description: Comunicação real-time (WebSocket, SSE) em projetos DARE. Fornece schema validation de eventos, registro central de tipos, reconexão com exponential backoff, e gerenciamento de subscriptions com limpeza garantida (zero ghost listeners).
4
+ ---
5
+
6
+ # DARE Realtime Skill
7
+
8
+ Você é um especialista em comunicação real-time. Seu papel é garantir que toda integração WebSocket/SSE em projeto DARE seja **tipada, autorizada, reconectável e sem ghost listeners**.
9
+
10
+ ## Quando usar esta skill
11
+
12
+ - Projeto precisa de WebSocket (chat, notifications, live updates)
13
+ - Projeto precisa de SSE (logs streaming, métricas em tempo real)
14
+ - Você está auditando ghost listeners (memória crescendo após desconexão)
15
+ - Você está revisando código que faz `socket.on('event', ...)` sem cleanup
16
+
17
+ ## Arquitetura recomendada
18
+
19
+ ```
20
+ ┌─────────────────────────────────────────────────────────┐
21
+ │ Event Registry │
22
+ │ - Tipos de evento com schema JSON │
23
+ │ - Versionamento (v1, v2…) │
24
+ │ - Autorização por evento │
25
+ └─────────────────────────────────────────────────────────┘
26
+
27
+ ┌─────────────────────────────────────────────────────────┐
28
+ │ Subscription Manager │
29
+ │ - Map<connection_id, Set<event_type>> │
30
+ │ - Cleanup garantido on disconnect │
31
+ └─────────────────────────────────────────────────────────┘
32
+
33
+ ┌─────────────────────────────────────────────────────────┐
34
+ │ Reconnect Strategy │
35
+ │ - Exponential backoff (1s, 2s, 4s, 8s, max 30s) │
36
+ │ - Jitter para evitar thundering herd │
37
+ │ - Resync de estado após reconectar │
38
+ └─────────────────────────────────────────────────────────┘
39
+ ```
40
+
41
+ ## Os 4 pilares
42
+
43
+ ### 1. Schema validation de eventos
44
+
45
+ Todo evento WebSocket/SSE tem schema JSON:
46
+
47
+ ```typescript
48
+ // event_registry.ts
49
+ const events = {
50
+ 'user.created.v1': z.object({
51
+ id: z.string().uuid(),
52
+ email: z.string().email(),
53
+ createdAt: z.string().datetime(),
54
+ }),
55
+ 'message.sent.v1': z.object({
56
+ conversationId: z.string().uuid(),
57
+ senderId: z.string().uuid(),
58
+ body: z.string().max(2000),
59
+ sentAt: z.string().datetime(),
60
+ }),
61
+ };
62
+ ```
63
+
64
+ Server valida antes de emitir, client valida antes de processar. Evento inválido = log + drop.
65
+
66
+ ### 2. Registro central de tipos
67
+
68
+ Um único `event_registry.ts/py/rs` lista todos os event types. Adicionar evento novo passa por PR explícito. Versionamento via sufixo (`.v1`, `.v2`).
69
+
70
+ ### 3. Reconexão com exponential backoff
71
+
72
+ ```typescript
73
+ class ReconnectStrategy {
74
+ private attempt = 0;
75
+ next(): number {
76
+ const base = Math.min(1000 * 2 ** this.attempt, 30_000);
77
+ const jitter = Math.random() * 1000;
78
+ this.attempt++;
79
+ return base + jitter;
80
+ }
81
+ reset() { this.attempt = 0; }
82
+ }
83
+ ```
84
+
85
+ Após reconectar, **resync de estado** — buscar eventos perdidos via REST ou pedir snapshot via WS.
86
+
87
+ ### 4. Subscription manager (zero ghost listeners)
88
+
89
+ Cada subscription rastreada em map, com cleanup automático:
90
+
91
+ ```typescript
92
+ class SubscriptionManager {
93
+ private subs = new Map<string, Set<string>>(); // connectionId → events
94
+
95
+ subscribe(connId: string, event: string) {
96
+ if (!this.subs.has(connId)) this.subs.set(connId, new Set());
97
+ this.subs.get(connId)!.add(event);
98
+ }
99
+
100
+ unsubscribeAll(connId: string) {
101
+ this.subs.delete(connId);
102
+ }
103
+
104
+ // Forçar limpeza on disconnect — SEMPRE
105
+ onDisconnect(connId: string) {
106
+ this.unsubscribeAll(connId);
107
+ }
108
+ }
109
+ ```
110
+
111
+ ## Métricas obrigatórias
112
+
113
+ | ID | Métrica | Como medir |
114
+ |---|---|---|
115
+ | M-01 | 100% de event types com JSON Schema definido | grep no registry |
116
+ | M-02 | 100% de subscriptions autorizadas | verificar `authorize()` antes de `subscribe()` |
117
+ | M-03 | 0 ghost listeners após desconexão | métrica `subs.size` por conexão = 0 após disconnect |
118
+ | M-04 | Estratégia de reconexão configurada | grep por `ReconnectStrategy` ou similar |
119
+
120
+ ## Antipatterns
121
+
122
+ | AP | Antipattern | Sinal | Correção |
123
+ |---|---|---|---|
124
+ | AP-01 | Evento sem schema | `socket.emit('foo', anything)` | Adicionar schema no registry |
125
+ | AP-02 | `socket.on(...)` sem cleanup | listener fica vivo após disconnect | Usar SubscriptionManager |
126
+ | AP-03 | Reconexão sem backoff | reconecta imediatamente em loop | Exponential backoff + jitter |
127
+ | AP-04 | Sem autorização de subscription | usuário ouve eventos de outro tenant | `authorize(user, event)` antes de `subscribe()` |
128
+ | AP-05 | Broadcast sem filtro | `io.emit()` para todos | Use rooms / channels por tenant |
129
+ | AP-06 | Estado não recuperado após reconectar | UI mostra dados stale | Resync via REST ou snapshot |
130
+
131
+ ## Como aplicar
132
+
133
+ ### Passo 1: Criar event registry
134
+
135
+ ```typescript
136
+ // src/realtime/event_registry.ts
137
+ export const EventRegistry = {
138
+ 'user.created.v1': { schema: UserCreatedSchema, requires: 'admin' },
139
+ 'message.sent.v1': { schema: MessageSentSchema, requires: 'participant' },
140
+ };
141
+ ```
142
+
143
+ ### Passo 2: Implementar subscription manager
144
+
145
+ Use `packages/skills/dare-realtime/subscription_manager.ts` como template. Garante cleanup on disconnect.
146
+
147
+ ### Passo 3: Configurar reconexão no client
148
+
149
+ ```typescript
150
+ const strategy = new ReconnectStrategy({ base: 1000, max: 30_000 });
151
+ socket.on('disconnect', () => {
152
+ setTimeout(() => socket.connect(), strategy.next());
153
+ });
154
+ socket.on('connect', () => {
155
+ strategy.reset();
156
+ resyncState(); // fetch via REST eventos perdidos
157
+ });
158
+ ```
159
+
160
+ ### Passo 4: Adicionar autorização
161
+
162
+ ```typescript
163
+ socket.on('subscribe', (eventType) => {
164
+ if (!authorize(socket.user, eventType)) {
165
+ socket.emit('error', { code: 'FORBIDDEN' });
166
+ return;
167
+ }
168
+ subscriptionManager.subscribe(socket.id, eventType);
169
+ });
170
+ ```
171
+
172
+ ### Passo 5: Validar eventos no client e server
173
+
174
+ Server antes de emitir:
175
+ ```typescript
176
+ const schema = EventRegistry[eventType].schema;
177
+ const valid = schema.safeParse(payload);
178
+ if (!valid.success) { log.error(...); return; }
179
+ io.to(room).emit(eventType, valid.data);
180
+ ```
181
+
182
+ Client antes de processar:
183
+ ```typescript
184
+ socket.on(eventType, (payload) => {
185
+ const valid = EventRegistry[eventType].schema.safeParse(payload);
186
+ if (!valid.success) { log.warn(...); return; }
187
+ handleEvent(valid.data);
188
+ });
189
+ ```
190
+
191
+ ## Boas práticas
192
+
193
+ 1. **WebSocket vs SSE** — SSE para server→client unidirecional (logs, métricas). WS para bidirectional (chat).
194
+ 2. **Rooms/channels por tenant** — evita broadcast cross-tenant
195
+ 3. **Heartbeat / ping-pong** — detectar conexão zumbi (network OK mas peer não responde)
196
+ 4. **Backpressure** — se client lento, fila no server explode. Drop eventos antigos ou aplicar rate limit.
197
+ 5. **Replay limitado** — guardar últimos N eventos por room para reconexão recente, não histórico completo
198
+
199
+ ## Stack recomendada
200
+
201
+ | Stack | WebSocket | SSE |
202
+ |---|---|---|
203
+ | Node | `socket.io`, `ws` | `eventsource` (client) + endpoint custom |
204
+ | Rails | Action Cable | Rack streaming |
205
+ | Rust/Axum | `tokio-tungstenite`, `axum` ws | `axum::sse::Sse` |
206
+ | FastAPI | `fastapi.WebSocket` | `EventSourceResponse` |
207
+ | Go | `gorilla/websocket`, `melody` | stdlib `http.Flusher` |
208
+
209
+ ## Dicas
210
+
211
+ - **Leia** `docs/design/skills/dare-realtime/DESIGN.md`
212
+ - **Combine** com `dare-security` para autorização
213
+ - **Use** os templates em `packages/skills/dare-realtime/`
214
+
215
+ ---
216
+
217
+ Esta skill é parte do DARE Method e está sob licença MIT.
@@ -1,114 +1,114 @@
1
- ---
2
- name: dare-refine
3
- description: Analisa complexidade de uma task DARE e, quando alta, quebra em sub-tasks menores. Use após gerar o DAG (para tasks HIGH/CRITICAL), quando o dev pedir refinamento manual, ou quando o escopo mudou e uma task ficou grande. Combina heurística determinística (CLI) com decisão semântica do agente.
4
- ---
5
-
6
- # DARE Refine Skill
7
-
8
- Você é o refinador de tasks do método DARE. Seu papel é garantir que cada task caiba em uma conversa única do agente — sem ficar tão grande que o agente "invente" stubs/mocks pra completar.
9
-
10
- ## Quando usar
11
-
12
- - Após `dare-tasks` gerar o DAG, para cada task com complexity HIGH no `dare-dag.yaml`
13
- - Quando o dev pede: "refine task-034"
14
- - Quando o BLUEPRINT mudou e uma task ficou grande demais
15
-
16
- ## Camada determinística vs semântica
17
-
18
- O CLI `dare refine <id>` já mede sinais objetivos: # arquivos, # funções, # testes, # dependências, keywords pesadas. Esta skill faz a camada semântica — você lê o conteúdo da spec e decide se faz sentido quebrar.
19
-
20
- ## Como executar
21
-
22
- ### Passo 1: Rodar a heurística determinística
23
-
24
- ```bash
25
- dare refine <task-id> --split --format json > .dare/refine-<task-id>.json
26
- ```
27
-
28
- JSON traz:
29
- - `report.score`, `report.level`
30
- - `report.signals` — explica a pontuação
31
- - `report.recommendsSplit` — true se HIGH/CRITICAL
32
- - `proposal.subtasks` — quebra inicial coarse
33
-
34
- ### Passo 2: Decidir se quebra
35
-
36
- **Quebrar quando:**
37
- - `recommendsSplit: true` (HIGH/CRITICAL)
38
- - Mais de 6 arquivos
39
- - Mistura responsabilidades (modelo + controller + teste + migration)
40
- - Inclui refactor + feature juntos
41
- - Keyword "pesada" + score MED+
42
-
43
- **Manter inteira quando:**
44
- - LOW ou MED baixo
45
- - Mesmo módulo
46
- - Cabe em uma conversa (15–60 min)
47
-
48
- ### Passo 3: Eixos de split
49
-
50
- | Eixo | Quando |
51
- |---|---|
52
- | **Por camada** | Modelo / Controller / Service / Test separados |
53
- | **Por endpoint** | 4 endpoints → 4 sub-tasks |
54
- | **Por feature** | Auth = register + login → split por verbo |
55
- | **Refactor + feature** | "1. refactor" + "2. feature em cima" |
56
- | **Migration + código** | "1. migration" + "2. código novo" |
57
-
58
- Cada sub-task:
59
- - `subtask_prompt` auto-suficiente (Anti-Stub Contract!)
60
- - Spec própria em `DARE/EXECUTION/<sub-id>.md`
61
- - `depends_on` mínimo mas correto
62
- - Complexity honesta — se sub ainda for HIGH, quebrar de novo
63
-
64
- ### Passo 4: Verdito
65
-
66
- `.dare/refine-verdict-<task-id>.json`:
67
-
68
- ```json
69
- {
70
- "manageable": false,
71
- "reasons": ["Score 18 (HIGH) — 7 endpoints + migration", "Mistura refactor com features novas"],
72
- "proposedSubtasks": [
73
- {
74
- "id": "task-034a",
75
- "title": "Refactor UserService",
76
- "files": ["src/services/UserService.ts", "tests/services/UserService.test.ts"],
77
- "rationale": "Refactor isolado antes da feature",
78
- "estimatedLevel": "MED"
79
- }
80
- ]
81
- }
82
- ```
83
-
84
- Manuseável:
85
-
86
- ```json
87
- {
88
- "manageable": true,
89
- "reasons": ["Score 7 (MED), 4 arquivos mesmo módulo"]
90
- }
91
- ```
92
-
93
- ### Passo 5: Aplicar o split
94
-
95
- 1. Editar `DARE/dare-dag.yaml` substituindo a task pelas sub-tasks
96
- 2. Criar specs em `DARE/EXECUTION/<sub-id>.md` (template + Anti-Stub Contract)
97
- 3. Atualizar `DARE/TASKS.md` (visão humana)
98
- 4. Regenerar Mermaid: `dare dag viz -o DARE/dag-graph.mmd`
99
- 5. Marcar task original como SPLIT (preservar histórico)
100
-
101
- ### Passo 6: Mensagem
102
-
103
- Manuseável:
104
- > ✅ Task bem-dimensionada (score X, level Y). Sem split.
105
-
106
- Quebrada:
107
- > 🪓 Task quebrada em N sub-tasks: [lista]. Revise com `dare validate` e `dare dag viz`.
108
-
109
- ## Regras inegociáveis
110
-
111
- - Não quebrar tasks LOW
112
- - Não inventar dependências falsas
113
- - Cada sub-task testável independentemente
114
- - Anti-Stub Contract aplica em cada sub-task
1
+ ---
2
+ name: dare-refine
3
+ description: Analisa complexidade de uma task DARE e, quando alta, quebra em sub-tasks menores. Use após gerar o DAG (para tasks HIGH/CRITICAL), quando o dev pedir refinamento manual, ou quando o escopo mudou e uma task ficou grande. Combina heurística determinística (CLI) com decisão semântica do agente.
4
+ ---
5
+
6
+ # DARE Refine Skill
7
+
8
+ Você é o refinador de tasks do método DARE. Seu papel é garantir que cada task caiba em uma conversa única do agente — sem ficar tão grande que o agente "invente" stubs/mocks pra completar.
9
+
10
+ ## Quando usar
11
+
12
+ - Após `dare-tasks` gerar o DAG, para cada task com complexity HIGH no `dare-dag.yaml`
13
+ - Quando o dev pede: "refine task-034"
14
+ - Quando o BLUEPRINT mudou e uma task ficou grande demais
15
+
16
+ ## Camada determinística vs semântica
17
+
18
+ O CLI `dare refine <id>` já mede sinais objetivos: # arquivos, # funções, # testes, # dependências, keywords pesadas. Esta skill faz a camada semântica — você lê o conteúdo da spec e decide se faz sentido quebrar.
19
+
20
+ ## Como executar
21
+
22
+ ### Passo 1: Rodar a heurística determinística
23
+
24
+ ```bash
25
+ dare refine <task-id> --split --format json > .dare/refine-<task-id>.json
26
+ ```
27
+
28
+ JSON traz:
29
+ - `report.score`, `report.level`
30
+ - `report.signals` — explica a pontuação
31
+ - `report.recommendsSplit` — true se HIGH/CRITICAL
32
+ - `proposal.subtasks` — quebra inicial coarse
33
+
34
+ ### Passo 2: Decidir se quebra
35
+
36
+ **Quebrar quando:**
37
+ - `recommendsSplit: true` (HIGH/CRITICAL)
38
+ - Mais de 6 arquivos
39
+ - Mistura responsabilidades (modelo + controller + teste + migration)
40
+ - Inclui refactor + feature juntos
41
+ - Keyword "pesada" + score MED+
42
+
43
+ **Manter inteira quando:**
44
+ - LOW ou MED baixo
45
+ - Mesmo módulo
46
+ - Cabe em uma conversa (15–60 min)
47
+
48
+ ### Passo 3: Eixos de split
49
+
50
+ | Eixo | Quando |
51
+ |---|---|
52
+ | **Por camada** | Modelo / Controller / Service / Test separados |
53
+ | **Por endpoint** | 4 endpoints → 4 sub-tasks |
54
+ | **Por feature** | Auth = register + login → split por verbo |
55
+ | **Refactor + feature** | "1. refactor" + "2. feature em cima" |
56
+ | **Migration + código** | "1. migration" + "2. código novo" |
57
+
58
+ Cada sub-task:
59
+ - `subtask_prompt` auto-suficiente (Anti-Stub Contract!)
60
+ - Spec própria em `DARE/EXECUTION/<sub-id>.md`
61
+ - `depends_on` mínimo mas correto
62
+ - Complexity honesta — se sub ainda for HIGH, quebrar de novo
63
+
64
+ ### Passo 4: Verdito
65
+
66
+ `.dare/refine-verdict-<task-id>.json`:
67
+
68
+ ```json
69
+ {
70
+ "manageable": false,
71
+ "reasons": ["Score 18 (HIGH) — 7 endpoints + migration", "Mistura refactor com features novas"],
72
+ "proposedSubtasks": [
73
+ {
74
+ "id": "task-034a",
75
+ "title": "Refactor UserService",
76
+ "files": ["src/services/UserService.ts", "tests/services/UserService.test.ts"],
77
+ "rationale": "Refactor isolado antes da feature",
78
+ "estimatedLevel": "MED"
79
+ }
80
+ ]
81
+ }
82
+ ```
83
+
84
+ Manuseável:
85
+
86
+ ```json
87
+ {
88
+ "manageable": true,
89
+ "reasons": ["Score 7 (MED), 4 arquivos mesmo módulo"]
90
+ }
91
+ ```
92
+
93
+ ### Passo 5: Aplicar o split
94
+
95
+ 1. Editar `DARE/dare-dag.yaml` substituindo a task pelas sub-tasks
96
+ 2. Criar specs em `DARE/EXECUTION/<sub-id>.md` (template + Anti-Stub Contract)
97
+ 3. Atualizar `DARE/TASKS.md` (visão humana)
98
+ 4. Regenerar Mermaid: `dare dag viz -o DARE/dag-graph.mmd`
99
+ 5. Marcar task original como SPLIT (preservar histórico)
100
+
101
+ ### Passo 6: Mensagem
102
+
103
+ Manuseável:
104
+ > ✅ Task bem-dimensionada (score X, level Y). Sem split.
105
+
106
+ Quebrada:
107
+ > 🪓 Task quebrada em N sub-tasks: [lista]. Revise com `dare validate` e `dare dag viz`.
108
+
109
+ ## Regras inegociáveis
110
+
111
+ - Não quebrar tasks LOW
112
+ - Não inventar dependências falsas
113
+ - Cada sub-task testável independentemente
114
+ - Anti-Stub Contract aplica em cada sub-task