shipscreens 0.1.5 → 0.1.6

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 (507) hide show
  1. package/README.md +37 -1
  2. package/bin/shipscreens.js +133 -12
  3. package/cli/auth.js +31 -11
  4. package/cli/commands/build.js +9 -1
  5. package/cli/commands/copyCheck.js +265 -0
  6. package/cli/commands/plan.js +7 -3
  7. package/cli/commands/stage.js +13 -3
  8. package/cli/commands/verify.js +7 -2
  9. package/cli/mcpBootstrap.js +174 -0
  10. package/cli/schema.js +19 -0
  11. package/cli/variantScope.js +58 -0
  12. package/dist/.well-known/ai-agents.json +217 -4
  13. package/dist/.well-known/llms-full.txt +114 -6
  14. package/dist/.well-known/llms.txt +64 -2
  15. package/dist/.well-known/mcp-server.json +4 -4
  16. package/dist/ai-agents.json +217 -4
  17. package/dist/app/assets/AgentCli-xKYtzL3B.js +17 -0
  18. package/dist/app/assets/AgentCli-xKYtzL3B.js.map +1 -0
  19. package/dist/{assets/App-DPi9LW-y.js → app/assets/App-C1cNw_fn.js} +10 -10
  20. package/dist/app/assets/App-C1cNw_fn.js.map +1 -0
  21. package/dist/app/assets/App-oQfE_p3A.css +1 -0
  22. package/dist/app/assets/AppReviewAso-CaIT-L7Z.js +4 -0
  23. package/dist/app/assets/AppReviewAso-CaIT-L7Z.js.map +1 -0
  24. package/dist/app/assets/{Cancelled-BeS-WlPj.js → Cancelled-Dmw7PTD-.js} +2 -2
  25. package/dist/app/assets/{Cancelled-BeS-WlPj.js.map → Cancelled-Dmw7PTD-.js.map} +1 -1
  26. package/dist/app/assets/CopyButton-CPRHmu8l.js +2 -0
  27. package/dist/app/assets/CopyButton-CPRHmu8l.js.map +1 -0
  28. package/dist/app/assets/DesignPartner-Ckp1GhNv.js +4 -0
  29. package/dist/app/assets/DesignPartner-Ckp1GhNv.js.map +1 -0
  30. package/dist/app/assets/FastlaneScreenshots-CB-zv5Us.js +100 -0
  31. package/dist/app/assets/FastlaneScreenshots-CB-zv5Us.js.map +1 -0
  32. package/dist/app/assets/FirstExport-RXbvVQdK.js +6 -0
  33. package/dist/app/assets/FirstExport-RXbvVQdK.js.map +1 -0
  34. package/dist/app/assets/{FitPanel-DzYzTMEi.js → FitPanel-ic91y-49.js} +2 -2
  35. package/dist/app/assets/{FitPanel-DzYzTMEi.js.map → FitPanel-ic91y-49.js.map} +1 -1
  36. package/dist/app/assets/FivePanelFramework-BZKNcycb.js +62 -0
  37. package/dist/app/assets/FivePanelFramework-BZKNcycb.js.map +1 -0
  38. package/dist/app/assets/{ForgotPassword-DuHNHuUe.js → ForgotPassword-CKOfAvWk.js} +2 -2
  39. package/dist/{assets/ForgotPassword-DuHNHuUe.js.map → app/assets/ForgotPassword-CKOfAvWk.js.map} +1 -1
  40. package/dist/app/assets/Landing-D0cuDDUk.js +2 -0
  41. package/dist/app/assets/Landing-D0cuDDUk.js.map +1 -0
  42. package/dist/app/assets/{LanguageSwitcher-CfUhVVuT.js → LanguageSwitcher-BrToLEgF.js} +2 -2
  43. package/dist/app/assets/{LanguageSwitcher-CfUhVVuT.js.map → LanguageSwitcher-BrToLEgF.js.map} +1 -1
  44. package/dist/app/assets/{Legal-p-YIX5Jv.js → Legal-Cm-hVzjY.js} +2 -2
  45. package/dist/app/assets/{Legal-p-YIX5Jv.js.map → Legal-Cm-hVzjY.js.map} +1 -1
  46. package/dist/app/assets/{NotFound-XohZYy7w.js → NotFound-B0I6I440.js} +2 -2
  47. package/dist/app/assets/{NotFound-XohZYy7w.js.map → NotFound-B0I6I440.js.map} +1 -1
  48. package/dist/app/assets/Pricing-p-NIjjtK.js +29 -0
  49. package/dist/app/assets/Pricing-p-NIjjtK.js.map +1 -0
  50. package/dist/app/assets/{Privacy-D8m3h6P-.js → Privacy-BhfPkK0y.js} +2 -2
  51. package/dist/app/assets/{Privacy-D8m3h6P-.js.map → Privacy-BhfPkK0y.js.map} +1 -1
  52. package/dist/app/assets/Proof-D-7QbTGX.js +20 -0
  53. package/dist/app/assets/Proof-D-7QbTGX.js.map +1 -0
  54. package/dist/app/assets/Security-DFafJQIT.js +2 -0
  55. package/dist/app/assets/Security-DFafJQIT.js.map +1 -0
  56. package/dist/app/assets/{SignIn-CINUig91.js → SignIn--6nNsUCm.js} +2 -2
  57. package/dist/app/assets/{SignIn-CINUig91.js.map → SignIn--6nNsUCm.js.map} +1 -1
  58. package/dist/app/assets/{SignUp-B1H6dQgE.js → SignUp-yh5ydmFf.js} +2 -2
  59. package/dist/{assets/SignUp-B1H6dQgE.js.map → app/assets/SignUp-yh5ydmFf.js.map} +1 -1
  60. package/dist/app/assets/{SiteHeader-BGQW06JF.js → SiteHeader-NTK-cM9O.js} +2 -2
  61. package/dist/{assets/SiteHeader-BGQW06JF.js.map → app/assets/SiteHeader-NTK-cM9O.js.map} +1 -1
  62. package/dist/app/assets/StickyMobileCta-DVXAyhaH.js +2 -0
  63. package/dist/app/assets/{StickyMobileCta-C41cW-Ji.js.map → StickyMobileCta-DVXAyhaH.js.map} +1 -1
  64. package/dist/{assets/StoreAssetsPipeline-bUVDqZAU.js → app/assets/StoreAssetsPipeline-Cbs1bNK5.js} +3 -3
  65. package/dist/app/assets/{StoreAssetsPipeline-bUVDqZAU.js.map → StoreAssetsPipeline-Cbs1bNK5.js.map} +1 -1
  66. package/dist/app/assets/{Success-CMpdlLi2.js → Success-C3n0m1XU.js} +2 -2
  67. package/dist/app/assets/{Success-CMpdlLi2.js.map → Success-C3n0m1XU.js.map} +1 -1
  68. package/dist/app/assets/{Terms-C8NcE4sw.js → Terms-C72ybAwA.js} +2 -2
  69. package/dist/app/assets/{Terms-C8NcE4sw.js.map → Terms-C72ybAwA.js.map} +1 -1
  70. package/dist/app/assets/{ToolGuardrailsPanel-DbjLhdX8.js → ToolGuardrailsPanel-meKxUeSB.js} +2 -2
  71. package/dist/app/assets/{ToolGuardrailsPanel-DbjLhdX8.js.map → ToolGuardrailsPanel-meKxUeSB.js.map} +1 -1
  72. package/dist/app/assets/ToolsIndex-CnvNTvyW.js +6 -0
  73. package/dist/app/assets/ToolsIndex-CnvNTvyW.js.map +1 -0
  74. package/dist/{assets/WorkloadCalculator-CjdG5TVq.js → app/assets/WorkloadCalculator-CK4qVUcQ.js} +4 -4
  75. package/dist/app/assets/{WorkloadCalculator-CjdG5TVq.js.map → WorkloadCalculator-CK4qVUcQ.js.map} +1 -1
  76. package/dist/app/assets/arrow-right-Dglia5EE.js +2 -0
  77. package/dist/app/assets/arrow-right-Dglia5EE.js.map +1 -0
  78. package/dist/app/assets/{calculator-_D64kDDH.js → calculator-CAgtsVuH.js} +2 -2
  79. package/dist/app/assets/{calculator-_D64kDDH.js.map → calculator-CAgtsVuH.js.map} +1 -1
  80. package/dist/app/assets/check-B5h9hATV.js +2 -0
  81. package/dist/app/assets/{check-BaiZ7vYg.js.map → check-B5h9hATV.js.map} +1 -1
  82. package/dist/app/assets/chevron-down-By2Ts8dG.js +2 -0
  83. package/dist/app/assets/{chevron-down-DVRa-y8D.js.map → chevron-down-By2Ts8dG.js.map} +1 -1
  84. package/dist/app/assets/{circle-check-reAyVfkP.js → circle-check-DaJ6APMi.js} +2 -2
  85. package/dist/app/assets/{circle-check-reAyVfkP.js.map → circle-check-DaJ6APMi.js.map} +1 -1
  86. package/dist/app/assets/{clipboard-copy-BfB1mutp.js → clipboard-copy-IDfWU9SE.js} +2 -2
  87. package/dist/app/assets/{clipboard-copy-BfB1mutp.js.map → clipboard-copy-IDfWU9SE.js.map} +1 -1
  88. package/dist/app/assets/{copy-B9y2mtjd.js → copy-KSn4Rc2b.js} +2 -2
  89. package/dist/app/assets/{copy-B9y2mtjd.js.map → copy-KSn4Rc2b.js.map} +1 -1
  90. package/dist/app/assets/{crop-2_j5MtOq.js → crop-C9hwiw0i.js} +2 -2
  91. package/dist/app/assets/{crop-2_j5MtOq.js.map → crop-C9hwiw0i.js.map} +1 -1
  92. package/dist/app/assets/{download-CqEtEEpe.js → download-eqwxO8bs.js} +2 -2
  93. package/dist/app/assets/{download-CqEtEEpe.js.map → download-eqwxO8bs.js.map} +1 -1
  94. package/dist/app/assets/{eye-B1LPDhW7.js → eye-Dg61f0nU.js} +2 -2
  95. package/dist/app/assets/{eye-B1LPDhW7.js.map → eye-Dg61f0nU.js.map} +1 -1
  96. package/dist/app/assets/file-text-BQPKCil3.js +2 -0
  97. package/dist/app/assets/file-text-BQPKCil3.js.map +1 -0
  98. package/dist/app/assets/{folder-tree-CnF1eSpg.js → folder-tree-9hq6oigy.js} +2 -2
  99. package/dist/app/assets/{folder-tree-CnF1eSpg.js.map → folder-tree-9hq6oigy.js.map} +1 -1
  100. package/dist/app/assets/{grid-3x3-BB0TBwXQ.js → grid-3x3-BHXRyOIx.js} +2 -2
  101. package/dist/{assets/grid-3x3-BB0TBwXQ.js.map → app/assets/grid-3x3-BHXRyOIx.js.map} +1 -1
  102. package/dist/app/assets/index-my6BmN7T.js +204 -0
  103. package/dist/app/assets/index-my6BmN7T.js.map +1 -0
  104. package/dist/app/assets/index-rv91vbLH.css +1 -0
  105. package/dist/app/assets/{layout-grid-DbSzm5KY.js → layout-grid-DDQvnEgx.js} +2 -2
  106. package/dist/app/assets/{layout-grid-DbSzm5KY.js.map → layout-grid-DDQvnEgx.js.map} +1 -1
  107. package/dist/{assets/roboto-cyrillic-400-normal-DZJji7Rx.woff → app/assets/roboto-cyrillic-400-normal-Bjg-1-sg.woff} +0 -0
  108. package/dist/app/assets/roboto-cyrillic-400-normal-CBPI_iaY.woff2 +0 -0
  109. package/dist/{assets/roboto-cyrillic-500-normal-BI4HuXre.woff → app/assets/roboto-cyrillic-500-normal-CBKMylY4.woff} +0 -0
  110. package/dist/app/assets/roboto-cyrillic-500-normal-CLao9AfR.woff2 +0 -0
  111. package/dist/app/assets/roboto-cyrillic-700-normal-C2o7G-SM.woff2 +0 -0
  112. package/dist/{assets/roboto-cyrillic-700-normal-KqaQ5bNp.woff → app/assets/roboto-cyrillic-700-normal-DhZFXDSN.woff} +0 -0
  113. package/dist/{assets/roboto-cyrillic-ext-400-normal-DtZHuW6i.woff → app/assets/roboto-cyrillic-ext-400-normal-CaK1767H.woff} +0 -0
  114. package/dist/app/assets/roboto-cyrillic-ext-400-normal-qHufge6k.woff2 +0 -0
  115. package/dist/app/assets/roboto-cyrillic-ext-500-normal-BWC_xYeb.woff2 +0 -0
  116. package/dist/app/assets/roboto-cyrillic-ext-500-normal-DqF2hftb.woff +0 -0
  117. package/dist/app/assets/roboto-cyrillic-ext-700-normal-CI7FH63F.woff +0 -0
  118. package/dist/app/assets/roboto-cyrillic-ext-700-normal-DmFxo5wj.woff2 +0 -0
  119. package/dist/{assets/roboto-greek-400-normal-CcizSnRP.woff → app/assets/roboto-greek-400-normal-Bb5mj_fZ.woff} +0 -0
  120. package/dist/app/assets/roboto-greek-400-normal-ai2Z1K3C.woff2 +0 -0
  121. package/dist/app/assets/roboto-greek-500-normal-C9AnhcmC.woff2 +0 -0
  122. package/dist/{assets/roboto-greek-500-normal-BLLWU9W-.woff → app/assets/roboto-greek-500-normal-oCqhoyfc.woff} +0 -0
  123. package/dist/app/assets/roboto-greek-700-normal-0aHWxGLu.woff2 +0 -0
  124. package/dist/app/assets/{roboto-greek-700-normal-D3kmAf0K.woff → roboto-greek-700-normal-DjRqqLBV.woff} +0 -0
  125. package/dist/app/assets/roboto-latin-400-normal-BqEyEoaF.woff2 +0 -0
  126. package/dist/app/assets/{roboto-latin-400-normal-068yxgMN.woff → roboto-latin-400-normal-DyYNIH4P.woff} +0 -0
  127. package/dist/app/assets/roboto-latin-500-normal-7RbcRiD8.woff2 +0 -0
  128. package/dist/app/assets/roboto-latin-500-normal-DQZyH_nt.woff +0 -0
  129. package/dist/app/assets/roboto-latin-700-normal-BZpUvMxY.woff2 +0 -0
  130. package/dist/app/assets/roboto-latin-700-normal-DLgJJpmK.woff +0 -0
  131. package/dist/app/assets/roboto-latin-ext-400-normal-C3tdtHj3.woff2 +0 -0
  132. package/dist/app/assets/roboto-latin-ext-400-normal-scX0fKtV.woff +0 -0
  133. package/dist/app/assets/roboto-latin-ext-500-normal-Cyc0AKLz.woff +0 -0
  134. package/dist/app/assets/roboto-latin-ext-500-normal-pMCM9Ixg.woff2 +0 -0
  135. package/dist/app/assets/roboto-latin-ext-700-normal-BUhwtWwy.woff +0 -0
  136. package/dist/app/assets/roboto-latin-ext-700-normal-DSBUz0N1.woff2 +0 -0
  137. package/dist/app/assets/roboto-math-400-normal-BEFej5gc.woff2 +0 -0
  138. package/dist/app/assets/{roboto-math-400-normal-rzxYvyVt.woff → roboto-math-400-normal-C9RxBKAh.woff} +0 -0
  139. package/dist/{assets/roboto-math-500-normal-DaFX-ZC8.woff → app/assets/roboto-math-500-normal-C-7mKPO3.woff} +0 -0
  140. package/dist/app/assets/roboto-math-500-normal-C4NU9gLX.woff2 +0 -0
  141. package/dist/app/assets/roboto-math-700-normal-B8YqGHVc.woff2 +0 -0
  142. package/dist/app/assets/roboto-math-700-normal-DVoD5t2k.woff +0 -0
  143. package/dist/app/assets/roboto-symbols-400-normal-CB1Ce4Gk.woff2 +0 -0
  144. package/dist/app/assets/roboto-symbols-400-normal-DLYbZahX.woff +0 -0
  145. package/dist/app/assets/roboto-symbols-500-normal-B_CZKVJS.woff2 +0 -0
  146. package/dist/app/assets/roboto-symbols-500-normal-F7c8nfcH.woff +0 -0
  147. package/dist/app/assets/roboto-symbols-700-normal-BiFDindJ.woff2 +0 -0
  148. package/dist/app/assets/roboto-symbols-700-normal-BoS6HWkc.woff +0 -0
  149. package/dist/app/assets/roboto-vietnamese-400-normal-D2PTxGxD.woff2 +0 -0
  150. package/dist/{assets/roboto-vietnamese-400-normal-DmXaN3yE.woff → app/assets/roboto-vietnamese-400-normal-DnpnVwnf.woff} +0 -0
  151. package/dist/app/assets/roboto-vietnamese-500-normal-B3ncpOoB.woff2 +0 -0
  152. package/dist/{assets/roboto-vietnamese-500-normal-DW96CsrR.woff → app/assets/roboto-vietnamese-500-normal-D380IkQ8.woff} +0 -0
  153. package/dist/app/assets/roboto-vietnamese-700-normal-BEVeWqJt.woff2 +0 -0
  154. package/dist/{assets/roboto-vietnamese-700-normal-Dz0HwF-w.woff → app/assets/roboto-vietnamese-700-normal-DsFyXAL4.woff} +0 -0
  155. package/dist/app/assets/rocket-0KMviRpJ.js +2 -0
  156. package/dist/app/assets/rocket-0KMviRpJ.js.map +1 -0
  157. package/dist/app/assets/{shield-check-DXqKmrPT.js → shield-check-BvKEQ2hc.js} +2 -2
  158. package/dist/{assets/shield-check-DXqKmrPT.js.map → app/assets/shield-check-BvKEQ2hc.js.map} +1 -1
  159. package/dist/app/assets/{signIn-D-eCUhFT.js → signIn-Ckla1_0O.js} +2 -2
  160. package/dist/app/assets/{signIn-D-eCUhFT.js.map → signIn-Ckla1_0O.js.map} +1 -1
  161. package/dist/app/assets/{smartphone-Cjrk_YxV.js → smartphone-I0w1b2DV.js} +2 -2
  162. package/dist/app/assets/{smartphone-Cjrk_YxV.js.map → smartphone-I0w1b2DV.js.map} +1 -1
  163. package/dist/app/assets/{terminal-CT_KE008.js → terminal-CLpUSQqd.js} +2 -2
  164. package/dist/{assets/terminal-CT_KE008.js.map → app/assets/terminal-CLpUSQqd.js.map} +1 -1
  165. package/dist/app/assets/triangle-alert-w7TZ0yy2.js +2 -0
  166. package/dist/app/assets/triangle-alert-w7TZ0yy2.js.map +1 -0
  167. package/dist/{assets/useAuth-ctmUbyCR.js → app/assets/useAuth-N3hsUaDj.js} +3 -3
  168. package/dist/app/assets/{useAuth-ctmUbyCR.js.map → useAuth-N3hsUaDj.js.map} +1 -1
  169. package/dist/app/assets/users-DsQdkuR3.js +2 -0
  170. package/dist/app/assets/users-DsQdkuR3.js.map +1 -0
  171. package/dist/app/index.html +2 -2
  172. package/dist/assets/AgentCli-xKYtzL3B.js +17 -0
  173. package/dist/assets/AgentCli-xKYtzL3B.js.map +1 -0
  174. package/dist/{app/assets/App-DPi9LW-y.js → assets/App-C1cNw_fn.js} +10 -10
  175. package/dist/assets/App-C1cNw_fn.js.map +1 -0
  176. package/dist/assets/App-oQfE_p3A.css +1 -0
  177. package/dist/assets/AppReviewAso-CaIT-L7Z.js +4 -0
  178. package/dist/assets/AppReviewAso-CaIT-L7Z.js.map +1 -0
  179. package/dist/assets/{Cancelled-BeS-WlPj.js → Cancelled-Dmw7PTD-.js} +2 -2
  180. package/dist/assets/{Cancelled-BeS-WlPj.js.map → Cancelled-Dmw7PTD-.js.map} +1 -1
  181. package/dist/assets/CopyButton-CPRHmu8l.js +2 -0
  182. package/dist/assets/CopyButton-CPRHmu8l.js.map +1 -0
  183. package/dist/assets/DesignPartner-Ckp1GhNv.js +4 -0
  184. package/dist/assets/DesignPartner-Ckp1GhNv.js.map +1 -0
  185. package/dist/assets/FastlaneScreenshots-CB-zv5Us.js +100 -0
  186. package/dist/assets/FastlaneScreenshots-CB-zv5Us.js.map +1 -0
  187. package/dist/assets/FirstExport-RXbvVQdK.js +6 -0
  188. package/dist/assets/FirstExport-RXbvVQdK.js.map +1 -0
  189. package/dist/assets/{FitPanel-DzYzTMEi.js → FitPanel-ic91y-49.js} +2 -2
  190. package/dist/assets/{FitPanel-DzYzTMEi.js.map → FitPanel-ic91y-49.js.map} +1 -1
  191. package/dist/assets/FivePanelFramework-BZKNcycb.js +62 -0
  192. package/dist/assets/FivePanelFramework-BZKNcycb.js.map +1 -0
  193. package/dist/assets/{ForgotPassword-DuHNHuUe.js → ForgotPassword-CKOfAvWk.js} +2 -2
  194. package/dist/{app/assets/ForgotPassword-DuHNHuUe.js.map → assets/ForgotPassword-CKOfAvWk.js.map} +1 -1
  195. package/dist/assets/Landing-D0cuDDUk.js +2 -0
  196. package/dist/assets/Landing-D0cuDDUk.js.map +1 -0
  197. package/dist/assets/{LanguageSwitcher-CfUhVVuT.js → LanguageSwitcher-BrToLEgF.js} +2 -2
  198. package/dist/assets/{LanguageSwitcher-CfUhVVuT.js.map → LanguageSwitcher-BrToLEgF.js.map} +1 -1
  199. package/dist/assets/{Legal-p-YIX5Jv.js → Legal-Cm-hVzjY.js} +2 -2
  200. package/dist/assets/{Legal-p-YIX5Jv.js.map → Legal-Cm-hVzjY.js.map} +1 -1
  201. package/dist/assets/{NotFound-XohZYy7w.js → NotFound-B0I6I440.js} +2 -2
  202. package/dist/assets/{NotFound-XohZYy7w.js.map → NotFound-B0I6I440.js.map} +1 -1
  203. package/dist/assets/Pricing-p-NIjjtK.js +29 -0
  204. package/dist/assets/Pricing-p-NIjjtK.js.map +1 -0
  205. package/dist/assets/{Privacy-D8m3h6P-.js → Privacy-BhfPkK0y.js} +2 -2
  206. package/dist/assets/{Privacy-D8m3h6P-.js.map → Privacy-BhfPkK0y.js.map} +1 -1
  207. package/dist/assets/Proof-D-7QbTGX.js +20 -0
  208. package/dist/assets/Proof-D-7QbTGX.js.map +1 -0
  209. package/dist/assets/Security-DFafJQIT.js +2 -0
  210. package/dist/assets/Security-DFafJQIT.js.map +1 -0
  211. package/dist/assets/{SignIn-CINUig91.js → SignIn--6nNsUCm.js} +2 -2
  212. package/dist/assets/{SignIn-CINUig91.js.map → SignIn--6nNsUCm.js.map} +1 -1
  213. package/dist/assets/{SignUp-B1H6dQgE.js → SignUp-yh5ydmFf.js} +2 -2
  214. package/dist/{app/assets/SignUp-B1H6dQgE.js.map → assets/SignUp-yh5ydmFf.js.map} +1 -1
  215. package/dist/assets/{SiteHeader-BGQW06JF.js → SiteHeader-NTK-cM9O.js} +2 -2
  216. package/dist/{app/assets/SiteHeader-BGQW06JF.js.map → assets/SiteHeader-NTK-cM9O.js.map} +1 -1
  217. package/dist/assets/StickyMobileCta-DVXAyhaH.js +2 -0
  218. package/dist/assets/{StickyMobileCta-C41cW-Ji.js.map → StickyMobileCta-DVXAyhaH.js.map} +1 -1
  219. package/dist/{app/assets/StoreAssetsPipeline-bUVDqZAU.js → assets/StoreAssetsPipeline-Cbs1bNK5.js} +3 -3
  220. package/dist/assets/{StoreAssetsPipeline-bUVDqZAU.js.map → StoreAssetsPipeline-Cbs1bNK5.js.map} +1 -1
  221. package/dist/assets/{Success-CMpdlLi2.js → Success-C3n0m1XU.js} +2 -2
  222. package/dist/assets/{Success-CMpdlLi2.js.map → Success-C3n0m1XU.js.map} +1 -1
  223. package/dist/assets/{Terms-C8NcE4sw.js → Terms-C72ybAwA.js} +2 -2
  224. package/dist/assets/{Terms-C8NcE4sw.js.map → Terms-C72ybAwA.js.map} +1 -1
  225. package/dist/assets/{ToolGuardrailsPanel-DbjLhdX8.js → ToolGuardrailsPanel-meKxUeSB.js} +2 -2
  226. package/dist/assets/{ToolGuardrailsPanel-DbjLhdX8.js.map → ToolGuardrailsPanel-meKxUeSB.js.map} +1 -1
  227. package/dist/assets/ToolsIndex-CnvNTvyW.js +6 -0
  228. package/dist/assets/ToolsIndex-CnvNTvyW.js.map +1 -0
  229. package/dist/{app/assets/WorkloadCalculator-CjdG5TVq.js → assets/WorkloadCalculator-CK4qVUcQ.js} +4 -4
  230. package/dist/assets/{WorkloadCalculator-CjdG5TVq.js.map → WorkloadCalculator-CK4qVUcQ.js.map} +1 -1
  231. package/dist/assets/arrow-right-Dglia5EE.js +2 -0
  232. package/dist/assets/arrow-right-Dglia5EE.js.map +1 -0
  233. package/dist/assets/{calculator-_D64kDDH.js → calculator-CAgtsVuH.js} +2 -2
  234. package/dist/assets/{calculator-_D64kDDH.js.map → calculator-CAgtsVuH.js.map} +1 -1
  235. package/dist/assets/check-B5h9hATV.js +2 -0
  236. package/dist/assets/{check-BaiZ7vYg.js.map → check-B5h9hATV.js.map} +1 -1
  237. package/dist/assets/chevron-down-By2Ts8dG.js +2 -0
  238. package/dist/assets/{chevron-down-DVRa-y8D.js.map → chevron-down-By2Ts8dG.js.map} +1 -1
  239. package/dist/assets/{circle-check-reAyVfkP.js → circle-check-DaJ6APMi.js} +2 -2
  240. package/dist/assets/{circle-check-reAyVfkP.js.map → circle-check-DaJ6APMi.js.map} +1 -1
  241. package/dist/assets/{clipboard-copy-BfB1mutp.js → clipboard-copy-IDfWU9SE.js} +2 -2
  242. package/dist/assets/{clipboard-copy-BfB1mutp.js.map → clipboard-copy-IDfWU9SE.js.map} +1 -1
  243. package/dist/assets/{copy-B9y2mtjd.js → copy-KSn4Rc2b.js} +2 -2
  244. package/dist/assets/{copy-B9y2mtjd.js.map → copy-KSn4Rc2b.js.map} +1 -1
  245. package/dist/assets/{crop-2_j5MtOq.js → crop-C9hwiw0i.js} +2 -2
  246. package/dist/assets/{crop-2_j5MtOq.js.map → crop-C9hwiw0i.js.map} +1 -1
  247. package/dist/assets/{download-CqEtEEpe.js → download-eqwxO8bs.js} +2 -2
  248. package/dist/assets/{download-CqEtEEpe.js.map → download-eqwxO8bs.js.map} +1 -1
  249. package/dist/assets/{eye-B1LPDhW7.js → eye-Dg61f0nU.js} +2 -2
  250. package/dist/assets/{eye-B1LPDhW7.js.map → eye-Dg61f0nU.js.map} +1 -1
  251. package/dist/assets/file-text-BQPKCil3.js +2 -0
  252. package/dist/assets/file-text-BQPKCil3.js.map +1 -0
  253. package/dist/assets/{folder-tree-CnF1eSpg.js → folder-tree-9hq6oigy.js} +2 -2
  254. package/dist/assets/{folder-tree-CnF1eSpg.js.map → folder-tree-9hq6oigy.js.map} +1 -1
  255. package/dist/assets/{grid-3x3-BB0TBwXQ.js → grid-3x3-BHXRyOIx.js} +2 -2
  256. package/dist/{app/assets/grid-3x3-BB0TBwXQ.js.map → assets/grid-3x3-BHXRyOIx.js.map} +1 -1
  257. package/dist/assets/index-my6BmN7T.js +204 -0
  258. package/dist/assets/index-my6BmN7T.js.map +1 -0
  259. package/dist/assets/index-rv91vbLH.css +1 -0
  260. package/dist/assets/{layout-grid-DbSzm5KY.js → layout-grid-DDQvnEgx.js} +2 -2
  261. package/dist/assets/{layout-grid-DbSzm5KY.js.map → layout-grid-DDQvnEgx.js.map} +1 -1
  262. package/dist/{app/assets/roboto-cyrillic-400-normal-DZJji7Rx.woff → assets/roboto-cyrillic-400-normal-Bjg-1-sg.woff} +0 -0
  263. package/dist/assets/roboto-cyrillic-400-normal-CBPI_iaY.woff2 +0 -0
  264. package/dist/{app/assets/roboto-cyrillic-500-normal-BI4HuXre.woff → assets/roboto-cyrillic-500-normal-CBKMylY4.woff} +0 -0
  265. package/dist/assets/roboto-cyrillic-500-normal-CLao9AfR.woff2 +0 -0
  266. package/dist/assets/roboto-cyrillic-700-normal-C2o7G-SM.woff2 +0 -0
  267. package/dist/{app/assets/roboto-cyrillic-700-normal-KqaQ5bNp.woff → assets/roboto-cyrillic-700-normal-DhZFXDSN.woff} +0 -0
  268. package/dist/{app/assets/roboto-cyrillic-ext-400-normal-DtZHuW6i.woff → assets/roboto-cyrillic-ext-400-normal-CaK1767H.woff} +0 -0
  269. package/dist/assets/roboto-cyrillic-ext-400-normal-qHufge6k.woff2 +0 -0
  270. package/dist/assets/roboto-cyrillic-ext-500-normal-BWC_xYeb.woff2 +0 -0
  271. package/dist/assets/roboto-cyrillic-ext-500-normal-DqF2hftb.woff +0 -0
  272. package/dist/assets/roboto-cyrillic-ext-700-normal-CI7FH63F.woff +0 -0
  273. package/dist/assets/roboto-cyrillic-ext-700-normal-DmFxo5wj.woff2 +0 -0
  274. package/dist/{app/assets/roboto-greek-400-normal-CcizSnRP.woff → assets/roboto-greek-400-normal-Bb5mj_fZ.woff} +0 -0
  275. package/dist/assets/roboto-greek-400-normal-ai2Z1K3C.woff2 +0 -0
  276. package/dist/assets/roboto-greek-500-normal-C9AnhcmC.woff2 +0 -0
  277. package/dist/{app/assets/roboto-greek-500-normal-BLLWU9W-.woff → assets/roboto-greek-500-normal-oCqhoyfc.woff} +0 -0
  278. package/dist/assets/roboto-greek-700-normal-0aHWxGLu.woff2 +0 -0
  279. package/dist/assets/{roboto-greek-700-normal-D3kmAf0K.woff → roboto-greek-700-normal-DjRqqLBV.woff} +0 -0
  280. package/dist/assets/roboto-latin-400-normal-BqEyEoaF.woff2 +0 -0
  281. package/dist/assets/{roboto-latin-400-normal-068yxgMN.woff → roboto-latin-400-normal-DyYNIH4P.woff} +0 -0
  282. package/dist/assets/roboto-latin-500-normal-7RbcRiD8.woff2 +0 -0
  283. package/dist/assets/roboto-latin-500-normal-DQZyH_nt.woff +0 -0
  284. package/dist/assets/roboto-latin-700-normal-BZpUvMxY.woff2 +0 -0
  285. package/dist/assets/roboto-latin-700-normal-DLgJJpmK.woff +0 -0
  286. package/dist/assets/roboto-latin-ext-400-normal-C3tdtHj3.woff2 +0 -0
  287. package/dist/assets/roboto-latin-ext-400-normal-scX0fKtV.woff +0 -0
  288. package/dist/assets/roboto-latin-ext-500-normal-Cyc0AKLz.woff +0 -0
  289. package/dist/assets/roboto-latin-ext-500-normal-pMCM9Ixg.woff2 +0 -0
  290. package/dist/assets/roboto-latin-ext-700-normal-BUhwtWwy.woff +0 -0
  291. package/dist/assets/roboto-latin-ext-700-normal-DSBUz0N1.woff2 +0 -0
  292. package/dist/assets/roboto-math-400-normal-BEFej5gc.woff2 +0 -0
  293. package/dist/assets/{roboto-math-400-normal-rzxYvyVt.woff → roboto-math-400-normal-C9RxBKAh.woff} +0 -0
  294. package/dist/{app/assets/roboto-math-500-normal-DaFX-ZC8.woff → assets/roboto-math-500-normal-C-7mKPO3.woff} +0 -0
  295. package/dist/assets/roboto-math-500-normal-C4NU9gLX.woff2 +0 -0
  296. package/dist/assets/roboto-math-700-normal-B8YqGHVc.woff2 +0 -0
  297. package/dist/assets/roboto-math-700-normal-DVoD5t2k.woff +0 -0
  298. package/dist/assets/roboto-symbols-400-normal-CB1Ce4Gk.woff2 +0 -0
  299. package/dist/assets/roboto-symbols-400-normal-DLYbZahX.woff +0 -0
  300. package/dist/assets/roboto-symbols-500-normal-B_CZKVJS.woff2 +0 -0
  301. package/dist/assets/roboto-symbols-500-normal-F7c8nfcH.woff +0 -0
  302. package/dist/assets/roboto-symbols-700-normal-BiFDindJ.woff2 +0 -0
  303. package/dist/assets/roboto-symbols-700-normal-BoS6HWkc.woff +0 -0
  304. package/dist/assets/roboto-vietnamese-400-normal-D2PTxGxD.woff2 +0 -0
  305. package/dist/{app/assets/roboto-vietnamese-400-normal-DmXaN3yE.woff → assets/roboto-vietnamese-400-normal-DnpnVwnf.woff} +0 -0
  306. package/dist/assets/roboto-vietnamese-500-normal-B3ncpOoB.woff2 +0 -0
  307. package/dist/{app/assets/roboto-vietnamese-500-normal-DW96CsrR.woff → assets/roboto-vietnamese-500-normal-D380IkQ8.woff} +0 -0
  308. package/dist/assets/roboto-vietnamese-700-normal-BEVeWqJt.woff2 +0 -0
  309. package/dist/{app/assets/roboto-vietnamese-700-normal-Dz0HwF-w.woff → assets/roboto-vietnamese-700-normal-DsFyXAL4.woff} +0 -0
  310. package/dist/assets/rocket-0KMviRpJ.js +2 -0
  311. package/dist/assets/rocket-0KMviRpJ.js.map +1 -0
  312. package/dist/assets/{shield-check-DXqKmrPT.js → shield-check-BvKEQ2hc.js} +2 -2
  313. package/dist/{app/assets/shield-check-DXqKmrPT.js.map → assets/shield-check-BvKEQ2hc.js.map} +1 -1
  314. package/dist/assets/{signIn-D-eCUhFT.js → signIn-Ckla1_0O.js} +2 -2
  315. package/dist/assets/{signIn-D-eCUhFT.js.map → signIn-Ckla1_0O.js.map} +1 -1
  316. package/dist/assets/{smartphone-Cjrk_YxV.js → smartphone-I0w1b2DV.js} +2 -2
  317. package/dist/assets/{smartphone-Cjrk_YxV.js.map → smartphone-I0w1b2DV.js.map} +1 -1
  318. package/dist/assets/{terminal-CT_KE008.js → terminal-CLpUSQqd.js} +2 -2
  319. package/dist/{app/assets/terminal-CT_KE008.js.map → assets/terminal-CLpUSQqd.js.map} +1 -1
  320. package/dist/assets/triangle-alert-w7TZ0yy2.js +2 -0
  321. package/dist/assets/triangle-alert-w7TZ0yy2.js.map +1 -0
  322. package/dist/{app/assets/useAuth-ctmUbyCR.js → assets/useAuth-N3hsUaDj.js} +3 -3
  323. package/dist/assets/{useAuth-ctmUbyCR.js.map → useAuth-N3hsUaDj.js.map} +1 -1
  324. package/dist/assets/users-DsQdkuR3.js +2 -0
  325. package/dist/assets/users-DsQdkuR3.js.map +1 -0
  326. package/dist/cancelled/index.html +2 -2
  327. package/dist/design-partner/index.html +37 -0
  328. package/dist/downloads/shipscreens-aso-variant-matrix-template.csv +4 -0
  329. package/dist/downloads/shipscreens-bitrise-template.yml +60 -0
  330. package/dist/downloads/shipscreens-claude-code-mcp.json +8 -0
  331. package/dist/downloads/shipscreens-cursor-mcp.json +8 -0
  332. package/dist/downloads/shipscreens-gemini-mcp-settings.json +8 -0
  333. package/dist/downloads/shipscreens-github-actions-template.yml +62 -0
  334. package/dist/downloads/shipscreens-japan-case-snapshots-2026-02.md +37 -0
  335. package/dist/downloads/shipscreens-localization-ci-checklist-2026-02.md +46 -0
  336. package/dist/downloads/shipscreens-localization-handoff-template.csv +3 -0
  337. package/dist/downloads/shipscreens-proof-packet-2026-02.md +59 -0
  338. package/dist/downloads/shipscreens-top20-category-headline-pack-2026-02.csv +41 -0
  339. package/dist/downloads/shipscreens-top20-category-headline-pack-2026-02.md +18 -0
  340. package/dist/downloads/shipscreens-vscode-mcp.json +9 -0
  341. package/dist/forgot-password/index.html +2 -2
  342. package/dist/index.html +2 -2
  343. package/dist/legal/index.html +2 -2
  344. package/dist/llms-full.txt +114 -6
  345. package/dist/llms.txt +64 -2
  346. package/dist/mcp-server.json +4 -4
  347. package/dist/pricing/index.html +2 -2
  348. package/dist/privacy/index.html +2 -2
  349. package/dist/proof/index.html +37 -0
  350. package/dist/security/index.html +37 -0
  351. package/dist/signin/index.html +2 -2
  352. package/dist/signup/index.html +2 -2
  353. package/dist/sitemap.xml +80 -0
  354. package/dist/success/index.html +2 -2
  355. package/dist/terms/index.html +2 -2
  356. package/dist/tools/5-panel-screenshot-framework/index.html +2 -2
  357. package/dist/tools/agent-cli/index.html +6 -6
  358. package/dist/tools/app-review-aso/index.html +2 -2
  359. package/dist/tools/app-store-localization-screenshot-automation/index.html +39 -0
  360. package/dist/tools/app-store-screenshot-automation/index.html +39 -0
  361. package/dist/tools/app-store-screenshot-requirements-checklist/index.html +39 -0
  362. package/dist/tools/claude-code-mcp-screenshot-automation/index.html +39 -0
  363. package/dist/tools/cursor-mcp-screenshot-automation/index.html +39 -0
  364. package/dist/tools/deterministic-screenshot-reruns/index.html +39 -0
  365. package/dist/tools/device-locale-screenshot-matrix/index.html +39 -0
  366. package/dist/tools/fastlane-screenshot-folder-structure/index.html +39 -0
  367. package/dist/tools/fastlane-screenshot-pipeline/index.html +39 -0
  368. package/dist/tools/fastlane-screenshots/index.html +5 -5
  369. package/dist/tools/first-export/index.html +5 -5
  370. package/dist/tools/gemini-cli-mcp-screenshot-automation/index.html +39 -0
  371. package/dist/tools/google-play-screenshot-automation/index.html +39 -0
  372. package/dist/tools/google-play-screenshot-requirements-checklist/index.html +39 -0
  373. package/dist/tools/index.html +5 -5
  374. package/dist/tools/ipad-screenshot-review-requirements/index.html +39 -0
  375. package/dist/tools/openai-responses-tool-screenshot-automation/index.html +39 -0
  376. package/dist/tools/screenshot-ci-pipeline/index.html +39 -0
  377. package/dist/tools/screenshot-naming-order-drift/index.html +39 -0
  378. package/dist/tools/screenshot-workload-calculator/index.html +2 -2
  379. package/dist/tools/store-assets-pipeline/index.html +2 -2
  380. package/dist/tools/vscode-copilot-mcp-screenshot-automation/index.html +39 -0
  381. package/package.json +6 -3
  382. package/dist/app/assets/AgentCli-DNTDYBbk.js +0 -17
  383. package/dist/app/assets/AgentCli-DNTDYBbk.js.map +0 -1
  384. package/dist/app/assets/App-BwQ1zI7a.css +0 -1
  385. package/dist/app/assets/App-DPi9LW-y.js.map +0 -1
  386. package/dist/app/assets/AppReviewAso-BUTGLatx.js +0 -4
  387. package/dist/app/assets/AppReviewAso-BUTGLatx.js.map +0 -1
  388. package/dist/app/assets/CopyButton-BZQEBHBq.js +0 -2
  389. package/dist/app/assets/CopyButton-BZQEBHBq.js.map +0 -1
  390. package/dist/app/assets/FastlaneScreenshots-Dn7jfpuz.js +0 -52
  391. package/dist/app/assets/FastlaneScreenshots-Dn7jfpuz.js.map +0 -1
  392. package/dist/app/assets/FirstExport-CzioMqbJ.js +0 -6
  393. package/dist/app/assets/FirstExport-CzioMqbJ.js.map +0 -1
  394. package/dist/app/assets/FivePanelFramework-Bt5-NjCV.js +0 -62
  395. package/dist/app/assets/FivePanelFramework-Bt5-NjCV.js.map +0 -1
  396. package/dist/app/assets/Landing-DB9pTPoT.js +0 -2
  397. package/dist/app/assets/Landing-DB9pTPoT.js.map +0 -1
  398. package/dist/app/assets/Pricing-CxCutpT0.js +0 -2
  399. package/dist/app/assets/Pricing-CxCutpT0.js.map +0 -1
  400. package/dist/app/assets/StickyMobileCta-C41cW-Ji.js +0 -2
  401. package/dist/app/assets/ToolsIndex-BuZSvoBC.js +0 -6
  402. package/dist/app/assets/ToolsIndex-BuZSvoBC.js.map +0 -1
  403. package/dist/app/assets/check-BaiZ7vYg.js +0 -2
  404. package/dist/app/assets/chevron-down-DVRa-y8D.js +0 -2
  405. package/dist/app/assets/index-Bffw9flM.js +0 -180
  406. package/dist/app/assets/index-Bffw9flM.js.map +0 -1
  407. package/dist/app/assets/index-CQecHUcy.css +0 -1
  408. package/dist/app/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  409. package/dist/app/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  410. package/dist/app/assets/roboto-cyrillic-700-normal-BiSG5NnW.woff2 +0 -0
  411. package/dist/app/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  412. package/dist/app/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  413. package/dist/app/assets/roboto-cyrillic-ext-500-normal-C927yMrb.woff +0 -0
  414. package/dist/app/assets/roboto-cyrillic-ext-700-normal-BuQgZIrO.woff +0 -0
  415. package/dist/app/assets/roboto-cyrillic-ext-700-normal-UFn0vR9r.woff2 +0 -0
  416. package/dist/app/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  417. package/dist/app/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  418. package/dist/app/assets/roboto-greek-700-normal-BcGn9doz.woff2 +0 -0
  419. package/dist/app/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  420. package/dist/app/assets/roboto-latin-500-normal-CC5nhZkh.woff +0 -0
  421. package/dist/app/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  422. package/dist/app/assets/roboto-latin-700-normal-CXeAXeti.woff2 +0 -0
  423. package/dist/app/assets/roboto-latin-700-normal-DUekQERp.woff +0 -0
  424. package/dist/app/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  425. package/dist/app/assets/roboto-latin-ext-400-normal-eTRLN0Nt.woff +0 -0
  426. package/dist/app/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  427. package/dist/app/assets/roboto-latin-ext-500-normal-FFcS8vBN.woff +0 -0
  428. package/dist/app/assets/roboto-latin-ext-700-normal-70GS1MYH.woff2 +0 -0
  429. package/dist/app/assets/roboto-latin-ext-700-normal-BS1OuQqR.woff +0 -0
  430. package/dist/app/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  431. package/dist/app/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  432. package/dist/app/assets/roboto-math-700-normal-VUAI6Bz2.woff2 +0 -0
  433. package/dist/app/assets/roboto-math-700-normal-pYD1nhov.woff +0 -0
  434. package/dist/app/assets/roboto-symbols-400-normal-Tzuungub.woff +0 -0
  435. package/dist/app/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  436. package/dist/app/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  437. package/dist/app/assets/roboto-symbols-500-normal-CAhAe-ik.woff +0 -0
  438. package/dist/app/assets/roboto-symbols-700-normal-CuuvBBxy.woff +0 -0
  439. package/dist/app/assets/roboto-symbols-700-normal-rJi6RjIy.woff2 +0 -0
  440. package/dist/app/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  441. package/dist/app/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  442. package/dist/app/assets/roboto-vietnamese-700-normal-iKxYNAzq.woff2 +0 -0
  443. package/dist/app/assets/rocket-d1Ntm8ge.js +0 -2
  444. package/dist/app/assets/rocket-d1Ntm8ge.js.map +0 -1
  445. package/dist/assets/AgentCli-DNTDYBbk.js +0 -17
  446. package/dist/assets/AgentCli-DNTDYBbk.js.map +0 -1
  447. package/dist/assets/App-BwQ1zI7a.css +0 -1
  448. package/dist/assets/App-DPi9LW-y.js.map +0 -1
  449. package/dist/assets/AppReviewAso-BUTGLatx.js +0 -4
  450. package/dist/assets/AppReviewAso-BUTGLatx.js.map +0 -1
  451. package/dist/assets/CopyButton-BZQEBHBq.js +0 -2
  452. package/dist/assets/CopyButton-BZQEBHBq.js.map +0 -1
  453. package/dist/assets/FastlaneScreenshots-Dn7jfpuz.js +0 -52
  454. package/dist/assets/FastlaneScreenshots-Dn7jfpuz.js.map +0 -1
  455. package/dist/assets/FirstExport-CzioMqbJ.js +0 -6
  456. package/dist/assets/FirstExport-CzioMqbJ.js.map +0 -1
  457. package/dist/assets/FivePanelFramework-Bt5-NjCV.js +0 -62
  458. package/dist/assets/FivePanelFramework-Bt5-NjCV.js.map +0 -1
  459. package/dist/assets/Landing-DB9pTPoT.js +0 -2
  460. package/dist/assets/Landing-DB9pTPoT.js.map +0 -1
  461. package/dist/assets/Pricing-CxCutpT0.js +0 -2
  462. package/dist/assets/Pricing-CxCutpT0.js.map +0 -1
  463. package/dist/assets/StickyMobileCta-C41cW-Ji.js +0 -2
  464. package/dist/assets/ToolsIndex-BuZSvoBC.js +0 -6
  465. package/dist/assets/ToolsIndex-BuZSvoBC.js.map +0 -1
  466. package/dist/assets/check-BaiZ7vYg.js +0 -2
  467. package/dist/assets/chevron-down-DVRa-y8D.js +0 -2
  468. package/dist/assets/index-Bffw9flM.js +0 -180
  469. package/dist/assets/index-Bffw9flM.js.map +0 -1
  470. package/dist/assets/index-CQecHUcy.css +0 -1
  471. package/dist/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  472. package/dist/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  473. package/dist/assets/roboto-cyrillic-700-normal-BiSG5NnW.woff2 +0 -0
  474. package/dist/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  475. package/dist/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  476. package/dist/assets/roboto-cyrillic-ext-500-normal-C927yMrb.woff +0 -0
  477. package/dist/assets/roboto-cyrillic-ext-700-normal-BuQgZIrO.woff +0 -0
  478. package/dist/assets/roboto-cyrillic-ext-700-normal-UFn0vR9r.woff2 +0 -0
  479. package/dist/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  480. package/dist/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  481. package/dist/assets/roboto-greek-700-normal-BcGn9doz.woff2 +0 -0
  482. package/dist/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  483. package/dist/assets/roboto-latin-500-normal-CC5nhZkh.woff +0 -0
  484. package/dist/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  485. package/dist/assets/roboto-latin-700-normal-CXeAXeti.woff2 +0 -0
  486. package/dist/assets/roboto-latin-700-normal-DUekQERp.woff +0 -0
  487. package/dist/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  488. package/dist/assets/roboto-latin-ext-400-normal-eTRLN0Nt.woff +0 -0
  489. package/dist/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  490. package/dist/assets/roboto-latin-ext-500-normal-FFcS8vBN.woff +0 -0
  491. package/dist/assets/roboto-latin-ext-700-normal-70GS1MYH.woff2 +0 -0
  492. package/dist/assets/roboto-latin-ext-700-normal-BS1OuQqR.woff +0 -0
  493. package/dist/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  494. package/dist/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  495. package/dist/assets/roboto-math-700-normal-VUAI6Bz2.woff2 +0 -0
  496. package/dist/assets/roboto-math-700-normal-pYD1nhov.woff +0 -0
  497. package/dist/assets/roboto-symbols-400-normal-Tzuungub.woff +0 -0
  498. package/dist/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  499. package/dist/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  500. package/dist/assets/roboto-symbols-500-normal-CAhAe-ik.woff +0 -0
  501. package/dist/assets/roboto-symbols-700-normal-CuuvBBxy.woff +0 -0
  502. package/dist/assets/roboto-symbols-700-normal-rJi6RjIy.woff2 +0 -0
  503. package/dist/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  504. package/dist/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  505. package/dist/assets/roboto-vietnamese-700-normal-iKxYNAzq.woff2 +0 -0
  506. package/dist/assets/rocket-d1Ntm8ge.js +0 -2
  507. package/dist/assets/rocket-d1Ntm8ge.js.map +0 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ShipScreens CLI
2
2
 
3
- Build store screenshots as a build step.
3
+ Use this when app-dev CI or MCP-enabled agents need deterministic store screenshot reruns as a build step.
4
4
 
5
5
  ## Quickstart
6
6
  ```bash
@@ -19,6 +19,7 @@ npx playwright install --with-deps chromium
19
19
  ```bash
20
20
  npx --yes shipscreens@latest validate
21
21
  npx --yes shipscreens@latest lock
22
+ npx --yes shipscreens@latest copy check --strict --write-pseudo-csv out/copy-pseudo.csv --write-report-json out/copy-check-report.json
22
23
  npx --yes shipscreens@latest build --out out --zip
23
24
  npx --yes shipscreens@latest verify --out out --zip --profile appstore
24
25
  npx --yes shipscreens@latest stage --from out --out out/stage --profile appstore
@@ -31,6 +32,12 @@ Docs: https://shipscreens.com/tools/agent-cli/
31
32
  npx --yes shipscreens@latest mcp serve
32
33
  ```
33
34
 
35
+ Fastest workspace bootstrap:
36
+ ```bash
37
+ npx --yes shipscreens@latest mcp init --client cursor
38
+ # use claude | vscode | gemini for other clients
39
+ ```
40
+
34
41
  ## Claude Code local setup (.mcp.json)
35
42
  ```json
36
43
  {
@@ -55,6 +62,31 @@ Windows users can force `npx` through `cmd /c`:
55
62
  }
56
63
  ```
57
64
 
65
+ ## Cursor project setup (.cursor/mcp.json)
66
+ ```json
67
+ {
68
+ "mcpServers": {
69
+ "shipscreens": {
70
+ "command": "npx",
71
+ "args": ["--yes", "shipscreens@latest", "mcp", "serve"]
72
+ }
73
+ }
74
+ }
75
+ ```
76
+
77
+ ## VS Code Copilot workspace setup (.vscode/mcp.json)
78
+ ```json
79
+ {
80
+ "servers": {
81
+ "shipscreens": {
82
+ "type": "stdio",
83
+ "command": "npx",
84
+ "args": ["--yes", "shipscreens@latest", "mcp", "serve"]
85
+ }
86
+ }
87
+ }
88
+ ```
89
+
58
90
  Gemini CLI setup (`.gemini/settings.json` in project or `~/.gemini/settings.json`):
59
91
  ```json
60
92
  {
@@ -66,3 +98,7 @@ Gemini CLI setup (`.gemini/settings.json` in project or `~/.gemini/settings.json
66
98
  }
67
99
  }
68
100
  ```
101
+
102
+ ## OpenAI Responses API note
103
+ - Default `tool_choice=auto` lets the model decide whether to call tools.
104
+ - Use `tool_choice=required` when the workflow must force a ShipScreens tool call.
@@ -16,8 +16,10 @@ import { runAuth } from '../cli/commands/auth.js';
16
16
  import { runInit } from '../cli/commands/init.js';
17
17
  import { runWizard } from '../cli/commands/wizard.js';
18
18
  import { runCopyImport } from '../cli/commands/copyImport.js';
19
+ import { runCopyCheck } from '../cli/commands/copyCheck.js';
19
20
  import { resolveCliAuth } from '../cli/auth.js';
20
21
  import { listTemplateIds, resolveTemplateConfig } from '../cli/templateConfig.js';
22
+ import { listMcpBootstrapClients, runMcpInit } from '../cli/mcpBootstrap.js';
21
23
  import { runMcpServer } from '../cli/mcpServer.js';
22
24
  import { loadShipScreensConfig } from '../cli/loadConfig.js';
23
25
  import { collectAssetReferences } from '../cli/assetRefs.js';
@@ -30,6 +32,7 @@ import {
30
32
 
31
33
  const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
32
34
  const DEMO_SCREENS_DIR = path.join(PACKAGE_ROOT, 'cli', 'assets', 'demo-screens');
35
+ const MCP_BOOTSTRAP_CLIENT_LIST = listMcpBootstrapClients().join('|');
33
36
 
34
37
  function printHelp() {
35
38
  console.log(`ShipScreens CLI
@@ -37,20 +40,22 @@ function printHelp() {
37
40
  Usage:
38
41
  shipscreens init [--dir <path>] [--slides <n>] [--locales <id,id>] [--devices <id,id>] [--force] [--wizard] [--style <value>] [--template <id>]
39
42
  shipscreens wizard [--dir <path>] [--force] [--style <value>] [--template <id>] [--defaults]
40
- 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]
41
- 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]
43
+ shipscreens demo [--out <dir>] [--slides <n>] [--locales <id,id>] [--devices <id,id>] [--template <id>] [--mode <raw|rendered>] [--zip-out <path>] [--profile <appstore|playstore|any>] [--variant <id>] [--force]
44
+ 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>] [--variant <id>] [--require-pro] [--force]
42
45
  shipscreens devices [--json]
43
46
  shipscreens templates [--json]
44
47
  shipscreens validate [-c shipscreens.config.yml]
45
48
  shipscreens lock [-c shipscreens.config.yml] [--out shipscreens.lock.json] [--check]
46
- shipscreens build [-c shipscreens.config.yml] [--mode shipscreens|rendered|raw|frameit] [--format dir|zip] [--out <dir>] [--zip] [--zip-out <path>] [--clean]
47
- shipscreens verify [-c shipscreens.config.yml] [--out <dir>] [--zip] [--zip-out <path>] [--profile appstore|playstore|any]
48
- shipscreens stage [-c shipscreens.config.yml] [--from <dir>] --out <dir> [--profile appstore|playstore|any]
49
+ shipscreens build [-c shipscreens.config.yml] [--mode shipscreens|rendered|raw|frameit] [--format dir|zip] [--out <dir>] [--zip] [--zip-out <path>] [--variant <id>] [--clean]
50
+ shipscreens verify [-c shipscreens.config.yml] [--out <dir>] [--zip] [--zip-out <path>] [--profile appstore|playstore|any] [--variant <id>]
51
+ shipscreens stage [-c shipscreens.config.yml] [--from <dir>] --out <dir> [--profile appstore|playstore|any] [--variant <id>]
49
52
  shipscreens export framefile [-c shipscreens.config.yml] [--ios-dir fastlane/screenshots] [--strings-encoding utf8|utf16le|utf16be] [--framefile-strategy merge|overwrite] [--check]
50
- shipscreens plan [-c shipscreens.config.yml] [--out <dir>] [--zip-out <path>] [--profile appstore|playstore|any] [--json]
53
+ shipscreens plan [-c shipscreens.config.yml] [--out <dir>] [--zip-out <path>] [--profile appstore|playstore|any] [--variant <id>] [--json]
51
54
  shipscreens copy import [-c shipscreens.config.yml] [--csv <path>] [--import-mode merge|replace]
55
+ shipscreens copy check [-c shipscreens.config.yml] [--pseudo-locale <id>] [--pseudo-expand <n>] [--max-header-units <n>] [--max-sub-units <n>] [--max-token-length <n>] [--write-pseudo-csv <path>] [--write-report-json <path>] [--strict]
52
56
  shipscreens auth <login|finish|status|logout> [--domain <cognito-domain>] [--client-id <id>] [--api-base <url>] [--port <port>] [--manual] [--redirect-url <url>]
53
57
  shipscreens mcp serve
58
+ shipscreens mcp init --client <${MCP_BOOTSTRAP_CLIENT_LIST}> [--dir <path>] [--package-spec <spec>] [--windows-cmd-shim] [--force]
54
59
 
55
60
  Commands:
56
61
  init Create a starter config + placeholder PNGs + copy.csv
@@ -67,8 +72,9 @@ Commands:
67
72
  export Export helper files for other tools
68
73
  plan Print a deterministic build/stage plan (JSON)
69
74
  copy Import locale copy from copy.csv into shipscreens.config.yml
75
+ check Run pseudo-locale + long-string checks for submission quality
70
76
  auth Manage CLI sign-in (required to remove watermarks in CLI exports)
71
- mcp Start a stdio MCP server that exposes ShipScreens tools
77
+ mcp Start a stdio MCP server or write workspace-local MCP config
72
78
 
73
79
  Options:
74
80
  -c, --config <path> Path to shipscreens.config.yml (default: ./shipscreens.config.yml)
@@ -83,9 +89,18 @@ Options:
83
89
  --defaults Skip the style prompt in wizard (use default/no style)
84
90
  --csv <path> Path to copy.csv for copy import (default: ./copy.csv)
85
91
  --import-mode <mode> CSV import mode (merge|replace, default: merge)
92
+ --pseudo-locale <id> Locale id prefix for pseudo-locale checks (default: qps-ploc)
93
+ --pseudo-expand <n> Pseudo-locale expansion ratio (default: 0.35)
94
+ --max-header-units <n> Visual-width budget for headers (default: 34)
95
+ --max-sub-units <n> Visual-width budget for subtitles (default: 54)
96
+ --max-token-length <n> Long-token budget before wrap risk warning (default: 22)
97
+ --write-pseudo-csv <path> Write pseudo-locale CSV rows for manual QA
98
+ --write-report-json <path> Write full copy-check report JSON for CI/QA artifacts
99
+ --strict Fail copy check when warnings are found
86
100
  --out <path> Lock output file path (lock) or output root directory (build/verify/stage)
87
101
  --zip-out <path> ZIP output file path (default: <out>/fastlane_assets.zip)
88
102
  --profile <appstore|playstore|any> Strict verification/staging rules per store (default: any)
103
+ --variant <id> ASO experiment variant scope (writes under variants/<id>/...).
89
104
  --from <dir> Source output root for staging (default: config dir)
90
105
  --check Verify outputs are valid/up-to-date (no write)
91
106
  --json Emit machine-readable JSON (most commands; plan always emits JSON)
@@ -102,6 +117,9 @@ Options:
102
117
  --android-dir <path> Android output directory (default: fastlane/metadata/android)
103
118
  --strings-encoding <utf8|utf16le|utf16be> Encoding for generated .strings (export framefile / build --mode frameit) (default: utf8)
104
119
  --framefile-strategy <merge|overwrite> How to handle fastlane/screenshots/Framefile.json (export framefile / build --mode frameit) (default: merge)
120
+ --client <id> MCP bootstrap target (${MCP_BOOTSTRAP_CLIENT_LIST}) for "mcp init"
121
+ --package-spec <spec> Package spec used in generated MCP config (default: shipscreens@latest)
122
+ --windows-cmd-shim Use "cmd /c npx ..." in the generated MCP config
105
123
  -h, --help Show help
106
124
 
107
125
  Quickstart (no browser):
@@ -110,6 +128,7 @@ Quickstart (no browser):
110
128
  shipscreens verify --out out --zip --profile appstore
111
129
 
112
130
  MCP quickstart:
131
+ shipscreens mcp init --client cursor
113
132
  shipscreens mcp serve
114
133
  `);
115
134
  }
@@ -180,6 +199,15 @@ async function pathExists(targetPath) {
180
199
  }
181
200
  }
182
201
 
202
+ function parseNumericFlag(name, value) {
203
+ if (value == null || value === '') return undefined;
204
+ const num = Number(value);
205
+ if (!Number.isFinite(num)) {
206
+ throw new Error(`Invalid --${name} value: ${value}`);
207
+ }
208
+ return num;
209
+ }
210
+
183
211
  async function loadDemoScreenPngs() {
184
212
  try {
185
213
  const entries = await fs.readdir(DEMO_SCREENS_DIR);
@@ -243,6 +271,7 @@ async function main() {
243
271
  'strings-encoding': { type: 'string' },
244
272
  'framefile-strategy': { type: 'string' },
245
273
  profile: { type: 'string' },
274
+ variant: { type: 'string' },
246
275
  from: { type: 'string' },
247
276
  json: { type: 'boolean' },
248
277
  'require-pro': { type: 'boolean' },
@@ -265,6 +294,17 @@ async function main() {
265
294
  defaults: { type: 'boolean' },
266
295
  csv: { type: 'string' },
267
296
  'import-mode': { type: 'string' },
297
+ 'pseudo-locale': { type: 'string' },
298
+ 'pseudo-expand': { type: 'string' },
299
+ 'max-header-units': { type: 'string' },
300
+ 'max-sub-units': { type: 'string' },
301
+ 'max-token-length': { type: 'string' },
302
+ 'write-pseudo-csv': { type: 'string' },
303
+ 'write-report-json': { type: 'string' },
304
+ strict: { type: 'boolean' },
305
+ client: { type: 'string' },
306
+ 'package-spec': { type: 'string' },
307
+ 'windows-cmd-shim': { type: 'boolean' },
268
308
  help: { type: 'boolean', short: 'h' },
269
309
  },
270
310
  });
@@ -345,11 +385,37 @@ async function main() {
345
385
 
346
386
  if (command === 'mcp') {
347
387
  const subcommand = positionals[1] || 'serve';
348
- if (subcommand !== 'serve') {
349
- throw new Error(`Unknown mcp command: ${subcommand}`);
388
+ if (subcommand === 'serve') {
389
+ await runMcpServer();
390
+ return;
350
391
  }
351
- await runMcpServer();
352
- return;
392
+ if (subcommand === 'init') {
393
+ const result = await runMcpInit({
394
+ client: values.client,
395
+ dir: values.dir,
396
+ packageSpec: values['package-spec'],
397
+ windowsCmdShim: values['windows-cmd-shim'],
398
+ force: values.force,
399
+ });
400
+ const commandSummary = [result.command, ...result.args].join(' ');
401
+ emitPayload(
402
+ 'mcp init',
403
+ result,
404
+ [
405
+ `OK: wrote ${result.clientLabel} MCP config -> ${result.configPath}`,
406
+ `- settings key: ${result.settingsKey}`,
407
+ result.transport ? `- transport: ${result.transport}` : null,
408
+ `- command: ${commandSummary}`,
409
+ `- merged existing config: ${result.mergedExistingConfig ? 'yes' : 'no'}`,
410
+ `- shipscreens entry changed: ${result.shipscreensEntryChanged ? 'yes' : 'no'}`,
411
+ `- total servers at key: ${result.serverCount}`,
412
+ ]
413
+ .filter(Boolean)
414
+ .join('\n')
415
+ );
416
+ return;
417
+ }
418
+ throw new Error(`Unknown mcp command: ${subcommand}`);
353
419
  }
354
420
 
355
421
  if (command === 'wizard') {
@@ -493,6 +559,7 @@ async function main() {
493
559
  mode,
494
560
  outDir: buildOutDir,
495
561
  zipOut,
562
+ variant: values.variant,
496
563
  clean: true,
497
564
  cliAuthToken,
498
565
  cliAuthProfile,
@@ -504,6 +571,7 @@ async function main() {
504
571
  zipOut,
505
572
  zip: true,
506
573
  profile,
574
+ variant: values.variant,
507
575
  });
508
576
 
509
577
  const stageResult = await runStage({
@@ -511,6 +579,7 @@ async function main() {
511
579
  fromDir: buildOutDir,
512
580
  outDir: stageOutDir,
513
581
  profile,
582
+ variant: values.variant,
514
583
  });
515
584
 
516
585
  const summary = [
@@ -532,6 +601,7 @@ async function main() {
532
601
  stageOutDir,
533
602
  mode,
534
603
  profile,
604
+ variant: values.variant || null,
535
605
  init: initResult,
536
606
  build: result,
537
607
  verify: verifyResult,
@@ -637,6 +707,7 @@ async function main() {
637
707
  iosDir: values['ios-dir'],
638
708
  androidDir: values['android-dir'],
639
709
  zipOut,
710
+ variant: values.variant,
640
711
  stringsEncoding: values['strings-encoding'],
641
712
  framefileStrategy: values['framefile-strategy'],
642
713
  clean: values.clean,
@@ -652,6 +723,7 @@ async function main() {
652
723
  zipOut,
653
724
  zip,
654
725
  profile,
726
+ variant: values.variant,
655
727
  });
656
728
 
657
729
  const summary = [
@@ -671,6 +743,7 @@ async function main() {
671
743
  format,
672
744
  mode,
673
745
  profile,
746
+ variant: values.variant || null,
674
747
  requirePro,
675
748
  build: result,
676
749
  verify: verifyResult,
@@ -705,6 +778,41 @@ async function main() {
705
778
  );
706
779
  return;
707
780
  }
781
+ if (subcommand === 'check') {
782
+ const result = await runCopyCheck({
783
+ configPath,
784
+ pseudoLocale: values['pseudo-locale'],
785
+ pseudoExpand: parseNumericFlag('pseudo-expand', values['pseudo-expand']),
786
+ maxHeaderUnits: parseNumericFlag('max-header-units', values['max-header-units']),
787
+ maxSubUnits: parseNumericFlag('max-sub-units', values['max-sub-units']),
788
+ maxTokenLength: parseNumericFlag('max-token-length', values['max-token-length']),
789
+ writePseudoCsv: values['write-pseudo-csv'],
790
+ writeReportJson: values['write-report-json'],
791
+ });
792
+
793
+ const sample = result.issues.slice(0, 8);
794
+ const lines = [
795
+ `OK: copy check (${result.locales} locale(s) x ${result.slides} slide(s))`,
796
+ `- issues: ${result.issueCount}`,
797
+ `- pseudo locale: ${result.pseudoLocale} (expand=${result.pseudoExpand})`,
798
+ `- limits: header=${result.limits.headerUnits}, sub=${result.limits.subUnits}, token=${result.limits.tokenLength}`,
799
+ ];
800
+ if (result.pseudoCsvPath) lines.push(`- pseudo csv: ${result.pseudoCsvPath}`);
801
+ if (result.reportJsonPath) lines.push(`- report json: ${result.reportJsonPath}`);
802
+ if (sample.length) {
803
+ lines.push('- sample warnings:');
804
+ sample.forEach((issue) => {
805
+ lines.push(` - [${issue.type}] slide ${issue.slide} ${issue.localeId} ${issue.field}: ${issue.detail}`);
806
+ });
807
+ }
808
+
809
+ if (values.strict && result.issueCount > 0) {
810
+ throw new Error(`copy check failed (--strict): ${result.issueCount} issue(s)\n${lines.join('\n')}`);
811
+ }
812
+
813
+ emitPayload('copy check', result, lines.join('\n'));
814
+ return;
815
+ }
708
816
  throw new Error(`Unknown copy command: ${subcommand || '(missing)'}`);
709
817
  }
710
818
 
@@ -750,6 +858,7 @@ async function main() {
750
858
  iosDir: values['ios-dir'],
751
859
  androidDir: values['android-dir'],
752
860
  zipOut,
861
+ variant: values.variant,
753
862
  stringsEncoding: values['strings-encoding'],
754
863
  framefileStrategy: values['framefile-strategy'],
755
864
  clean: values.clean,
@@ -766,7 +875,15 @@ async function main() {
766
875
  if (result.zipPath) summary.push(`zip -> ${result.zipPath}`);
767
876
  emitPayload(
768
877
  'build',
769
- { configPath, format, mode: values.mode || 'rendered', outDir: outDir || null, zipOut: zipOut || null, ...result },
878
+ {
879
+ configPath,
880
+ format,
881
+ mode: values.mode || 'rendered',
882
+ outDir: outDir || null,
883
+ zipOut: zipOut || null,
884
+ variant: values.variant || null,
885
+ ...result,
886
+ },
770
887
  summary.join(', ')
771
888
  );
772
889
  return;
@@ -783,6 +900,7 @@ async function main() {
783
900
  zipOut: rawZipOut || undefined,
784
901
  zip: values.zip || Boolean(rawZipOut),
785
902
  profile: values.profile,
903
+ variant: values.variant,
786
904
  });
787
905
  const summary = [
788
906
  `OK: verified`,
@@ -799,6 +917,7 @@ async function main() {
799
917
  outDir: rawOut || null,
800
918
  zipOut: rawZipOut || null,
801
919
  profile: values.profile || null,
920
+ variant: values.variant || null,
802
921
  ...result,
803
922
  },
804
923
  summary.join(', ')
@@ -814,6 +933,7 @@ async function main() {
814
933
  fromDir: rawFrom || undefined,
815
934
  outDir: rawOut || undefined,
816
935
  profile: values.profile,
936
+ variant: values.variant,
817
937
  });
818
938
  const details = result.iosVariant ? `, ios=${result.iosVariant}` : '';
819
939
  emitPayload(
@@ -832,6 +952,7 @@ async function main() {
832
952
  androidDir: values['android-dir'],
833
953
  zipOut: values['zip-out'],
834
954
  profile: values.profile,
955
+ variant: values.variant,
835
956
  });
836
957
  process.stdout.write(JSON.stringify(plan, null, 2) + '\n');
837
958
  return;
package/cli/auth.js CHANGED
@@ -198,6 +198,10 @@ async function refreshTokens({ domain, clientId, refreshToken }) {
198
198
  return resp.json();
199
199
  }
200
200
 
201
+ function isInvalidGrantError(error) {
202
+ return /invalid_grant/i.test(String(error?.message || error || ''));
203
+ }
204
+
201
205
  async function fetchProfile({ apiBase, token }) {
202
206
  if (!token) return null;
203
207
  const resp = await fetch(`${apiBase}/me`, {
@@ -392,7 +396,15 @@ export async function resolveCliAuth({ requirePro = false } = {}) {
392
396
  throw new Error('SHIPSCREENS_COGNITO_DOMAIN is required when using SHIPSCREENS_REFRESH_TOKEN.');
393
397
  }
394
398
  const clientId = process.env.SHIPSCREENS_CLIENT_ID || DEFAULT_CLIENT_ID;
395
- const tokens = await refreshTokens({ domain, clientId, refreshToken: envRefresh });
399
+ let tokens;
400
+ try {
401
+ tokens = await refreshTokens({ domain, clientId, refreshToken: envRefresh });
402
+ } catch (error) {
403
+ if (!requirePro) {
404
+ return { token: null, profile: null, source: 'env_refresh_invalid' };
405
+ }
406
+ throw error;
407
+ }
396
408
  const token = tokens.id_token;
397
409
  const profile = await fetchProfile({ apiBase: DEFAULT_API_BASE, token }).catch(() => null);
398
410
  if (requirePro && !profile?.isPro) {
@@ -413,16 +425,24 @@ export async function resolveCliAuth({ requirePro = false } = {}) {
413
425
  let updated = false;
414
426
  if (isExpired(session.expires_at)) {
415
427
  if (session.refresh_token && session.domain && session.client_id) {
416
- const tokens = await refreshTokens({
417
- domain: session.domain,
418
- clientId: session.client_id,
419
- refreshToken: session.refresh_token,
420
- });
421
- token = tokens.id_token;
422
- session.id_token = tokens.id_token;
423
- session.access_token = tokens.access_token;
424
- session.expires_at = resolveExpiry(tokens.expires_in);
425
- updated = true;
428
+ try {
429
+ const tokens = await refreshTokens({
430
+ domain: session.domain,
431
+ clientId: session.client_id,
432
+ refreshToken: session.refresh_token,
433
+ });
434
+ token = tokens.id_token;
435
+ session.id_token = tokens.id_token;
436
+ session.access_token = tokens.access_token;
437
+ session.expires_at = resolveExpiry(tokens.expires_in);
438
+ updated = true;
439
+ } catch (error) {
440
+ if (requirePro) throw error;
441
+ token = null;
442
+ if (isInvalidGrantError(error)) {
443
+ await clearAuth();
444
+ }
445
+ }
426
446
  } else {
427
447
  token = null;
428
448
  }
@@ -9,6 +9,7 @@ import { startRendererServer } from '../rendererServer.js';
9
9
  import { getPackageRoot } from '../packageRoot.js';
10
10
  import { writeFastlaneZip } from '../fastlaneZip.js';
11
11
  import { resolveOutRoot, resolveOutputPath, resolveZipOutPath } from '../outputPaths.js';
12
+ import { applyVariantOutRoot, resolveVariantScope } from '../variantScope.js';
12
13
  import { runExportFramefile } from './exportFramefile.js';
13
14
  import {
14
15
  cleanBuildOutputs,
@@ -70,10 +71,13 @@ export async function runBuild({
70
71
  clean = false,
71
72
  cliAuthToken,
72
73
  cliAuthProfile,
74
+ variant,
73
75
  } = {}) {
74
76
  await runValidate({ configPath });
75
77
  const { config, configDir } = await loadShipScreensConfig(configPath);
76
- const outRoot = resolveOutRoot({ configDir, outDir });
78
+ const baseOutRoot = resolveOutRoot({ configDir, outDir });
79
+ const variantScope = resolveVariantScope({ variantFlag: variant, config });
80
+ const outRoot = applyVariantOutRoot({ outRoot: baseOutRoot, variantId: variantScope.id });
77
81
  if (!process.env.VITE_API_ENDPOINT) {
78
82
  process.env.VITE_API_ENDPOINT = process.env.SHIPSCREENS_API_ENDPOINT || 'https://api.shipscreens.com';
79
83
  }
@@ -201,6 +205,8 @@ export async function runBuild({
201
205
  iosDir: resolvedIosDir,
202
206
  androidDir: resolvedAndroidDir,
203
207
  zipPath: resolvedZipOut,
208
+ variant: variantScope.id,
209
+ variantSource: variantScope.source,
204
210
  locales: locales.length,
205
211
  slides: slideCount,
206
212
  iosDevices: iosDevices.length,
@@ -354,6 +360,8 @@ export async function runBuild({
354
360
  iosDir: resolvedIosDir,
355
361
  androidDir: resolvedAndroidDir,
356
362
  zipPath: resolvedZipOut,
363
+ variant: variantScope.id,
364
+ variantSource: variantScope.source,
357
365
  locales: locales.length,
358
366
  slides: slideCount,
359
367
  iosDevices: iosDevices.length,