shipscreens 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 (605) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +27 -0
  3. package/bin/shipscreens.js +664 -0
  4. package/cli/assetRefs.js +33 -0
  5. package/cli/auth.js +454 -0
  6. package/cli/buildOutputs.js +146 -0
  7. package/cli/commands/auth.js +65 -0
  8. package/cli/commands/build.js +347 -0
  9. package/cli/commands/copyImport.js +263 -0
  10. package/cli/commands/exportFramefile.js +404 -0
  11. package/cli/commands/init.js +339 -0
  12. package/cli/commands/lock.js +144 -0
  13. package/cli/commands/plan.js +203 -0
  14. package/cli/commands/stage.js +318 -0
  15. package/cli/commands/validate.js +89 -0
  16. package/cli/commands/verify.js +659 -0
  17. package/cli/commands/wizard.js +266 -0
  18. package/cli/dataUrl.js +19 -0
  19. package/cli/fastlaneZip.js +115 -0
  20. package/cli/hash.js +13 -0
  21. package/cli/loadConfig.js +55 -0
  22. package/cli/outputPaths.js +24 -0
  23. package/cli/packageRoot.js +8 -0
  24. package/cli/pathUtils.js +25 -0
  25. package/cli/rendererServer.js +48 -0
  26. package/cli/repoRoot.js +23 -0
  27. package/cli/rootPolicy.js +17 -0
  28. package/cli/schema.js +290 -0
  29. package/cli/snapshotFromConfig.js +116 -0
  30. package/cli/staticServer.js +102 -0
  31. package/cli/templateConfig.js +51 -0
  32. package/cli/viteServer.js +40 -0
  33. package/dist/app/apple-touch-icon.png +0 -0
  34. package/dist/app/assets/AgentCli-8e28laT4.js +17 -0
  35. package/dist/app/assets/AgentCli-8e28laT4.js.map +1 -0
  36. package/dist/app/assets/App-DU0xew0e.js +13 -0
  37. package/dist/app/assets/App-DU0xew0e.js.map +1 -0
  38. package/dist/app/assets/AppReviewAso-OLwc4Rw_.js +4 -0
  39. package/dist/app/assets/AppReviewAso-OLwc4Rw_.js.map +1 -0
  40. package/dist/app/assets/Cancelled-BoeZQa1S.js +2 -0
  41. package/dist/app/assets/Cancelled-BoeZQa1S.js.map +1 -0
  42. package/dist/app/assets/CliPreflightCard-CxYyogdF.js +2 -0
  43. package/dist/app/assets/CliPreflightCard-CxYyogdF.js.map +1 -0
  44. package/dist/app/assets/CopyButton-CGfuSJtU.js +2 -0
  45. package/dist/app/assets/CopyButton-CGfuSJtU.js.map +1 -0
  46. package/dist/app/assets/FastlaneScreenshots-CFT6IiRb.js +52 -0
  47. package/dist/app/assets/FastlaneScreenshots-CFT6IiRb.js.map +1 -0
  48. package/dist/app/assets/FirstExport-B_UDacZm.js +6 -0
  49. package/dist/app/assets/FirstExport-B_UDacZm.js.map +1 -0
  50. package/dist/app/assets/FivePanelFramework-C1z_xUbe.js +60 -0
  51. package/dist/app/assets/FivePanelFramework-C1z_xUbe.js.map +1 -0
  52. package/dist/app/assets/ForgotPassword-ZQ8U3ejz.js +2 -0
  53. package/dist/app/assets/ForgotPassword-ZQ8U3ejz.js.map +1 -0
  54. package/dist/app/assets/Landing-DAIP71DD.js +2 -0
  55. package/dist/app/assets/Landing-DAIP71DD.js.map +1 -0
  56. package/dist/app/assets/LanguageSwitcher-D93nCuuR.js +2 -0
  57. package/dist/app/assets/LanguageSwitcher-D93nCuuR.js.map +1 -0
  58. package/dist/app/assets/Legal-Koe7vi6H.js +2 -0
  59. package/dist/app/assets/Legal-Koe7vi6H.js.map +1 -0
  60. package/dist/app/assets/NotFound-CfY31vMZ.js +2 -0
  61. package/dist/app/assets/NotFound-CfY31vMZ.js.map +1 -0
  62. package/dist/app/assets/Pricing-BQwtFVbj.js +2 -0
  63. package/dist/app/assets/Pricing-BQwtFVbj.js.map +1 -0
  64. package/dist/app/assets/Privacy-CaHf2UM7.js +2 -0
  65. package/dist/app/assets/Privacy-CaHf2UM7.js.map +1 -0
  66. package/dist/app/assets/SignIn-Cyi2_-Mn.js +2 -0
  67. package/dist/app/assets/SignIn-Cyi2_-Mn.js.map +1 -0
  68. package/dist/app/assets/SignUp-C9QH5po_.js +2 -0
  69. package/dist/app/assets/SignUp-C9QH5po_.js.map +1 -0
  70. package/dist/app/assets/SiteHeader-Dj3gDOnR.js +2 -0
  71. package/dist/app/assets/SiteHeader-Dj3gDOnR.js.map +1 -0
  72. package/dist/app/assets/StickyMobileCta-uyWGVhdc.js +2 -0
  73. package/dist/app/assets/StickyMobileCta-uyWGVhdc.js.map +1 -0
  74. package/dist/app/assets/StoreAssetsPipeline-BJlnD3kD.js +4 -0
  75. package/dist/app/assets/StoreAssetsPipeline-BJlnD3kD.js.map +1 -0
  76. package/dist/app/assets/Success-B7k7FvJj.js +2 -0
  77. package/dist/app/assets/Success-B7k7FvJj.js.map +1 -0
  78. package/dist/app/assets/Terms-DgJWOeUD.js +2 -0
  79. package/dist/app/assets/Terms-DgJWOeUD.js.map +1 -0
  80. package/dist/app/assets/ToolsIndex-xMPoFom9.js +6 -0
  81. package/dist/app/assets/ToolsIndex-xMPoFom9.js.map +1 -0
  82. package/dist/app/assets/WorkloadCalculator-Bdt6qPR3.js +5 -0
  83. package/dist/app/assets/WorkloadCalculator-Bdt6qPR3.js.map +1 -0
  84. package/dist/app/assets/calculator-CWfp5Day.js +2 -0
  85. package/dist/app/assets/calculator-CWfp5Day.js.map +1 -0
  86. package/dist/app/assets/check-BWCiUZ-C.js +2 -0
  87. package/dist/app/assets/check-BWCiUZ-C.js.map +1 -0
  88. package/dist/app/assets/chevron-down-DbSAem1L.js +2 -0
  89. package/dist/app/assets/chevron-down-DbSAem1L.js.map +1 -0
  90. package/dist/app/assets/circle-check-CeakjiXC.js +2 -0
  91. package/dist/app/assets/circle-check-CeakjiXC.js.map +1 -0
  92. package/dist/app/assets/clipboard-copy-DgTgnK84.js +2 -0
  93. package/dist/app/assets/clipboard-copy-DgTgnK84.js.map +1 -0
  94. package/dist/app/assets/copy-C9t_FzCZ.js +2 -0
  95. package/dist/app/assets/copy-C9t_FzCZ.js.map +1 -0
  96. package/dist/app/assets/crop-B7IxIx6D.js +2 -0
  97. package/dist/app/assets/crop-B7IxIx6D.js.map +1 -0
  98. package/dist/app/assets/download-65Zuvgwm.js +2 -0
  99. package/dist/app/assets/download-65Zuvgwm.js.map +1 -0
  100. package/dist/app/assets/eye-ouNo8Nv5.js +2 -0
  101. package/dist/app/assets/eye-ouNo8Nv5.js.map +1 -0
  102. package/dist/app/assets/grid-3x3-U1Nk_ppf.js +2 -0
  103. package/dist/app/assets/grid-3x3-U1Nk_ppf.js.map +1 -0
  104. package/dist/app/assets/hero/cli-build-tree-15s.mp4 +0 -0
  105. package/dist/app/assets/hero/cli-build-tree-15s.webm +0 -0
  106. package/dist/app/assets/hero/cli-build-tree-25s.mp4 +0 -0
  107. package/dist/app/assets/hero/cli-build-tree-25s.webm +0 -0
  108. package/dist/app/assets/hero/cli-build-tree-poster.png +0 -0
  109. package/dist/app/assets/hero/demo.gif +0 -0
  110. package/dist/app/assets/hero/demo.mp4 +0 -0
  111. package/dist/app/assets/hero/demo.webm +0 -0
  112. package/dist/app/assets/icons/apple-touch-icon.png +0 -0
  113. package/dist/app/assets/icons/device-base.png +0 -0
  114. package/dist/app/assets/icons/favicon-16x16.png +0 -0
  115. package/dist/app/assets/icons/favicon-32x32.png +0 -0
  116. package/dist/app/assets/icons/favicon.ico +0 -0
  117. package/dist/app/assets/icons/favicon.svg +1 -0
  118. package/dist/app/assets/index-B8Y8Y-Mi.js +180 -0
  119. package/dist/app/assets/index-B8Y8Y-Mi.js.map +1 -0
  120. package/dist/app/assets/index-hyiQFYGv.css +1 -0
  121. package/dist/app/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  122. package/dist/app/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  123. package/dist/app/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  124. package/dist/app/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  125. package/dist/app/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  126. package/dist/app/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  127. package/dist/app/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  128. package/dist/app/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  129. package/dist/app/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  130. package/dist/app/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  131. package/dist/app/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  132. package/dist/app/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  133. package/dist/app/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  134. package/dist/app/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  135. package/dist/app/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  136. package/dist/app/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  137. package/dist/app/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  138. package/dist/app/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  139. package/dist/app/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  140. package/dist/app/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  141. package/dist/app/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  142. package/dist/app/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  143. package/dist/app/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  144. package/dist/app/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  145. package/dist/app/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  146. package/dist/app/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  147. package/dist/app/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  148. package/dist/app/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  149. package/dist/app/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  150. package/dist/app/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  151. package/dist/app/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  152. package/dist/app/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  153. package/dist/app/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  154. package/dist/app/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  155. package/dist/app/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  156. package/dist/app/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  157. package/dist/app/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  158. package/dist/app/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  159. package/dist/app/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  160. package/dist/app/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  161. package/dist/app/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  162. package/dist/app/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  163. package/dist/app/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  164. package/dist/app/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  165. package/dist/app/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  166. package/dist/app/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  167. package/dist/app/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  168. package/dist/app/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  169. package/dist/app/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  170. package/dist/app/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  171. package/dist/app/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  172. package/dist/app/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  173. package/dist/app/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  174. package/dist/app/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  175. package/dist/app/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  176. package/dist/app/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  177. package/dist/app/assets/layout-grid-X9Sgull2.js +2 -0
  178. package/dist/app/assets/layout-grid-X9Sgull2.js.map +1 -0
  179. package/dist/app/assets/merriweather-cyrillic-400-normal-AvfsDsMQ.woff2 +0 -0
  180. package/dist/app/assets/merriweather-cyrillic-400-normal-DAcQ8g-H.woff +0 -0
  181. package/dist/app/assets/merriweather-cyrillic-700-normal-CHCcU-4a.woff +0 -0
  182. package/dist/app/assets/merriweather-cyrillic-700-normal-wbY04GlL.woff2 +0 -0
  183. package/dist/app/assets/merriweather-cyrillic-ext-400-normal-D9NYhYTq.woff2 +0 -0
  184. package/dist/app/assets/merriweather-cyrillic-ext-400-normal-Di6yW_eE.woff +0 -0
  185. package/dist/app/assets/merriweather-cyrillic-ext-700-normal-Bk1p9YoV.woff2 +0 -0
  186. package/dist/app/assets/merriweather-cyrillic-ext-700-normal-DoooT6Vg.woff +0 -0
  187. package/dist/app/assets/merriweather-latin-400-normal-CvqO63Ah.woff +0 -0
  188. package/dist/app/assets/merriweather-latin-400-normal-G4kZaoXi.woff2 +0 -0
  189. package/dist/app/assets/merriweather-latin-700-normal-D4-nzrAh.woff +0 -0
  190. package/dist/app/assets/merriweather-latin-700-normal-DoUP8Ce-.woff2 +0 -0
  191. package/dist/app/assets/merriweather-latin-ext-400-normal-CLqijLtt.woff +0 -0
  192. package/dist/app/assets/merriweather-latin-ext-400-normal-CWVzVQq3.woff2 +0 -0
  193. package/dist/app/assets/merriweather-latin-ext-700-normal-CaBzXGOk.woff +0 -0
  194. package/dist/app/assets/merriweather-latin-ext-700-normal-jHnxg2Kc.woff2 +0 -0
  195. package/dist/app/assets/merriweather-vietnamese-400-normal-Dh8WVvgZ.woff +0 -0
  196. package/dist/app/assets/merriweather-vietnamese-400-normal-hNacsVs_.woff2 +0 -0
  197. package/dist/app/assets/merriweather-vietnamese-700-normal-Bp6kWjW5.woff2 +0 -0
  198. package/dist/app/assets/merriweather-vietnamese-700-normal-C7_HxHBa.woff +0 -0
  199. package/dist/app/assets/montserrat-cyrillic-400-normal-BPq32Q8K.woff2 +0 -0
  200. package/dist/app/assets/montserrat-cyrillic-400-normal-jEs4Tk-Z.woff +0 -0
  201. package/dist/app/assets/montserrat-cyrillic-700-normal-BvLYcGP1.woff +0 -0
  202. package/dist/app/assets/montserrat-cyrillic-700-normal-D-Pqjtdp.woff2 +0 -0
  203. package/dist/app/assets/montserrat-cyrillic-ext-400-normal-DRPPeomZ.woff +0 -0
  204. package/dist/app/assets/montserrat-cyrillic-ext-400-normal-Xqov12YL.woff2 +0 -0
  205. package/dist/app/assets/montserrat-cyrillic-ext-700-normal-D-Mk2xRJ.woff +0 -0
  206. package/dist/app/assets/montserrat-cyrillic-ext-700-normal-MyDreaeu.woff2 +0 -0
  207. package/dist/app/assets/montserrat-latin-400-normal-BLhwKU8k.woff2 +0 -0
  208. package/dist/app/assets/montserrat-latin-400-normal-xItZbAXg.woff +0 -0
  209. package/dist/app/assets/montserrat-latin-700-normal-BWkrl476.woff +0 -0
  210. package/dist/app/assets/montserrat-latin-700-normal-BdjcYUrC.woff2 +0 -0
  211. package/dist/app/assets/montserrat-latin-ext-400-normal-B8bwfy6Y.woff2 +0 -0
  212. package/dist/app/assets/montserrat-latin-ext-400-normal-BffdBkAA.woff +0 -0
  213. package/dist/app/assets/montserrat-latin-ext-700-normal-BOP2Nhf0.woff2 +0 -0
  214. package/dist/app/assets/montserrat-latin-ext-700-normal-DdDFr05Z.woff +0 -0
  215. package/dist/app/assets/montserrat-vietnamese-400-normal-BeEscFYY.woff +0 -0
  216. package/dist/app/assets/montserrat-vietnamese-400-normal-D4oHqQTd.woff2 +0 -0
  217. package/dist/app/assets/montserrat-vietnamese-700-normal-C0x1De3p.woff2 +0 -0
  218. package/dist/app/assets/montserrat-vietnamese-700-normal-DnwGT2D9.woff +0 -0
  219. package/dist/app/assets/playfair-display-cyrillic-400-normal-CjW2EstV.woff2 +0 -0
  220. package/dist/app/assets/playfair-display-cyrillic-400-normal-ZiRag6zj.woff +0 -0
  221. package/dist/app/assets/playfair-display-cyrillic-700-normal-Dk1mTcxf.woff +0 -0
  222. package/dist/app/assets/playfair-display-cyrillic-700-normal-Dw3uKy19.woff2 +0 -0
  223. package/dist/app/assets/playfair-display-latin-400-normal-CFtfchNt.woff2 +0 -0
  224. package/dist/app/assets/playfair-display-latin-400-normal-DHYHbkg3.woff +0 -0
  225. package/dist/app/assets/playfair-display-latin-700-normal-Bc_1Q1cG.woff +0 -0
  226. package/dist/app/assets/playfair-display-latin-700-normal-CuDiGg7c.woff2 +0 -0
  227. package/dist/app/assets/playfair-display-latin-ext-400-normal-BxlSGspa.woff2 +0 -0
  228. package/dist/app/assets/playfair-display-latin-ext-400-normal-qdZwdvNS.woff +0 -0
  229. package/dist/app/assets/playfair-display-latin-ext-700-normal-C58ejOkc.woff2 +0 -0
  230. package/dist/app/assets/playfair-display-latin-ext-700-normal-D5HUU8GT.woff +0 -0
  231. package/dist/app/assets/playfair-display-vietnamese-400-normal-BV2APVTb.woff2 +0 -0
  232. package/dist/app/assets/playfair-display-vietnamese-400-normal-BbvUAu4N.woff +0 -0
  233. package/dist/app/assets/playfair-display-vietnamese-700-normal-CaKJSIny.woff2 +0 -0
  234. package/dist/app/assets/playfair-display-vietnamese-700-normal-Cr1rw0mr.woff +0 -0
  235. package/dist/app/assets/proof/output-01.png +0 -0
  236. package/dist/app/assets/proof/output-02.png +0 -0
  237. package/dist/app/assets/proof/output-03.png +0 -0
  238. package/dist/app/assets/proof/output-04.png +0 -0
  239. package/dist/app/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  240. package/dist/app/assets/roboto-cyrillic-400-normal-DZJji7Rx.woff +0 -0
  241. package/dist/app/assets/roboto-cyrillic-500-normal-BI4HuXre.woff +0 -0
  242. package/dist/app/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  243. package/dist/app/assets/roboto-cyrillic-700-normal-BiSG5NnW.woff2 +0 -0
  244. package/dist/app/assets/roboto-cyrillic-700-normal-KqaQ5bNp.woff +0 -0
  245. package/dist/app/assets/roboto-cyrillic-ext-400-normal-DtZHuW6i.woff +0 -0
  246. package/dist/app/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  247. package/dist/app/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  248. package/dist/app/assets/roboto-cyrillic-ext-500-normal-C927yMrb.woff +0 -0
  249. package/dist/app/assets/roboto-cyrillic-ext-700-normal-BuQgZIrO.woff +0 -0
  250. package/dist/app/assets/roboto-cyrillic-ext-700-normal-UFn0vR9r.woff2 +0 -0
  251. package/dist/app/assets/roboto-greek-400-normal-CcizSnRP.woff +0 -0
  252. package/dist/app/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  253. package/dist/app/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  254. package/dist/app/assets/roboto-greek-500-normal-BLLWU9W-.woff +0 -0
  255. package/dist/app/assets/roboto-greek-700-normal-BcGn9doz.woff2 +0 -0
  256. package/dist/app/assets/roboto-greek-700-normal-D3kmAf0K.woff +0 -0
  257. package/dist/app/assets/roboto-latin-400-normal-068yxgMN.woff +0 -0
  258. package/dist/app/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  259. package/dist/app/assets/roboto-latin-500-normal-CC5nhZkh.woff +0 -0
  260. package/dist/app/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  261. package/dist/app/assets/roboto-latin-700-normal-CXeAXeti.woff2 +0 -0
  262. package/dist/app/assets/roboto-latin-700-normal-DUekQERp.woff +0 -0
  263. package/dist/app/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  264. package/dist/app/assets/roboto-latin-ext-400-normal-eTRLN0Nt.woff +0 -0
  265. package/dist/app/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  266. package/dist/app/assets/roboto-latin-ext-500-normal-FFcS8vBN.woff +0 -0
  267. package/dist/app/assets/roboto-latin-ext-700-normal-70GS1MYH.woff2 +0 -0
  268. package/dist/app/assets/roboto-latin-ext-700-normal-BS1OuQqR.woff +0 -0
  269. package/dist/app/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  270. package/dist/app/assets/roboto-math-400-normal-rzxYvyVt.woff +0 -0
  271. package/dist/app/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  272. package/dist/app/assets/roboto-math-500-normal-DaFX-ZC8.woff +0 -0
  273. package/dist/app/assets/roboto-math-700-normal-VUAI6Bz2.woff2 +0 -0
  274. package/dist/app/assets/roboto-math-700-normal-pYD1nhov.woff +0 -0
  275. package/dist/app/assets/roboto-symbols-400-normal-Tzuungub.woff +0 -0
  276. package/dist/app/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  277. package/dist/app/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  278. package/dist/app/assets/roboto-symbols-500-normal-CAhAe-ik.woff +0 -0
  279. package/dist/app/assets/roboto-symbols-700-normal-CuuvBBxy.woff +0 -0
  280. package/dist/app/assets/roboto-symbols-700-normal-rJi6RjIy.woff2 +0 -0
  281. package/dist/app/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  282. package/dist/app/assets/roboto-vietnamese-400-normal-DmXaN3yE.woff +0 -0
  283. package/dist/app/assets/roboto-vietnamese-500-normal-DW96CsrR.woff +0 -0
  284. package/dist/app/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  285. package/dist/app/assets/roboto-vietnamese-700-normal-Dz0HwF-w.woff +0 -0
  286. package/dist/app/assets/roboto-vietnamese-700-normal-iKxYNAzq.woff2 +0 -0
  287. package/dist/app/assets/rocket-BjOXauLe.js +2 -0
  288. package/dist/app/assets/rocket-BjOXauLe.js.map +1 -0
  289. package/dist/app/assets/shield-check-CFNhE_aD.js +2 -0
  290. package/dist/app/assets/shield-check-CFNhE_aD.js.map +1 -0
  291. package/dist/app/assets/signIn-CVoSzqCz.js +2 -0
  292. package/dist/app/assets/signIn-CVoSzqCz.js.map +1 -0
  293. package/dist/app/assets/smartphone-BcQB9gIh.js +2 -0
  294. package/dist/app/assets/smartphone-BcQB9gIh.js.map +1 -0
  295. package/dist/app/assets/terminal-CGhryJds.js +2 -0
  296. package/dist/app/assets/terminal-CGhryJds.js.map +1 -0
  297. package/dist/app/assets/useAuth-lZZC20Tl.js +4 -0
  298. package/dist/app/assets/useAuth-lZZC20Tl.js.map +1 -0
  299. package/dist/app/favicon-16x16.png +0 -0
  300. package/dist/app/favicon-32x32.png +0 -0
  301. package/dist/app/favicon.ico +0 -0
  302. package/dist/app/favicon.svg +10 -0
  303. package/dist/app/index.html +43 -0
  304. package/dist/apple-touch-icon.png +0 -0
  305. package/dist/assets/AgentCli-8e28laT4.js +17 -0
  306. package/dist/assets/AgentCli-8e28laT4.js.map +1 -0
  307. package/dist/assets/App-DU0xew0e.js +13 -0
  308. package/dist/assets/App-DU0xew0e.js.map +1 -0
  309. package/dist/assets/AppReviewAso-OLwc4Rw_.js +4 -0
  310. package/dist/assets/AppReviewAso-OLwc4Rw_.js.map +1 -0
  311. package/dist/assets/Cancelled-BoeZQa1S.js +2 -0
  312. package/dist/assets/Cancelled-BoeZQa1S.js.map +1 -0
  313. package/dist/assets/CliPreflightCard-CxYyogdF.js +2 -0
  314. package/dist/assets/CliPreflightCard-CxYyogdF.js.map +1 -0
  315. package/dist/assets/CopyButton-CGfuSJtU.js +2 -0
  316. package/dist/assets/CopyButton-CGfuSJtU.js.map +1 -0
  317. package/dist/assets/FastlaneScreenshots-CFT6IiRb.js +52 -0
  318. package/dist/assets/FastlaneScreenshots-CFT6IiRb.js.map +1 -0
  319. package/dist/assets/FirstExport-B_UDacZm.js +6 -0
  320. package/dist/assets/FirstExport-B_UDacZm.js.map +1 -0
  321. package/dist/assets/FivePanelFramework-C1z_xUbe.js +60 -0
  322. package/dist/assets/FivePanelFramework-C1z_xUbe.js.map +1 -0
  323. package/dist/assets/ForgotPassword-ZQ8U3ejz.js +2 -0
  324. package/dist/assets/ForgotPassword-ZQ8U3ejz.js.map +1 -0
  325. package/dist/assets/Landing-DAIP71DD.js +2 -0
  326. package/dist/assets/Landing-DAIP71DD.js.map +1 -0
  327. package/dist/assets/LanguageSwitcher-D93nCuuR.js +2 -0
  328. package/dist/assets/LanguageSwitcher-D93nCuuR.js.map +1 -0
  329. package/dist/assets/Legal-Koe7vi6H.js +2 -0
  330. package/dist/assets/Legal-Koe7vi6H.js.map +1 -0
  331. package/dist/assets/NotFound-CfY31vMZ.js +2 -0
  332. package/dist/assets/NotFound-CfY31vMZ.js.map +1 -0
  333. package/dist/assets/Pricing-BQwtFVbj.js +2 -0
  334. package/dist/assets/Pricing-BQwtFVbj.js.map +1 -0
  335. package/dist/assets/Privacy-CaHf2UM7.js +2 -0
  336. package/dist/assets/Privacy-CaHf2UM7.js.map +1 -0
  337. package/dist/assets/SignIn-Cyi2_-Mn.js +2 -0
  338. package/dist/assets/SignIn-Cyi2_-Mn.js.map +1 -0
  339. package/dist/assets/SignUp-C9QH5po_.js +2 -0
  340. package/dist/assets/SignUp-C9QH5po_.js.map +1 -0
  341. package/dist/assets/SiteHeader-Dj3gDOnR.js +2 -0
  342. package/dist/assets/SiteHeader-Dj3gDOnR.js.map +1 -0
  343. package/dist/assets/StickyMobileCta-uyWGVhdc.js +2 -0
  344. package/dist/assets/StickyMobileCta-uyWGVhdc.js.map +1 -0
  345. package/dist/assets/StoreAssetsPipeline-BJlnD3kD.js +4 -0
  346. package/dist/assets/StoreAssetsPipeline-BJlnD3kD.js.map +1 -0
  347. package/dist/assets/Success-B7k7FvJj.js +2 -0
  348. package/dist/assets/Success-B7k7FvJj.js.map +1 -0
  349. package/dist/assets/Terms-DgJWOeUD.js +2 -0
  350. package/dist/assets/Terms-DgJWOeUD.js.map +1 -0
  351. package/dist/assets/ToolsIndex-xMPoFom9.js +6 -0
  352. package/dist/assets/ToolsIndex-xMPoFom9.js.map +1 -0
  353. package/dist/assets/WorkloadCalculator-Bdt6qPR3.js +5 -0
  354. package/dist/assets/WorkloadCalculator-Bdt6qPR3.js.map +1 -0
  355. package/dist/assets/calculator-CWfp5Day.js +2 -0
  356. package/dist/assets/calculator-CWfp5Day.js.map +1 -0
  357. package/dist/assets/check-BWCiUZ-C.js +2 -0
  358. package/dist/assets/check-BWCiUZ-C.js.map +1 -0
  359. package/dist/assets/chevron-down-DbSAem1L.js +2 -0
  360. package/dist/assets/chevron-down-DbSAem1L.js.map +1 -0
  361. package/dist/assets/circle-check-CeakjiXC.js +2 -0
  362. package/dist/assets/circle-check-CeakjiXC.js.map +1 -0
  363. package/dist/assets/clipboard-copy-DgTgnK84.js +2 -0
  364. package/dist/assets/clipboard-copy-DgTgnK84.js.map +1 -0
  365. package/dist/assets/copy-C9t_FzCZ.js +2 -0
  366. package/dist/assets/copy-C9t_FzCZ.js.map +1 -0
  367. package/dist/assets/crop-B7IxIx6D.js +2 -0
  368. package/dist/assets/crop-B7IxIx6D.js.map +1 -0
  369. package/dist/assets/download-65Zuvgwm.js +2 -0
  370. package/dist/assets/download-65Zuvgwm.js.map +1 -0
  371. package/dist/assets/eye-ouNo8Nv5.js +2 -0
  372. package/dist/assets/eye-ouNo8Nv5.js.map +1 -0
  373. package/dist/assets/grid-3x3-U1Nk_ppf.js +2 -0
  374. package/dist/assets/grid-3x3-U1Nk_ppf.js.map +1 -0
  375. package/dist/assets/hero/cli-build-tree-15s.mp4 +0 -0
  376. package/dist/assets/hero/cli-build-tree-15s.webm +0 -0
  377. package/dist/assets/hero/cli-build-tree-25s.mp4 +0 -0
  378. package/dist/assets/hero/cli-build-tree-25s.webm +0 -0
  379. package/dist/assets/hero/cli-build-tree-poster.png +0 -0
  380. package/dist/assets/hero/demo.gif +0 -0
  381. package/dist/assets/hero/demo.mp4 +0 -0
  382. package/dist/assets/hero/demo.webm +0 -0
  383. package/dist/assets/icons/apple-touch-icon.png +0 -0
  384. package/dist/assets/icons/device-base.png +0 -0
  385. package/dist/assets/icons/favicon-16x16.png +0 -0
  386. package/dist/assets/icons/favicon-32x32.png +0 -0
  387. package/dist/assets/icons/favicon.ico +0 -0
  388. package/dist/assets/icons/favicon.svg +1 -0
  389. package/dist/assets/index-B8Y8Y-Mi.js +180 -0
  390. package/dist/assets/index-B8Y8Y-Mi.js.map +1 -0
  391. package/dist/assets/index-hyiQFYGv.css +1 -0
  392. package/dist/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  393. package/dist/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  394. package/dist/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  395. package/dist/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  396. package/dist/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  397. package/dist/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  398. package/dist/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  399. package/dist/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  400. package/dist/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  401. package/dist/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  402. package/dist/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  403. package/dist/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  404. package/dist/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  405. package/dist/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  406. package/dist/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  407. package/dist/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  408. package/dist/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  409. package/dist/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  410. package/dist/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  411. package/dist/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  412. package/dist/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  413. package/dist/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  414. package/dist/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  415. package/dist/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  416. package/dist/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  417. package/dist/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  418. package/dist/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  419. package/dist/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  420. package/dist/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  421. package/dist/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  422. package/dist/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  423. package/dist/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  424. package/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  425. package/dist/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  426. package/dist/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  427. package/dist/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  428. package/dist/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  429. package/dist/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  430. package/dist/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  431. package/dist/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  432. package/dist/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  433. package/dist/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  434. package/dist/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  435. package/dist/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  436. package/dist/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  437. package/dist/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  438. package/dist/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  439. package/dist/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  440. package/dist/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  441. package/dist/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  442. package/dist/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  443. package/dist/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  444. package/dist/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  445. package/dist/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  446. package/dist/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  447. package/dist/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  448. package/dist/assets/layout-grid-X9Sgull2.js +2 -0
  449. package/dist/assets/layout-grid-X9Sgull2.js.map +1 -0
  450. package/dist/assets/merriweather-cyrillic-400-normal-AvfsDsMQ.woff2 +0 -0
  451. package/dist/assets/merriweather-cyrillic-400-normal-DAcQ8g-H.woff +0 -0
  452. package/dist/assets/merriweather-cyrillic-700-normal-CHCcU-4a.woff +0 -0
  453. package/dist/assets/merriweather-cyrillic-700-normal-wbY04GlL.woff2 +0 -0
  454. package/dist/assets/merriweather-cyrillic-ext-400-normal-D9NYhYTq.woff2 +0 -0
  455. package/dist/assets/merriweather-cyrillic-ext-400-normal-Di6yW_eE.woff +0 -0
  456. package/dist/assets/merriweather-cyrillic-ext-700-normal-Bk1p9YoV.woff2 +0 -0
  457. package/dist/assets/merriweather-cyrillic-ext-700-normal-DoooT6Vg.woff +0 -0
  458. package/dist/assets/merriweather-latin-400-normal-CvqO63Ah.woff +0 -0
  459. package/dist/assets/merriweather-latin-400-normal-G4kZaoXi.woff2 +0 -0
  460. package/dist/assets/merriweather-latin-700-normal-D4-nzrAh.woff +0 -0
  461. package/dist/assets/merriweather-latin-700-normal-DoUP8Ce-.woff2 +0 -0
  462. package/dist/assets/merriweather-latin-ext-400-normal-CLqijLtt.woff +0 -0
  463. package/dist/assets/merriweather-latin-ext-400-normal-CWVzVQq3.woff2 +0 -0
  464. package/dist/assets/merriweather-latin-ext-700-normal-CaBzXGOk.woff +0 -0
  465. package/dist/assets/merriweather-latin-ext-700-normal-jHnxg2Kc.woff2 +0 -0
  466. package/dist/assets/merriweather-vietnamese-400-normal-Dh8WVvgZ.woff +0 -0
  467. package/dist/assets/merriweather-vietnamese-400-normal-hNacsVs_.woff2 +0 -0
  468. package/dist/assets/merriweather-vietnamese-700-normal-Bp6kWjW5.woff2 +0 -0
  469. package/dist/assets/merriweather-vietnamese-700-normal-C7_HxHBa.woff +0 -0
  470. package/dist/assets/montserrat-cyrillic-400-normal-BPq32Q8K.woff2 +0 -0
  471. package/dist/assets/montserrat-cyrillic-400-normal-jEs4Tk-Z.woff +0 -0
  472. package/dist/assets/montserrat-cyrillic-700-normal-BvLYcGP1.woff +0 -0
  473. package/dist/assets/montserrat-cyrillic-700-normal-D-Pqjtdp.woff2 +0 -0
  474. package/dist/assets/montserrat-cyrillic-ext-400-normal-DRPPeomZ.woff +0 -0
  475. package/dist/assets/montserrat-cyrillic-ext-400-normal-Xqov12YL.woff2 +0 -0
  476. package/dist/assets/montserrat-cyrillic-ext-700-normal-D-Mk2xRJ.woff +0 -0
  477. package/dist/assets/montserrat-cyrillic-ext-700-normal-MyDreaeu.woff2 +0 -0
  478. package/dist/assets/montserrat-latin-400-normal-BLhwKU8k.woff2 +0 -0
  479. package/dist/assets/montserrat-latin-400-normal-xItZbAXg.woff +0 -0
  480. package/dist/assets/montserrat-latin-700-normal-BWkrl476.woff +0 -0
  481. package/dist/assets/montserrat-latin-700-normal-BdjcYUrC.woff2 +0 -0
  482. package/dist/assets/montserrat-latin-ext-400-normal-B8bwfy6Y.woff2 +0 -0
  483. package/dist/assets/montserrat-latin-ext-400-normal-BffdBkAA.woff +0 -0
  484. package/dist/assets/montserrat-latin-ext-700-normal-BOP2Nhf0.woff2 +0 -0
  485. package/dist/assets/montserrat-latin-ext-700-normal-DdDFr05Z.woff +0 -0
  486. package/dist/assets/montserrat-vietnamese-400-normal-BeEscFYY.woff +0 -0
  487. package/dist/assets/montserrat-vietnamese-400-normal-D4oHqQTd.woff2 +0 -0
  488. package/dist/assets/montserrat-vietnamese-700-normal-C0x1De3p.woff2 +0 -0
  489. package/dist/assets/montserrat-vietnamese-700-normal-DnwGT2D9.woff +0 -0
  490. package/dist/assets/playfair-display-cyrillic-400-normal-CjW2EstV.woff2 +0 -0
  491. package/dist/assets/playfair-display-cyrillic-400-normal-ZiRag6zj.woff +0 -0
  492. package/dist/assets/playfair-display-cyrillic-700-normal-Dk1mTcxf.woff +0 -0
  493. package/dist/assets/playfair-display-cyrillic-700-normal-Dw3uKy19.woff2 +0 -0
  494. package/dist/assets/playfair-display-latin-400-normal-CFtfchNt.woff2 +0 -0
  495. package/dist/assets/playfair-display-latin-400-normal-DHYHbkg3.woff +0 -0
  496. package/dist/assets/playfair-display-latin-700-normal-Bc_1Q1cG.woff +0 -0
  497. package/dist/assets/playfair-display-latin-700-normal-CuDiGg7c.woff2 +0 -0
  498. package/dist/assets/playfair-display-latin-ext-400-normal-BxlSGspa.woff2 +0 -0
  499. package/dist/assets/playfair-display-latin-ext-400-normal-qdZwdvNS.woff +0 -0
  500. package/dist/assets/playfair-display-latin-ext-700-normal-C58ejOkc.woff2 +0 -0
  501. package/dist/assets/playfair-display-latin-ext-700-normal-D5HUU8GT.woff +0 -0
  502. package/dist/assets/playfair-display-vietnamese-400-normal-BV2APVTb.woff2 +0 -0
  503. package/dist/assets/playfair-display-vietnamese-400-normal-BbvUAu4N.woff +0 -0
  504. package/dist/assets/playfair-display-vietnamese-700-normal-CaKJSIny.woff2 +0 -0
  505. package/dist/assets/playfair-display-vietnamese-700-normal-Cr1rw0mr.woff +0 -0
  506. package/dist/assets/proof/output-01.png +0 -0
  507. package/dist/assets/proof/output-02.png +0 -0
  508. package/dist/assets/proof/output-03.png +0 -0
  509. package/dist/assets/proof/output-04.png +0 -0
  510. package/dist/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  511. package/dist/assets/roboto-cyrillic-400-normal-DZJji7Rx.woff +0 -0
  512. package/dist/assets/roboto-cyrillic-500-normal-BI4HuXre.woff +0 -0
  513. package/dist/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  514. package/dist/assets/roboto-cyrillic-700-normal-BiSG5NnW.woff2 +0 -0
  515. package/dist/assets/roboto-cyrillic-700-normal-KqaQ5bNp.woff +0 -0
  516. package/dist/assets/roboto-cyrillic-ext-400-normal-DtZHuW6i.woff +0 -0
  517. package/dist/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  518. package/dist/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  519. package/dist/assets/roboto-cyrillic-ext-500-normal-C927yMrb.woff +0 -0
  520. package/dist/assets/roboto-cyrillic-ext-700-normal-BuQgZIrO.woff +0 -0
  521. package/dist/assets/roboto-cyrillic-ext-700-normal-UFn0vR9r.woff2 +0 -0
  522. package/dist/assets/roboto-greek-400-normal-CcizSnRP.woff +0 -0
  523. package/dist/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  524. package/dist/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  525. package/dist/assets/roboto-greek-500-normal-BLLWU9W-.woff +0 -0
  526. package/dist/assets/roboto-greek-700-normal-BcGn9doz.woff2 +0 -0
  527. package/dist/assets/roboto-greek-700-normal-D3kmAf0K.woff +0 -0
  528. package/dist/assets/roboto-latin-400-normal-068yxgMN.woff +0 -0
  529. package/dist/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  530. package/dist/assets/roboto-latin-500-normal-CC5nhZkh.woff +0 -0
  531. package/dist/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  532. package/dist/assets/roboto-latin-700-normal-CXeAXeti.woff2 +0 -0
  533. package/dist/assets/roboto-latin-700-normal-DUekQERp.woff +0 -0
  534. package/dist/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  535. package/dist/assets/roboto-latin-ext-400-normal-eTRLN0Nt.woff +0 -0
  536. package/dist/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  537. package/dist/assets/roboto-latin-ext-500-normal-FFcS8vBN.woff +0 -0
  538. package/dist/assets/roboto-latin-ext-700-normal-70GS1MYH.woff2 +0 -0
  539. package/dist/assets/roboto-latin-ext-700-normal-BS1OuQqR.woff +0 -0
  540. package/dist/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  541. package/dist/assets/roboto-math-400-normal-rzxYvyVt.woff +0 -0
  542. package/dist/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  543. package/dist/assets/roboto-math-500-normal-DaFX-ZC8.woff +0 -0
  544. package/dist/assets/roboto-math-700-normal-VUAI6Bz2.woff2 +0 -0
  545. package/dist/assets/roboto-math-700-normal-pYD1nhov.woff +0 -0
  546. package/dist/assets/roboto-symbols-400-normal-Tzuungub.woff +0 -0
  547. package/dist/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  548. package/dist/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  549. package/dist/assets/roboto-symbols-500-normal-CAhAe-ik.woff +0 -0
  550. package/dist/assets/roboto-symbols-700-normal-CuuvBBxy.woff +0 -0
  551. package/dist/assets/roboto-symbols-700-normal-rJi6RjIy.woff2 +0 -0
  552. package/dist/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  553. package/dist/assets/roboto-vietnamese-400-normal-DmXaN3yE.woff +0 -0
  554. package/dist/assets/roboto-vietnamese-500-normal-DW96CsrR.woff +0 -0
  555. package/dist/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  556. package/dist/assets/roboto-vietnamese-700-normal-Dz0HwF-w.woff +0 -0
  557. package/dist/assets/roboto-vietnamese-700-normal-iKxYNAzq.woff2 +0 -0
  558. package/dist/assets/rocket-BjOXauLe.js +2 -0
  559. package/dist/assets/rocket-BjOXauLe.js.map +1 -0
  560. package/dist/assets/shield-check-CFNhE_aD.js +2 -0
  561. package/dist/assets/shield-check-CFNhE_aD.js.map +1 -0
  562. package/dist/assets/signIn-CVoSzqCz.js +2 -0
  563. package/dist/assets/signIn-CVoSzqCz.js.map +1 -0
  564. package/dist/assets/smartphone-BcQB9gIh.js +2 -0
  565. package/dist/assets/smartphone-BcQB9gIh.js.map +1 -0
  566. package/dist/assets/terminal-CGhryJds.js +2 -0
  567. package/dist/assets/terminal-CGhryJds.js.map +1 -0
  568. package/dist/assets/useAuth-lZZC20Tl.js +4 -0
  569. package/dist/assets/useAuth-lZZC20Tl.js.map +1 -0
  570. package/dist/cancelled/index.html +34 -0
  571. package/dist/downloads/shipscreens-agent-cli-config.yml +48 -0
  572. package/dist/downloads/shipscreens-agent-cli-copy.csv +2 -0
  573. package/dist/favicon-16x16.png +0 -0
  574. package/dist/favicon-32x32.png +0 -0
  575. package/dist/favicon.ico +0 -0
  576. package/dist/favicon.svg +10 -0
  577. package/dist/forgot-password/index.html +34 -0
  578. package/dist/index.html +42 -0
  579. package/dist/legal/index.html +33 -0
  580. package/dist/og-image.png +0 -0
  581. package/dist/pricing/index.html +33 -0
  582. package/dist/privacy/index.html +33 -0
  583. package/dist/robots.txt +11 -0
  584. package/dist/signin/index.html +34 -0
  585. package/dist/signup/index.html +34 -0
  586. package/dist/sitemap.xml +51 -0
  587. package/dist/success/index.html +34 -0
  588. package/dist/templates/clean_blue.png +0 -0
  589. package/dist/templates/minimal_dark.png +0 -0
  590. package/dist/templates/split_modern.png +0 -0
  591. package/dist/templates/vibrant_gradient.png +0 -0
  592. package/dist/terms/index.html +33 -0
  593. package/dist/tools/5-panel-screenshot-framework/index.html +33 -0
  594. package/dist/tools/agent-cli/index.html +33 -0
  595. package/dist/tools/app-review-aso/index.html +33 -0
  596. package/dist/tools/fastlane-screenshots/index.html +33 -0
  597. package/dist/tools/first-export/index.html +33 -0
  598. package/dist/tools/index.html +33 -0
  599. package/dist/tools/screenshot-workload-calculator/index.html +33 -0
  600. package/dist/tools/store-assets-pipeline/index.html +33 -0
  601. package/package.json +36 -0
  602. package/src/constants/devices.js +122 -0
  603. package/templates/agent/agent-prompt.txt +21 -0
  604. package/templates/agent/copy.csv +2 -0
  605. package/templates/agent/shipscreens.config.yml +48 -0
@@ -0,0 +1,664 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from 'node:util';
3
+ import fs from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { resolveDefaultConfigPath } from '../cli/loadConfig.js';
6
+ import { runValidate } from '../cli/commands/validate.js';
7
+ import { runLock } from '../cli/commands/lock.js';
8
+ import { runBuild } from '../cli/commands/build.js';
9
+ import { runExportFramefile } from '../cli/commands/exportFramefile.js';
10
+ import { runVerify } from '../cli/commands/verify.js';
11
+ import { runStage } from '../cli/commands/stage.js';
12
+ import { runPlan } from '../cli/commands/plan.js';
13
+ import { runAuth } from '../cli/commands/auth.js';
14
+ import { runInit } from '../cli/commands/init.js';
15
+ import { runWizard } from '../cli/commands/wizard.js';
16
+ import { runCopyImport } from '../cli/commands/copyImport.js';
17
+ import { resolveCliAuth } from '../cli/auth.js';
18
+ import { listTemplateIds, resolveTemplateConfig } from '../cli/templateConfig.js';
19
+ import { loadShipScreensConfig } from '../cli/loadConfig.js';
20
+ import { collectAssetReferences } from '../cli/assetRefs.js';
21
+ import {
22
+ createSolidPng,
23
+ PLACEHOLDER_COLOR,
24
+ PLACEHOLDER_HEIGHT,
25
+ PLACEHOLDER_WIDTH,
26
+ } from '../cli/commands/init.js';
27
+
28
+ function printHelp() {
29
+ console.log(`ShipScreens CLI
30
+
31
+ Usage:
32
+ shipscreens init [--dir <path>] [--slides <n>] [--locales <id,id>] [--devices <id,id>] [--force] [--wizard] [--style <value>] [--template <id>]
33
+ shipscreens wizard [--dir <path>] [--force] [--style <value>] [--template <id>] [--defaults]
34
+ shipscreens demo [--out <dir>] [--slides <n>] [--locales <id,id>] [--devices <id,id>] [--template <id>] [--mode <raw|rendered>] [--zip-out <path>] [--profile <appstore|playstore|any>] [--force]
35
+ shipscreens agent-run [--dir <path>] [--slides <n>] [--locales <id,id>] [--devices <id,id>] [--style <value>] [--template <id>] [--mode <raw|rendered>] [--out <dir>] [--zip] [--profile <appstore|playstore|any>] [--require-pro] [--force]
36
+ shipscreens validate [-c shipscreens.config.yml]
37
+ shipscreens lock [-c shipscreens.config.yml] [--out shipscreens.lock.json] [--check]
38
+ shipscreens build [-c shipscreens.config.yml] [--mode shipscreens|rendered|raw|frameit] [--format dir|zip] [--out <dir>] [--zip] [--zip-out <path>] [--clean]
39
+ shipscreens verify [-c shipscreens.config.yml] [--out <dir>] [--zip] [--zip-out <path>] [--profile appstore|playstore|any]
40
+ shipscreens stage [-c shipscreens.config.yml] [--from <dir>] --out <dir> [--profile appstore|playstore|any]
41
+ shipscreens export framefile [-c shipscreens.config.yml] [--ios-dir fastlane/screenshots] [--strings-encoding utf8|utf16le|utf16be] [--framefile-strategy merge|overwrite] [--check]
42
+ shipscreens plan [-c shipscreens.config.yml] [--out <dir>] [--zip-out <path>] [--profile appstore|playstore|any] [--json]
43
+ shipscreens copy import [-c shipscreens.config.yml] [--csv <path>] [--import-mode merge|replace]
44
+ shipscreens auth <login|finish|status|logout> [--domain <cognito-domain>] [--client-id <id>] [--api-base <url>] [--port <port>] [--manual] [--redirect-url <url>]
45
+
46
+ Commands:
47
+ init Create a starter config + placeholder PNGs + copy.csv
48
+ wizard Step-by-step setup (locales/devices/template)
49
+ demo Create a demo project + export (no assets required)
50
+ agent-run Non-interactive end-to-end flow (init -> validate -> build -> verify)
51
+ validate Validate shipscreens.config.yml (schema + asset paths)
52
+ lock Generate shipscreens.lock.json with sha256 hashes
53
+ build Generate Fastlane-ready outputs (headless Chromium, zero-padded filenames)
54
+ verify Verify Fastlane outputs (dir and/or zip)
55
+ stage Copy only upload-ready files into a new root
56
+ export Export helper files for other tools
57
+ plan Print a deterministic build/stage plan (JSON)
58
+ copy Import locale copy from copy.csv into shipscreens.config.yml
59
+ auth Manage CLI sign-in (required to remove watermarks in CLI exports)
60
+
61
+ Options:
62
+ -c, --config <path> Path to shipscreens.config.yml (default: ./shipscreens.config.yml)
63
+ --dir <path> Output directory for init (default: .)
64
+ --slides <n> Number of slides to scaffold (init, default: 5, max: 10)
65
+ --locales <list> Comma-separated locales for init (default: en-US)
66
+ --devices <list> Comma-separated device ids for init (default: iphone69,pixel8)
67
+ --force Overwrite files when running init
68
+ --wizard Run step-by-step init prompts
69
+ --style <value> Style preset: default | template:<id> | <template-id>
70
+ --template <id> Template preset (alias for --style template:<id>)
71
+ --defaults Skip the style prompt in wizard (use default/no style)
72
+ --csv <path> Path to copy.csv for copy import (default: ./copy.csv)
73
+ --import-mode <mode> CSV import mode (merge|replace, default: merge)
74
+ --out <path> Lock output file path (lock) or output root directory (build/verify/stage)
75
+ --zip-out <path> ZIP output file path (default: <out>/fastlane_assets.zip)
76
+ --profile <appstore|playstore|any> Strict verification/staging rules per store (default: any)
77
+ --from <dir> Source output root for staging (default: config dir)
78
+ --check Verify outputs are valid/up-to-date (no write)
79
+ --json Emit machine-readable JSON (plan)
80
+ --mode <shipscreens|rendered|raw|frameit> Build mode (default: rendered). shipscreens=rendered alias, frameit runs raw + export framefile --check
81
+ --format <dir|zip> Output format (default: dir)
82
+ --zip Also write a ZIP (same as --format zip)
83
+ --clean Delete existing outputs for the current locale/device/bucket before writing
84
+ --require-pro Fail the build if Pro access is not available
85
+ --manual Print a login URL instead of starting a local callback server
86
+ --redirect-url <url> Full redirect URL after manual login (for auth finish)
87
+ --code <code> OAuth authorization code (manual finish)
88
+ --state <state> OAuth state (manual finish)
89
+ --ios-dir <path> iOS output directory (default: fastlane/screenshots)
90
+ --android-dir <path> Android output directory (default: fastlane/metadata/android)
91
+ --strings-encoding <utf8|utf16le|utf16be> Encoding for generated .strings (export framefile / build --mode frameit) (default: utf8)
92
+ --framefile-strategy <merge|overwrite> How to handle fastlane/screenshots/Framefile.json (export framefile / build --mode frameit) (default: merge)
93
+ -h, --help Show help
94
+
95
+ Quickstart (no browser):
96
+ shipscreens wizard
97
+ shipscreens build --mode raw --zip --out out
98
+ shipscreens verify --out out --zip --profile appstore
99
+ `);
100
+ }
101
+
102
+ const STYLE_DEFAULT_ALIASES = new Set(['default', 'none', 'no-style', 'nostyle', 'no_style']);
103
+
104
+ const normalizeStyleValue = (value) => String(value || '').trim();
105
+
106
+ function resolveStylePreset({ styleFlag, templateFlag }) {
107
+ const styleValue = normalizeStyleValue(styleFlag);
108
+ const templateValue = normalizeStyleValue(templateFlag);
109
+
110
+ if (styleValue && templateValue) {
111
+ throw new Error('Use either --style or --template (not both).');
112
+ }
113
+
114
+ if (templateValue) {
115
+ const resolved = resolveTemplateConfig(templateValue);
116
+ if (!resolved) {
117
+ const ids = listTemplateIds().join(', ');
118
+ throw new Error(`Unknown template "${templateValue}". Available: ${ids}`);
119
+ }
120
+ return { presetStyle: resolved.style, presetAssets: resolved.assets, skipStylePrompt: true };
121
+ }
122
+
123
+ if (!styleValue) {
124
+ return { presetStyle: undefined, presetAssets: undefined, skipStylePrompt: false };
125
+ }
126
+
127
+ const normalized = styleValue.toLowerCase();
128
+ if (STYLE_DEFAULT_ALIASES.has(normalized)) {
129
+ return { presetStyle: undefined, presetAssets: undefined, skipStylePrompt: true };
130
+ }
131
+
132
+ const templateKey = normalized.startsWith('template:') ? styleValue.slice('template:'.length).trim() : styleValue;
133
+ const resolved = resolveTemplateConfig(templateKey);
134
+ if (!resolved) {
135
+ const ids = listTemplateIds().join(', ');
136
+ throw new Error(`Unknown style/template "${styleValue}". Available templates: ${ids}`);
137
+ }
138
+ return { presetStyle: resolved.style, presetAssets: resolved.assets, skipStylePrompt: true };
139
+ }
140
+
141
+ function formatDemoTimestamp(date = new Date()) {
142
+ const pad = (value) => String(value).padStart(2, '0');
143
+ return (
144
+ `${date.getFullYear()}` +
145
+ `${pad(date.getMonth() + 1)}` +
146
+ `${pad(date.getDate())}` +
147
+ `-` +
148
+ `${pad(date.getHours())}` +
149
+ `${pad(date.getMinutes())}` +
150
+ `${pad(date.getSeconds())}`
151
+ );
152
+ }
153
+
154
+ function formatDemoIndex(value, width) {
155
+ return String(value).padStart(width, '0');
156
+ }
157
+
158
+ async function pathExists(targetPath) {
159
+ try {
160
+ await fs.stat(targetPath);
161
+ return true;
162
+ } catch (err) {
163
+ if (err?.code === 'ENOENT') return false;
164
+ throw err;
165
+ }
166
+ }
167
+
168
+ async function findPlaceholderAssets({ configPath }) {
169
+ const { config, configDir } = await loadShipScreensConfig(configPath);
170
+ const placeholder = createSolidPng({
171
+ width: PLACEHOLDER_WIDTH,
172
+ height: PLACEHOLDER_HEIGHT,
173
+ color: PLACEHOLDER_COLOR,
174
+ });
175
+ const refs = collectAssetReferences(config);
176
+ const byPath = new Map();
177
+ refs.forEach((ref) => {
178
+ const existing = byPath.get(ref.path) || [];
179
+ existing.push(ref.pointer);
180
+ byPath.set(ref.path, existing);
181
+ });
182
+
183
+ const matches = [];
184
+ for (const [assetPath, pointers] of byPath.entries()) {
185
+ const absolutePath = path.resolve(configDir, assetPath);
186
+ const buffer = await fs.readFile(absolutePath);
187
+ if (buffer.length !== placeholder.length) continue;
188
+ if (!buffer.equals(placeholder)) continue;
189
+ matches.push({ assetPath, pointers });
190
+ }
191
+ return matches;
192
+ }
193
+
194
+ async function main() {
195
+ const { positionals, values } = parseArgs({
196
+ args: process.argv.slice(2),
197
+ allowPositionals: true,
198
+ options: {
199
+ config: { type: 'string', short: 'c' },
200
+ out: { type: 'string' },
201
+ check: { type: 'boolean' },
202
+ mode: { type: 'string' },
203
+ format: { type: 'string' },
204
+ zip: { type: 'boolean' },
205
+ 'zip-out': { type: 'string' },
206
+ clean: { type: 'boolean' },
207
+ 'ios-dir': { type: 'string' },
208
+ 'android-dir': { type: 'string' },
209
+ 'strings-encoding': { type: 'string' },
210
+ 'framefile-strategy': { type: 'string' },
211
+ profile: { type: 'string' },
212
+ from: { type: 'string' },
213
+ json: { type: 'boolean' },
214
+ 'require-pro': { type: 'boolean' },
215
+ manual: { type: 'boolean' },
216
+ 'redirect-url': { type: 'string' },
217
+ code: { type: 'string' },
218
+ state: { type: 'string' },
219
+ domain: { type: 'string' },
220
+ 'client-id': { type: 'string' },
221
+ 'api-base': { type: 'string' },
222
+ port: { type: 'string' },
223
+ dir: { type: 'string' },
224
+ slides: { type: 'string' },
225
+ locales: { type: 'string' },
226
+ devices: { type: 'string' },
227
+ force: { type: 'boolean' },
228
+ wizard: { type: 'boolean' },
229
+ style: { type: 'string' },
230
+ template: { type: 'string' },
231
+ defaults: { type: 'boolean' },
232
+ csv: { type: 'string' },
233
+ 'import-mode': { type: 'string' },
234
+ help: { type: 'boolean', short: 'h' },
235
+ },
236
+ });
237
+
238
+ const command = positionals[0];
239
+ if (values.help || !command || command === 'help') {
240
+ printHelp();
241
+ return;
242
+ }
243
+
244
+ if (command === 'auth') {
245
+ await runAuth({ subcommand: positionals[1], values });
246
+ return;
247
+ }
248
+
249
+ if (command === 'wizard') {
250
+ const stylePreset = resolveStylePreset({ styleFlag: values.style, templateFlag: values.template });
251
+ const result = await runWizard({
252
+ dir: values.dir,
253
+ force: values.force,
254
+ presetStyle: stylePreset.presetStyle,
255
+ presetAssets: stylePreset.presetAssets,
256
+ skipStylePrompt: Boolean(values.defaults) || stylePreset.skipStylePrompt,
257
+ slides: values.slides,
258
+ locales: values.locales,
259
+ devices: values.devices,
260
+ });
261
+ console.log(
262
+ `OK: created starter files in ${result.dir}\n` +
263
+ `- ${result.configPath}\n` +
264
+ `- ${result.csvPath}\n` +
265
+ `Next: replace placeholder PNGs in assets/, then run:\n` +
266
+ ` shipscreens build --mode raw --zip --out out\n` +
267
+ ` shipscreens verify --out out --zip --profile appstore\n` +
268
+ `Pro unlock (remove watermark):\n` +
269
+ ` shipscreens auth login`
270
+ );
271
+ return;
272
+ }
273
+
274
+ if (command === 'demo') {
275
+ const stylePreset = resolveStylePreset({ styleFlag: values.style, templateFlag: values.template });
276
+ const rawOut = typeof values.out === 'string' ? values.out.trim() : '';
277
+ const demoRoot = rawOut
278
+ ? path.resolve(process.cwd(), rawOut)
279
+ : path.resolve(process.cwd(), 'out', `shipscreens-demo-${formatDemoTimestamp()}`);
280
+ const projectDir = path.join(demoRoot, 'project');
281
+ const buildOutDir = path.join(demoRoot, 'build');
282
+ const stageOutDir = path.join(demoRoot, 'stage');
283
+
284
+ const initResult = await runInit({
285
+ dir: projectDir,
286
+ slides: values.slides,
287
+ locales: values.locales,
288
+ devices: values.devices,
289
+ assets: stylePreset.presetAssets,
290
+ style: stylePreset.presetStyle,
291
+ force: Boolean(values.force),
292
+ });
293
+
294
+ // Overwrite placeholders with deterministic, non-placeholder demo PNGs.
295
+ const demoColors = [
296
+ [59, 130, 246, 255], // blue
297
+ [16, 185, 129, 255], // emerald
298
+ [245, 158, 11, 255], // amber
299
+ [236, 72, 153, 255], // pink
300
+ [139, 92, 246, 255], // violet
301
+ [20, 184, 166, 255], // teal
302
+ ];
303
+ const indexWidth = Math.max(2, String(initResult.slides).length);
304
+ for (let localeIndex = 0; localeIndex < initResult.locales.length; localeIndex += 1) {
305
+ const localeId = initResult.locales[localeIndex];
306
+ for (let i = 1; i <= initResult.slides; i += 1) {
307
+ const color = demoColors[(i - 1 + localeIndex) % demoColors.length];
308
+ const png = createSolidPng({
309
+ width: PLACEHOLDER_WIDTH,
310
+ height: PLACEHOLDER_HEIGHT,
311
+ color,
312
+ });
313
+ const index = formatDemoIndex(i, indexWidth);
314
+ const assetPath = path.join(projectDir, 'assets', localeId, `${index}.png`);
315
+ await fs.writeFile(assetPath, png);
316
+ }
317
+ }
318
+
319
+ const configPath = path.join(projectDir, 'shipscreens.config.yml');
320
+ await runValidate({ configPath });
321
+ await runLock({ configPath });
322
+
323
+ const mode = String(values.mode || 'raw')
324
+ .trim()
325
+ .toLowerCase();
326
+ if (!['raw', 'rendered'].includes(mode)) {
327
+ throw new Error(`Demo supports --mode raw|rendered (received: ${values.mode || '(missing)'})`);
328
+ }
329
+
330
+ const { config } = await loadShipScreensConfig(configPath);
331
+ const hasAndroid = (config.devices || []).some((device) => device.platform === 'android');
332
+ const hasIos = (config.devices || []).some((device) => device.platform !== 'android');
333
+ const defaultProfile = hasIos && !hasAndroid ? 'appstore' : !hasIos && hasAndroid ? 'playstore' : 'any';
334
+ const profile = values.profile || defaultProfile;
335
+
336
+ const rawZipOut = typeof values['zip-out'] === 'string' ? values['zip-out'].trim() : '';
337
+ const zipOut = rawZipOut || undefined;
338
+ const { token: cliAuthToken } = await resolveCliAuth({ requirePro: false });
339
+
340
+ const result = await runBuild({
341
+ configPath,
342
+ format: 'zip',
343
+ mode,
344
+ outDir: buildOutDir,
345
+ zipOut,
346
+ clean: true,
347
+ cliAuthToken,
348
+ });
349
+
350
+ const verifyResult = await runVerify({
351
+ configPath,
352
+ outDir: buildOutDir,
353
+ zipOut,
354
+ zip: true,
355
+ profile,
356
+ });
357
+
358
+ const stageResult = await runStage({
359
+ configPath,
360
+ fromDir: buildOutDir,
361
+ outDir: stageOutDir,
362
+ profile,
363
+ });
364
+
365
+ const summary = [
366
+ `OK: demo export completed`,
367
+ `${verifyResult.locales} locale(s)`,
368
+ `${verifyResult.slides} slide(s)`,
369
+ `${verifyResult.iosDevices} iOS device(s) -> ${verifyResult.iosDir}`,
370
+ `${verifyResult.androidDevices} Android device(s) -> ${verifyResult.androidDir}`,
371
+ `zip -> ${result.zipPath || verifyResult.zipPath || '(missing)'}`,
372
+ `stage -> ${stageResult.out}`,
373
+ `project -> ${projectDir}`,
374
+ ];
375
+ console.log(summary.join(', '));
376
+ return;
377
+ }
378
+
379
+ if (command === 'init') {
380
+ const stylePreset = resolveStylePreset({ styleFlag: values.style, templateFlag: values.template });
381
+ const result = values.wizard
382
+ ? await runWizard({
383
+ dir: values.dir,
384
+ force: values.force,
385
+ presetStyle: stylePreset.presetStyle,
386
+ presetAssets: stylePreset.presetAssets,
387
+ skipStylePrompt: Boolean(values.defaults) || stylePreset.skipStylePrompt,
388
+ slides: values.slides,
389
+ locales: values.locales,
390
+ devices: values.devices,
391
+ })
392
+ : await runInit({
393
+ dir: values.dir,
394
+ slides: values.slides,
395
+ locales: values.locales,
396
+ devices: values.devices,
397
+ assets: stylePreset.presetAssets,
398
+ style: stylePreset.presetStyle,
399
+ force: values.force,
400
+ });
401
+ console.log(
402
+ `OK: created starter files in ${result.dir}\n` +
403
+ `- ${result.configPath}\n` +
404
+ `- ${result.csvPath}\n` +
405
+ `Next: replace placeholder PNGs in assets/, then run:\n` +
406
+ ` shipscreens build --mode raw --zip --out out\n` +
407
+ ` shipscreens verify --out out --zip --profile appstore\n` +
408
+ `Pro unlock (remove watermark):\n` +
409
+ ` shipscreens auth login`
410
+ );
411
+ return;
412
+ }
413
+
414
+ if (command === 'agent-run') {
415
+ const stylePreset = resolveStylePreset({ styleFlag: values.style, templateFlag: values.template });
416
+ const targetDir = path.resolve(process.cwd(), values.dir || '.');
417
+ const configPath = path.join(targetDir, 'shipscreens.config.yml');
418
+ const hasConfig = await pathExists(configPath);
419
+
420
+ if (!hasConfig || values.force) {
421
+ await runInit({
422
+ dir: targetDir,
423
+ slides: values.slides,
424
+ locales: values.locales,
425
+ devices: values.devices,
426
+ assets: stylePreset.presetAssets,
427
+ style: stylePreset.presetStyle,
428
+ force: Boolean(values.force),
429
+ });
430
+ }
431
+
432
+ try {
433
+ await runValidate({ configPath });
434
+ } catch (err) {
435
+ const message = err?.message || String(err);
436
+ throw new Error(`Missing assets. Replace placeholder PNGs, then rerun.\n${message}`);
437
+ }
438
+ const placeholders = await findPlaceholderAssets({ configPath });
439
+ if (placeholders.length) {
440
+ const lines = placeholders.flatMap((item) => [
441
+ `Placeholder PNG detected: ${item.assetPath}`,
442
+ ...item.pointers.map((pointer) => ` - referenced by ${pointer}`),
443
+ ]);
444
+ throw new Error(
445
+ `Placeholder PNGs found. Replace them with real screenshots before building.\n` + lines.join('\n')
446
+ );
447
+ }
448
+
449
+ const rawZipOut = typeof values['zip-out'] === 'string' ? values['zip-out'].trim() : '';
450
+ const defaultZip = !values.format && !values.zip && !rawZipOut;
451
+ const format = values.format || (values.zip || rawZipOut || defaultZip ? 'zip' : 'dir');
452
+ const mode = values.mode || 'raw';
453
+ const outDir = values.out || 'out/agent';
454
+ const zipOut = rawZipOut || undefined;
455
+ const zip = format === 'zip' || Boolean(zipOut);
456
+ const { config } = await loadShipScreensConfig(configPath);
457
+ const hasAndroid = (config.devices || []).some((device) => device.platform === 'android');
458
+ const hasIos = (config.devices || []).some((device) => device.platform !== 'android');
459
+ const defaultProfile = hasIos && !hasAndroid ? 'appstore' : !hasIos && hasAndroid ? 'playstore' : 'any';
460
+ const profile = values.profile || defaultProfile;
461
+ const requirePro = Boolean(values['require-pro']);
462
+ const { token: cliAuthToken } = await resolveCliAuth({ requirePro });
463
+
464
+ const result = await runBuild({
465
+ configPath,
466
+ format,
467
+ mode,
468
+ outDir,
469
+ iosDir: values['ios-dir'],
470
+ androidDir: values['android-dir'],
471
+ zipOut,
472
+ stringsEncoding: values['strings-encoding'],
473
+ framefileStrategy: values['framefile-strategy'],
474
+ clean: values.clean,
475
+ cliAuthToken,
476
+ });
477
+
478
+ const verifyResult = await runVerify({
479
+ configPath,
480
+ outDir,
481
+ iosDir: values['ios-dir'],
482
+ androidDir: values['android-dir'],
483
+ zipOut,
484
+ zip,
485
+ profile,
486
+ });
487
+
488
+ const summary = [
489
+ `OK: agent-run completed`,
490
+ `${verifyResult.locales} locale(s)`,
491
+ `${verifyResult.slides} slide(s)`,
492
+ `${verifyResult.iosDevices} iOS device(s) -> ${verifyResult.iosDir}`,
493
+ `${verifyResult.androidDevices} Android device(s) -> ${verifyResult.androidDir}`,
494
+ ];
495
+ if (result.zipPath || verifyResult.zipPath) summary.push(`zip -> ${result.zipPath || verifyResult.zipPath}`);
496
+ console.log(summary.join(', '));
497
+ return;
498
+ }
499
+
500
+ const configPath = values.config ?? (await resolveDefaultConfigPath());
501
+ if (!configPath) {
502
+ throw new Error(
503
+ 'Config not found. Expected ./shipscreens.config.yml (or pass --config).\n' +
504
+ 'Run: shipscreens init'
505
+ );
506
+ }
507
+
508
+ if (command === 'copy') {
509
+ const subcommand = positionals[1];
510
+ if (subcommand === 'import') {
511
+ const result = await runCopyImport({
512
+ configPath,
513
+ csvPath: values.csv,
514
+ mode: values['import-mode'],
515
+ });
516
+ console.log(
517
+ `OK: imported copy.csv (${result.mode}) -> ${result.configPath}\n` +
518
+ `- locales: ${result.locales}\n` +
519
+ `- slides: ${result.slides}`
520
+ );
521
+ return;
522
+ }
523
+ throw new Error(`Unknown copy command: ${subcommand || '(missing)'}`);
524
+ }
525
+
526
+ if (command === 'validate') {
527
+ const result = await runValidate({ configPath });
528
+ console.log(`OK: validated (${result.assetCount} asset(s))`);
529
+ return;
530
+ }
531
+
532
+ if (command === 'lock') {
533
+ const result = await runLock({ configPath, outPath: values.out, check: values.check });
534
+ if (result.checked) {
535
+ console.log(`OK: lockfile up to date (${result.assetCount} asset(s)) -> ${result.outPath}`);
536
+ } else {
537
+ console.log(`OK: wrote lockfile (${result.assetCount} asset(s)) -> ${result.outPath}`);
538
+ }
539
+ return;
540
+ }
541
+
542
+ if (command === 'build') {
543
+ const format = values.zip ? 'zip' : values.format || 'dir';
544
+ const rawOut = typeof values.out === 'string' ? values.out.trim() : '';
545
+ const rawZipOut = typeof values['zip-out'] === 'string' ? values['zip-out'].trim() : '';
546
+
547
+ let outDir = rawOut || undefined;
548
+ let zipOut = rawZipOut || undefined;
549
+ if ((values.zip || format === 'zip') && outDir && outDir.toLowerCase().endsWith('.zip') && !zipOut) {
550
+ zipOut = outDir;
551
+ outDir = undefined;
552
+ console.warn(
553
+ `DEPRECATED: shipscreens build --out <file.zip> will change behavior in a future release.\n` +
554
+ `Use: shipscreens build --zip-out <file.zip>\n` +
555
+ `Note: --out now specifies an output directory root.`
556
+ );
557
+ }
558
+
559
+ const requirePro = Boolean(values['require-pro']);
560
+ const { token: cliAuthToken } = await resolveCliAuth({ requirePro });
561
+ const result = await runBuild({
562
+ configPath,
563
+ format,
564
+ mode: values.mode,
565
+ outDir,
566
+ iosDir: values['ios-dir'],
567
+ androidDir: values['android-dir'],
568
+ zipOut,
569
+ stringsEncoding: values['strings-encoding'],
570
+ framefileStrategy: values['framefile-strategy'],
571
+ clean: values.clean,
572
+ cliAuthToken,
573
+ });
574
+ const summary = [
575
+ `OK: built`,
576
+ `${result.locales} locale(s)`,
577
+ `${result.slides} slide(s)`,
578
+ `${result.iosDevices} iOS device(s) -> ${result.iosDir}`,
579
+ `${result.androidDevices} Android device(s) -> ${result.androidDir}`,
580
+ ];
581
+ if (result.zipPath) summary.push(`zip -> ${result.zipPath}`);
582
+ console.log(summary.join(', '));
583
+ return;
584
+ }
585
+
586
+ if (command === 'verify') {
587
+ const rawOut = typeof values.out === 'string' ? values.out.trim() : '';
588
+ const rawZipOut = typeof values['zip-out'] === 'string' ? values['zip-out'].trim() : '';
589
+ const result = await runVerify({
590
+ configPath,
591
+ outDir: rawOut || undefined,
592
+ iosDir: values['ios-dir'],
593
+ androidDir: values['android-dir'],
594
+ zipOut: rawZipOut || undefined,
595
+ zip: values.zip || Boolean(rawZipOut),
596
+ profile: values.profile,
597
+ });
598
+ const summary = [
599
+ `OK: verified`,
600
+ `${result.locales} locale(s)`,
601
+ `${result.slides} slide(s)`,
602
+ `${result.iosDevices} iOS device(s) -> ${result.iosDir}`,
603
+ `${result.androidDevices} Android device(s) -> ${result.androidDir}`,
604
+ ];
605
+ if (result.zipPath) summary.push(`zip -> ${result.zipPath}`);
606
+ console.log(summary.join(', '));
607
+ return;
608
+ }
609
+
610
+ if (command === 'stage') {
611
+ const rawFrom = typeof values.from === 'string' ? values.from.trim() : '';
612
+ const rawOut = typeof values.out === 'string' ? values.out.trim() : '';
613
+ const result = await runStage({
614
+ configPath,
615
+ fromDir: rawFrom || undefined,
616
+ outDir: rawOut || undefined,
617
+ profile: values.profile,
618
+ });
619
+ const details = result.iosVariant ? `, ios=${result.iosVariant}` : '';
620
+ console.log(`OK: staged (${result.profile}${details}), ${result.files} file(s) -> ${result.out}`);
621
+ return;
622
+ }
623
+
624
+ if (command === 'plan') {
625
+ const plan = await runPlan({
626
+ configPath,
627
+ outDir: values.out,
628
+ iosDir: values['ios-dir'],
629
+ androidDir: values['android-dir'],
630
+ zipOut: values['zip-out'],
631
+ profile: values.profile,
632
+ });
633
+ process.stdout.write(JSON.stringify(plan, null, 2) + '\n');
634
+ return;
635
+ }
636
+
637
+ if (command === 'export') {
638
+ const subcommand = positionals[1];
639
+ if (subcommand === 'framefile') {
640
+ const result = await runExportFramefile({
641
+ configPath,
642
+ iosDir: values['ios-dir'],
643
+ stringsEncoding: values['strings-encoding'],
644
+ framefileStrategy: values['framefile-strategy'],
645
+ check: values.check,
646
+ });
647
+ if (result.checked) {
648
+ console.log(`OK: frameit inputs look valid (${result.locales} locale(s)) -> ${result.iosDir}`);
649
+ } else {
650
+ console.log(`OK: wrote Framefile.json + .strings for ${result.locales} locale(s) -> ${result.iosDir}`);
651
+ }
652
+ return;
653
+ }
654
+
655
+ throw new Error(`Unknown export target: ${subcommand || '(missing)'}`);
656
+ }
657
+
658
+ throw new Error(`Unknown command: ${command}`);
659
+ }
660
+
661
+ main().catch((err) => {
662
+ console.error(err?.message || String(err));
663
+ process.exitCode = 1;
664
+ });
@@ -0,0 +1,33 @@
1
+ export function collectAssetReferences(config) {
2
+ const refs = [];
3
+
4
+ const add = (assetPath, pointer) => {
5
+ if (!assetPath) return;
6
+ refs.push({ path: assetPath, pointer });
7
+ };
8
+
9
+ if (config?.assets?.background?.type === 'image') {
10
+ add(config.assets.background.path, 'assets.background.path');
11
+ }
12
+
13
+ if (config?.assets?.logo?.path) {
14
+ add(config.assets.logo.path, 'assets.logo.path');
15
+ }
16
+
17
+ if (Array.isArray(config?.assets?.badges)) {
18
+ config.assets.badges.forEach((badge, idx) => add(badge.path, `assets.badges[${idx}].path`));
19
+ }
20
+
21
+ if (Array.isArray(config?.slides)) {
22
+ config.slides.forEach((slide, idx) => {
23
+ add(slide?.screenshot?.path, `slides[${idx}].screenshot.path`);
24
+ const perLocale = slide?.screenshotsByLocale || {};
25
+ Object.entries(perLocale).forEach(([localeId, assetPath]) =>
26
+ add(assetPath, `slides[${idx}].screenshotsByLocale.${localeId}`)
27
+ );
28
+ });
29
+ }
30
+
31
+ return refs;
32
+ }
33
+