@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,207 @@
1
+ /**
2
+ * Applies an `UpdatePlan` to a project on disk.
3
+ *
4
+ * The detector decides *what* would happen; the applier actually writes files,
5
+ * backs up the previous state, prompts on conflicts and runs migrations. Kept
6
+ * separate so unit tests can poke the detector without touching the filesystem.
7
+ */
8
+ import fs from 'fs-extra';
9
+ import path from 'path';
10
+ import chalk from 'chalk';
11
+ import inquirer from 'inquirer';
12
+ import { fileURLToPath } from 'url';
13
+ import { classifyChange, readProjectConfig } from './UpdateDetector.js';
14
+ /** Where templates ship inside the CLI bundle. */
15
+ function getTemplatesRoot() {
16
+ const here = fileURLToPath(import.meta.url);
17
+ return path.resolve(path.dirname(here), '..', '..', 'templates');
18
+ }
19
+ /** Resolve the template source for a change (defaults to mirroring `path`). */
20
+ function resolveTemplateSource(change) {
21
+ const rel = change.templateSource ?? change.path;
22
+ return path.join(getTemplatesRoot(), rel);
23
+ }
24
+ /** Read the new template content for a non-schema change. */
25
+ async function readNewContent(change) {
26
+ if (change.path.includes('#'))
27
+ return null; // schema-only
28
+ if (change.type === 'removed')
29
+ return null;
30
+ const source = resolveTemplateSource(change);
31
+ if (!(await fs.pathExists(source))) {
32
+ throw new Error(`Template source missing for change "${change.path}" (expected at ${source}). ` +
33
+ `Make sure the manifest's templateSource is correct or that templates/ ships the file.`);
34
+ }
35
+ return fs.readFile(source);
36
+ }
37
+ /**
38
+ * Snapshot every file the plan touches into `backupDir`, preserving its
39
+ * relative path. Touches only files that currently exist.
40
+ */
41
+ export async function backupAffectedFiles(plan, projectRoot, backupDir) {
42
+ let copied = 0;
43
+ for (const change of plan.applicableChanges) {
44
+ if (change.path.includes('#'))
45
+ continue;
46
+ const src = path.join(projectRoot, change.path);
47
+ if (!(await fs.pathExists(src)))
48
+ continue;
49
+ const dest = path.join(backupDir, change.path);
50
+ await fs.ensureDir(path.dirname(dest));
51
+ await fs.copy(src, dest);
52
+ copied++;
53
+ }
54
+ return copied;
55
+ }
56
+ /**
57
+ * Prompt the dev on a customized file. Returns the action to take.
58
+ *
59
+ * Honors `conflictPolicy` to skip the prompt in non-interactive flows
60
+ * (CI, scripted updates) — `'keep'` preserves the local file, `'replace'`
61
+ * overwrites it.
62
+ */
63
+ async function resolveCustomization(change, conflictPolicy) {
64
+ if (conflictPolicy !== 'ask')
65
+ return conflictPolicy;
66
+ const { decision } = (await inquirer.prompt([
67
+ {
68
+ type: 'list',
69
+ name: 'decision',
70
+ message: `Arquivo customizado: ${chalk.yellow(change.path)}\n ${chalk.gray(change.description)}`,
71
+ choices: [
72
+ { name: '🔒 Manter minha versão (recomendado se você editou)', value: 'keep' },
73
+ { name: '⬆️ Substituir pela versão nova do DARE', value: 'replace' },
74
+ ],
75
+ default: 'keep',
76
+ },
77
+ ]));
78
+ return decision;
79
+ }
80
+ async function applyOne(change, projectRoot, conflictPolicy, dryRun) {
81
+ // Schema-only ("dare.config.json#field") — migrations handle these.
82
+ if (change.path.includes('#')) {
83
+ return { change, resolution: 'apply', action: 'skipped' };
84
+ }
85
+ const target = path.join(projectRoot, change.path);
86
+ const newContent = await readNewContent(change);
87
+ const resolution = await classifyChange(projectRoot, change, newContent);
88
+ if (resolution === 'identical') {
89
+ return { change, resolution, action: 'skipped' };
90
+ }
91
+ if (change.type === 'removed') {
92
+ if (!dryRun && (await fs.pathExists(target))) {
93
+ await fs.remove(target);
94
+ }
95
+ return { change, resolution, action: 'deleted' };
96
+ }
97
+ if (resolution === 'customized') {
98
+ const decision = await resolveCustomization(change, conflictPolicy);
99
+ if (decision === 'keep') {
100
+ return { change, resolution, action: 'kept-custom' };
101
+ }
102
+ }
103
+ if (change.type === 'renamed' && change.previousPath) {
104
+ const prev = path.join(projectRoot, change.previousPath);
105
+ if (!dryRun && (await fs.pathExists(prev))) {
106
+ await fs.remove(prev);
107
+ }
108
+ }
109
+ if (newContent && !dryRun) {
110
+ await fs.ensureDir(path.dirname(target));
111
+ await fs.writeFile(target, newContent);
112
+ }
113
+ return { change, resolution, action: 'wrote' };
114
+ }
115
+ /** Run all migrations declared in the plan (post file changes). */
116
+ async function runMigrations(plan, projectRoot, dryRun) {
117
+ const ran = [];
118
+ for (const { release } of plan.pendingReleases) {
119
+ if (!release.migrations)
120
+ continue;
121
+ for (const migration of release.migrations) {
122
+ if (dryRun) {
123
+ ran.push(migration);
124
+ continue;
125
+ }
126
+ await runMigration(migration, projectRoot);
127
+ ran.push(migration);
128
+ }
129
+ }
130
+ return ran;
131
+ }
132
+ /**
133
+ * Built-in migrations. Each `id` maps to a handler — unknown ids are skipped
134
+ * with a warning so an older CLI can still apply a partial update.
135
+ */
136
+ async function runMigration(migration, projectRoot) {
137
+ switch (migration.id) {
138
+ case 'unify-version-field': {
139
+ // Pre-2.17 projects wrote `version: "0.1.0"` (zombie placeholder) and
140
+ // an early prototype briefly used `dareVersion`. Consolidate both into
141
+ // a single `version` field that now tracks the DARE release.
142
+ const configPath = path.join(projectRoot, 'dare.config.json');
143
+ const cfg = (await readProjectConfig(projectRoot));
144
+ const legacyDareVersion = cfg.dareVersion;
145
+ if (legacyDareVersion) {
146
+ cfg.version = legacyDareVersion;
147
+ delete cfg.dareVersion;
148
+ }
149
+ else if (!cfg.version || cfg.version === '0.1.0') {
150
+ cfg.version = '2.16.0';
151
+ }
152
+ await fs.writeJSON(configPath, cfg, { spaces: 2 });
153
+ return;
154
+ }
155
+ case 'add-review-refine-defaults': {
156
+ // Seed the new review/refine objects so dev can see they exist (and
157
+ // edit). Opt-in stance for legacy projects — review.onComplete: false
158
+ // means the gate is silent until the dev flips it.
159
+ const configPath = path.join(projectRoot, 'dare.config.json');
160
+ const cfg = (await readProjectConfig(projectRoot));
161
+ if (!cfg.review) {
162
+ cfg.review = { onComplete: false, strict: false };
163
+ }
164
+ if (!cfg.refine) {
165
+ cfg.refine = { thresholds: { low: 5, med: 12, high: 20 } };
166
+ }
167
+ await fs.writeJSON(configPath, cfg, { spaces: 2 });
168
+ return;
169
+ }
170
+ default:
171
+ console.log(chalk.yellow(` ⚠ Unknown migration "${migration.id}" — skipping (CLI may be outdated).`));
172
+ }
173
+ }
174
+ /** Bump `version` in `dare.config.json` to the plan's target version. */
175
+ async function stampVersion(projectRoot, toVersion) {
176
+ const configPath = path.join(projectRoot, 'dare.config.json');
177
+ const cfg = (await readProjectConfig(projectRoot));
178
+ cfg.version = toVersion;
179
+ cfg.updatedAt = new Date().toISOString();
180
+ await fs.writeJSON(configPath, cfg, { spaces: 2 });
181
+ }
182
+ /**
183
+ * Execute the plan. Returns a structured result so the command can print a
184
+ * sensible summary at the end.
185
+ */
186
+ export async function applyPlan(plan, options) {
187
+ const { projectRoot, backupDir, force = false, dryRun = false, conflictPolicy = force ? 'replace' : 'ask', } = options;
188
+ let backupPath = null;
189
+ let backupFilesCount = 0;
190
+ if (!dryRun) {
191
+ backupPath =
192
+ backupDir ?? path.join(projectRoot, '.dare', `backup-${plan.fromVersion}`);
193
+ await fs.ensureDir(backupPath);
194
+ backupFilesCount = await backupAffectedFiles(plan, projectRoot, backupPath);
195
+ }
196
+ const outcomes = [];
197
+ for (const change of plan.applicableChanges) {
198
+ const outcome = await applyOne(change, projectRoot, conflictPolicy, dryRun);
199
+ outcomes.push(outcome);
200
+ }
201
+ const migrationsRan = await runMigrations(plan, projectRoot, dryRun);
202
+ if (!dryRun) {
203
+ await stampVersion(projectRoot, plan.toVersion);
204
+ }
205
+ return { outcomes, migrationsRan, backupPath, backupFilesCount };
206
+ }
207
+ //# sourceMappingURL=UpdateApplier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateApplier.js","sourceRoot":"","sources":["../../src/utils/UpdateApplier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Detects what `dare update` needs to do for a given project.
3
+ *
4
+ * Pure planning — it never writes to disk. Loads the manifest, reads the
5
+ * project's `dare.config.json`, and produces an `UpdatePlan` the applier can
6
+ * execute (or the dev can simply preview with `--dry-run`).
7
+ */
8
+ import type { ConflictResolution, ManifestChange, UpdateManifest, UpdatePlan } from '../types/UpdateManifest.types.js';
9
+ export declare function loadManifest(): Promise<UpdateManifest>;
10
+ /** Read the current CLI version from the bundled `package.json`. */
11
+ export declare function getCliVersion(): string;
12
+ export interface ProjectConfig {
13
+ ide?: string;
14
+ version?: string;
15
+ [key: string]: unknown;
16
+ }
17
+ /** Baseline assumed for projects with the legacy placeholder or no `version`. */
18
+ export declare const LEGACY_BASELINE_VERSION = "2.16.0";
19
+ /**
20
+ * Resolve the "effective DARE version" of a project, handling the legacy
21
+ * `"0.1.0"` placeholder that was hardcoded by pre-2.17 `dare init`.
22
+ */
23
+ export declare function resolveProjectVersion(cfg: ProjectConfig): {
24
+ version: string;
25
+ isLegacy: boolean;
26
+ };
27
+ /** Load and return `dare.config.json` from the given project root. */
28
+ export declare function readProjectConfig(projectRoot: string): Promise<ProjectConfig>;
29
+ /**
30
+ * Filter a single change against the IDE configured for this project. A change
31
+ * with `appliesTo: ['*']` (or no `appliesTo`) is universal.
32
+ *
33
+ * Hybrid setups (`hybrid` = cursor+antigravity, `claude-hybrid` = claude+cursor)
34
+ * accept changes targeted at any of their member IDEs.
35
+ */
36
+ export declare function changeAppliesToIde(change: ManifestChange, ide: string | undefined): boolean;
37
+ /**
38
+ * Build the update plan: every release between `from` (exclusive) and `to`
39
+ * (inclusive), with its changes filtered down to what applies to this IDE.
40
+ */
41
+ export declare function buildUpdatePlan(manifest: UpdateManifest, fromVersion: string, toVersion: string, ide: string | undefined): UpdatePlan;
42
+ /** SHA-256 hex digest of file content; returns `null` if the file is absent. */
43
+ export declare function hashFile(absPath: string): Promise<string | null>;
44
+ /**
45
+ * Classify what we'd be doing to a single file on disk:
46
+ * - `identical` → new template content already matches what's on disk
47
+ * - `missing` → file absent in the project, safe to create
48
+ * - `apply` → file present and matches `previousHash`, safe to overwrite
49
+ * - `customized` → file present but doesn't match `previousHash`; ask the dev
50
+ *
51
+ * `newContent` is the bytes we'd write; `previousHash` is the manifest's record
52
+ * of what the file looked like in the prior version (optional — without it we
53
+ * can't tell `apply` from `customized` and conservatively return `customized`).
54
+ */
55
+ export declare function classifyChange(projectRoot: string, change: ManifestChange, newContent: Buffer | string | null): Promise<ConflictResolution>;
56
+ //# sourceMappingURL=UpdateDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateDetector.d.ts","sourceRoot":"","sources":["../../src/utils/UpdateDetector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EACV,kBAAkB,EAElB,cAAc,EACd,cAAc,EACd,UAAU,EACX,MAAM,kCAAkC,CAAC;AAiB1C,wBAAsB,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC,CAY5D;AAED,oEAAoE;AACpE,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AASD,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAMA;AAED,sEAAsE;AACtE,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAQnF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAe3F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,UAAU,CA8BZ;AAED,gFAAgF;AAChF,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAItE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GACjC,OAAO,CAAC,kBAAkB,CAAC,CA2B7B"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Detects what `dare update` needs to do for a given project.
3
+ *
4
+ * Pure planning — it never writes to disk. Loads the manifest, reads the
5
+ * project's `dare.config.json`, and produces an `UpdatePlan` the applier can
6
+ * execute (or the dev can simply preview with `--dry-run`).
7
+ */
8
+ import fs from 'fs-extra';
9
+ import path from 'path';
10
+ import crypto from 'crypto';
11
+ import { createRequire } from 'module';
12
+ import { fileURLToPath } from 'url';
13
+ import { compareVersions, isNewerThan, sortVersionsAscending, } from './version-compare.js';
14
+ const require = createRequire(import.meta.url);
15
+ /** Path to `templates/UPDATE-MANIFEST.json`, shipped with the CLI. */
16
+ function getManifestPath() {
17
+ // `import.meta.url` resolves to .../dist/utils/UpdateDetector.js once built.
18
+ // The manifest lives at .../templates/UPDATE-MANIFEST.json, two levels up.
19
+ const here = fileURLToPath(import.meta.url);
20
+ return path.resolve(path.dirname(here), '..', '..', 'templates', 'UPDATE-MANIFEST.json');
21
+ }
22
+ export async function loadManifest() {
23
+ const manifestPath = getManifestPath();
24
+ if (!(await fs.pathExists(manifestPath))) {
25
+ throw new Error(`UPDATE-MANIFEST.json not found at ${manifestPath}`);
26
+ }
27
+ const data = (await fs.readJSON(manifestPath));
28
+ if (data.schemaVersion !== 1) {
29
+ throw new Error(`Unsupported manifest schemaVersion ${data.schemaVersion} (this CLI understands 1).`);
30
+ }
31
+ return data;
32
+ }
33
+ /** Read the current CLI version from the bundled `package.json`. */
34
+ export function getCliVersion() {
35
+ const pkg = require('../../package.json');
36
+ return pkg.version;
37
+ }
38
+ /**
39
+ * Legacy `dare init` versions (pre-2.17) wrote a hardcoded `"0.1.0"` placeholder
40
+ * that nothing read. Treat it as "this project was never tracked" — the update
41
+ * flow will assume the project is on 2.16.0 (the last release before this field
42
+ * carried meaning) and run the unification migration.
43
+ */
44
+ const LEGACY_PLACEHOLDER_VERSION = '0.1.0';
45
+ /** Baseline assumed for projects with the legacy placeholder or no `version`. */
46
+ export const LEGACY_BASELINE_VERSION = '2.16.0';
47
+ /**
48
+ * Resolve the "effective DARE version" of a project, handling the legacy
49
+ * `"0.1.0"` placeholder that was hardcoded by pre-2.17 `dare init`.
50
+ */
51
+ export function resolveProjectVersion(cfg) {
52
+ const raw = cfg.version;
53
+ if (!raw || raw === LEGACY_PLACEHOLDER_VERSION) {
54
+ return { version: LEGACY_BASELINE_VERSION, isLegacy: true };
55
+ }
56
+ return { version: raw, isLegacy: false };
57
+ }
58
+ /** Load and return `dare.config.json` from the given project root. */
59
+ export async function readProjectConfig(projectRoot) {
60
+ const configPath = path.join(projectRoot, 'dare.config.json');
61
+ if (!(await fs.pathExists(configPath))) {
62
+ throw new Error(`dare.config.json not found in ${projectRoot}. Is this a DARE project? Run \`dare init\` first.`);
63
+ }
64
+ return (await fs.readJSON(configPath));
65
+ }
66
+ /**
67
+ * Filter a single change against the IDE configured for this project. A change
68
+ * with `appliesTo: ['*']` (or no `appliesTo`) is universal.
69
+ *
70
+ * Hybrid setups (`hybrid` = cursor+antigravity, `claude-hybrid` = claude+cursor)
71
+ * accept changes targeted at any of their member IDEs.
72
+ */
73
+ export function changeAppliesToIde(change, ide) {
74
+ const targets = change.appliesTo ?? ['*'];
75
+ if (targets.includes('*'))
76
+ return true;
77
+ if (!ide)
78
+ return false;
79
+ if (targets.includes(ide))
80
+ return true;
81
+ // Hybrid expansions
82
+ if (ide === 'hybrid') {
83
+ return targets.includes('cursor') || targets.includes('antigravity');
84
+ }
85
+ if (ide === 'claude-hybrid') {
86
+ return targets.includes('claude-code') || targets.includes('cursor');
87
+ }
88
+ return false;
89
+ }
90
+ /**
91
+ * Build the update plan: every release between `from` (exclusive) and `to`
92
+ * (inclusive), with its changes filtered down to what applies to this IDE.
93
+ */
94
+ export function buildUpdatePlan(manifest, fromVersion, toVersion, ide) {
95
+ const allVersions = Object.keys(manifest.releases);
96
+ const sorted = sortVersionsAscending(allVersions);
97
+ const pending = sorted.filter((v) => {
98
+ const newerThanFrom = isNewerThan(v, fromVersion);
99
+ const notNewerThanTo = compareVersions(v, toVersion) !== 1;
100
+ return newerThanFrom && notNewerThanTo;
101
+ });
102
+ const pendingReleases = pending.map((version) => ({
103
+ version,
104
+ release: manifest.releases[version],
105
+ }));
106
+ const applicableChanges = [];
107
+ for (const { release } of pendingReleases) {
108
+ for (const change of release.changes) {
109
+ if (changeAppliesToIde(change, ide)) {
110
+ applicableChanges.push(change);
111
+ }
112
+ }
113
+ }
114
+ return {
115
+ fromVersion,
116
+ toVersion,
117
+ pendingReleases,
118
+ applicableChanges,
119
+ };
120
+ }
121
+ /** SHA-256 hex digest of file content; returns `null` if the file is absent. */
122
+ export async function hashFile(absPath) {
123
+ if (!(await fs.pathExists(absPath)))
124
+ return null;
125
+ const buf = await fs.readFile(absPath);
126
+ return crypto.createHash('sha256').update(buf).digest('hex');
127
+ }
128
+ /**
129
+ * Classify what we'd be doing to a single file on disk:
130
+ * - `identical` → new template content already matches what's on disk
131
+ * - `missing` → file absent in the project, safe to create
132
+ * - `apply` → file present and matches `previousHash`, safe to overwrite
133
+ * - `customized` → file present but doesn't match `previousHash`; ask the dev
134
+ *
135
+ * `newContent` is the bytes we'd write; `previousHash` is the manifest's record
136
+ * of what the file looked like in the prior version (optional — without it we
137
+ * can't tell `apply` from `customized` and conservatively return `customized`).
138
+ */
139
+ export async function classifyChange(projectRoot, change, newContent) {
140
+ // Schema-only changes (path includes `#`) are handled by migrations,
141
+ // not by file copy. Treat them as `apply`.
142
+ if (change.path.includes('#'))
143
+ return 'apply';
144
+ const target = path.join(projectRoot, change.path);
145
+ const currentHash = await hashFile(target);
146
+ if (change.type === 'removed') {
147
+ return currentHash === null ? 'identical' : 'apply';
148
+ }
149
+ if (currentHash === null)
150
+ return 'missing';
151
+ if (newContent !== null) {
152
+ const newHash = crypto
153
+ .createHash('sha256')
154
+ .update(typeof newContent === 'string' ? Buffer.from(newContent) : newContent)
155
+ .digest('hex');
156
+ if (newHash === currentHash)
157
+ return 'identical';
158
+ }
159
+ if (change.previousHash && currentHash === change.previousHash) {
160
+ return 'apply';
161
+ }
162
+ return 'customized';
163
+ }
164
+ //# sourceMappingURL=UpdateDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateDetector.js","sourceRoot":"","sources":["../../src/utils/UpdateDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * DARE CLI — ASCII art banner
3
+ * Displayed on: dare (no args), dare new, dare --version, dare welcome
4
+ *
5
+ * Suppressed when:
6
+ * - process.stdout.isTTY is false (pipe/redirect)
7
+ * - DARE_NO_BANNER=1 env var
8
+ * - --no-banner global flag
9
+ *
10
+ * License: MIT (D-001)
11
+ */
12
+ /**
13
+ * Render the DARE ASCII art using the best available figlet font.
14
+ * Falls back through FONT_FALLBACKS until a non-empty result is obtained.
15
+ */
16
+ export declare function renderBanner(): string;
17
+ /**
18
+ * Print the DARE ASCII art banner to stdout.
19
+ *
20
+ * Respects suppression rules:
21
+ * - !process.stdout.isTTY → silent (unless FORCE_BANNER=1)
22
+ * - DARE_NO_BANNER=1 → silent
23
+ * - options.noColor=true → ANSI green instead of truecolor gradient
24
+ */
25
+ export declare function printBanner(options?: {
26
+ noColor?: boolean;
27
+ }): void;
28
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyBH;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAUrC;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CA0BrE"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * DARE CLI — ASCII art banner
3
+ * Displayed on: dare (no args), dare new, dare --version, dare welcome
4
+ *
5
+ * Suppressed when:
6
+ * - process.stdout.isTTY is false (pipe/redirect)
7
+ * - DARE_NO_BANNER=1 env var
8
+ * - --no-banner global flag
9
+ *
10
+ * License: MIT (D-001)
11
+ */
12
+ import figlet from 'figlet';
13
+ import { createRequire } from 'module';
14
+ // gradient-string is CommonJS — use createRequire for safe ESM interop
15
+ const _require = createRequire(import.meta.url);
16
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
17
+ const gradient = _require('gradient-string');
18
+ const { version } = _require('../../package.json');
19
+ // Dewtech official green palette
20
+ const DEWTECH_GREEN = gradient('#7FD93A', '#5BCB1B', '#3FA00C');
21
+ const FONT_FALLBACKS = [
22
+ 'Alligator',
23
+ 'Larry 3D',
24
+ 'Big',
25
+ 'Slant',
26
+ 'Standard',
27
+ ];
28
+ /**
29
+ * Render the DARE ASCII art using the best available figlet font.
30
+ * Falls back through FONT_FALLBACKS until a non-empty result is obtained.
31
+ */
32
+ export function renderBanner() {
33
+ for (const font of FONT_FALLBACKS) {
34
+ try {
35
+ const art = figlet.textSync('DARE', { font, horizontalLayout: 'default' });
36
+ if (art && art.trim().length > 0)
37
+ return art;
38
+ }
39
+ catch {
40
+ // try next font
41
+ }
42
+ }
43
+ return 'DARE'; // ultimate plain-text fallback
44
+ }
45
+ /**
46
+ * Print the DARE ASCII art banner to stdout.
47
+ *
48
+ * Respects suppression rules:
49
+ * - !process.stdout.isTTY → silent (unless FORCE_BANNER=1)
50
+ * - DARE_NO_BANNER=1 → silent
51
+ * - options.noColor=true → ANSI green instead of truecolor gradient
52
+ */
53
+ export function printBanner(options = {}) {
54
+ // TTY guard: skip in pipes/redirects unless explicitly forced (e.g. dare welcome)
55
+ if (!process.stdout.isTTY && process.env.FORCE_BANNER !== '1')
56
+ return;
57
+ // Env-var suppression
58
+ if (process.env.DARE_NO_BANNER === '1')
59
+ return;
60
+ const banner = renderBanner();
61
+ const tagline = ' Design · Architecture · Review · Execute';
62
+ const subtitle = ` by Dewtech · dewtech.tech v${version}`;
63
+ // Colour detection: use truecolor gradient when COLORTERM is set, else basic ANSI green
64
+ const supportsColor = !options.noColor &&
65
+ (process.env.COLORTERM === 'truecolor' || process.env.COLORTERM === '24bit');
66
+ if (supportsColor) {
67
+ console.log(DEWTECH_GREEN.multiline(banner));
68
+ }
69
+ else {
70
+ // Fallback: basic ANSI green (works in all terminals)
71
+ console.log('\x1b[32m' + banner + '\x1b[0m');
72
+ }
73
+ console.log('\x1b[90m' + tagline + '\x1b[0m'); // dim grey
74
+ console.log('\x1b[90m' + subtitle + '\x1b[0m');
75
+ console.log();
76
+ }
77
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,MAAyB,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,uEAAuE;AACvE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,mEAAmE;AACnE,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,CAEC,CAAC;AAE7C,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,oBAAoB,CAAwB,CAAC;AAE1E,iCAAiC;AACjC,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAEhE,MAAM,cAAc,GAAe;IACjC,WAAW;IACX,UAAU;IACV,KAAK;IACL,OAAO;IACP,UAAU;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3E,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,+BAA+B;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,UAAiC,EAAE;IAC7D,kFAAkF;IAClF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG;QAAE,OAAO;IAEtE,sBAAsB;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG;QAAE,OAAO;IAE/C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,4CAA4C,CAAC;IAC7D,MAAM,QAAQ,GAAG,iCAAiC,OAAO,EAAE,CAAC;IAE5D,wFAAwF;IACxF,MAAM,aAAa,GACjB,CAAC,OAAO,CAAC,OAAO;QAChB,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;IAE/E,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW;IAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for DARE CLI — ASCII art banner (printBanner / renderBanner)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=banner.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.spec.d.ts","sourceRoot":"","sources":["../../src/utils/banner.spec.ts"],"names":[],"mappings":"AAAA;;GAEG"}