@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
@@ -1,188 +1,55 @@
1
1
  /**
2
- * Excalidraw Renderer for DARE DAG Visualization
2
+ * Excalidraw Renderer for DARE DAG Visualization.
3
3
  *
4
- * Converts a DARE DAG (task graph) to an Excalidraw JSON file.
5
- * - Tasks are rendered as colored rectangles based on complexity
6
- * - Dependencies are rendered as arrows
7
- * - Tasks are grouped by rank in swim lanes
4
+ * Maps a DARE DAG (task graph) onto the generic graph renderer
5
+ * (`graph-renderer.ts`) so the task DAG and `dare reverse`'s module graph
6
+ * share one rendering engine:
7
+ * - Tasks rectangles colored by status (complexity as fallback when PENDING)
8
+ * - Dependencies → arrows
9
+ * - Tasks grouped by rank in swim lanes
8
10
  *
9
11
  * Design tokens: /docs/DESIGN-TOKENS-EXCALIDRAW.md
10
- * License: AGPL v3 (part of DARE CLI)
11
- */
12
- import { computeRanks } from '../dag-runner/run_dag.js';
13
- /**
14
- * Color palette based on DARE Design Tokens
12
+ * License: MIT (D-001 part of DARE CLI)
15
13
  */
14
+ import { renderGraphExcalidraw, serializeExcalidraw, } from './graph-renderer.js';
15
+ export { serializeExcalidraw };
16
+ /** Color palette based on DARE Design Tokens. */
16
17
  const COLOR_BY_COMPLEXITY = {
17
- LOW: {
18
- bg: '#e3f2fd', // Azure blue
19
- stroke: '#1976d2', // Dark blue
20
- },
21
- MED: {
22
- bg: '#fff3e0', // Orange
23
- stroke: '#e65100', // Dark orange
24
- },
25
- HIGH: {
26
- bg: '#fce4ec', // Pink/Magenta
27
- stroke: '#c2185b', // Dark pink
28
- },
18
+ LOW: { bg: '#e3f2fd', stroke: '#1976d2' }, // Azure blue
19
+ MED: { bg: '#fff3e0', stroke: '#e65100' }, // Orange
20
+ HIGH: { bg: '#fce4ec', stroke: '#c2185b' }, // Pink/Magenta
29
21
  };
30
22
  const COLOR_BY_STATUS = {
31
- PENDING: {
32
- bg: '#f5f5f5', // Light gray
33
- stroke: '#999999', // Medium gray
34
- },
35
- RUNNING: {
36
- bg: '#e3f2fd', // Azure blue
37
- stroke: '#1976d2', // Dark blue
38
- dashed: true,
39
- },
40
- DONE: {
41
- bg: '#e8f5e9', // Light green
42
- stroke: '#388e3c', // Dark green
43
- },
44
- FAILED: {
45
- bg: '#ffebee', // Light red
46
- stroke: '#d32f2f', // Dark red
47
- },
48
- SKIPPED: {
49
- bg: '#e5e7eb', // Gray
50
- stroke: '#6b7280', // Dark gray
51
- },
23
+ PENDING: { bg: '#f5f5f5', stroke: '#999999' },
24
+ RUNNING: { bg: '#e3f2fd', stroke: '#1976d2', dashed: true },
25
+ DONE: { bg: '#e8f5e9', stroke: '#388e3c' },
26
+ FAILED: { bg: '#ffebee', stroke: '#d32f2f' },
27
+ SKIPPED: { bg: '#e5e7eb', stroke: '#6b7280' },
52
28
  };
53
- /**
54
- * Generate unique ID for Excalidraw elements
55
- */
56
- function generateId() {
57
- return Math.random().toString(36).substr(2, 9);
58
- }
59
- /**
60
- * Get status color, preferring status over complexity
61
- */
29
+ /** Status takes precedence; PENDING falls back to complexity for richer color. */
62
30
  function getTaskColors(task) {
63
31
  const status = task.status ?? 'PENDING';
64
- // Status takes precedence, but if PENDING, use complexity for better visualization
65
32
  if (status === 'PENDING' && task.complexity) {
66
33
  return COLOR_BY_COMPLEXITY[task.complexity] || COLOR_BY_COMPLEXITY.MED;
67
34
  }
68
35
  return COLOR_BY_STATUS[status] || COLOR_BY_STATUS.PENDING;
69
36
  }
70
- /**
71
- * Create rectangle element for a task
72
- */
73
- function createTaskElement(task, x, y) {
37
+ function taskToGraphNode(task) {
74
38
  const colors = getTaskColors(task);
75
39
  const complexity = task.complexity || 'MED';
76
- const text = `${task.id}\n${task.title}\n[${complexity}]`;
77
40
  return {
78
41
  id: task.id,
79
- type: 'rectangle',
80
- x,
81
- y,
82
- width: 120,
83
- height: 60,
84
- angle: 0,
85
- strokeColor: colors.stroke,
86
- backgroundColor: colors.bg,
87
- fillStyle: 'hachure',
88
- strokeWidth: 2,
89
- strokeStyle: colors.dashed ? 'dashed' : 'solid',
90
- roughness: 0,
91
- opacity: 100,
92
- roundness: { type: 2, value: 6 },
93
- text,
94
- fontSize: 12,
95
- fontFamily: 1, // Virgil (default Excalidraw font)
96
- textAlign: 'center',
97
- verticalAlign: 'middle',
98
- boundElements: [],
99
- updated: Date.now(),
100
- link: null,
101
- locked: false,
102
- seed: Math.floor(Math.random() * 2147483647),
103
- versionNonce: Math.floor(Math.random() * 2147483647),
42
+ depends_on: task.depends_on,
43
+ labelLines: [task.id, task.title, `[${complexity}]`],
44
+ bg: colors.bg,
45
+ stroke: colors.stroke,
46
+ dashed: colors.dashed,
104
47
  };
105
48
  }
106
- /**
107
- * Create arrow element for a dependency
108
- */
109
- function createArrowElement(fromTaskId, toTaskId) {
110
- return {
111
- id: generateId(),
112
- type: 'arrow',
113
- x: 0, // Will be computed from start/end binding
114
- y: 0,
115
- startBinding: { elementId: fromTaskId },
116
- endBinding: { elementId: toTaskId },
117
- startArrowType: 'dot',
118
- endArrowType: 'arrow',
119
- strokeColor: '#999999',
120
- strokeWidth: 2,
121
- strokeStyle: 'solid',
122
- roughness: 0,
123
- opacity: 100,
124
- updated: Date.now(),
125
- link: null,
126
- locked: false,
127
- seed: Math.floor(Math.random() * 2147483647),
128
- versionNonce: Math.floor(Math.random() * 2147483647),
129
- };
130
- }
131
- /**
132
- * Render DAG to Excalidraw JSON
133
- */
49
+ /** Render a task DAG to Excalidraw JSON via the generic graph renderer. */
134
50
  export function renderDagExcalidraw(dag) {
135
- const elements = [];
136
- const ranks = computeRanks(dag.tasks);
137
- // Group tasks by rank
138
- const byRank = new Map();
139
- for (const task of dag.tasks) {
140
- const r = ranks.get(task.id) ?? 1;
141
- if (!byRank.has(r))
142
- byRank.set(r, []);
143
- byRank.get(r).push(task);
144
- }
145
- // Position elements
146
- const taskPositions = new Map();
147
- const sortedRanks = [...byRank.keys()].sort((a, b) => a - b);
148
- for (const rank of sortedRanks) {
149
- const tasksInRank = byRank.get(rank);
150
- for (let i = 0; i < tasksInRank.length; i++) {
151
- const task = tasksInRank[i];
152
- // Position: X based on task index in rank, Y based on rank
153
- const x = 20 + i * 140;
154
- const y = 20 + rank * 160;
155
- taskPositions.set(task.id, { x, y });
156
- // Create rectangle for this task
157
- const taskElement = createTaskElement(task, x, y);
158
- elements.push(taskElement);
159
- }
160
- }
161
- // Create arrows for dependencies
162
- for (const task of dag.tasks) {
163
- for (const depId of task.depends_on) {
164
- const arrow = createArrowElement(depId, task.id);
165
- elements.push(arrow);
166
- }
167
- }
168
- const data = {
169
- type: 'excalidraw',
170
- version: 2,
51
+ return renderGraphExcalidraw(dag.tasks.map(taskToGraphNode), {
171
52
  source: 'dare-dag-viz',
172
- elements,
173
- appState: {
174
- gridMode: 'grid',
175
- gridSize: 20,
176
- viewBackgroundColor: '#ffffff',
177
- },
178
- files: {},
179
- };
180
- return data;
181
- }
182
- /**
183
- * Serialize Excalidraw data to JSON string
184
- */
185
- export function serializeExcalidraw(data) {
186
- return JSON.stringify(data, null, 2);
53
+ });
187
54
  }
188
55
  //# sourceMappingURL=excalidraw-renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"excalidraw-renderer.js","sourceRoot":"","sources":["../../src/utils/excalidraw-renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"excalidraw-renderer.js","sourceRoot":"","sources":["../../src/utils/excalidraw-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GAGpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAuB,CAAC;AAEpD,iDAAiD;AACjD,MAAM,mBAAmB,GAAG;IAC1B,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,aAAa;IACxD,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS;IACpD,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,eAAe;CAC5D,CAAC;AAEF,MAAM,eAAe,GAAyE;IAC5F,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;IAC7C,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;IAC3D,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;IAC1C,MAAM,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;IAC5C,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;CAC9C,CAAC;AAEF,kFAAkF;AAClF,SAAS,aAAa,CAAC,IAAa;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IACxC,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5C,OAAO,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC;IACzE,CAAC;IACD,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;IAC5C,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,UAAU,GAAG,CAAC;QACpD,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,OAAO,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;QAC3D,MAAM,EAAE,cAAc;KACvB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Generic graph renderer — the shared core behind `dare dag viz` (the task
3
+ * DAG) and `dare reverse` (the module-dependency graph).
4
+ *
5
+ * Callers map their domain objects (DagTask, Module, …) to `GraphNode`,
6
+ * resolving colors / labels / styling, and this module owns the layout
7
+ * (rank grouping via the same Kahn-style traversal the DAG uses) and the
8
+ * serialization to Mermaid, Graphviz DOT, and Excalidraw JSON.
9
+ *
10
+ * Two styling strategies for Mermaid:
11
+ * - `'class'` → emits `class <id> <cls>;` + shared `classDef` lines.
12
+ * Used by the DAG (status-driven palette).
13
+ * - `'inline'` → emits `style <id> fill:…,stroke:…;` per node.
14
+ * Used by `reverse` (arbitrary per-node colors, e.g. size).
15
+ *
16
+ * License: MIT (part of DARE CLI).
17
+ */
18
+ export interface GraphNode {
19
+ id: string;
20
+ depends_on: string[];
21
+ /** Lines composing the node label (joined with the renderer's separator). */
22
+ labelLines: string[];
23
+ /** Background fill (Excalidraw, Mermaid inline, DOT fillcolor). */
24
+ bg: string;
25
+ /** Stroke / border color. */
26
+ stroke: string;
27
+ /** Dashed border (Excalidraw / inline). */
28
+ dashed?: boolean;
29
+ /** Mermaid class name when using class-based styling (e.g. `st_done`). */
30
+ mermaidClass?: string;
31
+ }
32
+ export interface MermaidOptions {
33
+ /** Goes into `%% <headerComment>` at the top (caller pre-escapes). */
34
+ headerComment: string;
35
+ direction?: 'LR' | 'TB';
36
+ styling: 'class' | 'inline';
37
+ /** Emitted (indented) when `styling === 'class'`. */
38
+ classDefs?: string[];
39
+ }
40
+ export interface DotOptions {
41
+ /** `digraph <name> { … }`. */
42
+ name: string;
43
+ }
44
+ export interface ExcalidrawOptions {
45
+ /** Stamped into the Excalidraw `source` field. */
46
+ source: string;
47
+ }
48
+ /**
49
+ * Compute layout ranks for a set of nodes from their `depends_on` edges.
50
+ * Nodes with no dependencies are rank 0; otherwise rank = max(parent) + 1.
51
+ * Throws on circular dependencies (same contract as the DAG runner).
52
+ */
53
+ export declare function computeRanks(nodes: GraphNode[]): Map<string, number>;
54
+ export declare function sanitizeId(id: string): string;
55
+ export declare function escapeMermaid(s: string): string;
56
+ export declare function renderGraphMermaid(nodes: GraphNode[], opts: MermaidOptions): string;
57
+ export declare function renderGraphDot(nodes: GraphNode[], opts: DotOptions): string;
58
+ interface ExcalidrawElement {
59
+ id: string;
60
+ type: string;
61
+ x: number;
62
+ y: number;
63
+ width?: number;
64
+ height?: number;
65
+ angle?: number;
66
+ strokeColor?: string;
67
+ backgroundColor?: string;
68
+ fillStyle?: string;
69
+ strokeWidth?: number;
70
+ strokeStyle?: string;
71
+ roughness?: number;
72
+ opacity?: number;
73
+ roundness?: {
74
+ type: number;
75
+ value: number;
76
+ };
77
+ text?: string;
78
+ fontSize?: number;
79
+ fontFamily?: number;
80
+ textAlign?: string;
81
+ verticalAlign?: string;
82
+ startBinding?: {
83
+ elementId: string;
84
+ };
85
+ endBinding?: {
86
+ elementId: string;
87
+ };
88
+ startArrowType?: string;
89
+ endArrowType?: string;
90
+ boundElements?: Array<{
91
+ id: string;
92
+ type: string;
93
+ }>;
94
+ updated?: number;
95
+ link?: null;
96
+ locked?: boolean;
97
+ seed?: number;
98
+ versionNonce?: number;
99
+ }
100
+ export interface ExcalidrawData {
101
+ type: string;
102
+ version: number;
103
+ source: string;
104
+ elements: ExcalidrawElement[];
105
+ appState: {
106
+ gridMode: string;
107
+ gridSize: number;
108
+ viewBackgroundColor?: string;
109
+ };
110
+ files: Record<string, unknown>;
111
+ }
112
+ export declare function renderGraphExcalidraw(nodes: GraphNode[], opts: ExcalidrawOptions): ExcalidrawData;
113
+ export declare function serializeExcalidraw(data: ExcalidrawData): string;
114
+ export {};
115
+ //# sourceMappingURL=graph-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/graph-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Generic graph renderer — the shared core behind `dare dag viz` (the task
3
+ * DAG) and `dare reverse` (the module-dependency graph).
4
+ *
5
+ * Callers map their domain objects (DagTask, Module, …) to `GraphNode`,
6
+ * resolving colors / labels / styling, and this module owns the layout
7
+ * (rank grouping via the same Kahn-style traversal the DAG uses) and the
8
+ * serialization to Mermaid, Graphviz DOT, and Excalidraw JSON.
9
+ *
10
+ * Two styling strategies for Mermaid:
11
+ * - `'class'` → emits `class <id> <cls>;` + shared `classDef` lines.
12
+ * Used by the DAG (status-driven palette).
13
+ * - `'inline'` → emits `style <id> fill:…,stroke:…;` per node.
14
+ * Used by `reverse` (arbitrary per-node colors, e.g. size).
15
+ *
16
+ * License: MIT (part of DARE CLI).
17
+ */
18
+ // ─── Rank computation (Kahn-style, mirrors run_dag.computeRanks) ─────────────
19
+ /**
20
+ * Compute layout ranks for a set of nodes from their `depends_on` edges.
21
+ * Nodes with no dependencies are rank 0; otherwise rank = max(parent) + 1.
22
+ * Throws on circular dependencies (same contract as the DAG runner).
23
+ */
24
+ export function computeRanks(nodes) {
25
+ const ranks = new Map();
26
+ const byId = new Map(nodes.map((n) => [n.id, n]));
27
+ function getRank(id, visited = new Set()) {
28
+ if (ranks.has(id))
29
+ return ranks.get(id);
30
+ if (visited.has(id)) {
31
+ throw new Error(`Circular dependency detected: ${id}`);
32
+ }
33
+ visited.add(id);
34
+ const node = byId.get(id);
35
+ // Unknown dependency targets are treated as rank-0 anchors so a missing
36
+ // edge never crashes a best-effort reverse-engineering render.
37
+ if (!node || node.depends_on.length === 0) {
38
+ ranks.set(id, 0);
39
+ return 0;
40
+ }
41
+ const maxDep = Math.max(...node.depends_on.map((dep) => getRank(dep, new Set(visited))));
42
+ const rank = maxDep + 1;
43
+ ranks.set(id, rank);
44
+ return rank;
45
+ }
46
+ for (const n of nodes)
47
+ getRank(n.id);
48
+ return ranks;
49
+ }
50
+ function groupByRank(nodes, ranks) {
51
+ const byRank = new Map();
52
+ for (const node of nodes) {
53
+ const r = ranks.get(node.id) ?? 0;
54
+ if (!byRank.has(r))
55
+ byRank.set(r, []);
56
+ byRank.get(r).push(node);
57
+ }
58
+ return byRank;
59
+ }
60
+ // ─── Shared helpers ──────────────────────────────────────────────────────────
61
+ export function sanitizeId(id) {
62
+ return id.replace(/[^a-zA-Z0-9_]/g, '_');
63
+ }
64
+ export function escapeMermaid(s) {
65
+ return s.replace(/"/g, '&quot;').replace(/[\r\n]+/g, ' ');
66
+ }
67
+ // ─── Mermaid ──────────────────────────────────────────────────────────────────
68
+ export function renderGraphMermaid(nodes, opts) {
69
+ const dir = opts.direction ?? 'LR';
70
+ const lines = [
71
+ `%% ${opts.headerComment}`,
72
+ `%% Generated: ${new Date().toISOString()}`,
73
+ `graph ${dir}`,
74
+ ];
75
+ const ranks = computeRanks(nodes);
76
+ const byRank = groupByRank(nodes, ranks);
77
+ const sortedRanks = [...byRank.keys()].sort((a, b) => a - b);
78
+ for (const r of sortedRanks) {
79
+ lines.push(` subgraph rank_${r} ["Rank ${r}"]`);
80
+ lines.push(` direction TB`);
81
+ for (const node of byRank.get(r)) {
82
+ const id = sanitizeId(node.id);
83
+ const label = node.labelLines.map(escapeMermaid).join('\\n');
84
+ lines.push(` ${id}["${label}"]`);
85
+ }
86
+ lines.push(' end');
87
+ }
88
+ for (const node of nodes) {
89
+ for (const dep of node.depends_on) {
90
+ lines.push(` ${sanitizeId(dep)} --> ${sanitizeId(node.id)}`);
91
+ }
92
+ }
93
+ if (opts.styling === 'class') {
94
+ for (const node of nodes) {
95
+ lines.push(` class ${sanitizeId(node.id)} ${node.mermaidClass};`);
96
+ }
97
+ for (const cls of opts.classDefs ?? [])
98
+ lines.push(` ${cls}`);
99
+ }
100
+ else {
101
+ for (const node of nodes) {
102
+ lines.push(` style ${sanitizeId(node.id)} fill:${node.bg},stroke:${node.stroke};`);
103
+ }
104
+ }
105
+ return lines.join('\n');
106
+ }
107
+ // ─── Graphviz DOT ──────────────────────────────────────────────────────────────
108
+ export function renderGraphDot(nodes, opts) {
109
+ const lines = [
110
+ `digraph ${opts.name} {`,
111
+ ' rankdir=LR;',
112
+ ' node [shape=box style=filled fontname=Helvetica];',
113
+ ];
114
+ for (const node of nodes) {
115
+ const id = JSON.stringify(node.id);
116
+ const label = JSON.stringify(node.labelLines.join('\n'));
117
+ lines.push(` ${id} [label=${label} fillcolor="${node.bg}" color="${node.stroke}"];`);
118
+ }
119
+ for (const node of nodes) {
120
+ for (const dep of node.depends_on) {
121
+ lines.push(` ${JSON.stringify(dep)} -> ${JSON.stringify(node.id)};`);
122
+ }
123
+ }
124
+ lines.push('}');
125
+ return lines.join('\n');
126
+ }
127
+ function randomId() {
128
+ return Math.random().toString(36).substr(2, 9);
129
+ }
130
+ function createNodeRect(node, x, y) {
131
+ return {
132
+ id: node.id,
133
+ type: 'rectangle',
134
+ x,
135
+ y,
136
+ width: 120,
137
+ height: 60,
138
+ angle: 0,
139
+ strokeColor: node.stroke,
140
+ backgroundColor: node.bg,
141
+ fillStyle: 'hachure',
142
+ strokeWidth: 2,
143
+ strokeStyle: node.dashed ? 'dashed' : 'solid',
144
+ roughness: 0,
145
+ opacity: 100,
146
+ roundness: { type: 2, value: 6 },
147
+ text: node.labelLines.join('\n'),
148
+ fontSize: 12,
149
+ fontFamily: 1, // Virgil (default Excalidraw font)
150
+ textAlign: 'center',
151
+ verticalAlign: 'middle',
152
+ boundElements: [],
153
+ updated: Date.now(),
154
+ link: null,
155
+ locked: false,
156
+ seed: Math.floor(Math.random() * 2147483647),
157
+ versionNonce: Math.floor(Math.random() * 2147483647),
158
+ };
159
+ }
160
+ function createEdgeArrow(fromId, toId) {
161
+ return {
162
+ id: randomId(),
163
+ type: 'arrow',
164
+ x: 0, // computed from start/end binding by Excalidraw
165
+ y: 0,
166
+ startBinding: { elementId: fromId },
167
+ endBinding: { elementId: toId },
168
+ startArrowType: 'dot',
169
+ endArrowType: 'arrow',
170
+ strokeColor: '#999999',
171
+ strokeWidth: 2,
172
+ strokeStyle: 'solid',
173
+ roughness: 0,
174
+ opacity: 100,
175
+ updated: Date.now(),
176
+ link: null,
177
+ locked: false,
178
+ seed: Math.floor(Math.random() * 2147483647),
179
+ versionNonce: Math.floor(Math.random() * 2147483647),
180
+ };
181
+ }
182
+ export function renderGraphExcalidraw(nodes, opts) {
183
+ const elements = [];
184
+ const ranks = computeRanks(nodes);
185
+ const byRank = groupByRank(nodes, ranks);
186
+ const sortedRanks = [...byRank.keys()].sort((a, b) => a - b);
187
+ for (const rank of sortedRanks) {
188
+ const inRank = byRank.get(rank);
189
+ for (let i = 0; i < inRank.length; i++) {
190
+ const x = 20 + i * 140;
191
+ const y = 20 + rank * 160;
192
+ elements.push(createNodeRect(inRank[i], x, y));
193
+ }
194
+ }
195
+ for (const node of nodes) {
196
+ for (const dep of node.depends_on) {
197
+ elements.push(createEdgeArrow(dep, node.id));
198
+ }
199
+ }
200
+ return {
201
+ type: 'excalidraw',
202
+ version: 2,
203
+ source: opts.source,
204
+ elements,
205
+ appState: {
206
+ gridMode: 'grid',
207
+ gridSize: 20,
208
+ viewBackgroundColor: '#ffffff',
209
+ },
210
+ files: {},
211
+ };
212
+ }
213
+ export function serializeExcalidraw(data) {
214
+ return JSON.stringify(data, null, 2);
215
+ }
216
+ //# sourceMappingURL=graph-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-renderer.js","sourceRoot":"","sources":["../../src/utils/graph-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Migration planning for `dare migrate` (Phase 2 brownfield).
3
+ *
4
+ * Consumes the reverse/dna artifacts and produces a migration plan skeleton +
5
+ * one Gherkin parity feature stub per module. The CLI is deterministic (reads
6
+ * facts, lists blocking gaps from the Phase-1 confidence markers, scaffolds
7
+ * skeletons); the `/dare-migrate` skill writes the real strategy, risk
8
+ * analysis, and parity scenarios.
9
+ *
10
+ * Concept inspired by the Reversa migration team + parity scenarios
11
+ * (Macedo & da Costa, arXiv:2605.18684, 2026) — clean-room, deterministic.
12
+ *
13
+ * License: MIT (part of DARE CLI).
14
+ */
15
+ export interface KnownTarget {
16
+ value: string;
17
+ label: string;
18
+ }
19
+ /** Target stacks we give tailored hints for. `--to` also accepts free text. */
20
+ export declare const KNOWN_TARGETS: KnownTarget[];
21
+ export interface MigrationModule {
22
+ id: string;
23
+ name: string;
24
+ path: string;
25
+ size: string;
26
+ }
27
+ export interface BlockingGap {
28
+ spec: string;
29
+ gaps: number;
30
+ }
31
+ export interface MigrationFacts {
32
+ generatedAt: string;
33
+ source: {
34
+ name: string;
35
+ structure: string;
36
+ stack: string;
37
+ };
38
+ target: {
39
+ stack: string;
40
+ };
41
+ modules: MigrationModule[];
42
+ blockingGaps: {
43
+ total: number;
44
+ perSpec: BlockingGap[];
45
+ };
46
+ conventions: {
47
+ architecture?: string;
48
+ testing?: string;
49
+ libraries?: Record<string, string | undefined>;
50
+ };
51
+ }
52
+ export interface ReverseArtifacts {
53
+ reverseFacts: Record<string, any>;
54
+ dnaFacts: Record<string, any> | null;
55
+ }
56
+ /** Path to the reverse-facts.json that `dare migrate` requires. */
57
+ export declare function reverseFactsPath(root: string): string;
58
+ export declare function loadReverseArtifacts(root: string): Promise<ReverseArtifacts | null>;
59
+ export declare function buildMigrationFacts(artifacts: ReverseArtifacts, target: string, generatedAt: string): MigrationFacts;
60
+ /** A safe file slug for a per-module .feature filename. */
61
+ export declare function parityFeatureFilename(mod: MigrationModule): string;
62
+ export declare function renderParityFeature(mod: MigrationFacts['modules'][number]): string;
63
+ export declare function renderMigrationDoc(facts: MigrationFacts): string;
64
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/utils/migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,+EAA+E;AAC/E,eAAO,MAAM,aAAa,EAAE,WAAW,EAStC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,WAAW,EAAE,CAAC;KACxB,CAAC;IACF,WAAW,EAAE;QACX,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;KAChD,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CACtC;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAUzF;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,gBAAgB,EAC3B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,cAAc,CA8ChB;AAID,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAElE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAelF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA4EhE"}