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.
Files changed (252) hide show
  1. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/Dockerfile +1 -1
  2. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/PKG-INFO +64 -52
  3. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/README.md +61 -50
  4. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/install.sh +1 -1
  5. easecloud_mageperf-0.2.1/mageperf/__init__.py +1 -0
  6. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/_version.py +2 -2
  7. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/utils/http_client.py +27 -0
  8. easecloud_mageperf-0.2.1/mageperf/utils/security.py +126 -0
  9. easecloud_mageperf-0.2.1/package.json +25 -0
  10. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/pyproject.toml +2 -1
  11. easecloud_mageperf-0.2.1/tests/test_ssrf_guard.py +128 -0
  12. easecloud_mageperf-0.2.0/mageperf/__init__.py +0 -1
  13. easecloud_mageperf-0.2.0/mageperf/utils/security.py +0 -44
  14. easecloud_mageperf-0.2.0/package.json +0 -16
  15. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/.github/workflows/ci.yml +0 -0
  16. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/.github/workflows/publish.yml +0 -0
  17. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/.gitignore +0 -0
  18. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/CONTRIBUTING.md +0 -0
  19. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/LICENSE +0 -0
  20. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/bin/mageperf.js +0 -0
  21. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/docs/plans/2026-06-05-priority-fixes.md +0 -0
  22. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/cli.py +0 -0
  23. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/config.py +0 -0
  24. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/__init__.py +0 -0
  25. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/analysis_orchestrator.py +0 -0
  26. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/analyzers.py +0 -0
  27. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/magento_checker.py +0 -0
  28. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/models.py +0 -0
  29. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/performance_checker.py +0 -0
  30. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/core/scoring_service.py +0 -0
  31. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/__init__.py +0 -0
  32. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/server.py +0 -0
  33. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/404/index.html +0 -0
  34. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/404.html +0 -0
  35. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/XrYr7sSal45oZokrlFrej/_buildManifest.js +0 -0
  36. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/XrYr7sSal45oZokrlFrej/_ssgManifest.js +0 -0
  37. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/125-014fe32049f39f76.js +0 -0
  38. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/145-a6dda3b64883afbf.js +0 -0
  39. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/160-84ddd8a26c2525f2.js +0 -0
  40. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/173-60125878c10d48ba.js +0 -0
  41. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/196-2b187cbc4d3238ba.js +0 -0
  42. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/356-44a22847ee0b86e8.js +0 -0
  43. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/4-a44b517de328e4e5.js +0 -0
  44. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/421-5c2e326761a34bc4.js +0 -0
  45. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/470-92a45c1517b6dac3.js +0 -0
  46. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/4bd1b696-9911af18dede28aa.js +0 -0
  47. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/592-8d9214a931227599.js +0 -0
  48. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/690-7c6984ad51c61c5a.js +0 -0
  49. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/698-f8747db3dcffb70e.js +0 -0
  50. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/764-3b5bc7d4108db382.js +0 -0
  51. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/775-e29fff578ae06723.js +0 -0
  52. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/891-c276c906e578a456.js +0 -0
  53. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/920-79b2404ad9f4572d.js +0 -0
  54. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/964-03261b559353fef7.js +0 -0
  55. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/_not-found/page-1ce309e89987b660.js +0 -0
  56. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/all-analysis/page-55c88d5c71ee6abf.js +0 -0
  57. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/layout-10056b9e84dd162c.js +0 -0
  58. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/onboarding/page-f211aa61b3474b62.js +0 -0
  59. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/page-fa14acc4f2e74f1b.js +0 -0
  60. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/profile/page-81b663ffda30bc9d.js +0 -0
  61. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/progress/page-b1fdfe300ca46260.js +0 -0
  62. {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
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/app/settings/page-2a9d4f3ecc6daad5.js +0 -0
  72. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/framework-65ef2e26b6c3f974.js +0 -0
  73. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/main-93a22076b5e3a16b.js +0 -0
  74. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/main-app-c5b456ce9be1db29.js +0 -0
  75. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/pages/_app-035473a38fdb4b73.js +0 -0
  76. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/pages/_error-dff1d5ef0ecd42ce.js +0 -0
  77. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
  78. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/chunks/webpack-14eec64ca602819f.js +0 -0
  79. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/css/3d79f7d5e2d2dd32.css +0 -0
  80. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/css/de70bee13400563f.css +0 -0
  81. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  82. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/747892c23ea88013-s.woff2 +0 -0
  83. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/8d697b304b401681-s.woff2 +0 -0
  84. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  85. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/9610d9e46709d722-s.woff2 +0 -0
  86. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/_next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  87. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/all-analysis/index.html +0 -0
  88. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/all-analysis/index.txt +0 -0
  89. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/favicon.ico +0 -0
  90. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/file.svg +0 -0
  91. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/globe.svg +0 -0
  92. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/index.html +0 -0
  93. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/index.txt +0 -0
  94. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/logo.png +0 -0
  95. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/manifest.json +0 -0
  96. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/next.svg +0 -0
  97. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/onboarding/index.html +0 -0
  98. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/onboarding/index.txt +0 -0
  99. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/profile/index.html +0 -0
  100. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/profile/index.txt +0 -0
  101. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/progress/index.html +0 -0
  102. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/progress/index.txt +0 -0
  103. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/core-web-vitals/index.html +0 -0
  104. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/core-web-vitals/index.txt +0 -0
  105. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/index.html +0 -0
  106. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/index.txt +0 -0
  107. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/performance-trends/index.html +0 -0
  108. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/performance-trends/index.txt +0 -0
  109. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/index.html +0 -0
  110. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/index.txt +0 -0
  111. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/optimization/index.html +0 -0
  112. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/optimization/index.txt +0 -0
  113. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/performance-opportunities/index.html +0 -0
  114. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/recommendations/performance-opportunities/index.txt +0 -0
  115. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/roadmap/index.html +0 -0
  116. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/roadmap/index.txt +0 -0
  117. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/technical-analysis/index.html +0 -0
  118. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/report/_/technical-analysis/index.txt +0 -0
  119. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/settings/index.html +0 -0
  120. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/settings/index.txt +0 -0
  121. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/vercel.svg +0 -0
  122. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/server/static/window.svg +0 -0
  123. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/storage/__init__.py +0 -0
  124. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/storage/store.py +0 -0
  125. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/utils/__init__.py +0 -0
  126. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/mageperf/utils/logger.py +0 -0
  127. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/requirements-dev.txt +0 -0
  128. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/__init__.py +0 -0
  129. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_analyze_command.py +0 -0
  130. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_config.py +0 -0
  131. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_magento_checker.py +0 -0
  132. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_performance_checker.py +0 -0
  133. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_report_commands.py +0 -0
  134. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_scoring_service.py +0 -0
  135. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_server.py +0 -0
  136. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_store.py +0 -0
  137. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/tests/test_utils.py +0 -0
  138. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/.gitignore +0 -0
  139. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/README.md +0 -0
  140. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/components.json +0 -0
  141. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/eslint.config.mjs +0 -0
  142. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/next.config.ts +0 -0
  143. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/package-lock.json +0 -0
  144. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/package.json +0 -0
  145. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/postcss.config.mjs +0 -0
  146. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/file.svg +0 -0
  147. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/globe.svg +0 -0
  148. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/logo.png +0 -0
  149. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/manifest.json +0 -0
  150. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/next.svg +0 -0
  151. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/vercel.svg +0 -0
  152. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/public/window.svg +0 -0
  153. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/all-analysis/page.tsx +0 -0
  154. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/favicon.ico +0 -0
  155. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/globals.css +0 -0
  156. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/layout.tsx +0 -0
  157. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/onboarding/page.tsx +0 -0
  158. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/page.tsx +0 -0
  159. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/profile/page.tsx +0 -0
  160. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/progress/page.tsx +0 -0
  161. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/providers.tsx +0 -0
  162. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/PageContent.tsx +0 -0
  163. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/core-web-vitals/PageContent.tsx +0 -0
  164. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/core-web-vitals/page.tsx +0 -0
  165. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/layout.tsx +0 -0
  166. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/page.tsx +0 -0
  167. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/performance-trends/PageContent.tsx +0 -0
  168. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/performance-trends/page.tsx +0 -0
  169. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/PageContent.tsx +0 -0
  170. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/optimization/PageContent.tsx +0 -0
  171. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/optimization/page.tsx +0 -0
  172. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/page.tsx +0 -0
  173. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/performance-opportunities/PageContent.tsx +0 -0
  174. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/recommendations/performance-opportunities/page.tsx +0 -0
  175. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/roadmap/PageContent.tsx +0 -0
  176. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/roadmap/page.tsx +0 -0
  177. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/technical-analysis/PageContent.tsx +0 -0
  178. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/report/[task_id]/technical-analysis/page.tsx +0 -0
  179. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/app/settings/page.tsx +0 -0
  180. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/BrandedEmptyState.tsx +0 -0
  181. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/BrandedLoading.tsx +0 -0
  182. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/EaseCloudCTA.tsx +0 -0
  183. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/MainSidebar.tsx +0 -0
  184. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/MarkdownRenderer.tsx +0 -0
  185. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/PoweredByEaseCloud.tsx +0 -0
  186. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/analysis/AnalysisCard.tsx +0 -0
  187. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/app-sidebar.tsx +0 -0
  188. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/layout/AppLayout.tsx +0 -0
  189. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/layout/DualSidebarLayout.tsx +0 -0
  190. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/layout/GridSystem.tsx +0 -0
  191. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/layout/PageTransition.tsx +0 -0
  192. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/layout/ReportSidebar.tsx +0 -0
  193. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/lazy/LazyReportComponents.tsx +0 -0
  194. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/logo.tsx +0 -0
  195. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/mobile/MobileNavigation.tsx +0 -0
  196. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/nav-analyses.tsx +0 -0
  197. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/nav-main.tsx +0 -0
  198. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/nav-projects.tsx +0 -0
  199. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/nav-secondary.tsx +0 -0
  200. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/nav-user.tsx +0 -0
  201. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/performance/BenchmarkComparison.tsx +0 -0
  202. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/performance/PerformanceComparisonCharts.tsx +0 -0
  203. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/performance/PerformanceGoalTracker.tsx +0 -0
  204. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/CoreWebVitals.tsx +0 -0
  205. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/OptimizationRoadmap.tsx +0 -0
  206. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/PerformanceMetrics.tsx +0 -0
  207. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/Recommendations.tsx +0 -0
  208. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/ScoreCard.tsx +0 -0
  209. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/report/TechnicalAnalysis.tsx +0 -0
  210. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/team-switcher.tsx +0 -0
  211. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/DetailModal.tsx +0 -0
  212. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/DynamicBreadcrumb.tsx +0 -0
  213. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/InteractiveTooltip.tsx +0 -0
  214. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/ProgressiveDisclosure.tsx +0 -0
  215. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/SearchFilter.tsx +0 -0
  216. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/Tooltip.tsx +0 -0
  217. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/TouchOptimized.tsx +0 -0
  218. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/alert.tsx +0 -0
  219. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/avatar.tsx +0 -0
  220. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/badge.tsx +0 -0
  221. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/breadcrumb.tsx +0 -0
  222. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/button.tsx +0 -0
  223. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/card.tsx +0 -0
  224. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/collapsible.tsx +0 -0
  225. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/dropdown-menu.tsx +0 -0
  226. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/feedback.tsx +0 -0
  227. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/input.tsx +0 -0
  228. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/label.tsx +0 -0
  229. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/optimized-image.tsx +0 -0
  230. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/progress.tsx +0 -0
  231. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/scroll-area.tsx +0 -0
  232. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/separator.tsx +0 -0
  233. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/sheet.tsx +0 -0
  234. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/sidebar.tsx +0 -0
  235. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/skeleton.tsx +0 -0
  236. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/skeletons.tsx +0 -0
  237. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/switch.tsx +0 -0
  238. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/tabs.tsx +0 -0
  239. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/components/ui/textarea.tsx +0 -0
  240. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/contexts/AppStateContext.tsx +0 -0
  241. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/contexts/MockAuthContext.tsx +0 -0
  242. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/contexts/ReportContext.tsx +0 -0
  243. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/data/sampleReport1.json +0 -0
  244. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/data/sampleReports.ts +0 -0
  245. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/hooks/use-mobile.ts +0 -0
  246. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/hooks/useDeviceOptimization.ts +0 -0
  247. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/lib/animations.ts +0 -0
  248. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/lib/lazyLoading.tsx +0 -0
  249. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/lib/localApi.ts +0 -0
  250. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/lib/performance.ts +0 -0
  251. {easecloud_mageperf-0.2.0 → easecloud_mageperf-0.2.1}/ui/src/lib/utils.ts +0 -0
  252. {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/easecloud/mageperf"
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.4
1
+ Metadata-Version: 2.5
2
2
  Name: easecloud-mageperf
3
- Version: 0.2.0
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
- **Free, open-source Magento performance analysis CLI by [EaseCloud](https://www.easecloud.io)**
36
+ [![PyPI version](https://img.shields.io/pypi/v/easecloud-mageperf)](https://pypi.org/project/easecloud-mageperf/)
37
+ [![npm version](https://img.shields.io/npm/v/@easecloud/mageperf)](https://www.npmjs.com/package/@easecloud/mageperf)
38
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
39
+ [![Python](https://img.shields.io/badge/Python-3.11+-blue.svg)](https://www.python.org/)
40
+ [![GitHub](https://img.shields.io/badge/GitHub-easecloudio%2Fmageperf-blue)](https://github.com/easecloudio/mageperf)
36
41
 
37
- `mageperf` scans any Magento 2 store from your terminal — no account, no cloud, no data leaving your machine. It checks performance, security posture, and configuration best practices, then saves reports locally and optionally opens a browser UI.
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 Magento version, edition, and deployment mode; `--force` overrides for hardened stores
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 | Description |
123
- | ------------------------------------ | ---------------------------------------------------- |
124
- | `mageperf analyze <url>` | Run a full analysis |
125
- | `mageperf list` | List saved reports (numbered) |
126
- | `mageperf open <id\|number>` | Open a report in the browser UI (UUID or list index) |
127
- | `mageperf compare <id1> <id2>` | Diff two reports: score delta, resolved findings |
128
- | `mageperf serve` | Start the local report UI server |
129
- | `mageperf delete <id>` | Delete a single report |
130
- | `mageperf clean` | Delete all saved reports |
131
- | `mageperf config set <key> <value>` | Set a config value |
132
- | `mageperf config get <key>` | Get a config value |
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 | Default | Description |
137
- | ------------------- | --------- | -------------------------------------------------------- |
138
- | `--format` | `summary` | Output format: `summary`, `json`, `table` |
139
- | `--output <file>` | — | Write JSON report to a file |
140
- | `--open` | off | Open browser UI after analysis |
141
- | `--no-pagespeed` | off | Skip Google PageSpeed API calls |
142
- | `--force` | off | Skip Magento detection gate (for hardened stores) |
143
- | `--checks <subset>` | `all` | Comma-separated checks to run: `performance`, `magento`, `all` |
144
- | `--timeout <secs>` | 20 | HTTP request timeout in seconds |
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
- ## Contributing
250
+ EaseCloud is a cloud consulting and solutions company specializing in:
255
251
 
256
- See [CONTRIBUTING.md](CONTRIBUTING.md).
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
- ## Work with EaseCloud
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
- `mageperf` finds the problems. Need help fixing them?
262
+ 📧 [support@easecloud.io](mailto:support@easecloud.io)
263
+ 🌐 [easecloud.io](https://easecloud.io)
263
264
 
264
- We offer end-to-end [Magento performance optimization](https://www.easecloud.io/magento-performance-optimization) — from diagnosis to implementation across caching, Core Web Vitals, infrastructure, and deployment.
265
+ ## Bug Reports & Issues
265
266
 
266
- Contact: [support@easecloud.io](mailto:support@easecloud.io) · [easecloud.io](https://easecloud.io)
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
- **Free, open-source Magento performance analysis CLI by [EaseCloud](https://www.easecloud.io)**
3
+ [![PyPI version](https://img.shields.io/pypi/v/easecloud-mageperf)](https://pypi.org/project/easecloud-mageperf/)
4
+ [![npm version](https://img.shields.io/npm/v/@easecloud/mageperf)](https://www.npmjs.com/package/@easecloud/mageperf)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Python](https://img.shields.io/badge/Python-3.11+-blue.svg)](https://www.python.org/)
7
+ [![GitHub](https://img.shields.io/badge/GitHub-easecloudio%2Fmageperf-blue)](https://github.com/easecloudio/mageperf)
4
8
 
5
- `mageperf` scans any Magento 2 store from your terminal — no account, no cloud, no data leaving your machine. It checks performance, security posture, and configuration best practices, then saves reports locally and optionally opens a browser UI.
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 Magento version, edition, and deployment mode; `--force` overrides for hardened stores
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 | Description |
91
- | ------------------------------------ | ---------------------------------------------------- |
92
- | `mageperf analyze <url>` | Run a full analysis |
93
- | `mageperf list` | List saved reports (numbered) |
94
- | `mageperf open <id\|number>` | Open a report in the browser UI (UUID or list index) |
95
- | `mageperf compare <id1> <id2>` | Diff two reports: score delta, resolved findings |
96
- | `mageperf serve` | Start the local report UI server |
97
- | `mageperf delete <id>` | Delete a single report |
98
- | `mageperf clean` | Delete all saved reports |
99
- | `mageperf config set <key> <value>` | Set a config value |
100
- | `mageperf config get <key>` | Get a config value |
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 | Default | Description |
105
- | ------------------- | --------- | -------------------------------------------------------- |
106
- | `--format` | `summary` | Output format: `summary`, `json`, `table` |
107
- | `--output <file>` | — | Write JSON report to a file |
108
- | `--open` | off | Open browser UI after analysis |
109
- | `--no-pagespeed` | off | Skip Google PageSpeed API calls |
110
- | `--force` | off | Skip Magento detection gate (for hardened stores) |
111
- | `--checks <subset>` | `all` | Comma-separated checks to run: `performance`, `magento`, `all` |
112
- | `--timeout <secs>` | 20 | HTTP request timeout in seconds |
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
- ## Contributing
217
+ EaseCloud is a cloud consulting and solutions company specializing in:
223
218
 
224
- See [CONTRIBUTING.md](CONTRIBUTING.md).
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
- ## Work with EaseCloud
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
- `mageperf` finds the problems. Need help fixing them?
229
+ 📧 [support@easecloud.io](mailto:support@easecloud.io)
230
+ 🌐 [easecloud.io](https://easecloud.io)
231
231
 
232
- We offer end-to-end [Magento performance optimization](https://www.easecloud.io/magento-performance-optimization) — from diagnosis to implementation across caching, Core Web Vitals, infrastructure, and deployment.
232
+ ## Bug Reports & Issues
233
233
 
234
- Contact: [support@easecloud.io](mailto:support@easecloud.io) · [easecloud.io](https://easecloud.io)
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/easecloud/mageperf/releases/latest/download/${BINARY_NAME}"
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.0'
22
- __version_tuple__ = version_tuple = (0, 2, 0)
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.0"
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
  ]