easecloud-mageperf 0.2.0__tar.gz → 0.2.1__tar.gz
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.
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/Dockerfile +1 -1
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/PKG-INFO +64 -52
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/README.md +61 -50
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/install.sh +1 -1
- easecloud_mageperf-0.2.1/mageperf/__init__.py +1 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/_version.py +2 -2
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/utils/http_client.py +27 -0
- easecloud_mageperf-0.2.1/mageperf/utils/security.py +126 -0
- easecloud_mageperf-0.2.1/package.json +25 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/pyproject.toml +2 -1
- easecloud_mageperf-0.2.1/tests/test_ssrf_guard.py +128 -0
- easecloud_mageperf-0.2.0/mageperf/__init__.py +0 -1
- easecloud_mageperf-0.2.0/mageperf/utils/security.py +0 -44
- easecloud_mageperf-0.2.0/package.json +0 -16
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/.github/workflows/ci.yml +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/.github/workflows/publish.yml +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/.gitignore +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/CONTRIBUTING.md +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/LICENSE +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/bin/mageperf.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/docs/plans/2026-06-05-priority-fixes.md +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/cli.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/config.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/__init__.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/analysis_orchestrator.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/analyzers.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/magento_checker.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/models.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/performance_checker.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/scoring_service.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/__init__.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/server.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/404/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/404.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/XrYr7sSal45oZokrlFrej/_buildManifest.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/XrYr7sSal45oZokrlFrej/_ssgManifest.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/125-014fe32049f39f76.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/145-a6dda3b64883afbf.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/160-84ddd8a26c2525f2.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/173-60125878c10d48ba.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/196-2b187cbc4d3238ba.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/356-44a22847ee0b86e8.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/4-a44b517de328e4e5.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/421-5c2e326761a34bc4.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/470-92a45c1517b6dac3.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/4bd1b696-9911af18dede28aa.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/592-8d9214a931227599.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/690-7c6984ad51c61c5a.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/698-f8747db3dcffb70e.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/764-3b5bc7d4108db382.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/775-e29fff578ae06723.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/891-c276c906e578a456.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/920-79b2404ad9f4572d.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/964-03261b559353fef7.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/_not-found/page-1ce309e89987b660.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/all-analysis/page-55c88d5c71ee6abf.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/layout-10056b9e84dd162c.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/onboarding/page-f211aa61b3474b62.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/page-fa14acc4f2e74f1b.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/profile/page-81b663ffda30bc9d.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/progress/page-b1fdfe300ca46260.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/report/[task_id]/core-web-vitals/page-ed20d1baee76d360.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/report/[task_id]/layout-ac44376c1e343fad.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/report/[task_id]/page-a43da525cb02d1a6.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/report/[task_id]/performance-trends/page-ee3c07e421a06649.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/report/[task_id]/recommendations/optimization/page-e0d27470c0df9a92.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/report/[task_id]/recommendations/page-d1001f43c8b746c8.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/report/[task_id]/recommendations/performance-opportunities/page-640679af7ca30acd.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/report/[task_id]/roadmap/page-841594bb9fecaadd.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/report/[task_id]/technical-analysis/page-592a0692710f876c.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/settings/page-2a9d4f3ecc6daad5.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/framework-65ef2e26b6c3f974.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/main-93a22076b5e3a16b.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/main-app-c5b456ce9be1db29.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/pages/_app-035473a38fdb4b73.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/pages/_error-dff1d5ef0ecd42ce.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/webpack-14eec64ca602819f.js +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/css/3d79f7d5e2d2dd32.css +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/css/de70bee13400563f.css +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/747892c23ea88013-s.woff2 +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/8d697b304b401681-s.woff2 +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/9610d9e46709d722-s.woff2 +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/all-analysis/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/all-analysis/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/favicon.ico +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/file.svg +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/globe.svg +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/logo.png +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/manifest.json +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/next.svg +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/onboarding/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/onboarding/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/profile/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/profile/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/progress/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/progress/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/core-web-vitals/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/core-web-vitals/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/performance-trends/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/performance-trends/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/optimization/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/optimization/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/performance-opportunities/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/performance-opportunities/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/roadmap/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/roadmap/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/technical-analysis/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/technical-analysis/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/settings/index.html +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/settings/index.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/vercel.svg +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/window.svg +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/storage/__init__.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/storage/store.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/utils/__init__.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/utils/logger.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/requirements-dev.txt +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/__init__.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_analyze_command.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_config.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_magento_checker.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_performance_checker.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_report_commands.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_scoring_service.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_server.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_store.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_utils.py +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/.gitignore +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/README.md +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/components.json +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/eslint.config.mjs +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/next.config.ts +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/package-lock.json +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/package.json +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/postcss.config.mjs +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/file.svg +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/globe.svg +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/logo.png +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/manifest.json +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/next.svg +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/vercel.svg +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/window.svg +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/all-analysis/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/favicon.ico +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/globals.css +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/layout.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/onboarding/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/profile/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/progress/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/providers.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/PageContent.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/core-web-vitals/PageContent.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/core-web-vitals/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/layout.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/performance-trends/PageContent.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/performance-trends/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/PageContent.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/optimization/PageContent.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/optimization/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/performance-opportunities/PageContent.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/performance-opportunities/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/roadmap/PageContent.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/roadmap/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/technical-analysis/PageContent.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/technical-analysis/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/settings/page.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/BrandedEmptyState.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/BrandedLoading.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/EaseCloudCTA.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/MainSidebar.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/MarkdownRenderer.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/PoweredByEaseCloud.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/analysis/AnalysisCard.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/app-sidebar.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/layout/AppLayout.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/layout/DualSidebarLayout.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/layout/GridSystem.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/layout/PageTransition.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/layout/ReportSidebar.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/lazy/LazyReportComponents.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/logo.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/mobile/MobileNavigation.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/nav-analyses.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/nav-main.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/nav-projects.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/nav-secondary.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/nav-user.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/performance/BenchmarkComparison.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/performance/PerformanceComparisonCharts.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/performance/PerformanceGoalTracker.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/CoreWebVitals.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/OptimizationRoadmap.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/PerformanceMetrics.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/Recommendations.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/ScoreCard.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/TechnicalAnalysis.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/team-switcher.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/DetailModal.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/DynamicBreadcrumb.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/InteractiveTooltip.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/ProgressiveDisclosure.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/SearchFilter.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/Tooltip.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/TouchOptimized.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/alert.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/avatar.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/badge.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/breadcrumb.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/button.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/card.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/collapsible.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/dropdown-menu.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/feedback.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/input.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/label.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/optimized-image.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/progress.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/scroll-area.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/separator.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/sheet.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/sidebar.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/skeleton.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/skeletons.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/switch.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/tabs.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/textarea.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/contexts/AppStateContext.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/contexts/MockAuthContext.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/contexts/ReportContext.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/data/sampleReport1.json +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/data/sampleReports.ts +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/hooks/use-mobile.ts +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/hooks/useDeviceOptimization.ts +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/lib/animations.ts +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/lib/lazyLoading.tsx +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/lib/localApi.ts +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/lib/performance.ts +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/lib/utils.ts +0 -0
- {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/tsconfig.json +0 -0
|
@@ -2,7 +2,7 @@ FROM python:3.11-slim
|
|
|
2
2
|
|
|
3
3
|
LABEL org.opencontainers.image.title="mageperf"
|
|
4
4
|
LABEL org.opencontainers.image.description="EaseCloud Magento Performance Analyzer"
|
|
5
|
-
LABEL org.opencontainers.image.source="https://github.com/
|
|
5
|
+
LABEL org.opencontainers.image.source="https://github.com/easecloudio/mageperf"
|
|
6
6
|
LABEL org.opencontainers.image.vendor="EaseCloud"
|
|
7
7
|
LABEL org.opencontainers.image.licenses="MIT"
|
|
8
8
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: easecloud-mageperf
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Free, open-source Magento performance analysis CLI by EaseCloud
|
|
5
5
|
Project-URL: Homepage, https://easecloud.io
|
|
6
6
|
Project-URL: Repository, https://github.com/easecloudio/mageperf
|
|
@@ -20,6 +20,7 @@ Classifier: Topic :: System :: Monitoring
|
|
|
20
20
|
Requires-Python: >=3.11
|
|
21
21
|
Requires-Dist: beautifulsoup4>=4.12.0
|
|
22
22
|
Requires-Dist: dnspython>=2.4.0
|
|
23
|
+
Requires-Dist: httpcore>=1.0.0
|
|
23
24
|
Requires-Dist: httpx>=0.28.0
|
|
24
25
|
Requires-Dist: rich>=13.0.0
|
|
25
26
|
Requires-Dist: typer>=0.12.0
|
|
@@ -32,15 +33,26 @@ Description-Content-Type: text/markdown
|
|
|
32
33
|
|
|
33
34
|
# mageperf
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
[](https://pypi.org/project/easecloud-mageperf/)
|
|
37
|
+
[](https://www.npmjs.com/package/@easecloud/mageperf)
|
|
38
|
+
[](https://opensource.org/licenses/MIT)
|
|
39
|
+
[](https://www.python.org/)
|
|
40
|
+
[](https://github.com/easecloudio/mageperf)
|
|
36
41
|
|
|
37
|
-
|
|
42
|
+
**Free, open-source Magento 2 performance analyzer CLI** — scans any store from your terminal with no account, no cloud, and no data leaving your machine.
|
|
38
43
|
|
|
39
|
-
|
|
44
|
+
**Developed and maintained by [EaseCloud](https://easecloud.io)** — cloud-native, AI-driven, and Magento infrastructure solutions.
|
|
45
|
+
|
|
46
|
+
## Quick Start
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pip install easecloud-mageperf
|
|
50
|
+
mageperf analyze https://your-store.com
|
|
51
|
+
```
|
|
40
52
|
|
|
41
53
|
## Features
|
|
42
54
|
|
|
43
|
-
- **Magento detection** — fingerprints
|
|
55
|
+
- **Magento detection** — fingerprints version, edition, and deployment mode; `--force` overrides for hardened stores
|
|
44
56
|
- **Performance analysis** — Core Web Vitals via Google PageSpeed Insights API (optional)
|
|
45
57
|
- **Security checks** — exposed admin paths, debug mode, insecure headers
|
|
46
58
|
- **Configuration checks** — caching, JS/CSS merging, CDN, production mode
|
|
@@ -52,8 +64,6 @@ Description-Content-Type: text/markdown
|
|
|
52
64
|
- **Browser UI** — rich report viewer served locally on port 4780
|
|
53
65
|
- **JSON output** — pipe results into scripts or AI agents
|
|
54
66
|
|
|
55
|
-
---
|
|
56
|
-
|
|
57
67
|
## Installation
|
|
58
68
|
|
|
59
69
|
### pip (recommended)
|
|
@@ -82,9 +92,7 @@ docker run --rm easecloud/mageperf analyze https://your-store.com
|
|
|
82
92
|
curl -fsSL https://raw.githubusercontent.com/easecloudio/mageperf/main/install.sh | bash
|
|
83
93
|
```
|
|
84
94
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
## Quick start
|
|
95
|
+
## Usage
|
|
88
96
|
|
|
89
97
|
```bash
|
|
90
98
|
# Analyze a store
|
|
@@ -115,35 +123,31 @@ mageperf compare <before-id> <after-id>
|
|
|
115
123
|
mageperf serve
|
|
116
124
|
```
|
|
117
125
|
|
|
118
|
-
---
|
|
119
|
-
|
|
120
126
|
## Commands
|
|
121
127
|
|
|
122
|
-
| Command
|
|
123
|
-
|
|
124
|
-
| `mageperf analyze <url>`
|
|
125
|
-
| `mageperf list`
|
|
126
|
-
| `mageperf open <id\|number>`
|
|
127
|
-
| `mageperf compare <id1> <id2>`
|
|
128
|
-
| `mageperf serve`
|
|
129
|
-
| `mageperf delete <id>`
|
|
130
|
-
| `mageperf clean`
|
|
131
|
-
| `mageperf config set <key> <value>`
|
|
132
|
-
| `mageperf config get <key>`
|
|
128
|
+
| Command | Description |
|
|
129
|
+
|---|---|
|
|
130
|
+
| `mageperf analyze <url>` | Run a full analysis |
|
|
131
|
+
| `mageperf list` | List saved reports (numbered) |
|
|
132
|
+
| `mageperf open <id\|number>` | Open a report in the browser UI (UUID or list index) |
|
|
133
|
+
| `mageperf compare <id1> <id2>` | Diff two reports: score delta, resolved findings |
|
|
134
|
+
| `mageperf serve` | Start the local report UI server |
|
|
135
|
+
| `mageperf delete <id>` | Delete a single report |
|
|
136
|
+
| `mageperf clean` | Delete all saved reports |
|
|
137
|
+
| `mageperf config set <key> <value>` | Set a config value |
|
|
138
|
+
| `mageperf config get <key>` | Get a config value |
|
|
133
139
|
|
|
134
140
|
### `analyze` options
|
|
135
141
|
|
|
136
|
-
| Flag
|
|
137
|
-
|
|
138
|
-
| `--format`
|
|
139
|
-
| `--output <file>`
|
|
140
|
-
| `--open`
|
|
141
|
-
| `--no-pagespeed`
|
|
142
|
-
| `--force`
|
|
143
|
-
| `--checks <subset>` | `all`
|
|
144
|
-
| `--timeout <secs>`
|
|
145
|
-
|
|
146
|
-
---
|
|
142
|
+
| Flag | Default | Description |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| `--format` | `summary` | Output format: `summary`, `json`, `table` |
|
|
145
|
+
| `--output <file>` | — | Write JSON report to a file |
|
|
146
|
+
| `--open` | off | Open browser UI after analysis |
|
|
147
|
+
| `--no-pagespeed` | off | Skip Google PageSpeed API calls |
|
|
148
|
+
| `--force` | off | Skip Magento detection gate (for hardened stores) |
|
|
149
|
+
| `--checks <subset>` | `all` | Comma-separated checks to run: `performance`, `magento`, `all` |
|
|
150
|
+
| `--timeout <secs>` | 20 | HTTP request timeout in seconds |
|
|
147
151
|
|
|
148
152
|
## Configuration
|
|
149
153
|
|
|
@@ -160,8 +164,6 @@ mageperf config set server-port 4780
|
|
|
160
164
|
Get a free PageSpeed API key at [Google Cloud Console](https://console.cloud.google.com/).
|
|
161
165
|
Without a key, `mageperf` falls back to direct HTTP analysis.
|
|
162
166
|
|
|
163
|
-
---
|
|
164
|
-
|
|
165
167
|
## How it works
|
|
166
168
|
|
|
167
169
|
Analysis runs in five layers:
|
|
@@ -176,8 +178,6 @@ All checks use only publicly available data. No credentials, no admin access req
|
|
|
176
178
|
|
|
177
179
|
Any check that fails (timeout, connection error) surfaces in the terminal output with its error message rather than silently defaulting to zero.
|
|
178
180
|
|
|
179
|
-
---
|
|
180
|
-
|
|
181
181
|
## Output example
|
|
182
182
|
|
|
183
183
|
```
|
|
@@ -210,10 +210,6 @@ Resolved (1):
|
|
|
210
210
|
✓ Enable CSS merging
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
> **Found critical issues?** EaseCloud provides [Magento performance optimization consulting](https://www.easecloud.io/magento-performance-optimization) — Core Web Vitals, caching strategy, infrastructure tuning, and more.
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
213
|
## Development
|
|
218
214
|
|
|
219
215
|
```bash
|
|
@@ -249,23 +245,39 @@ install.sh Universal install script
|
|
|
249
245
|
package.json npm wrapper (@easecloud/mageperf)
|
|
250
246
|
```
|
|
251
247
|
|
|
252
|
-
|
|
248
|
+
## About EaseCloud
|
|
253
249
|
|
|
254
|
-
|
|
250
|
+
EaseCloud is a cloud consulting and solutions company specializing in:
|
|
255
251
|
|
|
256
|
-
|
|
252
|
+
- Magento 2 performance optimization and infrastructure
|
|
253
|
+
- Cloud-native application development on AWS, GCP, and Azure
|
|
254
|
+
- AI and automation integrations
|
|
255
|
+
- DevOps, infrastructure management, and CI/CD
|
|
256
|
+
- Data analytics and BI platform consulting
|
|
257
257
|
|
|
258
|
-
|
|
258
|
+
We built `mageperf` to give the Magento community a transparent, no-signup performance tool while demonstrating our expertise in store optimization and cloud infrastructure.
|
|
259
259
|
|
|
260
|
-
|
|
260
|
+
If your team is running a high-traffic Magento store or needs help closing the gaps `mageperf` surfaces, [get in touch](https://easecloud.io) — we provide consulting, caching strategy, Core Web Vitals tuning, and managed infrastructure for merchants at scale.
|
|
261
261
|
|
|
262
|
-
|
|
262
|
+
📧 [support@easecloud.io](mailto:support@easecloud.io)
|
|
263
|
+
🌐 [easecloud.io](https://easecloud.io)
|
|
263
264
|
|
|
264
|
-
|
|
265
|
+
## Bug Reports & Issues
|
|
265
266
|
|
|
266
|
-
|
|
267
|
+
Found a bug or have a feature request?
|
|
267
268
|
|
|
268
|
-
|
|
269
|
+
🐛 [Create a GitHub issue](https://github.com/easecloudio/mageperf/issues)
|
|
270
|
+
|
|
271
|
+
Please include:
|
|
272
|
+
- Magento version and edition (if known)
|
|
273
|
+
- `mageperf` version (`mageperf --version`)
|
|
274
|
+
- Steps to reproduce
|
|
275
|
+
- Expected vs actual behavior
|
|
276
|
+
- Any error messages or terminal output
|
|
277
|
+
|
|
278
|
+
## Contributing
|
|
279
|
+
|
|
280
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
269
281
|
|
|
270
282
|
## License
|
|
271
283
|
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
# mageperf
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://pypi.org/project/easecloud-mageperf/)
|
|
4
|
+
[](https://www.npmjs.com/package/@easecloud/mageperf)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
[](https://www.python.org/)
|
|
7
|
+
[](https://github.com/easecloudio/mageperf)
|
|
4
8
|
|
|
5
|
-
|
|
9
|
+
**Free, open-source Magento 2 performance analyzer CLI** — scans any store from your terminal with no account, no cloud, and no data leaving your machine.
|
|
6
10
|
|
|
7
|
-
|
|
11
|
+
**Developed and maintained by [EaseCloud](https://easecloud.io)** — cloud-native, AI-driven, and Magento infrastructure solutions.
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pip install easecloud-mageperf
|
|
17
|
+
mageperf analyze https://your-store.com
|
|
18
|
+
```
|
|
8
19
|
|
|
9
20
|
## Features
|
|
10
21
|
|
|
11
|
-
- **Magento detection** — fingerprints
|
|
22
|
+
- **Magento detection** — fingerprints version, edition, and deployment mode; `--force` overrides for hardened stores
|
|
12
23
|
- **Performance analysis** — Core Web Vitals via Google PageSpeed Insights API (optional)
|
|
13
24
|
- **Security checks** — exposed admin paths, debug mode, insecure headers
|
|
14
25
|
- **Configuration checks** — caching, JS/CSS merging, CDN, production mode
|
|
@@ -20,8 +31,6 @@
|
|
|
20
31
|
- **Browser UI** — rich report viewer served locally on port 4780
|
|
21
32
|
- **JSON output** — pipe results into scripts or AI agents
|
|
22
33
|
|
|
23
|
-
---
|
|
24
|
-
|
|
25
34
|
## Installation
|
|
26
35
|
|
|
27
36
|
### pip (recommended)
|
|
@@ -50,9 +59,7 @@ docker run --rm easecloud/mageperf analyze https://your-store.com
|
|
|
50
59
|
curl -fsSL https://raw.githubusercontent.com/easecloudio/mageperf/main/install.sh | bash
|
|
51
60
|
```
|
|
52
61
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
## Quick start
|
|
62
|
+
## Usage
|
|
56
63
|
|
|
57
64
|
```bash
|
|
58
65
|
# Analyze a store
|
|
@@ -83,35 +90,31 @@ mageperf compare <before-id> <after-id>
|
|
|
83
90
|
mageperf serve
|
|
84
91
|
```
|
|
85
92
|
|
|
86
|
-
---
|
|
87
|
-
|
|
88
93
|
## Commands
|
|
89
94
|
|
|
90
|
-
| Command
|
|
91
|
-
|
|
92
|
-
| `mageperf analyze <url>`
|
|
93
|
-
| `mageperf list`
|
|
94
|
-
| `mageperf open <id\|number>`
|
|
95
|
-
| `mageperf compare <id1> <id2>`
|
|
96
|
-
| `mageperf serve`
|
|
97
|
-
| `mageperf delete <id>`
|
|
98
|
-
| `mageperf clean`
|
|
99
|
-
| `mageperf config set <key> <value>`
|
|
100
|
-
| `mageperf config get <key>`
|
|
95
|
+
| Command | Description |
|
|
96
|
+
|---|---|
|
|
97
|
+
| `mageperf analyze <url>` | Run a full analysis |
|
|
98
|
+
| `mageperf list` | List saved reports (numbered) |
|
|
99
|
+
| `mageperf open <id\|number>` | Open a report in the browser UI (UUID or list index) |
|
|
100
|
+
| `mageperf compare <id1> <id2>` | Diff two reports: score delta, resolved findings |
|
|
101
|
+
| `mageperf serve` | Start the local report UI server |
|
|
102
|
+
| `mageperf delete <id>` | Delete a single report |
|
|
103
|
+
| `mageperf clean` | Delete all saved reports |
|
|
104
|
+
| `mageperf config set <key> <value>` | Set a config value |
|
|
105
|
+
| `mageperf config get <key>` | Get a config value |
|
|
101
106
|
|
|
102
107
|
### `analyze` options
|
|
103
108
|
|
|
104
|
-
| Flag
|
|
105
|
-
|
|
106
|
-
| `--format`
|
|
107
|
-
| `--output <file>`
|
|
108
|
-
| `--open`
|
|
109
|
-
| `--no-pagespeed`
|
|
110
|
-
| `--force`
|
|
111
|
-
| `--checks <subset>` | `all`
|
|
112
|
-
| `--timeout <secs>`
|
|
113
|
-
|
|
114
|
-
---
|
|
109
|
+
| Flag | Default | Description |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| `--format` | `summary` | Output format: `summary`, `json`, `table` |
|
|
112
|
+
| `--output <file>` | — | Write JSON report to a file |
|
|
113
|
+
| `--open` | off | Open browser UI after analysis |
|
|
114
|
+
| `--no-pagespeed` | off | Skip Google PageSpeed API calls |
|
|
115
|
+
| `--force` | off | Skip Magento detection gate (for hardened stores) |
|
|
116
|
+
| `--checks <subset>` | `all` | Comma-separated checks to run: `performance`, `magento`, `all` |
|
|
117
|
+
| `--timeout <secs>` | 20 | HTTP request timeout in seconds |
|
|
115
118
|
|
|
116
119
|
## Configuration
|
|
117
120
|
|
|
@@ -128,8 +131,6 @@ mageperf config set server-port 4780
|
|
|
128
131
|
Get a free PageSpeed API key at [Google Cloud Console](https://console.cloud.google.com/).
|
|
129
132
|
Without a key, `mageperf` falls back to direct HTTP analysis.
|
|
130
133
|
|
|
131
|
-
---
|
|
132
|
-
|
|
133
134
|
## How it works
|
|
134
135
|
|
|
135
136
|
Analysis runs in five layers:
|
|
@@ -144,8 +145,6 @@ All checks use only publicly available data. No credentials, no admin access req
|
|
|
144
145
|
|
|
145
146
|
Any check that fails (timeout, connection error) surfaces in the terminal output with its error message rather than silently defaulting to zero.
|
|
146
147
|
|
|
147
|
-
---
|
|
148
|
-
|
|
149
148
|
## Output example
|
|
150
149
|
|
|
151
150
|
```
|
|
@@ -178,10 +177,6 @@ Resolved (1):
|
|
|
178
177
|
✓ Enable CSS merging
|
|
179
178
|
```
|
|
180
179
|
|
|
181
|
-
> **Found critical issues?** EaseCloud provides [Magento performance optimization consulting](https://www.easecloud.io/magento-performance-optimization) — Core Web Vitals, caching strategy, infrastructure tuning, and more.
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
180
|
## Development
|
|
186
181
|
|
|
187
182
|
```bash
|
|
@@ -217,23 +212,39 @@ install.sh Universal install script
|
|
|
217
212
|
package.json npm wrapper (@easecloud/mageperf)
|
|
218
213
|
```
|
|
219
214
|
|
|
220
|
-
|
|
215
|
+
## About EaseCloud
|
|
221
216
|
|
|
222
|
-
|
|
217
|
+
EaseCloud is a cloud consulting and solutions company specializing in:
|
|
223
218
|
|
|
224
|
-
|
|
219
|
+
- Magento 2 performance optimization and infrastructure
|
|
220
|
+
- Cloud-native application development on AWS, GCP, and Azure
|
|
221
|
+
- AI and automation integrations
|
|
222
|
+
- DevOps, infrastructure management, and CI/CD
|
|
223
|
+
- Data analytics and BI platform consulting
|
|
225
224
|
|
|
226
|
-
|
|
225
|
+
We built `mageperf` to give the Magento community a transparent, no-signup performance tool while demonstrating our expertise in store optimization and cloud infrastructure.
|
|
227
226
|
|
|
228
|
-
|
|
227
|
+
If your team is running a high-traffic Magento store or needs help closing the gaps `mageperf` surfaces, [get in touch](https://easecloud.io) — we provide consulting, caching strategy, Core Web Vitals tuning, and managed infrastructure for merchants at scale.
|
|
229
228
|
|
|
230
|
-
|
|
229
|
+
📧 [support@easecloud.io](mailto:support@easecloud.io)
|
|
230
|
+
🌐 [easecloud.io](https://easecloud.io)
|
|
231
231
|
|
|
232
|
-
|
|
232
|
+
## Bug Reports & Issues
|
|
233
233
|
|
|
234
|
-
|
|
234
|
+
Found a bug or have a feature request?
|
|
235
235
|
|
|
236
|
-
|
|
236
|
+
🐛 [Create a GitHub issue](https://github.com/easecloudio/mageperf/issues)
|
|
237
|
+
|
|
238
|
+
Please include:
|
|
239
|
+
- Magento version and edition (if known)
|
|
240
|
+
- `mageperf` version (`mageperf --version`)
|
|
241
|
+
- Steps to reproduce
|
|
242
|
+
- Expected vs actual behavior
|
|
243
|
+
- Any error messages or terminal output
|
|
244
|
+
|
|
245
|
+
## Contributing
|
|
246
|
+
|
|
247
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
237
248
|
|
|
238
249
|
## License
|
|
239
250
|
|
|
@@ -25,7 +25,7 @@ else
|
|
|
25
25
|
esac
|
|
26
26
|
|
|
27
27
|
BINARY_NAME="mageperf-${OS}-${ARCH}"
|
|
28
|
-
DOWNLOAD_URL="https://github.com/
|
|
28
|
+
DOWNLOAD_URL="https://github.com/easecloudio/mageperf/releases/latest/download/${BINARY_NAME}"
|
|
29
29
|
INSTALL_DIR="/usr/local/bin"
|
|
30
30
|
|
|
31
31
|
echo "Downloading from GitHub Releases..."
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.2.1"
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 2,
|
|
21
|
+
__version__ = version = '0.2.1'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 2, 1)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -3,7 +3,29 @@ from typing import Optional
|
|
|
3
3
|
|
|
4
4
|
import httpx
|
|
5
5
|
|
|
6
|
+
import httpcore
|
|
7
|
+
|
|
6
8
|
from mageperf.utils.logger import logger
|
|
9
|
+
from mageperf.utils.security import SSRFGuardBackend
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _guarded_transport(limits: httpx.Limits) -> httpx.AsyncHTTPTransport:
|
|
13
|
+
"""Build a transport whose every TCP connection passes the SSRF check.
|
|
14
|
+
|
|
15
|
+
The analyzed site controls redirects and asset URLs, so validating only
|
|
16
|
+
the URL typed by the user is not enough.
|
|
17
|
+
"""
|
|
18
|
+
transport = httpx.AsyncHTTPTransport(limits=limits)
|
|
19
|
+
transport._pool = httpcore.AsyncConnectionPool(
|
|
20
|
+
ssl_context=httpx.create_ssl_context(),
|
|
21
|
+
max_connections=limits.max_connections,
|
|
22
|
+
max_keepalive_connections=limits.max_keepalive_connections,
|
|
23
|
+
keepalive_expiry=limits.keepalive_expiry,
|
|
24
|
+
http1=True,
|
|
25
|
+
http2=False,
|
|
26
|
+
network_backend=SSRFGuardBackend(),
|
|
27
|
+
)
|
|
28
|
+
return transport
|
|
7
29
|
|
|
8
30
|
|
|
9
31
|
class HTTPClient:
|
|
@@ -23,7 +45,12 @@ class HTTPClient:
|
|
|
23
45
|
self._client = httpx.AsyncClient(
|
|
24
46
|
timeout=timeout,
|
|
25
47
|
limits=limits,
|
|
48
|
+
transport=_guarded_transport(limits),
|
|
49
|
+
# Each redirect hop is sent through the guarded transport, so
|
|
50
|
+
# redirect targets are validated like any other connection.
|
|
26
51
|
follow_redirects=True,
|
|
52
|
+
# Env proxies would get their own unguarded transports.
|
|
53
|
+
trust_env=False,
|
|
27
54
|
headers={"User-Agent": "mageperf/0.1.0 (EaseCloud; +https://easecloud.io)"},
|
|
28
55
|
)
|
|
29
56
|
return self._client
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import ipaddress
|
|
3
|
+
import socket
|
|
4
|
+
import typing
|
|
5
|
+
from urllib.parse import urlparse
|
|
6
|
+
|
|
7
|
+
import httpcore
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SSRFBlockedError(ValueError):
|
|
11
|
+
"""Raised when a request would connect to a non-public address."""
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _is_private_ip(ip_str: str) -> bool:
|
|
15
|
+
"""Return True if the IP is not a publicly routable unicast address."""
|
|
16
|
+
try:
|
|
17
|
+
ip = ipaddress.ip_address(ip_str)
|
|
18
|
+
except ValueError:
|
|
19
|
+
return True # Treat unparseable IPs as private to be safe
|
|
20
|
+
# ::ffff:127.0.0.1 and similar must be judged as the IPv4 address they map to
|
|
21
|
+
if isinstance(ip, ipaddress.IPv6Address) and ip.ipv4_mapped is not None:
|
|
22
|
+
ip = ip.ipv4_mapped
|
|
23
|
+
return (
|
|
24
|
+
not ip.is_global
|
|
25
|
+
or ip.is_private
|
|
26
|
+
or ip.is_loopback
|
|
27
|
+
or ip.is_link_local
|
|
28
|
+
or ip.is_multicast
|
|
29
|
+
or ip.is_reserved
|
|
30
|
+
or ip.is_unspecified
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _check_addresses(hostname: str, addresses: typing.Iterable[str]) -> None:
|
|
35
|
+
for addr in addresses:
|
|
36
|
+
if _is_private_ip(addr):
|
|
37
|
+
raise SSRFBlockedError(
|
|
38
|
+
f"{hostname!r} resolves to a private/internal address ({addr}). "
|
|
39
|
+
"Only public URLs are supported."
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def validate_url_not_ssrf(url: str) -> None:
|
|
44
|
+
"""Raise ValueError if the URL resolves to a private/internal IP address.
|
|
45
|
+
|
|
46
|
+
This is an early, user-friendly check on the URL given on the command
|
|
47
|
+
line. It is not sufficient on its own: redirects, asset URLs and DNS
|
|
48
|
+
rebinding are handled by SSRFGuardBackend, which re-validates on every
|
|
49
|
+
connection the shared HTTP client opens.
|
|
50
|
+
"""
|
|
51
|
+
parsed = urlparse(url)
|
|
52
|
+
hostname = parsed.hostname
|
|
53
|
+
if not hostname:
|
|
54
|
+
raise ValueError(f"URL has no hostname: {url!r}")
|
|
55
|
+
|
|
56
|
+
try:
|
|
57
|
+
results = socket.getaddrinfo(hostname, None)
|
|
58
|
+
except socket.gaierror as exc:
|
|
59
|
+
raise ValueError(f"Cannot resolve hostname {hostname!r}: {exc}") from exc
|
|
60
|
+
|
|
61
|
+
_check_addresses(hostname, (r[4][0] for r in results))
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
async def _resolve(host: str, port: int) -> typing.List[str]:
|
|
65
|
+
loop = asyncio.get_running_loop()
|
|
66
|
+
infos = await loop.getaddrinfo(host, port, type=socket.SOCK_STREAM)
|
|
67
|
+
addresses: typing.List[str] = []
|
|
68
|
+
for info in infos:
|
|
69
|
+
addr = info[4][0]
|
|
70
|
+
if addr not in addresses:
|
|
71
|
+
addresses.append(addr)
|
|
72
|
+
return addresses
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class SSRFGuardBackend(httpcore.AsyncNetworkBackend):
|
|
76
|
+
"""Network backend that only opens TCP connections to public addresses.
|
|
77
|
+
|
|
78
|
+
The hostname is resolved once, every resulting address is checked, and
|
|
79
|
+
the socket is opened to one of those already-validated addresses. That
|
|
80
|
+
closes the gap between "check" and "connect" that DNS rebinding relies
|
|
81
|
+
on. TLS is negotiated later by httpcore using the original hostname, so
|
|
82
|
+
SNI and certificate verification are unaffected.
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
def __init__(self, backend: typing.Optional[httpcore.AsyncNetworkBackend] = None) -> None:
|
|
86
|
+
self._backend = backend or httpcore.AnyIOBackend()
|
|
87
|
+
|
|
88
|
+
async def connect_tcp(
|
|
89
|
+
self,
|
|
90
|
+
host: str,
|
|
91
|
+
port: int,
|
|
92
|
+
timeout: typing.Optional[float] = None,
|
|
93
|
+
local_address: typing.Optional[str] = None,
|
|
94
|
+
socket_options: typing.Optional[typing.Iterable[typing.Any]] = None,
|
|
95
|
+
) -> httpcore.AsyncNetworkStream:
|
|
96
|
+
try:
|
|
97
|
+
addresses = await asyncio.wait_for(_resolve(host, port), timeout)
|
|
98
|
+
except asyncio.TimeoutError as exc:
|
|
99
|
+
raise httpcore.ConnectTimeout(f"Timed out resolving {host!r}") from exc
|
|
100
|
+
except OSError as exc:
|
|
101
|
+
raise httpcore.ConnectError(f"Cannot resolve hostname {host!r}: {exc}") from exc
|
|
102
|
+
if not addresses:
|
|
103
|
+
raise httpcore.ConnectError(f"Cannot resolve hostname {host!r}")
|
|
104
|
+
|
|
105
|
+
_check_addresses(host, addresses)
|
|
106
|
+
|
|
107
|
+
last_exc: typing.Optional[Exception] = None
|
|
108
|
+
for addr in addresses:
|
|
109
|
+
try:
|
|
110
|
+
return await self._backend.connect_tcp(
|
|
111
|
+
addr,
|
|
112
|
+
port,
|
|
113
|
+
timeout=timeout,
|
|
114
|
+
local_address=local_address,
|
|
115
|
+
socket_options=socket_options,
|
|
116
|
+
)
|
|
117
|
+
except (httpcore.ConnectError, httpcore.ConnectTimeout) as exc:
|
|
118
|
+
last_exc = exc
|
|
119
|
+
assert last_exc is not None
|
|
120
|
+
raise last_exc
|
|
121
|
+
|
|
122
|
+
async def connect_unix_socket(self, path, timeout=None, socket_options=None):
|
|
123
|
+
raise SSRFBlockedError("Unix socket connections are not allowed")
|
|
124
|
+
|
|
125
|
+
async def sleep(self, seconds: float) -> None:
|
|
126
|
+
await self._backend.sleep(seconds)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@easecloud/mageperf",
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "EaseCloud Magento Performance Analyzer CLI",
|
|
5
|
+
"bin": {
|
|
6
|
+
"mageperf": "bin/mageperf.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/"
|
|
10
|
+
],
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=18"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"magento",
|
|
16
|
+
"performance",
|
|
17
|
+
"cli",
|
|
18
|
+
"easecloud"
|
|
19
|
+
],
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/easecloudio/mageperf"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "easecloud-mageperf"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.1"
|
|
8
8
|
description = "Free, open-source Magento performance analysis CLI by EaseCloud"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -25,6 +25,7 @@ dependencies = [
|
|
|
25
25
|
"typer>=0.12.0",
|
|
26
26
|
"rich>=13.0.0",
|
|
27
27
|
"httpx>=0.28.0",
|
|
28
|
+
"httpcore>=1.0.0",
|
|
28
29
|
"beautifulsoup4>=4.12.0",
|
|
29
30
|
"dnspython>=2.4.0",
|
|
30
31
|
]
|