velloo 0.0.0 → 0.1.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 (262) hide show
  1. package/BUN-LICENSE.md +91 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +9 -0
  4. package/README.md +262 -2
  5. package/THIRD-PARTY-NOTICES.md +467 -0
  6. package/assets/elsewhere-alps-9fqhv029.jpg +0 -0
  7. package/assets/elsewhere-bali-vp60g115.jpg +0 -0
  8. package/assets/elsewhere-forest-xgn23zrj.jpg +0 -0
  9. package/assets/elsewhere-japan-qs7qkbr2.jpg +0 -0
  10. package/assets/elsewhere-kyoto-map-n2bvkrya.svg +1 -0
  11. package/assets/elsewhere-kyoto-qemtn6nk.jpg +0 -0
  12. package/assets/elsewhere-room-g1gaw7cs.jpg +0 -0
  13. package/canvas/apple-touch-icon.png +0 -0
  14. package/canvas/assets/index-BCvDZiBo.css +2 -0
  15. package/canvas/assets/index-BcBJ11d2.js +28 -0
  16. package/canvas/assets/lucide-all-BdEyryfF.js +1 -0
  17. package/canvas/assets/radix-C3HaOB-d.js +41 -0
  18. package/canvas/assets/react-D0Ec-185.js +9 -0
  19. package/canvas/assets/rolldown-runtime-hePW80VL.js +1 -0
  20. package/canvas/assets/vendor-CKmQ-Zst.js +53 -0
  21. package/canvas/favicon.ico +0 -0
  22. package/canvas/favicon.svg +12 -0
  23. package/canvas/fonts/OFL-1.1.txt +93 -0
  24. package/canvas/fonts/poppins-700.woff2 +0 -0
  25. package/canvas/icon-192.png +0 -0
  26. package/canvas/icon-512.png +0 -0
  27. package/canvas/index.html +22 -0
  28. package/canvas/site.webmanifest +11 -0
  29. package/chunk-0t68szgr.js +3 -0
  30. package/chunk-1bywxgc5.js +4 -0
  31. package/chunk-1gx45384.js +41 -0
  32. package/chunk-1y50g9vp.js +2 -0
  33. package/chunk-1yhc252b.js +3 -0
  34. package/chunk-2mv65qxs.js +5 -0
  35. package/chunk-2smsg2ct.js +7 -0
  36. package/chunk-2vx420g2.js +442 -0
  37. package/chunk-2z0k59hz.js +3 -0
  38. package/chunk-329e3phg.js +451 -0
  39. package/chunk-40657ggd.js +10 -0
  40. package/chunk-56vqqr8s.js +3 -0
  41. package/chunk-582y60bv.js +2 -0
  42. package/chunk-5js0qw32.js +2 -0
  43. package/chunk-5x173xay.js +2 -0
  44. package/chunk-65wb0g7d.js +3 -0
  45. package/chunk-6tx68d90.js +3 -0
  46. package/chunk-74skmg76.js +2 -0
  47. package/chunk-75wbh438.js +2 -0
  48. package/chunk-79ykzywe.js +4 -0
  49. package/chunk-7dggmqwq.js +53 -0
  50. package/chunk-7e39xe21.js +18 -0
  51. package/chunk-7p7ha0qk.js +3 -0
  52. package/chunk-8ssr8a8w.js +89 -0
  53. package/chunk-946pcnt5.js +5 -0
  54. package/chunk-9vg3yafz.js +3 -0
  55. package/chunk-aapybh30.js +6 -0
  56. package/chunk-b2ebm1t3.js +303 -0
  57. package/chunk-b7j86xq7.js +4 -0
  58. package/chunk-bjnhhsak.js +2 -0
  59. package/chunk-bk8b7f9a.js +62 -0
  60. package/chunk-cep3ktr3.js +4 -0
  61. package/chunk-cxe6jjwj.js +3 -0
  62. package/chunk-d385435m.js +8 -0
  63. package/chunk-dt03awr1.js +2 -0
  64. package/chunk-e2ag33vd.js +226 -0
  65. package/chunk-erwfk47h.js +3 -0
  66. package/chunk-fgw3hp2v.js +3 -0
  67. package/chunk-fjbzk4sw.js +3 -0
  68. package/chunk-g02nd9hn.js +4 -0
  69. package/chunk-h0c36khx.js +2 -0
  70. package/chunk-h6gchare.js +3 -0
  71. package/chunk-hggap8fq.js +3 -0
  72. package/chunk-hs2j6s1v.js +75 -0
  73. package/chunk-jnsfgtn9.js +3 -0
  74. package/chunk-jrsknzjt.js +3 -0
  75. package/chunk-k6ferbam.js +4 -0
  76. package/chunk-k784090q.js +6 -0
  77. package/chunk-kxk5x7g6.js +3 -0
  78. package/chunk-mq4znqv2.js +2 -0
  79. package/chunk-mzhdrawd.js +3 -0
  80. package/chunk-n5007jcz.js +2 -0
  81. package/chunk-nfr3q7mg.js +5 -0
  82. package/chunk-nsqs1bqf.js +2 -0
  83. package/chunk-nwx5700b.js +3 -0
  84. package/chunk-pphgrsxa.js +2 -0
  85. package/chunk-qpvj6kzq.js +6 -0
  86. package/chunk-qwv7xkms.js +2 -0
  87. package/chunk-rksq3w72.js +244 -0
  88. package/chunk-s23gtejf.js +3 -0
  89. package/chunk-t2ttkxe9.js +85 -0
  90. package/chunk-tmtzxcs5.js +2 -0
  91. package/chunk-vbk1qhdz.js +3 -0
  92. package/chunk-w5rzk6ms.js +1229 -0
  93. package/chunk-xr6f94rj.js +2 -0
  94. package/chunk-y0zxzefg.js +5 -0
  95. package/chunk-zf3xc1wz.js +2 -0
  96. package/cli.js +3 -0
  97. package/launcher.cjs +97 -0
  98. package/package.json +58 -5
  99. package/pkgs/helpers/src/box.tsx +21 -0
  100. package/pkgs/helpers/src/cn.ts +32 -0
  101. package/pkgs/helpers/src/descriptors.ts +270 -0
  102. package/pkgs/helpers/src/divider.tsx +123 -0
  103. package/pkgs/helpers/src/gradient.tsx +90 -0
  104. package/pkgs/helpers/src/heading.tsx +20 -0
  105. package/pkgs/helpers/src/icon-data.ts +8009 -0
  106. package/pkgs/helpers/src/icon.tsx +53 -0
  107. package/pkgs/helpers/src/image.tsx +111 -0
  108. package/pkgs/helpers/src/index.ts +29 -0
  109. package/pkgs/helpers/src/layer.tsx +61 -0
  110. package/pkgs/helpers/src/lowering.ts +53 -0
  111. package/pkgs/helpers/src/paths.ts +47 -0
  112. package/pkgs/helpers/src/placeholder.tsx +88 -0
  113. package/pkgs/helpers/src/prose.tsx +42 -0
  114. package/pkgs/helpers/src/registry.ts +41 -0
  115. package/pkgs/helpers/src/svg.tsx +62 -0
  116. package/pkgs/helpers/src/text.tsx +16 -0
  117. package/pkgs/provider-antd/src/index.ts +78 -0
  118. package/pkgs/provider-antd/src/intro.ts +14 -0
  119. package/pkgs/provider-antd/src/manifest.ts +439 -0
  120. package/pkgs/provider-antd/src/overlays.ts +176 -0
  121. package/pkgs/provider-antd/src/registry.ts +104 -0
  122. package/pkgs/provider-antd/src/render-pass.ts +43 -0
  123. package/pkgs/provider-antd/src/tailwind-entry.css +21 -0
  124. package/pkgs/provider-antd/src/theme.ts +132 -0
  125. package/pkgs/provider-antd/src/version.ts +8 -0
  126. package/pkgs/provider-chakra/src/index.ts +80 -0
  127. package/pkgs/provider-chakra/src/intro.ts +14 -0
  128. package/pkgs/provider-chakra/src/manifest.ts +421 -0
  129. package/pkgs/provider-chakra/src/overlays.ts +246 -0
  130. package/pkgs/provider-chakra/src/registry.ts +227 -0
  131. package/pkgs/provider-chakra/src/render-pass.ts +55 -0
  132. package/pkgs/provider-chakra/src/tailwind-entry.css +21 -0
  133. package/pkgs/provider-chakra/src/theme.ts +180 -0
  134. package/pkgs/provider-chakra/src/version.ts +8 -0
  135. package/pkgs/provider-mui/src/index.ts +117 -0
  136. package/pkgs/provider-mui/src/intro.ts +12 -0
  137. package/pkgs/provider-mui/src/manifest.ts +263 -0
  138. package/pkgs/provider-mui/src/overlays.ts +124 -0
  139. package/pkgs/provider-mui/src/registry.ts +120 -0
  140. package/pkgs/provider-mui/src/render-pass.ts +36 -0
  141. package/pkgs/provider-mui/src/tailwind-entry.css +21 -0
  142. package/pkgs/provider-mui/src/theme.ts +129 -0
  143. package/pkgs/provider-mui/src/version.ts +8 -0
  144. package/pkgs/provider-none/src/components-inline.tsx +204 -0
  145. package/pkgs/provider-none/src/components.tsx +155 -0
  146. package/pkgs/provider-none/src/index.ts +57 -0
  147. package/pkgs/provider-none/src/intro.ts +18 -0
  148. package/pkgs/provider-none/src/manifest.ts +163 -0
  149. package/pkgs/provider-none/src/registry-inline.ts +36 -0
  150. package/pkgs/provider-none/src/registry.ts +39 -0
  151. package/pkgs/provider-none/src/tailwind-entry.css +57 -0
  152. package/pkgs/provider-none/src/version.ts +10 -0
  153. package/pkgs/schema/src/annotation.ts +120 -0
  154. package/pkgs/schema/src/asset.ts +66 -0
  155. package/pkgs/schema/src/board.ts +71 -0
  156. package/pkgs/schema/src/comment.ts +107 -0
  157. package/pkgs/schema/src/config.ts +178 -0
  158. package/pkgs/schema/src/css-sanitize.ts +56 -0
  159. package/pkgs/schema/src/extension.ts +105 -0
  160. package/pkgs/schema/src/fonts.ts +690 -0
  161. package/pkgs/schema/src/frame.ts +40 -0
  162. package/pkgs/schema/src/icon-name.ts +21 -0
  163. package/pkgs/schema/src/ids.ts +14 -0
  164. package/pkgs/schema/src/index.ts +161 -0
  165. package/pkgs/schema/src/migrate.ts +244 -0
  166. package/pkgs/schema/src/node.ts +229 -0
  167. package/pkgs/schema/src/paths.ts +28 -0
  168. package/pkgs/schema/src/repo.ts +52 -0
  169. package/pkgs/schema/src/screen.ts +30 -0
  170. package/pkgs/schema/src/snippet-resolve.ts +193 -0
  171. package/pkgs/schema/src/snippet.ts +104 -0
  172. package/pkgs/schema/src/svg-sanitize.ts +74 -0
  173. package/pkgs/schema/src/theme.ts +218 -0
  174. package/pkgs/schema/src/typeset.ts +693 -0
  175. package/pkgs/schema/src/validate-ids.ts +46 -0
  176. package/pkgs/schema/src/viewport.ts +8 -0
  177. package/pkgs/shadcn-snapshot/dist/manifest.json +8109 -0
  178. package/pkgs/shadcn-snapshot/src/components/canvas-portal.tsx +55 -0
  179. package/pkgs/shadcn-snapshot/src/components/ui/accordion.tsx +122 -0
  180. package/pkgs/shadcn-snapshot/src/components/ui/alert-dialog.tsx +164 -0
  181. package/pkgs/shadcn-snapshot/src/components/ui/alert.tsx +74 -0
  182. package/pkgs/shadcn-snapshot/src/components/ui/aspect-ratio.tsx +13 -0
  183. package/pkgs/shadcn-snapshot/src/components/ui/attachment.tsx +197 -0
  184. package/pkgs/shadcn-snapshot/src/components/ui/avatar.tsx +100 -0
  185. package/pkgs/shadcn-snapshot/src/components/ui/badge.tsx +50 -0
  186. package/pkgs/shadcn-snapshot/src/components/ui/breadcrumb.tsx +109 -0
  187. package/pkgs/shadcn-snapshot/src/components/ui/bubble.tsx +130 -0
  188. package/pkgs/shadcn-snapshot/src/components/ui/button-group.tsx +82 -0
  189. package/pkgs/shadcn-snapshot/src/components/ui/button.tsx +72 -0
  190. package/pkgs/shadcn-snapshot/src/components/ui/calendar.tsx +229 -0
  191. package/pkgs/shadcn-snapshot/src/components/ui/card.tsx +92 -0
  192. package/pkgs/shadcn-snapshot/src/components/ui/carousel.tsx +235 -0
  193. package/pkgs/shadcn-snapshot/src/components/ui/chart-option.ts +250 -0
  194. package/pkgs/shadcn-snapshot/src/components/ui/chart.tsx +177 -0
  195. package/pkgs/shadcn-snapshot/src/components/ui/checkbox.tsx +41 -0
  196. package/pkgs/shadcn-snapshot/src/components/ui/collapsible.tsx +32 -0
  197. package/pkgs/shadcn-snapshot/src/components/ui/combobox.tsx +196 -0
  198. package/pkgs/shadcn-snapshot/src/components/ui/context-menu.tsx +227 -0
  199. package/pkgs/shadcn-snapshot/src/components/ui/dialog.tsx +131 -0
  200. package/pkgs/shadcn-snapshot/src/components/ui/direction.tsx +24 -0
  201. package/pkgs/shadcn-snapshot/src/components/ui/drawer.tsx +112 -0
  202. package/pkgs/shadcn-snapshot/src/components/ui/dropdown-menu.tsx +205 -0
  203. package/pkgs/shadcn-snapshot/src/components/ui/empty.tsx +98 -0
  204. package/pkgs/shadcn-snapshot/src/components/ui/field.tsx +228 -0
  205. package/pkgs/shadcn-snapshot/src/components/ui/hover-card.tsx +51 -0
  206. package/pkgs/shadcn-snapshot/src/components/ui/input-group.tsx +148 -0
  207. package/pkgs/shadcn-snapshot/src/components/ui/input.tsx +43 -0
  208. package/pkgs/shadcn-snapshot/src/components/ui/item.tsx +187 -0
  209. package/pkgs/shadcn-snapshot/src/components/ui/kbd.tsx +30 -0
  210. package/pkgs/shadcn-snapshot/src/components/ui/label.tsx +25 -0
  211. package/pkgs/shadcn-snapshot/src/components/ui/marker.tsx +71 -0
  212. package/pkgs/shadcn-snapshot/src/components/ui/menubar.tsx +243 -0
  213. package/pkgs/shadcn-snapshot/src/components/ui/message.tsx +89 -0
  214. package/pkgs/shadcn-snapshot/src/components/ui/native-select.tsx +60 -0
  215. package/pkgs/shadcn-snapshot/src/components/ui/navigation-menu.tsx +165 -0
  216. package/pkgs/shadcn-snapshot/src/components/ui/pagination.tsx +117 -0
  217. package/pkgs/shadcn-snapshot/src/components/ui/popover.tsx +66 -0
  218. package/pkgs/shadcn-snapshot/src/components/ui/progress.tsx +35 -0
  219. package/pkgs/shadcn-snapshot/src/components/ui/radio-group.tsx +48 -0
  220. package/pkgs/shadcn-snapshot/src/components/ui/scroll-area.tsx +59 -0
  221. package/pkgs/shadcn-snapshot/src/components/ui/select.tsx +180 -0
  222. package/pkgs/shadcn-snapshot/src/components/ui/separator.tsx +32 -0
  223. package/pkgs/shadcn-snapshot/src/components/ui/sheet.tsx +107 -0
  224. package/pkgs/shadcn-snapshot/src/components/ui/skeleton.tsx +17 -0
  225. package/pkgs/shadcn-snapshot/src/components/ui/slider.tsx +68 -0
  226. package/pkgs/shadcn-snapshot/src/components/ui/sonner.tsx +91 -0
  227. package/pkgs/shadcn-snapshot/src/components/ui/spinner.tsx +21 -0
  228. package/pkgs/shadcn-snapshot/src/components/ui/switch.tsx +41 -0
  229. package/pkgs/shadcn-snapshot/src/components/ui/table.tsx +93 -0
  230. package/pkgs/shadcn-snapshot/src/components/ui/tabs.tsx +84 -0
  231. package/pkgs/shadcn-snapshot/src/components/ui/textarea.tsx +24 -0
  232. package/pkgs/shadcn-snapshot/src/components/ui/toggle-group.tsx +94 -0
  233. package/pkgs/shadcn-snapshot/src/components/ui/toggle.tsx +50 -0
  234. package/pkgs/shadcn-snapshot/src/components/ui/tooltip.tsx +47 -0
  235. package/pkgs/shadcn-snapshot/src/examples.ts +36 -0
  236. package/pkgs/shadcn-snapshot/src/groups.ts +87 -0
  237. package/pkgs/shadcn-snapshot/src/index.ts +43 -0
  238. package/pkgs/shadcn-snapshot/src/lib/utils.ts +4 -0
  239. package/pkgs/shadcn-snapshot/src/manifest.ts +12 -0
  240. package/pkgs/shadcn-snapshot/src/notes.ts +97 -0
  241. package/pkgs/shadcn-snapshot/src/paths.ts +47 -0
  242. package/pkgs/shadcn-snapshot/src/registry-files.ts +293 -0
  243. package/pkgs/shadcn-snapshot/src/registry.ts +631 -0
  244. package/pkgs/shadcn-snapshot/src/shadcn-tailwind.css +632 -0
  245. package/pkgs/shadcn-snapshot/src/tailwind-entry.css +159 -0
  246. package/pkgs/shadcn-snapshot/src/version.ts +8 -0
  247. package/plugins/claude/velloo/.claude-plugin/plugin.json +6 -0
  248. package/plugins/claude/velloo/agents/velloo-design-reviewer.md +33 -0
  249. package/plugins/claude/velloo/agents/velloo-designer.md +39 -0
  250. package/plugins/claude/velloo/commands/design.md +11 -0
  251. package/plugins/claude/velloo/commands/implement.md +10 -0
  252. package/plugins/claude/velloo/commands/review.md +8 -0
  253. package/plugins/gemini/GEMINI.md +31 -0
  254. package/plugins/gemini/commands/velloo/design.toml +10 -0
  255. package/plugins/gemini/commands/velloo/implement.toml +9 -0
  256. package/plugins/gemini/gemini-extension.json +9 -0
  257. package/skills/velloo-brand/SKILL.md +124 -0
  258. package/skills/velloo-design/SKILL.md +144 -0
  259. package/skills/velloo-design-system/SKILL.md +90 -0
  260. package/skills/velloo-implement/SKILL.md +101 -0
  261. package/skills/velloo-logo/SKILL.md +93 -0
  262. package/skills/velloo-setup/SKILL.md +156 -0
@@ -0,0 +1,89 @@
1
+ // @bun
2
+ import{BoardSchema,isArchived,ConfigSchema,ScreenSchema}from"./chunk-bk8b7f9a.js";import{listLocalDesigns,localDesignOf}from"./chunk-329e3phg.js";import{fail}from"./chunk-s23gtejf.js";import{findManifest,findProjects,pickProject,discoverDesignFolders}from"./chunk-1bywxgc5.js";import{__toESM,__commonJS}from"./chunk-2smsg2ct.js";var require_src=__commonJS(function(exports,module){var cursor={to(x,y){if(!y)return`\x1B[${x+1}G`;return`\x1B[${y+1};${x+1}H`},move(x,y){let ret="";if(x<0)ret+=`\x1B[${-x}D`;else if(x>0)ret+=`\x1B[${x}C`;if(y<0)ret+=`\x1B[${-y}A`;else if(y>0)ret+=`\x1B[${y}B`;return ret},up:(count=1)=>`\x1B[${count}A`,down:(count=1)=>`\x1B[${count}B`,forward:(count=1)=>`\x1B[${count}C`,backward:(count=1)=>`\x1B[${count}D`,nextLine:(count=1)=>"\x1B[E".repeat(count),prevLine:(count=1)=>"\x1B[F".repeat(count),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},scroll={up:(count=1)=>"\x1B[S".repeat(count),down:(count=1)=>"\x1B[T".repeat(count)},erase={screen:"\x1B[2J",up:(count=1)=>"\x1B[1J".repeat(count),down:(count=1)=>"\x1B[J".repeat(count),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(count){let clear="";for(let i=0;i<count;i++)clear+=this.line+(i<count-1?cursor.up():"");if(count)clear+=cursor.left;return clear}};module.exports={cursor,scroll,erase,beep:"\x07"}});import{styleText}from"util";import{stdout,stdin}from"process";import*as l from"readline";import l__default from"readline";var getCodePointsLength=(()=>{let SURROGATE_PAIR_RE=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return(input)=>{let surrogatePairsNr=0;SURROGATE_PAIR_RE.lastIndex=0;while(SURROGATE_PAIR_RE.test(input))surrogatePairsNr+=1;return input.length-surrogatePairsNr}})(),isFullWidth=(x)=>x===12288||x>=65281&&x<=65376||x>=65504&&x<=65510,isWideNotCJKTNotEmoji=(x)=>x===8987||x===9001||x>=12272&&x<=12287||x>=12289&&x<=12350||x>=12441&&x<=12543||x>=12549&&x<=12591||x>=12593&&x<=12686||x>=12688&&x<=12771||x>=12783&&x<=12830||x>=12832&&x<=12871||x>=12880&&x<=19903||x>=65040&&x<=65049||x>=65072&&x<=65106||x>=65108&&x<=65126||x>=65128&&x<=65131||x>=127488&&x<=127490||x>=127504&&x<=127547||x>=127552&&x<=127560||x>=131072&&x<=196605||x>=196608&&x<=262141;var ANSI_RE=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,CONTROL_RE=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,CJKT_WIDE_RE=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,TAB_RE=/\t{1,1000}/y,EMOJI_RE=/[\u{1F1E6}-\u{1F1FF}]{2}|\u{1F3F4}[\u{E0061}-\u{E007A}]{2}[\u{E0030}-\u{E0039}\u{E0061}-\u{E007A}]{1,3}\u{E007F}|(?:\p{Emoji}\uFE0F\u20E3?|\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation})(?:\u200D(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F\u20E3?))*/yu,LATIN_RE=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,MODIFIER_RE=/\p{M}+/gu,NO_TRUNCATION={limit:1/0,ellipsis:""},getStringTruncatedWidth=(input,truncationOptions={},widthOptions={})=>{let LIMIT=truncationOptions.limit??1/0,ELLIPSIS=truncationOptions.ellipsis??"",ELLIPSIS_WIDTH=truncationOptions?.ellipsisWidth??(ELLIPSIS?getStringTruncatedWidth(ELLIPSIS,NO_TRUNCATION,widthOptions).width:0),ANSI_WIDTH=0,CONTROL_WIDTH=widthOptions.controlWidth??0,TAB_WIDTH=widthOptions.tabWidth??8,EMOJI_WIDTH=widthOptions.emojiWidth??2,FULL_WIDTH_WIDTH=2,REGULAR_WIDTH=widthOptions.regularWidth??1,WIDE_WIDTH=widthOptions.wideWidth??2,PARSE_BLOCKS=[[LATIN_RE,REGULAR_WIDTH],[ANSI_RE,0],[CONTROL_RE,CONTROL_WIDTH],[TAB_RE,TAB_WIDTH],[EMOJI_RE,EMOJI_WIDTH],[CJKT_WIDE_RE,WIDE_WIDTH]],indexPrev=0,index=0,length=input.length,lengthExtra=0,truncationEnabled=!1,truncationIndex=length,truncationLimit=Math.max(0,LIMIT-ELLIPSIS_WIDTH),unmatchedStart=0,unmatchedEnd=0,width=0,widthExtra=0;outer:while(!0){if(unmatchedEnd>unmatchedStart||index>=length&&index>indexPrev){let unmatched=input.slice(unmatchedStart,unmatchedEnd)||input.slice(indexPrev,index);lengthExtra=0;for(let char of unmatched.replaceAll(MODIFIER_RE,"")){let codePoint=char.codePointAt(0)||0;if(isFullWidth(codePoint))widthExtra=2;else if(isWideNotCJKTNotEmoji(codePoint))widthExtra=WIDE_WIDTH;else widthExtra=REGULAR_WIDTH;if(width+widthExtra>truncationLimit)truncationIndex=Math.min(truncationIndex,Math.max(unmatchedStart,indexPrev)+lengthExtra);if(width+widthExtra>LIMIT){truncationEnabled=!0;break outer}lengthExtra+=char.length,width+=widthExtra}unmatchedStart=unmatchedEnd=0}if(index>=length)break outer;for(let i=0,l=PARSE_BLOCKS.length;i<l;i++){let[BLOCK_RE,BLOCK_WIDTH]=PARSE_BLOCKS[i];if(BLOCK_RE.lastIndex=index,BLOCK_RE.test(input)){if(lengthExtra=BLOCK_RE===CJKT_WIDE_RE?getCodePointsLength(input.slice(index,BLOCK_RE.lastIndex)):BLOCK_RE===EMOJI_RE?1:BLOCK_RE.lastIndex-index,widthExtra=lengthExtra*BLOCK_WIDTH,width+widthExtra>truncationLimit)truncationIndex=Math.min(truncationIndex,index+Math.floor((truncationLimit-width)/BLOCK_WIDTH));if(width+widthExtra>LIMIT){truncationEnabled=!0;break outer}width+=widthExtra,unmatchedStart=indexPrev,unmatchedEnd=index,index=indexPrev=BLOCK_RE.lastIndex;continue outer}}index+=1}return{width:truncationEnabled?truncationLimit:width,index:truncationEnabled?truncationIndex:length,truncated:truncationEnabled,ellipsed:truncationEnabled&&LIMIT>=ELLIPSIS_WIDTH}},dist_default=getStringTruncatedWidth;var NO_TRUNCATION2={limit:1/0,ellipsis:"",ellipsisWidth:0},fastStringWidth=(input,options={})=>dist_default(input,NO_TRUNCATION2,options).width,dist_default2=fastStringWidth;var ESC="\x1B",CSI="\x9B",END_CODE=39,ANSI_ESCAPE_BELL="\x07",ANSI_CSI="[",ANSI_OSC="]",ANSI_SGR_TERMINATOR="m",ANSI_ESCAPE_LINK=`${ANSI_OSC}8;;`,GROUP_REGEX=new RegExp(`(?:\\${ANSI_CSI}(?<code>\\d+)m|\\${ANSI_ESCAPE_LINK}(?<uri>.*)${ANSI_ESCAPE_BELL})`,"y"),getClosingCode=(openingCode)=>{if(openingCode>=30&&openingCode<=37)return 39;if(openingCode>=90&&openingCode<=97)return 39;if(openingCode>=40&&openingCode<=47)return 49;if(openingCode>=100&&openingCode<=107)return 49;if(openingCode===1||openingCode===2)return 22;if(openingCode===3)return 23;if(openingCode===4)return 24;if(openingCode===7)return 27;if(openingCode===8)return 28;if(openingCode===9)return 29;if(openingCode===0)return 0;return},wrapAnsiCode=(code)=>`${ESC}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`,wrapAnsiHyperlink=(url)=>`${ESC}${ANSI_ESCAPE_LINK}${url}${ANSI_ESCAPE_BELL}`,wrapWord=(rows,word,columns)=>{let characters=word[Symbol.iterator](),isInsideEscape=!1,isInsideLinkEscape=!1,lastRow=rows.at(-1),visible=lastRow===void 0?0:dist_default2(lastRow),currentCharacter=characters.next(),nextCharacter=characters.next(),rawCharacterIndex=0;while(!currentCharacter.done){let character=currentCharacter.value,characterLength=dist_default2(character);if(visible+characterLength<=columns)rows[rows.length-1]+=character;else rows.push(character),visible=0;if(character===ESC||character===CSI)isInsideEscape=!0,isInsideLinkEscape=word.startsWith(ANSI_ESCAPE_LINK,rawCharacterIndex+1);if(isInsideEscape){if(isInsideLinkEscape){if(character===ANSI_ESCAPE_BELL)isInsideEscape=!1,isInsideLinkEscape=!1}else if(character===ANSI_SGR_TERMINATOR)isInsideEscape=!1}else if(visible+=characterLength,visible===columns&&!nextCharacter.done)rows.push(""),visible=0;currentCharacter=nextCharacter,nextCharacter=characters.next(),rawCharacterIndex+=character.length}if(lastRow=rows.at(-1),!visible&&lastRow!==void 0&&lastRow.length&&rows.length>1)rows[rows.length-2]+=rows.pop()},stringVisibleTrimSpacesRight=(string)=>{let words=string.split(" "),last=words.length;while(last){if(dist_default2(words[last-1]))break;last--}if(last===words.length)return string;return words.slice(0,last).join(" ")+words.slice(last).join("")},exec=(string,columns,options={})=>{if(options.trim!==!1&&string.trim()==="")return"";let returnValue="",escapeCode,escapeUrl,words=string.split(" "),rows=[""],rowLength=0;for(let index=0;index<words.length;index++){let word=words[index];if(options.trim!==!1){let row=rows.at(-1)??"",trimmed=row.trimStart();if(row.length!==trimmed.length)rows[rows.length-1]=trimmed,rowLength=dist_default2(trimmed)}if(index!==0){if(rowLength>=columns&&(options.wordWrap===!1||options.trim===!1))rows.push(""),rowLength=0;if(rowLength||options.trim===!1)rows[rows.length-1]+=" ",rowLength++}let wordLength=dist_default2(word);if(options.hard&&wordLength>columns){let remainingColumns=columns-rowLength,breaksStartingThisLine=1+Math.floor((wordLength-remainingColumns-1)/columns);if(Math.floor((wordLength-1)/columns)<breaksStartingThisLine)rows.push("");wrapWord(rows,word,columns),rowLength=dist_default2(rows.at(-1)??"");continue}if(rowLength+wordLength>columns&&rowLength&&wordLength){if(options.wordWrap===!1&&rowLength<columns){wrapWord(rows,word,columns),rowLength=dist_default2(rows.at(-1)??"");continue}rows.push(""),rowLength=0}if(rowLength+wordLength>columns&&options.wordWrap===!1){wrapWord(rows,word,columns),rowLength=dist_default2(rows.at(-1)??"");continue}rows[rows.length-1]+=word,rowLength+=wordLength}if(options.trim!==!1)rows=rows.map((row)=>stringVisibleTrimSpacesRight(row));let preString=rows.join(`
3
+ `),inSurrogate=!1;for(let i=0;i<preString.length;i++){let character=preString[i];if(returnValue+=character,!inSurrogate){if(inSurrogate=character>="\uD800"&&character<="\uDBFF",inSurrogate)continue}else inSurrogate=!1;if(character===ESC||character===CSI){GROUP_REGEX.lastIndex=i+1;let groups=GROUP_REGEX.exec(preString)?.groups;if(groups?.code!==void 0){let code=Number.parseFloat(groups.code);escapeCode=code===END_CODE?void 0:code}else if(groups?.uri!==void 0)escapeUrl=groups.uri.length===0?void 0:groups.uri}if(preString[i+1]===`
4
+ `){if(escapeUrl)returnValue+=wrapAnsiHyperlink("");let closingCode=escapeCode?getClosingCode(escapeCode):void 0;if(escapeCode&&closingCode)returnValue+=wrapAnsiCode(closingCode)}else if(character===`
5
+ `){if(escapeCode&&getClosingCode(escapeCode))returnValue+=wrapAnsiCode(escapeCode);if(escapeUrl)returnValue+=wrapAnsiHyperlink(escapeUrl)}}return returnValue},CRLF_OR_LF=/\r?\n/;function wrapAnsi(string,columns,options){return String(string).normalize().split(CRLF_OR_LF).map((line)=>exec(line,columns,options)).join(`
6
+ `)}var import_sisteransi=__toESM(require_src(),1);import{ReadStream}from"tty";function findCursor(s,o,l){if(!l.some((r)=>!r.disabled))return s;let t=s+o,n=Math.max(l.length-1,0),e=t<0?n:t>n?0:t;return l[e]?.disabled?findCursor(e,o<0?-1:1,l):e}var a$1=["up","down","left","right","space","enter","cancel"],t=["January","February","March","April","May","June","July","August","September","October","November","December"],settings={actions:new Set(a$1),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"},withGuide:!0,date:{monthNames:[...t],messages:{required:"Please enter a valid date",invalidMonth:"There are only 12 months in a year",invalidDay:(n,e)=>`There are only ${n} days in ${e}`,afterMin:(n)=>`Date must be on or after ${n.toISOString().slice(0,10)}`,beforeMax:(n)=>`Date must be on or before ${n.toISOString().slice(0,10)}`}}};function isActionKey(n,e){if(typeof n=="string")return settings.aliases.get(n)===e;for(let s of n)if(s!==void 0&&isActionKey(s,e))return!0;return!1}function diffLines(i,s){if(i===s)return;let e=i.split(`
7
+ `),t=s.split(`
8
+ `),r=Math.max(e.length,t.length),f=[];for(let n=0;n<r;n++)e[n]!==t[n]&&f.push(n);return{lines:f,numLinesBefore:e.length,numLinesAfter:t.length,numLines:r}}var R=globalThis.process.platform.startsWith("win"),CANCEL_SYMBOL=Symbol("clack:cancel");function isCancel(e){return e===CANCEL_SYMBOL}function setRawMode(e,r){let o=e;o.isTTY&&o.setRawMode(r)}function block({input:e=stdin,output:r=stdout,overwrite:o=!0,hideCursor:t=!0}={}){let s=l.createInterface({input:e,output:r,prompt:"",tabSize:1});l.emitKeypressEvents(e,s),e instanceof ReadStream&&e.isTTY&&e.setRawMode(!0);let n=(f,{name:a,sequence:p})=>{let c=String(f);if(isActionKey([c,a,p],"cancel")){t&&r.write(import_sisteransi.cursor.show),process.exit(0);return}if(!o)return;l.moveCursor(r,a==="return"?0:-1,a==="return"?-1:0,()=>{l.clearLine(r,1,()=>{e.once("keypress",n)})})};return t&&r.write(import_sisteransi.cursor.hide),e.once("keypress",n),()=>{e.off("keypress",n),t&&r.write(import_sisteransi.cursor.show),e instanceof ReadStream&&e.isTTY&&!R&&e.setRawMode(!1),s.terminal=!1,s.close()}}var getColumns=(e)=>("columns"in e)&&typeof e.columns=="number"?e.columns:80,getRows=(e)=>("rows"in e)&&typeof e.rows=="number"?e.rows:20;function wrapTextWithPrefix(e,r,o,t=o,s=o,n){let f=getColumns(e??stdout);return wrapAnsi(r,f-o.length,{hard:!0,trim:!1}).split(`
9
+ `).map((c,i,m)=>{let d=n?n(c,i):c;return i===0?`${t}${d}`:i===m.length-1?`${s}${d}`:`${o}${d}`}).join(`
10
+ `)}function runValidation(e,n){if("~standard"in e){let a=e["~standard"].validate(n);if(a instanceof Promise)throw TypeError("Schema validation must be synchronous. Update `validate()` and remove any asynchronous logic.");return a.issues?.at(0)?.message}return e(n)}class V{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame="";_subscribers=new Map;_cursor=0;state="initial";error="";value;userInput="";constructor(t,e=!0){let{input:i=stdin,output:n=stdout,render:s,signal:r,...o}=t;this.opts=o,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=s.bind(this),this._track=e,this._abortSignal=r,this.input=i,this.output=n}unsubscribe(){this._subscribers.clear()}setSubscriber(t,e){let i=this._subscribers.get(t)??[];i.push(e),this._subscribers.set(t,i)}on(t,e){this.setSubscriber(t,{cb:e})}once(t,e){this.setSubscriber(t,{cb:e,once:!0})}emit(t,...e){let i=this._subscribers.get(t)??[],n=[];for(let s of i)s.cb(...e),s.once&&n.push(()=>i.splice(i.indexOf(s),1));for(let s of n)s()}prompt(){return new Promise((t)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),t(CANCEL_SYMBOL);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}this.rl=l__default.createInterface({input:this.input,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on("keypress",this.onKeypress),setRawMode(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(import_sisteransi.cursor.show),this.output.off("resize",this.render),setRawMode(this.input,!1),t(this.value)}),this.once("cancel",()=>{this.output.write(import_sisteransi.cursor.show),this.output.off("resize",this.render),setRawMode(this.input,!1),t(CANCEL_SYMBOL)})})}_isActionKey(t,e){return t==="\t"}_shouldSubmit(t,e){return!0}_setValue(t){this.value=t,this.emit("value",this.value)}_setUserInput(t,e){this.userInput=t??"",this.emit("userInput",this.userInput),e&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:"u"}),this._setUserInput("")}onKeypress(t,e){if(this._track&&e.name!=="return"&&(e.name&&this._isActionKey(t,e)&&this.rl?.write(null,{ctrl:!0,name:"h"}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state==="error"&&(this.state="active"),e?.name&&(!this._track&&settings.aliases.has(e.name)&&this.emit("cursor",settings.aliases.get(e.name)),settings.actions.has(e.name)&&this.emit("cursor",e.name)),t&&(t.toLowerCase()==="y"||t.toLowerCase()==="n")&&this.emit("confirm",t.toLowerCase()==="y"),this.emit("key",t,e),e?.name==="return"&&this._shouldSubmit(t,e)){if(this.opts.validate){let i=runValidation(this.opts.validate,this.value);i&&(this.error=i instanceof Error?i.message:i,this.state="error",this.rl?.write(this.userInput))}this.state!=="error"&&(this.state="submit")}isActionKey([t,e?.name,e?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
11
+ `),setRawMode(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let t=wrapAnsi(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
12
+ `).length-1;this.output.write(import_sisteransi.cursor.move(-999,t*-1))}render(){let t=wrapAnsi(this._render(this)??"",process.stdout.columns,{hard:!0,trim:!1});if(t!==this._prevFrame){if(this.state==="initial")this.output.write(import_sisteransi.cursor.hide);else{let e=diffLines(this._prevFrame,t),i=getRows(this.output);if(this.restoreCursor(),e){let n=Math.max(0,e.numLinesAfter-i),s=Math.max(0,e.numLinesBefore-i),r=e.lines.find((o)=>o>=n);if(r===void 0){this._prevFrame=t;return}if(e.lines.length===1){this.output.write(import_sisteransi.cursor.move(0,r-s)),this.output.write(import_sisteransi.erase.lines(1));let o=t.split(`
13
+ `);this.output.write(o[r]),this._prevFrame=t,this.output.write(import_sisteransi.cursor.move(0,o.length-r-1));return}else if(e.lines.length>1){if(n<s)r=n;else{let h=r-s;h>0&&this.output.write(import_sisteransi.cursor.move(0,h))}this.output.write(import_sisteransi.erase.down());let f=t.split(`
14
+ `).slice(r);this.output.write(f.join(`
15
+ `)),this._prevFrame=t;return}}this.output.write(import_sisteransi.erase.down())}this.output.write(t),this.state==="initial"&&(this.state="active"),this._prevFrame=t}}}class r extends V{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(t){super(t,!1),this.value=!!t.initialValue,this.on("userInput",()=>{this.value=this._value}),this.on("confirm",(i)=>{this.output.write(import_sisteransi.cursor.move(0,-1)),this.value=i,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}}class a extends V{options;cursor=0;get _value(){return this.options[this.cursor]?.value}get _enabledOptions(){return this.options.filter((e)=>e.disabled!==!0)}toggleAll(){let e=this._enabledOptions,i=this.value!==void 0&&this.value.length===e.length;this.value=i?[]:e.map((t)=>t.value)}toggleInvert(){let e=this.value;if(!e)return;let i=this._enabledOptions.filter((t)=>!e.includes(t.value));this.value=i.map((t)=>t.value)}toggleValue(){this.value===void 0&&(this.value=[]);let e=this.value.includes(this._value);this.value=e?this.value.filter((i)=>i!==this._value):[...this.value,this._value]}constructor(e){super(e,!1),this.options=e.options,this.value=[...e.initialValues??[]];let i=Math.max(this.options.findIndex(({value:t})=>t===e.cursorAt),0);this.cursor=this.options[i]?.disabled?findCursor(i,1,this.options):i,this.on("key",(t,l)=>{l.name==="a"&&this.toggleAll(),l.name==="i"&&this.toggleInvert()}),this.on("cursor",(t)=>{switch(t){case"left":case"up":this.cursor=findCursor(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=findCursor(this.cursor,1,this.options);break;case"space":this.toggleValue();break}})}}var u$1=class extends V{_mask="\u2022";get cursor(){return this._cursor}get masked(){return this.userInput.replaceAll(/./g,this._mask)}get userInputWithCursor(){if(this.state==="submit"||this.state==="cancel")return this.masked;let t=this.userInput;if(this.cursor>=t.length)return`${this.masked}${styleText(["inverse","hidden"],"_")}`;let s=this.masked,r=s.slice(0,this.cursor),i=s.slice(this.cursor,this.cursor+1),o=s.slice(this.cursor+1);return`${r}${styleText("inverse",i)}${o}`}clear(){this._clearUserInput()}constructor({mask:t,...s}){super(s),this._mask=t??"\u2022",this.on("userInput",(r)=>{this._setValue(r)}),this.on("finalize",()=>{this.value===void 0&&(this.value="")})}},n$1=class extends V{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){let e=this._selectedValue;this.value=e===void 0?void 0:e.value}constructor(e){super(e,!1),this.options=e.options;let o=this.options.findIndex(({value:s})=>s===e.initialValue),t=o===-1?0:o;this.cursor=this.options[t]?.disabled?findCursor(t,1,this.options):t,this.changeValue(),this.on("cursor",(s)=>{switch(s){case"left":case"up":this.cursor=findCursor(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=findCursor(this.cursor,1,this.options);break}this.changeValue()})}};class n extends V{get userInputWithCursor(){if(this.state==="submit")return this.userInput;let t=this.userInput;if(this.cursor>=t.length)return`${this.userInput}\u2588`;let r=t.slice(0,this.cursor),s=t.slice(this.cursor,this.cursor+1),e=t.slice(this.cursor+1);return`${r}${styleText("inverse",s)}${e}`}get cursor(){return this._cursor}constructor(t){super({...t,initialUserInput:t.initialUserInput??t.initialValue}),this.on("userInput",(r)=>{this._setValue(r)}),this.on("finalize",()=>{this.value||(this.value=t.defaultValue),this.value===void 0&&(this.value="")})}}import{styleText as styleText2,stripVTControlCharacters}from"util";import process$1 from"process";var import_sisteransi2=__toESM(require_src(),1);function isUnicodeSupported(){if(process$1.platform!=="win32")return process$1.env.TERM!=="linux";return Boolean(process$1.env.CI)||Boolean(process$1.env.WT_SESSION)||Boolean(process$1.env.TERMINUS_SUBLIME)||process$1.env.ConEmuTask==="{cmd::Cmder}"||process$1.env.TERM_PROGRAM==="Terminus-Sublime"||process$1.env.TERM_PROGRAM==="vscode"||process$1.env.TERM==="xterm-256color"||process$1.env.TERM==="alacritty"||process$1.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var unicode=isUnicodeSupported(),isCI=()=>process.env.CI==="true";var unicodeOr=(o,e)=>unicode?o:e,S_STEP_ACTIVE=unicodeOr("\u25C6","*"),S_STEP_CANCEL=unicodeOr("\u25A0","x"),S_STEP_ERROR=unicodeOr("\u25B2","x"),S_STEP_SUBMIT=unicodeOr("\u25C7","o"),S_BAR_START=unicodeOr("\u250C","T"),S_BAR=unicodeOr("\u2502","|"),S_BAR_END=unicodeOr("\u2514","\u2014"),S_BAR_START_RIGHT=unicodeOr("\u2510","T"),S_BAR_END_RIGHT=unicodeOr("\u2518","\u2014"),S_RADIO_ACTIVE=unicodeOr("\u25CF",">"),S_RADIO_INACTIVE=unicodeOr("\u25CB"," "),S_CHECKBOX_ACTIVE=unicodeOr("\u25FB","[\u2022]"),S_CHECKBOX_SELECTED=unicodeOr("\u25FC","[+]"),S_CHECKBOX_INACTIVE=unicodeOr("\u25FB","[ ]"),S_PASSWORD_MASK=unicodeOr("\u25AA","\u2022"),S_BAR_H=unicodeOr("\u2500","-"),S_CORNER_TOP_RIGHT=unicodeOr("\u256E","+"),S_CONNECT_LEFT=unicodeOr("\u251C","+"),S_CORNER_BOTTOM_RIGHT=unicodeOr("\u256F","+"),S_CORNER_BOTTOM_LEFT=unicodeOr("\u2570","+"),S_CORNER_TOP_LEFT=unicodeOr("\u256D","+"),S_INFO=unicodeOr("\u25CF","\u2022"),S_SUCCESS=unicodeOr("\u25C6","*"),S_WARN=unicodeOr("\u25B2","!"),S_ERROR=unicodeOr("\u25A0","x"),symbol=(o)=>{switch(o){case"initial":case"active":return styleText2("cyan",S_STEP_ACTIVE);case"cancel":return styleText2("red",S_STEP_CANCEL);case"error":return styleText2("yellow",S_STEP_ERROR);case"submit":return styleText2("green",S_STEP_SUBMIT)}},symbolBar=(o)=>{switch(o){case"initial":case"active":return styleText2("cyan",S_BAR);case"cancel":return styleText2("red",S_BAR);case"error":return styleText2("yellow",S_BAR);case"submit":return styleText2("green",S_BAR)}};function formatInstructionFooter(o,e){let r=[`${e?`${styleText2("cyan",S_BAR)} `:""}${o.join(" \u2022 ")}`];return e&&r.push(styleText2("cyan",S_BAR_END)),r}var I=(l,e,w,p,b,C=!1)=>{let r=e,O=0;if(C)for(let i=p-1;i>=w;i--){let m=l[i];if(m&&(r-=m.length),O++,r<=b)break}else for(let i=w;i<p;i++){let m=l[i];if(m&&(r-=m.length),O++,r<=b)break}return{lineCount:r,removals:O}},limitOptions=({cursor:l,options:e,style:w,output:p=process.stdout,maxItems:b=Number.POSITIVE_INFINITY,columnPadding:C=0,rowPadding:r=4})=>{let i=getColumns(p)-C,m=getRows(p),M=styleText2("dim","..."),v=Math.max(m-r,0),a=Math.max(Math.min(b,v),5),f=0;l>=a-3&&(f=Math.max(Math.min(l-a+3,e.length-a),0));let d=a<e.length&&f>0,c=a<e.length&&f+a<e.length,W=Math.min(f+a,e.length),s=[],g=0;d&&g++,c&&g++;let T=f+(d?1:0),y=W-(c?1:0);for(let t=T;t<y;t++){let n=e[t],o=n?w(n,t===l):"",h=wrapAnsi(o,i,{hard:!0,trim:!1}).split(`
16
+ `);s.push(h),g+=h.length}if(g>v){let t=0,n=0,o=g,h=l-T,u=v,L=()=>I(s,o,0,h,u),E=()=>I(s,o,h+1,s.length,u,!0);d?({lineCount:o,removals:t}=L(),o>u&&(c||(u-=1),{lineCount:o,removals:n}=E())):(c||(u-=1),{lineCount:o,removals:n}=E(),o>u&&(u-=1,{lineCount:o,removals:t}=L())),t>0&&(d=!0,s.splice(0,t)),n>0&&(c=!0,s.splice(s.length-n,n))}let x=[];d&&x.push(M);for(let t of s)for(let n of t)x.push(n);return c&&x.push(M),x};var confirm=(i)=>{let a=i.active??"Yes",s=i.inactive??"No";return new r({active:a,inactive:s,signal:i.signal,input:i.input,output:i.output,initialValue:i.initialValue??!0,render(){let e=i.withGuide??settings.withGuide,u=`${symbol(this.state)} `,l=e?`${styleText2("gray",S_BAR)} `:"",f=wrapTextWithPrefix(i.output,i.message,l,u),o=`${e?`${styleText2("gray",S_BAR)}
17
+ `:""}${f}
18
+ `,c=this.value?a:s;switch(this.state){case"submit":{let r=e?`${styleText2("gray",S_BAR)} `:"";return`${o}${r}${styleText2("dim",c)}`}case"cancel":{let r=e?`${styleText2("gray",S_BAR)} `:"";return`${o}${r}${styleText2(["strikethrough","dim"],c)}${e?`
19
+ ${styleText2("gray",S_BAR)}`:""}`}default:{let r=e?`${styleText2("cyan",S_BAR)} `:"",g=e?styleText2("cyan",S_BAR_END):"";return`${o}${r}${this.value?`${styleText2("green",S_RADIO_ACTIVE)} ${a}`:`${styleText2("dim",S_RADIO_INACTIVE)} ${styleText2("dim",a)}`}${i.vertical?e?`
20
+ ${styleText2("cyan",S_BAR)} `:`
21
+ `:` ${styleText2("dim","/")} `}${this.value?`${styleText2("dim",S_RADIO_INACTIVE)} ${styleText2("dim",s)}`:`${styleText2("green",S_RADIO_ACTIVE)} ${s}`}
22
+ ${g}
23
+ `}}}}).prompt()};var MULTISELECT_INSTRUCTIONS=[`${styleText2("dim","\u2191/\u2193")} to navigate`,`${styleText2("dim","Space:")} select`,`${styleText2("dim","Enter:")} confirm`],m=(i,u)=>i.split(`
24
+ `).map((d)=>u(d)).join(`
25
+ `),multiselect=(i)=>{let u=(t,a)=>{let r=t.label??String(t.value);return a==="disabled"?`${styleText2("gray",S_CHECKBOX_INACTIVE)} ${m(r,(o)=>styleText2(["strikethrough","gray"],o))}${t.hint?` ${styleText2("dim",`(${t.hint??"disabled"})`)}`:""}`:a==="active"?`${styleText2("cyan",S_CHECKBOX_ACTIVE)} ${r}${t.hint?` ${styleText2("dim",`(${t.hint})`)}`:""}`:a==="selected"?`${styleText2("green",S_CHECKBOX_SELECTED)} ${m(r,(o)=>styleText2("dim",o))}${t.hint?` ${styleText2("dim",`(${t.hint})`)}`:""}`:a==="cancelled"?`${m(r,(o)=>styleText2(["strikethrough","dim"],o))}`:a==="active-selected"?`${styleText2("green",S_CHECKBOX_SELECTED)} ${r}${t.hint?` ${styleText2("dim",`(${t.hint})`)}`:""}`:a==="submitted"?`${m(r,(o)=>styleText2("dim",o))}`:`${styleText2("dim",S_CHECKBOX_INACTIVE)} ${m(r,(o)=>styleText2("dim",o))}`},d=i.required??!0,v=i.showInstructions??!0;return new a({options:i.options,signal:i.signal,input:i.input,output:i.output,initialValues:i.initialValues,required:d,cursorAt:i.cursorAt,validate(t){if(d&&(t===void 0||t.length===0))return`Please select at least one option.
26
+ ${styleText2("reset",styleText2("dim",`Press ${styleText2(["gray","bgWhite","inverse"]," space ")} to select, ${styleText2("gray",styleText2("bgWhite",styleText2("inverse"," enter ")))} to submit`))}`},render(){let t=i.withGuide??settings.withGuide,a=wrapTextWithPrefix(i.output,i.message,t?`${symbolBar(this.state)} `:"",`${symbol(this.state)} `),r=`${t?`${styleText2("gray",S_BAR)}
27
+ `:""}${a}
28
+ `,o=this.value??[],p=(n,l)=>{if(n.disabled)return u(n,"disabled");let s=o.includes(n.value);return l&&s?u(n,"active-selected"):s?u(n,"selected"):u(n,l?"active":"inactive")};switch(this.state){case"submit":{let n=this.options.filter(({value:s})=>o.includes(s)).map((s)=>u(s,"submitted")).join(styleText2("dim",", "))||styleText2("dim","none"),l=wrapTextWithPrefix(i.output,n,t?`${styleText2("gray",S_BAR)} `:"");return`${r}${l}`}case"cancel":{let n=this.options.filter(({value:s})=>o.includes(s)).map((s)=>u(s,"cancelled")).join(styleText2("dim",", "));if(n.trim()==="")return`${r}${styleText2("gray",S_BAR)}`;let l=wrapTextWithPrefix(i.output,n,t?`${styleText2("gray",S_BAR)} `:"");return`${r}${l}${t?`
29
+ ${styleText2("gray",S_BAR)}`:""}`}case"error":{let n=t?`${styleText2("yellow",S_BAR)} `:"",l=this.error.split(`
30
+ `).map(($,C)=>C===0?`${t?`${styleText2("yellow",S_BAR_END)} `:""}${styleText2("yellow",$)}`:` ${$}`).join(`
31
+ `),s=r.split(`
32
+ `).length,h=l.split(`
33
+ `).length+1;return`${r}${n}${limitOptions({output:i.output,options:this.options,cursor:this.cursor,maxItems:i.maxItems,columnPadding:n.length,rowPadding:s+h,style:p}).join(`
34
+ ${n}`)}
35
+ ${l}
36
+ `}default:{let n=t?`${styleText2("cyan",S_BAR)} `:"",l=r.split(`
37
+ `).length,s=v?formatInstructionFooter(MULTISELECT_INSTRUCTIONS,t):t?[styleText2("cyan",S_BAR_END)]:[],h=s.join(`
38
+ `),$=s.length+1;return`${r}${n}${limitOptions({output:i.output,options:this.options,cursor:this.cursor,maxItems:i.maxItems,columnPadding:n.length,rowPadding:l+$,style:p}).join(`
39
+ ${n}`)}
40
+ ${h}
41
+ `}}}}).prompt()};var log={message:(s=[],{symbol:e=styleText2("gray",S_BAR),secondarySymbol:r=styleText2("gray",S_BAR),output:m=process.stdout,spacing:l=1,withGuide:c}={})=>{let t=[],o=c??settings.withGuide,f=o?r:"",O=o?`${e} `:"",u=o?`${r} `:"";for(let i=0;i<l;i++)t.push(f);let g=Array.isArray(s)?s:s.split(`
42
+ `);if(g.length>0){let[i,...y]=g;i.length>0?t.push(`${O}${i}`):t.push(o?e:"");for(let p of y)p.length>0?t.push(`${u}${p}`):t.push(o?r:"")}m.write(`${t.join(`
43
+ `)}
44
+ `)},info:(s,e)=>{log.message(s,{...e,symbol:styleText2("blue",S_INFO)})},success:(s,e)=>{log.message(s,{...e,symbol:styleText2("green",S_SUCCESS)})},step:(s,e)=>{log.message(s,{...e,symbol:styleText2("green",S_STEP_SUBMIT)})},warn:(s,e)=>{log.message(s,{...e,symbol:styleText2("yellow",S_WARN)})},warning:(s,e)=>{log.warn(s,e)},error:(s,e)=>{log.message(s,{...e,symbol:styleText2("red",S_ERROR)})}},cancel=(o="",t)=>{let i=t?.output??process.stdout,e=t?.withGuide??settings.withGuide?`${styleText2("gray",S_BAR_END)} `:"";i.write(`${e}${styleText2("red",o)}
45
+
46
+ `)};var W$1=(o)=>o,C=(o,e,s)=>{let a={hard:!0,trim:!1},i=wrapAnsi(o,e,a).split(`
47
+ `),c=i.reduce((n,t)=>Math.max(dist_default2(t),n),0),u=i.map(s).reduce((n,t)=>Math.max(dist_default2(t),n),0),g=e-(u-c);return wrapAnsi(o,g,a)},note=(o="",e="",s)=>{let a=s?.output??process$1.stdout,i=s?.withGuide??settings.withGuide,c=s?.format??W$1,g=["",...C(o,getColumns(a)-6,c).split(`
48
+ `).map(c),""],n=dist_default2(e),t=Math.max(g.reduce((m,F)=>{let O=dist_default2(F);return O>m?O:m},0),n)+2,h=g.map((m)=>`${styleText2("gray",S_BAR)} ${m}${" ".repeat(t-dist_default2(m))}${styleText2("gray",S_BAR)}`).join(`
49
+ `),T=i?`${styleText2("gray",S_BAR)}
50
+ `:"",l$1=i?S_CONNECT_LEFT:S_CORNER_BOTTOM_LEFT;a.write(`${T}${styleText2("green",S_STEP_SUBMIT)} ${styleText2("reset",e)} ${styleText2("gray",S_BAR_H.repeat(Math.max(t-n-1,1))+S_CORNER_TOP_RIGHT)}
51
+ ${h}
52
+ ${styleText2("gray",l$1+S_BAR_H.repeat(t+2)+S_CORNER_BOTTOM_RIGHT)}
53
+ `)},password=(r)=>new u$1({validate:r.validate,mask:r.mask??S_PASSWORD_MASK,signal:r.signal,input:r.input,output:r.output,render(){let e=r.withGuide??settings.withGuide,o=`${e?`${styleText2("gray",S_BAR)}
54
+ `:""}${symbol(this.state)} ${r.message}
55
+ `,c=this.userInputWithCursor,i=this.masked;switch(this.state){case"error":{let s=e?`${styleText2("yellow",S_BAR)} `:"",n=e?`${styleText2("yellow",S_BAR_END)} `:"",l=i??"";return r.clearOnError&&this.clear(),`${o.trim()}
56
+ ${s}${l}
57
+ ${n}${styleText2("yellow",this.error)}
58
+ `}case"submit":{let s=e?`${styleText2("gray",S_BAR)} `:"",n=i?styleText2("dim",i):"";return`${o}${s}${n}`}case"cancel":{let s=e?`${styleText2("gray",S_BAR)} `:"",n=i?styleText2(["strikethrough","dim"],i):"";return`${o}${s}${n}${i&&e?`
59
+ ${styleText2("gray",S_BAR)}`:""}`}default:{let s=e?`${styleText2("cyan",S_BAR)} `:"",n=e?styleText2("cyan",S_BAR_END):"";return`${o}${s}${c}
60
+ ${n}
61
+ `}}}}).prompt();var W=(l)=>styleText2("magenta",l),spinner=({indicator:l="dots",onCancel:h,output:n=process.stdout,cancelMessage:G,errorMessage:O,frames:E=unicode?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],delay:F=unicode?80:120,signal:m,...I}={})=>{let u=isCI(),M,T,d=!1,S=!1,s="",p,w=performance.now(),x=getColumns(n),k=I?.styleFrame??W,g=(e)=>{let r=e>1?O??settings.messages.error:G??settings.messages.cancel;S=e===1,d&&(a(r,e),S&&typeof h=="function"&&h())},f=()=>g(2),i=()=>g(1),A=()=>{process.on("uncaughtExceptionMonitor",f),process.on("unhandledRejection",f),process.on("SIGINT",i),process.on("SIGTERM",i),process.on("exit",g),m&&m.addEventListener("abort",i)},H=()=>{process.removeListener("uncaughtExceptionMonitor",f),process.removeListener("unhandledRejection",f),process.removeListener("SIGINT",i),process.removeListener("SIGTERM",i),process.removeListener("exit",g),m&&m.removeEventListener("abort",i)},y=()=>{if(p===void 0)return;u&&n.write(`
62
+ `);let r=wrapAnsi(p,x,{hard:!0,trim:!1}).split(`
63
+ `);r.length>1&&n.write(import_sisteransi2.cursor.up(r.length-1)),n.write(import_sisteransi2.cursor.to(0)),n.write(import_sisteransi2.erase.down())},C=(e)=>e.replace(/\.+$/,""),_=(e)=>{let r=(performance.now()-e)/1000,t=Math.floor(r/60),o=Math.floor(r%60);return t>0?`[${t}m ${o}s]`:`[${o}s]`},N=I.withGuide??settings.withGuide,P=(e="")=>{d=!0,M=block({output:n}),s=C(e),w=performance.now(),N&&n.write(`${styleText2("gray",S_BAR)}
64
+ `);let r=0,t=0;A(),T=setInterval(()=>{if(u&&s===p)return;y(),p=s;let o=k(E[r]),v;if(u)v=`${o} ${s}...`;else if(l==="timer")v=`${o} ${s} ${_(w)}`;else{let B=".".repeat(Math.floor(t)).slice(0,3);v=`${o} ${s}${B}`}let j=wrapAnsi(v,x,{hard:!0,trim:!1});n.write(j),r=r+1<E.length?r+1:0,t=t<4?t+0.125:0},F)},a=(e="",r=0,t=!1)=>{if(!d)return;d=!1,clearInterval(T),y();let o=r===0?styleText2("green",S_STEP_SUBMIT):r===1?styleText2("red",S_STEP_CANCEL):styleText2("red",S_STEP_ERROR);s=e??s,t||(l==="timer"?n.write(`${o} ${s} ${_(w)}
65
+ `):n.write(`${o} ${s}
66
+ `)),H(),M()};return{start:P,stop:(e="")=>a(e,0),message:(e="")=>{s=C(e??s)},cancel:(e="")=>a(e,1),error:(e="")=>a(e,2),clear:()=>a("",0,!0),get isCancelled(){return S}}},u2={light:unicodeOr("\u2500","-"),heavy:unicodeOr("\u2501","="),block:unicodeOr("\u2588","#")};var SELECT_INSTRUCTIONS=[`${styleText2("dim","\u2191/\u2193")} to navigate`,`${styleText2("dim","Enter:")} confirm`],c=(t,o)=>t.includes(`
67
+ `)?t.split(`
68
+ `).map((d)=>o(d)).join(`
69
+ `):o(t),select=(t)=>{let o=(n,m)=>{if(n===void 0)return"";let s=n.label??String(n.value);switch(m){case"disabled":return`${styleText2("gray",S_RADIO_INACTIVE)} ${c(s,(i)=>styleText2("gray",i))}${n.hint?` ${styleText2("dim",`(${n.hint??"disabled"})`)}`:""}`;case"selected":return`${c(s,(i)=>styleText2("dim",i))}`;case"active":return`${styleText2("green",S_RADIO_ACTIVE)} ${s}${n.hint?` ${styleText2("dim",`(${n.hint})`)}`:""}`;case"cancelled":return`${c(s,(i)=>styleText2(["strikethrough","dim"],i))}`;default:return`${styleText2("dim",S_RADIO_INACTIVE)} ${c(s,(i)=>styleText2("dim",i))}`}},d=t.showInstructions??!0;return new n$1({options:t.options,signal:t.signal,input:t.input,output:t.output,initialValue:t.initialValue,render(){let n=t.withGuide??settings.withGuide,m=`${symbol(this.state)} `,s=`${symbolBar(this.state)} `,i=wrapTextWithPrefix(t.output,t.message,s,m),u=`${n?`${styleText2("gray",S_BAR)}
70
+ `:""}${i}
71
+ `;switch(this.state){case"submit":{let r=n?`${styleText2("gray",S_BAR)} `:"",a=wrapTextWithPrefix(t.output,o(this.options[this.cursor],"selected"),r);return`${u}${a}`}case"cancel":{let r=n?`${styleText2("gray",S_BAR)} `:"",a=wrapTextWithPrefix(t.output,o(this.options[this.cursor],"cancelled"),r);return`${u}${a}${n?`
72
+ ${styleText2("gray",S_BAR)}`:""}`}default:{let r=n?`${styleText2("cyan",S_BAR)} `:"",a=u.split(`
73
+ `).length,p=d?formatInstructionFooter(SELECT_INSTRUCTIONS,n):n?[styleText2("cyan",S_BAR_END)]:[],b=p.join(`
74
+ `),f=p.length+1;return`${u}${r}${limitOptions({output:t.output,cursor:this.cursor,options:this.options,maxItems:t.maxItems,columnPadding:r.length,rowPadding:a+f,style:(g,x)=>o(g,g.disabled?"disabled":x?"active":"inactive")}).join(`
75
+ ${r}`)}
76
+ ${b}
77
+ `}}}}).prompt()};var i=`${styleText2("gray",S_BAR)} `;var text=(e)=>new n({validate:e.validate,placeholder:e.placeholder,defaultValue:e.defaultValue,initialValue:e.initialValue,output:e.output,signal:e.signal,input:e.input,render(){let i=e?.withGuide??settings.withGuide,s=`${`${i?`${styleText2("gray",S_BAR)}
78
+ `:""}${symbol(this.state)} `}${e.message}
79
+ `,c=e.placeholder&&e.placeholder.length>0?styleText2("inverse",e.placeholder[0])+styleText2("dim",e.placeholder.slice(1)):styleText2(["inverse","hidden"],"_"),o=this.userInput?this.userInputWithCursor:c,l=this.value??"";switch(this.state){case"error":{let n=this.error?` ${styleText2("yellow",this.error)}`:"",r=i?`${styleText2("yellow",S_BAR)} `:"",d=i?styleText2("yellow",S_BAR_END):"";return`${s.trim()}
80
+ ${r}${o}
81
+ ${d}${n}
82
+ `}case"submit":{let n=l?` ${styleText2("dim",l)}`:"",r=i?styleText2("gray",S_BAR):"";return`${s}${r}${n}`}case"cancel":{let n=l?` ${styleText2(["strikethrough","dim"],l)}`:"",r=i?styleText2("gray",S_BAR):"";return`${s}${r}${n}${l.trim()?`
83
+ ${r}`:""}`}default:{let n=i?`${styleText2("cyan",S_BAR)} `:"",r=i?styleText2("cyan",S_BAR_END):"";return`${s}${n}${o}
84
+ ${r}
85
+ `}}}}).prompt();import{readFile}from"fs/promises";import{dirname,join,resolve}from"path";async function findDesignConfig(startPath){let dir=resolve(startPath);if(!dir.endsWith("/"))dir=dirname(dir);while(!0){let candidate=join(dir,".design","config.json");try{let raw=await readFile(candidate,"utf8"),config=ConfigSchema.parse(JSON.parse(raw));return{folder:dir,config}}catch(err){if(err.code!=="ENOENT")throw err}let parent=dirname(dir);if(parent===dir)return null;dir=parent}}import{existsSync,readdirSync,realpathSync}from"fs";import{readdir,readFile as readFile2}from"fs/promises";import{join as join2,relative,resolve as resolve2,sep}from"path";var DEFAULT_FOLDER="velloo",FOLDER_ARG_DESCRIPTION="A velloo.json project name or a design-folder path (default: resolve via velloo.json, else ./velloo or the nearest design folder above the cwd)";async function existingDesignFolder(appRoot){try{let found=await findProjects(appRoot);for(let folder of found?.folders.values()??[])if(await hasDesignConfig(folder))return folder}catch{}let conventional=join2(resolve2(appRoot),DEFAULT_FOLDER);if(await hasDesignConfig(conventional))return conventional;let[first]=await discoverDesignFolders(resolve2(appRoot));return first??null}function isDesignFolderSync(dir){return existsSync(join2(dir,".design","config.json"))}function isEmptyOrMissingSync(dir){try{return readdirSync(dir).length===0}catch(err){if(err.code==="ENOENT")return!0;throw err}}async function hasDesignConfig(dir){try{return await readFile2(join2(dir,".design","config.json"),"utf8"),!0}catch{return!1}}async function projectFolder(projects,name,abort){let folder=projects.folders.get(name),local=projects.local.find((design)=>design.projectName===name),repo=projects.repo;if(!local&&repo){let entry=repo.manifest.projects[name],root=realpathSync(repo.dir),target=existsSync(folder)?realpathSync(folder):resolve2(root,relative(repo.dir,folder)),rel=relative(root,target);if(rel===".."||rel.startsWith(`..${sep}`)||/^[A-Za-z]:[\\/]/.test(entry))abort(`project ${JSON.stringify(name)} in ${repo.path} points outside the repository (${entry}), which velloo.json cannot authorize. Pass the design path explicitly, or run \`velloo folder bind ${entry}\` here to keep it as a local design on this machine.`)}if(!await hasDesignConfig(folder))abort(`project ${JSON.stringify(name)} ${local?"(a local design)":`in ${repo?.path}`} points at ${folder}, which is not a velloo design folder (no .design/config.json).`);return folder}function projectsLabel(projects){return projects.repo?.path??"this checkout's local designs"}async function resolveDesignFolder(arg,cmd,opts={}){let abort=opts.onFail??((m)=>fail(cmd,m)),cwd=resolve2(opts.cwd??"."),projects=null;try{projects=await findProjects(cwd)}catch(err){abort(err.message)}if(arg){if(projects&&!arg.includes(sep)&&projects.folders.has(arg))return projectFolder(projects,arg,abort);let explicit=resolve2(cwd,arg);if(await hasDesignConfig(explicit))return explicit;let explicitProjects=await findProjects(explicit).catch(()=>null);if(explicitProjects?.folders.size&&(explicitProjects.repo?.dir===explicit||explicitProjects.local.some((design)=>resolve2(design.root)===explicit)))return resolveDesignFolder(void 0,cmd,{...opts,cwd:explicit});let nested=join2(explicit,DEFAULT_FOLDER);if(await hasDesignConfig(nested))return nested;if(projects&&!arg.includes(sep))abort(`unknown project ${JSON.stringify(arg)} \u2014 ${projectsLabel(projects)} lists: ${[...projects.folders.keys()].join(", ")}. Pass a project name or a folder path.`);if(opts.requireConfig)abort(`${explicit} is not a velloo design folder (no .design/config.json).`);return explicit}if(projects&&projects.folders.size>0){if(await hasDesignConfig(cwd))return cwd;let picked=pickProject(projects,cwd);if(picked)return projectFolder(projects,picked,abort);let names=[...projects.folders.keys()];if(opts.interactive&&process.stdin.isTTY){let set=projects,chosen=await select({message:"Which project?",options:names.map((n)=>({value:n,label:n,hint:relative(cwd,set.folders.get(n))}))});if(isCancel(chosen))abort("cancelled.");return projectFolder(projects,chosen,abort)}abort(`${projectsLabel(projects)} lists several projects: ${names.join(", ")}. Pass one (e.g. \`velloo ${cmd} ${names[0]}\`)${projects.repo?' or set "defaultProject"':""}.`)}let here=join2(cwd,DEFAULT_FOLDER);if(await hasDesignConfig(here))return here;if(await hasDesignConfig(cwd))return cwd;let found=await findDesignConfig(cwd);if(found)return found.folder;abort(`no design folder found. Pass one (e.g. \`velloo ${cmd} ./velloo\`), run from a folder that contains a Velloo design, or \`velloo init\` first.${movedCheckoutHint()}`)}function movedCheckoutHint(){let orphans=listLocalDesigns().filter((design)=>!existsSync(design.root));if(orphans.length===0)return"";return`
86
+ Local designs whose checkout moved:${orphans.map((design)=>`
87
+ ${design.projectName} \u2014 ${design.designRoot} (was for ${design.root})`).join("")}
88
+ Run \`velloo folder bind <design folder>\` from the new checkout.`}async function resolveDesignLocation(arg,cmd,opts={}){let designRoot=await resolveDesignFolder(arg,cmd,opts),local=localDesignOf(designRoot);if(local)return{designRoot,manifestPath:void 0,appRoot:local.appRoot,projectName:local.projectName};let found=await findManifest(opts.cwd??designRoot);return{designRoot,manifestPath:found?.path,appRoot:found?.dir,projectName:[...found?.folders??[]].find(([,path])=>path===designRoot)?.[0]}}async function listScreens(folder){let files;try{files=(await readdir(join2(folder,"screens"))).filter((f)=>f.endsWith(".json"))}catch{return[]}let out=[];for(let f of files.sort()){let path=join2(folder,"screens",f);try{let s=ScreenSchema.parse(JSON.parse(await readFile2(path,"utf8")));out.push({id:s.id,name:s.name||s.id,path})}catch{}}return out}async function listBoards(folder){let files;try{files=(await readdir(join2(folder,"boards"))).filter((f)=>f.endsWith(".json"))}catch{return[]}let out=[];for(let f of files.sort())try{let b=BoardSchema.parse(JSON.parse(await readFile2(join2(folder,"boards",f),"utf8")));out.push({id:b.id,name:b.name||b.id,screens:b.frames.map((fr)=>fr.screen),archived:isArchived(b)})}catch{}return out}function boardsByScreen(boards){let map=new Map;for(let b of boards)for(let sid of b.screens){let names=map.get(sid)??[];names.push(b.name),map.set(sid,names)}return map}async function pickBoards(folder,arg,interactive,cmd){let all=await listBoards(folder);if(all.length===0)return[];if(arg){let ids=new Set(arg.split(",").map((s)=>s.trim()).filter(Boolean)),chosen=all.filter((b)=>ids.has(b.id));if(chosen.length===0)fail(cmd,`no boards matched "${arg}". Available: ${all.map((b)=>b.id).join(", ")}`);return chosen}let boards=all.filter((b)=>!b.archived);if(boards.length===0)return[];if(!interactive)return boards;let chosen=await multiselect(boardSelectionPrompt(boards));if(isCancel(chosen))fail(cmd,"cancelled.");return resolveBoardSelection(boards,chosen)}function boardSelectionPrompt(boards){return{message:"Which boards to publish? (a: select all / clear all)",options:boards.map((board)=>({value:board.id,label:board.name,hint:`${board.screens.length} screen${board.screens.length===1?"":"s"}`})),initialValues:[],required:!1}}function resolveBoardSelection(boards,selectedIds){let selected=new Set(selectedIds),chosen=boards.filter((board)=>selected.has(board.id));return chosen.length>0?chosen:null}async function pickScreen(folder,arg,interactive,cmd){let screens=await listScreens(folder);if(arg){let byId=screens.find((s)=>s.id===arg);if(byId)return byId;return{id:arg,name:arg,path:resolve2(arg)}}if(screens.length===0)fail(cmd,`no screens found in ${folder}/screens.`);if(screens.length===1)return screens[0];if(!interactive)fail(cmd,`pick a screen: ${screens.map((s)=>s.id).join(", ")}`);let onBoard=boardsByScreen(await listBoards(folder)),chosen=await select({message:"Which screen?",options:screens.map((s)=>({value:s.id,label:s.name,hint:onBoard.get(s.id)?.join(", ")??`${s.id}.json`}))});if(isCancel(chosen))fail(cmd,"cancelled.");return screens.find((s)=>s.id===chosen)}
89
+ export{isCancel,confirm,multiselect,log,cancel,note,password,spinner,select,text,findDesignConfig,FOLDER_ARG_DESCRIPTION,existingDesignFolder,isDesignFolderSync,isEmptyOrMissingSync,hasDesignConfig,resolveDesignFolder,resolveDesignLocation,pickBoards,pickScreen};
@@ -0,0 +1,5 @@
1
+ // @bun
2
+ import{ok,err,PRICING_URL,PROTECTED_SHARES_UNAVAILABLE,PublishDestinationsResponseSchema,LinkResponseSchema,LinkAccessResponseSchema,VersionUploadResponseSchema,PublishedDesignsResponseSchema,TeamsResponseSchema,unreachable,protocolViolation,uploadRaceLost,readFailure,cloudFailure,httpFailureFrom,boardLimitFrom,describeBoardLimit,describeCloudError,cloudJson,cloudFetch}from"./chunk-mq4znqv2.js";import{prettifyError,string,number,boolean,array,object,strictObject,record,literal,AnnotationSchema,CanvasNoteSchema,BoardSchema,ExtensionSchema,ViewportPresetSchema,LibrarySchema,ScreenSchema,SnippetSchema,ThemeSchema,ViewportSchema}from"./chunk-bk8b7f9a.js";import{buildBoardComposite,MAX_CONCURRENT_RENDERS,renderScreen,captureScreenshot}from"./chunk-w5rzk6ms.js";import{writeJsonAtomic,managedDesignId,localDesignOf,orderedBoards,activeBoards,registryForScreen,renderPassForScreen,liveExtensions,LiveBundler}from"./chunk-329e3phg.js";import{withAssetServer}from"./chunk-9vg3yafz.js";import{checkCloudHealth}from"./chunk-2z0k59hz.js";var VERSION_UPLOAD_TIMEOUT_MS=60000,VERSION_UPLOAD_RETRIES=1;async function listPublishDestinations(opts){let query=new URLSearchParams({folderId:opts.folderId});if(opts.teamId)query.set("teamId",opts.teamId);return cloudFetch(`${opts.baseUrl}/v1/publish-destinations?${query}`,PublishDestinationsResponseSchema,{operation:"listing publish destinations",token:opts.token})}async function uploadLinkBundle(opts){let{baseUrl,token,form}=opts,authorized={authorization:`Bearer ${token}`},createRes=await fetch(`${baseUrl}/v1/links`,{method:"POST",headers:authorized,body:JSON.stringify(opts.link)}).catch((error)=>error);if(!(createRes instanceof Response))return err(unreachable(createRes,{url:baseUrl}));if(createRes.status!==200&&createRes.status!==201)return err(await httpFailureFrom("link creation",createRes));let created=createRes.status===201,createdLink=await cloudJson(createRes,LinkResponseSchema,"link creation");if(!createdLink.ok)return createdLink;let link=createdLink.value;if(opts.link.publishMode==="new"&&!created)return err(protocolViolation("the cloud reused a link even though a new publish destination was requested"));if(opts.link.publishMode==="update"&&created)return await fetch(`${baseUrl}/v1/links/${link.slug}`,{method:"DELETE",headers:authorized}).catch(()=>{}),err(protocolViolation("the cloud created a link even though an existing destination was selected"));if(!created){let accessRes=await fetch(`${baseUrl}/v1/links/${link.slug}/access`,{method:"PUT",headers:{...authorized,"content-type":"application/json"},body:JSON.stringify({visibility:opts.link.visibility,password:opts.link.password??null,passwordExpiresAt:opts.link.password?opts.link.passwordExpiresAt??null:null,expectedVersionId:opts.link.expectedVersionId??null})});if(!accessRes.ok)return err(await httpFailureFrom("privacy update",accessRes));let access=await cloudJson(accessRes,LinkAccessResponseSchema,"privacy update");if(!access.ok)return access;link={...link,...access.value}}if(form.append("publishMode",opts.link.publishMode),opts.link.expectedVersionId)form.append("expectedVersionId",opts.link.expectedVersionId);let attempt=await uploadVersionWithRetry({url:`${baseUrl}/v1/links/${link.slug}/versions`,headers:authorized,form,timeoutMs:opts.uploadTimeoutMs??VERSION_UPLOAD_TIMEOUT_MS,retries:opts.uploadRetries??VERSION_UPLOAD_RETRIES});if(!attempt.ok)return attempt;let upload=attempt.value,uploadRes=upload.response;if(uploadRes.status!==201){let{detail,code}=await readFailure(uploadRes);if(upload.transientFailures>0&&uploadRes.status===409&&/slot changed|already has a version/i.test(detail))return err(uploadRaceLost());if(created)await fetch(`${baseUrl}/v1/links/${link.slug}`,{method:"DELETE",headers:authorized}).catch(()=>{});return err(cloudFailure("upload",uploadRes.status,detail,code))}let parsed=await cloudJson(uploadRes,VersionUploadResponseSchema,"upload");if(!parsed.ok)return parsed;let uploaded=parsed.value;return ok({link:{slug:link.slug,visibility:link.visibility??opts.link.visibility,passwordProtected:link.passwordProtected??opts.link.password!=null},created,files:uploaded.files,bytes:uploaded.bytes,shareUrl:uploaded.url.startsWith("http")?uploaded.url:`${baseUrl}${uploaded.url}`,...uploaded.tier!==void 0?{tier:uploaded.tier}:{},...uploaded.history!==void 0?{history:uploaded.history}:{}})}async function uploadVersionWithRetry(opts){let attempts=Math.max(1,Math.floor(opts.retries)+1),transientFailures=0,lastNetworkError="unknown network error",lastTimedOut=!1;for(let attempt=1;attempt<=attempts;attempt+=1){let controller=new AbortController,timedOut=!1,timer=setTimeout(()=>{timedOut=!0,controller.abort()},Math.max(1,opts.timeoutMs));try{let response=await fetch(opts.url,{method:"POST",headers:opts.headers,body:opts.form,signal:controller.signal});if(response.status<500||attempt===attempts)return ok({response,transientFailures});transientFailures+=1,await response.body?.cancel().catch(()=>{})}catch(error){if(transientFailures+=1,lastTimedOut=timedOut,lastNetworkError=error instanceof Error?error.message:String(error),attempt===attempts){let retried=attempts>1?` after ${attempts} attempts`:"";return err(timedOut?unreachable(`timed out after ${formatDuration(opts.timeoutMs)}${retried}`,{url:opts.url,timedOut:!0}):unreachable(`version upload${retried}: ${lastNetworkError}`,{url:opts.url}))}}finally{clearTimeout(timer)}}return err(lastTimedOut?unreachable(`timed out after ${formatDuration(opts.timeoutMs)}`,{url:opts.url,timedOut:!0}):unreachable(`version upload: ${lastNetworkError}`,{url:opts.url}))}function formatDuration(ms){return ms>=1000?`${Math.round(ms/1000)}s`:`${Math.max(1,Math.round(ms))}ms`}var cloudUnhealthy=(detail)=>({kind:"CloudUnhealthy",detail}),noScreens=(root)=>({kind:"NoScreens",root}),noBoardScreens=()=>({kind:"NoBoardScreens"}),bundleInvalid=(detail)=>({kind:"BundleInvalid",detail}),teamNotFound=(requested)=>({kind:"TeamNotFound",requested}),teamAmbiguous=(requested)=>({kind:"TeamAmbiguous",requested});function describePublishError(error){switch(error.kind){case"CloudUnhealthy":return error.detail;case"NoScreens":return`no screens found in ${error.root} \u2014 is this a velloo design folder?`;case"NoBoardScreens":return"the selected boards have no screens.";case"BundleInvalid":return`velloo built an invalid design bundle and did not upload it: ${error.detail}. This is a bug \u2014 please report it.`;case"TeamNotFound":return`no team named or identified by '${error.requested}'`;case"TeamAmbiguous":return`more than one team is named '${error.requested}'; pass its UUID`;case"HttpFailure":{if(error.status===403&&/protected shares/i.test(error.detail))return`${PROTECTED_SHARES_UNAVAILABLE}. Publish publicly, or upgrade at ${PRICING_URL}`;let limit=boardLimitFrom(error);if(limit)return`${describeBoardLimit(limit)}. Run \`velloo publish --list\` to see them, or upgrade at ${PRICING_URL}`;return describeCloudError(error)}default:return describeCloudError(error)}}import{execFileSync}from"child_process";import{readFile}from"fs/promises";import{join}from"path";var DESIGN_BUNDLE_FORMAT=1,BundleScreenshotsSchema=object({cover:string().optional(),screens:record(string(),string()).optional(),boards:record(string(),string()).optional()}),DesignBundleMetaSchema=object({formatVersion:number().int().positive().optional(),title:string().optional(),screens:array(object({id:string(),name:string().optional()})).optional(),boards:array(object({id:string()})).optional(),screenshots:BundleScreenshotsSchema.optional()});var DesignBundleSchema=strictObject({formatVersion:literal(DESIGN_BUNDLE_FORMAT),title:string(),viewport:ViewportSchema,defaultLibrary:string(),libraries:record(string(),LibrarySchema),extensions:record(string(),ExtensionSchema),viewportPresets:array(ViewportPresetSchema),theme:ThemeSchema,themes:record(string(),ThemeSchema),customCss:string(),snippets:array(SnippetSchema),screens:array(ScreenSchema),boards:array(BoardSchema),annotations:record(string(),array(AnnotationSchema)),notes:record(string(),array(CanvasNoteSchema)),live:boolean(),snapshotCssPath:string(),bundlePath:string().optional(),screenshots:object({cover:string(),screens:record(string(),string()),boards:record(string(),string())}).optional()});import{homedir}from"os";import{delimiter,dirname,resolve}from"path";function designGitEnv(folder){let ceilings=[homedir()];if(managedDesignId(folder)||localDesignOf(folder))ceilings.push(dirname(resolve(folder)));let inherited=process.env.GIT_CEILING_DIRECTORIES;if(inherited)ceilings.push(inherited);return{...process.env,GIT_CEILING_DIRECTORIES:ceilings.join(delimiter)}}var MAX_SCREENSHOT_BYTES=4194304,MAX_SCREENSHOT_COUNT=120,DOWNSCALE_WIDTH=1280;function isBrowserMissing(err){return err instanceof Error&&err.name==="BrowserMissingError"}async function captureBundleScreenshots(opts){let{screens,boards,viewport,renderHtml,capture,warn,progress}=opts,selectedScreens=opts.screenIds?screens.filter((screen)=>opts.screenIds?.has(screen.id)):screens,selectedBoards=opts.boardIds?boards.filter((board)=>opts.boardIds?.has(board.id)):boards,manifest={cover:"",screens:{},boards:{}},total=selectedScreens.length+selectedBoards.filter((board)=>board.frames.length>0).length,done=0,advance=()=>{done+=1,progress?.(done,total)},shoot=async(html,vp,fullPage)=>{let png=await capture({html,viewport:vp,fullPage,deviceScaleFactor:1});if(png.byteLength>MAX_SCREENSHOT_BYTES&&DOWNSCALE_WIDTH<vp.w)png=await capture({html,viewport:vp,fullPage,deviceScaleFactor:DOWNSCALE_WIDTH/vp.w});return png.byteLength<=MAX_SCREENSHOT_BYTES?png:null},jobs=[];for(let screen of selectedScreens)jobs.push({run:async()=>{try{let png=await shoot(await renderHtml(screen),viewport,!0);if(!png)return warn(`screenshot of screen "${screen.id}" exceeds 4MB even downscaled \u2014 skipped`),null;return{kind:"screen",id:screen.id,path:`screenshots/${screen.id}.png`,bytes:png}}catch(err){if(isBrowserMissing(err))throw err;return warn(`screenshot of screen "${screen.id}" failed \u2014 skipped (${message(err)})`),null}finally{advance()}}});let screenById=new Map(screens.map((screen)=>[screen.id,screen]));for(let board of selectedBoards){if(board.frames.length===0)continue;jobs.push({run:async()=>{try{let framed=(await Promise.all(board.frames.map(async(frame)=>{let screen=screenById.get(frame.screen);return screen?{frame,html:await renderHtml(screen,board.theme,frame.scheme??"light")}:null}))).filter((entry)=>entry!==null);if(framed.length===0)return null;let composite=buildBoardComposite(framed),png=await shoot(composite.html,composite.viewport,!1);if(!png)return warn(`screenshot of board "${board.id}" exceeds 4MB even downscaled \u2014 skipped`),null;return{kind:"board",id:board.id,path:`screenshots/${board.id}.png`,bytes:png}}catch(err){if(isBrowserMissing(err))throw err;return warn(`screenshot of board "${board.id}" failed \u2014 skipped (${message(err)})`),null}finally{advance()}}})}let shotLimit=MAX_SCREENSHOT_COUNT-1,results=Array.from({length:jobs.length},()=>null),nextJob=0,completedShots=0,reservedShots=0,browserMissing=!1,worker=async()=>{while(!browserMissing&&nextJob<jobs.length&&completedShots+reservedShots<shotLimit){let index=nextJob++;reservedShots+=1;try{let shot=await jobs[index]?.run();if(shot)results[index]=shot,completedShots+=1}catch(err){if(isBrowserMissing(err))browserMissing=!0;else throw err}finally{reservedShots-=1}}},concurrency=Math.max(1,Math.min(MAX_CONCURRENT_RENDERS,Math.floor(opts.concurrency??MAX_CONCURRENT_RENDERS)));if(await Promise.all(Array.from({length:Math.min(concurrency,jobs.length)},worker)),browserMissing)return warn("no headless browser available \u2014 publishing without screenshots"),null;if(nextJob<jobs.length)warn(`screenshot limit (${MAX_SCREENSHOT_COUNT}) reached \u2014 remaining shots skipped`);let files=[];for(let shot of results){if(!shot)continue;if(files.push({path:shot.path,bytes:shot.bytes}),shot.kind==="screen")manifest.screens[shot.id]=shot.path;else manifest.boards[shot.id]=shot.path}let coverSource=selectedBoards.map((b)=>manifest.boards[b.id]).find((p)=>p!==void 0)??selectedScreens.map((s)=>manifest.screens[s.id]).find((p)=>p!==void 0);if(!coverSource)return null;let source=files.find((f)=>f.path===coverSource);if(!source)return null;return manifest.cover="screenshots/cover.png",files.push({path:manifest.cover,bytes:source.bytes}),{manifest,files}}function message(err){let msg=err instanceof Error?err.message:String(err);return msg.split(`
3
+ `)[0]??msg}var normalizedBoardIds=(boardIds)=>[...new Set(boardIds)].sort();function publishSlotMismatches(slot,current){let mismatches=[];if(!slot.context.contextKnown)mismatches.push("older publish has no board-selection context");if(slot.teamId!==current.teamId)mismatches.push("team differs");if(JSON.stringify(normalizedBoardIds(slot.context.boardIds))!==JSON.stringify(normalizedBoardIds(current.boardIds)))mismatches.push("board selection differs");if(slot.context.repo!==current.repo)mismatches.push("repository differs");else if(current.repo!==null){if(!slot.context.branch||!current.branch)mismatches.push("branch is unavailable");else if(slot.context.branch!==current.branch)mismatches.push("branch differs")}return mismatches}function recommendedPublishSlot(slots,current){return exactPublishSlots(slots,current)[0]??null}function exactPublishSlots(slots,current){return slots.filter((slot)=>publishSlotMismatches(slot,current).length===0).sort((left,right)=>publishedAt(right.lastPublishedAt)-publishedAt(left.lastPublishedAt))}var publishedAt=(value)=>{let parsed=value?Date.parse(value):Number.NaN;return Number.isFinite(parsed)?parsed:Number.NEGATIVE_INFINITY},PUBLISH_VIEWPORT={w:1440,h:900};function defaultPublishTitle(folderRoot){return`${localDesignOf(folderRoot)?.projectName??folderRoot.split("/").filter(Boolean).pop()} designs`}async function ensureFolderId(folder,existing,report){if(existing)return existing;let path=join(folder,".design","config.json"),raw=JSON.parse(await readFile(path,"utf8")),folderId=crypto.randomUUID();return await writeJsonAtomic(path,{...raw,folderId}),report({kind:"note",message:"assigned this folder a cloud id (.design/config.json folderId) \u2014 commit it so every clone finds the folder's share links."}),folderId}function reportProvenance(git,report){if(git.repo){report({kind:"info",message:git.branch?`source: ${git.repo} on ${git.branch}`:`source: ${git.repo} (detached HEAD \u2014 no branch recorded)`});return}report({kind:"info",message:git.branch?`source: branch ${git.branch} \u2014 no git remote, publishing without a repository`:"source: not a git repository \u2014 publishing without repository or branch"})}function gitProbe(folder){return{encoding:"utf8",stdio:["ignore","pipe","ignore"],env:designGitEnv(folder)}}function gitCommitSha(folder){try{let probe=gitProbe(folder);if(execFileSync("git",["-C",folder,"status","--porcelain"],probe).trim().length>0)return null;return execFileSync("git",["-C",folder,"rev-parse","HEAD"],probe).trim()}catch{return null}}function normalizeRemote(url){let rest=url.trim().replace(/\.git\/?$/,"");if(/^[./~]/.test(rest)||/^[a-z]:[\\/]/i.test(rest)||rest.startsWith("file://"))return null;let scp=/^(?:[\w.-]+@)?([\w.-]+):(?!\/\/)(.+)$/.exec(rest);if(scp?.[1]&&scp[2])return`${scp[1]}/${scp[2].replace(/^\/+/,"")}`;try{let parsed=new URL(rest.includes("://")?rest:`https://${rest}`);if(!parsed.hostname||!parsed.pathname||parsed.pathname==="/")return null;return`${parsed.hostname}${parsed.pathname.replace(/\/+$/,"")}`}catch{return null}}function gitContext(folder){let probe=gitProbe(folder),run=(args)=>{try{return execFileSync("git",["-C",folder,...args],probe).trim()||null}catch{return null}},branchRaw=run(["rev-parse","--abbrev-ref","HEAD"]),remote=run(["remote","get-url","origin"]);return{repo:remote?normalizeRemote(remote):null,branch:branchRaw==="HEAD"?null:branchRaw}}async function resolveTeam(baseUrl,token,requested){if(!requested)return ok(void 0);let listed=await listTeams(baseUrl,token);if(!listed.ok)return listed;let exact=listed.value.filter((team)=>team.id===requested||team.name.toLowerCase()===requested.toLowerCase());if(exact.length===0)return err(teamNotFound(requested));if(exact.length>1)return err(teamAmbiguous(requested));return ok(exact[0]?.id)}async function listTeams(baseUrl,token){let body=await cloudFetch(`${baseUrl}/v1/teams/mine`,TeamsResponseSchema,{operation:"listing teams",token});return body.ok?ok(body.value.teams):body}function selectBoards(design,boardIds){if(!boardIds||boardIds.length===0)return activeBoards(design).map(([,board])=>board);let wanted=new Set(boardIds);return orderedBoards(design).map(([,board])=>board).filter((board)=>wanted.has(board.id))}async function publishDesign(cloud,pipeline,request,report=()=>{}){let{folder:design}=pipeline,{root,config}=design;report({kind:"step",step:"check",message:"checking the cloud"});let health=await checkCloudHealth(cloud.baseUrl);if(health.status==="unreachable")return err(unreachable(health.reason,{url:cloud.baseUrl}));if(health.status==="unhealthy")return err(cloudUnhealthy(health.detail));if(design.screens.size===0)return err(noScreens(root));report({kind:"step",step:"select",message:"collecting boards"});let boards=selectBoards(design,request.boardIds),screenIds=Boolean(request.boardIds&&request.boardIds.length>0)?new Set(boards.flatMap((b)=>b.frames.map((f)=>f.screen))):null,screens=screenIds?[...design.screens.values()].filter((s)=>screenIds.has(s.id)):[...design.screens.values()];if(screens.length===0)return err(noBoardScreens());let viewport=request.viewport??PUBLISH_VIEWPORT,title=request.title?.trim()||defaultPublishTitle(root),form=new FormData,bundleFiles=0,bundleBytes=0,addFile=(path,data,type)=>{if(typeof data==="string"?data.length===0:data.byteLength===0)return report({kind:"warn",message:`skipped empty file: ${path}`}),!1;return form.append("file",new File([data],path,type?{type}:void 0)),bundleFiles+=1,bundleBytes+=typeof data==="string"?new TextEncoder().encode(data).byteLength:data.byteLength,!0},liveExt=liveExtensions(config.extensions),bundler=Object.keys(liveExt).length>0?pipeline.liveBundler??createPublishBundler(root,config):null;report({kind:"step",step:"styles",message:"compiling styles"});let snapshotCss=await pipeline.snapshotCss(),live=!1,liveCode=null;if(bundler){report({kind:"step",step:"bundle",message:"bundling live components"});let bundle=await bundler.build();for(let e of bundle.errors)report({kind:"warn",message:`live-island: ${e.message}`});if(addFile("bundle.js",bundle.code,"text/javascript"))liveCode=bundle.code,live=!0}report({kind:"step",step:"capture",message:"capturing previews"});let shots=await withAssetServer(root,liveCode,(baseHref)=>{let htmlCache=new Map,renderHtml=async(screen,themeName,scheme="light")=>{let theme=(themeName?design.themes.get(themeName):void 0)??design.theme,key=`${screen.id}\x00${theme.name}\x00${scheme}`,cached=htmlCache.get(key);if(cached)return cached;let rendering=renderScreen(screen,theme,{viewport,snapshotCss,registry:registryForScreen(screen,pipeline.providers,pipeline.defaultProvider,config.extensions??{}),renderPass:renderPassForScreen(screen,pipeline.providers,pipeline.defaultProvider,theme),snippets:design.snippets,customCss:design.customCss,dark:scheme==="dark",baseHref,...live?{liveBundleUrl:"/live/bundle.js"}:{}}).then(({html})=>html);return htmlCache.set(key,rendering),rendering};return captureBundleScreenshots({screens,boards,...request.screenshotSelection?{screenIds:request.screenshotSelection.screenIds,boardIds:request.screenshotSelection.boardIds}:{},viewport,renderHtml,capture:async(req)=>(await captureScreenshot({html:req.html,viewport:req.viewport,fullPage:req.fullPage,deviceScaleFactor:req.deviceScaleFactor})).png,warn:(message)=>report({kind:"warn",message}),progress:(done,total)=>report({kind:"capture",done,total})})});for(let f of shots?.files??[])addFile(f.path,f.bytes,"image/png");let annotations=Object.fromEntries([...design.annotations].filter(([screenId,list])=>list.length>0&&screens.some((s)=>s.id===screenId))),notes=Object.fromEntries([...design.notes].filter(([boardId,list])=>list.length>0&&boards.some((b)=>b.id===boardId))),designDoc={formatVersion:DESIGN_BUNDLE_FORMAT,title,viewport,defaultLibrary:config.defaultLibrary,libraries:config.libraries,extensions:config.extensions??{},viewportPresets:config.viewportPresets??[],theme:design.theme,themes:Object.fromEntries(design.themes),customCss:design.customCss,snippets:[...design.snippets.values()],screens,boards,annotations,notes,live,snapshotCssPath:"snapshot.css",...live?{bundlePath:"bundle.js"}:{},...shots?{screenshots:shots.manifest}:{}},validated=DesignBundleSchema.safeParse(designDoc);if(!validated.success)return err(bundleInvalid(prettifyError(validated.error)));addFile("design.json",JSON.stringify(designDoc),"application/json"),addFile("snapshot.css",snapshotCss||`/* this folder uses no CSS framework */
4
+ `,"text/css");let assetRefs=new Set,assetRe=/\/assets\/[A-Za-z0-9._@\-/]+/g;for(let source of[...screens,...design.snippets.values()])for(let m of JSON.stringify(source).matchAll(assetRe))assetRefs.add(m[0]);for(let ref of assetRefs){let rel=ref.replace(/^\//,"");try{addFile(rel,await readFile(join(root,rel)))}catch{report({kind:"warn",message:`asset not found: ${rel}`})}}let commitSha=gitCommitSha(root);if(commitSha)form.append("commitSha",commitSha);let git=request.provenance??gitContext(root);if(reportProvenance(git,report),git.repo)form.append("gitRepo",git.repo);if(git.branch)form.append("gitBranch",git.branch);let folderId=await ensureFolderId(root,config.folderId,report);report({kind:"step",step:"upload",message:`uploading ${bundleFiles} file${bundleFiles===1?"":"s"} (${formatBytes(bundleBytes)})`});let uploaded=await uploadLinkBundle({baseUrl:cloud.baseUrl,token:cloud.token,link:{...request.destination.slug?{slug:request.destination.slug}:{},folderId,publishMode:request.destination.mode,...request.destination.mode==="update"?{expectedVersionId:request.destination.expectedVersionId}:{},title,visibility:request.visibility,...request.teamId?{teamId:request.teamId}:{},...request.password?{password:request.password}:{},...request.passwordExpiresAt?{passwordExpiresAt:request.passwordExpiresAt}:{}},form});if(!uploaded.ok)return uploaded;let upload=uploaded.value;return ok({shareUrl:upload.shareUrl,visibility:upload.link.visibility,passwordProtected:upload.link.passwordProtected,files:upload.files,bytes:upload.bytes,screenshots:shots?.files.length??0,boards:boards.length,screens:screens.length,commitSha,created:upload.created,...upload.tier!==void 0?{tier:upload.tier}:{},...upload.history!==void 0?{history:upload.history}:{}})}function formatBytes(bytes){if(bytes>=1048576)return`${(bytes/1048576).toFixed(1)} MB`;if(bytes>=1024)return`${Math.round(bytes/1024)} KB`;return`${bytes} B`}function createPublishBundler(root,config){return new LiveBundler(root,()=>config,()=>liveExtensions(config.extensions),!0,!0)}function publishedDesignSubtitle(design){let published=design.lastPublishedAt?`Published ${design.lastPublishedAt}`:"Publish time unavailable",publisher=design.ownerEmail?.trim()?`by ${design.ownerEmail.trim()}`:"publisher unavailable",repo=design.git?.repo?.trim(),branch=design.git?.branch?.trim(),source=repo?`repo ${repo}${branch?` (${branch})`:""}`:"repository unavailable";return`${published} \xB7 ${publisher} \xB7 ${source}`}async function listPublishedDesigns(opts){let body=await cloudFetch(`${opts.baseUrl}/v1/links`,PublishedDesignsResponseSchema,{operation:"listing published designs",token:opts.token});if(!body.ok)return body;return ok((body.value.links??[]).filter((link)=>link.published).map((link)=>({...link,url:link.url.startsWith("http")?link.url:`${opts.baseUrl}${link.url}`})))}async function unpublishDesign(opts){let res=await fetch(`${opts.baseUrl}/v1/links/${encodeURIComponent(opts.slug)}`,{method:"DELETE",headers:{authorization:`Bearer ${opts.token}`}}).catch((error)=>error);if(!(res instanceof Response))return err(unreachable(res,{url:opts.baseUrl}));if(!res.ok)return err(await httpFailureFrom("unpublishing the design",res));return ok(void 0)}
5
+ export{publishedDesignSubtitle,listPublishedDesigns,unpublishDesign,listPublishDestinations,designGitEnv,describePublishError,recommendedPublishSlot,exactPublishSlots,PUBLISH_VIEWPORT,gitContext,resolveTeam,listTeams,publishDesign,createPublishBundler};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{join,sep}from"path";async function withAssetServer(folder,liveCode,fn){let assetsRoot=join(folder,"assets"),server=Bun.serve({port:0,hostname:"127.0.0.1",async fetch(req){let url=new URL(req.url);if(liveCode!==null&&url.pathname==="/live/bundle.js")return new Response(liveCode,{headers:{"Content-Type":"text/javascript"}});if(url.pathname.startsWith("/assets/")){let fsPath=join(folder,decodeURIComponent(url.pathname));if(fsPath.startsWith(assetsRoot+sep)){let file=Bun.file(fsPath);if(await file.exists())return new Response(file)}}return new Response("not found",{status:404})}});try{return await fn(`http://127.0.0.1:${server.port}/`)}finally{server.stop(!0)}}
3
+ export{withAssetServer};
@@ -0,0 +1,6 @@
1
+ // @bun
2
+ import{isCancel,confirm,select,FOLDER_ARG_DESCRIPTION,resolveDesignFolder}from"./chunk-8ssr8a8w.js";import{capturesDir,sessionStatePath,captureDir,listCaptures,deleteCapture,isSafeCaptureId,HeadedBrowserMissingError,startCaptureSession}from"./chunk-w5rzk6ms.js";import"./chunk-bk8b7f9a.js";import{loadDesignFolder}from"./chunk-329e3phg.js";import"./chunk-mq4znqv2.js";import{fail}from"./chunk-s23gtejf.js";import{installChromiumInteractive}from"./chunk-k6ferbam.js";import{openUrl}from"./chunk-hggap8fq.js";import"./chunk-1bywxgc5.js";import{require_picocolors}from"./chunk-jrsknzjt.js";import{__toESM,defineCommand}from"./chunk-2smsg2ct.js";import{join}from"path";var import_picocolors=__toESM(require_picocolors(),1);var CTRL_C=3,LOOPBACK=/^(localhost|127\.0\.0\.1|\[::1\]|::1)(:\d+)?$/i;function normalizeCaptureUrl(input){let raw=input.trim();if(raw==="")return null;let hasScheme=/^[a-z][a-z0-9+.-]*:\/\//i.test(raw),host=raw.split(/[/?#]/,1)[0]??"",candidate=hasScheme?raw:`${LOOPBACK.test(host)?"http":"https"}://${raw}`;try{let url=new URL(candidate);if(url.protocol!=="http:"&&url.protocol!=="https:")return null;if(url.hostname==="")return null;return url.toString()}catch{return null}}function bindKeys(handlers){let stdin=process.stdin;if(!stdin.isTTY)return()=>{};stdin.setRawMode(!0),stdin.resume(),stdin.setEncoding("utf8");let onData=(key)=>{if(key==="c")handlers.page();else if(key==="t")handlers.theme();else if(key==="l")handlers.list();else if(key==="q"||key.charCodeAt(0)===CTRL_C)handlers.quit()};return stdin.on("data",onData),()=>{if(stdin.off("data",onData),stdin.isTTY)stdin.setRawMode(!1);stdin.pause()}}function when(iso){let d=new Date(iso);if(Number.isNaN(d.getTime()))return iso;return d.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function describe(m){let what=m.themeOnly?"theme only":`${m.nodeCount} nodes, ${m.assetCount} assets`;return`${m.title||m.finalUrl||m.url} ${import_picocolors.default.dim(`\u2014 ${what}, ${when(m.capturedAt)}`)}`}function printCaptures(captures,dir){if(console.log(""),captures.length===0){console.log(import_picocolors.default.dim(" No captures yet. Run `velloo capture <url>` to make one.")),console.log("");return}console.log(` ${import_picocolors.default.bold(`${captures.length} capture${captures.length===1?"":"s"}`)}`),console.log(import_picocolors.default.dim(` ${dir}`)),console.log("");for(let m of captures)console.log(` ${import_picocolors.default.cyan(m.id)} ${describe(m)}`),console.log(import_picocolors.default.dim(` ${m.finalUrl||m.url}`));console.log("")}async function browseCaptures(root,folderId){let dir=capturesDir(root,folderId),captures=listCaptures(root,folderId);if(!process.stdin.isTTY||captures.length===0){printCaptures(captures,dir);return}for(;;){if(captures=listCaptures(root,folderId),captures.length===0){console.log(import_picocolors.default.dim(`
3
+ No captures left.
4
+ `));return}let picked=await select({message:`${captures.length} capture${captures.length===1?"":"s"} for this folder`,options:[...captures.map((m)=>({value:m.id,label:describe(m),hint:m.finalUrl||m.url})),{value:"__done",label:import_picocolors.default.dim("Done")}]});if(isCancel(picked)||picked==="__done")return;let manifest=captures.find((m)=>m.id===picked);if(!manifest)continue;let action=await select({message:manifest.title||manifest.id,options:[...manifest.files.includes("page.png")?[{value:"open",label:"Open the screenshot"}]:[],{value:"details",label:"Show what it contains"},{value:"delete",label:import_picocolors.default.red("Delete this capture")},{value:"back",label:import_picocolors.default.dim("Back")}]});if(isCancel(action)||action==="back")continue;if(action==="open"){await openUrl(`file://${join(captureDir(root,manifest.id,folderId),"page.png")}`);continue}if(action==="details"){console.log(""),console.log(` ${import_picocolors.default.bold(manifest.id)}`),console.log(` url ${manifest.finalUrl||manifest.url}`),console.log(` captured ${when(manifest.capturedAt)}`),console.log(` viewport ${manifest.viewport.w}\xD7${manifest.viewport.h}`),console.log(` nodes ${manifest.nodeCount}`),console.log(` assets ${manifest.assetCount}`),console.log(` files ${manifest.files.join(", ")}`),console.log(import_picocolors.default.dim(` ${captureDir(root,manifest.id,folderId)}`)),console.log(""),console.log(import_picocolors.default.dim(` verify a screen against it: compare_to_url { captureId: "${manifest.id}" }`)),console.log("");continue}if(action==="delete"){let sure=await confirm({message:`Delete ${manifest.title||manifest.id}? This can't be undone.`,initialValue:!1});if(isCancel(sure)||!sure)continue;deleteCapture(root,manifest.id,folderId),console.log(import_picocolors.default.dim(` deleted ${manifest.id}`))}}}var capture_default=defineCommand({meta:{name:"capture",description:"open a browser, log in, and capture pages as evidence for the agent"},args:{url:{type:"positional",required:!1,description:"Page to open the browser on, e.g. http://localhost:3000/dashboard"},folder:{type:"string",description:FOLDER_ARG_DESCRIPTION},list:{type:"boolean",default:!1,description:"Browse stored captures instead of opening a browser (interactive on a TTY)"},delete:{type:"string",description:"Delete a capture by id, or `all` to clear every capture for this folder"}},async run({args}){let folder=await resolveDesignFolder(args.folder,"capture"),design=await loadDesignFolder(folder),folderId=design.config.folderId;if(args.delete!==void 0){let id=args.delete.trim();if(id==="all"){let all=listCaptures(design.root,folderId);if(all.length===0){console.log(import_picocolors.default.dim("velloo capture: no captures to delete."));return}if(process.stdin.isTTY){let sure=await confirm({message:`Delete all ${all.length} captures for this folder? This can't be undone.`,initialValue:!1});if(isCancel(sure)||!sure){console.log(import_picocolors.default.dim(" nothing deleted."));return}}for(let m of all)deleteCapture(design.root,m.id,folderId);console.log(`velloo capture: deleted ${all.length} captures.`);return}if(!isSafeCaptureId(id))fail("capture",`not a capture id: ${args.delete}`);if(!deleteCapture(design.root,id,folderId))fail("capture",`no capture "${id}" for this folder \u2014 run \`velloo capture --list\`.`);console.log(`velloo capture: deleted ${id}.`);return}if(args.list){await browseCaptures(design.root,folderId);return}let url;if(args.url!==void 0){let normalized=normalizeCaptureUrl(args.url);if(normalized===null)fail("capture",`not a page that can be captured: ${args.url} (expected an http(s) URL)`);url=normalized}let statePath=url?sessionStatePath(design.root,new URL(url).origin,folderId):void 0;console.log(""),console.log(` ${import_picocolors.default.bold("velloo capture")}`),console.log(import_picocolors.default.dim(` A browser window opens. Log in and navigate wherever you need \u2014 then use the
5
+ `+" velloo toolbar in the page (or the keys below) to capture what the agent should see.")),console.log(""),console.log(import_picocolors.default.dim(` ${import_picocolors.default.cyan("c")} capture page ${import_picocolors.default.cyan("t")} capture theme ${import_picocolors.default.cyan("l")} list ${import_picocolors.default.cyan("q")} done`)),console.log("");let made=[],onCapture=(m)=>{made.push(m);let what=m.themeOnly?"theme":`${m.nodeCount} nodes, ${m.assetCount} assets`;console.log(` ${import_picocolors.default.green("\u2713")} ${m.title||m.url} ${import_picocolors.default.dim(`(${what}) \u2192 ${m.id}`)}`)},start=async()=>startCaptureSession({folderRoot:design.root,...folderId?{folderId}:{},...url?{url}:{},...statePath?{sessionStatePath:statePath}:{},onCapture,onStatus:(message)=>console.log(import_picocolors.default.dim(` ${message}`))}),session;try{session=await start()}catch(err){if(!(err instanceof HeadedBrowserMissingError))throw err;if(!process.stdin.isTTY)fail("capture",err.message);console.log(""),console.log(` ${import_picocolors.default.yellow("\u26A0")} ${err.message}`);let proceed=await confirm({message:"Download the full browser now? (~300MB, one-time)",initialValue:!0});if(isCancel(proceed)||!proceed)fail("capture","no browser available for a capture session.");if(!await installChromiumInteractive())fail("capture","the browser isn't usable yet \u2014 see the output above.");session=await start()}let report=(e)=>{console.log(import_picocolors.default.red(` capture failed: ${e instanceof Error?e.message:String(e)}`))},unbind=bindKeys({page:()=>{session.capturePage().catch(report)},theme:()=>{session.captureTheme().catch(report)},list:()=>{if(console.log(import_picocolors.default.dim(` on: ${session.currentUrl()||"(no page)"}`)),made.length===0)console.log(import_picocolors.default.dim(" nothing captured yet"));for(let m of made)console.log(import_picocolors.default.dim(` ${m.id} ${m.title||m.url}`))},quit:()=>{session.close()}});if(await session.finished,unbind(),console.log(""),made.length===0)console.log(` ${import_picocolors.default.dim("No captures made.")}`);else console.log(` ${import_picocolors.default.green("\u2713")} ${made.length} capture${made.length===1?"":"s"} saved`),console.log(import_picocolors.default.dim(` ${capturesDir(design.root,folderId)}`)),console.log(""),console.log(import_picocolors.default.dim(" The agent can read these with list_captures / get_capture,")),console.log(import_picocolors.default.dim(" and verify a screen against one with compare_to_url { captureId }."));if(statePath)console.log(""),console.log(import_picocolors.default.dim(" Session cookies for this app were saved to:")),console.log(import_picocolors.default.dim(` ${statePath}`)),console.log(import_picocolors.default.dim(` Scoped to that site only (third-party sign-in cookies are dropped), outside your
6
+ repo so it can't be committed or published, and it expires in 14 days.`));console.log("")}});export{capture_default as default};