@dewtech/dare-cli 2.17.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 (344) hide show
  1. package/README.md +98 -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.js +49 -49
  31. package/dist/__tests__/reverse-facts.test.d.ts +2 -0
  32. package/dist/__tests__/reverse-facts.test.d.ts.map +1 -0
  33. package/dist/__tests__/reverse-facts.test.js +78 -0
  34. package/dist/__tests__/reverse-facts.test.js.map +1 -0
  35. package/dist/__tests__/review.test.js +38 -38
  36. package/dist/__tests__/validate.test.js +65 -65
  37. package/dist/bin/dare.js +32 -3
  38. package/dist/bin/dare.js.map +1 -1
  39. package/dist/commands/blueprint.js +122 -122
  40. package/dist/commands/dag.d.ts.map +1 -1
  41. package/dist/commands/dag.js +43 -79
  42. package/dist/commands/dag.js.map +1 -1
  43. package/dist/commands/dna.d.ts +3 -0
  44. package/dist/commands/dna.d.ts.map +1 -0
  45. package/dist/commands/dna.js +69 -0
  46. package/dist/commands/dna.js.map +1 -0
  47. package/dist/commands/migrate.d.ts +3 -0
  48. package/dist/commands/migrate.d.ts.map +1 -0
  49. package/dist/commands/migrate.js +101 -0
  50. package/dist/commands/migrate.js.map +1 -0
  51. package/dist/commands/new.d.ts +16 -0
  52. package/dist/commands/new.d.ts.map +1 -0
  53. package/dist/commands/new.js +103 -0
  54. package/dist/commands/new.js.map +1 -0
  55. package/dist/commands/reverse.d.ts +3 -0
  56. package/dist/commands/reverse.d.ts.map +1 -0
  57. package/dist/commands/reverse.js +201 -0
  58. package/dist/commands/reverse.js.map +1 -0
  59. package/dist/commands/welcome.d.ts +14 -0
  60. package/dist/commands/welcome.d.ts.map +1 -0
  61. package/dist/commands/welcome.js +29 -0
  62. package/dist/commands/welcome.js.map +1 -0
  63. package/dist/skills/commands/add.d.ts +23 -0
  64. package/dist/skills/commands/add.d.ts.map +1 -0
  65. package/dist/skills/commands/add.js +206 -0
  66. package/dist/skills/commands/add.js.map +1 -0
  67. package/dist/skills/commands/info.d.ts +14 -0
  68. package/dist/skills/commands/info.d.ts.map +1 -0
  69. package/dist/skills/commands/info.js +99 -0
  70. package/dist/skills/commands/info.js.map +1 -0
  71. package/dist/skills/commands/list.d.ts +19 -0
  72. package/dist/skills/commands/list.d.ts.map +1 -0
  73. package/dist/skills/commands/list.js +163 -0
  74. package/dist/skills/commands/list.js.map +1 -0
  75. package/dist/skills/commands/publish.d.ts +56 -0
  76. package/dist/skills/commands/publish.d.ts.map +1 -0
  77. package/dist/skills/commands/publish.js +272 -0
  78. package/dist/skills/commands/publish.js.map +1 -0
  79. package/dist/skills/commands/remove.d.ts +19 -0
  80. package/dist/skills/commands/remove.d.ts.map +1 -0
  81. package/dist/skills/commands/remove.js +96 -0
  82. package/dist/skills/commands/remove.js.map +1 -0
  83. package/dist/skills/commands/update.d.ts +31 -0
  84. package/dist/skills/commands/update.d.ts.map +1 -0
  85. package/dist/skills/commands/update.js +132 -0
  86. package/dist/skills/commands/update.js.map +1 -0
  87. package/dist/skills/index.d.ts +22 -0
  88. package/dist/skills/index.d.ts.map +1 -0
  89. package/dist/skills/index.js +33 -0
  90. package/dist/skills/index.js.map +1 -0
  91. package/dist/skills/manifest.d.ts +54 -0
  92. package/dist/skills/manifest.d.ts.map +1 -0
  93. package/dist/skills/manifest.js +162 -0
  94. package/dist/skills/manifest.js.map +1 -0
  95. package/dist/skills/registry-local.d.ts +67 -0
  96. package/dist/skills/registry-local.d.ts.map +1 -0
  97. package/dist/skills/registry-local.js +130 -0
  98. package/dist/skills/registry-local.js.map +1 -0
  99. package/dist/skills/registry-mock.json +109 -0
  100. package/dist/skills/registry-remote.d.ts +110 -0
  101. package/dist/skills/registry-remote.d.ts.map +1 -0
  102. package/dist/skills/registry-remote.js +246 -0
  103. package/dist/skills/registry-remote.js.map +1 -0
  104. package/dist/skills/registry.d.ts +49 -0
  105. package/dist/skills/registry.d.ts.map +1 -0
  106. package/dist/skills/registry.js +94 -0
  107. package/dist/skills/registry.js.map +1 -0
  108. package/dist/skills/tests/manifest.spec.d.ts +8 -0
  109. package/dist/skills/tests/manifest.spec.d.ts.map +1 -0
  110. package/dist/skills/tests/manifest.spec.js +176 -0
  111. package/dist/skills/tests/manifest.spec.js.map +1 -0
  112. package/dist/skills/tests/publish.spec.d.ts +12 -0
  113. package/dist/skills/tests/publish.spec.d.ts.map +1 -0
  114. package/dist/skills/tests/publish.spec.js +276 -0
  115. package/dist/skills/tests/publish.spec.js.map +1 -0
  116. package/dist/skills/tests/registry-local.spec.d.ts +8 -0
  117. package/dist/skills/tests/registry-local.spec.d.ts.map +1 -0
  118. package/dist/skills/tests/registry-local.spec.js +231 -0
  119. package/dist/skills/tests/registry-local.spec.js.map +1 -0
  120. package/dist/skills/tests/registry.spec.d.ts +7 -0
  121. package/dist/skills/tests/registry.spec.d.ts.map +1 -0
  122. package/dist/skills/tests/registry.spec.js +58 -0
  123. package/dist/skills/tests/registry.spec.js.map +1 -0
  124. package/dist/skills/tests/remote-registry.spec.d.ts +9 -0
  125. package/dist/skills/tests/remote-registry.spec.d.ts.map +1 -0
  126. package/dist/skills/tests/remote-registry.spec.js +357 -0
  127. package/dist/skills/tests/remote-registry.spec.js.map +1 -0
  128. package/dist/skills/tests/update.spec.d.ts +9 -0
  129. package/dist/skills/tests/update.spec.d.ts.map +1 -0
  130. package/dist/skills/tests/update.spec.js +166 -0
  131. package/dist/skills/tests/update.spec.js.map +1 -0
  132. package/dist/utils/banner.d.ts +28 -0
  133. package/dist/utils/banner.d.ts.map +1 -0
  134. package/dist/utils/banner.js +77 -0
  135. package/dist/utils/banner.js.map +1 -0
  136. package/dist/utils/banner.spec.d.ts +5 -0
  137. package/dist/utils/banner.spec.d.ts.map +1 -0
  138. package/dist/utils/banner.spec.js +253 -0
  139. package/dist/utils/banner.spec.js.map +1 -0
  140. package/dist/utils/confidence.d.ts +41 -0
  141. package/dist/utils/confidence.d.ts.map +1 -0
  142. package/dist/utils/confidence.js +101 -0
  143. package/dist/utils/confidence.js.map +1 -0
  144. package/dist/utils/datamodel.d.ts +41 -0
  145. package/dist/utils/datamodel.d.ts.map +1 -0
  146. package/dist/utils/datamodel.js +535 -0
  147. package/dist/utils/datamodel.js.map +1 -0
  148. package/dist/utils/dna-detector.d.ts +61 -0
  149. package/dist/utils/dna-detector.d.ts.map +1 -0
  150. package/dist/utils/dna-detector.js +354 -0
  151. package/dist/utils/dna-detector.js.map +1 -0
  152. package/dist/utils/dna-facts.d.ts +13 -0
  153. package/dist/utils/dna-facts.d.ts.map +1 -0
  154. package/dist/utils/dna-facts.js +109 -0
  155. package/dist/utils/dna-facts.js.map +1 -0
  156. package/dist/utils/excalidraw-renderer.d.ts +11 -71
  157. package/dist/utils/excalidraw-renderer.d.ts.map +1 -1
  158. package/dist/utils/excalidraw-renderer.js +29 -162
  159. package/dist/utils/excalidraw-renderer.js.map +1 -1
  160. package/dist/utils/graph-renderer.d.ts +115 -0
  161. package/dist/utils/graph-renderer.d.ts.map +1 -0
  162. package/dist/utils/graph-renderer.js +216 -0
  163. package/dist/utils/graph-renderer.js.map +1 -0
  164. package/dist/utils/migration.d.ts +64 -0
  165. package/dist/utils/migration.d.ts.map +1 -0
  166. package/dist/utils/migration.js +183 -0
  167. package/dist/utils/migration.js.map +1 -0
  168. package/dist/utils/module-detector.d.ts +46 -0
  169. package/dist/utils/module-detector.d.ts.map +1 -0
  170. package/dist/utils/module-detector.js +348 -0
  171. package/dist/utils/module-detector.js.map +1 -0
  172. package/dist/utils/project-generator.js +252 -252
  173. package/dist/utils/reverse-facts.d.ts +50 -0
  174. package/dist/utils/reverse-facts.d.ts.map +1 -0
  175. package/dist/utils/reverse-facts.js +291 -0
  176. package/dist/utils/reverse-facts.js.map +1 -0
  177. package/dist/utils/stack-bootstrap.js +371 -371
  178. package/package.json +8 -3
  179. package/templates/DARE-dag-example.yaml +280 -280
  180. package/templates/UPDATE-MANIFEST.json +48 -48
  181. package/templates/backend/node-nestjs/.env.example +9 -9
  182. package/templates/backend/node-nestjs/nest-cli.json +8 -8
  183. package/templates/backend/node-nestjs/package.json +50 -50
  184. package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
  185. package/templates/backend/node-nestjs/src/app.module.ts +15 -15
  186. package/templates/backend/node-nestjs/src/app.service.ts +8 -8
  187. package/templates/backend/node-nestjs/src/main.ts +24 -24
  188. package/templates/backend/node-nestjs/tsconfig.json +21 -21
  189. package/templates/backend/php-laravel/.env.example +22 -22
  190. package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
  191. package/templates/backend/php-laravel/composer.json +40 -40
  192. package/templates/backend/python-fastapi/.env.example +4 -4
  193. package/templates/backend/python-fastapi/app/api/router.py +8 -8
  194. package/templates/backend/python-fastapi/app/core/config.py +20 -20
  195. package/templates/backend/python-fastapi/main.py +35 -35
  196. package/templates/backend/python-fastapi/requirements.txt +13 -13
  197. package/templates/backend/rust-axum/.env.example +3 -3
  198. package/templates/backend/rust-axum/Cargo.toml +23 -23
  199. package/templates/backend/rust-axum/src/errors.rs +30 -30
  200. package/templates/backend/rust-axum/src/main.rs +32 -32
  201. package/templates/backend/rust-axum/src/routes.rs +6 -6
  202. package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
  203. package/templates/frontend/leptos-csr/Cargo.toml +16 -16
  204. package/templates/frontend/leptos-csr/Trunk.toml +10 -10
  205. package/templates/frontend/leptos-csr/index.html +11 -11
  206. package/templates/frontend/leptos-csr/src/lib.rs +20 -20
  207. package/templates/frontend/leptos-csr/style/main.scss +19 -19
  208. package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
  209. package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
  210. package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
  211. package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
  212. package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
  213. package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
  214. package/templates/frontend/react/index.html +12 -12
  215. package/templates/frontend/react/package.json +35 -35
  216. package/templates/frontend/react/src/App.tsx +25 -25
  217. package/templates/frontend/react/src/main.tsx +9 -9
  218. package/templates/frontend/vue/package.json +32 -32
  219. package/templates/frontend/vue/src/App.vue +7 -7
  220. package/templates/frontend/vue/src/main.ts +10 -10
  221. package/templates/frontend/vue/src/router/index.ts +14 -14
  222. package/templates/frontend/vue/src/views/HomeView.vue +6 -6
  223. package/templates/hooks/pre-commit-dare-validate +24 -24
  224. package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -0
  225. package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -0
  226. package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -0
  227. package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
  228. package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -0
  229. package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -0
  230. package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -0
  231. package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -0
  232. package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -0
  233. package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -0
  234. package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -0
  235. package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -0
  236. package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -0
  237. package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
  238. package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -0
  239. package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
  240. package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -0
  241. package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
  242. package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -0
  243. package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
  244. package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -0
  245. package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -0
  246. package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -0
  247. package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -0
  248. package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -0
  249. package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -0
  250. package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
  251. package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
  252. package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -141
  253. package/templates/ide/claude/.claude/commands/dare-ax.md +131 -0
  254. package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
  255. package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -0
  256. package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
  257. package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
  258. package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -0
  259. package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
  260. package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
  261. package/templates/ide/claude/.claude/commands/dare-dna.md +75 -0
  262. package/templates/ide/claude/.claude/commands/dare-docker.md +207 -0
  263. package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
  264. package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -0
  265. package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -0
  266. package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -0
  267. package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -0
  268. package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -0
  269. package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -0
  270. package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -0
  271. package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -0
  272. package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
  273. package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -0
  274. package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
  275. package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
  276. package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
  277. package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
  278. package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
  279. package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -0
  280. package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -0
  281. package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -0
  282. package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -0
  283. package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -0
  284. package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -0
  285. package/templates/ide/claude/.claude/settings.example.json +35 -35
  286. package/templates/ide/claude/CLAUDE.md +146 -146
  287. package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
  288. package/templates/ide/claude/templates/DESIGN-template.md +129 -129
  289. package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -141
  290. package/templates/ide/cursor/.cursor/commands/dag-viz.md +139 -0
  291. package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +86 -86
  292. package/templates/ide/cursor/.cursor/commands/generate-design.md +35 -35
  293. package/templates/ide/cursor/.cursor/commands/generate-tasks.md +184 -184
  294. package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -107
  295. package/templates/ide/cursor/.cursor/commands/review-task.md +91 -91
  296. package/templates/ide/cursor/.cursor/commands/run-dag.md +110 -110
  297. package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -0
  298. package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -0
  299. package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -0
  300. package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
  301. package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -0
  302. package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -0
  303. package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -0
  304. package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -0
  305. package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -0
  306. package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -0
  307. package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -0
  308. package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -0
  309. package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -0
  310. package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -0
  311. package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -0
  312. package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -0
  313. package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -0
  314. package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -0
  315. package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
  316. package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
  317. package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
  318. package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
  319. package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -141
  320. package/templates/shared/docker-compose.yml +41 -41
  321. package/dist/__tests__/dag-runner/adapters.test.d.ts +0 -2
  322. package/dist/__tests__/dag-runner/adapters.test.d.ts.map +0 -1
  323. package/dist/__tests__/dag-runner/adapters.test.js +0 -134
  324. package/dist/__tests__/dag-runner/adapters.test.js.map +0 -1
  325. package/dist/dag-runner/adapters/antigravity.d.ts +0 -6
  326. package/dist/dag-runner/adapters/antigravity.d.ts.map +0 -1
  327. package/dist/dag-runner/adapters/antigravity.js +0 -54
  328. package/dist/dag-runner/adapters/antigravity.js.map +0 -1
  329. package/dist/dag-runner/adapters/claude.d.ts +0 -6
  330. package/dist/dag-runner/adapters/claude.d.ts.map +0 -1
  331. package/dist/dag-runner/adapters/claude.js +0 -48
  332. package/dist/dag-runner/adapters/claude.js.map +0 -1
  333. package/dist/dag-runner/adapters/cursor.d.ts +0 -6
  334. package/dist/dag-runner/adapters/cursor.d.ts.map +0 -1
  335. package/dist/dag-runner/adapters/cursor.js +0 -58
  336. package/dist/dag-runner/adapters/cursor.js.map +0 -1
  337. package/dist/dag-runner/adapters/index.d.ts +0 -46
  338. package/dist/dag-runner/adapters/index.d.ts.map +0 -1
  339. package/dist/dag-runner/adapters/index.js +0 -55
  340. package/dist/dag-runner/adapters/index.js.map +0 -1
  341. package/dist/dag-runner/utils/timeout.d.ts +0 -27
  342. package/dist/dag-runner/utils/timeout.d.ts.map +0 -1
  343. package/dist/dag-runner/utils/timeout.js +0 -55
  344. package/dist/dag-runner/utils/timeout.js.map +0 -1
@@ -0,0 +1,393 @@
1
+ ---
2
+ name: skill-rails-api
3
+ description: Padrões DARE para APIs em Ruby on Rails 8 — API mode, ActiveRecord, Solid Queue, Solid Cable, Action Cable, strong parameters, services (interactors), serializers (Blueprinter/Alba), Devise/JWT, rack-attack, rswag/grape-swagger.
4
+ ---
5
+
6
+ # DARE Rails API Skill
7
+
8
+ Você é um desenvolvedor sênior Ruby on Rails 8.x especializado em APIs. Seu objetivo é gerar código **idiomático Rails, com Layered Design, Solid Queue/Cable, serializers explícitos e auth/autz robustos**.
9
+
10
+ ## Quando usar
11
+
12
+ - Projeto Rails 8 API novo via DARE
13
+ - Adicionar feature em API Rails existente
14
+ - Migrar de Rails 7 → 8 (incluindo Solid Queue + Solid Cable)
15
+ - Auditar projeto Rails para conformidade DARE
16
+
17
+ ## Stack canônica
18
+
19
+ - **Ruby 3.3+**
20
+ - **Rails 8.x** modo API (`rails new --api`)
21
+ - **PostgreSQL 16**
22
+ - **Solid Queue** (substitui Sidekiq/DelayedJob — built-in Rails 8)
23
+ - **Solid Cable** (substitui Redis para Action Cable — built-in Rails 8)
24
+ - **Devise** ou **JWT puro** (devise-jwt) para auth
25
+ - **Pundit** ou **CanCanCan** para autorização
26
+ - **Blueprinter** ou **Alba** para serializers (substituem Jbuilder em APIs)
27
+ - **rack-attack** para rate limit
28
+ - **rswag** para OpenAPI/Swagger
29
+ - **RSpec** + **FactoryBot** + **Faker**
30
+ - **Rubocop** + **rubocop-rails-omakase** (estilo oficial Rails)
31
+ - **bundler-audit** para CVEs
32
+
33
+ ## Layered Design em Rails
34
+
35
+ Mapeamento DARE → Rails:
36
+
37
+ | Camada DARE | Pasta Rails |
38
+ |---|---|
39
+ | Handler | `app/controllers/api/v1/` |
40
+ | Service | `app/services/` (ou `app/interactors/`) |
41
+ | Repository | `app/repositories/` (opcional — Rails usa AR direto frequentemente) |
42
+ | Model | `app/models/` |
43
+ | Presenter | `app/serializers/` ou `app/blueprints/` |
44
+
45
+ > Em Rails 8 API, Repositories são opcionais — ActiveRecord queries em Services é comum quando bem encapsulado.
46
+
47
+ ## Controllers (Handler)
48
+
49
+ ```ruby
50
+ # app/controllers/api/v1/users_controller.rb
51
+ module Api
52
+ module V1
53
+ class UsersController < ApplicationController
54
+ before_action :authenticate_user!
55
+
56
+ def create
57
+ result = RegisterUser.call(params: user_params)
58
+ if result.success?
59
+ render json: UserBlueprint.render(result.user), status: :created
60
+ else
61
+ render json: { error: result.error_code }, status: :conflict
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def user_params
68
+ params.require(:user).permit(:email, :name, :password)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ ```
74
+
75
+ Regras:
76
+ - Apenas: autenticar → strong params → chamar Service → renderizar Serializer
77
+ - NUNCA: query AR no controller, lógica de negócio, validação manual
78
+
79
+ ## Services (Interactors)
80
+
81
+ Padrão Interactor (com a gem `interactor` ou manual):
82
+
83
+ ```ruby
84
+ # app/services/register_user.rb
85
+ class RegisterUser
86
+ include Interactor
87
+
88
+ def call
89
+ user = User.find_by(email: context.params[:email])
90
+ if user
91
+ context.fail!(error_code: 'USER_EXISTS')
92
+ else
93
+ context.user = User.create!(
94
+ email: context.params[:email],
95
+ name: context.params[:name],
96
+ password: context.params[:password],
97
+ )
98
+ end
99
+ end
100
+ end
101
+ ```
102
+
103
+ Ou padrão "Service Object" puro:
104
+
105
+ ```ruby
106
+ class RegisterUser
107
+ Result = Struct.new(:success?, :user, :error_code)
108
+
109
+ def initialize(params)
110
+ @params = params
111
+ end
112
+
113
+ def call
114
+ return Result.new(false, nil, 'USER_EXISTS') if User.exists?(email: @params[:email])
115
+ user = User.create!(@params)
116
+ Result.new(true, user, nil)
117
+ end
118
+ end
119
+
120
+ # Uso: RegisterUser.new(params).call
121
+ ```
122
+
123
+ ## Models
124
+
125
+ ```ruby
126
+ class User < ApplicationRecord
127
+ has_secure_password
128
+
129
+ validates :email, presence: true, uniqueness: true, format: URI::MailTo::EMAIL_REGEXP
130
+ validates :name, presence: true
131
+ validates :password, length: { minimum: 12 }, if: :password_required?
132
+
133
+ has_many :sessions, dependent: :destroy
134
+
135
+ scope :active, -> { where(deleted_at: nil) }
136
+ end
137
+ ```
138
+
139
+ Use `has_secure_password` (Rails built-in) com Argon2 ou Bcrypt.
140
+
141
+ ## Serializers (Blueprinter)
142
+
143
+ ```ruby
144
+ # app/blueprints/user_blueprint.rb
145
+ class UserBlueprint < Blueprinter::Base
146
+ identifier :id
147
+
148
+ fields :email, :name
149
+
150
+ field :created_at do |user|
151
+ user.created_at.iso8601
152
+ end
153
+ end
154
+
155
+ # Uso:
156
+ UserBlueprint.render(user)
157
+ UserBlueprint.render(users, view: :extended)
158
+ ```
159
+
160
+ ## Auth (JWT com devise-jwt)
161
+
162
+ ```ruby
163
+ # Gemfile
164
+ gem 'devise'
165
+ gem 'devise-jwt'
166
+
167
+ # config/initializers/devise.rb
168
+ config.jwt do |jwt|
169
+ jwt.secret = Rails.application.credentials.devise_jwt_secret_key!
170
+ jwt.dispatch_requests = [['POST', %r{^/api/v1/login$}]]
171
+ jwt.revocation_requests = [['DELETE', %r{^/api/v1/logout$}]]
172
+ jwt.expiration_time = 15.minutes.to_i
173
+ end
174
+ ```
175
+
176
+ Refresh token com rotação em uma tabela separada (não confie em logout só no client).
177
+
178
+ ## Rate limit (rack-attack)
179
+
180
+ ```ruby
181
+ # config/initializers/rack_attack.rb
182
+ class Rack::Attack
183
+ throttle('login/ip', limit: 5, period: 15.minutes) do |req|
184
+ req.ip if req.path == '/api/v1/login' && req.post?
185
+ end
186
+
187
+ throttle('api/ip', limit: 100, period: 1.minute) do |req|
188
+ req.ip if req.path.start_with?('/api/')
189
+ end
190
+
191
+ throttle('login/email', limit: 5, period: 15.minutes) do |req|
192
+ if req.path == '/api/v1/login' && req.post?
193
+ req.params['email'].to_s.downcase.gsub(/\s+/, '')
194
+ end
195
+ end
196
+ end
197
+ ```
198
+
199
+ ## Solid Queue (jobs)
200
+
201
+ ```ruby
202
+ # app/jobs/send_welcome_email_job.rb
203
+ class SendWelcomeEmailJob < ApplicationJob
204
+ queue_as :default
205
+
206
+ def perform(user_id)
207
+ user = User.find(user_id)
208
+ UserMailer.welcome(user).deliver_now
209
+ end
210
+ end
211
+
212
+ # config/queue.yml configurado para Solid Queue (default em Rails 8)
213
+ ```
214
+
215
+ ## Solid Cable + Action Cable
216
+
217
+ ```ruby
218
+ # app/channels/notifications_channel.rb
219
+ class NotificationsChannel < ApplicationCable::Channel
220
+ def subscribed
221
+ stream_for current_user
222
+ end
223
+ end
224
+
225
+ # Broadcast
226
+ NotificationsChannel.broadcast_to(user, type: 'message.sent.v1', payload: {...})
227
+
228
+ # Authorization
229
+ class ApplicationCable::Connection < ActionCable::Connection::Base
230
+ identified_by :current_user
231
+
232
+ def connect
233
+ self.current_user = find_verified_user
234
+ end
235
+
236
+ private
237
+
238
+ def find_verified_user
239
+ if (user = decode_jwt(request.params[:token]))
240
+ user
241
+ else
242
+ reject_unauthorized_connection
243
+ end
244
+ end
245
+ end
246
+ ```
247
+
248
+ ## OpenAPI (rswag)
249
+
250
+ ```ruby
251
+ # Gemfile
252
+ group :development, :test do
253
+ gem 'rswag-specs'
254
+ end
255
+
256
+ # spec/integration/users_spec.rb
257
+ require 'swagger_helper'
258
+
259
+ RSpec.describe 'Users API', type: :request do
260
+ path '/api/v1/users' do
261
+ post 'Creates a user' do
262
+ tags 'Users'
263
+ consumes 'application/json'
264
+ parameter name: :user, in: :body, schema: {
265
+ type: :object,
266
+ properties: {
267
+ email: { type: :string },
268
+ name: { type: :string },
269
+ password: { type: :string, minLength: 12 },
270
+ },
271
+ required: %w[email name password],
272
+ }
273
+ response '201', 'user created' do ... end
274
+ response '409', 'duplicate email' do ... end
275
+ end
276
+ end
277
+ end
278
+
279
+ # Gerar OpenAPI:
280
+ # rake rswag:specs:swaggerize
281
+ # Saída: swagger/v1/swagger.yaml (export para JSON via tool)
282
+ ```
283
+
284
+ ## Testes (RSpec)
285
+
286
+ ```ruby
287
+ # spec/services/register_user_spec.rb
288
+ RSpec.describe RegisterUser do
289
+ let(:params) { { email: 'jane@example.com', name: 'Jane', password: 'longsecret123' } }
290
+
291
+ it 'cria usuário com sucesso' do
292
+ result = described_class.new(params).call
293
+ expect(result.success?).to be true
294
+ expect(result.user.email).to eq 'jane@example.com'
295
+ end
296
+
297
+ it 'falha se email já existe' do
298
+ User.create!(params)
299
+ result = described_class.new(params).call
300
+ expect(result.success?).to be false
301
+ expect(result.error_code).to eq 'USER_EXISTS'
302
+ end
303
+ end
304
+
305
+ # spec/requests/api/v1/users_spec.rb
306
+ RSpec.describe 'POST /api/v1/users', type: :request do
307
+ let(:admin) { create(:user, :admin) }
308
+
309
+ it 'cria com sucesso' do
310
+ post '/api/v1/users',
311
+ params: { user: { email: 'jane@example.com', name: 'Jane', password: 'longsecret123' } },
312
+ headers: { 'Authorization' => "Bearer #{token_for(admin)}" }
313
+ expect(response).to have_http_status(:created)
314
+ end
315
+
316
+ it 'retorna 409 em duplicate' do
317
+ create(:user, email: 'taken@example.com')
318
+ post '/api/v1/users',
319
+ params: { user: { email: 'taken@example.com', name: 'X', password: 'longsecret123' } },
320
+ headers: { 'Authorization' => "Bearer #{token_for(admin)}" }
321
+ expect(response).to have_http_status(:conflict)
322
+ end
323
+ end
324
+ ```
325
+
326
+ ## Antipatterns
327
+
328
+ | AP | Antipattern | Correção |
329
+ |---|---|---|
330
+ | AP-01 | Query AR no controller | Service ou Repository |
331
+ | AP-02 | Lógica no controller | Service object / Interactor |
332
+ | AP-03 | Retornar `render json: user` | Blueprinter/Alba/serializer |
333
+ | AP-04 | Fat Model (Model com 500+ linhas) | Concerns + Services |
334
+ | AP-05 | Skip strong parameters | sempre `params.require(...).permit(...)` |
335
+ | AP-06 | Sem `rack-attack` em login | rate limit obrigatório |
336
+ | AP-07 | JWT secret em código | `Rails.application.credentials` |
337
+ | AP-08 | Logs com PII (senha, token) | `filter_parameters` configurado |
338
+ | AP-09 | N+1 sem `includes` | usar `bullet` gem em dev |
339
+ | AP-10 | Renderizar Model direto na response | Blueprinter |
340
+
341
+ ## Segurança
342
+
343
+ - `has_secure_password` com BCrypt cost ≥ 12 (default Rails OK)
344
+ - `force_ssl = true` em produção
345
+ - `secure_headers` gem ou middleware nativo Rails 8
346
+ - CORS com `rack-cors` (origens explícitas)
347
+ - `filter_parameters` para `password`, `token`, `secret`
348
+ - bundler-audit no CI
349
+
350
+ ## CI
351
+
352
+ ```bash
353
+ bundle exec rubocop
354
+ bundle exec rspec
355
+ bundle exec bundler-audit check --update
356
+ bundle exec rails db:schema:dump # garante schema sync
357
+ ```
358
+
359
+ ## Como aplicar
360
+
361
+ ### Passo 1: Audit
362
+
363
+ ```bash
364
+ grep -rn "\.where\|\.find_by\|\.create\|\.update" app/controllers/ # AP-01
365
+ grep -rn "render json: @user\b" app/controllers/ # AP-03
366
+ grep -rn "params\[:" app/controllers/ | grep -v "permit" # AP-05
367
+ ```
368
+
369
+ ### Passo 2: Extrair Services
370
+
371
+ Lógica em controller > 10 linhas → Service object com `.call`.
372
+
373
+ ### Passo 3: Adicionar Blueprints/Alba
374
+
375
+ Substituir `render json: object` por `render json: ObjectBlueprint.render(object)`.
376
+
377
+ ### Passo 4: rack-attack + filtros
378
+
379
+ Configurar throttles para `/login`, `/api/*`. `filter_parameters` para campos sensíveis.
380
+
381
+ ### Passo 5: rswag para OpenAPI
382
+
383
+ Documente endpoints em `spec/integration/`, rode `rswag:specs:swaggerize`.
384
+
385
+ ## Dicas
386
+
387
+ - **Combine** com `dare-docker` (Ruby 3.3-alpine multi-stage)
388
+ - **Combine** com `dare-realtime` para Action Cable + Solid Cable
389
+ - **Use** `dare-security` para auditoria OWASP + bundler-audit
390
+
391
+ ---
392
+
393
+ Esta skill é parte do DARE Method e está sob licença MIT.