@dewtech/dare-cli 2.16.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +196 -3
  2. package/dist/__tests__/confidence.test.d.ts +2 -0
  3. package/dist/__tests__/confidence.test.d.ts.map +1 -0
  4. package/dist/__tests__/confidence.test.js +73 -0
  5. package/dist/__tests__/confidence.test.js.map +1 -0
  6. package/dist/__tests__/datamodel.test.d.ts +2 -0
  7. package/dist/__tests__/datamodel.test.d.ts.map +1 -0
  8. package/dist/__tests__/datamodel.test.js +131 -0
  9. package/dist/__tests__/datamodel.test.js.map +1 -0
  10. package/dist/__tests__/dna-detector.test.d.ts +2 -0
  11. package/dist/__tests__/dna-detector.test.d.ts.map +1 -0
  12. package/dist/__tests__/dna-detector.test.js +97 -0
  13. package/dist/__tests__/dna-detector.test.js.map +1 -0
  14. package/dist/__tests__/dna-facts.test.d.ts +2 -0
  15. package/dist/__tests__/dna-facts.test.d.ts.map +1 -0
  16. package/dist/__tests__/dna-facts.test.js +44 -0
  17. package/dist/__tests__/dna-facts.test.js.map +1 -0
  18. package/dist/__tests__/graph-renderer.test.d.ts +2 -0
  19. package/dist/__tests__/graph-renderer.test.d.ts.map +1 -0
  20. package/dist/__tests__/graph-renderer.test.js +85 -0
  21. package/dist/__tests__/graph-renderer.test.js.map +1 -0
  22. package/dist/__tests__/migration.test.d.ts +2 -0
  23. package/dist/__tests__/migration.test.d.ts.map +1 -0
  24. package/dist/__tests__/migration.test.js +77 -0
  25. package/dist/__tests__/migration.test.js.map +1 -0
  26. package/dist/__tests__/module-detector.test.d.ts +2 -0
  27. package/dist/__tests__/module-detector.test.d.ts.map +1 -0
  28. package/dist/__tests__/module-detector.test.js +83 -0
  29. package/dist/__tests__/module-detector.test.js.map +1 -0
  30. package/dist/__tests__/refine.test.d.ts +2 -0
  31. package/dist/__tests__/refine.test.d.ts.map +1 -0
  32. package/dist/__tests__/refine.test.js +186 -0
  33. package/dist/__tests__/refine.test.js.map +1 -0
  34. package/dist/__tests__/reverse-facts.test.d.ts +2 -0
  35. package/dist/__tests__/reverse-facts.test.d.ts.map +1 -0
  36. package/dist/__tests__/reverse-facts.test.js +78 -0
  37. package/dist/__tests__/reverse-facts.test.js.map +1 -0
  38. package/dist/__tests__/review.test.d.ts +2 -0
  39. package/dist/__tests__/review.test.d.ts.map +1 -0
  40. package/dist/__tests__/review.test.js +242 -0
  41. package/dist/__tests__/review.test.js.map +1 -0
  42. package/dist/__tests__/update.test.d.ts +2 -0
  43. package/dist/__tests__/update.test.d.ts.map +1 -0
  44. package/dist/__tests__/update.test.js +150 -0
  45. package/dist/__tests__/update.test.js.map +1 -0
  46. package/dist/__tests__/validate.test.js +65 -65
  47. package/dist/bin/dare.js +38 -3
  48. package/dist/bin/dare.js.map +1 -1
  49. package/dist/commands/blueprint.js +122 -122
  50. package/dist/commands/dag.d.ts.map +1 -1
  51. package/dist/commands/dag.js +43 -79
  52. package/dist/commands/dag.js.map +1 -1
  53. package/dist/commands/dna.d.ts +3 -0
  54. package/dist/commands/dna.d.ts.map +1 -0
  55. package/dist/commands/dna.js +69 -0
  56. package/dist/commands/dna.js.map +1 -0
  57. package/dist/commands/execute.d.ts.map +1 -1
  58. package/dist/commands/execute.js +76 -0
  59. package/dist/commands/execute.js.map +1 -1
  60. package/dist/commands/migrate.d.ts +3 -0
  61. package/dist/commands/migrate.d.ts.map +1 -0
  62. package/dist/commands/migrate.js +101 -0
  63. package/dist/commands/migrate.js.map +1 -0
  64. package/dist/commands/new.d.ts +16 -0
  65. package/dist/commands/new.d.ts.map +1 -0
  66. package/dist/commands/new.js +103 -0
  67. package/dist/commands/new.js.map +1 -0
  68. package/dist/commands/refine.d.ts +16 -0
  69. package/dist/commands/refine.d.ts.map +1 -0
  70. package/dist/commands/refine.js +167 -0
  71. package/dist/commands/refine.js.map +1 -0
  72. package/dist/commands/reverse.d.ts +3 -0
  73. package/dist/commands/reverse.d.ts.map +1 -0
  74. package/dist/commands/reverse.js +201 -0
  75. package/dist/commands/reverse.js.map +1 -0
  76. package/dist/commands/review.d.ts +16 -0
  77. package/dist/commands/review.d.ts.map +1 -0
  78. package/dist/commands/review.js +106 -0
  79. package/dist/commands/review.js.map +1 -0
  80. package/dist/commands/update.d.ts +13 -0
  81. package/dist/commands/update.d.ts.map +1 -0
  82. package/dist/commands/update.js +149 -0
  83. package/dist/commands/update.js.map +1 -0
  84. package/dist/commands/welcome.d.ts +14 -0
  85. package/dist/commands/welcome.d.ts.map +1 -0
  86. package/dist/commands/welcome.js +29 -0
  87. package/dist/commands/welcome.js.map +1 -0
  88. package/dist/skills/commands/add.d.ts +23 -0
  89. package/dist/skills/commands/add.d.ts.map +1 -0
  90. package/dist/skills/commands/add.js +206 -0
  91. package/dist/skills/commands/add.js.map +1 -0
  92. package/dist/skills/commands/info.d.ts +14 -0
  93. package/dist/skills/commands/info.d.ts.map +1 -0
  94. package/dist/skills/commands/info.js +99 -0
  95. package/dist/skills/commands/info.js.map +1 -0
  96. package/dist/skills/commands/list.d.ts +19 -0
  97. package/dist/skills/commands/list.d.ts.map +1 -0
  98. package/dist/skills/commands/list.js +163 -0
  99. package/dist/skills/commands/list.js.map +1 -0
  100. package/dist/skills/commands/publish.d.ts +56 -0
  101. package/dist/skills/commands/publish.d.ts.map +1 -0
  102. package/dist/skills/commands/publish.js +272 -0
  103. package/dist/skills/commands/publish.js.map +1 -0
  104. package/dist/skills/commands/remove.d.ts +19 -0
  105. package/dist/skills/commands/remove.d.ts.map +1 -0
  106. package/dist/skills/commands/remove.js +96 -0
  107. package/dist/skills/commands/remove.js.map +1 -0
  108. package/dist/skills/commands/update.d.ts +31 -0
  109. package/dist/skills/commands/update.d.ts.map +1 -0
  110. package/dist/skills/commands/update.js +132 -0
  111. package/dist/skills/commands/update.js.map +1 -0
  112. package/dist/skills/index.d.ts +22 -0
  113. package/dist/skills/index.d.ts.map +1 -0
  114. package/dist/skills/index.js +33 -0
  115. package/dist/skills/index.js.map +1 -0
  116. package/dist/skills/manifest.d.ts +54 -0
  117. package/dist/skills/manifest.d.ts.map +1 -0
  118. package/dist/skills/manifest.js +162 -0
  119. package/dist/skills/manifest.js.map +1 -0
  120. package/dist/skills/registry-local.d.ts +67 -0
  121. package/dist/skills/registry-local.d.ts.map +1 -0
  122. package/dist/skills/registry-local.js +130 -0
  123. package/dist/skills/registry-local.js.map +1 -0
  124. package/dist/skills/registry-mock.json +109 -0
  125. package/dist/skills/registry-remote.d.ts +110 -0
  126. package/dist/skills/registry-remote.d.ts.map +1 -0
  127. package/dist/skills/registry-remote.js +246 -0
  128. package/dist/skills/registry-remote.js.map +1 -0
  129. package/dist/skills/registry.d.ts +49 -0
  130. package/dist/skills/registry.d.ts.map +1 -0
  131. package/dist/skills/registry.js +94 -0
  132. package/dist/skills/registry.js.map +1 -0
  133. package/dist/skills/tests/manifest.spec.d.ts +8 -0
  134. package/dist/skills/tests/manifest.spec.d.ts.map +1 -0
  135. package/dist/skills/tests/manifest.spec.js +176 -0
  136. package/dist/skills/tests/manifest.spec.js.map +1 -0
  137. package/dist/skills/tests/publish.spec.d.ts +12 -0
  138. package/dist/skills/tests/publish.spec.d.ts.map +1 -0
  139. package/dist/skills/tests/publish.spec.js +276 -0
  140. package/dist/skills/tests/publish.spec.js.map +1 -0
  141. package/dist/skills/tests/registry-local.spec.d.ts +8 -0
  142. package/dist/skills/tests/registry-local.spec.d.ts.map +1 -0
  143. package/dist/skills/tests/registry-local.spec.js +231 -0
  144. package/dist/skills/tests/registry-local.spec.js.map +1 -0
  145. package/dist/skills/tests/registry.spec.d.ts +7 -0
  146. package/dist/skills/tests/registry.spec.d.ts.map +1 -0
  147. package/dist/skills/tests/registry.spec.js +58 -0
  148. package/dist/skills/tests/registry.spec.js.map +1 -0
  149. package/dist/skills/tests/remote-registry.spec.d.ts +9 -0
  150. package/dist/skills/tests/remote-registry.spec.d.ts.map +1 -0
  151. package/dist/skills/tests/remote-registry.spec.js +357 -0
  152. package/dist/skills/tests/remote-registry.spec.js.map +1 -0
  153. package/dist/skills/tests/update.spec.d.ts +9 -0
  154. package/dist/skills/tests/update.spec.d.ts.map +1 -0
  155. package/dist/skills/tests/update.spec.js +166 -0
  156. package/dist/skills/tests/update.spec.js.map +1 -0
  157. package/dist/types/Refine.types.d.ts +96 -0
  158. package/dist/types/Refine.types.d.ts.map +1 -0
  159. package/dist/types/Refine.types.js +19 -0
  160. package/dist/types/Refine.types.js.map +1 -0
  161. package/dist/types/Review.types.d.ts +86 -0
  162. package/dist/types/Review.types.d.ts.map +1 -0
  163. package/dist/types/Review.types.js +15 -0
  164. package/dist/types/Review.types.js.map +1 -0
  165. package/dist/types/UpdateManifest.types.d.ts +91 -0
  166. package/dist/types/UpdateManifest.types.d.ts.map +1 -0
  167. package/dist/types/UpdateManifest.types.js +13 -0
  168. package/dist/types/UpdateManifest.types.js.map +1 -0
  169. package/dist/utils/ReviewRunner.d.ts +42 -0
  170. package/dist/utils/ReviewRunner.d.ts.map +1 -0
  171. package/dist/utils/ReviewRunner.js +175 -0
  172. package/dist/utils/ReviewRunner.js.map +1 -0
  173. package/dist/utils/UpdateApplier.d.ts +42 -0
  174. package/dist/utils/UpdateApplier.d.ts.map +1 -0
  175. package/dist/utils/UpdateApplier.js +207 -0
  176. package/dist/utils/UpdateApplier.js.map +1 -0
  177. package/dist/utils/UpdateDetector.d.ts +56 -0
  178. package/dist/utils/UpdateDetector.d.ts.map +1 -0
  179. package/dist/utils/UpdateDetector.js +164 -0
  180. package/dist/utils/UpdateDetector.js.map +1 -0
  181. package/dist/utils/banner.d.ts +28 -0
  182. package/dist/utils/banner.d.ts.map +1 -0
  183. package/dist/utils/banner.js +77 -0
  184. package/dist/utils/banner.js.map +1 -0
  185. package/dist/utils/banner.spec.d.ts +5 -0
  186. package/dist/utils/banner.spec.d.ts.map +1 -0
  187. package/dist/utils/banner.spec.js +253 -0
  188. package/dist/utils/banner.spec.js.map +1 -0
  189. package/dist/utils/complexity-analyzer.d.ts +60 -0
  190. package/dist/utils/complexity-analyzer.d.ts.map +1 -0
  191. package/dist/utils/complexity-analyzer.js +292 -0
  192. package/dist/utils/complexity-analyzer.js.map +1 -0
  193. package/dist/utils/confidence.d.ts +41 -0
  194. package/dist/utils/confidence.d.ts.map +1 -0
  195. package/dist/utils/confidence.js +101 -0
  196. package/dist/utils/confidence.js.map +1 -0
  197. package/dist/utils/datamodel.d.ts +41 -0
  198. package/dist/utils/datamodel.d.ts.map +1 -0
  199. package/dist/utils/datamodel.js +535 -0
  200. package/dist/utils/datamodel.js.map +1 -0
  201. package/dist/utils/dna-detector.d.ts +61 -0
  202. package/dist/utils/dna-detector.d.ts.map +1 -0
  203. package/dist/utils/dna-detector.js +354 -0
  204. package/dist/utils/dna-detector.js.map +1 -0
  205. package/dist/utils/dna-facts.d.ts +13 -0
  206. package/dist/utils/dna-facts.d.ts.map +1 -0
  207. package/dist/utils/dna-facts.js +109 -0
  208. package/dist/utils/dna-facts.js.map +1 -0
  209. package/dist/utils/excalidraw-renderer.d.ts +11 -71
  210. package/dist/utils/excalidraw-renderer.d.ts.map +1 -1
  211. package/dist/utils/excalidraw-renderer.js +29 -162
  212. package/dist/utils/excalidraw-renderer.js.map +1 -1
  213. package/dist/utils/graph-renderer.d.ts +115 -0
  214. package/dist/utils/graph-renderer.d.ts.map +1 -0
  215. package/dist/utils/graph-renderer.js +216 -0
  216. package/dist/utils/graph-renderer.js.map +1 -0
  217. package/dist/utils/migration.d.ts +64 -0
  218. package/dist/utils/migration.d.ts.map +1 -0
  219. package/dist/utils/migration.js +183 -0
  220. package/dist/utils/migration.js.map +1 -0
  221. package/dist/utils/module-detector.d.ts +46 -0
  222. package/dist/utils/module-detector.d.ts.map +1 -0
  223. package/dist/utils/module-detector.js +348 -0
  224. package/dist/utils/module-detector.js.map +1 -0
  225. package/dist/utils/project-generator.d.ts.map +1 -1
  226. package/dist/utils/project-generator.js +273 -254
  227. package/dist/utils/project-generator.js.map +1 -1
  228. package/dist/utils/reverse-facts.d.ts +50 -0
  229. package/dist/utils/reverse-facts.d.ts.map +1 -0
  230. package/dist/utils/reverse-facts.js +291 -0
  231. package/dist/utils/reverse-facts.js.map +1 -0
  232. package/dist/utils/stack-bootstrap.js +371 -371
  233. package/dist/utils/static-analyzer.d.ts +29 -0
  234. package/dist/utils/static-analyzer.d.ts.map +1 -0
  235. package/dist/utils/static-analyzer.js +390 -0
  236. package/dist/utils/static-analyzer.js.map +1 -0
  237. package/dist/utils/version-compare.d.ts +27 -0
  238. package/dist/utils/version-compare.d.ts.map +1 -0
  239. package/dist/utils/version-compare.js +47 -0
  240. package/dist/utils/version-compare.js.map +1 -0
  241. package/package.json +8 -3
  242. package/templates/DARE-dag-example.yaml +280 -280
  243. package/templates/UPDATE-MANIFEST.json +48 -0
  244. package/templates/backend/node-nestjs/.env.example +9 -9
  245. package/templates/backend/node-nestjs/nest-cli.json +8 -8
  246. package/templates/backend/node-nestjs/package.json +50 -50
  247. package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
  248. package/templates/backend/node-nestjs/src/app.module.ts +15 -15
  249. package/templates/backend/node-nestjs/src/app.service.ts +8 -8
  250. package/templates/backend/node-nestjs/src/main.ts +24 -24
  251. package/templates/backend/node-nestjs/tsconfig.json +21 -21
  252. package/templates/backend/php-laravel/.env.example +22 -22
  253. package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
  254. package/templates/backend/php-laravel/composer.json +40 -40
  255. package/templates/backend/python-fastapi/.env.example +4 -4
  256. package/templates/backend/python-fastapi/app/api/router.py +8 -8
  257. package/templates/backend/python-fastapi/app/core/config.py +20 -20
  258. package/templates/backend/python-fastapi/main.py +35 -35
  259. package/templates/backend/python-fastapi/requirements.txt +13 -13
  260. package/templates/backend/rust-axum/.env.example +3 -3
  261. package/templates/backend/rust-axum/Cargo.toml +23 -23
  262. package/templates/backend/rust-axum/src/errors.rs +30 -30
  263. package/templates/backend/rust-axum/src/main.rs +32 -32
  264. package/templates/backend/rust-axum/src/routes.rs +6 -6
  265. package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
  266. package/templates/frontend/leptos-csr/Cargo.toml +16 -16
  267. package/templates/frontend/leptos-csr/Trunk.toml +10 -10
  268. package/templates/frontend/leptos-csr/index.html +11 -11
  269. package/templates/frontend/leptos-csr/src/lib.rs +20 -20
  270. package/templates/frontend/leptos-csr/style/main.scss +19 -19
  271. package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
  272. package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
  273. package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
  274. package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
  275. package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
  276. package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
  277. package/templates/frontend/react/index.html +12 -12
  278. package/templates/frontend/react/package.json +35 -35
  279. package/templates/frontend/react/src/App.tsx +25 -25
  280. package/templates/frontend/react/src/main.tsx +9 -9
  281. package/templates/frontend/vue/package.json +32 -32
  282. package/templates/frontend/vue/src/App.vue +7 -7
  283. package/templates/frontend/vue/src/main.ts +10 -10
  284. package/templates/frontend/vue/src/router/index.ts +14 -14
  285. package/templates/frontend/vue/src/views/HomeView.vue +6 -6
  286. package/templates/hooks/pre-commit-dare-validate +24 -24
  287. package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -0
  288. package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +180 -36
  289. package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -0
  290. package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -0
  291. package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
  292. package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -0
  293. package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -0
  294. package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -0
  295. package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -0
  296. package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -0
  297. package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -0
  298. package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -0
  299. package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -0
  300. package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -0
  301. package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -0
  302. package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -0
  303. package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -0
  304. package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -0
  305. package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
  306. package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -0
  307. package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -224
  308. package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -0
  309. package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -0
  310. package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -0
  311. package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -0
  312. package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -0
  313. package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -0
  314. package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
  315. package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
  316. package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -100
  317. package/templates/ide/claude/.claude/commands/dare-ax.md +131 -0
  318. package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -78
  319. package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -0
  320. package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -110
  321. package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
  322. package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -0
  323. package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
  324. package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
  325. package/templates/ide/claude/.claude/commands/dare-dna.md +75 -0
  326. package/templates/ide/claude/.claude/commands/dare-docker.md +207 -0
  327. package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
  328. package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -0
  329. package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -0
  330. package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -0
  331. package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -0
  332. package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -0
  333. package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -0
  334. package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -0
  335. package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -0
  336. package/templates/ide/claude/.claude/commands/dare-refine.md +145 -0
  337. package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -0
  338. package/templates/ide/claude/.claude/commands/dare-review.md +113 -0
  339. package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
  340. package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
  341. package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
  342. package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
  343. package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -0
  344. package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -0
  345. package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -0
  346. package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -0
  347. package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -0
  348. package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -0
  349. package/templates/ide/claude/.claude/settings.example.json +35 -35
  350. package/templates/ide/claude/CLAUDE.md +146 -146
  351. package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
  352. package/templates/ide/claude/templates/DESIGN-template.md +129 -129
  353. package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -100
  354. package/templates/ide/cursor/.cursor/commands/dag-viz.md +139 -0
  355. package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +86 -41
  356. package/templates/ide/cursor/.cursor/commands/generate-design.md +35 -35
  357. package/templates/ide/cursor/.cursor/commands/generate-tasks.md +184 -142
  358. package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -0
  359. package/templates/ide/cursor/.cursor/commands/review-task.md +91 -0
  360. package/templates/ide/cursor/.cursor/commands/run-dag.md +110 -110
  361. package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -0
  362. package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -0
  363. package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -0
  364. package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
  365. package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -0
  366. package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -0
  367. package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -0
  368. package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -0
  369. package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -0
  370. package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -0
  371. package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -0
  372. package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -0
  373. package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -0
  374. package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -0
  375. package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -0
  376. package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -0
  377. package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -0
  378. package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -0
  379. package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
  380. package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
  381. package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
  382. package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
  383. package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -100
  384. package/templates/shared/docker-compose.yml +41 -41
  385. package/dist/__tests__/dag-runner/adapters.test.d.ts +0 -2
  386. package/dist/__tests__/dag-runner/adapters.test.d.ts.map +0 -1
  387. package/dist/__tests__/dag-runner/adapters.test.js +0 -134
  388. package/dist/__tests__/dag-runner/adapters.test.js.map +0 -1
  389. package/dist/dag-runner/adapters/antigravity.d.ts +0 -6
  390. package/dist/dag-runner/adapters/antigravity.d.ts.map +0 -1
  391. package/dist/dag-runner/adapters/antigravity.js +0 -54
  392. package/dist/dag-runner/adapters/antigravity.js.map +0 -1
  393. package/dist/dag-runner/adapters/claude.d.ts +0 -6
  394. package/dist/dag-runner/adapters/claude.d.ts.map +0 -1
  395. package/dist/dag-runner/adapters/claude.js +0 -48
  396. package/dist/dag-runner/adapters/claude.js.map +0 -1
  397. package/dist/dag-runner/adapters/cursor.d.ts +0 -6
  398. package/dist/dag-runner/adapters/cursor.d.ts.map +0 -1
  399. package/dist/dag-runner/adapters/cursor.js +0 -58
  400. package/dist/dag-runner/adapters/cursor.js.map +0 -1
  401. package/dist/dag-runner/adapters/index.d.ts +0 -46
  402. package/dist/dag-runner/adapters/index.d.ts.map +0 -1
  403. package/dist/dag-runner/adapters/index.js +0 -55
  404. package/dist/dag-runner/adapters/index.js.map +0 -1
  405. package/dist/dag-runner/utils/timeout.d.ts +0 -27
  406. package/dist/dag-runner/utils/timeout.d.ts.map +0 -1
  407. package/dist/dag-runner/utils/timeout.js +0 -55
  408. package/dist/dag-runner/utils/timeout.js.map +0 -1
@@ -0,0 +1,217 @@
1
+ ---
2
+ name: dare-llm-integration
3
+ description: Integração com LLMs (Large Language Models) em projetos DARE. Fornece abstração LLMProvider, cache em memória com TTL, rate limiting via token bucket, prompt templates versionados e validação de output via JSON Schema. Cobre antipatterns crítico de prompt injection e LLM output não validado.
4
+ ---
5
+
6
+ # DARE LLM Integration Skill
7
+
8
+ Você é um especialista em integração com LLMs (Gemini, Claude, GPT, modelos locais). Seu papel é garantir que toda chamada a LLM em projeto DARE seja **abstraída, cacheada, rate-limited, validada e auditável**.
9
+
10
+ ## Quando usar esta skill
11
+
12
+ - Projeto vai consumir Gemini, Claude API, OpenAI, Ollama ou similar
13
+ - Você está revisando Handler que chama SDK de LLM diretamente
14
+ - Você está auditando custos de LLM no projeto
15
+ - Você está adicionando proteção contra prompt injection
16
+
17
+ ## A arquitetura recomendada
18
+
19
+ ```
20
+ ┌────────────────────────────────────────────────────────┐
21
+ │ Handler / Service │
22
+ └────────────────────────────────────────────────────────┘
23
+ ↓ injeta
24
+ ┌────────────────────────────────────────────────────────┐
25
+ │ LLMProvider (interface) │
26
+ │ ├── GeminiProvider │
27
+ │ ├── ClaudeProvider │
28
+ │ ├── OpenAIProvider │
29
+ │ └── OllamaProvider (local) │
30
+ └────────────────────────────────────────────────────────┘
31
+ ↓ wrapping
32
+ ┌────────────────────────────────────────────────────────┐
33
+ │ Cache (TTL) + RateLimit (token bucket) + Schema │
34
+ └────────────────────────────────────────────────────────┘
35
+
36
+ ┌────────────────────────────────────────────────────────┐
37
+ │ HTTP call externo (Gemini API, etc.) │
38
+ └────────────────────────────────────────────────────────┘
39
+ ```
40
+
41
+ ## Os 5 pilares
42
+
43
+ ### 1. LLMProvider abstraction
44
+
45
+ NUNCA chame SDK do Gemini/OpenAI dentro de um Handler ou Service de negócio. Sempre passe pela interface `LLMProvider`.
46
+
47
+ ```typescript
48
+ // ❌ Errado
49
+ class SummaryService {
50
+ async run(text: string) {
51
+ const client = new GoogleGenAI({apiKey: 'xxx'});
52
+ return client.generateContent({contents: text});
53
+ }
54
+ }
55
+
56
+ // ✅ Certo
57
+ class SummaryService {
58
+ constructor(private llm: LLMProvider) {}
59
+ async run(text: string) {
60
+ return this.llm.complete({
61
+ promptId: 'summarize-v1',
62
+ input: { text },
63
+ schema: SummarySchema,
64
+ });
65
+ }
66
+ }
67
+ ```
68
+
69
+ ### 2. Cache em memória com TTL
70
+
71
+ Toda chamada deve passar por cache. Cache key = `hash(promptId + input + model)`. TTL configurável por prompt (default 1 hora).
72
+
73
+ **Antipattern AP-02:** Sem cache → custo explode em loops.
74
+
75
+ ### 3. Rate limit via token bucket
76
+
77
+ Proteja a integração externa **e** seu wallet. Configure tokens/segundo por provider.
78
+
79
+ | Provider | Limite típico |
80
+ |---|---|
81
+ | Gemini Free | 15 RPM, 1 milhão tokens/dia |
82
+ | Claude API | 50 RPM (tier 1) |
83
+ | OpenAI | 500 RPM (tier 1) |
84
+ | Ollama local | sem limite, mas latência alta |
85
+
86
+ ### 4. Prompt templates versionados
87
+
88
+ Prompts NUNCA ficam inline em código. Vivem em `prompts/<id>.v<n>.md`:
89
+
90
+ ```markdown
91
+ ---
92
+ id: summarize
93
+ version: 1
94
+ model: gemini-2.0-flash
95
+ temperature: 0.2
96
+ max_tokens: 500
97
+ schema: SummarySchema
98
+ ---
99
+
100
+ # System
101
+
102
+ You are a concise summarizer. Output JSON with this schema:
103
+ {schema}
104
+
105
+ # User
106
+
107
+ Summarize the following text in 3 bullet points:
108
+
109
+ <text>{{ text }}</text>
110
+ ```
111
+
112
+ Substituição usa **template engine seguro** (Jinja2, Handlebars com sandbox, ou string interpolation com escape) — nunca `eval` ou `f-string` direto com user input.
113
+
114
+ ### 5. Validação via JSON Schema
115
+
116
+ LLM mente. Sempre valide o output:
117
+
118
+ ```typescript
119
+ const result = await llm.complete({...});
120
+ const validated = SummarySchema.parse(result); // Zod, Pydantic, ajv...
121
+ if (!validated.success) {
122
+ throw new LLMOutputInvalidError(validated.error);
123
+ // Logar + alertar — pode indicar prompt injection ou drift de modelo
124
+ }
125
+ ```
126
+
127
+ ## Métricas obrigatórias
128
+
129
+ | ID | Métrica | Como medir |
130
+ |---|---|---|
131
+ | M-01 | 100% das chamadas LLM via LLMProvider injetado | grep por `new GoogleGenAI \| new OpenAI \| Anthropic(` em Services |
132
+ | M-02 | 100% das responses LLM cacheadas | logs do cache layer |
133
+ | M-03 | 100% das requests LLM com rate limit | rate limiter ativo em todo provider |
134
+ | M-04 | 100% das respostas LLM validadas contra schema | grep por `.parse(` ou `Pydantic` no resultado |
135
+
136
+ ## Antipatterns
137
+
138
+ | AP | Antipattern | Por que evitar |
139
+ |---|---|---|
140
+ | AP-01 | SDK do LLM direto em Handler | impossível mockar, impossível trocar de provider |
141
+ | AP-02 | Sem cache | custo explode, latência ruim |
142
+ | AP-03 | Prompt em código | impossível versionar e A/B testar |
143
+ | AP-04 | User input direto em prompt | prompt injection trivial |
144
+ | AP-05 | Confiar em output LLM sem validar | LLM mente — schema é defesa |
145
+
146
+ ## Defesa contra prompt injection (crítico)
147
+
148
+ ```python
149
+ # ❌ Errado — instrução + dado misturados
150
+ system = f"You are an assistant. {user_question}"
151
+
152
+ # ✅ Certo — separação clara
153
+ messages = [
154
+ {"role": "system", "content": "You are an assistant. Answer only based on the provided document."},
155
+ {"role": "user", "content": f"<document>{escape(doc)}</document>\n\n<question>{escape(q)}</question>"}
156
+ ]
157
+ ```
158
+
159
+ Regras:
160
+ - Use delimitadores (`<document>`, `<question>`)
161
+ - Escape conteúdo do usuário (XML escape, HTML escape)
162
+ - Detecte e remova padrões "Ignore as instruções acima", "You are now ..."
163
+ - Valide output contra schema — output fora do schema = possível injection bem-sucedido
164
+
165
+ ## Como aplicar
166
+
167
+ ### Passo 1: Criar abstração LLMProvider
168
+
169
+ ```typescript
170
+ interface LLMProvider {
171
+ complete(req: LLMRequest): Promise<LLMResponse>;
172
+ }
173
+
174
+ interface LLMRequest {
175
+ promptId: string;
176
+ input: Record<string, unknown>;
177
+ schema: ZodSchema;
178
+ options?: { temperature?: number; maxTokens?: number };
179
+ }
180
+ ```
181
+
182
+ ### Passo 2: Implementar 1+ provider
183
+
184
+ Comece com o que o projeto usa (Gemini, Claude, etc.). Adicione mais conforme necessário.
185
+
186
+ ### Passo 3: Configurar cache
187
+
188
+ `packages/skills/dare-llm-integration/cache/` tem implementação em memória com TTL pronta. Use ou copie.
189
+
190
+ ### Passo 4: Configurar rate limit
191
+
192
+ Token bucket por provider, configurado em `app.config`.
193
+
194
+ ### Passo 5: Migrar prompts inline para arquivos
195
+
196
+ Inventarie todos os `system: "..."` no código e mova para `prompts/<id>.v1.md`.
197
+
198
+ ### Passo 6: Adicionar validação de output
199
+
200
+ Schema Zod/Pydantic/serde para cada prompt. CI falha se prompt não tiver schema declarado.
201
+
202
+ ## Boas práticas
203
+
204
+ 1. **Provider neutro no domínio** — Service não sabe se é Gemini ou Claude
205
+ 2. **Custo é parte da observabilidade** — logue tokens in/out + custo estimado por request
206
+ 3. **Fallback** — se provider primário falhar, tente secundário (Gemini → Claude)
207
+ 4. **Latência alta = degrada UX** — esconda atrás de fila assíncrona quando >2s
208
+
209
+ ## Dicas
210
+
211
+ - **Leia** `docs/design/skills/dare-llm-integration/DESIGN.md`
212
+ - **Combine** com `dare-security` (RS-* para prompt injection)
213
+ - **Use** os providers em `packages/skills/dare-llm-integration/providers/` como referência
214
+
215
+ ---
216
+
217
+ Esta skill é parte do DARE Method e está sob licença MIT.
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: dare-migrate
3
+ description: Camada semântica da migração (Fase 2 brownfield). Roda depois do comando `dare migrate` e escreve a estratégia de migração + cenários Gherkin de paridade reais no DARE/MIGRATION/, garantindo reimplementação fiel ao legado.
4
+ ---
5
+
6
+ # DARE Migrate Skill — Migração com paridade (brownfield Fase 2)
7
+
8
+ Você é o agente que transforma o entendimento do legado em um **plano de migração com paridade**.
9
+ Esta skill é a camada **semântica**: roda **depois** do comando `dare migrate`, que já leu os
10
+ artefatos do `reverse`/`dna` e gerou os esqueletos. Sua função é **escrever a estratégia de migração
11
+ e os cenários Gherkin de paridade reais** — o contrato comportamental que garante uma reimplementação
12
+ fiel ao legado.
13
+
14
+ > Pré-requisito: o comando `dare migrate --to <stack>` precisa ter rodado antes (gera
15
+ > `DARE/MIGRATION/MIGRATION.md`, `migration-facts.json`, `parity/*.feature`). Que por sua vez exige
16
+ > `dare reverse` já executado. Se faltar, peça ao usuário para rodar na ordem.
17
+
18
+ ## Quando usar esta skill
19
+ - Projeto legado entendido (`reverse` + `dna`) que será reimplementado em outra stack.
20
+ - Acabou de rodar `dare migrate` e há seções `<!-- AGENT -->` / `# AGENT` em aberto.
21
+
22
+ ## Passo a passo
23
+
24
+ ### 1. Carregar contexto (não re-varrer)
25
+ Leia `migration-facts.json` (origem/alvo/módulos/blocking gaps), `IDEIA.md` + `REVERSE/module-*.md`
26
+ e `PROJECT-DNA.md`. Abra arquivos-chave do legado só o necessário para inferir comportamento.
27
+
28
+ ### 2. Preencher `DARE/MIGRATION/MIGRATION.md`
29
+ - **Decisão de Paradigma** — mudou (procedural→OO, monólito→serviços)? Decisão + justificativa.
30
+ - **Estratégia** — big-bang vs. strangler/parallel-run; ordem dos módulos; feature flags.
31
+ - **Registro de Risco** — tratar cada blocking gap (🔴) + riscos de regressão/dados/performance.
32
+ - **Arquitetura-alvo** — na stack-alvo, alinhada ao DNA quando o paradigma for preservado.
33
+ - **Cutover & Rollback** — passos, validação de paridade (rodar `.feature`), go/no-go, rollback.
34
+
35
+ ### 3. Gherkin de paridade (`parity/<módulo>.feature`)
36
+ Um `Scenario` por fluxo observável, derivado do **comportamento legado real**: `Given` → `When` →
37
+ `Then` idêntico ao legado. Inclua bordas/formatos (arredondamento, máscaras). É o contrato de aceite
38
+ da reimplementação na stack-alvo.
39
+
40
+ ### 4. Apresentar ao usuário
41
+ Resumo: paradigma, estratégia, nº de cenários de paridade, blocking gaps a resolver.
42
+
43
+ ## Regras de ouro
44
+ 1. **Paridade primeiro** — todo fluxo crítico vira `Scenario`.
45
+ 2. **Blocking gaps são bloqueantes** — 🔴 não resolvido é risco; trate ou registre.
46
+ 3. **Respeite o DNA** — arquitetura-alvo segue as convenções da casa.
47
+ 4. **Não invente comportamento** — cenário sem base no legado = regressão silenciosa.
48
+ 5. **Strangler quando possível** — incremental com parallel-run reduz risco.
49
+
50
+ ## Antipatterns
51
+ | AP | Antipattern | Por quê |
52
+ |---|---|---|
53
+ | AP-01 | Gherkin genérico sem base no legado | Não garante paridade |
54
+ | AP-02 | Ignorar blocking gaps (🔴) | Reimplementa sobre incerteza |
55
+ | AP-03 | Big-bang sem necessidade | Maximiza risco |
56
+ | AP-04 | Arquitetura-alvo desalinhada do DNA | Código vira ilha inconsistente |
57
+ | AP-05 | Reescrever os fatos determinísticos do CLI | Quebra a fonte de verdade |
58
+
59
+ ---
60
+
61
+ Skill MIT — parte do DARE Method. Fase 2 (brownfield). Pareia com o comando `dare migrate`.
@@ -0,0 +1,187 @@
1
+ ---
2
+ name: dare-quality-telemetry
3
+ description: Coleta de métricas de qualidade e detecção de regressões em projetos DARE. Agrega métricas das skills filhas (dare-ax, dare-layered-design, etc.), persiste histórico em tmp/dare_metrics.json e detecta regressões contra baseline. Inclui template de GitHub Actions.
4
+ ---
5
+
6
+ # DARE Quality Telemetry Skill
7
+
8
+ Você é um engenheiro de plataforma especialista em observabilidade de qualidade. Seu papel é garantir que todo projeto DARE colete métricas das skills aplicadas, persista histórico, e detecte regressões antes do release.
9
+
10
+ ## Quando usar esta skill
11
+
12
+ - Projeto já tem várias skills DARE configuradas (ax, layered-design, llm-integration, etc.)
13
+ - Você quer ver evolução de métricas ao longo do tempo
14
+ - Você quer falhar o CI quando uma métrica regredir
15
+ - Você quer dashboards/reports de saúde do projeto
16
+
17
+ ## O que essa skill faz
18
+
19
+ 1. **Coleta** — roda os collectors de cada skill filha em paralelo
20
+ 2. **Agrega** — junta todas as métricas em um snapshot estruturado
21
+ 3. **Persiste** — guarda em `tmp/dare_metrics.json` (histórico append-only)
22
+ 4. **Compara** — diff contra `tmp/dare_metrics_baseline.json`
23
+ 5. **Reporta** — gera markdown report para CI ou stdout
24
+ 6. **Bloqueia** — exit code ≠ 0 se regressão crítica
25
+
26
+ ## Arquitetura
27
+
28
+ ```
29
+ ┌──────────────────────────────────────────────────────────┐
30
+ │ collect.ts (orquestrador) │
31
+ └──────────────────────────────────────────────────────────┘
32
+ ↓ chama em paralelo
33
+ ┌────────────────┬────────────────┬────────────────┐
34
+ │ ax collector │ layered coll. │ llm coll. │ …
35
+ └────────────────┴────────────────┴────────────────┘
36
+
37
+ ┌──────────────────────────────────────────────────────────┐
38
+ │ Aggregator → snapshot { skill: { M-01: value, ... } } │
39
+ └──────────────────────────────────────────────────────────┘
40
+
41
+ ┌──────────────────────────────────────────────────────────┐
42
+ │ tmp/dare_metrics.json (append) + Regression detector │
43
+ └──────────────────────────────────────────────────────────┘
44
+
45
+ ┌──────────────────────────────────────────────────────────┐
46
+ │ Reporter → markdown / json / GitHub Action summary │
47
+ └──────────────────────────────────────────────────────────┘
48
+ ```
49
+
50
+ ## Métricas obrigatórias da própria skill
51
+
52
+ | ID | Métrica | Como medir |
53
+ |---|---|---|
54
+ | M-01 | 100% dos builds incluem coleta de métricas (skill instalada = sempre true) | Verifica `package.json` ou pipeline yml |
55
+ | M-02 | 0 regressões passam despercebidas (baseline existe para comparação) | `test -f tmp/dare_metrics_baseline.json` |
56
+ | M-03 | Histórico de métricas mantido | `test -f tmp/dare_metrics.json` |
57
+ | M-04 | Workflow GitHub Actions existe | `test -f .github/workflows/dare-metrics.yml` |
58
+
59
+ ## Como aplicar
60
+
61
+ ### Passo 1: Instalar a skill no projeto
62
+
63
+ ```bash
64
+ # Dentro do projeto
65
+ pnpm add @dare/quality-telemetry
66
+ # ou
67
+ npm install @dare/quality-telemetry
68
+ ```
69
+
70
+ ### Passo 2: Configurar quais skills rastrear
71
+
72
+ ```yaml
73
+ # dare.config.yml
74
+ telemetry:
75
+ skills:
76
+ - dare-ax
77
+ - dare-layered-design
78
+ - dare-llm-integration
79
+ - dare-frontend-design
80
+ - dare-realtime
81
+ output: tmp/dare_metrics.json
82
+ baseline: tmp/dare_metrics_baseline.json
83
+ fail_on_regression: true
84
+ ```
85
+
86
+ ### Passo 3: Rodar collect
87
+
88
+ ```bash
89
+ dare metrics collect
90
+ # saída:
91
+ # ✓ dare-ax M-01:1.0 M-02:1.0 M-03:1.0 M-04:1.0
92
+ # ✓ dare-layered M-01:0.95 M-02:1.0 M-03:1.0 M-04:1.0
93
+ # ✓ dare-llm M-01:1.0 M-02:0.92 M-03:1.0 M-04:1.0
94
+ ```
95
+
96
+ ### Passo 4: Capturar baseline
97
+
98
+ ```bash
99
+ dare metrics baseline
100
+ # copia tmp/dare_metrics.json → tmp/dare_metrics_baseline.json
101
+ ```
102
+
103
+ ### Passo 5: Adicionar workflow CI
104
+
105
+ ```yaml
106
+ # .github/workflows/dare-metrics.yml
107
+ name: DARE Metrics
108
+
109
+ on: [push, pull_request]
110
+
111
+ jobs:
112
+ metrics:
113
+ runs-on: ubuntu-latest
114
+ steps:
115
+ - uses: actions/checkout@v4
116
+ - uses: actions/setup-node@v4
117
+ with: { node-version: '20' }
118
+ - run: pnpm install
119
+ - run: pnpm dare metrics collect
120
+ - run: pnpm dare metrics compare
121
+ # exit 1 se regressão crítica detectada
122
+ - uses: actions/upload-artifact@v4
123
+ with:
124
+ name: dare-metrics
125
+ path: tmp/dare_metrics*.json
126
+ ```
127
+
128
+ ## Schema do snapshot
129
+
130
+ ```json
131
+ {
132
+ "timestamp": "2026-05-26T10:30:00Z",
133
+ "commit": "1d4a1417",
134
+ "branch": "main",
135
+ "skills": {
136
+ "dare-ax": {
137
+ "M-01": { "value": 1.0, "status": "PASS" },
138
+ "M-02": { "value": 1.0, "status": "PASS" },
139
+ "M-03": { "value": 1.0, "status": "PASS" },
140
+ "M-04": { "value": 1.0, "status": "PASS" }
141
+ },
142
+ "dare-layered-design": {
143
+ "M-01": { "value": 0.95, "status": "PASS" },
144
+ "M-02": { "value": 1.0, "status": "PASS" },
145
+ "M-03": { "value": 1.0, "status": "PASS" },
146
+ "M-04": { "value": 1.0, "status": "PASS" }
147
+ }
148
+ }
149
+ }
150
+ ```
151
+
152
+ ## Detecção de regressão
153
+
154
+ Para cada métrica, comparar valor atual com baseline:
155
+
156
+ | Mudança | Severidade | Ação |
157
+ |---|---|---|
158
+ | value caiu ≥ 5% | CRITICAL | bloquear PR |
159
+ | value caiu < 5% mas ≥ 1% | WARNING | comentar no PR, não bloquear |
160
+ | value subiu | INFO | celebrar |
161
+ | value igual | NEUTRAL | nenhuma |
162
+
163
+ ## Antipatterns
164
+
165
+ | AP | Antipattern | Por que evitar |
166
+ |---|---|---|
167
+ | AP-01 | Coletar métricas sem baseline | Não dá pra detectar regressão |
168
+ | AP-02 | Histórico não versionado | Perde contexto histórico |
169
+ | AP-03 | Coletar mas não bloquear regressão | CI vira teatro |
170
+ | AP-04 | Baseline desatualizado | Regressão real fica invisível |
171
+
172
+ ## Boas práticas
173
+
174
+ 1. **Baseline atualizado a cada release** — não a cada commit
175
+ 2. **Regressão = bloqueio de release**, não comentário ignorável
176
+ 3. **Métricas exportadas para Datadog/Grafana** após N coletas, para visualizar tendência
177
+ 4. **Skill deve rodar em < 60s** — se demorar, paralelizar collectors
178
+
179
+ ## Dicas
180
+
181
+ - **Use** o template `packages/skills/dare-quality-telemetry/github_actions_template.ts` para gerar `.github/workflows/dare-metrics.yml`
182
+ - **Combine** com `dare-ax` (M-01 a M-04 dela são coletadas aqui)
183
+ - **Estenda** criando collectors custom para métricas específicas do projeto (cobertura de testes, build time, etc.)
184
+
185
+ ---
186
+
187
+ Esta skill é parte do DARE Method e está sob licença MIT.
@@ -0,0 +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.