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.
- package/README.md +37 -1
- package/bin/shipscreens.js +133 -12
- package/cli/auth.js +31 -11
- package/cli/commands/build.js +9 -1
- package/cli/commands/copyCheck.js +265 -0
- package/cli/commands/plan.js +7 -3
- package/cli/commands/stage.js +13 -3
- package/cli/commands/verify.js +7 -2
- package/cli/mcpBootstrap.js +174 -0
- package/cli/schema.js +19 -0
- package/cli/variantScope.js +58 -0
- package/dist/.well-known/ai-agents.json +217 -4
- package/dist/.well-known/llms-full.txt +114 -6
- package/dist/.well-known/llms.txt +64 -2
- package/dist/.well-known/mcp-server.json +4 -4
- package/dist/ai-agents.json +217 -4
- package/dist/app/assets/AgentCli-xKYtzL3B.js +17 -0
- package/dist/app/assets/AgentCli-xKYtzL3B.js.map +1 -0
- package/dist/{assets/App-DPi9LW-y.js → app/assets/App-C1cNw_fn.js} +10 -10
- package/dist/app/assets/App-C1cNw_fn.js.map +1 -0
- package/dist/app/assets/App-oQfE_p3A.css +1 -0
- package/dist/app/assets/AppReviewAso-CaIT-L7Z.js +4 -0
- package/dist/app/assets/AppReviewAso-CaIT-L7Z.js.map +1 -0
- package/dist/app/assets/{Cancelled-BeS-WlPj.js → Cancelled-Dmw7PTD-.js} +2 -2
- package/dist/app/assets/{Cancelled-BeS-WlPj.js.map → Cancelled-Dmw7PTD-.js.map} +1 -1
- package/dist/app/assets/CopyButton-CPRHmu8l.js +2 -0
- package/dist/app/assets/CopyButton-CPRHmu8l.js.map +1 -0
- package/dist/app/assets/DesignPartner-Ckp1GhNv.js +4 -0
- package/dist/app/assets/DesignPartner-Ckp1GhNv.js.map +1 -0
- package/dist/app/assets/FastlaneScreenshots-CB-zv5Us.js +100 -0
- package/dist/app/assets/FastlaneScreenshots-CB-zv5Us.js.map +1 -0
- package/dist/app/assets/FirstExport-RXbvVQdK.js +6 -0
- package/dist/app/assets/FirstExport-RXbvVQdK.js.map +1 -0
- package/dist/app/assets/{FitPanel-DzYzTMEi.js → FitPanel-ic91y-49.js} +2 -2
- package/dist/app/assets/{FitPanel-DzYzTMEi.js.map → FitPanel-ic91y-49.js.map} +1 -1
- package/dist/app/assets/FivePanelFramework-BZKNcycb.js +62 -0
- package/dist/app/assets/FivePanelFramework-BZKNcycb.js.map +1 -0
- package/dist/app/assets/{ForgotPassword-DuHNHuUe.js → ForgotPassword-CKOfAvWk.js} +2 -2
- package/dist/{assets/ForgotPassword-DuHNHuUe.js.map → app/assets/ForgotPassword-CKOfAvWk.js.map} +1 -1
- package/dist/app/assets/Landing-D0cuDDUk.js +2 -0
- package/dist/app/assets/Landing-D0cuDDUk.js.map +1 -0
- package/dist/app/assets/{LanguageSwitcher-CfUhVVuT.js → LanguageSwitcher-BrToLEgF.js} +2 -2
- package/dist/app/assets/{LanguageSwitcher-CfUhVVuT.js.map → LanguageSwitcher-BrToLEgF.js.map} +1 -1
- package/dist/app/assets/{Legal-p-YIX5Jv.js → Legal-Cm-hVzjY.js} +2 -2
- package/dist/app/assets/{Legal-p-YIX5Jv.js.map → Legal-Cm-hVzjY.js.map} +1 -1
- package/dist/app/assets/{NotFound-XohZYy7w.js → NotFound-B0I6I440.js} +2 -2
- package/dist/app/assets/{NotFound-XohZYy7w.js.map → NotFound-B0I6I440.js.map} +1 -1
- package/dist/app/assets/Pricing-p-NIjjtK.js +29 -0
- package/dist/app/assets/Pricing-p-NIjjtK.js.map +1 -0
- package/dist/app/assets/{Privacy-D8m3h6P-.js → Privacy-BhfPkK0y.js} +2 -2
- package/dist/app/assets/{Privacy-D8m3h6P-.js.map → Privacy-BhfPkK0y.js.map} +1 -1
- package/dist/app/assets/Proof-D-7QbTGX.js +20 -0
- package/dist/app/assets/Proof-D-7QbTGX.js.map +1 -0
- package/dist/app/assets/Security-DFafJQIT.js +2 -0
- package/dist/app/assets/Security-DFafJQIT.js.map +1 -0
- package/dist/app/assets/{SignIn-CINUig91.js → SignIn--6nNsUCm.js} +2 -2
- package/dist/app/assets/{SignIn-CINUig91.js.map → SignIn--6nNsUCm.js.map} +1 -1
- package/dist/app/assets/{SignUp-B1H6dQgE.js → SignUp-yh5ydmFf.js} +2 -2
- package/dist/{assets/SignUp-B1H6dQgE.js.map → app/assets/SignUp-yh5ydmFf.js.map} +1 -1
- package/dist/app/assets/{SiteHeader-BGQW06JF.js → SiteHeader-NTK-cM9O.js} +2 -2
- package/dist/{assets/SiteHeader-BGQW06JF.js.map → app/assets/SiteHeader-NTK-cM9O.js.map} +1 -1
- package/dist/app/assets/StickyMobileCta-DVXAyhaH.js +2 -0
- package/dist/app/assets/{StickyMobileCta-C41cW-Ji.js.map → StickyMobileCta-DVXAyhaH.js.map} +1 -1
- package/dist/{assets/StoreAssetsPipeline-bUVDqZAU.js → app/assets/StoreAssetsPipeline-Cbs1bNK5.js} +3 -3
- package/dist/app/assets/{StoreAssetsPipeline-bUVDqZAU.js.map → StoreAssetsPipeline-Cbs1bNK5.js.map} +1 -1
- package/dist/app/assets/{Success-CMpdlLi2.js → Success-C3n0m1XU.js} +2 -2
- package/dist/app/assets/{Success-CMpdlLi2.js.map → Success-C3n0m1XU.js.map} +1 -1
- package/dist/app/assets/{Terms-C8NcE4sw.js → Terms-C72ybAwA.js} +2 -2
- package/dist/app/assets/{Terms-C8NcE4sw.js.map → Terms-C72ybAwA.js.map} +1 -1
- package/dist/app/assets/{ToolGuardrailsPanel-DbjLhdX8.js → ToolGuardrailsPanel-meKxUeSB.js} +2 -2
- package/dist/app/assets/{ToolGuardrailsPanel-DbjLhdX8.js.map → ToolGuardrailsPanel-meKxUeSB.js.map} +1 -1
- package/dist/app/assets/ToolsIndex-CnvNTvyW.js +6 -0
- package/dist/app/assets/ToolsIndex-CnvNTvyW.js.map +1 -0
- package/dist/{assets/WorkloadCalculator-CjdG5TVq.js → app/assets/WorkloadCalculator-CK4qVUcQ.js} +4 -4
- package/dist/app/assets/{WorkloadCalculator-CjdG5TVq.js.map → WorkloadCalculator-CK4qVUcQ.js.map} +1 -1
- package/dist/app/assets/arrow-right-Dglia5EE.js +2 -0
- package/dist/app/assets/arrow-right-Dglia5EE.js.map +1 -0
- package/dist/app/assets/{calculator-_D64kDDH.js → calculator-CAgtsVuH.js} +2 -2
- package/dist/app/assets/{calculator-_D64kDDH.js.map → calculator-CAgtsVuH.js.map} +1 -1
- package/dist/app/assets/check-B5h9hATV.js +2 -0
- package/dist/app/assets/{check-BaiZ7vYg.js.map → check-B5h9hATV.js.map} +1 -1
- package/dist/app/assets/chevron-down-By2Ts8dG.js +2 -0
- package/dist/app/assets/{chevron-down-DVRa-y8D.js.map → chevron-down-By2Ts8dG.js.map} +1 -1
- package/dist/app/assets/{circle-check-reAyVfkP.js → circle-check-DaJ6APMi.js} +2 -2
- package/dist/app/assets/{circle-check-reAyVfkP.js.map → circle-check-DaJ6APMi.js.map} +1 -1
- package/dist/app/assets/{clipboard-copy-BfB1mutp.js → clipboard-copy-IDfWU9SE.js} +2 -2
- package/dist/app/assets/{clipboard-copy-BfB1mutp.js.map → clipboard-copy-IDfWU9SE.js.map} +1 -1
- package/dist/app/assets/{copy-B9y2mtjd.js → copy-KSn4Rc2b.js} +2 -2
- package/dist/app/assets/{copy-B9y2mtjd.js.map → copy-KSn4Rc2b.js.map} +1 -1
- package/dist/app/assets/{crop-2_j5MtOq.js → crop-C9hwiw0i.js} +2 -2
- package/dist/app/assets/{crop-2_j5MtOq.js.map → crop-C9hwiw0i.js.map} +1 -1
- package/dist/app/assets/{download-CqEtEEpe.js → download-eqwxO8bs.js} +2 -2
- package/dist/app/assets/{download-CqEtEEpe.js.map → download-eqwxO8bs.js.map} +1 -1
- package/dist/app/assets/{eye-B1LPDhW7.js → eye-Dg61f0nU.js} +2 -2
- package/dist/app/assets/{eye-B1LPDhW7.js.map → eye-Dg61f0nU.js.map} +1 -1
- package/dist/app/assets/file-text-BQPKCil3.js +2 -0
- package/dist/app/assets/file-text-BQPKCil3.js.map +1 -0
- package/dist/app/assets/{folder-tree-CnF1eSpg.js → folder-tree-9hq6oigy.js} +2 -2
- package/dist/app/assets/{folder-tree-CnF1eSpg.js.map → folder-tree-9hq6oigy.js.map} +1 -1
- package/dist/app/assets/{grid-3x3-BB0TBwXQ.js → grid-3x3-BHXRyOIx.js} +2 -2
- package/dist/{assets/grid-3x3-BB0TBwXQ.js.map → app/assets/grid-3x3-BHXRyOIx.js.map} +1 -1
- package/dist/app/assets/index-my6BmN7T.js +204 -0
- package/dist/app/assets/index-my6BmN7T.js.map +1 -0
- package/dist/app/assets/index-rv91vbLH.css +1 -0
- package/dist/app/assets/{layout-grid-DbSzm5KY.js → layout-grid-DDQvnEgx.js} +2 -2
- package/dist/app/assets/{layout-grid-DbSzm5KY.js.map → layout-grid-DDQvnEgx.js.map} +1 -1
- package/dist/{assets/roboto-cyrillic-400-normal-DZJji7Rx.woff → app/assets/roboto-cyrillic-400-normal-Bjg-1-sg.woff} +0 -0
- package/dist/app/assets/roboto-cyrillic-400-normal-CBPI_iaY.woff2 +0 -0
- package/dist/{assets/roboto-cyrillic-500-normal-BI4HuXre.woff → app/assets/roboto-cyrillic-500-normal-CBKMylY4.woff} +0 -0
- package/dist/app/assets/roboto-cyrillic-500-normal-CLao9AfR.woff2 +0 -0
- package/dist/app/assets/roboto-cyrillic-700-normal-C2o7G-SM.woff2 +0 -0
- package/dist/{assets/roboto-cyrillic-700-normal-KqaQ5bNp.woff → app/assets/roboto-cyrillic-700-normal-DhZFXDSN.woff} +0 -0
- package/dist/{assets/roboto-cyrillic-ext-400-normal-DtZHuW6i.woff → app/assets/roboto-cyrillic-ext-400-normal-CaK1767H.woff} +0 -0
- package/dist/app/assets/roboto-cyrillic-ext-400-normal-qHufge6k.woff2 +0 -0
- package/dist/app/assets/roboto-cyrillic-ext-500-normal-BWC_xYeb.woff2 +0 -0
- package/dist/app/assets/roboto-cyrillic-ext-500-normal-DqF2hftb.woff +0 -0
- package/dist/app/assets/roboto-cyrillic-ext-700-normal-CI7FH63F.woff +0 -0
- package/dist/app/assets/roboto-cyrillic-ext-700-normal-DmFxo5wj.woff2 +0 -0
- package/dist/{assets/roboto-greek-400-normal-CcizSnRP.woff → app/assets/roboto-greek-400-normal-Bb5mj_fZ.woff} +0 -0
- package/dist/app/assets/roboto-greek-400-normal-ai2Z1K3C.woff2 +0 -0
- package/dist/app/assets/roboto-greek-500-normal-C9AnhcmC.woff2 +0 -0
- package/dist/{assets/roboto-greek-500-normal-BLLWU9W-.woff → app/assets/roboto-greek-500-normal-oCqhoyfc.woff} +0 -0
- package/dist/app/assets/roboto-greek-700-normal-0aHWxGLu.woff2 +0 -0
- package/dist/app/assets/{roboto-greek-700-normal-D3kmAf0K.woff → roboto-greek-700-normal-DjRqqLBV.woff} +0 -0
- package/dist/app/assets/roboto-latin-400-normal-BqEyEoaF.woff2 +0 -0
- package/dist/app/assets/{roboto-latin-400-normal-068yxgMN.woff → roboto-latin-400-normal-DyYNIH4P.woff} +0 -0
- package/dist/app/assets/roboto-latin-500-normal-7RbcRiD8.woff2 +0 -0
- package/dist/app/assets/roboto-latin-500-normal-DQZyH_nt.woff +0 -0
- package/dist/app/assets/roboto-latin-700-normal-BZpUvMxY.woff2 +0 -0
- package/dist/app/assets/roboto-latin-700-normal-DLgJJpmK.woff +0 -0
- package/dist/app/assets/roboto-latin-ext-400-normal-C3tdtHj3.woff2 +0 -0
- package/dist/app/assets/roboto-latin-ext-400-normal-scX0fKtV.woff +0 -0
- package/dist/app/assets/roboto-latin-ext-500-normal-Cyc0AKLz.woff +0 -0
- package/dist/app/assets/roboto-latin-ext-500-normal-pMCM9Ixg.woff2 +0 -0
- package/dist/app/assets/roboto-latin-ext-700-normal-BUhwtWwy.woff +0 -0
- package/dist/app/assets/roboto-latin-ext-700-normal-DSBUz0N1.woff2 +0 -0
- package/dist/app/assets/roboto-math-400-normal-BEFej5gc.woff2 +0 -0
- package/dist/app/assets/{roboto-math-400-normal-rzxYvyVt.woff → roboto-math-400-normal-C9RxBKAh.woff} +0 -0
- package/dist/{assets/roboto-math-500-normal-DaFX-ZC8.woff → app/assets/roboto-math-500-normal-C-7mKPO3.woff} +0 -0
- package/dist/app/assets/roboto-math-500-normal-C4NU9gLX.woff2 +0 -0
- package/dist/app/assets/roboto-math-700-normal-B8YqGHVc.woff2 +0 -0
- package/dist/app/assets/roboto-math-700-normal-DVoD5t2k.woff +0 -0
- package/dist/app/assets/roboto-symbols-400-normal-CB1Ce4Gk.woff2 +0 -0
- package/dist/app/assets/roboto-symbols-400-normal-DLYbZahX.woff +0 -0
- package/dist/app/assets/roboto-symbols-500-normal-B_CZKVJS.woff2 +0 -0
- package/dist/app/assets/roboto-symbols-500-normal-F7c8nfcH.woff +0 -0
- package/dist/app/assets/roboto-symbols-700-normal-BiFDindJ.woff2 +0 -0
- package/dist/app/assets/roboto-symbols-700-normal-BoS6HWkc.woff +0 -0
- package/dist/app/assets/roboto-vietnamese-400-normal-D2PTxGxD.woff2 +0 -0
- package/dist/{assets/roboto-vietnamese-400-normal-DmXaN3yE.woff → app/assets/roboto-vietnamese-400-normal-DnpnVwnf.woff} +0 -0
- package/dist/app/assets/roboto-vietnamese-500-normal-B3ncpOoB.woff2 +0 -0
- package/dist/{assets/roboto-vietnamese-500-normal-DW96CsrR.woff → app/assets/roboto-vietnamese-500-normal-D380IkQ8.woff} +0 -0
- package/dist/app/assets/roboto-vietnamese-700-normal-BEVeWqJt.woff2 +0 -0
- package/dist/{assets/roboto-vietnamese-700-normal-Dz0HwF-w.woff → app/assets/roboto-vietnamese-700-normal-DsFyXAL4.woff} +0 -0
- package/dist/app/assets/rocket-0KMviRpJ.js +2 -0
- package/dist/app/assets/rocket-0KMviRpJ.js.map +1 -0
- package/dist/app/assets/{shield-check-DXqKmrPT.js → shield-check-BvKEQ2hc.js} +2 -2
- package/dist/{assets/shield-check-DXqKmrPT.js.map → app/assets/shield-check-BvKEQ2hc.js.map} +1 -1
- package/dist/app/assets/{signIn-D-eCUhFT.js → signIn-Ckla1_0O.js} +2 -2
- package/dist/app/assets/{signIn-D-eCUhFT.js.map → signIn-Ckla1_0O.js.map} +1 -1
- package/dist/app/assets/{smartphone-Cjrk_YxV.js → smartphone-I0w1b2DV.js} +2 -2
- package/dist/app/assets/{smartphone-Cjrk_YxV.js.map → smartphone-I0w1b2DV.js.map} +1 -1
- package/dist/app/assets/{terminal-CT_KE008.js → terminal-CLpUSQqd.js} +2 -2
- package/dist/{assets/terminal-CT_KE008.js.map → app/assets/terminal-CLpUSQqd.js.map} +1 -1
- package/dist/app/assets/triangle-alert-w7TZ0yy2.js +2 -0
- package/dist/app/assets/triangle-alert-w7TZ0yy2.js.map +1 -0
- package/dist/{assets/useAuth-ctmUbyCR.js → app/assets/useAuth-N3hsUaDj.js} +3 -3
- package/dist/app/assets/{useAuth-ctmUbyCR.js.map → useAuth-N3hsUaDj.js.map} +1 -1
- package/dist/app/assets/users-DsQdkuR3.js +2 -0
- package/dist/app/assets/users-DsQdkuR3.js.map +1 -0
- package/dist/app/index.html +2 -2
- package/dist/assets/AgentCli-xKYtzL3B.js +17 -0
- package/dist/assets/AgentCli-xKYtzL3B.js.map +1 -0
- package/dist/{app/assets/App-DPi9LW-y.js → assets/App-C1cNw_fn.js} +10 -10
- package/dist/assets/App-C1cNw_fn.js.map +1 -0
- package/dist/assets/App-oQfE_p3A.css +1 -0
- package/dist/assets/AppReviewAso-CaIT-L7Z.js +4 -0
- package/dist/assets/AppReviewAso-CaIT-L7Z.js.map +1 -0
- package/dist/assets/{Cancelled-BeS-WlPj.js → Cancelled-Dmw7PTD-.js} +2 -2
- package/dist/assets/{Cancelled-BeS-WlPj.js.map → Cancelled-Dmw7PTD-.js.map} +1 -1
- package/dist/assets/CopyButton-CPRHmu8l.js +2 -0
- package/dist/assets/CopyButton-CPRHmu8l.js.map +1 -0
- package/dist/assets/DesignPartner-Ckp1GhNv.js +4 -0
- package/dist/assets/DesignPartner-Ckp1GhNv.js.map +1 -0
- package/dist/assets/FastlaneScreenshots-CB-zv5Us.js +100 -0
- package/dist/assets/FastlaneScreenshots-CB-zv5Us.js.map +1 -0
- package/dist/assets/FirstExport-RXbvVQdK.js +6 -0
- package/dist/assets/FirstExport-RXbvVQdK.js.map +1 -0
- package/dist/assets/{FitPanel-DzYzTMEi.js → FitPanel-ic91y-49.js} +2 -2
- package/dist/assets/{FitPanel-DzYzTMEi.js.map → FitPanel-ic91y-49.js.map} +1 -1
- package/dist/assets/FivePanelFramework-BZKNcycb.js +62 -0
- package/dist/assets/FivePanelFramework-BZKNcycb.js.map +1 -0
- package/dist/assets/{ForgotPassword-DuHNHuUe.js → ForgotPassword-CKOfAvWk.js} +2 -2
- package/dist/{app/assets/ForgotPassword-DuHNHuUe.js.map → assets/ForgotPassword-CKOfAvWk.js.map} +1 -1
- package/dist/assets/Landing-D0cuDDUk.js +2 -0
- package/dist/assets/Landing-D0cuDDUk.js.map +1 -0
- package/dist/assets/{LanguageSwitcher-CfUhVVuT.js → LanguageSwitcher-BrToLEgF.js} +2 -2
- package/dist/assets/{LanguageSwitcher-CfUhVVuT.js.map → LanguageSwitcher-BrToLEgF.js.map} +1 -1
- package/dist/assets/{Legal-p-YIX5Jv.js → Legal-Cm-hVzjY.js} +2 -2
- package/dist/assets/{Legal-p-YIX5Jv.js.map → Legal-Cm-hVzjY.js.map} +1 -1
- package/dist/assets/{NotFound-XohZYy7w.js → NotFound-B0I6I440.js} +2 -2
- package/dist/assets/{NotFound-XohZYy7w.js.map → NotFound-B0I6I440.js.map} +1 -1
- package/dist/assets/Pricing-p-NIjjtK.js +29 -0
- package/dist/assets/Pricing-p-NIjjtK.js.map +1 -0
- package/dist/assets/{Privacy-D8m3h6P-.js → Privacy-BhfPkK0y.js} +2 -2
- package/dist/assets/{Privacy-D8m3h6P-.js.map → Privacy-BhfPkK0y.js.map} +1 -1
- package/dist/assets/Proof-D-7QbTGX.js +20 -0
- package/dist/assets/Proof-D-7QbTGX.js.map +1 -0
- package/dist/assets/Security-DFafJQIT.js +2 -0
- package/dist/assets/Security-DFafJQIT.js.map +1 -0
- package/dist/assets/{SignIn-CINUig91.js → SignIn--6nNsUCm.js} +2 -2
- package/dist/assets/{SignIn-CINUig91.js.map → SignIn--6nNsUCm.js.map} +1 -1
- package/dist/assets/{SignUp-B1H6dQgE.js → SignUp-yh5ydmFf.js} +2 -2
- package/dist/{app/assets/SignUp-B1H6dQgE.js.map → assets/SignUp-yh5ydmFf.js.map} +1 -1
- package/dist/assets/{SiteHeader-BGQW06JF.js → SiteHeader-NTK-cM9O.js} +2 -2
- package/dist/{app/assets/SiteHeader-BGQW06JF.js.map → assets/SiteHeader-NTK-cM9O.js.map} +1 -1
- package/dist/assets/StickyMobileCta-DVXAyhaH.js +2 -0
- package/dist/assets/{StickyMobileCta-C41cW-Ji.js.map → StickyMobileCta-DVXAyhaH.js.map} +1 -1
- package/dist/{app/assets/StoreAssetsPipeline-bUVDqZAU.js → assets/StoreAssetsPipeline-Cbs1bNK5.js} +3 -3
- package/dist/assets/{StoreAssetsPipeline-bUVDqZAU.js.map → StoreAssetsPipeline-Cbs1bNK5.js.map} +1 -1
- package/dist/assets/{Success-CMpdlLi2.js → Success-C3n0m1XU.js} +2 -2
- package/dist/assets/{Success-CMpdlLi2.js.map → Success-C3n0m1XU.js.map} +1 -1
- package/dist/assets/{Terms-C8NcE4sw.js → Terms-C72ybAwA.js} +2 -2
- package/dist/assets/{Terms-C8NcE4sw.js.map → Terms-C72ybAwA.js.map} +1 -1
- package/dist/assets/{ToolGuardrailsPanel-DbjLhdX8.js → ToolGuardrailsPanel-meKxUeSB.js} +2 -2
- package/dist/assets/{ToolGuardrailsPanel-DbjLhdX8.js.map → ToolGuardrailsPanel-meKxUeSB.js.map} +1 -1
- package/dist/assets/ToolsIndex-CnvNTvyW.js +6 -0
- package/dist/assets/ToolsIndex-CnvNTvyW.js.map +1 -0
- package/dist/{app/assets/WorkloadCalculator-CjdG5TVq.js → assets/WorkloadCalculator-CK4qVUcQ.js} +4 -4
- package/dist/assets/{WorkloadCalculator-CjdG5TVq.js.map → WorkloadCalculator-CK4qVUcQ.js.map} +1 -1
- package/dist/assets/arrow-right-Dglia5EE.js +2 -0
- package/dist/assets/arrow-right-Dglia5EE.js.map +1 -0
- package/dist/assets/{calculator-_D64kDDH.js → calculator-CAgtsVuH.js} +2 -2
- package/dist/assets/{calculator-_D64kDDH.js.map → calculator-CAgtsVuH.js.map} +1 -1
- package/dist/assets/check-B5h9hATV.js +2 -0
- package/dist/assets/{check-BaiZ7vYg.js.map → check-B5h9hATV.js.map} +1 -1
- package/dist/assets/chevron-down-By2Ts8dG.js +2 -0
- package/dist/assets/{chevron-down-DVRa-y8D.js.map → chevron-down-By2Ts8dG.js.map} +1 -1
- package/dist/assets/{circle-check-reAyVfkP.js → circle-check-DaJ6APMi.js} +2 -2
- package/dist/assets/{circle-check-reAyVfkP.js.map → circle-check-DaJ6APMi.js.map} +1 -1
- package/dist/assets/{clipboard-copy-BfB1mutp.js → clipboard-copy-IDfWU9SE.js} +2 -2
- package/dist/assets/{clipboard-copy-BfB1mutp.js.map → clipboard-copy-IDfWU9SE.js.map} +1 -1
- package/dist/assets/{copy-B9y2mtjd.js → copy-KSn4Rc2b.js} +2 -2
- package/dist/assets/{copy-B9y2mtjd.js.map → copy-KSn4Rc2b.js.map} +1 -1
- package/dist/assets/{crop-2_j5MtOq.js → crop-C9hwiw0i.js} +2 -2
- package/dist/assets/{crop-2_j5MtOq.js.map → crop-C9hwiw0i.js.map} +1 -1
- package/dist/assets/{download-CqEtEEpe.js → download-eqwxO8bs.js} +2 -2
- package/dist/assets/{download-CqEtEEpe.js.map → download-eqwxO8bs.js.map} +1 -1
- package/dist/assets/{eye-B1LPDhW7.js → eye-Dg61f0nU.js} +2 -2
- package/dist/assets/{eye-B1LPDhW7.js.map → eye-Dg61f0nU.js.map} +1 -1
- package/dist/assets/file-text-BQPKCil3.js +2 -0
- package/dist/assets/file-text-BQPKCil3.js.map +1 -0
- package/dist/assets/{folder-tree-CnF1eSpg.js → folder-tree-9hq6oigy.js} +2 -2
- package/dist/assets/{folder-tree-CnF1eSpg.js.map → folder-tree-9hq6oigy.js.map} +1 -1
- package/dist/assets/{grid-3x3-BB0TBwXQ.js → grid-3x3-BHXRyOIx.js} +2 -2
- package/dist/{app/assets/grid-3x3-BB0TBwXQ.js.map → assets/grid-3x3-BHXRyOIx.js.map} +1 -1
- package/dist/assets/index-my6BmN7T.js +204 -0
- package/dist/assets/index-my6BmN7T.js.map +1 -0
- package/dist/assets/index-rv91vbLH.css +1 -0
- package/dist/assets/{layout-grid-DbSzm5KY.js → layout-grid-DDQvnEgx.js} +2 -2
- package/dist/assets/{layout-grid-DbSzm5KY.js.map → layout-grid-DDQvnEgx.js.map} +1 -1
- package/dist/{app/assets/roboto-cyrillic-400-normal-DZJji7Rx.woff → assets/roboto-cyrillic-400-normal-Bjg-1-sg.woff} +0 -0
- package/dist/assets/roboto-cyrillic-400-normal-CBPI_iaY.woff2 +0 -0
- package/dist/{app/assets/roboto-cyrillic-500-normal-BI4HuXre.woff → assets/roboto-cyrillic-500-normal-CBKMylY4.woff} +0 -0
- package/dist/assets/roboto-cyrillic-500-normal-CLao9AfR.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-700-normal-C2o7G-SM.woff2 +0 -0
- package/dist/{app/assets/roboto-cyrillic-700-normal-KqaQ5bNp.woff → assets/roboto-cyrillic-700-normal-DhZFXDSN.woff} +0 -0
- package/dist/{app/assets/roboto-cyrillic-ext-400-normal-DtZHuW6i.woff → assets/roboto-cyrillic-ext-400-normal-CaK1767H.woff} +0 -0
- package/dist/assets/roboto-cyrillic-ext-400-normal-qHufge6k.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-ext-500-normal-BWC_xYeb.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-ext-500-normal-DqF2hftb.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-700-normal-CI7FH63F.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-700-normal-DmFxo5wj.woff2 +0 -0
- package/dist/{app/assets/roboto-greek-400-normal-CcizSnRP.woff → assets/roboto-greek-400-normal-Bb5mj_fZ.woff} +0 -0
- package/dist/assets/roboto-greek-400-normal-ai2Z1K3C.woff2 +0 -0
- package/dist/assets/roboto-greek-500-normal-C9AnhcmC.woff2 +0 -0
- package/dist/{app/assets/roboto-greek-500-normal-BLLWU9W-.woff → assets/roboto-greek-500-normal-oCqhoyfc.woff} +0 -0
- package/dist/assets/roboto-greek-700-normal-0aHWxGLu.woff2 +0 -0
- package/dist/assets/{roboto-greek-700-normal-D3kmAf0K.woff → roboto-greek-700-normal-DjRqqLBV.woff} +0 -0
- package/dist/assets/roboto-latin-400-normal-BqEyEoaF.woff2 +0 -0
- package/dist/assets/{roboto-latin-400-normal-068yxgMN.woff → roboto-latin-400-normal-DyYNIH4P.woff} +0 -0
- package/dist/assets/roboto-latin-500-normal-7RbcRiD8.woff2 +0 -0
- package/dist/assets/roboto-latin-500-normal-DQZyH_nt.woff +0 -0
- package/dist/assets/roboto-latin-700-normal-BZpUvMxY.woff2 +0 -0
- package/dist/assets/roboto-latin-700-normal-DLgJJpmK.woff +0 -0
- package/dist/assets/roboto-latin-ext-400-normal-C3tdtHj3.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-400-normal-scX0fKtV.woff +0 -0
- package/dist/assets/roboto-latin-ext-500-normal-Cyc0AKLz.woff +0 -0
- package/dist/assets/roboto-latin-ext-500-normal-pMCM9Ixg.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-700-normal-BUhwtWwy.woff +0 -0
- package/dist/assets/roboto-latin-ext-700-normal-DSBUz0N1.woff2 +0 -0
- package/dist/assets/roboto-math-400-normal-BEFej5gc.woff2 +0 -0
- package/dist/assets/{roboto-math-400-normal-rzxYvyVt.woff → roboto-math-400-normal-C9RxBKAh.woff} +0 -0
- package/dist/{app/assets/roboto-math-500-normal-DaFX-ZC8.woff → assets/roboto-math-500-normal-C-7mKPO3.woff} +0 -0
- package/dist/assets/roboto-math-500-normal-C4NU9gLX.woff2 +0 -0
- package/dist/assets/roboto-math-700-normal-B8YqGHVc.woff2 +0 -0
- package/dist/assets/roboto-math-700-normal-DVoD5t2k.woff +0 -0
- package/dist/assets/roboto-symbols-400-normal-CB1Ce4Gk.woff2 +0 -0
- package/dist/assets/roboto-symbols-400-normal-DLYbZahX.woff +0 -0
- package/dist/assets/roboto-symbols-500-normal-B_CZKVJS.woff2 +0 -0
- package/dist/assets/roboto-symbols-500-normal-F7c8nfcH.woff +0 -0
- package/dist/assets/roboto-symbols-700-normal-BiFDindJ.woff2 +0 -0
- package/dist/assets/roboto-symbols-700-normal-BoS6HWkc.woff +0 -0
- package/dist/assets/roboto-vietnamese-400-normal-D2PTxGxD.woff2 +0 -0
- package/dist/{app/assets/roboto-vietnamese-400-normal-DmXaN3yE.woff → assets/roboto-vietnamese-400-normal-DnpnVwnf.woff} +0 -0
- package/dist/assets/roboto-vietnamese-500-normal-B3ncpOoB.woff2 +0 -0
- package/dist/{app/assets/roboto-vietnamese-500-normal-DW96CsrR.woff → assets/roboto-vietnamese-500-normal-D380IkQ8.woff} +0 -0
- package/dist/assets/roboto-vietnamese-700-normal-BEVeWqJt.woff2 +0 -0
- package/dist/{app/assets/roboto-vietnamese-700-normal-Dz0HwF-w.woff → assets/roboto-vietnamese-700-normal-DsFyXAL4.woff} +0 -0
- package/dist/assets/rocket-0KMviRpJ.js +2 -0
- package/dist/assets/rocket-0KMviRpJ.js.map +1 -0
- package/dist/assets/{shield-check-DXqKmrPT.js → shield-check-BvKEQ2hc.js} +2 -2
- package/dist/{app/assets/shield-check-DXqKmrPT.js.map → assets/shield-check-BvKEQ2hc.js.map} +1 -1
- package/dist/assets/{signIn-D-eCUhFT.js → signIn-Ckla1_0O.js} +2 -2
- package/dist/assets/{signIn-D-eCUhFT.js.map → signIn-Ckla1_0O.js.map} +1 -1
- package/dist/assets/{smartphone-Cjrk_YxV.js → smartphone-I0w1b2DV.js} +2 -2
- package/dist/assets/{smartphone-Cjrk_YxV.js.map → smartphone-I0w1b2DV.js.map} +1 -1
- package/dist/assets/{terminal-CT_KE008.js → terminal-CLpUSQqd.js} +2 -2
- package/dist/{app/assets/terminal-CT_KE008.js.map → assets/terminal-CLpUSQqd.js.map} +1 -1
- package/dist/assets/triangle-alert-w7TZ0yy2.js +2 -0
- package/dist/assets/triangle-alert-w7TZ0yy2.js.map +1 -0
- package/dist/{app/assets/useAuth-ctmUbyCR.js → assets/useAuth-N3hsUaDj.js} +3 -3
- package/dist/assets/{useAuth-ctmUbyCR.js.map → useAuth-N3hsUaDj.js.map} +1 -1
- package/dist/assets/users-DsQdkuR3.js +2 -0
- package/dist/assets/users-DsQdkuR3.js.map +1 -0
- package/dist/cancelled/index.html +2 -2
- package/dist/design-partner/index.html +37 -0
- package/dist/downloads/shipscreens-aso-variant-matrix-template.csv +4 -0
- package/dist/downloads/shipscreens-bitrise-template.yml +60 -0
- package/dist/downloads/shipscreens-claude-code-mcp.json +8 -0
- package/dist/downloads/shipscreens-cursor-mcp.json +8 -0
- package/dist/downloads/shipscreens-gemini-mcp-settings.json +8 -0
- package/dist/downloads/shipscreens-github-actions-template.yml +62 -0
- package/dist/downloads/shipscreens-japan-case-snapshots-2026-02.md +37 -0
- package/dist/downloads/shipscreens-localization-ci-checklist-2026-02.md +46 -0
- package/dist/downloads/shipscreens-localization-handoff-template.csv +3 -0
- package/dist/downloads/shipscreens-proof-packet-2026-02.md +59 -0
- package/dist/downloads/shipscreens-top20-category-headline-pack-2026-02.csv +41 -0
- package/dist/downloads/shipscreens-top20-category-headline-pack-2026-02.md +18 -0
- package/dist/downloads/shipscreens-vscode-mcp.json +9 -0
- package/dist/forgot-password/index.html +2 -2
- package/dist/index.html +2 -2
- package/dist/legal/index.html +2 -2
- package/dist/llms-full.txt +114 -6
- package/dist/llms.txt +64 -2
- package/dist/mcp-server.json +4 -4
- package/dist/pricing/index.html +2 -2
- package/dist/privacy/index.html +2 -2
- package/dist/proof/index.html +37 -0
- package/dist/security/index.html +37 -0
- package/dist/signin/index.html +2 -2
- package/dist/signup/index.html +2 -2
- package/dist/sitemap.xml +80 -0
- package/dist/success/index.html +2 -2
- package/dist/terms/index.html +2 -2
- package/dist/tools/5-panel-screenshot-framework/index.html +2 -2
- package/dist/tools/agent-cli/index.html +6 -6
- package/dist/tools/app-review-aso/index.html +2 -2
- package/dist/tools/app-store-localization-screenshot-automation/index.html +39 -0
- package/dist/tools/app-store-screenshot-automation/index.html +39 -0
- package/dist/tools/app-store-screenshot-requirements-checklist/index.html +39 -0
- package/dist/tools/claude-code-mcp-screenshot-automation/index.html +39 -0
- package/dist/tools/cursor-mcp-screenshot-automation/index.html +39 -0
- package/dist/tools/deterministic-screenshot-reruns/index.html +39 -0
- package/dist/tools/device-locale-screenshot-matrix/index.html +39 -0
- package/dist/tools/fastlane-screenshot-folder-structure/index.html +39 -0
- package/dist/tools/fastlane-screenshot-pipeline/index.html +39 -0
- package/dist/tools/fastlane-screenshots/index.html +5 -5
- package/dist/tools/first-export/index.html +5 -5
- package/dist/tools/gemini-cli-mcp-screenshot-automation/index.html +39 -0
- package/dist/tools/google-play-screenshot-automation/index.html +39 -0
- package/dist/tools/google-play-screenshot-requirements-checklist/index.html +39 -0
- package/dist/tools/index.html +5 -5
- package/dist/tools/ipad-screenshot-review-requirements/index.html +39 -0
- package/dist/tools/openai-responses-tool-screenshot-automation/index.html +39 -0
- package/dist/tools/screenshot-ci-pipeline/index.html +39 -0
- package/dist/tools/screenshot-naming-order-drift/index.html +39 -0
- package/dist/tools/screenshot-workload-calculator/index.html +2 -2
- package/dist/tools/store-assets-pipeline/index.html +2 -2
- package/dist/tools/vscode-copilot-mcp-screenshot-automation/index.html +39 -0
- package/package.json +6 -3
- package/dist/app/assets/AgentCli-DNTDYBbk.js +0 -17
- package/dist/app/assets/AgentCli-DNTDYBbk.js.map +0 -1
- package/dist/app/assets/App-BwQ1zI7a.css +0 -1
- package/dist/app/assets/App-DPi9LW-y.js.map +0 -1
- package/dist/app/assets/AppReviewAso-BUTGLatx.js +0 -4
- package/dist/app/assets/AppReviewAso-BUTGLatx.js.map +0 -1
- package/dist/app/assets/CopyButton-BZQEBHBq.js +0 -2
- package/dist/app/assets/CopyButton-BZQEBHBq.js.map +0 -1
- package/dist/app/assets/FastlaneScreenshots-Dn7jfpuz.js +0 -52
- package/dist/app/assets/FastlaneScreenshots-Dn7jfpuz.js.map +0 -1
- package/dist/app/assets/FirstExport-CzioMqbJ.js +0 -6
- package/dist/app/assets/FirstExport-CzioMqbJ.js.map +0 -1
- package/dist/app/assets/FivePanelFramework-Bt5-NjCV.js +0 -62
- package/dist/app/assets/FivePanelFramework-Bt5-NjCV.js.map +0 -1
- package/dist/app/assets/Landing-DB9pTPoT.js +0 -2
- package/dist/app/assets/Landing-DB9pTPoT.js.map +0 -1
- package/dist/app/assets/Pricing-CxCutpT0.js +0 -2
- package/dist/app/assets/Pricing-CxCutpT0.js.map +0 -1
- package/dist/app/assets/StickyMobileCta-C41cW-Ji.js +0 -2
- package/dist/app/assets/ToolsIndex-BuZSvoBC.js +0 -6
- package/dist/app/assets/ToolsIndex-BuZSvoBC.js.map +0 -1
- package/dist/app/assets/check-BaiZ7vYg.js +0 -2
- package/dist/app/assets/chevron-down-DVRa-y8D.js +0 -2
- package/dist/app/assets/index-Bffw9flM.js +0 -180
- package/dist/app/assets/index-Bffw9flM.js.map +0 -1
- package/dist/app/assets/index-CQecHUcy.css +0 -1
- package/dist/app/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
- package/dist/app/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
- package/dist/app/assets/roboto-cyrillic-700-normal-BiSG5NnW.woff2 +0 -0
- package/dist/app/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
- package/dist/app/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
- package/dist/app/assets/roboto-cyrillic-ext-500-normal-C927yMrb.woff +0 -0
- package/dist/app/assets/roboto-cyrillic-ext-700-normal-BuQgZIrO.woff +0 -0
- package/dist/app/assets/roboto-cyrillic-ext-700-normal-UFn0vR9r.woff2 +0 -0
- package/dist/app/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
- package/dist/app/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
- package/dist/app/assets/roboto-greek-700-normal-BcGn9doz.woff2 +0 -0
- package/dist/app/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
- package/dist/app/assets/roboto-latin-500-normal-CC5nhZkh.woff +0 -0
- package/dist/app/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
- package/dist/app/assets/roboto-latin-700-normal-CXeAXeti.woff2 +0 -0
- package/dist/app/assets/roboto-latin-700-normal-DUekQERp.woff +0 -0
- package/dist/app/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
- package/dist/app/assets/roboto-latin-ext-400-normal-eTRLN0Nt.woff +0 -0
- package/dist/app/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
- package/dist/app/assets/roboto-latin-ext-500-normal-FFcS8vBN.woff +0 -0
- package/dist/app/assets/roboto-latin-ext-700-normal-70GS1MYH.woff2 +0 -0
- package/dist/app/assets/roboto-latin-ext-700-normal-BS1OuQqR.woff +0 -0
- package/dist/app/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
- package/dist/app/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
- package/dist/app/assets/roboto-math-700-normal-VUAI6Bz2.woff2 +0 -0
- package/dist/app/assets/roboto-math-700-normal-pYD1nhov.woff +0 -0
- package/dist/app/assets/roboto-symbols-400-normal-Tzuungub.woff +0 -0
- package/dist/app/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
- package/dist/app/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
- package/dist/app/assets/roboto-symbols-500-normal-CAhAe-ik.woff +0 -0
- package/dist/app/assets/roboto-symbols-700-normal-CuuvBBxy.woff +0 -0
- package/dist/app/assets/roboto-symbols-700-normal-rJi6RjIy.woff2 +0 -0
- package/dist/app/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
- package/dist/app/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
- package/dist/app/assets/roboto-vietnamese-700-normal-iKxYNAzq.woff2 +0 -0
- package/dist/app/assets/rocket-d1Ntm8ge.js +0 -2
- package/dist/app/assets/rocket-d1Ntm8ge.js.map +0 -1
- package/dist/assets/AgentCli-DNTDYBbk.js +0 -17
- package/dist/assets/AgentCli-DNTDYBbk.js.map +0 -1
- package/dist/assets/App-BwQ1zI7a.css +0 -1
- package/dist/assets/App-DPi9LW-y.js.map +0 -1
- package/dist/assets/AppReviewAso-BUTGLatx.js +0 -4
- package/dist/assets/AppReviewAso-BUTGLatx.js.map +0 -1
- package/dist/assets/CopyButton-BZQEBHBq.js +0 -2
- package/dist/assets/CopyButton-BZQEBHBq.js.map +0 -1
- package/dist/assets/FastlaneScreenshots-Dn7jfpuz.js +0 -52
- package/dist/assets/FastlaneScreenshots-Dn7jfpuz.js.map +0 -1
- package/dist/assets/FirstExport-CzioMqbJ.js +0 -6
- package/dist/assets/FirstExport-CzioMqbJ.js.map +0 -1
- package/dist/assets/FivePanelFramework-Bt5-NjCV.js +0 -62
- package/dist/assets/FivePanelFramework-Bt5-NjCV.js.map +0 -1
- package/dist/assets/Landing-DB9pTPoT.js +0 -2
- package/dist/assets/Landing-DB9pTPoT.js.map +0 -1
- package/dist/assets/Pricing-CxCutpT0.js +0 -2
- package/dist/assets/Pricing-CxCutpT0.js.map +0 -1
- package/dist/assets/StickyMobileCta-C41cW-Ji.js +0 -2
- package/dist/assets/ToolsIndex-BuZSvoBC.js +0 -6
- package/dist/assets/ToolsIndex-BuZSvoBC.js.map +0 -1
- package/dist/assets/check-BaiZ7vYg.js +0 -2
- package/dist/assets/chevron-down-DVRa-y8D.js +0 -2
- package/dist/assets/index-Bffw9flM.js +0 -180
- package/dist/assets/index-Bffw9flM.js.map +0 -1
- package/dist/assets/index-CQecHUcy.css +0 -1
- package/dist/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-700-normal-BiSG5NnW.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
- package/dist/assets/roboto-cyrillic-ext-500-normal-C927yMrb.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-700-normal-BuQgZIrO.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-700-normal-UFn0vR9r.woff2 +0 -0
- package/dist/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
- package/dist/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
- package/dist/assets/roboto-greek-700-normal-BcGn9doz.woff2 +0 -0
- package/dist/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
- package/dist/assets/roboto-latin-500-normal-CC5nhZkh.woff +0 -0
- package/dist/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
- package/dist/assets/roboto-latin-700-normal-CXeAXeti.woff2 +0 -0
- package/dist/assets/roboto-latin-700-normal-DUekQERp.woff +0 -0
- package/dist/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-400-normal-eTRLN0Nt.woff +0 -0
- package/dist/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-500-normal-FFcS8vBN.woff +0 -0
- package/dist/assets/roboto-latin-ext-700-normal-70GS1MYH.woff2 +0 -0
- package/dist/assets/roboto-latin-ext-700-normal-BS1OuQqR.woff +0 -0
- package/dist/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
- package/dist/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
- package/dist/assets/roboto-math-700-normal-VUAI6Bz2.woff2 +0 -0
- package/dist/assets/roboto-math-700-normal-pYD1nhov.woff +0 -0
- package/dist/assets/roboto-symbols-400-normal-Tzuungub.woff +0 -0
- package/dist/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
- package/dist/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
- package/dist/assets/roboto-symbols-500-normal-CAhAe-ik.woff +0 -0
- package/dist/assets/roboto-symbols-700-normal-CuuvBBxy.woff +0 -0
- package/dist/assets/roboto-symbols-700-normal-rJi6RjIy.woff2 +0 -0
- package/dist/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
- package/dist/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
- package/dist/assets/roboto-vietnamese-700-normal-iKxYNAzq.woff2 +0 -0
- package/dist/assets/rocket-d1Ntm8ge.js +0 -2
- package/dist/assets/rocket-d1Ntm8ge.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ShipScreens CLI
|
|
2
2
|
|
|
3
|
-
|
|
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.
|
package/bin/shipscreens.js
CHANGED
|
@@ -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
|
|
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
|
|
349
|
-
|
|
388
|
+
if (subcommand === 'serve') {
|
|
389
|
+
await runMcpServer();
|
|
390
|
+
return;
|
|
350
391
|
}
|
|
351
|
-
|
|
352
|
-
|
|
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
|
-
{
|
|
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
|
-
|
|
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
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
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
|
}
|
package/cli/commands/build.js
CHANGED
|
@@ -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
|
|
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,
|