zugzbot 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (786) hide show
  1. package/.opencode/agents/sdd-coder.md +5 -4
  2. package/.opencode/agents/sdd-orchestrator.md +11 -10
  3. package/.opencode/agents/sdd-spec-writer.md +3 -4
  4. package/.opencode/commands/loop.md +1 -1
  5. package/.opencode/plugins/loop-enforcer.ts +0 -1
  6. package/.opencode/plugins/sdd-bridge.ts +1 -1
  7. package/.opencode/rules/sdd-global.md +8 -0
  8. package/.opencode/scripts/lint-charts.js +1 -2
  9. package/.opencode/skills/sdd-foundation-overview/SKILL.md +3 -4
  10. package/.opencode/skills/sdd-methodology/SKILL.md +8 -10
  11. package/.opencode/skills/sdd-quickstart/SKILL.md +5 -9
  12. package/.opencode/skills/shadcn-templates/SKILL.md +93 -32
  13. package/.opencode/templates/nextjs-shadcn/components.json +4 -1
  14. package/.opencode/tools/sdd_bootstrap.ts +21 -0
  15. package/.opencode/tools/sdd_catalog.ts +1040 -0
  16. package/.opencode/tools/sdd_core.ts +8 -6
  17. package/.opencode/tools/sdd_lucide.ts +112 -0
  18. package/README.md +1 -7
  19. package/opencode.json +0 -10
  20. package/package.json +1 -3
  21. package/.opencode/oh-my-design/design-md/11st/.verification.md +0 -37
  22. package/.opencode/oh-my-design/design-md/11st/DESIGN.md +0 -400
  23. package/.opencode/oh-my-design/design-md/17live/DESIGN.md +0 -467
  24. package/.opencode/oh-my-design/design-md/29cm/DESIGN.md +0 -495
  25. package/.opencode/oh-my-design/design-md/29cm/_promo.json +0 -23
  26. package/.opencode/oh-my-design/design-md/29cm/_research.md +0 -103
  27. package/.opencode/oh-my-design/design-md/3o3/.verification.md +0 -73
  28. package/.opencode/oh-my-design/design-md/3o3/DESIGN.md +0 -454
  29. package/.opencode/oh-my-design/design-md/91app/.verification.md +0 -25
  30. package/.opencode/oh-my-design/design-md/91app/DESIGN.md +0 -182
  31. package/.opencode/oh-my-design/design-md/abema/.verification.md +0 -64
  32. package/.opencode/oh-my-design/design-md/abema/DESIGN.md +0 -535
  33. package/.opencode/oh-my-design/design-md/ably/DESIGN.md +0 -646
  34. package/.opencode/oh-my-design/design-md/ably/_promo.json +0 -18
  35. package/.opencode/oh-my-design/design-md/ably/_research.md +0 -120
  36. package/.opencode/oh-my-design/design-md/accupass/.verification.md +0 -66
  37. package/.opencode/oh-my-design/design-md/accupass/DESIGN.md +0 -494
  38. package/.opencode/oh-my-design/design-md/adobe/.verification.md +0 -63
  39. package/.opencode/oh-my-design/design-md/adobe/DESIGN.md +0 -458
  40. package/.opencode/oh-my-design/design-md/airbnb/.verification.md +0 -143
  41. package/.opencode/oh-my-design/design-md/airbnb/DESIGN.md +0 -639
  42. package/.opencode/oh-my-design/design-md/airbnb/README.md +0 -23
  43. package/.opencode/oh-my-design/design-md/airbnb/preview-dark.html +0 -234
  44. package/.opencode/oh-my-design/design-md/airbnb/preview.html +0 -233
  45. package/.opencode/oh-my-design/design-md/airtable/.verification.md +0 -136
  46. package/.opencode/oh-my-design/design-md/airtable/DESIGN.md +0 -314
  47. package/.opencode/oh-my-design/design-md/airtable/README.md +0 -23
  48. package/.opencode/oh-my-design/design-md/airtable/preview-dark.html +0 -165
  49. package/.opencode/oh-my-design/design-md/airtable/preview.html +0 -164
  50. package/.opencode/oh-my-design/design-md/alipay/DESIGN.md +0 -506
  51. package/.opencode/oh-my-design/design-md/amazingtalker/.verification.md +0 -38
  52. package/.opencode/oh-my-design/design-md/amazingtalker/DESIGN.md +0 -434
  53. package/.opencode/oh-my-design/design-md/appier/DESIGN.md +0 -465
  54. package/.opencode/oh-my-design/design-md/apple/.verification.md +0 -162
  55. package/.opencode/oh-my-design/design-md/apple/DESIGN.md +0 -613
  56. package/.opencode/oh-my-design/design-md/apple/README.md +0 -24
  57. package/.opencode/oh-my-design/design-md/apple/preview-dark.html +0 -420
  58. package/.opencode/oh-my-design/design-md/apple/preview.html +0 -414
  59. package/.opencode/oh-my-design/design-md/baemin/.verification.md +0 -132
  60. package/.opencode/oh-my-design/design-md/baemin/DESIGN.md +0 -578
  61. package/.opencode/oh-my-design/design-md/baemin/README.md +0 -19
  62. package/.opencode/oh-my-design/design-md/baemin/_research.md +0 -84
  63. package/.opencode/oh-my-design/design-md/banksalad/DESIGN.md +0 -688
  64. package/.opencode/oh-my-design/design-md/banksalad/_promo.json +0 -29
  65. package/.opencode/oh-my-design/design-md/banksalad/_research.md +0 -190
  66. package/.opencode/oh-my-design/design-md/bilibili/DESIGN.md +0 -471
  67. package/.opencode/oh-my-design/design-md/bithumb/.verification.md +0 -31
  68. package/.opencode/oh-my-design/design-md/bithumb/DESIGN.md +0 -208
  69. package/.opencode/oh-my-design/design-md/bmw/.verification.md +0 -114
  70. package/.opencode/oh-my-design/design-md/bmw/DESIGN.md +0 -360
  71. package/.opencode/oh-my-design/design-md/bmw/README.md +0 -23
  72. package/.opencode/oh-my-design/design-md/bmw/preview-dark.html +0 -211
  73. package/.opencode/oh-my-design/design-md/bmw/preview.html +0 -210
  74. package/.opencode/oh-my-design/design-md/brandi/.verification.md +0 -29
  75. package/.opencode/oh-my-design/design-md/brandi/DESIGN.md +0 -414
  76. package/.opencode/oh-my-design/design-md/bunjang/DESIGN.md +0 -374
  77. package/.opencode/oh-my-design/design-md/bunjang/assets/_reference/.live-inspect-proof.json +0 -260
  78. package/.opencode/oh-my-design/design-md/bunjang/assets/_reference/fonts.json +0 -33
  79. package/.opencode/oh-my-design/design-md/bunjang/assets/_reference/logo-icon.svg +0 -10
  80. package/.opencode/oh-my-design/design-md/bunjang/assets/_reference/structure.json +0 -131
  81. package/.opencode/oh-my-design/design-md/bunjang/assets/_reference/tokens.json +0 -147
  82. package/.opencode/oh-my-design/design-md/cakeresume/.verification.md +0 -25
  83. package/.opencode/oh-my-design/design-md/cakeresume/DESIGN.md +0 -191
  84. package/.opencode/oh-my-design/design-md/cal/.verification.md +0 -145
  85. package/.opencode/oh-my-design/design-md/cal/DESIGN.md +0 -481
  86. package/.opencode/oh-my-design/design-md/cal/README.md +0 -23
  87. package/.opencode/oh-my-design/design-md/cal/preview-dark.html +0 -449
  88. package/.opencode/oh-my-design/design-md/cal/preview.html +0 -575
  89. package/.opencode/oh-my-design/design-md/catchtable/DESIGN.md +0 -341
  90. package/.opencode/oh-my-design/design-md/catchtable/_research.md +0 -54
  91. package/.opencode/oh-my-design/design-md/catchtable/assets/_reference/.live-inspect-proof.json +0 -204
  92. package/.opencode/oh-my-design/design-md/catchtable/assets/_reference/.live-inspect-raw.json +0 -22
  93. package/.opencode/oh-my-design/design-md/catchtable/assets/_reference/fonts.json +0 -21
  94. package/.opencode/oh-my-design/design-md/catchtable/assets/_reference/structure.json +0 -42
  95. package/.opencode/oh-my-design/design-md/catchtable/assets/_reference/tokens.json +0 -95
  96. package/.opencode/oh-my-design/design-md/cathay/.verification.md +0 -44
  97. package/.opencode/oh-my-design/design-md/cathay/DESIGN.md +0 -432
  98. package/.opencode/oh-my-design/design-md/channeltalk/DESIGN.md +0 -422
  99. package/.opencode/oh-my-design/design-md/channeltalk/assets/_reference/.live-inspect-proof.json +0 -320
  100. package/.opencode/oh-my-design/design-md/channeltalk/assets/_reference/fonts.json +0 -53
  101. package/.opencode/oh-my-design/design-md/channeltalk/assets/_reference/structure.json +0 -47
  102. package/.opencode/oh-my-design/design-md/channeltalk/assets/_reference/tokens.json +0 -78
  103. package/.opencode/oh-my-design/design-md/class101/DESIGN.md +0 -484
  104. package/.opencode/oh-my-design/design-md/classting/.verification.md +0 -32
  105. package/.opencode/oh-my-design/design-md/classting/DESIGN.md +0 -292
  106. package/.opencode/oh-my-design/design-md/classum/DESIGN.md +0 -279
  107. package/.opencode/oh-my-design/design-md/classum/assets/_reference/.live-inspect-proof.json +0 -72
  108. package/.opencode/oh-my-design/design-md/classum/assets/_reference/fonts.json +0 -20
  109. package/.opencode/oh-my-design/design-md/classum/assets/_reference/structure.json +0 -21
  110. package/.opencode/oh-my-design/design-md/classum/assets/_reference/tokens.json +0 -56
  111. package/.opencode/oh-my-design/design-md/claude/.verification.md +0 -106
  112. package/.opencode/oh-my-design/design-md/claude/DESIGN.md +0 -561
  113. package/.opencode/oh-my-design/design-md/claude/README.md +0 -24
  114. package/.opencode/oh-my-design/design-md/claude/preview-dark.html +0 -803
  115. package/.opencode/oh-my-design/design-md/claude/preview.html +0 -826
  116. package/.opencode/oh-my-design/design-md/clay/.verification.md +0 -129
  117. package/.opencode/oh-my-design/design-md/clay/DESIGN.md +0 -454
  118. package/.opencode/oh-my-design/design-md/clay/README.md +0 -23
  119. package/.opencode/oh-my-design/design-md/clay/preview-dark.html +0 -316
  120. package/.opencode/oh-my-design/design-md/clay/preview.html +0 -315
  121. package/.opencode/oh-my-design/design-md/clickhouse/.verification.md +0 -132
  122. package/.opencode/oh-my-design/design-md/clickhouse/DESIGN.md +0 -424
  123. package/.opencode/oh-my-design/design-md/clickhouse/README.md +0 -24
  124. package/.opencode/oh-my-design/design-md/clickhouse/preview-dark.html +0 -834
  125. package/.opencode/oh-my-design/design-md/clickhouse/preview.html +0 -786
  126. package/.opencode/oh-my-design/design-md/cloudflare/.verification.md +0 -21
  127. package/.opencode/oh-my-design/design-md/cloudflare/DESIGN.md +0 -637
  128. package/.opencode/oh-my-design/design-md/cohere/.verification.md +0 -136
  129. package/.opencode/oh-my-design/design-md/cohere/DESIGN.md +0 -409
  130. package/.opencode/oh-my-design/design-md/cohere/README.md +0 -24
  131. package/.opencode/oh-my-design/design-md/cohere/preview-dark.html +0 -803
  132. package/.opencode/oh-my-design/design-md/cohere/preview.html +0 -807
  133. package/.opencode/oh-my-design/design-md/coinbase/.verification.md +0 -116
  134. package/.opencode/oh-my-design/design-md/coinbase/DESIGN.md +0 -353
  135. package/.opencode/oh-my-design/design-md/coinbase/README.md +0 -23
  136. package/.opencode/oh-my-design/design-md/coinbase/preview-dark.html +0 -164
  137. package/.opencode/oh-my-design/design-md/coinbase/preview.html +0 -163
  138. package/.opencode/oh-my-design/design-md/coinone/.verification.md +0 -38
  139. package/.opencode/oh-my-design/design-md/coinone/DESIGN.md +0 -257
  140. package/.opencode/oh-my-design/design-md/composio/.verification.md +0 -143
  141. package/.opencode/oh-my-design/design-md/composio/DESIGN.md +0 -441
  142. package/.opencode/oh-my-design/design-md/composio/README.md +0 -24
  143. package/.opencode/oh-my-design/design-md/composio/preview-dark.html +0 -958
  144. package/.opencode/oh-my-design/design-md/composio/preview.html +0 -933
  145. package/.opencode/oh-my-design/design-md/cookpad/DESIGN.md +0 -394
  146. package/.opencode/oh-my-design/design-md/coupang/.verification.md +0 -141
  147. package/.opencode/oh-my-design/design-md/coupang/DESIGN.md +0 -557
  148. package/.opencode/oh-my-design/design-md/cursor/.verification.md +0 -141
  149. package/.opencode/oh-my-design/design-md/cursor/DESIGN.md +0 -460
  150. package/.opencode/oh-my-design/design-md/cursor/README.md +0 -24
  151. package/.opencode/oh-my-design/design-md/cursor/preview-dark.html +0 -393
  152. package/.opencode/oh-my-design/design-md/cursor/preview.html +0 -383
  153. package/.opencode/oh-my-design/design-md/dabang/DESIGN.md +0 -267
  154. package/.opencode/oh-my-design/design-md/dabang/assets/_reference/.live-inspect-proof.json +0 -145
  155. package/.opencode/oh-my-design/design-md/dabang/assets/_reference/fonts.json +0 -22
  156. package/.opencode/oh-my-design/design-md/dabang/assets/_reference/raw-capture-map.json +0 -718
  157. package/.opencode/oh-my-design/design-md/dabang/assets/_reference/raw-capture.json +0 -1125
  158. package/.opencode/oh-my-design/design-md/dabang/assets/_reference/structure.json +0 -53
  159. package/.opencode/oh-my-design/design-md/dabang/assets/_reference/tokens.json +0 -130
  160. package/.opencode/oh-my-design/design-md/danawa/.verification.md +0 -60
  161. package/.opencode/oh-my-design/design-md/danawa/DESIGN.md +0 -477
  162. package/.opencode/oh-my-design/design-md/dcard/.verification.md +0 -118
  163. package/.opencode/oh-my-design/design-md/dcard/DESIGN.md +0 -633
  164. package/.opencode/oh-my-design/design-md/dcard/README.md +0 -12
  165. package/.opencode/oh-my-design/design-md/dcard/_research/forum-1440px.png +0 -0
  166. package/.opencode/oh-my-design/design-md/dcard/_research.md +0 -133
  167. package/.opencode/oh-my-design/design-md/dell/.verification.md +0 -21
  168. package/.opencode/oh-my-design/design-md/dell/DESIGN.md +0 -636
  169. package/.opencode/oh-my-design/design-md/devsisters/.verification.md +0 -32
  170. package/.opencode/oh-my-design/design-md/devsisters/DESIGN.md +0 -282
  171. package/.opencode/oh-my-design/design-md/discord/.verification.md +0 -21
  172. package/.opencode/oh-my-design/design-md/discord/DESIGN.md +0 -604
  173. package/.opencode/oh-my-design/design-md/dji/DESIGN.md +0 -454
  174. package/.opencode/oh-my-design/design-md/drnow/.verification.md +0 -41
  175. package/.opencode/oh-my-design/design-md/drnow/DESIGN.md +0 -383
  176. package/.opencode/oh-my-design/design-md/dropbox/.verification.md +0 -61
  177. package/.opencode/oh-my-design/design-md/dropbox/DESIGN.md +0 -445
  178. package/.opencode/oh-my-design/design-md/duolingo/.verification.md +0 -20
  179. package/.opencode/oh-my-design/design-md/duolingo/DESIGN.md +0 -563
  180. package/.opencode/oh-my-design/design-md/elevenlabs/.verification.md +0 -128
  181. package/.opencode/oh-my-design/design-md/elevenlabs/DESIGN.md +0 -415
  182. package/.opencode/oh-my-design/design-md/elevenlabs/README.md +0 -23
  183. package/.opencode/oh-my-design/design-md/elevenlabs/preview-dark.html +0 -252
  184. package/.opencode/oh-my-design/design-md/elevenlabs/preview.html +0 -251
  185. package/.opencode/oh-my-design/design-md/expo/.verification.md +0 -141
  186. package/.opencode/oh-my-design/design-md/expo/DESIGN.md +0 -412
  187. package/.opencode/oh-my-design/design-md/expo/README.md +0 -24
  188. package/.opencode/oh-my-design/design-md/expo/preview-dark.html +0 -533
  189. package/.opencode/oh-my-design/design-md/expo/preview.html +0 -533
  190. package/.opencode/oh-my-design/design-md/fastcampus/DESIGN.md +0 -529
  191. package/.opencode/oh-my-design/design-md/fastcampus/assets/_reference/.live-inspect-proof.json +0 -950
  192. package/.opencode/oh-my-design/design-md/fastcampus/assets/_reference/fonts.json +0 -14
  193. package/.opencode/oh-my-design/design-md/fastcampus/assets/_reference/structure.json +0 -30
  194. package/.opencode/oh-my-design/design-md/fastcampus/assets/_reference/tokens.json +0 -109
  195. package/.opencode/oh-my-design/design-md/ferrari/.verification.md +0 -119
  196. package/.opencode/oh-my-design/design-md/ferrari/DESIGN.md +0 -447
  197. package/.opencode/oh-my-design/design-md/ferrari/README.md +0 -23
  198. package/.opencode/oh-my-design/design-md/ferrari/preview-dark.html +0 -1162
  199. package/.opencode/oh-my-design/design-md/ferrari/preview.html +0 -1122
  200. package/.opencode/oh-my-design/design-md/figma/.verification.md +0 -206
  201. package/.opencode/oh-my-design/design-md/figma/DESIGN.md +0 -534
  202. package/.opencode/oh-my-design/design-md/figma/README.md +0 -24
  203. package/.opencode/oh-my-design/design-md/figma/preview-dark.html +0 -822
  204. package/.opencode/oh-my-design/design-md/figma/preview.html +0 -832
  205. package/.opencode/oh-my-design/design-md/finda/.verification.md +0 -33
  206. package/.opencode/oh-my-design/design-md/finda/DESIGN.md +0 -413
  207. package/.opencode/oh-my-design/design-md/firstory/.verification.md +0 -70
  208. package/.opencode/oh-my-design/design-md/firstory/DESIGN.md +0 -487
  209. package/.opencode/oh-my-design/design-md/flex/DESIGN.md +0 -356
  210. package/.opencode/oh-my-design/design-md/flex/_research.md +0 -49
  211. package/.opencode/oh-my-design/design-md/flex/assets/_reference/.live-inspect-proof.json +0 -192
  212. package/.opencode/oh-my-design/design-md/flex/assets/_reference/.raw-inspect.json +0 -873
  213. package/.opencode/oh-my-design/design-md/flex/assets/_reference/fonts.json +0 -17
  214. package/.opencode/oh-my-design/design-md/flex/assets/_reference/structure.json +0 -58
  215. package/.opencode/oh-my-design/design-md/flex/assets/_reference/tokens.json +0 -75
  216. package/.opencode/oh-my-design/design-md/flo/.verification.md +0 -33
  217. package/.opencode/oh-my-design/design-md/flo/DESIGN.md +0 -349
  218. package/.opencode/oh-my-design/design-md/framer/.verification.md +0 -147
  219. package/.opencode/oh-my-design/design-md/framer/DESIGN.md +0 -431
  220. package/.opencode/oh-my-design/design-md/framer/README.md +0 -23
  221. package/.opencode/oh-my-design/design-md/framer/preview-dark.html +0 -902
  222. package/.opencode/oh-my-design/design-md/framer/preview.html +0 -883
  223. package/.opencode/oh-my-design/design-md/freee/.verification.md +0 -145
  224. package/.opencode/oh-my-design/design-md/freee/DESIGN.md +0 -620
  225. package/.opencode/oh-my-design/design-md/freee/README.md +0 -12
  226. package/.opencode/oh-my-design/design-md/freee/_research/vibes-storybook-1440px.png +0 -0
  227. package/.opencode/oh-my-design/design-md/freee/_research.md +0 -116
  228. package/.opencode/oh-my-design/design-md/fugle/.verification.md +0 -40
  229. package/.opencode/oh-my-design/design-md/fugle/DESIGN.md +0 -290
  230. package/.opencode/oh-my-design/design-md/funnow/.verification.md +0 -62
  231. package/.opencode/oh-my-design/design-md/funnow/DESIGN.md +0 -431
  232. package/.opencode/oh-my-design/design-md/gangnamunni/DESIGN.md +0 -677
  233. package/.opencode/oh-my-design/design-md/gangnamunni/_promo.json +0 -26
  234. package/.opencode/oh-my-design/design-md/gangnamunni/_research.md +0 -113
  235. package/.opencode/oh-my-design/design-md/genie/.verification.md +0 -29
  236. package/.opencode/oh-my-design/design-md/genie/DESIGN.md +0 -415
  237. package/.opencode/oh-my-design/design-md/github/.verification.md +0 -21
  238. package/.opencode/oh-my-design/design-md/github/DESIGN.md +0 -727
  239. package/.opencode/oh-my-design/design-md/gmarket/DESIGN.md +0 -534
  240. package/.opencode/oh-my-design/design-md/gmarket/assets/_reference/.live-inspect-proof.json +0 -217
  241. package/.opencode/oh-my-design/design-md/gmarket/assets/_reference/fonts.json +0 -41
  242. package/.opencode/oh-my-design/design-md/gmarket/assets/_reference/raw-capture-bestsellers.json +0 -1929
  243. package/.opencode/oh-my-design/design-md/gmarket/assets/_reference/raw-capture-home.json +0 -3675
  244. package/.opencode/oh-my-design/design-md/gmarket/assets/_reference/structure.json +0 -65
  245. package/.opencode/oh-my-design/design-md/gmarket/assets/_reference/tokens.json +0 -210
  246. package/.opencode/oh-my-design/design-md/gogolook/.verification.md +0 -31
  247. package/.opencode/oh-my-design/design-md/gogolook/DESIGN.md +0 -155
  248. package/.opencode/oh-my-design/design-md/gogoro/DESIGN.md +0 -441
  249. package/.opencode/oh-my-design/design-md/google/.verification.md +0 -61
  250. package/.opencode/oh-my-design/design-md/google/DESIGN.md +0 -499
  251. package/.opencode/oh-my-design/design-md/greenvines/.verification.md +0 -72
  252. package/.opencode/oh-my-design/design-md/greenvines/DESIGN.md +0 -454
  253. package/.opencode/oh-my-design/design-md/greeting/.verification.md +0 -64
  254. package/.opencode/oh-my-design/design-md/greeting/DESIGN.md +0 -462
  255. package/.opencode/oh-my-design/design-md/grip/.verification.md +0 -36
  256. package/.opencode/oh-my-design/design-md/grip/DESIGN.md +0 -289
  257. package/.opencode/oh-my-design/design-md/hahow/.verification.md +0 -31
  258. package/.opencode/oh-my-design/design-md/hahow/DESIGN.md +0 -184
  259. package/.opencode/oh-my-design/design-md/hashicorp/.verification.md +0 -142
  260. package/.opencode/oh-my-design/design-md/hashicorp/DESIGN.md +0 -411
  261. package/.opencode/oh-my-design/design-md/hashicorp/README.md +0 -24
  262. package/.opencode/oh-my-design/design-md/hashicorp/preview-dark.html +0 -1202
  263. package/.opencode/oh-my-design/design-md/hashicorp/preview.html +0 -1193
  264. package/.opencode/oh-my-design/design-md/hogangnono/.verification.md +0 -33
  265. package/.opencode/oh-my-design/design-md/hogangnono/DESIGN.md +0 -349
  266. package/.opencode/oh-my-design/design-md/hp/.verification.md +0 -21
  267. package/.opencode/oh-my-design/design-md/hp/DESIGN.md +0 -563
  268. package/.opencode/oh-my-design/design-md/hyperconnect/.verification.md +0 -40
  269. package/.opencode/oh-my-design/design-md/hyperconnect/DESIGN.md +0 -393
  270. package/.opencode/oh-my-design/design-md/hyundaicard/.verification.md +0 -25
  271. package/.opencode/oh-my-design/design-md/hyundaicard/DESIGN.md +0 -201
  272. package/.opencode/oh-my-design/design-md/ibm/.verification.md +0 -102
  273. package/.opencode/oh-my-design/design-md/ibm/DESIGN.md +0 -464
  274. package/.opencode/oh-my-design/design-md/ibm/README.md +0 -24
  275. package/.opencode/oh-my-design/design-md/ibm/preview-dark.html +0 -443
  276. package/.opencode/oh-my-design/design-md/ibm/preview.html +0 -428
  277. package/.opencode/oh-my-design/design-md/ichef/DESIGN.md +0 -455
  278. package/.opencode/oh-my-design/design-md/ikala/.verification.md +0 -35
  279. package/.opencode/oh-my-design/design-md/ikala/DESIGN.md +0 -400
  280. package/.opencode/oh-my-design/design-md/imweb/.verification.md +0 -61
  281. package/.opencode/oh-my-design/design-md/imweb/DESIGN.md +0 -460
  282. package/.opencode/oh-my-design/design-md/inflearn/DESIGN.md +0 -453
  283. package/.opencode/oh-my-design/design-md/inflearn/_promo.json +0 -29
  284. package/.opencode/oh-my-design/design-md/inflearn/_research.md +0 -85
  285. package/.opencode/oh-my-design/design-md/inflearn/assets/_reference/.live-inspect-proof-courses.json +0 -679
  286. package/.opencode/oh-my-design/design-md/inflearn/assets/_reference/.live-inspect-proof.json +0 -448
  287. package/.opencode/oh-my-design/design-md/inflearn/assets/_reference/fonts.json +0 -41
  288. package/.opencode/oh-my-design/design-md/inflearn/assets/_reference/structure.json +0 -110
  289. package/.opencode/oh-my-design/design-md/inflearn/assets/_reference/tokens.json +0 -54
  290. package/.opencode/oh-my-design/design-md/intercom/.verification.md +0 -144
  291. package/.opencode/oh-my-design/design-md/intercom/DESIGN.md +0 -271
  292. package/.opencode/oh-my-design/design-md/intercom/README.md +0 -23
  293. package/.opencode/oh-my-design/design-md/intercom/preview-dark.html +0 -185
  294. package/.opencode/oh-my-design/design-md/intercom/preview.html +0 -184
  295. package/.opencode/oh-my-design/design-md/jandi/.verification.md +0 -26
  296. package/.opencode/oh-my-design/design-md/jandi/DESIGN.md +0 -382
  297. package/.opencode/oh-my-design/design-md/jkopay/.verification.md +0 -32
  298. package/.opencode/oh-my-design/design-md/jkopay/DESIGN.md +0 -283
  299. package/.opencode/oh-my-design/design-md/jobkorea/.verification.md +0 -30
  300. package/.opencode/oh-my-design/design-md/jobkorea/DESIGN.md +0 -349
  301. package/.opencode/oh-my-design/design-md/jumpit/DESIGN.md +0 -403
  302. package/.opencode/oh-my-design/design-md/jumpit/_research.md +0 -119
  303. package/.opencode/oh-my-design/design-md/jumpit/assets/_reference/.live-inspect-proof.json +0 -182
  304. package/.opencode/oh-my-design/design-md/jumpit/assets/_reference/fonts.json +0 -20
  305. package/.opencode/oh-my-design/design-md/jumpit/assets/_reference/structure.json +0 -66
  306. package/.opencode/oh-my-design/design-md/jumpit/assets/_reference/tokens.json +0 -108
  307. package/.opencode/oh-my-design/design-md/kakao/.verification.md +0 -137
  308. package/.opencode/oh-my-design/design-md/kakao/DESIGN.md +0 -568
  309. package/.opencode/oh-my-design/design-md/kakao/README.md +0 -18
  310. package/.opencode/oh-my-design/design-md/kakao/_research.md +0 -98
  311. package/.opencode/oh-my-design/design-md/kakaobank/.verification.md +0 -133
  312. package/.opencode/oh-my-design/design-md/kakaobank/DESIGN.md +0 -602
  313. package/.opencode/oh-my-design/design-md/kakaopay/DESIGN.md +0 -603
  314. package/.opencode/oh-my-design/design-md/kakaopay/_promo.json +0 -22
  315. package/.opencode/oh-my-design/design-md/kakaopay/_research.md +0 -84
  316. package/.opencode/oh-my-design/design-md/kakaot/DESIGN.md +0 -507
  317. package/.opencode/oh-my-design/design-md/karrot/.verification.md +0 -143
  318. package/.opencode/oh-my-design/design-md/karrot/DESIGN.md +0 -494
  319. package/.opencode/oh-my-design/design-md/karrot/README.md +0 -18
  320. package/.opencode/oh-my-design/design-md/karrot/_research.md +0 -57
  321. package/.opencode/oh-my-design/design-md/kbank/DESIGN.md +0 -252
  322. package/.opencode/oh-my-design/design-md/kbank/assets/_reference/.live-inspect-proof.json +0 -215
  323. package/.opencode/oh-my-design/design-md/kbank/assets/_reference/.live-inspect-raw.json +0 -1
  324. package/.opencode/oh-my-design/design-md/kbank/assets/_reference/fonts.json +0 -20
  325. package/.opencode/oh-my-design/design-md/kbank/assets/_reference/structure.json +0 -151
  326. package/.opencode/oh-my-design/design-md/kbank/assets/_reference/tokens.json +0 -101
  327. package/.opencode/oh-my-design/design-md/kdan/.verification.md +0 -30
  328. package/.opencode/oh-my-design/design-md/kdan/DESIGN.md +0 -193
  329. package/.opencode/oh-my-design/design-md/kintone/.verification.md +0 -21
  330. package/.opencode/oh-my-design/design-md/kintone/DESIGN.md +0 -586
  331. package/.opencode/oh-my-design/design-md/kkbox/.verification.md +0 -27
  332. package/.opencode/oh-my-design/design-md/kkbox/DESIGN.md +0 -136
  333. package/.opencode/oh-my-design/design-md/kkday/DESIGN.md +0 -470
  334. package/.opencode/oh-my-design/design-md/kmong/.verification.md +0 -30
  335. package/.opencode/oh-my-design/design-md/kmong/DESIGN.md +0 -427
  336. package/.opencode/oh-my-design/design-md/krafton/.verification.md +0 -38
  337. package/.opencode/oh-my-design/design-md/krafton/DESIGN.md +0 -267
  338. package/.opencode/oh-my-design/design-md/kraken/.verification.md +0 -143
  339. package/.opencode/oh-my-design/design-md/kraken/DESIGN.md +0 -277
  340. package/.opencode/oh-my-design/design-md/kraken/README.md +0 -23
  341. package/.opencode/oh-my-design/design-md/kraken/preview-dark.html +0 -169
  342. package/.opencode/oh-my-design/design-md/kraken/preview.html +0 -168
  343. package/.opencode/oh-my-design/design-md/krds/.verification.md +0 -373
  344. package/.opencode/oh-my-design/design-md/krds/DESIGN.md +0 -1060
  345. package/.opencode/oh-my-design/design-md/kream/DESIGN.md +0 -432
  346. package/.opencode/oh-my-design/design-md/kream/assets/_reference/.live-inspect-proof.json +0 -289
  347. package/.opencode/oh-my-design/design-md/kream/assets/_reference/fonts.json +0 -26
  348. package/.opencode/oh-my-design/design-md/kream/assets/_reference/structure.json +0 -56
  349. package/.opencode/oh-my-design/design-md/kream/assets/_reference/tokens.json +0 -154
  350. package/.opencode/oh-my-design/design-md/kurly/.verification.md +0 -126
  351. package/.opencode/oh-my-design/design-md/kurly/DESIGN.md +0 -620
  352. package/.opencode/oh-my-design/design-md/laftel/.verification.md +0 -39
  353. package/.opencode/oh-my-design/design-md/laftel/DESIGN.md +0 -293
  354. package/.opencode/oh-my-design/design-md/lamborghini/.verification.md +0 -127
  355. package/.opencode/oh-my-design/design-md/lamborghini/DESIGN.md +0 -430
  356. package/.opencode/oh-my-design/design-md/lamborghini/README.md +0 -23
  357. package/.opencode/oh-my-design/design-md/lamborghini/preview-dark.html +0 -303
  358. package/.opencode/oh-my-design/design-md/lamborghini/preview.html +0 -381
  359. package/.opencode/oh-my-design/design-md/laundrygo/.verification.md +0 -60
  360. package/.opencode/oh-my-design/design-md/laundrygo/DESIGN.md +0 -434
  361. package/.opencode/oh-my-design/design-md/layerx/.verification.md +0 -21
  362. package/.opencode/oh-my-design/design-md/layerx/DESIGN.md +0 -615
  363. package/.opencode/oh-my-design/design-md/lezhin/.verification.md +0 -47
  364. package/.opencode/oh-my-design/design-md/lezhin/DESIGN.md +0 -348
  365. package/.opencode/oh-my-design/design-md/line/.verification.md +0 -137
  366. package/.opencode/oh-my-design/design-md/line/DESIGN.md +0 -467
  367. package/.opencode/oh-my-design/design-md/line/README.md +0 -12
  368. package/.opencode/oh-my-design/design-md/line/_research/home-1440px.png +0 -0
  369. package/.opencode/oh-my-design/design-md/line/_research.md +0 -65
  370. package/.opencode/oh-my-design/design-md/linear.app/.verification.md +0 -143
  371. package/.opencode/oh-my-design/design-md/linear.app/DESIGN.md +0 -642
  372. package/.opencode/oh-my-design/design-md/linear.app/README.md +0 -24
  373. package/.opencode/oh-my-design/design-md/linear.app/preview-dark.html +0 -383
  374. package/.opencode/oh-my-design/design-md/linear.app/preview.html +0 -373
  375. package/.opencode/oh-my-design/design-md/loom/.verification.md +0 -31
  376. package/.opencode/oh-my-design/design-md/loom/DESIGN.md +0 -396
  377. package/.opencode/oh-my-design/design-md/lovable/.verification.md +0 -154
  378. package/.opencode/oh-my-design/design-md/lovable/DESIGN.md +0 -423
  379. package/.opencode/oh-my-design/design-md/lovable/README.md +0 -24
  380. package/.opencode/oh-my-design/design-md/lovable/preview-dark.html +0 -349
  381. package/.opencode/oh-my-design/design-md/lovable/preview.html +0 -348
  382. package/.opencode/oh-my-design/design-md/lunit/DESIGN.md +0 -296
  383. package/.opencode/oh-my-design/design-md/lunit/assets/_reference/.live-inspect-proof.json +0 -249
  384. package/.opencode/oh-my-design/design-md/lunit/assets/_reference/fonts.json +0 -24
  385. package/.opencode/oh-my-design/design-md/lunit/assets/_reference/structure.json +0 -162
  386. package/.opencode/oh-my-design/design-md/lunit/assets/_reference/tokens.json +0 -115
  387. package/.opencode/oh-my-design/design-md/mastercard/.verification.md +0 -19
  388. package/.opencode/oh-my-design/design-md/mastercard/DESIGN.md +0 -587
  389. package/.opencode/oh-my-design/design-md/meituan/DESIGN.md +0 -466
  390. package/.opencode/oh-my-design/design-md/melon/.verification.md +0 -27
  391. package/.opencode/oh-my-design/design-md/melon/DESIGN.md +0 -179
  392. package/.opencode/oh-my-design/design-md/mercari/.verification.md +0 -155
  393. package/.opencode/oh-my-design/design-md/mercari/DESIGN.md +0 -514
  394. package/.opencode/oh-my-design/design-md/mercari/README.md +0 -12
  395. package/.opencode/oh-my-design/design-md/mercari/_research/home-1440px.png +0 -0
  396. package/.opencode/oh-my-design/design-md/mercari/_research.md +0 -137
  397. package/.opencode/oh-my-design/design-md/mercury/.verification.md +0 -21
  398. package/.opencode/oh-my-design/design-md/mercury/DESIGN.md +0 -589
  399. package/.opencode/oh-my-design/design-md/meta/.verification.md +0 -21
  400. package/.opencode/oh-my-design/design-md/meta/DESIGN.md +0 -615
  401. package/.opencode/oh-my-design/design-md/microsoft/.verification.md +0 -62
  402. package/.opencode/oh-my-design/design-md/microsoft/DESIGN.md +0 -508
  403. package/.opencode/oh-my-design/design-md/millie/DESIGN.md +0 -584
  404. package/.opencode/oh-my-design/design-md/minimax/.verification.md +0 -135
  405. package/.opencode/oh-my-design/design-md/minimax/DESIGN.md +0 -396
  406. package/.opencode/oh-my-design/design-md/minimax/README.md +0 -24
  407. package/.opencode/oh-my-design/design-md/minimax/preview-dark.html +0 -1262
  408. package/.opencode/oh-my-design/design-md/minimax/preview.html +0 -1248
  409. package/.opencode/oh-my-design/design-md/mintlify/.verification.md +0 -160
  410. package/.opencode/oh-my-design/design-md/mintlify/DESIGN.md +0 -472
  411. package/.opencode/oh-my-design/design-md/mintlify/README.md +0 -24
  412. package/.opencode/oh-my-design/design-md/mintlify/preview-dark.html +0 -409
  413. package/.opencode/oh-my-design/design-md/mintlify/preview.html +0 -398
  414. package/.opencode/oh-my-design/design-md/miricanvas/.verification.md +0 -61
  415. package/.opencode/oh-my-design/design-md/miricanvas/DESIGN.md +0 -464
  416. package/.opencode/oh-my-design/design-md/miro/.verification.md +0 -138
  417. package/.opencode/oh-my-design/design-md/miro/DESIGN.md +0 -319
  418. package/.opencode/oh-my-design/design-md/miro/README.md +0 -23
  419. package/.opencode/oh-my-design/design-md/miro/preview-dark.html +0 -174
  420. package/.opencode/oh-my-design/design-md/miro/preview.html +0 -173
  421. package/.opencode/oh-my-design/design-md/mistral.ai/.verification.md +0 -146
  422. package/.opencode/oh-my-design/design-md/mistral.ai/DESIGN.md +0 -390
  423. package/.opencode/oh-my-design/design-md/mistral.ai/README.md +0 -24
  424. package/.opencode/oh-my-design/design-md/mistral.ai/preview-dark.html +0 -806
  425. package/.opencode/oh-my-design/design-md/mistral.ai/preview.html +0 -805
  426. package/.opencode/oh-my-design/design-md/modusign/.verification.md +0 -58
  427. package/.opencode/oh-my-design/design-md/modusign/DESIGN.md +0 -524
  428. package/.opencode/oh-my-design/design-md/momoshop/.verification.md +0 -36
  429. package/.opencode/oh-my-design/design-md/momoshop/DESIGN.md +0 -322
  430. package/.opencode/oh-my-design/design-md/money-forward/DESIGN.md +0 -443
  431. package/.opencode/oh-my-design/design-md/mongodb/.verification.md +0 -145
  432. package/.opencode/oh-my-design/design-md/mongodb/DESIGN.md +0 -401
  433. package/.opencode/oh-my-design/design-md/mongodb/README.md +0 -23
  434. package/.opencode/oh-my-design/design-md/mongodb/preview-dark.html +0 -260
  435. package/.opencode/oh-my-design/design-md/mongodb/preview.html +0 -259
  436. package/.opencode/oh-my-design/design-md/muji/.verification.md +0 -20
  437. package/.opencode/oh-my-design/design-md/muji/DESIGN.md +0 -605
  438. package/.opencode/oh-my-design/design-md/musinsa/.verification.md +0 -59
  439. package/.opencode/oh-my-design/design-md/musinsa/DESIGN.md +0 -593
  440. package/.opencode/oh-my-design/design-md/mustit/.verification.md +0 -37
  441. package/.opencode/oh-my-design/design-md/mustit/DESIGN.md +0 -328
  442. package/.opencode/oh-my-design/design-md/myrealtrip/DESIGN.md +0 -494
  443. package/.opencode/oh-my-design/design-md/naver/.verification.md +0 -134
  444. package/.opencode/oh-my-design/design-md/naver/DESIGN.md +0 -582
  445. package/.opencode/oh-my-design/design-md/naverwebtoon/DESIGN.md +0 -477
  446. package/.opencode/oh-my-design/design-md/netflix/.verification.md +0 -21
  447. package/.opencode/oh-my-design/design-md/netflix/DESIGN.md +0 -572
  448. package/.opencode/oh-my-design/design-md/nexon/.verification.md +0 -27
  449. package/.opencode/oh-my-design/design-md/nexon/DESIGN.md +0 -389
  450. package/.opencode/oh-my-design/design-md/nhncloud/.verification.md +0 -23
  451. package/.opencode/oh-my-design/design-md/nhncloud/DESIGN.md +0 -207
  452. package/.opencode/oh-my-design/design-md/nike/.verification.md +0 -21
  453. package/.opencode/oh-my-design/design-md/nike/DESIGN.md +0 -588
  454. package/.opencode/oh-my-design/design-md/note/DESIGN.md +0 -346
  455. package/.opencode/oh-my-design/design-md/notion/.verification.md +0 -141
  456. package/.opencode/oh-my-design/design-md/notion/DESIGN.md +0 -557
  457. package/.opencode/oh-my-design/design-md/notion/README.md +0 -24
  458. package/.opencode/oh-my-design/design-md/notion/preview-dark.html +0 -372
  459. package/.opencode/oh-my-design/design-md/notion/preview.html +0 -364
  460. package/.opencode/oh-my-design/design-md/nvidia/.verification.md +0 -127
  461. package/.opencode/oh-my-design/design-md/nvidia/DESIGN.md +0 -550
  462. package/.opencode/oh-my-design/design-md/nvidia/README.md +0 -24
  463. package/.opencode/oh-my-design/design-md/nvidia/_research.md +0 -68
  464. package/.opencode/oh-my-design/design-md/nvidia/preview-dark.html +0 -374
  465. package/.opencode/oh-my-design/design-md/nvidia/preview.html +0 -366
  466. package/.opencode/oh-my-design/design-md/ohouse/.verification.md +0 -87
  467. package/.opencode/oh-my-design/design-md/ohouse/DESIGN.md +0 -635
  468. package/.opencode/oh-my-design/design-md/oliveyoung/DESIGN.md +0 -407
  469. package/.opencode/oh-my-design/design-md/oliveyoung/assets/_reference/.live-inspect-proof.json +0 -158
  470. package/.opencode/oh-my-design/design-md/oliveyoung/assets/_reference/_best_capture.json +0 -644
  471. package/.opencode/oh-my-design/design-md/oliveyoung/assets/_reference/_detail_capture.json +0 -447
  472. package/.opencode/oh-my-design/design-md/oliveyoung/assets/_reference/_main.html +0 -419
  473. package/.opencode/oh-my-design/design-md/oliveyoung/assets/_reference/_main_capture.json +0 -1126
  474. package/.opencode/oh-my-design/design-md/oliveyoung/assets/_reference/_search_capture.json +0 -912
  475. package/.opencode/oh-my-design/design-md/oliveyoung/assets/_reference/fonts.json +0 -20
  476. package/.opencode/oh-my-design/design-md/oliveyoung/assets/_reference/structure.json +0 -91
  477. package/.opencode/oh-my-design/design-md/oliveyoung/assets/_reference/tokens.json +0 -79
  478. package/.opencode/oh-my-design/design-md/ollama/.verification.md +0 -138
  479. package/.opencode/oh-my-design/design-md/ollama/DESIGN.md +0 -393
  480. package/.opencode/oh-my-design/design-md/ollama/README.md +0 -24
  481. package/.opencode/oh-my-design/design-md/ollama/preview-dark.html +0 -678
  482. package/.opencode/oh-my-design/design-md/ollama/preview.html +0 -678
  483. package/.opencode/oh-my-design/design-md/omnichat/.verification.md +0 -74
  484. package/.opencode/oh-my-design/design-md/omnichat/DESIGN.md +0 -499
  485. package/.opencode/oh-my-design/design-md/openai/.verification.md +0 -21
  486. package/.opencode/oh-my-design/design-md/openai/DESIGN.md +0 -641
  487. package/.opencode/oh-my-design/design-md/opencode.ai/.verification.md +0 -136
  488. package/.opencode/oh-my-design/design-md/opencode.ai/DESIGN.md +0 -425
  489. package/.opencode/oh-my-design/design-md/opencode.ai/README.md +0 -24
  490. package/.opencode/oh-my-design/design-md/opencode.ai/preview-dark.html +0 -366
  491. package/.opencode/oh-my-design/design-md/opencode.ai/preview.html +0 -357
  492. package/.opencode/oh-my-design/design-md/payco/.verification.md +0 -28
  493. package/.opencode/oh-my-design/design-md/payco/DESIGN.md +0 -267
  494. package/.opencode/oh-my-design/design-md/paypay/.verification.md +0 -21
  495. package/.opencode/oh-my-design/design-md/paypay/DESIGN.md +0 -656
  496. package/.opencode/oh-my-design/design-md/pchome/.verification.md +0 -38
  497. package/.opencode/oh-my-design/design-md/pchome/DESIGN.md +0 -439
  498. package/.opencode/oh-my-design/design-md/perplexity/.verification.md +0 -21
  499. package/.opencode/oh-my-design/design-md/perplexity/DESIGN.md +0 -546
  500. package/.opencode/oh-my-design/design-md/piccollage/.verification.md +0 -34
  501. package/.opencode/oh-my-design/design-md/piccollage/DESIGN.md +0 -320
  502. package/.opencode/oh-my-design/design-md/pinkoi/.verification.md +0 -147
  503. package/.opencode/oh-my-design/design-md/pinkoi/DESIGN.md +0 -639
  504. package/.opencode/oh-my-design/design-md/pinkoi/README.md +0 -12
  505. package/.opencode/oh-my-design/design-md/pinkoi/_research/browse-1440px.png +0 -0
  506. package/.opencode/oh-my-design/design-md/pinkoi/_research.md +0 -167
  507. package/.opencode/oh-my-design/design-md/pinterest/.verification.md +0 -141
  508. package/.opencode/oh-my-design/design-md/pinterest/DESIGN.md +0 -366
  509. package/.opencode/oh-my-design/design-md/pinterest/README.md +0 -23
  510. package/.opencode/oh-my-design/design-md/pinterest/preview-dark.html +0 -233
  511. package/.opencode/oh-my-design/design-md/pinterest/preview.html +0 -232
  512. package/.opencode/oh-my-design/design-md/pixiv/.verification.md +0 -20
  513. package/.opencode/oh-my-design/design-md/pixiv/DESIGN.md +0 -613
  514. package/.opencode/oh-my-design/design-md/pixnet/.verification.md +0 -31
  515. package/.opencode/oh-my-design/design-md/pixnet/DESIGN.md +0 -430
  516. package/.opencode/oh-my-design/design-md/posthog/.verification.md +0 -159
  517. package/.opencode/oh-my-design/design-md/posthog/DESIGN.md +0 -480
  518. package/.opencode/oh-my-design/design-md/posthog/README.md +0 -23
  519. package/.opencode/oh-my-design/design-md/posthog/preview-dark.html +0 -699
  520. package/.opencode/oh-my-design/design-md/posthog/preview.html +0 -749
  521. package/.opencode/oh-my-design/design-md/postype/.verification.md +0 -61
  522. package/.opencode/oh-my-design/design-md/postype/DESIGN.md +0 -431
  523. package/.opencode/oh-my-design/design-md/publy/DESIGN.md +0 -563
  524. package/.opencode/oh-my-design/design-md/qanda/.verification.md +0 -121
  525. package/.opencode/oh-my-design/design-md/qanda/DESIGN.md +0 -516
  526. package/.opencode/oh-my-design/design-md/ragic/.verification.md +0 -37
  527. package/.opencode/oh-my-design/design-md/ragic/DESIGN.md +0 -444
  528. package/.opencode/oh-my-design/design-md/rakuten/.verification.md +0 -60
  529. package/.opencode/oh-my-design/design-md/rakuten/DESIGN.md +0 -440
  530. package/.opencode/oh-my-design/design-md/ramp/.verification.md +0 -21
  531. package/.opencode/oh-my-design/design-md/ramp/DESIGN.md +0 -634
  532. package/.opencode/oh-my-design/design-md/rayark/.verification.md +0 -22
  533. package/.opencode/oh-my-design/design-md/rayark/DESIGN.md +0 -154
  534. package/.opencode/oh-my-design/design-md/raycast/.verification.md +0 -138
  535. package/.opencode/oh-my-design/design-md/raycast/DESIGN.md +0 -467
  536. package/.opencode/oh-my-design/design-md/raycast/README.md +0 -23
  537. package/.opencode/oh-my-design/design-md/raycast/preview-dark.html +0 -606
  538. package/.opencode/oh-my-design/design-md/raycast/preview.html +0 -688
  539. package/.opencode/oh-my-design/design-md/remember/.verification.md +0 -135
  540. package/.opencode/oh-my-design/design-md/remember/DESIGN.md +0 -504
  541. package/.opencode/oh-my-design/design-md/remember/_promo.json +0 -27
  542. package/.opencode/oh-my-design/design-md/remember/_research.md +0 -90
  543. package/.opencode/oh-my-design/design-md/renault/.verification.md +0 -139
  544. package/.opencode/oh-my-design/design-md/renault/DESIGN.md +0 -439
  545. package/.opencode/oh-my-design/design-md/renault/README.md +0 -23
  546. package/.opencode/oh-my-design/design-md/renault/preview-dark.html +0 -406
  547. package/.opencode/oh-my-design/design-md/renault/preview.html +0 -606
  548. package/.opencode/oh-my-design/design-md/replicate/.verification.md +0 -154
  549. package/.opencode/oh-my-design/design-md/replicate/DESIGN.md +0 -387
  550. package/.opencode/oh-my-design/design-md/replicate/README.md +0 -24
  551. package/.opencode/oh-my-design/design-md/replicate/preview-dark.html +0 -828
  552. package/.opencode/oh-my-design/design-md/replicate/preview.html +0 -831
  553. package/.opencode/oh-my-design/design-md/resend/.verification.md +0 -143
  554. package/.opencode/oh-my-design/design-md/resend/DESIGN.md +0 -440
  555. package/.opencode/oh-my-design/design-md/resend/README.md +0 -23
  556. package/.opencode/oh-my-design/design-md/resend/preview-dark.html +0 -355
  557. package/.opencode/oh-my-design/design-md/resend/preview.html +0 -354
  558. package/.opencode/oh-my-design/design-md/retool/.verification.md +0 -21
  559. package/.opencode/oh-my-design/design-md/retool/DESIGN.md +0 -645
  560. package/.opencode/oh-my-design/design-md/revolut/.verification.md +0 -140
  561. package/.opencode/oh-my-design/design-md/revolut/DESIGN.md +0 -319
  562. package/.opencode/oh-my-design/design-md/revolut/README.md +0 -23
  563. package/.opencode/oh-my-design/design-md/revolut/preview-dark.html +0 -234
  564. package/.opencode/oh-my-design/design-md/revolut/preview.html +0 -233
  565. package/.opencode/oh-my-design/design-md/richart/.verification.md +0 -41
  566. package/.opencode/oh-my-design/design-md/richart/DESIGN.md +0 -465
  567. package/.opencode/oh-my-design/design-md/ridi/.verification.md +0 -108
  568. package/.opencode/oh-my-design/design-md/ridi/DESIGN.md +0 -573
  569. package/.opencode/oh-my-design/design-md/riiid/.verification.md +0 -33
  570. package/.opencode/oh-my-design/design-md/riiid/DESIGN.md +0 -260
  571. package/.opencode/oh-my-design/design-md/ringle/.verification.md +0 -53
  572. package/.opencode/oh-my-design/design-md/ringle/DESIGN.md +0 -444
  573. package/.opencode/oh-my-design/design-md/robinhood/.verification.md +0 -21
  574. package/.opencode/oh-my-design/design-md/robinhood/DESIGN.md +0 -604
  575. package/.opencode/oh-my-design/design-md/runwayml/.verification.md +0 -141
  576. package/.opencode/oh-my-design/design-md/runwayml/DESIGN.md +0 -431
  577. package/.opencode/oh-my-design/design-md/runwayml/README.md +0 -24
  578. package/.opencode/oh-my-design/design-md/runwayml/preview-dark.html +0 -664
  579. package/.opencode/oh-my-design/design-md/runwayml/preview.html +0 -665
  580. package/.opencode/oh-my-design/design-md/salesforce/.verification.md +0 -66
  581. package/.opencode/oh-my-design/design-md/salesforce/DESIGN.md +0 -473
  582. package/.opencode/oh-my-design/design-md/sanity/.verification.md +0 -174
  583. package/.opencode/oh-my-design/design-md/sanity/DESIGN.md +0 -499
  584. package/.opencode/oh-my-design/design-md/sanity/README.md +0 -24
  585. package/.opencode/oh-my-design/design-md/sanity/preview-dark.html +0 -990
  586. package/.opencode/oh-my-design/design-md/sanity/preview.html +0 -1135
  587. package/.opencode/oh-my-design/design-md/sansan/.verification.md +0 -21
  588. package/.opencode/oh-my-design/design-md/sansan/DESIGN.md +0 -631
  589. package/.opencode/oh-my-design/design-md/sendbird/.verification.md +0 -67
  590. package/.opencode/oh-my-design/design-md/sendbird/DESIGN.md +0 -331
  591. package/.opencode/oh-my-design/design-md/sentry/.verification.md +0 -157
  592. package/.opencode/oh-my-design/design-md/sentry/DESIGN.md +0 -397
  593. package/.opencode/oh-my-design/design-md/sentry/README.md +0 -24
  594. package/.opencode/oh-my-design/design-md/sentry/preview-dark.html +0 -626
  595. package/.opencode/oh-my-design/design-md/sentry/preview.html +0 -951
  596. package/.opencode/oh-my-design/design-md/shinhancard/.verification.md +0 -31
  597. package/.opencode/oh-my-design/design-md/shinhancard/DESIGN.md +0 -421
  598. package/.opencode/oh-my-design/design-md/shopline/.verification.md +0 -34
  599. package/.opencode/oh-my-design/design-md/shopline/DESIGN.md +0 -431
  600. package/.opencode/oh-my-design/design-md/slack/.verification.md +0 -21
  601. package/.opencode/oh-my-design/design-md/slack/DESIGN.md +0 -635
  602. package/.opencode/oh-my-design/design-md/smarthr/DESIGN.md +0 -452
  603. package/.opencode/oh-my-design/design-md/smartnews/DESIGN.md +0 -360
  604. package/.opencode/oh-my-design/design-md/socar/DESIGN.md +0 -438
  605. package/.opencode/oh-my-design/design-md/socar/_promo.json +0 -28
  606. package/.opencode/oh-my-design/design-md/socar/_research.md +0 -55
  607. package/.opencode/oh-my-design/design-md/soomgo/.verification.md +0 -27
  608. package/.opencode/oh-my-design/design-md/soomgo/DESIGN.md +0 -326
  609. package/.opencode/oh-my-design/design-md/spacex/.verification.md +0 -132
  610. package/.opencode/oh-my-design/design-md/spacex/DESIGN.md +0 -415
  611. package/.opencode/oh-my-design/design-md/spacex/README.md +0 -23
  612. package/.opencode/oh-my-design/design-md/spacex/_research.md +0 -69
  613. package/.opencode/oh-my-design/design-md/spacex/preview-dark.html +0 -221
  614. package/.opencode/oh-my-design/design-md/spacex/preview.html +0 -220
  615. package/.opencode/oh-my-design/design-md/spoon/DESIGN.md +0 -492
  616. package/.opencode/oh-my-design/design-md/spotify/.verification.md +0 -128
  617. package/.opencode/oh-my-design/design-md/spotify/DESIGN.md +0 -489
  618. package/.opencode/oh-my-design/design-md/spotify/README.md +0 -23
  619. package/.opencode/oh-my-design/design-md/spotify/preview-dark.html +0 -231
  620. package/.opencode/oh-my-design/design-md/spotify/preview.html +0 -230
  621. package/.opencode/oh-my-design/design-md/starbucks/.verification.md +0 -21
  622. package/.opencode/oh-my-design/design-md/starbucks/DESIGN.md +0 -597
  623. package/.opencode/oh-my-design/design-md/stores/.verification.md +0 -61
  624. package/.opencode/oh-my-design/design-md/stores/DESIGN.md +0 -447
  625. package/.opencode/oh-my-design/design-md/stripe/.verification.md +0 -140
  626. package/.opencode/oh-my-design/design-md/stripe/DESIGN.md +0 -571
  627. package/.opencode/oh-my-design/design-md/stripe/README.md +0 -24
  628. package/.opencode/oh-my-design/design-md/stripe/preview-dark.html +0 -428
  629. package/.opencode/oh-my-design/design-md/stripe/preview.html +0 -419
  630. package/.opencode/oh-my-design/design-md/studio/.verification.md +0 -21
  631. package/.opencode/oh-my-design/design-md/studio/DESIGN.md +0 -602
  632. package/.opencode/oh-my-design/design-md/supabase/.verification.md +0 -145
  633. package/.opencode/oh-my-design/design-md/supabase/DESIGN.md +0 -389
  634. package/.opencode/oh-my-design/design-md/supabase/README.md +0 -24
  635. package/.opencode/oh-my-design/design-md/supabase/preview-dark.html +0 -977
  636. package/.opencode/oh-my-design/design-md/supabase/preview.html +0 -955
  637. package/.opencode/oh-my-design/design-md/superhuman/.verification.md +0 -184
  638. package/.opencode/oh-my-design/design-md/superhuman/DESIGN.md +0 -453
  639. package/.opencode/oh-my-design/design-md/superhuman/README.md +0 -23
  640. package/.opencode/oh-my-design/design-md/superhuman/preview-dark.html +0 -973
  641. package/.opencode/oh-my-design/design-md/superhuman/preview.html +0 -951
  642. package/.opencode/oh-my-design/design-md/surveycake/.verification.md +0 -31
  643. package/.opencode/oh-my-design/design-md/surveycake/DESIGN.md +0 -442
  644. package/.opencode/oh-my-design/design-md/tada/DESIGN.md +0 -579
  645. package/.opencode/oh-my-design/design-md/teamblind/.verification.md +0 -76
  646. package/.opencode/oh-my-design/design-md/teamblind/DESIGN.md +0 -497
  647. package/.opencode/oh-my-design/design-md/tesla/.verification.md +0 -149
  648. package/.opencode/oh-my-design/design-md/tesla/DESIGN.md +0 -501
  649. package/.opencode/oh-my-design/design-md/tesla/README.md +0 -23
  650. package/.opencode/oh-my-design/design-md/tesla/_research.md +0 -70
  651. package/.opencode/oh-my-design/design-md/tesla/preview-dark.html +0 -947
  652. package/.opencode/oh-my-design/design-md/tesla/preview.html +0 -925
  653. package/.opencode/oh-my-design/design-md/theverge/.verification.md +0 -21
  654. package/.opencode/oh-my-design/design-md/theverge/DESIGN.md +0 -500
  655. package/.opencode/oh-my-design/design-md/timee/.verification.md +0 -67
  656. package/.opencode/oh-my-design/design-md/timee/DESIGN.md +0 -444
  657. package/.opencode/oh-my-design/design-md/together.ai/.verification.md +0 -145
  658. package/.opencode/oh-my-design/design-md/together.ai/DESIGN.md +0 -389
  659. package/.opencode/oh-my-design/design-md/together.ai/README.md +0 -24
  660. package/.opencode/oh-my-design/design-md/together.ai/preview-dark.html +0 -892
  661. package/.opencode/oh-my-design/design-md/together.ai/preview.html +0 -897
  662. package/.opencode/oh-my-design/design-md/toss/.verification.md +0 -120
  663. package/.opencode/oh-my-design/design-md/toss/DESIGN.md +0 -698
  664. package/.opencode/oh-my-design/design-md/toss/README.md +0 -19
  665. package/.opencode/oh-my-design/design-md/toss-securities/DESIGN.md +0 -247
  666. package/.opencode/oh-my-design/design-md/toss-securities/assets/_reference/.live-inspect-proof.json +0 -126
  667. package/.opencode/oh-my-design/design-md/toss-securities/assets/_reference/.live-inspect-raw.json +0 -619
  668. package/.opencode/oh-my-design/design-md/toss-securities/assets/_reference/.live-inspect-stock.json +0 -525
  669. package/.opencode/oh-my-design/design-md/toss-securities/assets/_reference/fonts.json +0 -24
  670. package/.opencode/oh-my-design/design-md/toss-securities/assets/_reference/structure.json +0 -35
  671. package/.opencode/oh-my-design/design-md/toss-securities/assets/_reference/tokens.json +0 -87
  672. package/.opencode/oh-my-design/design-md/tossbank/DESIGN.md +0 -576
  673. package/.opencode/oh-my-design/design-md/trenbe/.verification.md +0 -32
  674. package/.opencode/oh-my-design/design-md/trenbe/DESIGN.md +0 -293
  675. package/.opencode/oh-my-design/design-md/triple/DESIGN.md +0 -481
  676. package/.opencode/oh-my-design/design-md/tumblbug/DESIGN.md +0 -578
  677. package/.opencode/oh-my-design/design-md/tving/DESIGN.md +0 -317
  678. package/.opencode/oh-my-design/design-md/tving/assets/_reference/.live-inspect-proof.json +0 -131
  679. package/.opencode/oh-my-design/design-md/tving/assets/_reference/LICENSE-NOTE.md +0 -37
  680. package/.opencode/oh-my-design/design-md/tving/assets/_reference/attribution.md +0 -52
  681. package/.opencode/oh-my-design/design-md/tving/assets/_reference/fonts.json +0 -31
  682. package/.opencode/oh-my-design/design-md/tving/assets/_reference/screenshots/hero-desktop.png +0 -0
  683. package/.opencode/oh-my-design/design-md/tving/assets/_reference/structure.json +0 -55
  684. package/.opencode/oh-my-design/design-md/tving/assets/_reference/tokens.json +0 -115
  685. package/.opencode/oh-my-design/design-md/uber/.verification.md +0 -128
  686. package/.opencode/oh-my-design/design-md/uber/DESIGN.md +0 -423
  687. package/.opencode/oh-my-design/design-md/uber/README.md +0 -24
  688. package/.opencode/oh-my-design/design-md/uber/preview-dark.html +0 -1120
  689. package/.opencode/oh-my-design/design-md/uber/preview.html +0 -1119
  690. package/.opencode/oh-my-design/design-md/ubie/.verification.md +0 -21
  691. package/.opencode/oh-my-design/design-md/ubie/DESIGN.md +0 -615
  692. package/.opencode/oh-my-design/design-md/uniqlo/.verification.md +0 -21
  693. package/.opencode/oh-my-design/design-md/uniqlo/DESIGN.md +0 -575
  694. package/.opencode/oh-my-design/design-md/upbit/DESIGN.md +0 -337
  695. package/.opencode/oh-my-design/design-md/upbit/_research.md +0 -83
  696. package/.opencode/oh-my-design/design-md/upbit/assets/_reference/.live-inspect-proof.json +0 -263
  697. package/.opencode/oh-my-design/design-md/upbit/assets/_reference/fonts.json +0 -18
  698. package/.opencode/oh-my-design/design-md/upbit/assets/_reference/raw-capture-exchange.json +0 -1901
  699. package/.opencode/oh-my-design/design-md/upbit/assets/_reference/raw-capture.json +0 -1121
  700. package/.opencode/oh-my-design/design-md/upbit/assets/_reference/structure.json +0 -52
  701. package/.opencode/oh-my-design/design-md/upbit/assets/_reference/tokens.json +0 -169
  702. package/.opencode/oh-my-design/design-md/upstage/DESIGN.md +0 -270
  703. package/.opencode/oh-my-design/design-md/upstage/assets/_reference/.live-inspect-proof.json +0 -157
  704. package/.opencode/oh-my-design/design-md/upstage/assets/_reference/_brand-resource-center.json +0 -44
  705. package/.opencode/oh-my-design/design-md/upstage/assets/_reference/_curated-samples.json +0 -310
  706. package/.opencode/oh-my-design/design-md/upstage/assets/_reference/_raw-capture.json +0 -1560
  707. package/.opencode/oh-my-design/design-md/upstage/assets/_reference/_root-vars.json +0 -76
  708. package/.opencode/oh-my-design/design-md/upstage/assets/_reference/_structure-raw.json +0 -298
  709. package/.opencode/oh-my-design/design-md/upstage/assets/_reference/fonts.json +0 -35
  710. package/.opencode/oh-my-design/design-md/upstage/assets/_reference/structure.json +0 -72
  711. package/.opencode/oh-my-design/design-md/upstage/assets/_reference/tokens.json +0 -183
  712. package/.opencode/oh-my-design/design-md/velog/.verification.md +0 -26
  713. package/.opencode/oh-my-design/design-md/velog/DESIGN.md +0 -196
  714. package/.opencode/oh-my-design/design-md/vercel/.verification.md +0 -134
  715. package/.opencode/oh-my-design/design-md/vercel/DESIGN.md +0 -523
  716. package/.opencode/oh-my-design/design-md/vercel/README.md +0 -24
  717. package/.opencode/oh-my-design/design-md/vercel/preview-dark.html +0 -368
  718. package/.opencode/oh-my-design/design-md/vercel/preview.html +0 -367
  719. package/.opencode/oh-my-design/design-md/voicetube/.verification.md +0 -34
  720. package/.opencode/oh-my-design/design-md/voicetube/DESIGN.md +0 -266
  721. package/.opencode/oh-my-design/design-md/voltagent/.verification.md +0 -159
  722. package/.opencode/oh-my-design/design-md/voltagent/DESIGN.md +0 -454
  723. package/.opencode/oh-my-design/design-md/voltagent/README.md +0 -24
  724. package/.opencode/oh-my-design/design-md/voltagent/preview-dark.html +0 -487
  725. package/.opencode/oh-my-design/design-md/voltagent/preview.html +0 -766
  726. package/.opencode/oh-my-design/design-md/wadiz/DESIGN.md +0 -415
  727. package/.opencode/oh-my-design/design-md/wadiz/assets/_reference/.live-inspect-proof.json +0 -137
  728. package/.opencode/oh-my-design/design-md/wadiz/assets/_reference/fonts.json +0 -17
  729. package/.opencode/oh-my-design/design-md/wadiz/assets/_reference/structure.json +0 -35
  730. package/.opencode/oh-my-design/design-md/wadiz/assets/_reference/tokens.json +0 -80
  731. package/.opencode/oh-my-design/design-md/wanted/DESIGN.md +0 -575
  732. package/.opencode/oh-my-design/design-md/wanted/_promo.json +0 -31
  733. package/.opencode/oh-my-design/design-md/wanted/_research.md +0 -119
  734. package/.opencode/oh-my-design/design-md/wantedly/.verification.md +0 -53
  735. package/.opencode/oh-my-design/design-md/wantedly/DESIGN.md +0 -437
  736. package/.opencode/oh-my-design/design-md/warp/.verification.md +0 -156
  737. package/.opencode/oh-my-design/design-md/warp/DESIGN.md +0 -431
  738. package/.opencode/oh-my-design/design-md/warp/README.md +0 -23
  739. package/.opencode/oh-my-design/design-md/warp/preview-dark.html +0 -500
  740. package/.opencode/oh-my-design/design-md/warp/preview.html +0 -533
  741. package/.opencode/oh-my-design/design-md/watcha/DESIGN.md +0 -465
  742. package/.opencode/oh-my-design/design-md/wavve/DESIGN.md +0 -480
  743. package/.opencode/oh-my-design/design-md/wconcept/DESIGN.md +0 -556
  744. package/.opencode/oh-my-design/design-md/webflow/.verification.md +0 -151
  745. package/.opencode/oh-my-design/design-md/webflow/DESIGN.md +0 -330
  746. package/.opencode/oh-my-design/design-md/webflow/README.md +0 -23
  747. package/.opencode/oh-my-design/design-md/webflow/preview-dark.html +0 -147
  748. package/.opencode/oh-my-design/design-md/webflow/preview.html +0 -146
  749. package/.opencode/oh-my-design/design-md/wired/.verification.md +0 -21
  750. package/.opencode/oh-my-design/design-md/wired/DESIGN.md +0 -572
  751. package/.opencode/oh-my-design/design-md/wise/.verification.md +0 -141
  752. package/.opencode/oh-my-design/design-md/wise/DESIGN.md +0 -317
  753. package/.opencode/oh-my-design/design-md/wise/README.md +0 -23
  754. package/.opencode/oh-my-design/design-md/wise/preview-dark.html +0 -230
  755. package/.opencode/oh-my-design/design-md/wise/preview.html +0 -229
  756. package/.opencode/oh-my-design/design-md/x.ai/.verification.md +0 -140
  757. package/.opencode/oh-my-design/design-md/x.ai/DESIGN.md +0 -397
  758. package/.opencode/oh-my-design/design-md/x.ai/README.md +0 -24
  759. package/.opencode/oh-my-design/design-md/x.ai/preview-dark.html +0 -356
  760. package/.opencode/oh-my-design/design-md/x.ai/preview.html +0 -407
  761. package/.opencode/oh-my-design/design-md/xiaohongshu/DESIGN.md +0 -462
  762. package/.opencode/oh-my-design/design-md/yanolja/.verification.md +0 -83
  763. package/.opencode/oh-my-design/design-md/yanolja/DESIGN.md +0 -508
  764. package/.opencode/oh-my-design/design-md/yeogiotte/.verification.md +0 -210
  765. package/.opencode/oh-my-design/design-md/yeogiotte/DESIGN.md +0 -500
  766. package/.opencode/oh-my-design/design-md/yogiyo/DESIGN.md +0 -515
  767. package/.opencode/oh-my-design/design-md/yourator/.verification.md +0 -39
  768. package/.opencode/oh-my-design/design-md/yourator/DESIGN.md +0 -453
  769. package/.opencode/oh-my-design/design-md/zapier/.verification.md +0 -156
  770. package/.opencode/oh-my-design/design-md/zapier/DESIGN.md +0 -474
  771. package/.opencode/oh-my-design/design-md/zapier/README.md +0 -24
  772. package/.opencode/oh-my-design/design-md/zapier/preview-dark.html +0 -380
  773. package/.opencode/oh-my-design/design-md/zapier/preview.html +0 -372
  774. package/.opencode/oh-my-design/design-md/zigbang/DESIGN.md +0 -500
  775. package/.opencode/oh-my-design/design-md/zigbang/_promo.json +0 -16
  776. package/.opencode/oh-my-design/design-md/zigbang/_research.md +0 -101
  777. package/.opencode/oh-my-design/design-md/zigzag/DESIGN.md +0 -695
  778. package/.opencode/oh-my-design/design-md/zigzag/_promo.json +0 -23
  779. package/.opencode/oh-my-design/design-md/zigzag/_research.md +0 -64
  780. package/.opencode/oh-my-design/design-md/zozotown/.verification.md +0 -20
  781. package/.opencode/oh-my-design/design-md/zozotown/DESIGN.md +0 -578
  782. package/.opencode/oh-my-design/packages/mcp/dist/index.mjs +0 -21685
  783. package/.opencode/oh-my-design/packages/mcp/dist/index.mjs.map +0 -1
  784. package/.opencode/tools/akash_catalog.ts +0 -596
  785. package/.opencode/tools/extract-design-pattern.py +0 -182
  786. package/.opencode/tools/sdd_design.ts +0 -303
@@ -0,0 +1,1040 @@
1
+ import { tool } from "@opencode-ai/plugin"
2
+ import fs from "fs"
3
+ import path from "path"
4
+
5
+ // ============================================================================
6
+ // SDD Catalog Tool - Multi-Registry shadcn Block/Component Browser
7
+ // ============================================================================
8
+ //
9
+ // Catalogo unificado de bloques y componentes para shadcn UI. Indexa y
10
+ // resuelve items de multiples registries externos con cache local:
11
+ //
12
+ // - shadcn: https://shadcnui-blocks.com (akash3444/shadcn-ui-blocks)
13
+ // Componentes y bloques Radix-curados por Akash (TTL 7d).
14
+ // Fuente: GitHub Contents API sobre /public/r/radix.
15
+ // - basecn: https://basecn.dev (akash3444/basecn)
16
+ // Fork Base UI de los mismos bloques (TTL 7d).
17
+ // Fuente: GitHub Contents API sobre /public/r/basecn.
18
+ // - reactbits: https://reactbits.dev (David Haz)
19
+ // 134 primitivas animadas x 4 variantes (JS-CSS / JS-TW /
20
+ // TS-CSS / TS-TW) = 536 items. Fuente: /r/registry.json
21
+ // oficial shadcn-compatible. Default variant para el stack
22
+ // Next.js 16 + Tailwind v4 es TS-TW. TTL 1d.
23
+ //
24
+ // Cache local:
25
+ // - .openspec/cache/shadcn-index.json
26
+ // - .openspec/cache/basecn-index.json
27
+ // - .openspec/cache/reactbits-index.json
28
+ // - .openspec/cache/blocks/<registry>/[<author>/]<name>.json
29
+ //
30
+ // Registries configurables via env:
31
+ // - SDD_CATALOG_TTL_DAYS_AKASH (default 7)
32
+ // - SDD_CATALOG_TTL_DAYS_BASECN (default 7)
33
+ // - SDD_CATALOG_TTL_DAYS_REACTBITS (default 1)
34
+ //
35
+ // Tools exportadas (prefijo opencode = "sdd_catalog_<export>"):
36
+ // - list_blocks Lista componentes/bloques por registry, categoria, query.
37
+ // - get_block Obtiene codigo fuente + dependencias + install_command.
38
+ // - warm_index Pre-calienta los indices locales (idempotente, TTL-aware).
39
+ //
40
+ // Naming del parametro `name` para get_block:
41
+ // - shadcn/basecn: "hero-06", "sidebar-07", etc.
42
+ // - reactbits: "Dither" (base, resuelve a Dither-TS-TW por default)
43
+ // "Dither-JS-CSS" (variante canonica completa)
44
+ // "https://reactbits.dev/r/Dither-TS-TW.json" (URL directa)
45
+ // ============================================================================
46
+
47
+ // ---------------------------------------------------------------------------
48
+ // Akash (shadcn-ui-blocks)
49
+ // ---------------------------------------------------------------------------
50
+ const AKASH_REPO = "akash3444/shadcn-ui-blocks"
51
+ const AKASH_API = `https://api.github.com/repos/${AKASH_REPO}/contents/public/r/radix`
52
+ const AKASH_RAW = (name: string) =>
53
+ `https://raw.githubusercontent.com/${AKASH_REPO}/main/public/r/radix/${name}.json`
54
+ const AKASH_INSTALL = (name: string) =>
55
+ `https://shadcnui-blocks.com/r/radix/${name}.json`
56
+ const AKASH_TTL_DAYS = Number(process.env.SDD_CATALOG_TTL_DAYS_AKASH || 7)
57
+
58
+ // ---------------------------------------------------------------------------
59
+ // Basecn (akash3444/basecn)
60
+ // ---------------------------------------------------------------------------
61
+ const BASECN_REPO = "akash3444/basecn"
62
+ const BASECN_API = `https://api.github.com/repos/${BASECN_REPO}/contents/public/r`
63
+ const BASECN_RAW = (name: string) =>
64
+ `https://raw.githubusercontent.com/${BASECN_REPO}/main/public/r/${name}.json`
65
+ const BASECN_INSTALL = (name: string) =>
66
+ `https://basecn.dev/r/${name}.json`
67
+ const BASECN_TTL_DAYS = Number(process.env.SDD_CATALOG_TTL_DAYS_BASECN || 7)
68
+
69
+ // ---------------------------------------------------------------------------
70
+ // reactbits.dev (David Haz)
71
+ // ---------------------------------------------------------------------------
72
+ const REACTBITS_HOME = "https://reactbits.dev"
73
+ const REACTBITS_CATALOG = "https://reactbits.dev/r/registry.json"
74
+ const REACTBITS_RAW = (name: string) => `${REACTBITS_HOME}/r/${name}.json`
75
+ const REACTBITS_INSTALL = (name: string) => `${REACTBITS_HOME}/r/${name}.json`
76
+ const REACTBITS_PREVIEW = (baseName: string) => `${REACTBITS_HOME}/${baseName}`
77
+ const REACTBITS_TTL_DAYS = Number(process.env.SDD_CATALOG_TTL_DAYS_REACTBITS || 1)
78
+
79
+ // Las 4 variantes que reactbits publica por cada componente base.
80
+ const REACTBITS_VARIANTS = ["JS-CSS", "JS-TW", "TS-CSS", "TS-TW"] as const
81
+ type ReactBitsVariant = (typeof REACTBITS_VARIANTS)[number]
82
+ const DEFAULT_REACTBITS_VARIANT: ReactBitsVariant = "TS-TW"
83
+
84
+ // Sufijos reconocibles al final de un name canónico de reactbits
85
+ const REACTBITS_VARIANT_SUFFIX_RE = /-(JS-CSS|JS-TW|TS-CSS|TS-TW)$/
86
+
87
+ // Mapa curado de las bases mas populares de reactbits.dev organizadas por
88
+ // categoria de uso. La categoria se infiere por membership; si la base no
89
+ // esta en el mapa, cae en "misc" pero el query/substring sigue funcionando.
90
+ const REACTBITS_POPULAR_BY_CATEGORY: Record<string, string[]> = {
91
+ backgrounds: [
92
+ "Aurora", "Beams", "ColorBends", "DarkVeil", "Dither", "FlickeringGrid",
93
+ "GradualBlur", "GridDistortion", "GridMotion", "Hyperspeed", "Iridescence",
94
+ "LightRays", "Lightning", "LiquidChrome", "MetaBalls", "Noise", "Orb",
95
+ "Particles", "PixelSnow", "Silk", "Squares", "StarField", "Strands",
96
+ "Threads", "Vortex", "Waves"
97
+ ],
98
+ text: [
99
+ "ASCIIText", "BlurText", "CircularText", "CountUp", "Counter", "CurvedLoop",
100
+ "DecryptedText", "FuzzyText", "GlitchText", "GradientText", "RotatingText",
101
+ "ScrambledText", "ShinyText", "TextPressure", "TextTrail", "Typewriter"
102
+ ],
103
+ cards: [
104
+ "BounceCards", "CardSwap", "DecayCard", "DraggableCard", "ExpandingCards",
105
+ "FlipCard", "FluidGlass", "GlareHover", "HoloCard", "MagicBento",
106
+ "Masonry", "SpotlightCard", "Stack", "TiltedCard"
107
+ ],
108
+ navigation: [
109
+ "BubbleMenu", "CardNav", "FloatingDock", "FluidMenu", "GooeyNav",
110
+ "MagnetLines", "PillNav", "StaggeredMenu", "Stepper"
111
+ ],
112
+ buttons: [
113
+ "BounceButton", "ClickSpark", "MagneticButton", "RainbowButton", "StarBorder"
114
+ ],
115
+ animations: [
116
+ "AnimatedContent", "AnimatedList", "AnimatedPin", "FadeContent",
117
+ "ScrollFloat", "ScrollReveal", "TrueFocus", "VariableProximity"
118
+ ],
119
+ cursors: [
120
+ "BlobCursor", "Crosshair", "GhostCursor", "ImageTrail",
121
+ "PixelTrail", "SplashCursor", "TextCursor"
122
+ ],
123
+ misc: [
124
+ "Antigravity", "Balatro", "Ballpit", "ChromaGrid", "CircularGallery",
125
+ "ElectricBorder", "Magnet", "MetallicPaint", "ShapeBlur", "StickerPeel"
126
+ ]
127
+ }
128
+
129
+ // Construye el mapa inverso: base name -> categoria
130
+ const REACTBITS_CATEGORY_BY_BASE: Map<string, string> = (() => {
131
+ const map = new Map<string, string>()
132
+ for (const [cat, bases] of Object.entries(REACTBITS_POPULAR_BY_CATEGORY)) {
133
+ for (const base of bases) map.set(base, cat)
134
+ }
135
+ return map
136
+ })()
137
+
138
+ // ---------------------------------------------------------------------------
139
+ // Categorias (heuristica por nombre de archivo para Akash/Basecn)
140
+ // ---------------------------------------------------------------------------
141
+ const CATEGORY_PREFIXES = [
142
+ "hero", "footer", "pricing", "features", "faq", "testimonials",
143
+ "cta", "navbar", "stats", "logo-cloud", "blog", "contact",
144
+ "team", "about", "gallery", "login", "signup", "forgot-password",
145
+ "otp", "chart", "sidebar", "dashboard", "table", "calendar",
146
+ "accordion", "alert", "avatar", "badge", "button", "card", "checkbox",
147
+ "combobox", "command", "date-picker", "dialog", "drawer", "dropdown-menu",
148
+ "input", "kbd", "menubar", "pagination", "popover", "progress",
149
+ "radio-group", "scroll-area", "select", "separator", "sheet", "skeleton",
150
+ "slider", "sonner", "switch", "tabs", "textarea", "toast", "toggle",
151
+ "tooltip", "carousel", "marquee", "bento", "integration", "comparison",
152
+ "how-it-works", "use-cases", "changelog", "cookie-banner", "newsletter"
153
+ ]
154
+
155
+ // ============================================================================
156
+ // Helpers
157
+ // ============================================================================
158
+
159
+ type RegistryName = "shadcn" | "basecn" | "reactbits"
160
+
161
+ const getRoot = (context: any): string => {
162
+ if (context?.directory && context.directory !== "/") return context.directory
163
+ if (context?.worktree && context.worktree !== "/") return context.worktree
164
+ if (context?.cwd && context.directory !== "/") return context.directory
165
+ return process.cwd()
166
+ }
167
+
168
+ const getCacheDir = (root: string) => path.resolve(root, ".openspec/cache")
169
+ const getBlocksDir = (root: string, registry: RegistryName, subdir?: string) =>
170
+ subdir
171
+ ? path.resolve(getCacheDir(root), "blocks", registry, subdir)
172
+ : path.resolve(getCacheDir(root), "blocks", registry)
173
+ const getIndexPath = (root: string, registry: RegistryName) =>
174
+ path.resolve(getCacheDir(root), `${registry}-index.json`)
175
+
176
+ const ensureDir = (dir: string) => {
177
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })
178
+ }
179
+
180
+ const inferCategory = (filename: string): string => {
181
+ const stem = filename.replace(/\.json$/, "")
182
+ for (const prefix of CATEGORY_PREFIXES) {
183
+ if (stem === prefix || stem.startsWith(`${prefix}-`)) return prefix
184
+ }
185
+ return "misc"
186
+ }
187
+
188
+ const ttlMs = (days: number) => days * 24 * 60 * 60 * 1000
189
+
190
+ // ---------------------------------------------------------------------------
191
+ // Tipos
192
+ // ---------------------------------------------------------------------------
193
+
194
+ type IndexEntry = {
195
+ name: string
196
+ base_name?: string
197
+ filename?: string
198
+ category: string
199
+ registry: RegistryName
200
+ author?: string
201
+ description?: string
202
+ tags?: string[]
203
+ variants?: string[]
204
+ default_variant?: string
205
+ size?: number
206
+ sha?: string
207
+ raw_url?: string
208
+ install_url: string
209
+ install_url_template?: string
210
+ preview_url?: string
211
+ source?: "github" | "registry_json" | "curated"
212
+ }
213
+
214
+ type Index = {
215
+ cached_at: string
216
+ ttl_days: number
217
+ source: string
218
+ total: number
219
+ entries: IndexEntry[]
220
+ }
221
+
222
+ const writeJson = (filePath: string, data: unknown) => {
223
+ ensureDir(path.dirname(filePath))
224
+ const tmp = `${filePath}.tmp`
225
+ fs.writeFileSync(tmp, JSON.stringify(data, null, 2), "utf8")
226
+ fs.renameSync(tmp, filePath)
227
+ }
228
+
229
+ const readJson = <T>(filePath: string): T | null => {
230
+ try {
231
+ if (fs.existsSync(filePath)) {
232
+ return JSON.parse(fs.readFileSync(filePath, "utf8")) as T
233
+ }
234
+ } catch (e) {
235
+ // ignore corrupt cache; will rebuild
236
+ }
237
+ return null
238
+ }
239
+
240
+ const isCacheStale = (index: Index | null, ttl: number): boolean => {
241
+ if (!index) return true
242
+ const cached = new Date(index.cached_at).getTime()
243
+ if (Number.isNaN(cached)) return true
244
+ return Date.now() - cached > ttl
245
+ }
246
+
247
+ // ---------------------------------------------------------------------------
248
+ // GitHub API fetchers (Akash + Basecn)
249
+ // ---------------------------------------------------------------------------
250
+
251
+ const fetchGithubTree = async (
252
+ apiUrl: string,
253
+ repoLabel: string
254
+ ): Promise<IndexEntry[]> => {
255
+ const res = await fetch(apiUrl, {
256
+ headers: {
257
+ "User-Agent": "zugzbot-sdd-catalog/1.0",
258
+ Accept: "application/vnd.github+json"
259
+ }
260
+ })
261
+
262
+ if (!res.ok) {
263
+ if (res.status === 403) {
264
+ throw new Error(
265
+ `GitHub API rate limit hit consultando ${repoLabel}. ` +
266
+ `Espera 1h o usa force_refresh=false con cache existente.`
267
+ )
268
+ }
269
+ if (res.status === 404) {
270
+ throw new Error(
271
+ `Repositorio ${repoLabel} no encontrado o ruta cambiada. ` +
272
+ `Verifica que ${apiUrl} siga vigente.`
273
+ )
274
+ }
275
+ throw new Error(`GitHub API ${res.status} ${res.statusText} consultando ${repoLabel}`)
276
+ }
277
+
278
+ const arr = (await res.json()) as Array<{
279
+ name: string
280
+ size: number
281
+ sha: string
282
+ download_url: string
283
+ }>
284
+
285
+ const registry: RegistryName = repoLabel.includes("basecn") ? "basecn" : "shadcn"
286
+
287
+ return arr
288
+ .filter((f) => f.name.endsWith(".json") && !f.name.startsWith("_"))
289
+ .map((f) => {
290
+ const filename = f.name
291
+ const name = filename.replace(/\.json$/, "")
292
+ const installUrl =
293
+ registry === "basecn" ? BASECN_INSTALL(name) : AKASH_INSTALL(name)
294
+ return {
295
+ name,
296
+ filename,
297
+ category: inferCategory(filename),
298
+ registry,
299
+ size: f.size,
300
+ sha: f.sha,
301
+ raw_url: undefined,
302
+ install_url: installUrl,
303
+ preview_url: registry === "basecn"
304
+ ? `https://basecn.dev/blocks/${name}`
305
+ : `https://shadcnui-blocks.com/blocks/${name}`,
306
+ source: "github" as const
307
+ }
308
+ })
309
+ }
310
+
311
+ const buildOrLoadIndex = async (
312
+ root: string,
313
+ registry: "shadcn" | "basecn",
314
+ forceRefresh: boolean
315
+ ): Promise<{ index: Index; refreshed: boolean; error?: string }> => {
316
+ const indexPath = getIndexPath(root, registry)
317
+ const apiUrl = registry === "basecn" ? BASECN_API : AKASH_API
318
+ const repoLabel = registry === "basecn" ? BASECN_REPO : AKASH_REPO
319
+ const ttl = registry === "basecn" ? ttlMs(BASECN_TTL_DAYS) : ttlMs(AKASH_TTL_DAYS)
320
+
321
+ const cached = readJson<Index>(indexPath)
322
+ if (!forceRefresh && !isCacheStale(cached, ttl)) {
323
+ return { index: cached!, refreshed: false }
324
+ }
325
+
326
+ try {
327
+ const entries = await fetchGithubTree(apiUrl, repoLabel)
328
+ const index: Index = {
329
+ cached_at: new Date().toISOString(),
330
+ ttl_days: registry === "basecn" ? BASECN_TTL_DAYS : AKASH_TTL_DAYS,
331
+ source: repoLabel,
332
+ total: entries.length,
333
+ entries
334
+ }
335
+ writeJson(indexPath, index)
336
+ return { index, refreshed: true }
337
+ } catch (e) {
338
+ if (cached) {
339
+ return {
340
+ index: cached,
341
+ refreshed: false,
342
+ error: `Refresh fallo (${(e as Error).message}); usando cache de ${cached.cached_at}`
343
+ }
344
+ }
345
+ throw e
346
+ }
347
+ }
348
+
349
+ // ---------------------------------------------------------------------------
350
+ // reactbits.dev registry.json loader
351
+ // ---------------------------------------------------------------------------
352
+
353
+ type ReactBitsRegistryItem = {
354
+ name: string
355
+ title?: string
356
+ description?: string
357
+ type?: string
358
+ dependencies?: string[]
359
+ registryDependencies?: string[]
360
+ files?: Array<{ type?: string; path?: string; content?: string }>
361
+ }
362
+
363
+ type ReactBitsCatalog = {
364
+ $schema?: string
365
+ name?: string
366
+ homepage?: string
367
+ items?: ReactBitsRegistryItem[]
368
+ }
369
+
370
+ const stripVariantSuffix = (name: string): { base: string; variant: ReactBitsVariant | null } => {
371
+ const m = name.match(REACTBITS_VARIANT_SUFFIX_RE)
372
+ if (m) {
373
+ return { base: name.slice(0, m[0].length * -1), variant: m[1] as ReactBitsVariant }
374
+ }
375
+ return { base: name, variant: null }
376
+ }
377
+
378
+ const inferReactbitsCategory = (base: string): string => {
379
+ return REACTBITS_CATEGORY_BY_BASE.get(base) || "misc"
380
+ }
381
+
382
+ const fetchReactbitsCatalog = async (): Promise<ReactBitsCatalog> => {
383
+ const res = await fetch(REACTBITS_CATALOG, {
384
+ headers: {
385
+ "User-Agent": "zugzbot-sdd-catalog/1.0",
386
+ Accept: "application/json"
387
+ }
388
+ })
389
+ if (!res.ok) {
390
+ throw new Error(`Fetch ${res.status} ${res.statusText} -> ${REACTBITS_CATALOG}`)
391
+ }
392
+ const text = await res.text()
393
+ try {
394
+ return JSON.parse(text) as ReactBitsCatalog
395
+ } catch (e) {
396
+ throw new Error(`No se pudo parsear catalog de reactbits: ${(e as Error).message}`)
397
+ }
398
+ }
399
+
400
+ const buildReactbitsIndex = async (
401
+ root: string,
402
+ forceRefresh: boolean
403
+ ): Promise<{ index: Index; refreshed: boolean; error?: string }> => {
404
+ const indexPath = getIndexPath(root, "reactbits")
405
+ const ttl = ttlMs(REACTBITS_TTL_DAYS)
406
+
407
+ const cached = readJson<Index>(indexPath)
408
+ if (!forceRefresh && !isCacheStale(cached, ttl)) {
409
+ return { index: cached!, refreshed: false }
410
+ }
411
+
412
+ try {
413
+ const catalog = await fetchReactbitsCatalog()
414
+ const items = catalog.items || []
415
+
416
+ // Agrupar items por base. Cada base tiene hasta 4 entradas (variantes).
417
+ const byBase = new Map<string, ReactBitsRegistryItem[]>()
418
+ for (const it of items) {
419
+ const { base } = stripVariantSuffix(it.name)
420
+ if (!byBase.has(base)) byBase.set(base, [])
421
+ byBase.get(base)!.push(it)
422
+ }
423
+
424
+ const entries: IndexEntry[] = []
425
+ for (const [base, variants] of byBase.entries()) {
426
+ const variantsAvailable = variants
427
+ .map((v) => stripVariantSuffix(v.name).variant)
428
+ .filter((v): v is ReactBitsVariant => !!v)
429
+ const first = variants[0]
430
+ const description = first.description || first.title || ""
431
+ const category = inferReactbitsCategory(base)
432
+ const deps = Array.from(
433
+ new Set(
434
+ variants.flatMap((v) =>
435
+ Array.isArray(v.dependencies) ? v.dependencies : []
436
+ )
437
+ )
438
+ )
439
+
440
+ entries.push({
441
+ name: base,
442
+ base_name: base,
443
+ filename: `${base}-${DEFAULT_REACTBITS_VARIANT}.json`,
444
+ category,
445
+ registry: "reactbits",
446
+ description,
447
+ tags: [category, "animated", "reactbits"].concat(deps.slice(0, 3)),
448
+ variants: variantsAvailable,
449
+ default_variant: DEFAULT_REACTBITS_VARIANT,
450
+ install_url: REACTBITS_INSTALL(`${base}-${DEFAULT_REACTBITS_VARIANT}`),
451
+ install_url_template: `https://reactbits.dev/r/${base}-{variant}.json`,
452
+ preview_url: REACTBITS_PREVIEW(base),
453
+ source: "registry_json"
454
+ })
455
+ }
456
+
457
+ // Orden alfabetico para mejor UX
458
+ entries.sort((a, b) => a.name.localeCompare(b.name))
459
+
460
+ const index: Index = {
461
+ cached_at: new Date().toISOString(),
462
+ ttl_days: REACTBITS_TTL_DAYS,
463
+ source: REACTBITS_CATALOG,
464
+ total: entries.length,
465
+ entries
466
+ }
467
+ writeJson(indexPath, index)
468
+ return { index, refreshed: true }
469
+ } catch (e) {
470
+ if (cached) {
471
+ return {
472
+ index: cached,
473
+ refreshed: false,
474
+ error: `Refresh fallo (${(e as Error).message}); usando cache de ${cached.cached_at}`
475
+ }
476
+ }
477
+ throw e
478
+ }
479
+ }
480
+
481
+ // Resuelve el slug canonico final para reactbits.
482
+ // Acepta:
483
+ // - "Dither" + variant "TS-TW" (default) => "Dither-TS-TW"
484
+ // - "Dither-JS-CSS" (canonica completa) => "Dither-JS-CSS"
485
+ // - "Dither" sin variant => "Dither-TS-TW"
486
+ const resolveReactbitsSlug = (
487
+ input: string,
488
+ variantArg?: string
489
+ ): { canonicalName: string; baseName: string; variant: ReactBitsVariant } => {
490
+ const trimmed = input.trim()
491
+ const suffixMatch = trimmed.match(REACTBITS_VARIANT_SUFFIX_RE)
492
+ if (suffixMatch) {
493
+ const variant = suffixMatch[1] as ReactBitsVariant
494
+ const base = trimmed.slice(0, suffixMatch[0].length * -1)
495
+ return { canonicalName: `${base}-${variant}`, baseName: base, variant }
496
+ }
497
+ const requestedVariant = (variantArg || DEFAULT_REACTBITS_VARIANT) as ReactBitsVariant
498
+ const safeVariant: ReactBitsVariant = REACTBITS_VARIANTS.includes(requestedVariant)
499
+ ? requestedVariant
500
+ : DEFAULT_REACTBITS_VARIANT
501
+ return {
502
+ canonicalName: `${trimmed}-${safeVariant}`,
503
+ baseName: trimmed,
504
+ variant: safeVariant
505
+ }
506
+ }
507
+
508
+ // ---------------------------------------------------------------------------
509
+ // Fetchers compartidos
510
+ // ---------------------------------------------------------------------------
511
+
512
+ const fetchRaw = async (url: string, acceptJson = false): Promise<string> => {
513
+ const res = await fetch(url, {
514
+ headers: {
515
+ "User-Agent": "zugzbot-sdd-catalog/1.0",
516
+ ...(acceptJson ? { Accept: "application/json" } : {})
517
+ }
518
+ })
519
+ if (!res.ok) {
520
+ throw new Error(`Fetch ${res.status} ${res.statusText} -> ${url}`)
521
+ }
522
+ return await res.text()
523
+ }
524
+
525
+ const tryParseBlockJson = (raw: string): any => {
526
+ const trimmed = raw.trim()
527
+ try {
528
+ return JSON.parse(trimmed)
529
+ } catch {
530
+ try {
531
+ return JSON.parse(JSON.parse(trimmed))
532
+ } catch {
533
+ throw new Error(`No se pudo parsear JSON del bloque`)
534
+ }
535
+ }
536
+ }
537
+
538
+ const normalizeBlock = (parsed: any, registry: RegistryName, name: string) => {
539
+ const files: Array<{
540
+ path: string
541
+ type: string
542
+ target?: string
543
+ content?: string
544
+ }> = []
545
+
546
+ const deps: string[] = []
547
+ let installUrl: string
548
+
549
+ if (registry === "reactbits") {
550
+ installUrl = REACTBITS_INSTALL(name)
551
+ } else if (registry === "basecn") {
552
+ installUrl = BASECN_INSTALL(name)
553
+ } else {
554
+ installUrl = AKASH_INSTALL(name)
555
+ }
556
+
557
+ if (Array.isArray(parsed?.files)) {
558
+ for (const f of parsed.files) {
559
+ files.push({
560
+ path: f.path || f.name || "unknown",
561
+ type: f.type || "unknown",
562
+ target: f.target,
563
+ content: f.content || f.code
564
+ })
565
+ }
566
+ }
567
+ if (Array.isArray(parsed?.dependencies)) deps.push(...parsed.dependencies)
568
+ if (Array.isArray(parsed?.deps)) deps.push(...parsed.deps)
569
+ if (parsed?.registryDependencies && typeof parsed.registryDependencies === "object") {
570
+ for (const [k, v] of Object.entries(parsed.registryDependencies)) {
571
+ deps.push(`${k}: ${v}`)
572
+ }
573
+ }
574
+
575
+ return { files, dependencies: deps, installUrl }
576
+ }
577
+
578
+ // ============================================================================
579
+ // Tool: list_blocks
580
+ // ============================================================================
581
+
582
+ type ListResult = {
583
+ status: "SUCCESS" | "ERROR"
584
+ message: string
585
+ registries_queried: RegistryName[]
586
+ cached_at?: Record<string, string>
587
+ total?: number
588
+ filtered?: number
589
+ entries?: IndexEntry[]
590
+ errors?: string[]
591
+ hints?: string[]
592
+ }
593
+
594
+ const REGISTRIES_ALL: RegistryName[] = ["shadcn", "basecn", "reactbits"]
595
+
596
+ export const list_blocks = tool({
597
+ description:
598
+ "Lista bloques/componentes del catalogo unificado sdd_catalog. " +
599
+ "Soporta 3 registries con catalogo JSON oficial: 'shadcn' (akash3444/shadcn-ui-blocks, " +
600
+ "Radix), 'basecn' (akash3444/basecn, fork Base UI) y 'reactbits' (reactbits.dev, " +
601
+ "primitivas animadas; para cada base se exponen sus 4 variantes JS-CSS/JS-TW/TS-CSS/TS-TW). " +
602
+ "Cachea en .openspec/cache/ con TTL por registry (7d shadcn/basecn, 1d reactbits). " +
603
+ "Filtra por categoria (hero, footer, pricing, backgrounds, text, cards, etc) " +
604
+ "y por query libre (substring sobre name/description/tags).",
605
+ args: {
606
+ category: tool.schema
607
+ .string()
608
+ .optional()
609
+ .describe(
610
+ "Filtra por categoria exacta (hero, footer, pricing, backgrounds, text, " +
611
+ "cards, navigation, buttons, animations, cursors, etc). Opcional."
612
+ ),
613
+ query: tool.schema
614
+ .string()
615
+ .optional()
616
+ .describe("Busqueda libre por substring sobre name/filename/description. Opcional."),
617
+ registry: tool.schema
618
+ .enum(["shadcn", "basecn", "reactbits", "all"])
619
+ .optional()
620
+ .default("all")
621
+ .describe("Que catalogos consultar. 'all' = shadcn+basecn+reactbits."),
622
+ limit: tool.schema
623
+ .number()
624
+ .optional()
625
+ .default(50)
626
+ .describe("Maximo de entradas a devolver (default 50, max 500)."),
627
+ force_refresh: tool.schema
628
+ .boolean()
629
+ .optional()
630
+ .default(false)
631
+ .describe("Si true, ignora TTL y re-descarga el indice del registry.")
632
+ },
633
+ async execute(args, context) {
634
+ const root = getRoot(context)
635
+ const requested: RegistryName[] =
636
+ args.registry === "all" || !args.registry
637
+ ? REGISTRIES_ALL
638
+ : [args.registry as RegistryName]
639
+
640
+ const allEntries: IndexEntry[] = []
641
+ const cachedAt: Record<string, string> = {}
642
+ const errors: string[] = []
643
+ const hints: string[] = []
644
+
645
+ for (const reg of requested) {
646
+ try {
647
+ if (reg === "reactbits") {
648
+ const { index, refreshed, error } = await buildReactbitsIndex(
649
+ root,
650
+ args.force_refresh || false
651
+ )
652
+ cachedAt[reg] = index.cached_at
653
+ if (refreshed) {
654
+ // ok
655
+ }
656
+ if (error) errors.push(`[${reg}] ${error}`)
657
+ allEntries.push(...index.entries)
658
+ hints.push(
659
+ "[reactbits] Cada entrada lista las 4 variantes disponibles " +
660
+ "(`variants[]`) y `install_url` apunta a la variante por default " +
661
+ "TS-TW (TypeScript + Tailwind v4). Para otra variante, pasa " +
662
+ "`variant='JS-CSS'` a `sdd_catalog_get_block`."
663
+ )
664
+ } else {
665
+ const { index, refreshed, error } = await buildOrLoadIndex(
666
+ root,
667
+ reg,
668
+ args.force_refresh || false
669
+ )
670
+ cachedAt[reg] = index.cached_at
671
+ if (refreshed) {
672
+ // ok
673
+ }
674
+ if (error) errors.push(`[${reg}] ${error}`)
675
+ allEntries.push(...index.entries)
676
+ }
677
+ } catch (e) {
678
+ errors.push(`[${reg}] ${(e as Error).message}`)
679
+ }
680
+ }
681
+
682
+ let filtered = allEntries
683
+ if (args.category) {
684
+ const cat = args.category.toLowerCase()
685
+ filtered = filtered.filter(
686
+ (e) =>
687
+ e.category === cat ||
688
+ e.name.toLowerCase().startsWith(cat + "-") ||
689
+ (e.tags || []).some((t) => t.toLowerCase().includes(cat))
690
+ )
691
+ }
692
+ if (args.query) {
693
+ const q = args.query.toLowerCase()
694
+ filtered = filtered.filter(
695
+ (e) =>
696
+ e.name.toLowerCase().includes(q) ||
697
+ (e.filename || "").toLowerCase().includes(q) ||
698
+ (e.description || "").toLowerCase().includes(q) ||
699
+ (e.author || "").toLowerCase().includes(q) ||
700
+ (e.tags || []).some((t) => t.toLowerCase().includes(q))
701
+ )
702
+ }
703
+
704
+ const limit = Math.min(args.limit || 50, 500)
705
+ filtered = filtered.slice(0, limit)
706
+
707
+ const result: ListResult = {
708
+ status: errors.length && allEntries.length === 0 ? "ERROR" : "SUCCESS",
709
+ message:
710
+ errors.length && allEntries.length === 0
711
+ ? `No se pudo cargar el catalogo. Errores: ${errors.join("; ")}`
712
+ : `Se encontraron ${filtered.length} bloques (total sin filtro: ${allEntries.length}).`,
713
+ registries_queried: requested,
714
+ cached_at: cachedAt,
715
+ total: allEntries.length,
716
+ filtered: filtered.length,
717
+ entries: filtered
718
+ }
719
+ if (errors.length) result.errors = errors
720
+ if (hints.length) result.hints = hints
721
+ return JSON.stringify(result, null, 2)
722
+ }
723
+ })
724
+
725
+ // ============================================================================
726
+ // Tool: get_block
727
+ // ============================================================================
728
+
729
+ type GetResult = {
730
+ status: "SUCCESS" | "ERROR"
731
+ message: string
732
+ block: {
733
+ name: string
734
+ base_name?: string
735
+ variant?: string
736
+ registry: RegistryName
737
+ category: string
738
+ author?: string
739
+ install_url: string
740
+ install_command: string
741
+ cached_source: boolean
742
+ cached_at: string
743
+ source_files: Array<{
744
+ path: string
745
+ type: string
746
+ target?: string
747
+ content?: string
748
+ }>
749
+ dependencies?: string[]
750
+ notes?: string
751
+ preview_url?: string
752
+ } | null
753
+ }
754
+
755
+ export const get_block = tool({
756
+ description:
757
+ "Obtiene el codigo fuente, archivos y dependencias de un bloque/componente " +
758
+ "especifico del catalogo unificado. " +
759
+ "Para shadcn/basecn: `name='hero-06'`. " +
760
+ "Para reactbits: `name='Dither'` (resuelve a Dither-TS-TW por default) o " +
761
+ "`name='Dither-JS-CSS'` (variante canonica completa). Tambien acepta URL " +
762
+ "directa `name='https://reactbits.dev/r/Dither-TS-TW.json'` y namespace shadcn " +
763
+ "`name='@acme/button'`. Cachea en .openspec/cache/blocks/<registry>/<name>.json. " +
764
+ "Devuelve `install_command` listo para ejecutar con `npx shadcn@latest add`.",
765
+ args: {
766
+ name: tool.schema
767
+ .string()
768
+ .describe(
769
+ "Identificador del bloque. Formatos aceptados:\n" +
770
+ " - shadcn/basecn: 'hero-06', 'sidebar-07'\n" +
771
+ " - reactbits: 'Dither' (default TS-TW) o 'Dither-JS-CSS' (canonica)\n" +
772
+ " - URL directa: 'https://reactbits.dev/r/Dither-TS-TW.json'\n" +
773
+ " - Namespace shadcn: '@acme/button'"
774
+ ),
775
+ registry: tool.schema
776
+ .enum(["auto", "shadcn", "basecn", "reactbits"])
777
+ .optional()
778
+ .default("auto")
779
+ .describe(
780
+ "Registry a consultar. 'auto' detecta por el formato del nombre " +
781
+ "(contiene '/' => namespace, contiene '-JS-...' o '-TS-...' => reactbits, " +
782
+ "sin prefijo => shadcn por default)."
783
+ ),
784
+ variant: tool.schema
785
+ .enum(["JS-CSS", "JS-TW", "TS-CSS", "TS-TW"])
786
+ .optional()
787
+ .describe(
788
+ "Solo para reactbits: variante del componente (default: TS-TW). " +
789
+ "Aplicar cuando se pasa el nombre base sin sufijo de variante."
790
+ ),
791
+ force_refresh: tool.schema
792
+ .boolean()
793
+ .optional()
794
+ .default(false)
795
+ .describe("Si true, re-descarga aunque exista cache.")
796
+ },
797
+ async execute(args, context) {
798
+ const root = getRoot(context)
799
+ const rawName = args.name.trim()
800
+
801
+ // --- 1. Resolver registry y slug canonico ---
802
+ let registry: RegistryName
803
+ let canonicalName: string
804
+ let baseName: string | undefined
805
+ let variant: ReactBitsVariant | undefined
806
+ let directUrl: string | undefined
807
+
808
+ if (rawName.startsWith("http://") || rawName.startsWith("https://")) {
809
+ const url = rawName
810
+ if (url.includes("reactbits.dev/r/")) {
811
+ const m = url.match(/\/r\/([a-zA-Z0-9_.-]+)\.json/)
812
+ if (!m) {
813
+ return JSON.stringify({
814
+ status: "ERROR",
815
+ message: `URL reactbits invalida: ${url}. Esperado patron /r/<name>.json.`,
816
+ block: null
817
+ }, null, 2)
818
+ }
819
+ const slug = m[1]
820
+ const resolved = resolveReactbitsSlug(slug, args.variant)
821
+ registry = "reactbits"
822
+ canonicalName = resolved.canonicalName
823
+ baseName = resolved.baseName
824
+ variant = resolved.variant
825
+ directUrl = url
826
+ } else {
827
+ // URL generica shadcn: tratarla como shadcn (1 sola parte)
828
+ const m = url.match(/\/([a-zA-Z0-9_.-]+)\.json/)
829
+ if (!m) {
830
+ return JSON.stringify({
831
+ status: "ERROR",
832
+ message: `URL no reconocida como item de registry valido: ${url}`,
833
+ block: null
834
+ }, null, 2)
835
+ }
836
+ registry = "shadcn"
837
+ canonicalName = m[1]
838
+ directUrl = url
839
+ }
840
+ } else if (rawName.startsWith("@")) {
841
+ // Namespace shadcn @acme/item
842
+ const m = rawName.match(/^@([a-zA-Z0-9_.-]+)\/(.+)$/)
843
+ if (!m) {
844
+ return JSON.stringify({
845
+ status: "ERROR",
846
+ message: `Namespace invalido: ${rawName}`,
847
+ block: null
848
+ }, null, 2)
849
+ }
850
+ registry = "shadcn"
851
+ canonicalName = `${m[1]}/${m[2]}`
852
+ } else {
853
+ // Auto-detectar: si contiene '-JS-' o '-TS-' seguido de CSS/TW, es reactbits canonica.
854
+ // Si el registry forzado es reactbits, resolver siempre.
855
+ const looksLikeReactbitsVariant = REACTBITS_VARIANT_SUFFIX_RE.test(rawName)
856
+ const requestedReg = args.registry === "auto" || !args.registry
857
+ ? (looksLikeReactbitsVariant ? "reactbits" : "shadcn")
858
+ : (args.registry as RegistryName)
859
+
860
+ if (requestedReg === "reactbits") {
861
+ const resolved = resolveReactbitsSlug(rawName, args.variant)
862
+ registry = "reactbits"
863
+ canonicalName = resolved.canonicalName
864
+ baseName = resolved.baseName
865
+ variant = resolved.variant
866
+ } else if (requestedReg === "basecn") {
867
+ registry = "basecn"
868
+ canonicalName = rawName
869
+ } else {
870
+ registry = "shadcn"
871
+ canonicalName = rawName
872
+ }
873
+ }
874
+
875
+ // --- 2. Resolver URLs de fetch e install ---
876
+ let rawUrl: string
877
+ let cachePath: string
878
+ let installUrl: string
879
+ let previewUrl: string | undefined
880
+ let category: string
881
+ let installCommand: string
882
+ let notes: string
883
+
884
+ if (registry === "reactbits") {
885
+ rawUrl = directUrl || REACTBITS_RAW(canonicalName)
886
+ cachePath = path.resolve(getBlocksDir(root, "reactbits"), `${canonicalName}.json`)
887
+ installUrl = REACTBITS_INSTALL(canonicalName)
888
+ previewUrl = baseName ? REACTBITS_PREVIEW(baseName) : undefined
889
+ installCommand = `npx shadcn@latest add ${installUrl} --yes`
890
+ category = baseName ? inferReactbitsCategory(baseName) : "misc"
891
+ notes = "Item reactbits.dev (David Haz). Dependencias pesadas (gsap/three/motion) son habituales; valida compat antes de instalar."
892
+ } else if (registry === "basecn") {
893
+ rawUrl = BASECN_RAW(canonicalName)
894
+ cachePath = path.resolve(getBlocksDir(root, "basecn"), `${canonicalName}.json`)
895
+ installUrl = BASECN_INSTALL(canonicalName)
896
+ previewUrl = `https://basecn.dev/blocks/${canonicalName}`
897
+ installCommand = `npx shadcn@latest add ${installUrl} --yes`
898
+ category = inferCategory(canonicalName)
899
+ notes = "Bloque Base UI (fork). Verifica que tu proyecto tenga Base UI instalado."
900
+ } else {
901
+ rawUrl = AKASH_RAW(canonicalName)
902
+ cachePath = path.resolve(getBlocksDir(root, "shadcn"), `${canonicalName}.json`)
903
+ installUrl = AKASH_INSTALL(canonicalName)
904
+ previewUrl = `https://shadcnui-blocks.com/blocks/${canonicalName}`
905
+ installCommand = `npx shadcn@latest add ${installUrl} --yes`
906
+ category = inferCategory(canonicalName)
907
+ notes = "Bloque Radix/shadcn-ui-blocks. Compatible con el stack nextjs-shadcn."
908
+ }
909
+
910
+ // --- 3. Fetch + cache ---
911
+ let rawText: string
912
+ let cachedSource = false
913
+ if (!args.force_refresh && fs.existsSync(cachePath)) {
914
+ rawText = fs.readFileSync(cachePath, "utf8")
915
+ cachedSource = true
916
+ } else {
917
+ try {
918
+ // El shadcn CLI negocia content-type via Accept: application/json
919
+ rawText = await fetchRaw(rawUrl, true)
920
+ ensureDir(path.dirname(cachePath))
921
+ fs.writeFileSync(cachePath, rawText, "utf8")
922
+ } catch (e) {
923
+ return JSON.stringify(
924
+ {
925
+ status: "ERROR",
926
+ message: `No se pudo descargar ${rawUrl}: ${(e as Error).message}`,
927
+ block: null
928
+ } satisfies GetResult,
929
+ null,
930
+ 2
931
+ )
932
+ }
933
+ }
934
+
935
+ // --- 4. Parse + normalizar ---
936
+ let parsed: any
937
+ try {
938
+ parsed = tryParseBlockJson(rawText)
939
+ } catch (e) {
940
+ return JSON.stringify(
941
+ {
942
+ status: "ERROR",
943
+ message: `Bloque ${canonicalName} (${registry}) descargado pero no parseable: ${(e as Error).message}`,
944
+ block: null
945
+ } satisfies GetResult,
946
+ null,
947
+ 2
948
+ )
949
+ }
950
+
951
+ const { files, dependencies } = normalizeBlock(parsed, registry, canonicalName)
952
+
953
+ const result: GetResult = {
954
+ status: "SUCCESS",
955
+ message: `Bloque '${canonicalName}' (${registry}) listo. ${files.length} archivo(s), ${dependencies.length} dependencia(s).`,
956
+ block: {
957
+ name: canonicalName,
958
+ base_name: baseName,
959
+ variant,
960
+ registry,
961
+ category,
962
+ install_url: installUrl,
963
+ install_command: installCommand,
964
+ cached_source: cachedSource,
965
+ cached_at: new Date().toISOString(),
966
+ source_files: files,
967
+ dependencies,
968
+ notes,
969
+ preview_url: previewUrl
970
+ }
971
+ }
972
+ return JSON.stringify(result, null, 2)
973
+ }
974
+ })
975
+
976
+ // ============================================================================
977
+ // Tool: warm_index
978
+ // ============================================================================
979
+
980
+ type WarmResult = {
981
+ status: "SUCCESS" | "ERROR"
982
+ message: string
983
+ warmed: string[]
984
+ errors: string[]
985
+ }
986
+
987
+ export const warm_index = tool({
988
+ description:
989
+ "Pre-calienta (descarga) los indices de los registries soportados " +
990
+ "para evitar la latencia del primer list_blocks/get_block. " +
991
+ "Idempotente: si el cache existe y es fresco, no re-descarga. " +
992
+ "TTL por registry: shadcn/basecn 7d, reactbits 1d.",
993
+ args: {
994
+ registry: tool.schema
995
+ .enum(["shadcn", "basecn", "reactbits", "all"])
996
+ .optional()
997
+ .default("all")
998
+ .describe("Que catalogos pre-calentar.")
999
+ },
1000
+ async execute(args, context) {
1001
+ const root = getRoot(context)
1002
+ const requested: RegistryName[] =
1003
+ args.registry === "all" || !args.registry
1004
+ ? REGISTRIES_ALL
1005
+ : [args.registry as RegistryName]
1006
+
1007
+ const warmed: string[] = []
1008
+ const errors: string[] = []
1009
+
1010
+ for (const reg of requested) {
1011
+ try {
1012
+ if (reg === "reactbits") {
1013
+ const { index, refreshed } = await buildReactbitsIndex(root, false)
1014
+ warmed.push(
1015
+ refreshed
1016
+ ? `${reg} (re-descargado, ${index.total} bases)`
1017
+ : `${reg} (cache fresco de ${index.cached_at})`
1018
+ )
1019
+ } else {
1020
+ const { index, refreshed } = await buildOrLoadIndex(root, reg, false)
1021
+ warmed.push(
1022
+ refreshed
1023
+ ? `${reg} (re-descargado, ${index.total} bloques)`
1024
+ : `${reg} (cache fresco de ${index.cached_at})`
1025
+ )
1026
+ }
1027
+ } catch (e) {
1028
+ errors.push(`[${reg}] ${(e as Error).message}`)
1029
+ }
1030
+ }
1031
+
1032
+ const result: WarmResult = {
1033
+ status: errors.length && warmed.length === 0 ? "ERROR" : "SUCCESS",
1034
+ message: `Indices: ${warmed.length} listos, ${errors.length} errores.`,
1035
+ warmed,
1036
+ errors
1037
+ }
1038
+ return JSON.stringify(result, null, 2)
1039
+ }
1040
+ })