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.
- package/README.md +50 -4
- package/bin/shipscreens.js +484 -29
- package/cli/auth.js +31 -11
- package/cli/commands/build.js +9 -1
- package/cli/commands/captureScreenshots.js +409 -0
- package/cli/commands/copyCheck.js +265 -0
- package/cli/commands/importScreenshots.js +377 -0
- package/cli/commands/inspectReleaseContext.js +607 -0
- package/cli/commands/plan.js +7 -3
- package/cli/commands/planRelease.js +324 -0
- package/cli/commands/stage.js +13 -3
- package/cli/commands/verify.js +7 -2
- package/cli/commands/writeStarterConfig.js +233 -0
- package/cli/mcpBootstrap.js +174 -0
- package/cli/mcpServer.js +172 -3
- package/cli/schema.js +19 -0
- package/cli/variantScope.js +58 -0
- package/dist/.well-known/ai-agents.json +268 -8
- package/dist/.well-known/llms-full.txt +191 -20
- package/dist/.well-known/llms.txt +99 -11
- package/dist/.well-known/mcp-server.json +4 -4
- package/dist/ai-agents.json +268 -8
- package/dist/app/assets/AgentCli-nIqgOG-i.js +17 -0
- package/dist/app/assets/AgentCli-nIqgOG-i.js.map +1 -0
- package/dist/app/assets/AgentHandoffPanel-Bf_AJepG.js +2 -0
- package/dist/app/assets/AgentHandoffPanel-Bf_AJepG.js.map +1 -0
- package/dist/app/assets/AgentStarterWorkflowFigure-DW4SMMy7.js +2 -0
- package/dist/app/assets/AgentStarterWorkflowFigure-DW4SMMy7.js.map +1 -0
- package/dist/app/assets/App-BRKxkubQ.css +1 -0
- package/dist/app/assets/App-CZiyX8-L.js +14 -0
- package/dist/app/assets/App-CZiyX8-L.js.map +1 -0
- package/dist/app/assets/AppReviewAso-DYOCuqgV.js +4 -0
- package/dist/app/assets/AppReviewAso-DYOCuqgV.js.map +1 -0
- package/dist/app/assets/Cancelled-CP6V6uDb.js +2 -0
- package/dist/app/assets/Cancelled-CP6V6uDb.js.map +1 -0
- package/dist/app/assets/CopyButton-BFCx6EPg.js +2 -0
- package/dist/app/assets/CopyButton-BFCx6EPg.js.map +1 -0
- package/dist/app/assets/DesignPartner-B4J7f0Bx.js +4 -0
- package/dist/app/assets/DesignPartner-B4J7f0Bx.js.map +1 -0
- package/dist/app/assets/FastlaneScreenshots-cdZE6cGY.js +90 -0
- package/dist/app/assets/FastlaneScreenshots-cdZE6cGY.js.map +1 -0
- package/dist/app/assets/FirstExport-qfY7uE8r.js +6 -0
- package/dist/app/assets/FirstExport-qfY7uE8r.js.map +1 -0
- package/dist/app/assets/FitPanel-B1J0V1jK.js +2 -0
- package/dist/app/assets/FitPanel-B1J0V1jK.js.map +1 -0
- package/dist/app/assets/FivePanelFramework-C4yq58kM.js +62 -0
- package/dist/app/assets/FivePanelFramework-C4yq58kM.js.map +1 -0
- package/dist/app/assets/ForgotPassword-KF_HFGyb.js +2 -0
- package/dist/app/assets/ForgotPassword-KF_HFGyb.js.map +1 -0
- package/dist/app/assets/Landing-B_CvZDXJ.js +2 -0
- package/dist/app/assets/Landing-B_CvZDXJ.js.map +1 -0
- package/dist/app/assets/LanguageSwitcher-hFv9zl1u.js +2 -0
- package/dist/app/assets/LanguageSwitcher-hFv9zl1u.js.map +1 -0
- package/dist/app/assets/Legal-BwGbEjDk.js +2 -0
- package/dist/app/assets/Legal-BwGbEjDk.js.map +1 -0
- package/dist/app/assets/NotFound-Ba1Bw7uu.js +2 -0
- package/dist/app/assets/NotFound-Ba1Bw7uu.js.map +1 -0
- package/dist/app/assets/Pricing-Dt-V4Gqc.js +20 -0
- package/dist/app/assets/Pricing-Dt-V4Gqc.js.map +1 -0
- package/dist/app/assets/Privacy-C6MrXYPO.js +2 -0
- package/dist/app/assets/Privacy-C6MrXYPO.js.map +1 -0
- package/dist/app/assets/Proof-C3DDFAhm.js +20 -0
- package/dist/app/assets/Proof-C3DDFAhm.js.map +1 -0
- package/dist/app/assets/ReleaseFitIntake-DBeb9AFJ.js +27 -0
- package/dist/app/assets/ReleaseFitIntake-DBeb9AFJ.js.map +1 -0
- package/dist/app/assets/SalesEntryQuickRequestCard-Bfa93AYu.js +2 -0
- package/dist/app/assets/SalesEntryQuickRequestCard-Bfa93AYu.js.map +1 -0
- package/dist/app/assets/Security-C1OmAgom.js +2 -0
- package/dist/app/assets/Security-C1OmAgom.js.map +1 -0
- package/dist/app/assets/SignIn-C_wwnmvu.js +2 -0
- package/dist/app/assets/SignIn-C_wwnmvu.js.map +1 -0
- package/dist/app/assets/SignUp-Dm5HalC6.js +2 -0
- package/dist/app/assets/SignUp-Dm5HalC6.js.map +1 -0
- package/dist/app/assets/SiteHeader-CJqQ0pL3.js +2 -0
- package/dist/app/assets/SiteHeader-CJqQ0pL3.js.map +1 -0
- package/dist/app/assets/StickyMobileCta-REC3DROG.js +2 -0
- package/dist/app/assets/StickyMobileCta-REC3DROG.js.map +1 -0
- package/dist/app/assets/StoreAssetsPipeline-DNnnBp0D.js +6 -0
- package/dist/app/assets/StoreAssetsPipeline-DNnnBp0D.js.map +1 -0
- package/dist/app/assets/Success-D6b4wLPD.js +2 -0
- package/dist/app/assets/Success-D6b4wLPD.js.map +1 -0
- package/dist/app/assets/Terms-BMt39FQK.js +2 -0
- package/dist/app/assets/Terms-BMt39FQK.js.map +1 -0
- package/dist/app/assets/ToolGuardrailsPanel-Cclxwdrb.js +2 -0
- package/dist/app/assets/ToolGuardrailsPanel-Cclxwdrb.js.map +1 -0
- package/dist/app/assets/ToolsIndex-d1szo5bn.js +6 -0
- package/dist/app/assets/ToolsIndex-d1szo5bn.js.map +1 -0
- package/dist/app/assets/TrustSalesEntryPanel-DuncpgMs.js +2 -0
- package/dist/app/assets/TrustSalesEntryPanel-DuncpgMs.js.map +1 -0
- package/dist/app/assets/WorkloadCalculator-BbFWF2Ls.js +5 -0
- package/dist/app/assets/WorkloadCalculator-BbFWF2Ls.js.map +1 -0
- package/dist/app/assets/agentHandoff-BGmHqDwv.js +2 -0
- package/dist/app/assets/agentHandoff-BGmHqDwv.js.map +1 -0
- package/dist/app/assets/apiClient-3WVm94VW.js +2 -0
- package/dist/app/assets/apiClient-3WVm94VW.js.map +1 -0
- package/dist/app/assets/calculator-CofuwQa8.js +2 -0
- package/dist/app/assets/calculator-CofuwQa8.js.map +1 -0
- package/dist/app/assets/check-Fm2iQO64.js +2 -0
- package/dist/app/assets/check-Fm2iQO64.js.map +1 -0
- package/dist/app/assets/chevron-down-BIXHKpnf.js +2 -0
- package/dist/app/assets/chevron-down-BIXHKpnf.js.map +1 -0
- package/dist/app/assets/chunk-BHe-jwch.js +1 -0
- package/dist/app/assets/circle-check-X08qqy40.js +2 -0
- package/dist/app/assets/circle-check-X08qqy40.js.map +1 -0
- package/dist/app/assets/copy-KD-LYJ0z.js +2 -0
- package/dist/app/assets/copy-KD-LYJ0z.js.map +1 -0
- package/dist/app/assets/crop-K1LOmRty.js +2 -0
- package/dist/app/assets/crop-K1LOmRty.js.map +1 -0
- package/dist/app/assets/designPartnerRequest-DYqMElJd.js +2 -0
- package/dist/app/assets/designPartnerRequest-DYqMElJd.js.map +1 -0
- package/dist/app/assets/designPartnerSalesEntry-BpRINg3I.js +2 -0
- package/dist/app/assets/designPartnerSalesEntry-BpRINg3I.js.map +1 -0
- package/dist/app/assets/download-BXzoc-Y3.js +2 -0
- package/dist/app/assets/download-BXzoc-Y3.js.map +1 -0
- package/dist/app/assets/eye-CHvLhG2r.js +2 -0
- package/dist/app/assets/eye-CHvLhG2r.js.map +1 -0
- package/dist/app/assets/file-text-CU-ETLz1.js +2 -0
- package/dist/app/assets/file-text-CU-ETLz1.js.map +1 -0
- package/dist/app/assets/folder-tree-raVH0Y5V.js +2 -0
- package/dist/app/assets/folder-tree-raVH0Y5V.js.map +1 -0
- package/dist/app/assets/grid-3x3-cWuhGQfz.js +2 -0
- package/dist/app/assets/grid-3x3-cWuhGQfz.js.map +1 -0
- package/dist/app/assets/hardeningOffer-tkjlPDU-.js +2 -0
- package/dist/app/assets/hardeningOffer-tkjlPDU-.js.map +1 -0
- package/dist/app/assets/hero/agent-starter-workflow.png +0 -0
- package/dist/app/assets/hero/agent-starter-workflow.webp +0 -0
- package/dist/app/assets/html2canvas-pro.esm-OQkwCdu_.js +6 -0
- package/dist/app/assets/html2canvas-pro.esm-OQkwCdu_.js.map +1 -0
- package/dist/app/assets/index-BW_YmKvl.css +2 -0
- package/dist/app/assets/index-D7D6ZRCW.js +212 -0
- package/dist/app/assets/index-D7D6ZRCW.js.map +1 -0
- package/dist/app/assets/jszip.min-XyfP2hUJ.js +3 -0
- package/dist/app/assets/jszip.min-XyfP2hUJ.js.map +1 -0
- package/dist/app/assets/layout-grid-Cq_e979G.js +2 -0
- package/dist/app/assets/layout-grid-Cq_e979G.js.map +1 -0
- package/dist/app/assets/lock-Di7P18Ts.js +2 -0
- package/dist/app/assets/lock-Di7P18Ts.js.map +1 -0
- 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-DHdrCHKD.js +2 -0
- package/dist/app/assets/rocket-DHdrCHKD.js.map +1 -0
- package/dist/app/assets/shield-check-CxpHNdp0.js +2 -0
- package/dist/app/assets/shield-check-CxpHNdp0.js.map +1 -0
- package/dist/app/assets/smartphone-DXKiqu57.js +2 -0
- package/dist/app/assets/smartphone-DXKiqu57.js.map +1 -0
- package/dist/app/assets/stripeClient-CuZgvzca.js +2 -0
- package/dist/app/assets/stripeClient-CuZgvzca.js.map +1 -0
- package/dist/app/assets/terminal-J0iyJTv2.js +2 -0
- package/dist/app/assets/terminal-J0iyJTv2.js.map +1 -0
- package/dist/app/assets/triangle-alert-BA0HP6zD.js +2 -0
- package/dist/app/assets/triangle-alert-BA0HP6zD.js.map +1 -0
- package/dist/app/assets/useAuth-CoS4r8yi.js +22 -0
- package/dist/app/assets/useAuth-CoS4r8yi.js.map +1 -0
- package/dist/app/assets/users-C-fz7pbn.js +2 -0
- package/dist/app/assets/users-C-fz7pbn.js.map +1 -0
- package/dist/app/index.html +9 -8
- package/dist/assets/AgentCli-nIqgOG-i.js +17 -0
- package/dist/assets/AgentCli-nIqgOG-i.js.map +1 -0
- package/dist/assets/AgentHandoffPanel-Bf_AJepG.js +2 -0
- package/dist/assets/AgentHandoffPanel-Bf_AJepG.js.map +1 -0
- package/dist/assets/AgentStarterWorkflowFigure-DW4SMMy7.js +2 -0
- package/dist/assets/AgentStarterWorkflowFigure-DW4SMMy7.js.map +1 -0
- package/dist/assets/App-BRKxkubQ.css +1 -0
- package/dist/assets/App-CZiyX8-L.js +14 -0
- package/dist/assets/App-CZiyX8-L.js.map +1 -0
- package/dist/assets/AppReviewAso-DYOCuqgV.js +4 -0
- package/dist/assets/AppReviewAso-DYOCuqgV.js.map +1 -0
- package/dist/assets/Cancelled-CP6V6uDb.js +2 -0
- package/dist/assets/Cancelled-CP6V6uDb.js.map +1 -0
- package/dist/assets/CopyButton-BFCx6EPg.js +2 -0
- package/dist/assets/CopyButton-BFCx6EPg.js.map +1 -0
- package/dist/assets/DesignPartner-B4J7f0Bx.js +4 -0
- package/dist/assets/DesignPartner-B4J7f0Bx.js.map +1 -0
- package/dist/assets/FastlaneScreenshots-cdZE6cGY.js +90 -0
- package/dist/assets/FastlaneScreenshots-cdZE6cGY.js.map +1 -0
- package/dist/assets/FirstExport-qfY7uE8r.js +6 -0
- package/dist/assets/FirstExport-qfY7uE8r.js.map +1 -0
- package/dist/assets/FitPanel-B1J0V1jK.js +2 -0
- package/dist/assets/FitPanel-B1J0V1jK.js.map +1 -0
- package/dist/assets/FivePanelFramework-C4yq58kM.js +62 -0
- package/dist/assets/FivePanelFramework-C4yq58kM.js.map +1 -0
- package/dist/assets/ForgotPassword-KF_HFGyb.js +2 -0
- package/dist/assets/ForgotPassword-KF_HFGyb.js.map +1 -0
- package/dist/assets/Landing-B_CvZDXJ.js +2 -0
- package/dist/assets/Landing-B_CvZDXJ.js.map +1 -0
- package/dist/assets/LanguageSwitcher-hFv9zl1u.js +2 -0
- package/dist/assets/LanguageSwitcher-hFv9zl1u.js.map +1 -0
- package/dist/assets/Legal-BwGbEjDk.js +2 -0
- package/dist/assets/Legal-BwGbEjDk.js.map +1 -0
- package/dist/assets/NotFound-Ba1Bw7uu.js +2 -0
- package/dist/assets/NotFound-Ba1Bw7uu.js.map +1 -0
- package/dist/assets/Pricing-Dt-V4Gqc.js +20 -0
- package/dist/assets/Pricing-Dt-V4Gqc.js.map +1 -0
- package/dist/assets/Privacy-C6MrXYPO.js +2 -0
- package/dist/assets/Privacy-C6MrXYPO.js.map +1 -0
- package/dist/assets/Proof-C3DDFAhm.js +20 -0
- package/dist/assets/Proof-C3DDFAhm.js.map +1 -0
- package/dist/assets/ReleaseFitIntake-DBeb9AFJ.js +27 -0
- package/dist/assets/ReleaseFitIntake-DBeb9AFJ.js.map +1 -0
- package/dist/assets/SalesEntryQuickRequestCard-Bfa93AYu.js +2 -0
- package/dist/assets/SalesEntryQuickRequestCard-Bfa93AYu.js.map +1 -0
- package/dist/assets/Security-C1OmAgom.js +2 -0
- package/dist/assets/Security-C1OmAgom.js.map +1 -0
- package/dist/assets/SignIn-C_wwnmvu.js +2 -0
- package/dist/assets/SignIn-C_wwnmvu.js.map +1 -0
- package/dist/assets/SignUp-Dm5HalC6.js +2 -0
- package/dist/assets/SignUp-Dm5HalC6.js.map +1 -0
- package/dist/assets/SiteHeader-CJqQ0pL3.js +2 -0
- package/dist/assets/SiteHeader-CJqQ0pL3.js.map +1 -0
- package/dist/assets/StickyMobileCta-REC3DROG.js +2 -0
- package/dist/assets/StickyMobileCta-REC3DROG.js.map +1 -0
- package/dist/assets/StoreAssetsPipeline-DNnnBp0D.js +6 -0
- package/dist/assets/StoreAssetsPipeline-DNnnBp0D.js.map +1 -0
- package/dist/assets/Success-D6b4wLPD.js +2 -0
- package/dist/assets/Success-D6b4wLPD.js.map +1 -0
- package/dist/assets/Terms-BMt39FQK.js +2 -0
- package/dist/assets/Terms-BMt39FQK.js.map +1 -0
- package/dist/assets/ToolGuardrailsPanel-Cclxwdrb.js +2 -0
- package/dist/assets/ToolGuardrailsPanel-Cclxwdrb.js.map +1 -0
- package/dist/assets/ToolsIndex-d1szo5bn.js +6 -0
- package/dist/assets/ToolsIndex-d1szo5bn.js.map +1 -0
- package/dist/assets/TrustSalesEntryPanel-DuncpgMs.js +2 -0
- package/dist/assets/TrustSalesEntryPanel-DuncpgMs.js.map +1 -0
- package/dist/assets/WorkloadCalculator-BbFWF2Ls.js +5 -0
- package/dist/assets/WorkloadCalculator-BbFWF2Ls.js.map +1 -0
- package/dist/assets/agentHandoff-BGmHqDwv.js +2 -0
- package/dist/assets/agentHandoff-BGmHqDwv.js.map +1 -0
- package/dist/assets/apiClient-3WVm94VW.js +2 -0
- package/dist/assets/apiClient-3WVm94VW.js.map +1 -0
- package/dist/assets/calculator-CofuwQa8.js +2 -0
- package/dist/assets/calculator-CofuwQa8.js.map +1 -0
- package/dist/assets/check-Fm2iQO64.js +2 -0
- package/dist/assets/check-Fm2iQO64.js.map +1 -0
- package/dist/assets/chevron-down-BIXHKpnf.js +2 -0
- package/dist/assets/chevron-down-BIXHKpnf.js.map +1 -0
- package/dist/assets/chunk-BHe-jwch.js +1 -0
- package/dist/assets/circle-check-X08qqy40.js +2 -0
- package/dist/assets/circle-check-X08qqy40.js.map +1 -0
- package/dist/assets/copy-KD-LYJ0z.js +2 -0
- package/dist/assets/copy-KD-LYJ0z.js.map +1 -0
- package/dist/assets/crop-K1LOmRty.js +2 -0
- package/dist/assets/crop-K1LOmRty.js.map +1 -0
- package/dist/assets/designPartnerRequest-DYqMElJd.js +2 -0
- package/dist/assets/designPartnerRequest-DYqMElJd.js.map +1 -0
- package/dist/assets/designPartnerSalesEntry-BpRINg3I.js +2 -0
- package/dist/assets/designPartnerSalesEntry-BpRINg3I.js.map +1 -0
- package/dist/assets/download-BXzoc-Y3.js +2 -0
- package/dist/assets/download-BXzoc-Y3.js.map +1 -0
- package/dist/assets/eye-CHvLhG2r.js +2 -0
- package/dist/assets/eye-CHvLhG2r.js.map +1 -0
- package/dist/assets/file-text-CU-ETLz1.js +2 -0
- package/dist/assets/file-text-CU-ETLz1.js.map +1 -0
- package/dist/assets/folder-tree-raVH0Y5V.js +2 -0
- package/dist/assets/folder-tree-raVH0Y5V.js.map +1 -0
- package/dist/assets/grid-3x3-cWuhGQfz.js +2 -0
- package/dist/assets/grid-3x3-cWuhGQfz.js.map +1 -0
- package/dist/assets/hardeningOffer-tkjlPDU-.js +2 -0
- package/dist/assets/hardeningOffer-tkjlPDU-.js.map +1 -0
- package/dist/assets/hero/agent-starter-workflow.png +0 -0
- package/dist/assets/hero/agent-starter-workflow.webp +0 -0
- package/dist/assets/html2canvas-pro.esm-OQkwCdu_.js +6 -0
- package/dist/assets/html2canvas-pro.esm-OQkwCdu_.js.map +1 -0
- package/dist/assets/index-BW_YmKvl.css +2 -0
- package/dist/assets/index-D7D6ZRCW.js +212 -0
- package/dist/assets/index-D7D6ZRCW.js.map +1 -0
- package/dist/assets/jszip.min-XyfP2hUJ.js +3 -0
- package/dist/assets/jszip.min-XyfP2hUJ.js.map +1 -0
- package/dist/assets/layout-grid-Cq_e979G.js +2 -0
- package/dist/assets/layout-grid-Cq_e979G.js.map +1 -0
- package/dist/assets/lock-Di7P18Ts.js +2 -0
- package/dist/assets/lock-Di7P18Ts.js.map +1 -0
- 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-DHdrCHKD.js +2 -0
- package/dist/assets/rocket-DHdrCHKD.js.map +1 -0
- package/dist/assets/shield-check-CxpHNdp0.js +2 -0
- package/dist/assets/shield-check-CxpHNdp0.js.map +1 -0
- package/dist/assets/smartphone-DXKiqu57.js +2 -0
- package/dist/assets/smartphone-DXKiqu57.js.map +1 -0
- package/dist/assets/stripeClient-CuZgvzca.js +2 -0
- package/dist/assets/stripeClient-CuZgvzca.js.map +1 -0
- package/dist/assets/terminal-J0iyJTv2.js +2 -0
- package/dist/assets/terminal-J0iyJTv2.js.map +1 -0
- package/dist/assets/triangle-alert-BA0HP6zD.js +2 -0
- package/dist/assets/triangle-alert-BA0HP6zD.js.map +1 -0
- package/dist/assets/useAuth-CoS4r8yi.js +22 -0
- package/dist/assets/useAuth-CoS4r8yi.js.map +1 -0
- package/dist/assets/users-C-fz7pbn.js +2 -0
- package/dist/assets/users-C-fz7pbn.js.map +1 -0
- package/dist/cancelled/index.html +3 -2
- package/dist/design-partner/index.html +38 -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 +3 -2
- package/dist/index.html +9 -8
- package/dist/legal/index.html +3 -2
- package/dist/llms-full.txt +191 -20
- package/dist/llms.txt +99 -11
- package/dist/mcp-server.json +4 -4
- package/dist/pricing/index.html +6 -5
- package/dist/privacy/index.html +3 -2
- package/dist/proof/index.html +38 -0
- package/dist/security/index.html +38 -0
- package/dist/signin/index.html +3 -2
- package/dist/signup/index.html +3 -2
- package/dist/sitemap.xml +80 -0
- package/dist/success/index.html +3 -2
- package/dist/terms/index.html +3 -2
- package/dist/tools/5-panel-screenshot-framework/index.html +6 -5
- package/dist/tools/agent-cli/index.html +8 -7
- package/dist/tools/app-review-aso/index.html +6 -5
- package/dist/tools/app-store-localization-screenshot-automation/index.html +40 -0
- package/dist/tools/app-store-screenshot-automation/index.html +40 -0
- package/dist/tools/app-store-screenshot-requirements-checklist/index.html +40 -0
- package/dist/tools/claude-code-mcp-screenshot-automation/index.html +40 -0
- package/dist/tools/cursor-mcp-screenshot-automation/index.html +40 -0
- package/dist/tools/deterministic-screenshot-reruns/index.html +40 -0
- package/dist/tools/device-locale-screenshot-matrix/index.html +40 -0
- package/dist/tools/fastlane-screenshot-folder-structure/index.html +40 -0
- package/dist/tools/fastlane-screenshot-pipeline/index.html +40 -0
- package/dist/tools/fastlane-screenshots/index.html +6 -5
- package/dist/tools/first-export/index.html +6 -5
- package/dist/tools/gemini-cli-mcp-screenshot-automation/index.html +40 -0
- package/dist/tools/google-play-screenshot-automation/index.html +40 -0
- package/dist/tools/google-play-screenshot-requirements-checklist/index.html +40 -0
- package/dist/tools/index.html +6 -5
- package/dist/tools/ipad-screenshot-review-requirements/index.html +40 -0
- package/dist/tools/openai-responses-tool-screenshot-automation/index.html +40 -0
- package/dist/tools/screenshot-ci-pipeline/index.html +40 -0
- package/dist/tools/screenshot-naming-order-drift/index.html +40 -0
- package/dist/tools/screenshot-workload-calculator/index.html +6 -5
- package/dist/tools/store-assets-pipeline/index.html +3 -2
- package/dist/tools/vscode-copilot-mcp-screenshot-automation/index.html +40 -0
- package/package.json +10 -7
- 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 +0 -13
- 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/Cancelled-BeS-WlPj.js +0 -2
- package/dist/app/assets/Cancelled-BeS-WlPj.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/FitPanel-DzYzTMEi.js +0 -2
- package/dist/app/assets/FitPanel-DzYzTMEi.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/ForgotPassword-DuHNHuUe.js +0 -2
- package/dist/app/assets/ForgotPassword-DuHNHuUe.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/LanguageSwitcher-CfUhVVuT.js +0 -2
- package/dist/app/assets/LanguageSwitcher-CfUhVVuT.js.map +0 -1
- package/dist/app/assets/Legal-p-YIX5Jv.js +0 -2
- package/dist/app/assets/Legal-p-YIX5Jv.js.map +0 -1
- package/dist/app/assets/NotFound-XohZYy7w.js +0 -2
- package/dist/app/assets/NotFound-XohZYy7w.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/Privacy-D8m3h6P-.js +0 -2
- package/dist/app/assets/Privacy-D8m3h6P-.js.map +0 -1
- package/dist/app/assets/SignIn-CINUig91.js +0 -2
- package/dist/app/assets/SignIn-CINUig91.js.map +0 -1
- package/dist/app/assets/SignUp-B1H6dQgE.js +0 -2
- package/dist/app/assets/SignUp-B1H6dQgE.js.map +0 -1
- package/dist/app/assets/SiteHeader-BGQW06JF.js +0 -2
- package/dist/app/assets/SiteHeader-BGQW06JF.js.map +0 -1
- package/dist/app/assets/StickyMobileCta-C41cW-Ji.js +0 -2
- package/dist/app/assets/StickyMobileCta-C41cW-Ji.js.map +0 -1
- package/dist/app/assets/StoreAssetsPipeline-bUVDqZAU.js +0 -6
- package/dist/app/assets/StoreAssetsPipeline-bUVDqZAU.js.map +0 -1
- package/dist/app/assets/Success-CMpdlLi2.js +0 -2
- package/dist/app/assets/Success-CMpdlLi2.js.map +0 -1
- package/dist/app/assets/Terms-C8NcE4sw.js +0 -2
- package/dist/app/assets/Terms-C8NcE4sw.js.map +0 -1
- package/dist/app/assets/ToolGuardrailsPanel-DbjLhdX8.js +0 -2
- package/dist/app/assets/ToolGuardrailsPanel-DbjLhdX8.js.map +0 -1
- package/dist/app/assets/ToolsIndex-BuZSvoBC.js +0 -6
- package/dist/app/assets/ToolsIndex-BuZSvoBC.js.map +0 -1
- package/dist/app/assets/WorkloadCalculator-CjdG5TVq.js +0 -5
- package/dist/app/assets/WorkloadCalculator-CjdG5TVq.js.map +0 -1
- package/dist/app/assets/calculator-_D64kDDH.js +0 -2
- package/dist/app/assets/calculator-_D64kDDH.js.map +0 -1
- package/dist/app/assets/check-BaiZ7vYg.js +0 -2
- package/dist/app/assets/check-BaiZ7vYg.js.map +0 -1
- package/dist/app/assets/chevron-down-DVRa-y8D.js +0 -2
- package/dist/app/assets/chevron-down-DVRa-y8D.js.map +0 -1
- package/dist/app/assets/circle-check-reAyVfkP.js +0 -2
- package/dist/app/assets/circle-check-reAyVfkP.js.map +0 -1
- package/dist/app/assets/clipboard-copy-BfB1mutp.js +0 -2
- package/dist/app/assets/clipboard-copy-BfB1mutp.js.map +0 -1
- package/dist/app/assets/copy-B9y2mtjd.js +0 -2
- package/dist/app/assets/copy-B9y2mtjd.js.map +0 -1
- package/dist/app/assets/crop-2_j5MtOq.js +0 -2
- package/dist/app/assets/crop-2_j5MtOq.js.map +0 -1
- package/dist/app/assets/download-CqEtEEpe.js +0 -2
- package/dist/app/assets/download-CqEtEEpe.js.map +0 -1
- package/dist/app/assets/eye-B1LPDhW7.js +0 -2
- package/dist/app/assets/eye-B1LPDhW7.js.map +0 -1
- package/dist/app/assets/folder-tree-CnF1eSpg.js +0 -2
- package/dist/app/assets/folder-tree-CnF1eSpg.js.map +0 -1
- package/dist/app/assets/grid-3x3-BB0TBwXQ.js +0 -2
- package/dist/app/assets/grid-3x3-BB0TBwXQ.js.map +0 -1
- 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/layout-grid-DbSzm5KY.js +0 -2
- package/dist/app/assets/layout-grid-DbSzm5KY.js.map +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/app/assets/shield-check-DXqKmrPT.js +0 -2
- package/dist/app/assets/shield-check-DXqKmrPT.js.map +0 -1
- package/dist/app/assets/signIn-D-eCUhFT.js +0 -2
- package/dist/app/assets/signIn-D-eCUhFT.js.map +0 -1
- package/dist/app/assets/smartphone-Cjrk_YxV.js +0 -2
- package/dist/app/assets/smartphone-Cjrk_YxV.js.map +0 -1
- package/dist/app/assets/terminal-CT_KE008.js +0 -2
- package/dist/app/assets/terminal-CT_KE008.js.map +0 -1
- package/dist/app/assets/useAuth-ctmUbyCR.js +0 -4
- package/dist/app/assets/useAuth-ctmUbyCR.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 +0 -13
- 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/Cancelled-BeS-WlPj.js +0 -2
- package/dist/assets/Cancelled-BeS-WlPj.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/FitPanel-DzYzTMEi.js +0 -2
- package/dist/assets/FitPanel-DzYzTMEi.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/ForgotPassword-DuHNHuUe.js +0 -2
- package/dist/assets/ForgotPassword-DuHNHuUe.js.map +0 -1
- package/dist/assets/Landing-DB9pTPoT.js +0 -2
- package/dist/assets/Landing-DB9pTPoT.js.map +0 -1
- package/dist/assets/LanguageSwitcher-CfUhVVuT.js +0 -2
- package/dist/assets/LanguageSwitcher-CfUhVVuT.js.map +0 -1
- package/dist/assets/Legal-p-YIX5Jv.js +0 -2
- package/dist/assets/Legal-p-YIX5Jv.js.map +0 -1
- package/dist/assets/NotFound-XohZYy7w.js +0 -2
- package/dist/assets/NotFound-XohZYy7w.js.map +0 -1
- package/dist/assets/Pricing-CxCutpT0.js +0 -2
- package/dist/assets/Pricing-CxCutpT0.js.map +0 -1
- package/dist/assets/Privacy-D8m3h6P-.js +0 -2
- package/dist/assets/Privacy-D8m3h6P-.js.map +0 -1
- package/dist/assets/SignIn-CINUig91.js +0 -2
- package/dist/assets/SignIn-CINUig91.js.map +0 -1
- package/dist/assets/SignUp-B1H6dQgE.js +0 -2
- package/dist/assets/SignUp-B1H6dQgE.js.map +0 -1
- package/dist/assets/SiteHeader-BGQW06JF.js +0 -2
- package/dist/assets/SiteHeader-BGQW06JF.js.map +0 -1
- package/dist/assets/StickyMobileCta-C41cW-Ji.js +0 -2
- package/dist/assets/StickyMobileCta-C41cW-Ji.js.map +0 -1
- package/dist/assets/StoreAssetsPipeline-bUVDqZAU.js +0 -6
- package/dist/assets/StoreAssetsPipeline-bUVDqZAU.js.map +0 -1
- package/dist/assets/Success-CMpdlLi2.js +0 -2
- package/dist/assets/Success-CMpdlLi2.js.map +0 -1
- package/dist/assets/Terms-C8NcE4sw.js +0 -2
- package/dist/assets/Terms-C8NcE4sw.js.map +0 -1
- package/dist/assets/ToolGuardrailsPanel-DbjLhdX8.js +0 -2
- package/dist/assets/ToolGuardrailsPanel-DbjLhdX8.js.map +0 -1
- package/dist/assets/ToolsIndex-BuZSvoBC.js +0 -6
- package/dist/assets/ToolsIndex-BuZSvoBC.js.map +0 -1
- package/dist/assets/WorkloadCalculator-CjdG5TVq.js +0 -5
- package/dist/assets/WorkloadCalculator-CjdG5TVq.js.map +0 -1
- package/dist/assets/calculator-_D64kDDH.js +0 -2
- package/dist/assets/calculator-_D64kDDH.js.map +0 -1
- package/dist/assets/check-BaiZ7vYg.js +0 -2
- package/dist/assets/check-BaiZ7vYg.js.map +0 -1
- package/dist/assets/chevron-down-DVRa-y8D.js +0 -2
- package/dist/assets/chevron-down-DVRa-y8D.js.map +0 -1
- package/dist/assets/circle-check-reAyVfkP.js +0 -2
- package/dist/assets/circle-check-reAyVfkP.js.map +0 -1
- package/dist/assets/clipboard-copy-BfB1mutp.js +0 -2
- package/dist/assets/clipboard-copy-BfB1mutp.js.map +0 -1
- package/dist/assets/copy-B9y2mtjd.js +0 -2
- package/dist/assets/copy-B9y2mtjd.js.map +0 -1
- package/dist/assets/crop-2_j5MtOq.js +0 -2
- package/dist/assets/crop-2_j5MtOq.js.map +0 -1
- package/dist/assets/download-CqEtEEpe.js +0 -2
- package/dist/assets/download-CqEtEEpe.js.map +0 -1
- package/dist/assets/eye-B1LPDhW7.js +0 -2
- package/dist/assets/eye-B1LPDhW7.js.map +0 -1
- package/dist/assets/folder-tree-CnF1eSpg.js +0 -2
- package/dist/assets/folder-tree-CnF1eSpg.js.map +0 -1
- package/dist/assets/grid-3x3-BB0TBwXQ.js +0 -2
- package/dist/assets/grid-3x3-BB0TBwXQ.js.map +0 -1
- 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/layout-grid-DbSzm5KY.js +0 -2
- package/dist/assets/layout-grid-DbSzm5KY.js.map +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/dist/assets/shield-check-DXqKmrPT.js +0 -2
- package/dist/assets/shield-check-DXqKmrPT.js.map +0 -1
- package/dist/assets/signIn-D-eCUhFT.js +0 -2
- package/dist/assets/signIn-D-eCUhFT.js.map +0 -1
- package/dist/assets/smartphone-Cjrk_YxV.js +0 -2
- package/dist/assets/smartphone-Cjrk_YxV.js.map +0 -1
- package/dist/assets/terminal-CT_KE008.js +0 -2
- package/dist/assets/terminal-CT_KE008.js.map +0 -1
- package/dist/assets/useAuth-ctmUbyCR.js +0 -4
- package/dist/assets/useAuth-ctmUbyCR.js.map +0 -1
package/bin/shipscreens.js
CHANGED
|
@@ -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
|
|
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
|
-
--
|
|
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
|
|
109
|
-
shipscreens
|
|
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
|
|
349
|
-
|
|
668
|
+
if (subcommand === 'serve') {
|
|
669
|
+
await runMcpServer();
|
|
670
|
+
return;
|
|
350
671
|
}
|
|
351
|
-
|
|
352
|
-
|
|
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
|
|
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
|
-
['
|
|
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
|
-
['
|
|
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
|
|
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
|
-
{
|
|
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;
|