shipscreens 0.1.5 → 0.1.7

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 (691) hide show
  1. package/README.md +50 -4
  2. package/bin/shipscreens.js +484 -29
  3. package/cli/auth.js +31 -11
  4. package/cli/commands/build.js +9 -1
  5. package/cli/commands/captureScreenshots.js +409 -0
  6. package/cli/commands/copyCheck.js +265 -0
  7. package/cli/commands/importScreenshots.js +377 -0
  8. package/cli/commands/inspectReleaseContext.js +607 -0
  9. package/cli/commands/plan.js +7 -3
  10. package/cli/commands/planRelease.js +324 -0
  11. package/cli/commands/stage.js +13 -3
  12. package/cli/commands/verify.js +7 -2
  13. package/cli/commands/writeStarterConfig.js +233 -0
  14. package/cli/mcpBootstrap.js +174 -0
  15. package/cli/mcpServer.js +172 -3
  16. package/cli/schema.js +19 -0
  17. package/cli/variantScope.js +58 -0
  18. package/dist/.well-known/ai-agents.json +268 -8
  19. package/dist/.well-known/llms-full.txt +191 -20
  20. package/dist/.well-known/llms.txt +99 -11
  21. package/dist/.well-known/mcp-server.json +4 -4
  22. package/dist/ai-agents.json +268 -8
  23. package/dist/app/assets/AgentCli-nIqgOG-i.js +17 -0
  24. package/dist/app/assets/AgentCli-nIqgOG-i.js.map +1 -0
  25. package/dist/app/assets/AgentHandoffPanel-Bf_AJepG.js +2 -0
  26. package/dist/app/assets/AgentHandoffPanel-Bf_AJepG.js.map +1 -0
  27. package/dist/app/assets/AgentStarterWorkflowFigure-DW4SMMy7.js +2 -0
  28. package/dist/app/assets/AgentStarterWorkflowFigure-DW4SMMy7.js.map +1 -0
  29. package/dist/app/assets/App-BRKxkubQ.css +1 -0
  30. package/dist/app/assets/App-CZiyX8-L.js +14 -0
  31. package/dist/app/assets/App-CZiyX8-L.js.map +1 -0
  32. package/dist/app/assets/AppReviewAso-DYOCuqgV.js +4 -0
  33. package/dist/app/assets/AppReviewAso-DYOCuqgV.js.map +1 -0
  34. package/dist/app/assets/Cancelled-CP6V6uDb.js +2 -0
  35. package/dist/app/assets/Cancelled-CP6V6uDb.js.map +1 -0
  36. package/dist/app/assets/CopyButton-BFCx6EPg.js +2 -0
  37. package/dist/app/assets/CopyButton-BFCx6EPg.js.map +1 -0
  38. package/dist/app/assets/DesignPartner-B4J7f0Bx.js +4 -0
  39. package/dist/app/assets/DesignPartner-B4J7f0Bx.js.map +1 -0
  40. package/dist/app/assets/FastlaneScreenshots-cdZE6cGY.js +90 -0
  41. package/dist/app/assets/FastlaneScreenshots-cdZE6cGY.js.map +1 -0
  42. package/dist/app/assets/FirstExport-qfY7uE8r.js +6 -0
  43. package/dist/app/assets/FirstExport-qfY7uE8r.js.map +1 -0
  44. package/dist/app/assets/FitPanel-B1J0V1jK.js +2 -0
  45. package/dist/app/assets/FitPanel-B1J0V1jK.js.map +1 -0
  46. package/dist/app/assets/FivePanelFramework-C4yq58kM.js +62 -0
  47. package/dist/app/assets/FivePanelFramework-C4yq58kM.js.map +1 -0
  48. package/dist/app/assets/ForgotPassword-KF_HFGyb.js +2 -0
  49. package/dist/app/assets/ForgotPassword-KF_HFGyb.js.map +1 -0
  50. package/dist/app/assets/Landing-B_CvZDXJ.js +2 -0
  51. package/dist/app/assets/Landing-B_CvZDXJ.js.map +1 -0
  52. package/dist/app/assets/LanguageSwitcher-hFv9zl1u.js +2 -0
  53. package/dist/app/assets/LanguageSwitcher-hFv9zl1u.js.map +1 -0
  54. package/dist/app/assets/Legal-BwGbEjDk.js +2 -0
  55. package/dist/app/assets/Legal-BwGbEjDk.js.map +1 -0
  56. package/dist/app/assets/NotFound-Ba1Bw7uu.js +2 -0
  57. package/dist/app/assets/NotFound-Ba1Bw7uu.js.map +1 -0
  58. package/dist/app/assets/Pricing-Dt-V4Gqc.js +20 -0
  59. package/dist/app/assets/Pricing-Dt-V4Gqc.js.map +1 -0
  60. package/dist/app/assets/Privacy-C6MrXYPO.js +2 -0
  61. package/dist/app/assets/Privacy-C6MrXYPO.js.map +1 -0
  62. package/dist/app/assets/Proof-C3DDFAhm.js +20 -0
  63. package/dist/app/assets/Proof-C3DDFAhm.js.map +1 -0
  64. package/dist/app/assets/ReleaseFitIntake-DBeb9AFJ.js +27 -0
  65. package/dist/app/assets/ReleaseFitIntake-DBeb9AFJ.js.map +1 -0
  66. package/dist/app/assets/SalesEntryQuickRequestCard-Bfa93AYu.js +2 -0
  67. package/dist/app/assets/SalesEntryQuickRequestCard-Bfa93AYu.js.map +1 -0
  68. package/dist/app/assets/Security-C1OmAgom.js +2 -0
  69. package/dist/app/assets/Security-C1OmAgom.js.map +1 -0
  70. package/dist/app/assets/SignIn-C_wwnmvu.js +2 -0
  71. package/dist/app/assets/SignIn-C_wwnmvu.js.map +1 -0
  72. package/dist/app/assets/SignUp-Dm5HalC6.js +2 -0
  73. package/dist/app/assets/SignUp-Dm5HalC6.js.map +1 -0
  74. package/dist/app/assets/SiteHeader-CJqQ0pL3.js +2 -0
  75. package/dist/app/assets/SiteHeader-CJqQ0pL3.js.map +1 -0
  76. package/dist/app/assets/StickyMobileCta-REC3DROG.js +2 -0
  77. package/dist/app/assets/StickyMobileCta-REC3DROG.js.map +1 -0
  78. package/dist/app/assets/StoreAssetsPipeline-DNnnBp0D.js +6 -0
  79. package/dist/app/assets/StoreAssetsPipeline-DNnnBp0D.js.map +1 -0
  80. package/dist/app/assets/Success-D6b4wLPD.js +2 -0
  81. package/dist/app/assets/Success-D6b4wLPD.js.map +1 -0
  82. package/dist/app/assets/Terms-BMt39FQK.js +2 -0
  83. package/dist/app/assets/Terms-BMt39FQK.js.map +1 -0
  84. package/dist/app/assets/ToolGuardrailsPanel-Cclxwdrb.js +2 -0
  85. package/dist/app/assets/ToolGuardrailsPanel-Cclxwdrb.js.map +1 -0
  86. package/dist/app/assets/ToolsIndex-d1szo5bn.js +6 -0
  87. package/dist/app/assets/ToolsIndex-d1szo5bn.js.map +1 -0
  88. package/dist/app/assets/TrustSalesEntryPanel-DuncpgMs.js +2 -0
  89. package/dist/app/assets/TrustSalesEntryPanel-DuncpgMs.js.map +1 -0
  90. package/dist/app/assets/WorkloadCalculator-BbFWF2Ls.js +5 -0
  91. package/dist/app/assets/WorkloadCalculator-BbFWF2Ls.js.map +1 -0
  92. package/dist/app/assets/agentHandoff-BGmHqDwv.js +2 -0
  93. package/dist/app/assets/agentHandoff-BGmHqDwv.js.map +1 -0
  94. package/dist/app/assets/apiClient-3WVm94VW.js +2 -0
  95. package/dist/app/assets/apiClient-3WVm94VW.js.map +1 -0
  96. package/dist/app/assets/calculator-CofuwQa8.js +2 -0
  97. package/dist/app/assets/calculator-CofuwQa8.js.map +1 -0
  98. package/dist/app/assets/check-Fm2iQO64.js +2 -0
  99. package/dist/app/assets/check-Fm2iQO64.js.map +1 -0
  100. package/dist/app/assets/chevron-down-BIXHKpnf.js +2 -0
  101. package/dist/app/assets/chevron-down-BIXHKpnf.js.map +1 -0
  102. package/dist/app/assets/chunk-BHe-jwch.js +1 -0
  103. package/dist/app/assets/circle-check-X08qqy40.js +2 -0
  104. package/dist/app/assets/circle-check-X08qqy40.js.map +1 -0
  105. package/dist/app/assets/copy-KD-LYJ0z.js +2 -0
  106. package/dist/app/assets/copy-KD-LYJ0z.js.map +1 -0
  107. package/dist/app/assets/crop-K1LOmRty.js +2 -0
  108. package/dist/app/assets/crop-K1LOmRty.js.map +1 -0
  109. package/dist/app/assets/designPartnerRequest-DYqMElJd.js +2 -0
  110. package/dist/app/assets/designPartnerRequest-DYqMElJd.js.map +1 -0
  111. package/dist/app/assets/designPartnerSalesEntry-BpRINg3I.js +2 -0
  112. package/dist/app/assets/designPartnerSalesEntry-BpRINg3I.js.map +1 -0
  113. package/dist/app/assets/download-BXzoc-Y3.js +2 -0
  114. package/dist/app/assets/download-BXzoc-Y3.js.map +1 -0
  115. package/dist/app/assets/eye-CHvLhG2r.js +2 -0
  116. package/dist/app/assets/eye-CHvLhG2r.js.map +1 -0
  117. package/dist/app/assets/file-text-CU-ETLz1.js +2 -0
  118. package/dist/app/assets/file-text-CU-ETLz1.js.map +1 -0
  119. package/dist/app/assets/folder-tree-raVH0Y5V.js +2 -0
  120. package/dist/app/assets/folder-tree-raVH0Y5V.js.map +1 -0
  121. package/dist/app/assets/grid-3x3-cWuhGQfz.js +2 -0
  122. package/dist/app/assets/grid-3x3-cWuhGQfz.js.map +1 -0
  123. package/dist/app/assets/hardeningOffer-tkjlPDU-.js +2 -0
  124. package/dist/app/assets/hardeningOffer-tkjlPDU-.js.map +1 -0
  125. package/dist/app/assets/hero/agent-starter-workflow.png +0 -0
  126. package/dist/app/assets/hero/agent-starter-workflow.webp +0 -0
  127. package/dist/app/assets/html2canvas-pro.esm-OQkwCdu_.js +6 -0
  128. package/dist/app/assets/html2canvas-pro.esm-OQkwCdu_.js.map +1 -0
  129. package/dist/app/assets/index-BW_YmKvl.css +2 -0
  130. package/dist/app/assets/index-D7D6ZRCW.js +212 -0
  131. package/dist/app/assets/index-D7D6ZRCW.js.map +1 -0
  132. package/dist/app/assets/jszip.min-XyfP2hUJ.js +3 -0
  133. package/dist/app/assets/jszip.min-XyfP2hUJ.js.map +1 -0
  134. package/dist/app/assets/layout-grid-Cq_e979G.js +2 -0
  135. package/dist/app/assets/layout-grid-Cq_e979G.js.map +1 -0
  136. package/dist/app/assets/lock-Di7P18Ts.js +2 -0
  137. package/dist/app/assets/lock-Di7P18Ts.js.map +1 -0
  138. package/dist/{assets/roboto-cyrillic-400-normal-DZJji7Rx.woff → app/assets/roboto-cyrillic-400-normal-Bjg-1-sg.woff} +0 -0
  139. package/dist/app/assets/roboto-cyrillic-400-normal-CBPI_iaY.woff2 +0 -0
  140. package/dist/{assets/roboto-cyrillic-500-normal-BI4HuXre.woff → app/assets/roboto-cyrillic-500-normal-CBKMylY4.woff} +0 -0
  141. package/dist/app/assets/roboto-cyrillic-500-normal-CLao9AfR.woff2 +0 -0
  142. package/dist/app/assets/roboto-cyrillic-700-normal-C2o7G-SM.woff2 +0 -0
  143. package/dist/{assets/roboto-cyrillic-700-normal-KqaQ5bNp.woff → app/assets/roboto-cyrillic-700-normal-DhZFXDSN.woff} +0 -0
  144. package/dist/{assets/roboto-cyrillic-ext-400-normal-DtZHuW6i.woff → app/assets/roboto-cyrillic-ext-400-normal-CaK1767H.woff} +0 -0
  145. package/dist/app/assets/roboto-cyrillic-ext-400-normal-qHufge6k.woff2 +0 -0
  146. package/dist/app/assets/roboto-cyrillic-ext-500-normal-BWC_xYeb.woff2 +0 -0
  147. package/dist/app/assets/roboto-cyrillic-ext-500-normal-DqF2hftb.woff +0 -0
  148. package/dist/app/assets/roboto-cyrillic-ext-700-normal-CI7FH63F.woff +0 -0
  149. package/dist/app/assets/roboto-cyrillic-ext-700-normal-DmFxo5wj.woff2 +0 -0
  150. package/dist/{assets/roboto-greek-400-normal-CcizSnRP.woff → app/assets/roboto-greek-400-normal-Bb5mj_fZ.woff} +0 -0
  151. package/dist/app/assets/roboto-greek-400-normal-ai2Z1K3C.woff2 +0 -0
  152. package/dist/app/assets/roboto-greek-500-normal-C9AnhcmC.woff2 +0 -0
  153. package/dist/{assets/roboto-greek-500-normal-BLLWU9W-.woff → app/assets/roboto-greek-500-normal-oCqhoyfc.woff} +0 -0
  154. package/dist/app/assets/roboto-greek-700-normal-0aHWxGLu.woff2 +0 -0
  155. package/dist/app/assets/{roboto-greek-700-normal-D3kmAf0K.woff → roboto-greek-700-normal-DjRqqLBV.woff} +0 -0
  156. package/dist/app/assets/roboto-latin-400-normal-BqEyEoaF.woff2 +0 -0
  157. package/dist/app/assets/{roboto-latin-400-normal-068yxgMN.woff → roboto-latin-400-normal-DyYNIH4P.woff} +0 -0
  158. package/dist/app/assets/roboto-latin-500-normal-7RbcRiD8.woff2 +0 -0
  159. package/dist/app/assets/roboto-latin-500-normal-DQZyH_nt.woff +0 -0
  160. package/dist/app/assets/roboto-latin-700-normal-BZpUvMxY.woff2 +0 -0
  161. package/dist/app/assets/roboto-latin-700-normal-DLgJJpmK.woff +0 -0
  162. package/dist/app/assets/roboto-latin-ext-400-normal-C3tdtHj3.woff2 +0 -0
  163. package/dist/app/assets/roboto-latin-ext-400-normal-scX0fKtV.woff +0 -0
  164. package/dist/app/assets/roboto-latin-ext-500-normal-Cyc0AKLz.woff +0 -0
  165. package/dist/app/assets/roboto-latin-ext-500-normal-pMCM9Ixg.woff2 +0 -0
  166. package/dist/app/assets/roboto-latin-ext-700-normal-BUhwtWwy.woff +0 -0
  167. package/dist/app/assets/roboto-latin-ext-700-normal-DSBUz0N1.woff2 +0 -0
  168. package/dist/app/assets/roboto-math-400-normal-BEFej5gc.woff2 +0 -0
  169. package/dist/app/assets/{roboto-math-400-normal-rzxYvyVt.woff → roboto-math-400-normal-C9RxBKAh.woff} +0 -0
  170. package/dist/{assets/roboto-math-500-normal-DaFX-ZC8.woff → app/assets/roboto-math-500-normal-C-7mKPO3.woff} +0 -0
  171. package/dist/app/assets/roboto-math-500-normal-C4NU9gLX.woff2 +0 -0
  172. package/dist/app/assets/roboto-math-700-normal-B8YqGHVc.woff2 +0 -0
  173. package/dist/app/assets/roboto-math-700-normal-DVoD5t2k.woff +0 -0
  174. package/dist/app/assets/roboto-symbols-400-normal-CB1Ce4Gk.woff2 +0 -0
  175. package/dist/app/assets/roboto-symbols-400-normal-DLYbZahX.woff +0 -0
  176. package/dist/app/assets/roboto-symbols-500-normal-B_CZKVJS.woff2 +0 -0
  177. package/dist/app/assets/roboto-symbols-500-normal-F7c8nfcH.woff +0 -0
  178. package/dist/app/assets/roboto-symbols-700-normal-BiFDindJ.woff2 +0 -0
  179. package/dist/app/assets/roboto-symbols-700-normal-BoS6HWkc.woff +0 -0
  180. package/dist/app/assets/roboto-vietnamese-400-normal-D2PTxGxD.woff2 +0 -0
  181. package/dist/{assets/roboto-vietnamese-400-normal-DmXaN3yE.woff → app/assets/roboto-vietnamese-400-normal-DnpnVwnf.woff} +0 -0
  182. package/dist/app/assets/roboto-vietnamese-500-normal-B3ncpOoB.woff2 +0 -0
  183. package/dist/{assets/roboto-vietnamese-500-normal-DW96CsrR.woff → app/assets/roboto-vietnamese-500-normal-D380IkQ8.woff} +0 -0
  184. package/dist/app/assets/roboto-vietnamese-700-normal-BEVeWqJt.woff2 +0 -0
  185. package/dist/{assets/roboto-vietnamese-700-normal-Dz0HwF-w.woff → app/assets/roboto-vietnamese-700-normal-DsFyXAL4.woff} +0 -0
  186. package/dist/app/assets/rocket-DHdrCHKD.js +2 -0
  187. package/dist/app/assets/rocket-DHdrCHKD.js.map +1 -0
  188. package/dist/app/assets/shield-check-CxpHNdp0.js +2 -0
  189. package/dist/app/assets/shield-check-CxpHNdp0.js.map +1 -0
  190. package/dist/app/assets/smartphone-DXKiqu57.js +2 -0
  191. package/dist/app/assets/smartphone-DXKiqu57.js.map +1 -0
  192. package/dist/app/assets/stripeClient-CuZgvzca.js +2 -0
  193. package/dist/app/assets/stripeClient-CuZgvzca.js.map +1 -0
  194. package/dist/app/assets/terminal-J0iyJTv2.js +2 -0
  195. package/dist/app/assets/terminal-J0iyJTv2.js.map +1 -0
  196. package/dist/app/assets/triangle-alert-BA0HP6zD.js +2 -0
  197. package/dist/app/assets/triangle-alert-BA0HP6zD.js.map +1 -0
  198. package/dist/app/assets/useAuth-CoS4r8yi.js +22 -0
  199. package/dist/app/assets/useAuth-CoS4r8yi.js.map +1 -0
  200. package/dist/app/assets/users-C-fz7pbn.js +2 -0
  201. package/dist/app/assets/users-C-fz7pbn.js.map +1 -0
  202. package/dist/app/index.html +9 -8
  203. package/dist/assets/AgentCli-nIqgOG-i.js +17 -0
  204. package/dist/assets/AgentCli-nIqgOG-i.js.map +1 -0
  205. package/dist/assets/AgentHandoffPanel-Bf_AJepG.js +2 -0
  206. package/dist/assets/AgentHandoffPanel-Bf_AJepG.js.map +1 -0
  207. package/dist/assets/AgentStarterWorkflowFigure-DW4SMMy7.js +2 -0
  208. package/dist/assets/AgentStarterWorkflowFigure-DW4SMMy7.js.map +1 -0
  209. package/dist/assets/App-BRKxkubQ.css +1 -0
  210. package/dist/assets/App-CZiyX8-L.js +14 -0
  211. package/dist/assets/App-CZiyX8-L.js.map +1 -0
  212. package/dist/assets/AppReviewAso-DYOCuqgV.js +4 -0
  213. package/dist/assets/AppReviewAso-DYOCuqgV.js.map +1 -0
  214. package/dist/assets/Cancelled-CP6V6uDb.js +2 -0
  215. package/dist/assets/Cancelled-CP6V6uDb.js.map +1 -0
  216. package/dist/assets/CopyButton-BFCx6EPg.js +2 -0
  217. package/dist/assets/CopyButton-BFCx6EPg.js.map +1 -0
  218. package/dist/assets/DesignPartner-B4J7f0Bx.js +4 -0
  219. package/dist/assets/DesignPartner-B4J7f0Bx.js.map +1 -0
  220. package/dist/assets/FastlaneScreenshots-cdZE6cGY.js +90 -0
  221. package/dist/assets/FastlaneScreenshots-cdZE6cGY.js.map +1 -0
  222. package/dist/assets/FirstExport-qfY7uE8r.js +6 -0
  223. package/dist/assets/FirstExport-qfY7uE8r.js.map +1 -0
  224. package/dist/assets/FitPanel-B1J0V1jK.js +2 -0
  225. package/dist/assets/FitPanel-B1J0V1jK.js.map +1 -0
  226. package/dist/assets/FivePanelFramework-C4yq58kM.js +62 -0
  227. package/dist/assets/FivePanelFramework-C4yq58kM.js.map +1 -0
  228. package/dist/assets/ForgotPassword-KF_HFGyb.js +2 -0
  229. package/dist/assets/ForgotPassword-KF_HFGyb.js.map +1 -0
  230. package/dist/assets/Landing-B_CvZDXJ.js +2 -0
  231. package/dist/assets/Landing-B_CvZDXJ.js.map +1 -0
  232. package/dist/assets/LanguageSwitcher-hFv9zl1u.js +2 -0
  233. package/dist/assets/LanguageSwitcher-hFv9zl1u.js.map +1 -0
  234. package/dist/assets/Legal-BwGbEjDk.js +2 -0
  235. package/dist/assets/Legal-BwGbEjDk.js.map +1 -0
  236. package/dist/assets/NotFound-Ba1Bw7uu.js +2 -0
  237. package/dist/assets/NotFound-Ba1Bw7uu.js.map +1 -0
  238. package/dist/assets/Pricing-Dt-V4Gqc.js +20 -0
  239. package/dist/assets/Pricing-Dt-V4Gqc.js.map +1 -0
  240. package/dist/assets/Privacy-C6MrXYPO.js +2 -0
  241. package/dist/assets/Privacy-C6MrXYPO.js.map +1 -0
  242. package/dist/assets/Proof-C3DDFAhm.js +20 -0
  243. package/dist/assets/Proof-C3DDFAhm.js.map +1 -0
  244. package/dist/assets/ReleaseFitIntake-DBeb9AFJ.js +27 -0
  245. package/dist/assets/ReleaseFitIntake-DBeb9AFJ.js.map +1 -0
  246. package/dist/assets/SalesEntryQuickRequestCard-Bfa93AYu.js +2 -0
  247. package/dist/assets/SalesEntryQuickRequestCard-Bfa93AYu.js.map +1 -0
  248. package/dist/assets/Security-C1OmAgom.js +2 -0
  249. package/dist/assets/Security-C1OmAgom.js.map +1 -0
  250. package/dist/assets/SignIn-C_wwnmvu.js +2 -0
  251. package/dist/assets/SignIn-C_wwnmvu.js.map +1 -0
  252. package/dist/assets/SignUp-Dm5HalC6.js +2 -0
  253. package/dist/assets/SignUp-Dm5HalC6.js.map +1 -0
  254. package/dist/assets/SiteHeader-CJqQ0pL3.js +2 -0
  255. package/dist/assets/SiteHeader-CJqQ0pL3.js.map +1 -0
  256. package/dist/assets/StickyMobileCta-REC3DROG.js +2 -0
  257. package/dist/assets/StickyMobileCta-REC3DROG.js.map +1 -0
  258. package/dist/assets/StoreAssetsPipeline-DNnnBp0D.js +6 -0
  259. package/dist/assets/StoreAssetsPipeline-DNnnBp0D.js.map +1 -0
  260. package/dist/assets/Success-D6b4wLPD.js +2 -0
  261. package/dist/assets/Success-D6b4wLPD.js.map +1 -0
  262. package/dist/assets/Terms-BMt39FQK.js +2 -0
  263. package/dist/assets/Terms-BMt39FQK.js.map +1 -0
  264. package/dist/assets/ToolGuardrailsPanel-Cclxwdrb.js +2 -0
  265. package/dist/assets/ToolGuardrailsPanel-Cclxwdrb.js.map +1 -0
  266. package/dist/assets/ToolsIndex-d1szo5bn.js +6 -0
  267. package/dist/assets/ToolsIndex-d1szo5bn.js.map +1 -0
  268. package/dist/assets/TrustSalesEntryPanel-DuncpgMs.js +2 -0
  269. package/dist/assets/TrustSalesEntryPanel-DuncpgMs.js.map +1 -0
  270. package/dist/assets/WorkloadCalculator-BbFWF2Ls.js +5 -0
  271. package/dist/assets/WorkloadCalculator-BbFWF2Ls.js.map +1 -0
  272. package/dist/assets/agentHandoff-BGmHqDwv.js +2 -0
  273. package/dist/assets/agentHandoff-BGmHqDwv.js.map +1 -0
  274. package/dist/assets/apiClient-3WVm94VW.js +2 -0
  275. package/dist/assets/apiClient-3WVm94VW.js.map +1 -0
  276. package/dist/assets/calculator-CofuwQa8.js +2 -0
  277. package/dist/assets/calculator-CofuwQa8.js.map +1 -0
  278. package/dist/assets/check-Fm2iQO64.js +2 -0
  279. package/dist/assets/check-Fm2iQO64.js.map +1 -0
  280. package/dist/assets/chevron-down-BIXHKpnf.js +2 -0
  281. package/dist/assets/chevron-down-BIXHKpnf.js.map +1 -0
  282. package/dist/assets/chunk-BHe-jwch.js +1 -0
  283. package/dist/assets/circle-check-X08qqy40.js +2 -0
  284. package/dist/assets/circle-check-X08qqy40.js.map +1 -0
  285. package/dist/assets/copy-KD-LYJ0z.js +2 -0
  286. package/dist/assets/copy-KD-LYJ0z.js.map +1 -0
  287. package/dist/assets/crop-K1LOmRty.js +2 -0
  288. package/dist/assets/crop-K1LOmRty.js.map +1 -0
  289. package/dist/assets/designPartnerRequest-DYqMElJd.js +2 -0
  290. package/dist/assets/designPartnerRequest-DYqMElJd.js.map +1 -0
  291. package/dist/assets/designPartnerSalesEntry-BpRINg3I.js +2 -0
  292. package/dist/assets/designPartnerSalesEntry-BpRINg3I.js.map +1 -0
  293. package/dist/assets/download-BXzoc-Y3.js +2 -0
  294. package/dist/assets/download-BXzoc-Y3.js.map +1 -0
  295. package/dist/assets/eye-CHvLhG2r.js +2 -0
  296. package/dist/assets/eye-CHvLhG2r.js.map +1 -0
  297. package/dist/assets/file-text-CU-ETLz1.js +2 -0
  298. package/dist/assets/file-text-CU-ETLz1.js.map +1 -0
  299. package/dist/assets/folder-tree-raVH0Y5V.js +2 -0
  300. package/dist/assets/folder-tree-raVH0Y5V.js.map +1 -0
  301. package/dist/assets/grid-3x3-cWuhGQfz.js +2 -0
  302. package/dist/assets/grid-3x3-cWuhGQfz.js.map +1 -0
  303. package/dist/assets/hardeningOffer-tkjlPDU-.js +2 -0
  304. package/dist/assets/hardeningOffer-tkjlPDU-.js.map +1 -0
  305. package/dist/assets/hero/agent-starter-workflow.png +0 -0
  306. package/dist/assets/hero/agent-starter-workflow.webp +0 -0
  307. package/dist/assets/html2canvas-pro.esm-OQkwCdu_.js +6 -0
  308. package/dist/assets/html2canvas-pro.esm-OQkwCdu_.js.map +1 -0
  309. package/dist/assets/index-BW_YmKvl.css +2 -0
  310. package/dist/assets/index-D7D6ZRCW.js +212 -0
  311. package/dist/assets/index-D7D6ZRCW.js.map +1 -0
  312. package/dist/assets/jszip.min-XyfP2hUJ.js +3 -0
  313. package/dist/assets/jszip.min-XyfP2hUJ.js.map +1 -0
  314. package/dist/assets/layout-grid-Cq_e979G.js +2 -0
  315. package/dist/assets/layout-grid-Cq_e979G.js.map +1 -0
  316. package/dist/assets/lock-Di7P18Ts.js +2 -0
  317. package/dist/assets/lock-Di7P18Ts.js.map +1 -0
  318. package/dist/{app/assets/roboto-cyrillic-400-normal-DZJji7Rx.woff → assets/roboto-cyrillic-400-normal-Bjg-1-sg.woff} +0 -0
  319. package/dist/assets/roboto-cyrillic-400-normal-CBPI_iaY.woff2 +0 -0
  320. package/dist/{app/assets/roboto-cyrillic-500-normal-BI4HuXre.woff → assets/roboto-cyrillic-500-normal-CBKMylY4.woff} +0 -0
  321. package/dist/assets/roboto-cyrillic-500-normal-CLao9AfR.woff2 +0 -0
  322. package/dist/assets/roboto-cyrillic-700-normal-C2o7G-SM.woff2 +0 -0
  323. package/dist/{app/assets/roboto-cyrillic-700-normal-KqaQ5bNp.woff → assets/roboto-cyrillic-700-normal-DhZFXDSN.woff} +0 -0
  324. package/dist/{app/assets/roboto-cyrillic-ext-400-normal-DtZHuW6i.woff → assets/roboto-cyrillic-ext-400-normal-CaK1767H.woff} +0 -0
  325. package/dist/assets/roboto-cyrillic-ext-400-normal-qHufge6k.woff2 +0 -0
  326. package/dist/assets/roboto-cyrillic-ext-500-normal-BWC_xYeb.woff2 +0 -0
  327. package/dist/assets/roboto-cyrillic-ext-500-normal-DqF2hftb.woff +0 -0
  328. package/dist/assets/roboto-cyrillic-ext-700-normal-CI7FH63F.woff +0 -0
  329. package/dist/assets/roboto-cyrillic-ext-700-normal-DmFxo5wj.woff2 +0 -0
  330. package/dist/{app/assets/roboto-greek-400-normal-CcizSnRP.woff → assets/roboto-greek-400-normal-Bb5mj_fZ.woff} +0 -0
  331. package/dist/assets/roboto-greek-400-normal-ai2Z1K3C.woff2 +0 -0
  332. package/dist/assets/roboto-greek-500-normal-C9AnhcmC.woff2 +0 -0
  333. package/dist/{app/assets/roboto-greek-500-normal-BLLWU9W-.woff → assets/roboto-greek-500-normal-oCqhoyfc.woff} +0 -0
  334. package/dist/assets/roboto-greek-700-normal-0aHWxGLu.woff2 +0 -0
  335. package/dist/assets/{roboto-greek-700-normal-D3kmAf0K.woff → roboto-greek-700-normal-DjRqqLBV.woff} +0 -0
  336. package/dist/assets/roboto-latin-400-normal-BqEyEoaF.woff2 +0 -0
  337. package/dist/assets/{roboto-latin-400-normal-068yxgMN.woff → roboto-latin-400-normal-DyYNIH4P.woff} +0 -0
  338. package/dist/assets/roboto-latin-500-normal-7RbcRiD8.woff2 +0 -0
  339. package/dist/assets/roboto-latin-500-normal-DQZyH_nt.woff +0 -0
  340. package/dist/assets/roboto-latin-700-normal-BZpUvMxY.woff2 +0 -0
  341. package/dist/assets/roboto-latin-700-normal-DLgJJpmK.woff +0 -0
  342. package/dist/assets/roboto-latin-ext-400-normal-C3tdtHj3.woff2 +0 -0
  343. package/dist/assets/roboto-latin-ext-400-normal-scX0fKtV.woff +0 -0
  344. package/dist/assets/roboto-latin-ext-500-normal-Cyc0AKLz.woff +0 -0
  345. package/dist/assets/roboto-latin-ext-500-normal-pMCM9Ixg.woff2 +0 -0
  346. package/dist/assets/roboto-latin-ext-700-normal-BUhwtWwy.woff +0 -0
  347. package/dist/assets/roboto-latin-ext-700-normal-DSBUz0N1.woff2 +0 -0
  348. package/dist/assets/roboto-math-400-normal-BEFej5gc.woff2 +0 -0
  349. package/dist/assets/{roboto-math-400-normal-rzxYvyVt.woff → roboto-math-400-normal-C9RxBKAh.woff} +0 -0
  350. package/dist/{app/assets/roboto-math-500-normal-DaFX-ZC8.woff → assets/roboto-math-500-normal-C-7mKPO3.woff} +0 -0
  351. package/dist/assets/roboto-math-500-normal-C4NU9gLX.woff2 +0 -0
  352. package/dist/assets/roboto-math-700-normal-B8YqGHVc.woff2 +0 -0
  353. package/dist/assets/roboto-math-700-normal-DVoD5t2k.woff +0 -0
  354. package/dist/assets/roboto-symbols-400-normal-CB1Ce4Gk.woff2 +0 -0
  355. package/dist/assets/roboto-symbols-400-normal-DLYbZahX.woff +0 -0
  356. package/dist/assets/roboto-symbols-500-normal-B_CZKVJS.woff2 +0 -0
  357. package/dist/assets/roboto-symbols-500-normal-F7c8nfcH.woff +0 -0
  358. package/dist/assets/roboto-symbols-700-normal-BiFDindJ.woff2 +0 -0
  359. package/dist/assets/roboto-symbols-700-normal-BoS6HWkc.woff +0 -0
  360. package/dist/assets/roboto-vietnamese-400-normal-D2PTxGxD.woff2 +0 -0
  361. package/dist/{app/assets/roboto-vietnamese-400-normal-DmXaN3yE.woff → assets/roboto-vietnamese-400-normal-DnpnVwnf.woff} +0 -0
  362. package/dist/assets/roboto-vietnamese-500-normal-B3ncpOoB.woff2 +0 -0
  363. package/dist/{app/assets/roboto-vietnamese-500-normal-DW96CsrR.woff → assets/roboto-vietnamese-500-normal-D380IkQ8.woff} +0 -0
  364. package/dist/assets/roboto-vietnamese-700-normal-BEVeWqJt.woff2 +0 -0
  365. package/dist/{app/assets/roboto-vietnamese-700-normal-Dz0HwF-w.woff → assets/roboto-vietnamese-700-normal-DsFyXAL4.woff} +0 -0
  366. package/dist/assets/rocket-DHdrCHKD.js +2 -0
  367. package/dist/assets/rocket-DHdrCHKD.js.map +1 -0
  368. package/dist/assets/shield-check-CxpHNdp0.js +2 -0
  369. package/dist/assets/shield-check-CxpHNdp0.js.map +1 -0
  370. package/dist/assets/smartphone-DXKiqu57.js +2 -0
  371. package/dist/assets/smartphone-DXKiqu57.js.map +1 -0
  372. package/dist/assets/stripeClient-CuZgvzca.js +2 -0
  373. package/dist/assets/stripeClient-CuZgvzca.js.map +1 -0
  374. package/dist/assets/terminal-J0iyJTv2.js +2 -0
  375. package/dist/assets/terminal-J0iyJTv2.js.map +1 -0
  376. package/dist/assets/triangle-alert-BA0HP6zD.js +2 -0
  377. package/dist/assets/triangle-alert-BA0HP6zD.js.map +1 -0
  378. package/dist/assets/useAuth-CoS4r8yi.js +22 -0
  379. package/dist/assets/useAuth-CoS4r8yi.js.map +1 -0
  380. package/dist/assets/users-C-fz7pbn.js +2 -0
  381. package/dist/assets/users-C-fz7pbn.js.map +1 -0
  382. package/dist/cancelled/index.html +3 -2
  383. package/dist/design-partner/index.html +38 -0
  384. package/dist/downloads/shipscreens-aso-variant-matrix-template.csv +4 -0
  385. package/dist/downloads/shipscreens-bitrise-template.yml +60 -0
  386. package/dist/downloads/shipscreens-claude-code-mcp.json +8 -0
  387. package/dist/downloads/shipscreens-cursor-mcp.json +8 -0
  388. package/dist/downloads/shipscreens-gemini-mcp-settings.json +8 -0
  389. package/dist/downloads/shipscreens-github-actions-template.yml +62 -0
  390. package/dist/downloads/shipscreens-japan-case-snapshots-2026-02.md +37 -0
  391. package/dist/downloads/shipscreens-localization-ci-checklist-2026-02.md +46 -0
  392. package/dist/downloads/shipscreens-localization-handoff-template.csv +3 -0
  393. package/dist/downloads/shipscreens-proof-packet-2026-02.md +59 -0
  394. package/dist/downloads/shipscreens-top20-category-headline-pack-2026-02.csv +41 -0
  395. package/dist/downloads/shipscreens-top20-category-headline-pack-2026-02.md +18 -0
  396. package/dist/downloads/shipscreens-vscode-mcp.json +9 -0
  397. package/dist/forgot-password/index.html +3 -2
  398. package/dist/index.html +9 -8
  399. package/dist/legal/index.html +3 -2
  400. package/dist/llms-full.txt +191 -20
  401. package/dist/llms.txt +99 -11
  402. package/dist/mcp-server.json +4 -4
  403. package/dist/pricing/index.html +6 -5
  404. package/dist/privacy/index.html +3 -2
  405. package/dist/proof/index.html +38 -0
  406. package/dist/security/index.html +38 -0
  407. package/dist/signin/index.html +3 -2
  408. package/dist/signup/index.html +3 -2
  409. package/dist/sitemap.xml +80 -0
  410. package/dist/success/index.html +3 -2
  411. package/dist/terms/index.html +3 -2
  412. package/dist/tools/5-panel-screenshot-framework/index.html +6 -5
  413. package/dist/tools/agent-cli/index.html +8 -7
  414. package/dist/tools/app-review-aso/index.html +6 -5
  415. package/dist/tools/app-store-localization-screenshot-automation/index.html +40 -0
  416. package/dist/tools/app-store-screenshot-automation/index.html +40 -0
  417. package/dist/tools/app-store-screenshot-requirements-checklist/index.html +40 -0
  418. package/dist/tools/claude-code-mcp-screenshot-automation/index.html +40 -0
  419. package/dist/tools/cursor-mcp-screenshot-automation/index.html +40 -0
  420. package/dist/tools/deterministic-screenshot-reruns/index.html +40 -0
  421. package/dist/tools/device-locale-screenshot-matrix/index.html +40 -0
  422. package/dist/tools/fastlane-screenshot-folder-structure/index.html +40 -0
  423. package/dist/tools/fastlane-screenshot-pipeline/index.html +40 -0
  424. package/dist/tools/fastlane-screenshots/index.html +6 -5
  425. package/dist/tools/first-export/index.html +6 -5
  426. package/dist/tools/gemini-cli-mcp-screenshot-automation/index.html +40 -0
  427. package/dist/tools/google-play-screenshot-automation/index.html +40 -0
  428. package/dist/tools/google-play-screenshot-requirements-checklist/index.html +40 -0
  429. package/dist/tools/index.html +6 -5
  430. package/dist/tools/ipad-screenshot-review-requirements/index.html +40 -0
  431. package/dist/tools/openai-responses-tool-screenshot-automation/index.html +40 -0
  432. package/dist/tools/screenshot-ci-pipeline/index.html +40 -0
  433. package/dist/tools/screenshot-naming-order-drift/index.html +40 -0
  434. package/dist/tools/screenshot-workload-calculator/index.html +6 -5
  435. package/dist/tools/store-assets-pipeline/index.html +3 -2
  436. package/dist/tools/vscode-copilot-mcp-screenshot-automation/index.html +40 -0
  437. package/package.json +10 -7
  438. package/dist/app/assets/AgentCli-DNTDYBbk.js +0 -17
  439. package/dist/app/assets/AgentCli-DNTDYBbk.js.map +0 -1
  440. package/dist/app/assets/App-BwQ1zI7a.css +0 -1
  441. package/dist/app/assets/App-DPi9LW-y.js +0 -13
  442. package/dist/app/assets/App-DPi9LW-y.js.map +0 -1
  443. package/dist/app/assets/AppReviewAso-BUTGLatx.js +0 -4
  444. package/dist/app/assets/AppReviewAso-BUTGLatx.js.map +0 -1
  445. package/dist/app/assets/Cancelled-BeS-WlPj.js +0 -2
  446. package/dist/app/assets/Cancelled-BeS-WlPj.js.map +0 -1
  447. package/dist/app/assets/CopyButton-BZQEBHBq.js +0 -2
  448. package/dist/app/assets/CopyButton-BZQEBHBq.js.map +0 -1
  449. package/dist/app/assets/FastlaneScreenshots-Dn7jfpuz.js +0 -52
  450. package/dist/app/assets/FastlaneScreenshots-Dn7jfpuz.js.map +0 -1
  451. package/dist/app/assets/FirstExport-CzioMqbJ.js +0 -6
  452. package/dist/app/assets/FirstExport-CzioMqbJ.js.map +0 -1
  453. package/dist/app/assets/FitPanel-DzYzTMEi.js +0 -2
  454. package/dist/app/assets/FitPanel-DzYzTMEi.js.map +0 -1
  455. package/dist/app/assets/FivePanelFramework-Bt5-NjCV.js +0 -62
  456. package/dist/app/assets/FivePanelFramework-Bt5-NjCV.js.map +0 -1
  457. package/dist/app/assets/ForgotPassword-DuHNHuUe.js +0 -2
  458. package/dist/app/assets/ForgotPassword-DuHNHuUe.js.map +0 -1
  459. package/dist/app/assets/Landing-DB9pTPoT.js +0 -2
  460. package/dist/app/assets/Landing-DB9pTPoT.js.map +0 -1
  461. package/dist/app/assets/LanguageSwitcher-CfUhVVuT.js +0 -2
  462. package/dist/app/assets/LanguageSwitcher-CfUhVVuT.js.map +0 -1
  463. package/dist/app/assets/Legal-p-YIX5Jv.js +0 -2
  464. package/dist/app/assets/Legal-p-YIX5Jv.js.map +0 -1
  465. package/dist/app/assets/NotFound-XohZYy7w.js +0 -2
  466. package/dist/app/assets/NotFound-XohZYy7w.js.map +0 -1
  467. package/dist/app/assets/Pricing-CxCutpT0.js +0 -2
  468. package/dist/app/assets/Pricing-CxCutpT0.js.map +0 -1
  469. package/dist/app/assets/Privacy-D8m3h6P-.js +0 -2
  470. package/dist/app/assets/Privacy-D8m3h6P-.js.map +0 -1
  471. package/dist/app/assets/SignIn-CINUig91.js +0 -2
  472. package/dist/app/assets/SignIn-CINUig91.js.map +0 -1
  473. package/dist/app/assets/SignUp-B1H6dQgE.js +0 -2
  474. package/dist/app/assets/SignUp-B1H6dQgE.js.map +0 -1
  475. package/dist/app/assets/SiteHeader-BGQW06JF.js +0 -2
  476. package/dist/app/assets/SiteHeader-BGQW06JF.js.map +0 -1
  477. package/dist/app/assets/StickyMobileCta-C41cW-Ji.js +0 -2
  478. package/dist/app/assets/StickyMobileCta-C41cW-Ji.js.map +0 -1
  479. package/dist/app/assets/StoreAssetsPipeline-bUVDqZAU.js +0 -6
  480. package/dist/app/assets/StoreAssetsPipeline-bUVDqZAU.js.map +0 -1
  481. package/dist/app/assets/Success-CMpdlLi2.js +0 -2
  482. package/dist/app/assets/Success-CMpdlLi2.js.map +0 -1
  483. package/dist/app/assets/Terms-C8NcE4sw.js +0 -2
  484. package/dist/app/assets/Terms-C8NcE4sw.js.map +0 -1
  485. package/dist/app/assets/ToolGuardrailsPanel-DbjLhdX8.js +0 -2
  486. package/dist/app/assets/ToolGuardrailsPanel-DbjLhdX8.js.map +0 -1
  487. package/dist/app/assets/ToolsIndex-BuZSvoBC.js +0 -6
  488. package/dist/app/assets/ToolsIndex-BuZSvoBC.js.map +0 -1
  489. package/dist/app/assets/WorkloadCalculator-CjdG5TVq.js +0 -5
  490. package/dist/app/assets/WorkloadCalculator-CjdG5TVq.js.map +0 -1
  491. package/dist/app/assets/calculator-_D64kDDH.js +0 -2
  492. package/dist/app/assets/calculator-_D64kDDH.js.map +0 -1
  493. package/dist/app/assets/check-BaiZ7vYg.js +0 -2
  494. package/dist/app/assets/check-BaiZ7vYg.js.map +0 -1
  495. package/dist/app/assets/chevron-down-DVRa-y8D.js +0 -2
  496. package/dist/app/assets/chevron-down-DVRa-y8D.js.map +0 -1
  497. package/dist/app/assets/circle-check-reAyVfkP.js +0 -2
  498. package/dist/app/assets/circle-check-reAyVfkP.js.map +0 -1
  499. package/dist/app/assets/clipboard-copy-BfB1mutp.js +0 -2
  500. package/dist/app/assets/clipboard-copy-BfB1mutp.js.map +0 -1
  501. package/dist/app/assets/copy-B9y2mtjd.js +0 -2
  502. package/dist/app/assets/copy-B9y2mtjd.js.map +0 -1
  503. package/dist/app/assets/crop-2_j5MtOq.js +0 -2
  504. package/dist/app/assets/crop-2_j5MtOq.js.map +0 -1
  505. package/dist/app/assets/download-CqEtEEpe.js +0 -2
  506. package/dist/app/assets/download-CqEtEEpe.js.map +0 -1
  507. package/dist/app/assets/eye-B1LPDhW7.js +0 -2
  508. package/dist/app/assets/eye-B1LPDhW7.js.map +0 -1
  509. package/dist/app/assets/folder-tree-CnF1eSpg.js +0 -2
  510. package/dist/app/assets/folder-tree-CnF1eSpg.js.map +0 -1
  511. package/dist/app/assets/grid-3x3-BB0TBwXQ.js +0 -2
  512. package/dist/app/assets/grid-3x3-BB0TBwXQ.js.map +0 -1
  513. package/dist/app/assets/index-Bffw9flM.js +0 -180
  514. package/dist/app/assets/index-Bffw9flM.js.map +0 -1
  515. package/dist/app/assets/index-CQecHUcy.css +0 -1
  516. package/dist/app/assets/layout-grid-DbSzm5KY.js +0 -2
  517. package/dist/app/assets/layout-grid-DbSzm5KY.js.map +0 -1
  518. package/dist/app/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  519. package/dist/app/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  520. package/dist/app/assets/roboto-cyrillic-700-normal-BiSG5NnW.woff2 +0 -0
  521. package/dist/app/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  522. package/dist/app/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  523. package/dist/app/assets/roboto-cyrillic-ext-500-normal-C927yMrb.woff +0 -0
  524. package/dist/app/assets/roboto-cyrillic-ext-700-normal-BuQgZIrO.woff +0 -0
  525. package/dist/app/assets/roboto-cyrillic-ext-700-normal-UFn0vR9r.woff2 +0 -0
  526. package/dist/app/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  527. package/dist/app/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  528. package/dist/app/assets/roboto-greek-700-normal-BcGn9doz.woff2 +0 -0
  529. package/dist/app/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  530. package/dist/app/assets/roboto-latin-500-normal-CC5nhZkh.woff +0 -0
  531. package/dist/app/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  532. package/dist/app/assets/roboto-latin-700-normal-CXeAXeti.woff2 +0 -0
  533. package/dist/app/assets/roboto-latin-700-normal-DUekQERp.woff +0 -0
  534. package/dist/app/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  535. package/dist/app/assets/roboto-latin-ext-400-normal-eTRLN0Nt.woff +0 -0
  536. package/dist/app/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  537. package/dist/app/assets/roboto-latin-ext-500-normal-FFcS8vBN.woff +0 -0
  538. package/dist/app/assets/roboto-latin-ext-700-normal-70GS1MYH.woff2 +0 -0
  539. package/dist/app/assets/roboto-latin-ext-700-normal-BS1OuQqR.woff +0 -0
  540. package/dist/app/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  541. package/dist/app/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  542. package/dist/app/assets/roboto-math-700-normal-VUAI6Bz2.woff2 +0 -0
  543. package/dist/app/assets/roboto-math-700-normal-pYD1nhov.woff +0 -0
  544. package/dist/app/assets/roboto-symbols-400-normal-Tzuungub.woff +0 -0
  545. package/dist/app/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  546. package/dist/app/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  547. package/dist/app/assets/roboto-symbols-500-normal-CAhAe-ik.woff +0 -0
  548. package/dist/app/assets/roboto-symbols-700-normal-CuuvBBxy.woff +0 -0
  549. package/dist/app/assets/roboto-symbols-700-normal-rJi6RjIy.woff2 +0 -0
  550. package/dist/app/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  551. package/dist/app/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  552. package/dist/app/assets/roboto-vietnamese-700-normal-iKxYNAzq.woff2 +0 -0
  553. package/dist/app/assets/rocket-d1Ntm8ge.js +0 -2
  554. package/dist/app/assets/rocket-d1Ntm8ge.js.map +0 -1
  555. package/dist/app/assets/shield-check-DXqKmrPT.js +0 -2
  556. package/dist/app/assets/shield-check-DXqKmrPT.js.map +0 -1
  557. package/dist/app/assets/signIn-D-eCUhFT.js +0 -2
  558. package/dist/app/assets/signIn-D-eCUhFT.js.map +0 -1
  559. package/dist/app/assets/smartphone-Cjrk_YxV.js +0 -2
  560. package/dist/app/assets/smartphone-Cjrk_YxV.js.map +0 -1
  561. package/dist/app/assets/terminal-CT_KE008.js +0 -2
  562. package/dist/app/assets/terminal-CT_KE008.js.map +0 -1
  563. package/dist/app/assets/useAuth-ctmUbyCR.js +0 -4
  564. package/dist/app/assets/useAuth-ctmUbyCR.js.map +0 -1
  565. package/dist/assets/AgentCli-DNTDYBbk.js +0 -17
  566. package/dist/assets/AgentCli-DNTDYBbk.js.map +0 -1
  567. package/dist/assets/App-BwQ1zI7a.css +0 -1
  568. package/dist/assets/App-DPi9LW-y.js +0 -13
  569. package/dist/assets/App-DPi9LW-y.js.map +0 -1
  570. package/dist/assets/AppReviewAso-BUTGLatx.js +0 -4
  571. package/dist/assets/AppReviewAso-BUTGLatx.js.map +0 -1
  572. package/dist/assets/Cancelled-BeS-WlPj.js +0 -2
  573. package/dist/assets/Cancelled-BeS-WlPj.js.map +0 -1
  574. package/dist/assets/CopyButton-BZQEBHBq.js +0 -2
  575. package/dist/assets/CopyButton-BZQEBHBq.js.map +0 -1
  576. package/dist/assets/FastlaneScreenshots-Dn7jfpuz.js +0 -52
  577. package/dist/assets/FastlaneScreenshots-Dn7jfpuz.js.map +0 -1
  578. package/dist/assets/FirstExport-CzioMqbJ.js +0 -6
  579. package/dist/assets/FirstExport-CzioMqbJ.js.map +0 -1
  580. package/dist/assets/FitPanel-DzYzTMEi.js +0 -2
  581. package/dist/assets/FitPanel-DzYzTMEi.js.map +0 -1
  582. package/dist/assets/FivePanelFramework-Bt5-NjCV.js +0 -62
  583. package/dist/assets/FivePanelFramework-Bt5-NjCV.js.map +0 -1
  584. package/dist/assets/ForgotPassword-DuHNHuUe.js +0 -2
  585. package/dist/assets/ForgotPassword-DuHNHuUe.js.map +0 -1
  586. package/dist/assets/Landing-DB9pTPoT.js +0 -2
  587. package/dist/assets/Landing-DB9pTPoT.js.map +0 -1
  588. package/dist/assets/LanguageSwitcher-CfUhVVuT.js +0 -2
  589. package/dist/assets/LanguageSwitcher-CfUhVVuT.js.map +0 -1
  590. package/dist/assets/Legal-p-YIX5Jv.js +0 -2
  591. package/dist/assets/Legal-p-YIX5Jv.js.map +0 -1
  592. package/dist/assets/NotFound-XohZYy7w.js +0 -2
  593. package/dist/assets/NotFound-XohZYy7w.js.map +0 -1
  594. package/dist/assets/Pricing-CxCutpT0.js +0 -2
  595. package/dist/assets/Pricing-CxCutpT0.js.map +0 -1
  596. package/dist/assets/Privacy-D8m3h6P-.js +0 -2
  597. package/dist/assets/Privacy-D8m3h6P-.js.map +0 -1
  598. package/dist/assets/SignIn-CINUig91.js +0 -2
  599. package/dist/assets/SignIn-CINUig91.js.map +0 -1
  600. package/dist/assets/SignUp-B1H6dQgE.js +0 -2
  601. package/dist/assets/SignUp-B1H6dQgE.js.map +0 -1
  602. package/dist/assets/SiteHeader-BGQW06JF.js +0 -2
  603. package/dist/assets/SiteHeader-BGQW06JF.js.map +0 -1
  604. package/dist/assets/StickyMobileCta-C41cW-Ji.js +0 -2
  605. package/dist/assets/StickyMobileCta-C41cW-Ji.js.map +0 -1
  606. package/dist/assets/StoreAssetsPipeline-bUVDqZAU.js +0 -6
  607. package/dist/assets/StoreAssetsPipeline-bUVDqZAU.js.map +0 -1
  608. package/dist/assets/Success-CMpdlLi2.js +0 -2
  609. package/dist/assets/Success-CMpdlLi2.js.map +0 -1
  610. package/dist/assets/Terms-C8NcE4sw.js +0 -2
  611. package/dist/assets/Terms-C8NcE4sw.js.map +0 -1
  612. package/dist/assets/ToolGuardrailsPanel-DbjLhdX8.js +0 -2
  613. package/dist/assets/ToolGuardrailsPanel-DbjLhdX8.js.map +0 -1
  614. package/dist/assets/ToolsIndex-BuZSvoBC.js +0 -6
  615. package/dist/assets/ToolsIndex-BuZSvoBC.js.map +0 -1
  616. package/dist/assets/WorkloadCalculator-CjdG5TVq.js +0 -5
  617. package/dist/assets/WorkloadCalculator-CjdG5TVq.js.map +0 -1
  618. package/dist/assets/calculator-_D64kDDH.js +0 -2
  619. package/dist/assets/calculator-_D64kDDH.js.map +0 -1
  620. package/dist/assets/check-BaiZ7vYg.js +0 -2
  621. package/dist/assets/check-BaiZ7vYg.js.map +0 -1
  622. package/dist/assets/chevron-down-DVRa-y8D.js +0 -2
  623. package/dist/assets/chevron-down-DVRa-y8D.js.map +0 -1
  624. package/dist/assets/circle-check-reAyVfkP.js +0 -2
  625. package/dist/assets/circle-check-reAyVfkP.js.map +0 -1
  626. package/dist/assets/clipboard-copy-BfB1mutp.js +0 -2
  627. package/dist/assets/clipboard-copy-BfB1mutp.js.map +0 -1
  628. package/dist/assets/copy-B9y2mtjd.js +0 -2
  629. package/dist/assets/copy-B9y2mtjd.js.map +0 -1
  630. package/dist/assets/crop-2_j5MtOq.js +0 -2
  631. package/dist/assets/crop-2_j5MtOq.js.map +0 -1
  632. package/dist/assets/download-CqEtEEpe.js +0 -2
  633. package/dist/assets/download-CqEtEEpe.js.map +0 -1
  634. package/dist/assets/eye-B1LPDhW7.js +0 -2
  635. package/dist/assets/eye-B1LPDhW7.js.map +0 -1
  636. package/dist/assets/folder-tree-CnF1eSpg.js +0 -2
  637. package/dist/assets/folder-tree-CnF1eSpg.js.map +0 -1
  638. package/dist/assets/grid-3x3-BB0TBwXQ.js +0 -2
  639. package/dist/assets/grid-3x3-BB0TBwXQ.js.map +0 -1
  640. package/dist/assets/index-Bffw9flM.js +0 -180
  641. package/dist/assets/index-Bffw9flM.js.map +0 -1
  642. package/dist/assets/index-CQecHUcy.css +0 -1
  643. package/dist/assets/layout-grid-DbSzm5KY.js +0 -2
  644. package/dist/assets/layout-grid-DbSzm5KY.js.map +0 -1
  645. package/dist/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  646. package/dist/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  647. package/dist/assets/roboto-cyrillic-700-normal-BiSG5NnW.woff2 +0 -0
  648. package/dist/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  649. package/dist/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  650. package/dist/assets/roboto-cyrillic-ext-500-normal-C927yMrb.woff +0 -0
  651. package/dist/assets/roboto-cyrillic-ext-700-normal-BuQgZIrO.woff +0 -0
  652. package/dist/assets/roboto-cyrillic-ext-700-normal-UFn0vR9r.woff2 +0 -0
  653. package/dist/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  654. package/dist/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  655. package/dist/assets/roboto-greek-700-normal-BcGn9doz.woff2 +0 -0
  656. package/dist/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  657. package/dist/assets/roboto-latin-500-normal-CC5nhZkh.woff +0 -0
  658. package/dist/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  659. package/dist/assets/roboto-latin-700-normal-CXeAXeti.woff2 +0 -0
  660. package/dist/assets/roboto-latin-700-normal-DUekQERp.woff +0 -0
  661. package/dist/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  662. package/dist/assets/roboto-latin-ext-400-normal-eTRLN0Nt.woff +0 -0
  663. package/dist/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  664. package/dist/assets/roboto-latin-ext-500-normal-FFcS8vBN.woff +0 -0
  665. package/dist/assets/roboto-latin-ext-700-normal-70GS1MYH.woff2 +0 -0
  666. package/dist/assets/roboto-latin-ext-700-normal-BS1OuQqR.woff +0 -0
  667. package/dist/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  668. package/dist/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  669. package/dist/assets/roboto-math-700-normal-VUAI6Bz2.woff2 +0 -0
  670. package/dist/assets/roboto-math-700-normal-pYD1nhov.woff +0 -0
  671. package/dist/assets/roboto-symbols-400-normal-Tzuungub.woff +0 -0
  672. package/dist/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  673. package/dist/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  674. package/dist/assets/roboto-symbols-500-normal-CAhAe-ik.woff +0 -0
  675. package/dist/assets/roboto-symbols-700-normal-CuuvBBxy.woff +0 -0
  676. package/dist/assets/roboto-symbols-700-normal-rJi6RjIy.woff2 +0 -0
  677. package/dist/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  678. package/dist/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  679. package/dist/assets/roboto-vietnamese-700-normal-iKxYNAzq.woff2 +0 -0
  680. package/dist/assets/rocket-d1Ntm8ge.js +0 -2
  681. package/dist/assets/rocket-d1Ntm8ge.js.map +0 -1
  682. package/dist/assets/shield-check-DXqKmrPT.js +0 -2
  683. package/dist/assets/shield-check-DXqKmrPT.js.map +0 -1
  684. package/dist/assets/signIn-D-eCUhFT.js +0 -2
  685. package/dist/assets/signIn-D-eCUhFT.js.map +0 -1
  686. package/dist/assets/smartphone-Cjrk_YxV.js +0 -2
  687. package/dist/assets/smartphone-Cjrk_YxV.js.map +0 -1
  688. package/dist/assets/terminal-CT_KE008.js +0 -2
  689. package/dist/assets/terminal-CT_KE008.js.map +0 -1
  690. package/dist/assets/useAuth-ctmUbyCR.js +0 -4
  691. package/dist/assets/useAuth-ctmUbyCR.js.map +0 -1
@@ -12,12 +12,25 @@ import { runExportFramefile } from '../cli/commands/exportFramefile.js';
12
12
  import { runVerify } from '../cli/commands/verify.js';
13
13
  import { runStage } from '../cli/commands/stage.js';
14
14
  import { runPlan } from '../cli/commands/plan.js';
15
+ import {
16
+ renderInspectReleaseContextSummary,
17
+ runInspectReleaseContext,
18
+ } from '../cli/commands/inspectReleaseContext.js';
19
+ import { renderPlanReleaseSummary, runPlanRelease } from '../cli/commands/planRelease.js';
20
+ import {
21
+ renderWriteStarterConfigSummary,
22
+ runWriteStarterConfig,
23
+ } from '../cli/commands/writeStarterConfig.js';
24
+ import { renderImportScreenshotsSummary, runImportScreenshots } from '../cli/commands/importScreenshots.js';
25
+ import { renderCaptureScreenshotsSummary, runCaptureScreenshots } from '../cli/commands/captureScreenshots.js';
15
26
  import { runAuth } from '../cli/commands/auth.js';
16
27
  import { runInit } from '../cli/commands/init.js';
17
28
  import { runWizard } from '../cli/commands/wizard.js';
18
29
  import { runCopyImport } from '../cli/commands/copyImport.js';
30
+ import { runCopyCheck } from '../cli/commands/copyCheck.js';
19
31
  import { resolveCliAuth } from '../cli/auth.js';
20
32
  import { listTemplateIds, resolveTemplateConfig } from '../cli/templateConfig.js';
33
+ import { listMcpBootstrapClients, runMcpInit } from '../cli/mcpBootstrap.js';
21
34
  import { runMcpServer } from '../cli/mcpServer.js';
22
35
  import { loadShipScreensConfig } from '../cli/loadConfig.js';
23
36
  import { collectAssetReferences } from '../cli/assetRefs.js';
@@ -30,6 +43,7 @@ import {
30
43
 
31
44
  const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
32
45
  const DEMO_SCREENS_DIR = path.join(PACKAGE_ROOT, 'cli', 'assets', 'demo-screens');
46
+ const MCP_BOOTSTRAP_CLIENT_LIST = listMcpBootstrapClients().join('|');
33
47
 
34
48
  function printHelp() {
35
49
  console.log(`ShipScreens CLI
@@ -37,62 +51,95 @@ function printHelp() {
37
51
  Usage:
38
52
  shipscreens init [--dir <path>] [--slides <n>] [--locales <id,id>] [--devices <id,id>] [--force] [--wizard] [--style <value>] [--template <id>]
39
53
  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]
54
+ 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]
55
+ 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>] [--stage] [--stage-out <dir>] [--report-json <path>] [--report-md <path>] [--require-pro] [--force]
42
56
  shipscreens devices [--json]
43
57
  shipscreens templates [--json]
44
58
  shipscreens validate [-c shipscreens.config.yml]
45
59
  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]
60
+ shipscreens build [-c shipscreens.config.yml] [--mode shipscreens|rendered|raw|frameit] [--format dir|zip] [--out <dir>] [--zip] [--zip-out <path>] [--variant <id>] [--clean]
61
+ shipscreens verify [-c shipscreens.config.yml] [--out <dir>] [--zip] [--zip-out <path>] [--profile appstore|playstore|any] [--variant <id>]
62
+ shipscreens stage [-c shipscreens.config.yml] [--from <dir>] --out <dir> [--profile appstore|playstore|any] [--variant <id>]
63
+ shipscreens inspect-release-context [--dir <path>] [-c shipscreens.config.yml] [--json]
64
+ shipscreens plan-release [--dir <path>] [-c shipscreens.config.yml] [--profile appstore|playstore|any] [--mode raw|rendered] [--out <dir>] [--stage-out <dir>] [--json]
65
+ shipscreens write-starter-config [--dir <path>] [--profile appstore|playstore|any] [--slides <n>] [--locales <id,id>] [--devices <id,id>] [--template <id>] [--out <dir>] [--stage-out <dir>] [--force] [--json]
66
+ shipscreens capture-screenshots [--dir <path>] [--platform auto|android|ios-simulator|ios-device] [--device <id>] [--out screenshots] [--locale <id>] [--slot <n>] [--name <file.png>] [--profile appstore|playstore|any] [--list] [--json]
67
+ shipscreens import-screenshots [--dir <path>] [-c shipscreens.config.yml] [--from <dir>] [--locale <id|all>] [--profile appstore|playstore|any] [--out <dir>] [--stage-out <dir>] [--force] [--allow-partial] [--json]
49
68
  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]
69
+ shipscreens plan [-c shipscreens.config.yml] [--out <dir>] [--zip-out <path>] [--profile appstore|playstore|any] [--variant <id>] [--json]
51
70
  shipscreens copy import [-c shipscreens.config.yml] [--csv <path>] [--import-mode merge|replace]
71
+ 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
72
  shipscreens auth <login|finish|status|logout> [--domain <cognito-domain>] [--client-id <id>] [--api-base <url>] [--port <port>] [--manual] [--redirect-url <url>]
53
73
  shipscreens mcp serve
74
+ shipscreens mcp init --client <${MCP_BOOTSTRAP_CLIENT_LIST}> [--dir <path>] [--package-spec <spec>] [--windows-cmd-shim] [--force]
54
75
 
55
76
  Commands:
56
77
  init Create a starter config + placeholder PNGs + copy.csv
57
78
  wizard Step-by-step setup (locales/devices/template)
58
79
  demo Create a demo project + export (no assets required)
59
- agent-run Non-interactive end-to-end flow (init -> validate -> build -> verify)
80
+ agent-run Non-interactive end-to-end flow (init -> validate -> build -> verify -> optional stage/report)
60
81
  devices List device ids (for shipscreens.config.yml)
61
- templates List style template ids (for init/wizard/agent-run)
82
+ templates List style template ids (for init/wizard/write-starter-config/agent-run)
62
83
  validate Validate shipscreens.config.yml (schema + asset paths)
63
84
  lock Generate shipscreens.lock.json with sha256 hashes
64
85
  build Generate Fastlane-ready outputs (headless Chromium, zero-padded filenames)
65
86
  verify Verify Fastlane outputs (dir and/or zip)
66
87
  stage Copy only upload-ready files into a new root
88
+ inspect-release-context Inspect config, Fastlane roots, devices/locales, and missing assets
89
+ plan-release Turn inspection into the next safe agent/CLI command sequence
90
+ write-starter-config Non-interactively create config + copy.csv + placeholder PNGs for agents
91
+ capture-screenshots Capture the currently visible connected device/emulator screen into a local source folder
92
+ import-screenshots Copy existing screenshots into configured asset paths
67
93
  export Export helper files for other tools
68
94
  plan Print a deterministic build/stage plan (JSON)
69
95
  copy Import locale copy from copy.csv into shipscreens.config.yml
96
+ check Run pseudo-locale + long-string checks for submission quality
70
97
  auth Manage CLI sign-in (required to remove watermarks in CLI exports)
71
- mcp Start a stdio MCP server that exposes ShipScreens tools
98
+ mcp Start a stdio MCP server or write workspace-local MCP config
72
99
 
73
100
  Options:
74
101
  -c, --config <path> Path to shipscreens.config.yml (default: ./shipscreens.config.yml)
75
- --dir <path> Output directory for init (default: .)
76
- --slides <n> Number of slides to scaffold (init, default: 5, max: 10)
77
- --locales <list> Comma-separated locales for init (default: en-US)
78
- --devices <list> Comma-separated device ids for init (default: iphone69,pixel8)
79
- --force Overwrite files when running init
102
+ --dir <path> Output directory for init/write-starter-config (default: .)
103
+ --slides <n> Number of slides to scaffold (init/write-starter-config, default: 5, max: 10)
104
+ --locales <list> Comma-separated locales for init/write-starter-config (default: en-US)
105
+ --devices <list> Comma-separated device ids for init/write-starter-config (default: iphone69,pixel8)
106
+ --force Overwrite files when running init/write-starter-config
80
107
  --wizard Run step-by-step init prompts
81
108
  --style <value> Style preset: default | template:<id> | <template-id>
82
109
  --template <id> Template preset (alias for --style template:<id>)
83
110
  --defaults Skip the style prompt in wizard (use default/no style)
84
111
  --csv <path> Path to copy.csv for copy import (default: ./copy.csv)
85
112
  --import-mode <mode> CSV import mode (merge|replace, default: merge)
113
+ --pseudo-locale <id> Locale id prefix for pseudo-locale checks (default: qps-ploc)
114
+ --pseudo-expand <n> Pseudo-locale expansion ratio (default: 0.35)
115
+ --max-header-units <n> Visual-width budget for headers (default: 34)
116
+ --max-sub-units <n> Visual-width budget for subtitles (default: 54)
117
+ --max-token-length <n> Long-token budget before wrap risk warning (default: 22)
118
+ --write-pseudo-csv <path> Write pseudo-locale CSV rows for manual QA
119
+ --write-report-json <path> Write full copy-check report JSON for CI/QA artifacts
120
+ --strict Fail copy check when warnings are found
86
121
  --out <path> Lock output file path (lock) or output root directory (build/verify/stage)
87
122
  --zip-out <path> ZIP output file path (default: <out>/fastlane_assets.zip)
88
123
  --profile <appstore|playstore|any> Strict verification/staging rules per store (default: any)
89
- --from <dir> Source output root for staging (default: config dir)
124
+ --variant <id> ASO experiment variant scope (writes under variants/<id>/...).
125
+ --platform <value> Capture source: auto|android|ios-simulator|ios-device (default: auto)
126
+ --device <id> Device serial/UDID/name for capture-screenshots
127
+ --from <dir> Source output root for staging, or source screenshots for import-screenshots
128
+ --locale <id|all> Locale target for import-screenshots (default: primary config locale)
129
+ --slot <n> Slot number for capture filename (01.png..99.png)
130
+ --name <file.png> Explicit capture filename
131
+ --list List capturable devices instead of writing a screenshot
132
+ --allow-partial Let import-screenshots copy fewer images than configured targets
90
133
  --check Verify outputs are valid/up-to-date (no write)
91
134
  --json Emit machine-readable JSON (most commands; plan always emits JSON)
92
135
  --mode <shipscreens|rendered|raw|frameit> Build mode (default: rendered). shipscreens=rendered alias, frameit runs raw + export framefile --check
93
136
  --format <dir|zip> Output format (default: dir)
94
137
  --zip Also write a ZIP (same as --format zip)
95
138
  --clean Delete existing outputs for the current locale/device/bucket before writing
139
+ --stage For agent-run, also create a clean upload root after verify
140
+ --stage-out <dir> For agent-run, staged upload root (default: <out>-stage; implies --stage)
141
+ --report-json <path> For agent-run, write a machine-readable proof report (default with --stage: <out>/shipscreens.agent-report.json)
142
+ --report-md <path> For agent-run, write a short Markdown proof summary (default with --stage: <out>/shipscreens.agent-summary.md)
96
143
  --require-pro Fail the build if Pro access is not available
97
144
  --manual Print a login URL instead of starting a local callback server
98
145
  --redirect-url <url> Full redirect URL after manual login (for auth finish)
@@ -102,14 +149,17 @@ Options:
102
149
  --android-dir <path> Android output directory (default: fastlane/metadata/android)
103
150
  --strings-encoding <utf8|utf16le|utf16be> Encoding for generated .strings (export framefile / build --mode frameit) (default: utf8)
104
151
  --framefile-strategy <merge|overwrite> How to handle fastlane/screenshots/Framefile.json (export framefile / build --mode frameit) (default: merge)
152
+ --client <id> MCP bootstrap target (${MCP_BOOTSTRAP_CLIENT_LIST}) for "mcp init"
153
+ --package-spec <spec> Package spec used in generated MCP config (default: shipscreens@latest)
154
+ --windows-cmd-shim Use "cmd /c npx ..." in the generated MCP config
105
155
  -h, --help Show help
106
156
 
107
157
  Quickstart (no browser):
108
- shipscreens wizard
109
- shipscreens build --mode raw --zip --out out
110
- shipscreens verify --out out --zip --profile appstore
158
+ shipscreens write-starter-config --profile appstore
159
+ shipscreens agent-run --mode raw --zip --out out/agent --stage --profile appstore
111
160
 
112
161
  MCP quickstart:
162
+ shipscreens mcp init --client cursor
113
163
  shipscreens mcp serve
114
164
  `);
115
165
  }
@@ -180,6 +230,15 @@ async function pathExists(targetPath) {
180
230
  }
181
231
  }
182
232
 
233
+ function parseNumericFlag(name, value) {
234
+ if (value == null || value === '') return undefined;
235
+ const num = Number(value);
236
+ if (!Number.isFinite(num)) {
237
+ throw new Error(`Invalid --${name} value: ${value}`);
238
+ }
239
+ return num;
240
+ }
241
+
183
242
  async function loadDemoScreenPngs() {
184
243
  try {
185
244
  const entries = await fs.readdir(DEMO_SCREENS_DIR);
@@ -225,6 +284,172 @@ async function findPlaceholderAssets({ configPath }) {
225
284
  return matches;
226
285
  }
227
286
 
287
+ function defaultAgentStageOutDir(outDir) {
288
+ const raw = String(outDir || 'out/agent').trim() || 'out/agent';
289
+ const trimmed = raw.replace(/[\\/]+$/, '');
290
+ return `${trimmed || 'out/agent'}-stage`;
291
+ }
292
+
293
+ function resolveAgentArtifactPath({ baseDir, filePath }) {
294
+ const raw = String(filePath || '').trim();
295
+ if (!raw) return null;
296
+ return path.isAbsolute(raw) ? raw : path.resolve(baseDir, raw);
297
+ }
298
+
299
+ async function writeAgentArtifact(filePath, content) {
300
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
301
+ await fs.writeFile(filePath, content, 'utf8');
302
+ }
303
+
304
+ function coalesceCount(...values) {
305
+ for (const value of values) {
306
+ if (Number.isFinite(Number(value))) return Number(value);
307
+ }
308
+ return 0;
309
+ }
310
+
311
+ function createAgentReport({
312
+ configPath,
313
+ targetDir,
314
+ outDir,
315
+ stageOutDir,
316
+ zipOut,
317
+ format,
318
+ mode,
319
+ profile,
320
+ variant,
321
+ requirePro,
322
+ build,
323
+ verify,
324
+ stage,
325
+ releaseContext,
326
+ reportPaths,
327
+ }) {
328
+ const warnings = [];
329
+ if (!requirePro) {
330
+ warnings.push('Free CLI run may include a watermark. Run shipscreens auth login and rerun with --require-pro before production export.');
331
+ }
332
+ if (!stage) {
333
+ warnings.push('No staged upload root was requested. Pass --stage to create a clean deliver/supply root.');
334
+ }
335
+
336
+ const nextSteps = [];
337
+ if (stage) {
338
+ nextSteps.push('Review the staged upload root before store submission.');
339
+ } else {
340
+ nextSteps.push('Rerun agent-run with --stage to create a clean upload root.');
341
+ }
342
+ if (!requirePro) {
343
+ nextSteps.push('Unlock Pro, then rerun with --require-pro to fail closed if watermark-free export is unavailable.');
344
+ } else {
345
+ nextSteps.push('Keep --require-pro in CI so paid export failures stop the release before upload.');
346
+ }
347
+
348
+ return {
349
+ schemaVersion: 1,
350
+ generatedAt: new Date().toISOString(),
351
+ command: 'agent-run',
352
+ status: 'ok',
353
+ workspace: targetDir,
354
+ configPath,
355
+ mode,
356
+ format,
357
+ profile,
358
+ variant: variant || null,
359
+ requirePro: Boolean(requirePro),
360
+ outputs: {
361
+ buildRoot: outDir,
362
+ zipPath: build?.zipPath || verify?.zipPath || zipOut || null,
363
+ iosDir: verify?.iosDir || build?.iosDir || null,
364
+ androidDir: verify?.androidDir || build?.androidDir || null,
365
+ stageRoot: stage?.out || stageOutDir || null,
366
+ stagedIosDir: stage?.iosDir || null,
367
+ stagedAndroidDir: stage?.androidDir || null,
368
+ reportJson: reportPaths.json || null,
369
+ reportMarkdown: reportPaths.markdown || null,
370
+ },
371
+ counts: {
372
+ locales: coalesceCount(verify?.locales, stage?.locales, build?.locales),
373
+ slides: coalesceCount(verify?.slides, stage?.slides, build?.slides),
374
+ iosDevices: coalesceCount(verify?.iosDevices, stage?.iosDevices, build?.iosDevices),
375
+ androidDevices: coalesceCount(verify?.androidDevices, stage?.androidDevices, build?.androidDevices),
376
+ stagedFiles: stage ? coalesceCount(stage.files) : null,
377
+ },
378
+ warnings,
379
+ nextSteps,
380
+ releaseContext: releaseContext
381
+ ? {
382
+ storeTarget: releaseContext.storeTarget,
383
+ config: releaseContext.config,
384
+ missingAssets: releaseContext.missingAssets,
385
+ screenshotRoots: releaseContext.screenshotRoots,
386
+ warnings: releaseContext.warnings,
387
+ questions: releaseContext.questions,
388
+ agentHandoff: releaseContext.agentHandoff,
389
+ }
390
+ : null,
391
+ build,
392
+ verify,
393
+ stage: stage || null,
394
+ };
395
+ }
396
+
397
+ function renderAgentSummaryMarkdown(report) {
398
+ const releaseContextLines = report.releaseContext
399
+ ? [
400
+ '## Release Context',
401
+ `- Store target: ${report.releaseContext.storeTarget?.profile || 'unknown'} (${report.releaseContext.storeTarget?.confidence || 'unknown'})`,
402
+ `- Config: ${report.releaseContext.config?.relativePath || 'unknown'} (${report.releaseContext.config?.valid ? 'valid' : 'not ready'})`,
403
+ `- Missing assets: ${report.releaseContext.missingAssets?.length || 0}`,
404
+ `- Open questions: ${report.releaseContext.questions?.length || 0}`,
405
+ '',
406
+ ]
407
+ : ['## Release Context', '- Not inspected', ''];
408
+ const lines = [
409
+ '# ShipScreens Agent Report',
410
+ '',
411
+ `Generated: ${report.generatedAt}`,
412
+ `Status: ${report.status}`,
413
+ '',
414
+ '## Scope',
415
+ `- Workspace: ${report.workspace}`,
416
+ `- Config: ${report.configPath}`,
417
+ `- Mode: ${report.mode}`,
418
+ `- Format: ${report.format}`,
419
+ `- Profile: ${report.profile}`,
420
+ `- Variant: ${report.variant || 'none'}`,
421
+ `- Require Pro: ${report.requirePro ? 'yes' : 'no'}`,
422
+ '',
423
+ ...releaseContextLines,
424
+ '## Outputs',
425
+ `- Build root: ${report.outputs.buildRoot}`,
426
+ `- ZIP: ${report.outputs.zipPath || 'not requested'}`,
427
+ `- iOS dir: ${report.outputs.iosDir || 'not generated'}`,
428
+ `- Android dir: ${report.outputs.androidDir || 'not generated'}`,
429
+ `- Stage root: ${report.outputs.stageRoot || 'not requested'}`,
430
+ '',
431
+ '## Verification',
432
+ `- Locales: ${report.counts.locales}`,
433
+ `- Slides: ${report.counts.slides}`,
434
+ `- iOS devices: ${report.counts.iosDevices}`,
435
+ `- Android devices: ${report.counts.androidDevices}`,
436
+ '',
437
+ '## Stage',
438
+ report.stage
439
+ ? `- Staged files: ${report.counts.stagedFiles}\n- Staged iOS dir: ${report.outputs.stagedIosDir || 'none'}\n- Staged Android dir: ${report.outputs.stagedAndroidDir || 'none'}`
440
+ : '- Not requested',
441
+ '',
442
+ '## Warnings',
443
+ ...(report.warnings.length ? report.warnings.map((item) => `- ${item}`) : ['- None']),
444
+ '',
445
+ '## Next Steps',
446
+ ...report.nextSteps.map((item) => `- ${item}`),
447
+ '',
448
+ ];
449
+
450
+ return `${lines.join('\n')}\n`;
451
+ }
452
+
228
453
  async function main() {
229
454
  const { positionals, values } = parseArgs({
230
455
  args: process.argv.slice(2),
@@ -238,12 +463,23 @@ async function main() {
238
463
  zip: { type: 'boolean' },
239
464
  'zip-out': { type: 'string' },
240
465
  clean: { type: 'boolean' },
466
+ stage: { type: 'boolean' },
467
+ 'stage-out': { type: 'string' },
468
+ 'report-json': { type: 'string' },
469
+ 'report-md': { type: 'string' },
241
470
  'ios-dir': { type: 'string' },
242
471
  'android-dir': { type: 'string' },
243
472
  'strings-encoding': { type: 'string' },
244
473
  'framefile-strategy': { type: 'string' },
245
474
  profile: { type: 'string' },
475
+ variant: { type: 'string' },
476
+ platform: { type: 'string' },
477
+ device: { type: 'string' },
246
478
  from: { type: 'string' },
479
+ locale: { type: 'string' },
480
+ slot: { type: 'string' },
481
+ name: { type: 'string' },
482
+ list: { type: 'boolean' },
247
483
  json: { type: 'boolean' },
248
484
  'require-pro': { type: 'boolean' },
249
485
  manual: { type: 'boolean' },
@@ -265,6 +501,18 @@ async function main() {
265
501
  defaults: { type: 'boolean' },
266
502
  csv: { type: 'string' },
267
503
  'import-mode': { type: 'string' },
504
+ 'pseudo-locale': { type: 'string' },
505
+ 'pseudo-expand': { type: 'string' },
506
+ 'max-header-units': { type: 'string' },
507
+ 'max-sub-units': { type: 'string' },
508
+ 'max-token-length': { type: 'string' },
509
+ 'write-pseudo-csv': { type: 'string' },
510
+ 'write-report-json': { type: 'string' },
511
+ strict: { type: 'boolean' },
512
+ client: { type: 'string' },
513
+ 'package-spec': { type: 'string' },
514
+ 'windows-cmd-shim': { type: 'boolean' },
515
+ 'allow-partial': { type: 'boolean' },
268
516
  help: { type: 'boolean', short: 'h' },
269
517
  },
270
518
  });
@@ -338,6 +586,78 @@ async function main() {
338
586
  return;
339
587
  }
340
588
 
589
+ if (command === 'inspect-release-context') {
590
+ const result = await runInspectReleaseContext({
591
+ dir: values.dir,
592
+ configPath: values.config,
593
+ });
594
+ emitPayload('inspect-release-context', result, renderInspectReleaseContextSummary(result));
595
+ return;
596
+ }
597
+
598
+ if (command === 'plan-release') {
599
+ const result = await runPlanRelease({
600
+ dir: values.dir,
601
+ configPath: values.config,
602
+ profile: values.profile,
603
+ mode: values.mode,
604
+ outDir: values.out,
605
+ stageOutDir: values['stage-out'],
606
+ });
607
+ emitPayload('plan-release', result, renderPlanReleaseSummary(result));
608
+ return;
609
+ }
610
+
611
+ if (command === 'write-starter-config') {
612
+ const stylePreset = resolveStylePreset({ styleFlag: values.style, templateFlag: values.template });
613
+ const result = await runWriteStarterConfig({
614
+ dir: values.dir,
615
+ profile: values.profile,
616
+ slides: values.slides,
617
+ locales: values.locales,
618
+ devices: values.devices,
619
+ assets: stylePreset.presetAssets,
620
+ style: stylePreset.presetStyle,
621
+ force: values.force,
622
+ outDir: values.out,
623
+ stageOutDir: values['stage-out'],
624
+ });
625
+ emitPayload('write-starter-config', result, renderWriteStarterConfigSummary(result));
626
+ return;
627
+ }
628
+
629
+ if (command === 'capture-screenshots') {
630
+ const result = await runCaptureScreenshots({
631
+ dir: values.dir,
632
+ platform: values.platform,
633
+ device: values.device,
634
+ outDir: values.out,
635
+ name: values.name,
636
+ slot: values.slot,
637
+ locale: values.locale,
638
+ profile: values.profile,
639
+ list: values.list,
640
+ });
641
+ emitPayload('capture-screenshots', result, renderCaptureScreenshotsSummary(result));
642
+ return;
643
+ }
644
+
645
+ if (command === 'import-screenshots') {
646
+ const result = await runImportScreenshots({
647
+ dir: values.dir,
648
+ configPath: values.config,
649
+ fromDir: values.from,
650
+ locale: values.locale,
651
+ profile: values.profile,
652
+ outDir: values.out,
653
+ stageOutDir: values['stage-out'],
654
+ force: values.force,
655
+ allowPartial: values['allow-partial'],
656
+ });
657
+ emitPayload('import-screenshots', result, renderImportScreenshotsSummary(result));
658
+ return;
659
+ }
660
+
341
661
  if (command === 'auth') {
342
662
  await runAuth({ subcommand: positionals[1], values });
343
663
  return;
@@ -345,11 +665,37 @@ async function main() {
345
665
 
346
666
  if (command === 'mcp') {
347
667
  const subcommand = positionals[1] || 'serve';
348
- if (subcommand !== 'serve') {
349
- throw new Error(`Unknown mcp command: ${subcommand}`);
668
+ if (subcommand === 'serve') {
669
+ await runMcpServer();
670
+ return;
350
671
  }
351
- await runMcpServer();
352
- return;
672
+ if (subcommand === 'init') {
673
+ const result = await runMcpInit({
674
+ client: values.client,
675
+ dir: values.dir,
676
+ packageSpec: values['package-spec'],
677
+ windowsCmdShim: values['windows-cmd-shim'],
678
+ force: values.force,
679
+ });
680
+ const commandSummary = [result.command, ...result.args].join(' ');
681
+ emitPayload(
682
+ 'mcp init',
683
+ result,
684
+ [
685
+ `OK: wrote ${result.clientLabel} MCP config -> ${result.configPath}`,
686
+ `- settings key: ${result.settingsKey}`,
687
+ result.transport ? `- transport: ${result.transport}` : null,
688
+ `- command: ${commandSummary}`,
689
+ `- merged existing config: ${result.mergedExistingConfig ? 'yes' : 'no'}`,
690
+ `- shipscreens entry changed: ${result.shipscreensEntryChanged ? 'yes' : 'no'}`,
691
+ `- total servers at key: ${result.serverCount}`,
692
+ ]
693
+ .filter(Boolean)
694
+ .join('\n')
695
+ );
696
+ return;
697
+ }
698
+ throw new Error(`Unknown mcp command: ${subcommand}`);
353
699
  }
354
700
 
355
701
  if (command === 'wizard') {
@@ -369,8 +715,7 @@ async function main() {
369
715
  `- ${result.configPath}\n` +
370
716
  `- ${result.csvPath}\n` +
371
717
  `Next: replace placeholder PNGs in assets/, then run:\n` +
372
- ` shipscreens build --mode raw --zip --out out\n` +
373
- ` shipscreens verify --out out --zip --profile appstore\n` +
718
+ ` shipscreens agent-run --mode raw --zip --out out/agent --stage --profile appstore\n` +
374
719
  `Pro unlock (remove watermark):\n` +
375
720
  ` shipscreens auth login`
376
721
  );
@@ -433,7 +778,7 @@ async function main() {
433
778
  const demoCopyByLocale = {
434
779
  // Keep demo copy ASCII-only so it renders consistently across environments/fonts.
435
780
  'en-US': [
436
- ['Screenshots as a build step', 'wizard -> build -> verify -> tree'],
781
+ ['Tell your coding agent', 'keep flow -> verify -> stage'],
437
782
  ['Fastlane-ready outputs', 'deliver (iOS) + supply (Android)'],
438
783
  ['Reproducible exports', 'same inputs -> same outputs'],
439
784
  ['Verify before upload', 'catch mixed folders early'],
@@ -441,7 +786,7 @@ async function main() {
441
786
  ],
442
787
  // If the demo includes non-English locales, reuse the same copy to avoid implying translation is built-in.
443
788
  'ja-JP': [
444
- ['Screenshots as a build step', 'wizard -> build -> verify -> tree'],
789
+ ['Tell your coding agent', 'keep flow -> verify -> stage'],
445
790
  ['Fastlane-ready outputs', 'deliver (iOS) + supply (Android)'],
446
791
  ['Reproducible exports', 'same inputs -> same outputs'],
447
792
  ['Verify before upload', 'catch mixed folders early'],
@@ -493,6 +838,7 @@ async function main() {
493
838
  mode,
494
839
  outDir: buildOutDir,
495
840
  zipOut,
841
+ variant: values.variant,
496
842
  clean: true,
497
843
  cliAuthToken,
498
844
  cliAuthProfile,
@@ -504,6 +850,7 @@ async function main() {
504
850
  zipOut,
505
851
  zip: true,
506
852
  profile,
853
+ variant: values.variant,
507
854
  });
508
855
 
509
856
  const stageResult = await runStage({
@@ -511,6 +858,7 @@ async function main() {
511
858
  fromDir: buildOutDir,
512
859
  outDir: stageOutDir,
513
860
  profile,
861
+ variant: values.variant,
514
862
  });
515
863
 
516
864
  const summary = [
@@ -532,6 +880,7 @@ async function main() {
532
880
  stageOutDir,
533
881
  mode,
534
882
  profile,
883
+ variant: values.variant || null,
535
884
  init: initResult,
536
885
  build: result,
537
886
  verify: verifyResult,
@@ -571,8 +920,7 @@ async function main() {
571
920
  `- ${result.configPath}\n` +
572
921
  `- ${result.csvPath}\n` +
573
922
  `Next: replace placeholder PNGs in assets/, then run:\n` +
574
- ` shipscreens build --mode raw --zip --out out\n` +
575
- ` shipscreens verify --out out --zip --profile appstore\n` +
923
+ ` shipscreens agent-run --mode raw --zip --out out/agent --stage --profile appstore\n` +
576
924
  `Pro unlock (remove watermark):\n` +
577
925
  ` shipscreens auth login`
578
926
  );
@@ -621,12 +969,22 @@ async function main() {
621
969
  const outDir = values.out || 'out/agent';
622
970
  const zipOut = rawZipOut || undefined;
623
971
  const zip = format === 'zip' || Boolean(zipOut);
972
+ const stageRequested = Boolean(values.stage || values['stage-out']);
973
+ const rawStageOutDir = typeof values['stage-out'] === 'string' ? values['stage-out'].trim() : '';
974
+ const stageOutDir = stageRequested ? rawStageOutDir || defaultAgentStageOutDir(outDir) : null;
975
+ const rawReportJsonPath = typeof values['report-json'] === 'string' ? values['report-json'].trim() : '';
976
+ const rawReportMdPath = typeof values['report-md'] === 'string' ? values['report-md'].trim() : '';
977
+ const reportJsonPathValue =
978
+ rawReportJsonPath || (stageRequested ? path.join(outDir, 'shipscreens.agent-report.json') : '');
979
+ const reportMdPathValue =
980
+ rawReportMdPath || (stageRequested ? path.join(outDir, 'shipscreens.agent-summary.md') : '');
624
981
  const { config } = await loadShipScreensConfig(configPath);
625
982
  const hasAndroid = (config.devices || []).some((device) => device.platform === 'android');
626
983
  const hasIos = (config.devices || []).some((device) => device.platform !== 'android');
627
984
  const defaultProfile = hasIos && !hasAndroid ? 'appstore' : !hasIos && hasAndroid ? 'playstore' : 'any';
628
985
  const profile = values.profile || defaultProfile;
629
986
  const requirePro = Boolean(values['require-pro']);
987
+ const releaseContext = await runInspectReleaseContext({ dir: targetDir, configPath });
630
988
  const { token: cliAuthToken, profile: cliAuthProfile } = await resolveCliAuth({ requirePro });
631
989
 
632
990
  const result = await runBuild({
@@ -637,6 +995,7 @@ async function main() {
637
995
  iosDir: values['ios-dir'],
638
996
  androidDir: values['android-dir'],
639
997
  zipOut,
998
+ variant: values.variant,
640
999
  stringsEncoding: values['strings-encoding'],
641
1000
  framefileStrategy: values['framefile-strategy'],
642
1001
  clean: values.clean,
@@ -652,7 +1011,46 @@ async function main() {
652
1011
  zipOut,
653
1012
  zip,
654
1013
  profile,
1014
+ variant: values.variant,
1015
+ });
1016
+
1017
+ const stageResult = stageRequested
1018
+ ? await runStage({
1019
+ configPath,
1020
+ fromDir: outDir,
1021
+ outDir: stageOutDir,
1022
+ profile,
1023
+ variant: values.variant,
1024
+ })
1025
+ : null;
1026
+
1027
+ const reportPaths = {
1028
+ json: resolveAgentArtifactPath({ baseDir: targetDir, filePath: reportJsonPathValue }),
1029
+ markdown: resolveAgentArtifactPath({ baseDir: targetDir, filePath: reportMdPathValue }),
1030
+ };
1031
+ const agentReport = createAgentReport({
1032
+ configPath,
1033
+ targetDir,
1034
+ outDir,
1035
+ stageOutDir,
1036
+ zipOut,
1037
+ format,
1038
+ mode,
1039
+ profile,
1040
+ variant: values.variant,
1041
+ requirePro,
1042
+ build: result,
1043
+ verify: verifyResult,
1044
+ stage: stageResult,
1045
+ releaseContext,
1046
+ reportPaths,
655
1047
  });
1048
+ if (reportPaths.json) {
1049
+ await writeAgentArtifact(reportPaths.json, `${JSON.stringify(agentReport, null, 2)}\n`);
1050
+ }
1051
+ if (reportPaths.markdown) {
1052
+ await writeAgentArtifact(reportPaths.markdown, renderAgentSummaryMarkdown(agentReport));
1053
+ }
656
1054
 
657
1055
  const summary = [
658
1056
  `OK: agent-run completed`,
@@ -662,18 +1060,27 @@ async function main() {
662
1060
  `${verifyResult.androidDevices} Android device(s) -> ${verifyResult.androidDir}`,
663
1061
  ];
664
1062
  if (result.zipPath || verifyResult.zipPath) summary.push(`zip -> ${result.zipPath || verifyResult.zipPath}`);
1063
+ if (stageResult) summary.push(`stage -> ${stageResult.out}`);
1064
+ if (reportPaths.json) summary.push(`report json -> ${reportPaths.json}`);
1065
+ if (reportPaths.markdown) summary.push(`report md -> ${reportPaths.markdown}`);
665
1066
  emitPayload(
666
1067
  'agent-run',
667
1068
  {
668
1069
  configPath,
669
1070
  outDir,
670
1071
  zipOut: zipOut || null,
1072
+ stageOutDir,
671
1073
  format,
672
1074
  mode,
673
1075
  profile,
1076
+ variant: values.variant || null,
674
1077
  requirePro,
675
1078
  build: result,
676
1079
  verify: verifyResult,
1080
+ stage: stageResult,
1081
+ agentReport,
1082
+ releaseContext,
1083
+ reportPaths,
677
1084
  },
678
1085
  summary.join(', ')
679
1086
  );
@@ -705,6 +1112,41 @@ async function main() {
705
1112
  );
706
1113
  return;
707
1114
  }
1115
+ if (subcommand === 'check') {
1116
+ const result = await runCopyCheck({
1117
+ configPath,
1118
+ pseudoLocale: values['pseudo-locale'],
1119
+ pseudoExpand: parseNumericFlag('pseudo-expand', values['pseudo-expand']),
1120
+ maxHeaderUnits: parseNumericFlag('max-header-units', values['max-header-units']),
1121
+ maxSubUnits: parseNumericFlag('max-sub-units', values['max-sub-units']),
1122
+ maxTokenLength: parseNumericFlag('max-token-length', values['max-token-length']),
1123
+ writePseudoCsv: values['write-pseudo-csv'],
1124
+ writeReportJson: values['write-report-json'],
1125
+ });
1126
+
1127
+ const sample = result.issues.slice(0, 8);
1128
+ const lines = [
1129
+ `OK: copy check (${result.locales} locale(s) x ${result.slides} slide(s))`,
1130
+ `- issues: ${result.issueCount}`,
1131
+ `- pseudo locale: ${result.pseudoLocale} (expand=${result.pseudoExpand})`,
1132
+ `- limits: header=${result.limits.headerUnits}, sub=${result.limits.subUnits}, token=${result.limits.tokenLength}`,
1133
+ ];
1134
+ if (result.pseudoCsvPath) lines.push(`- pseudo csv: ${result.pseudoCsvPath}`);
1135
+ if (result.reportJsonPath) lines.push(`- report json: ${result.reportJsonPath}`);
1136
+ if (sample.length) {
1137
+ lines.push('- sample warnings:');
1138
+ sample.forEach((issue) => {
1139
+ lines.push(` - [${issue.type}] slide ${issue.slide} ${issue.localeId} ${issue.field}: ${issue.detail}`);
1140
+ });
1141
+ }
1142
+
1143
+ if (values.strict && result.issueCount > 0) {
1144
+ throw new Error(`copy check failed (--strict): ${result.issueCount} issue(s)\n${lines.join('\n')}`);
1145
+ }
1146
+
1147
+ emitPayload('copy check', result, lines.join('\n'));
1148
+ return;
1149
+ }
708
1150
  throw new Error(`Unknown copy command: ${subcommand || '(missing)'}`);
709
1151
  }
710
1152
 
@@ -750,6 +1192,7 @@ async function main() {
750
1192
  iosDir: values['ios-dir'],
751
1193
  androidDir: values['android-dir'],
752
1194
  zipOut,
1195
+ variant: values.variant,
753
1196
  stringsEncoding: values['strings-encoding'],
754
1197
  framefileStrategy: values['framefile-strategy'],
755
1198
  clean: values.clean,
@@ -766,7 +1209,15 @@ async function main() {
766
1209
  if (result.zipPath) summary.push(`zip -> ${result.zipPath}`);
767
1210
  emitPayload(
768
1211
  'build',
769
- { configPath, format, mode: values.mode || 'rendered', outDir: outDir || null, zipOut: zipOut || null, ...result },
1212
+ {
1213
+ configPath,
1214
+ format,
1215
+ mode: values.mode || 'rendered',
1216
+ outDir: outDir || null,
1217
+ zipOut: zipOut || null,
1218
+ variant: values.variant || null,
1219
+ ...result,
1220
+ },
770
1221
  summary.join(', ')
771
1222
  );
772
1223
  return;
@@ -783,6 +1234,7 @@ async function main() {
783
1234
  zipOut: rawZipOut || undefined,
784
1235
  zip: values.zip || Boolean(rawZipOut),
785
1236
  profile: values.profile,
1237
+ variant: values.variant,
786
1238
  });
787
1239
  const summary = [
788
1240
  `OK: verified`,
@@ -799,6 +1251,7 @@ async function main() {
799
1251
  outDir: rawOut || null,
800
1252
  zipOut: rawZipOut || null,
801
1253
  profile: values.profile || null,
1254
+ variant: values.variant || null,
802
1255
  ...result,
803
1256
  },
804
1257
  summary.join(', ')
@@ -814,6 +1267,7 @@ async function main() {
814
1267
  fromDir: rawFrom || undefined,
815
1268
  outDir: rawOut || undefined,
816
1269
  profile: values.profile,
1270
+ variant: values.variant,
817
1271
  });
818
1272
  const details = result.iosVariant ? `, ios=${result.iosVariant}` : '';
819
1273
  emitPayload(
@@ -832,6 +1286,7 @@ async function main() {
832
1286
  androidDir: values['android-dir'],
833
1287
  zipOut: values['zip-out'],
834
1288
  profile: values.profile,
1289
+ variant: values.variant,
835
1290
  });
836
1291
  process.stdout.write(JSON.stringify(plan, null, 2) + '\n');
837
1292
  return;