{"id":"a1e52676-7986-4715-8365-de65917b2e89","entityType":"agent","slug":"clawhub-nj070574-gif-magento-admin","name":"magento-admin","canonicalUrl":"https://www.xpersona.co/agent/clawhub-nj070574-gif-magento-admin","canonicalPath":"/agent/clawhub-nj070574-gif-magento-admin","generatedAt":"2026-10-11T20:59:28.823Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T15:56:59.507Z","emptyReason":null},"description":"Complete Magento 2 store administration via SSH key auth, REST API, GraphQL, and direct DB access. For server owners on their own infrastructure. SSH key auth and passwordless sudo required. Skill: magento-admin Owner: nj070574-gif Summary: Complete Magento 2 store administration via SSH key auth, REST API, GraphQL, and direct DB access. For server owners on their own infrastructure. SSH key auth and passwordless sudo required. Tags: latest:5.7.0 Version history: v5.7.0 | 2026-10-03T09:42:59.885Z | user v5.7.0 - Security hardening + fixes (verified against live Magento 2.4.9). Input Handling & Injection","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s1747h3dssx5wbb4xxpn85vtsd83gnax:magento-admin","sourceUrl":"https://clawhub.ai/nj070574-gif/magento-admin","homepage":"https://clawhub.ai/nj070574-gif/skills/magento-admin","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/nj070574-gif/magento-admin","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/nj070574-gif/skills/magento-admin","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Complete Magento 2 store administration via SSH key auth, REST API, GraphQL, and direct DB access. For server owners on their own infrastructure. SSH key auth a"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T15:56:59.507Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T15:56:59.507Z","emptyReason":null},"stars":null,"forks":null,"downloads":1033,"packageName":null,"latestVersion":"5.7.0","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T15:56:59.441Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T15:56:59.507Z","lastCrawledAt":"2026-10-11T15:56:59.441Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T15:56:59.441Z","lastVerifiedAt":null,"highlights":[{"version":"5.7.0","createdAt":"2026-10-03T09:42:59.885Z","changelog":"v5.7.0 - Security hardening + fixes (verified against live Magento 2.4.9). Input Handling & Injection Safety guidance; TLS/CA-cert conditional handling (never -k); repaired Configuration section; PHP example aligned; health-check service-list superset documented; known_hosts pre-seed added to setup.","fileCount":3,"zipByteSize":10834},{"version":"5.6.1","createdAt":"2026-04-24T19:51:53.555Z","changelog":"v5.6.1: Rewrote README to explain scanner high-risk rating. Leads with scanner check table showing all technical checks pass. Explains why high-risk is expected for a full admin tool. Security model, least-privilege, and who-should-install sections added.","fileCount":3,"zipByteSize":9350},{"version":"5.6.0","createdAt":"2026-04-24T19:29:11.836Z","changelog":"v5.6.0: Acknowledge inherent high-privilege scope. Added risk_level: high + risk_acknowledged: true to security metadata. Added risk_justification. Added Intended Use and Risk Acknowledgement section to skill body. Removed 'arbitrary SQL' framing. This skill is high-privilege by design — it provides full Magento 2 store administration for the server owner.","fileCount":2,"zipByteSize":8192},{"version":"5.5.1","createdAt":"2026-04-24T18:08:33.564Z","changelog":"v5.5.1: Fix malformed registry metadata. binaries changed from name/description objects to plain strings. primary_credential moved from top-level into requires block. SKILL.md front matter and .clawhub.yaml now structurally identical. Resolves [object Object] entries in ClaWHub registry listing.","fileCount":2,"zipByteSize":7644},{"version":"5.5.0","createdAt":"2026-04-24T17:52:47.819Z","changelog":"v5.5.0: Final scanner remediation. curl -k replaced with --cacert MAGENTO_CA_CERT (MAGENTO_CA_CERT added to optional_env). StrictHostKeyChecking=accept-new replaced with yes. Fallback password-auth example removed. Contradictory security claim fixed (now accurately describes MYSQL_PWD pattern and HTTPS body pattern). Least-Privilege Recommendations section added. Zero curl -k, zero accept-new, zero fallback auth, zero mysql -pPASS, accurate security model throughout.","fileCount":2,"zipByteSize":7774},{"version":"5.4.0","createdAt":"2026-04-24T17:34:03.984Z","changelog":"v5.4.0: Fix all remaining scanner inconsistencies. SKILL.md front matter now exactly matches .clawhub.yaml (MAGENTO_SSH_KEY added to requires, MAGENTO_ADMIN_PASS required, all binaries have descriptions explaining usage including python3). mysql -pPASSWORD replaced with MYSQL_PWD=PASS mysql (password not visible in process list). primary_credential declared in both SKILL.md and .clawhub.yaml. Zero undeclared variables, zero passwords on command lines.","fileCount":2,"zipByteSize":7444},{"version":"5.3.0","createdAt":"2026-04-24T17:26:23.740Z","changelog":"v5.3.0: Fix manifest/body inconsistency (scanner medium confidence). Added complete requires: block to .clawhub.yaml with all 12 env vars. Added primary_credential field. MAGENTO_ADMIN_PASS moved to required. Removed CONFIG.md file reference and ssh-keygen/ssh-copy-id instructions. Zero passwords on command lines, zero sshpass, zero key generation. Env vars in SKILL.md exactly match declared vars in metadata.","fileCount":2,"zipByteSize":7358},{"version":"5.2.0","createdAt":"2026-04-24T17:12:25.407Z","changelog":"v5.2.0: VirusTotal remediation. Replaced sshpass with SSH key auth (ssh -i KEY). Replaced echo PASS | sudo -S with passwordless sudo. Removed MAGENTO_SSH_PASS and MAGENTO_SUDO_PASS. Added MAGENTO_SSH_KEY as required. Added auth_method: ssh-key-only and prompt_injection_mitigation to metadata. No sshpass binary required. Zero passwords on command lines.","fileCount":2,"zipByteSize":7481}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1747h3dssx5wbb4xxpn85vtsd83gnax:magento-admin","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nj070574-gif-magento-admin/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nj070574-gif-magento-admin/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nj070574-gif-magento-admin/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nj070574-gif-magento-admin/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nj070574-gif-magento-admin/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nj070574-gif-magento-admin/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T20:59:28.821Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nj070574-gif-magento-admin/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nj070574-gif-magento-admin/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nj070574-gif-magento-admin/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nj070574-gif-magento-admin/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T15:56:59.507Z","emptyReason":null},"readme":"Skill: magento-admin\n\nOwner: nj070574-gif\n\nSummary: Complete Magento 2 store administration via SSH key auth, REST API, GraphQL, and direct DB access. For server owners on their own infrastructure. SSH key auth and passwordless sudo required.\n\nTags: latest:5.7.0\n\nVersion history:\n\nv5.7.0 | 2026-10-03T09:42:59.885Z | user\n\nv5.7.0 - Security hardening + fixes (verified against live Magento 2.4.9). Input Handling & Injection Safety guidance; TLS/CA-cert conditional handling (never -k); repaired Configuration section; PHP example aligned; health-check service-list superset documented; known_hosts pre-seed added to setup.\n\nv5.6.1 | 2026-04-24T19:51:53.555Z | user\n\nv5.6.1: Rewrote README to explain scanner high-risk rating. Leads with scanner check table showing all technical checks pass. Explains why high-risk is expected for a full admin tool. Security model, least-privilege, and who-should-install sections added.\n\nv5.6.0 | 2026-04-24T19:29:11.836Z | user\n\nv5.6.0: Acknowledge inherent high-privilege scope. Added risk_level: high + risk_acknowledged: true to security metadata. Added risk_justification. Added Intended Use and Risk Acknowledgement section to skill body. Removed 'arbitrary SQL' framing. This skill is high-privilege by design — it provides full Magento 2 store administration for the server owner.\n\nv5.5.1 | 2026-04-24T18:08:33.564Z | user\n\nv5.5.1: Fix malformed registry metadata. binaries changed from name/description objects to plain strings. primary_credential moved from top-level into requires block. SKILL.md front matter and .clawhub.yaml now structurally identical. Resolves [object Object] entries in ClaWHub registry listing.\n\nv5.5.0 | 2026-04-24T17:52:47.819Z | user\n\nv5.5.0: Final scanner remediation. curl -k replaced with --cacert MAGENTO_CA_CERT (MAGENTO_CA_CERT added to optional_env). StrictHostKeyChecking=accept-new replaced with yes. Fallback password-auth example removed. Contradictory security claim fixed (now accurately describes MYSQL_PWD pattern and HTTPS body pattern). Least-Privilege Recommendations section added. Zero curl -k, zero accept-new, zero fallback auth, zero mysql -pPASS, accurate security model throughout.\n\nv5.4.0 | 2026-04-24T17:34:03.984Z | user\n\nv5.4.0: Fix all remaining scanner inconsistencies. SKILL.md front matter now exactly matches .clawhub.yaml (MAGENTO_SSH_KEY added to requires, MAGENTO_ADMIN_PASS required, all binaries have descriptions explaining usage including python3). mysql -pPASSWORD replaced with MYSQL_PWD=PASS mysql (password not visible in process list). primary_credential declared in both SKILL.md and .clawhub.yaml. Zero undeclared variables, zero passwords on command lines.\n\nv5.3.0 | 2026-04-24T17:26:23.740Z | user\n\nv5.3.0: Fix manifest/body inconsistency (scanner medium confidence). Added complete requires: block to .clawhub.yaml with all 12 env vars. Added primary_credential field. MAGENTO_ADMIN_PASS moved to required. Removed CONFIG.md file reference and ssh-keygen/ssh-copy-id instructions. Zero passwords on command lines, zero sshpass, zero key generation. Env vars in SKILL.md exactly match declared vars in metadata.\n\nv5.2.0 | 2026-04-24T17:12:25.407Z | user\n\nv5.2.0: VirusTotal remediation. Replaced sshpass with SSH key auth (ssh -i KEY). Replaced echo PASS | sudo -S with passwordless sudo. Removed MAGENTO_SSH_PASS and MAGENTO_SUDO_PASS. Added MAGENTO_SSH_KEY as required. Added auth_method: ssh-key-only and prompt_injection_mitigation to metadata. No sshpass binary required. Zero passwords on command lines.\n\nv5.1.0 | 2026-04-24T15:33:25.997Z | user\n\nv5.1.0: Security scanner remediation. Added full metadata declaration (required env vars + binaries). SSH key auth now recommended with setup instructions. StrictHostKeyChecking changed to accept-new. Added security disclosure to .clawhub.yaml. Added overview and security notes sections. No functionality changes.\n\nv5.0.0 | 2026-04-20T13:54:33.293Z | user\n\nv5.0.0: Complete rewrite. SSH+REST API+GraphQL+DB. Orders CRUD, revenue reports, products, customers, email/SMTP, coupons, tax, shipping, import/export, security/2FA, arbitrary SQL, extension-specific commands (Dotdigital, Amazon Pay, Braintree, ShipperHQ, WeSupply, M2E, Meta). 33 sections, 1171 lines.\n\nArchive index:\n\nArchive v5.7.0: 3 files, 10834 bytes\n\nFiles: skill-card.md (1866b), SKILL.md (40686b), _meta.json (132b)\n\nFile v5.7.0:SKILL.md\n\n---\nname: magento-admin\nversion: \"5.7.0\"\ndescription: >\n  Complete Magento 2 store administration via SSH key auth, REST API, GraphQL,\n  and direct DB access. For server owners on their own infrastructure.\n  SSH key auth and passwordless sudo required.\nauthor: openclaw-community\nlicense: MIT\ntags: [magento, ecommerce, devops, store-admin, ssh, rest-api, graphql, composer]\n\nrequires:\n  primary_credential: MAGENTO_SSH_KEY\n  env:\n    - name: MAGENTO_HOST\n      description: Magento server IP or hostname\n    - name: MAGENTO_SSH_USER\n      description: SSH username (passwordless sudo required on server)\n    - name: MAGENTO_SSH_KEY\n      description: Path to SSH private key (e.g. ~/.ssh/magento_deploy)\n    - name: MAGENTO_WEB_ROOT\n      description: Magento installation path (e.g. /var/www/html/magento2)\n    - name: MAGENTO_PHP\n      description: PHP binary (e.g. /usr/bin/php8.4)\n    - name: MAGENTO_WEB_USER\n      description: Web server user (e.g. www-data)\n    - name: MAGENTO_DB_NAME\n      description: Database name\n    - name: MAGENTO_DB_USER\n      description: Database username\n    - name: MAGENTO_DB_PASS\n      description: Database password\n    - name: MAGENTO_BASE_URL\n      description: Store base URL (e.g. https://store.example.com)\n    - name: MAGENTO_ADMIN_USER\n      description: Magento admin username\n    - name: MAGENTO_ADMIN_PASS\n      description: Magento admin password (REST API token generation only)\n  optional_env:\n    - name: MAGENTO_CA_CERT\n      description: CA cert path for HTTPS (e.g. /opt/ssl/ca.crt)\n    - name: MAGENTO_OS_URL\n      description: OpenSearch URL (default http://127.0.0.1:9200)\n    - name: MAGENTO_ADMIN_PATH\n      description: Admin path (default admin)\n    - name: COMPOSER_PATH\n      description: Composer binary path (e.g. /usr/local/bin/composer)\n  binaries:\n    - ssh\n    - mysql\n    - curl\n    - redis-cli\n    - python3\n\nsecurity:\n  scope: owner-operated\n  risk_level: high\n  risk_acknowledged: true\n  risk_justification: >-\n    Full store admin requires SSH + DB + REST access by design. High privilege\n    is inherent and intentional. Install only on infrastructure you own.\n  auth_method: ssh-key-only\n  sudo_method: passwordless-sudoers\n  credential_handling: user-supplied-only\n  network_access: user-own-server-only\n  note: >\n    SSH key auth only. DB password via MYSQL_PWD env var (not in process args).\n    REST API password in HTTPS body only. All credentials user-supplied.\n    Connects only to MAGENTO_HOST. Nothing sent to third parties.\n\nprompt_injection_mitigation: >\n  Connection parameters come only from the fixed MAGENTO_* config variables and\n  are never taken from chat. User-supplied operands (order IDs, emails, SKUs,\n  module names, config paths, etc.) are validated against strict allowlist\n  patterns before substitution and refused if they do not match — see the\n  \"Input Handling & Injection Safety\" section. Never interpolate unvalidated\n  free-form text into a shell command, SQL statement, or URL.\n---\n\n# magento-admin v5.7 — Complete Magento 2 Administration\n\n## Overview\n\nThis skill gives an OpenClaw agent the ability to fully administer a Magento 2\nstore via SSH, REST API, GraphQL, and direct database access. It is designed\nfor use by the **server owner** on their own infrastructure.\n\nAll credentials are supplied by you in your private config file and are used\nonly to connect to your own server. Nothing is sent to third parties.\n\n## Security Notes\n\n- **SSH key auth recommended** over password auth where possible\n- All credentials are stored only in your private config, never in the skill itself\n- The skill connects only to the server you configure\n- Review all commands before enabling autonomous execution\n\n## Configuration\n\nSet the following variables in the `env` block of your private `openclaw.json`\n(never in the skill itself, never in chat). Every command below uses them as\nplaceholders that the agent substitutes at run time:\n\n| Variable | Description | Example |\n|---|---|---|\n| MAGENTO_HOST | Server IP or hostname | 10.0.1.50 |\n| MAGENTO_SSH_USER | SSH username | deploy |\n| MAGENTO_SSH_KEY | Path to SSH private key | ~/.ssh/magento_deploy |\n| MAGENTO_WEB_ROOT | Magento path | /var/www/html/magento2 |\n| MAGENTO_PHP | PHP binary | /usr/bin/php8.4 |\n| MAGENTO_WEB_USER | Web server user | www-data |\n| MAGENTO_DB_NAME | Database name | magento_db |\n| MAGENTO_DB_USER | DB username | magento_user |\n| MAGENTO_DB_PASS | DB password | *(your db password)* |\n| MAGENTO_BASE_URL | Store URL | https://store.example.com |\n| MAGENTO_ADMIN_PATH | Admin path | admin |\n| MAGENTO_ADMIN_USER | Admin username | admin |\n| MAGENTO_ADMIN_PASS | Admin password | *(your admin password)* |\n| MAGENTO_OS_URL | OpenSearch URL | http://127.0.0.1:9200 |\n| COMPOSER_PATH | Composer binary | /usr/local/bin/composer |\n\n## Recommended: SSH Key Authentication\n\nFor better security, set up SSH key auth instead of password auth:\n\n```bash\n\n\nssh -i ~/.ssh/magento_deploy -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"COMMAND\"\n```\n\n\n## Least-Privilege Recommendations\n\n- **DB user:** Create a dedicated MariaDB/MySQL user with SELECT, INSERT,\n  UPDATE, DELETE on the Magento DB only — not GRANT or CREATE.\n- **SSH user:** Restrict passwordless sudo to specific binaries if possible\n  (e.g. `php`, `systemctl restart`, `redis-cli`) rather than `ALL`.\n- **REST API:** MAGENTO_ADMIN_PASS is used only to obtain a short-lived\n  session token via the Magento REST API. Consider creating a dedicated\n  admin user with only the roles your agent needs.\n- **SSH key:** Use a dedicated key pair for the agent, not your personal key.\n\n## Input Handling & Injection Safety\n\nThe `MAGENTO_*` connection variables are trusted config. **Everything else that\ngoes into a command — order IDs, emails, SKUs, quantities, prices, usernames,\nmodule names, config paths, search terms, coupon codes, file paths — is an\noperand that may originate from a user request, and MUST be validated before it\nis substituted into any shell command, SQL statement, or URL.**\n\nBefore substituting a value, check it against the expected shape and **refuse\n(do not run the command) if it does not match**:\n\n| Operand | Allowed pattern | Notes |\n|---|---|---|\n| Order increment ID / entity ID | `^[0-9]+$` | Numeric only |\n| Email | `^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$` | Single address |\n| SKU | `^[A-Za-z0-9._-]+$` | No quotes/spaces/`;` |\n| Qty / price | `^[0-9]+(\\.[0-9]+)?$` | Numeric |\n| Admin/customer username | `^[A-Za-z0-9._@-]+$` | |\n| Module name | `^[A-Za-z0-9]+_[A-Za-z0-9]+$` | `Vendor_Module` |\n| Config path | `^[a-z0-9]+(_[a-z0-9]+)*(/[a-z0-9]+(_[a-z0-9]+)*)+$` | `section/group/field` |\n| Index/cache type ID | must be one of the documented IDs listed in this skill | reject anything else |\n| Composer package | `^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+(:\\^?[0-9.]+)?$` | |\n| Backup file path | `^/opt/magento_backups/[A-Za-z0-9._-]+\\.sql\\.gz$` | restore only from the backups dir |\n\nRules:\n\n- Never interpolate raw free-form text into an SQL `WHERE` clause. The order,\n  customer, and config lookups below take a validated ID/email/path only.\n- The generic \"Run a specific SQL query\" and \"config:set\" commands are\n  **owner-operated**: run them only with an explicit, reviewed value from the\n  store owner, never with text a chat user supplied verbatim.\n- If a required operand fails validation, stop and tell the user why rather\n  than attempting to sanitise it yourself.\n\n## TLS / CA Certificate\n\nREST and GraphQL calls use HTTPS. Handle the certificate like this:\n\n- If `MAGENTO_CA_CERT` is **set**, add `--cacert \"$MAGENTO_CA_CERT\"` to the\n  `curl` call (needed for an internal/self-signed CA). The command examples\n  below show this form.\n- If `MAGENTO_CA_CERT` is **not set**, omit the `--cacert` option entirely and\n  rely on the system CA store (correct for a public cert, e.g. Let's Encrypt).\n- **Never** use `curl -k` / `--insecure` — that disables verification and is a\n  genuine MITM risk, not just a scanner flag.\n\n## SSH Patterns\n\n```bash\nssh -i ~/.ssh/magento_deploy MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento COMMAND 2>&1\"\n```\n\n\n**DB queries:**\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'QUERY' 2>&1\"\n```\n\n**REST API — get token then use it:**\n```bash\nTOKEN=$(ssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n   -H 'Content-Type: application/json' \\\n   -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"'\")\n```\n\n**Composer:**\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH COMMAND 2>&1'\"\n```\n\n---\n\n## FULL HEALTH CHECK\n\nThe `SERVICES` line probes a superset of common service names with\n`systemctl is-active`; services your stack doesn't use (e.g. `nginx` on an\nApache box, or `php8.3-fpm` when you run 8.4) simply report `inactive` — that\nis expected, not an error. Tested against Magento 2.4.9 on Apache + PHP 8.4 +\nMariaDB + OpenSearch + Redis.\n\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\necho '=== VERSION ===' && sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento --version 2>&1\necho '=== MODE ===' && sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento deploy:mode:show 2>&1\necho '=== SERVICES ===' && sudo systemctl is-active apache2 nginx mariadb mysql redis-server opensearch php8.3-fpm php8.4-fpm 2>/dev/null\necho '=== LOAD ===' && uptime\necho '=== MEMORY ===' && free -h | grep Mem\necho '=== DISK ===' && df -h MAGENTO_WEB_ROOT | tail -1\necho '=== OPENSEARCH ===' && curl -s MAGENTO_OS_URL/_cluster/health 2>/dev/null | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d[\\\"status\\\"])'\necho '=== REDIS ===' && redis-cli ping && redis-cli info keyspace\necho '=== CRON ===' && MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT status,COUNT(*) FROM cron_schedule WHERE scheduled_at>DATE_SUB(NOW(),INTERVAL 2 HOUR) GROUP BY status;' 2>&1\necho '=== ERRORS ===' && tail -3 MAGENTO_WEB_ROOT/var/log/exception.log 2>/dev/null | grep -c CRITICAL || echo 0\n\" 2>&1\n```\n\n---\n\n## CACHE\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:status 2>&1\"\n```\n\nFlush all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\"\n```\n\nClean specific type (replace TYPE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:clean TYPE 2>&1\"\n```\nTypes: config layout block_html collections reflection db_ddl compiled_config eav customer_notification full_page config_integration config_integration_api translate config_webservice graphql_query_resolver_result\n\nRedis flush by DB (0=config 1=page 2=sessions):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"redis-cli -n 0 FLUSHDB && echo cache_cleared\"\n```\n\n---\n\n## INDEXING\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:status 2>&1\"\n```\n\nReindex all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex 2>&1\"\n```\n\nReindex specific (replace INDEXER_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex INDEXER_ID 2>&1\"\n```\nIDs: cataloginventory_stock catalog_category_product catalog_product_category catalog_product_price catalog_product_attribute catalogsearch_fulltext catalogrule_rule catalogrule_product customer_grid design_config_grid inventory\n\nRebuild OpenSearch (search broken):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  curl -s -X PUT 'MAGENTO_OS_URL/*/_settings' -H 'Content-Type: application/json' -d '{\\\"index\\\":{\\\"number_of_replicas\\\":0}}' 2>/dev/null\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reset catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## CRON\n\nRun now:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cron:run 2>&1\"\n```\n\nBacklog summary:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT status,COUNT(*) AS cnt FROM cron_schedule GROUP BY status ORDER BY cnt DESC;' 2>&1\"\n```\n\nTop failing jobs:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT job_code,COUNT(*) as cnt,MAX(messages) as err FROM cron_schedule WHERE status=\\\"error\\\" GROUP BY job_code ORDER BY cnt DESC LIMIT 10;' 2>&1\"\n```\n\nClear old error/missed history:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'DELETE FROM cron_schedule WHERE status IN (\\\"error\\\",\\\"missed\\\") AND scheduled_at<DATE_SUB(NOW(),INTERVAL 1 DAY);' 2>&1\"\n```\n\nInstall crontab:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cron:install 2>&1\"\n```\n\n---\n\n## MAINTENANCE MODE\n\n```bash\n# Enable\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\"\n# Disable\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\"\n```\n\n---\n\n## ORDERS\n\nRevenue today:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE DATE(created_at)=CURDATE() AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nRevenue this week:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE created_at>=DATE_SUB(NOW(),INTERVAL 7 DAY) AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nRevenue this month:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE YEAR(created_at)=YEAR(NOW()) AND MONTH(created_at)=MONTH(NOW()) AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nLast 10 orders:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT increment_id,customer_email,grand_total,status,created_at FROM sales_order ORDER BY created_at DESC LIMIT 10;' 2>&1\"\n```\n\nOrder detail (replace ORDERID with increment_id):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT o.increment_id,o.customer_email,o.grand_total,o.status,o.state,o.created_at,a.street,a.city,a.postcode FROM sales_order o LEFT JOIN sales_order_address a ON o.entity_id=a.parent_id AND a.address_type=\\\"shipping\\\" WHERE o.increment_id=\\\"ORDERID\\\";' 2>&1\"\n```\n\nCancel order (REST API — replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/orders/ORDER_ENTITY_ID/cancel \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" 2>/dev/null\n\"\n```\n\nInvoice order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/invoice \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"capture\\\":true,\\\"notify\\\":true}' 2>/dev/null\n\"\n```\n\nShip order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/ship \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"notify\\\":true}' 2>/dev/null\n\"\n```\n\nRefund order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/refund \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"notify\\\":true,\\\"arguments\\\":{\\\"shipping_amount\\\":0,\\\"adjustment_positive\\\":0,\\\"adjustment_negative\\\":0}}' 2>/dev/null\n\"\n```\n\nAbandoned carts today:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT entity_id,customer_email,ROUND(grand_total,2) as value,items_count,updated_at FROM quote WHERE is_active=1 AND items_count>0 AND DATE(updated_at)=CURDATE() AND customer_email IS NOT NULL ORDER BY updated_at DESC LIMIT 20;' 2>&1\"\n```\n\nSales report by day (last 30 days):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT DATE(created_at) as day,COUNT(*) as orders,ROUND(SUM(grand_total),2) as revenue FROM sales_order WHERE created_at>=DATE_SUB(NOW(),INTERVAL 30 DAY) AND state <> \\\"canceled\\\" GROUP BY DATE(created_at) ORDER BY day DESC;' 2>&1\"\n```\n\n---\n\n## PRODUCTS\n\nTotal count by type:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as total,type_id FROM catalog_product_entity GROUP BY type_id;' 2>&1\"\n```\n\nOut of stock:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT cpe.sku,csi.qty FROM catalog_product_entity cpe JOIN cataloginventory_stock_item csi ON cpe.entity_id=csi.product_id WHERE csi.is_in_stock=0 OR csi.qty<=0 ORDER BY cpe.sku LIMIT 30;' 2>&1\"\n```\n\nUpdate stock via REST (replace SKU and QTY):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/products/SKU/stockItems/1 \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"stockItem\\\":{\\\"qty\\\":QTY,\\\"is_in_stock\\\":true}}' 2>/dev/null\n\"\n```\n\nUpdate product price via REST (replace SKU and PRICE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/products/SKU \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"product\\\":{\\\"sku\\\":\\\"SKU\\\",\\\"price\\\":PRICE}}' 2>/dev/null\n\"\n```\n\n---\n\n## CUSTOMERS\n\nFind by email (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT entity_id,firstname,lastname,email,created_at,is_active FROM customer_entity WHERE email=\\\"EMAIL\\\";' 2>&1\"\n```\n\nCustomer LTV (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as ltv FROM sales_order WHERE customer_email=\\\"EMAIL\\\" AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nTop 10 customers by revenue:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT customer_email,COUNT(*) as orders,ROUND(SUM(grand_total),2) as ltv FROM sales_order WHERE state <> \\\"canceled\\\" GROUP BY customer_email ORDER BY ltv DESC LIMIT 10;' 2>&1\"\n```\n\nReset customer password via REST (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/customers/password \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"email\\\":\\\"EMAIL\\\",\\\"template\\\":\\\"email_reset\\\",\\\"websiteId\\\":1}' 2>/dev/null\n\"\n```\n\n---\n\n## ADMIN USERS\n\nList all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT user_id,username,email,is_active,failures_num,lock_expires FROM admin_user;' 2>&1\"\n```\n\nUnlock admin (replace USERNAME):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento admin:user:unlock USERNAME 2>&1\n  redis-cli -n 2 FLUSHDB\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nCreate admin user (owner use — use dedicated limited-role account):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento admin:user:create --admin-firstname=FIRST --admin-lastname=LAST --admin-email=EMAIL --admin-user=USERNAME --admin-password=PASSWORD 2>&1\"\n```\n\n---\n\n## CONFIGURATION\n\nShow config path (replace PATH):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento config:show PATH 2>&1\"\n```\n\nSet config value (replace PATH and VALUE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento config:set PATH VALUE 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nRaw DB config lookup (replace SEARCH):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT scope,scope_id,path,value FROM core_config_data WHERE path LIKE \\\"%SEARCH%\\\" ORDER BY scope,scope_id;' 2>&1\"\n```\n\nMulti-store list:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT w.name as website,g.name as store_group,s.name as store,s.code FROM store s JOIN store_group g ON s.group_id=g.group_id JOIN store_website w ON g.website_id=w.website_id ORDER BY w.website_id,g.group_id;' 2>&1\"\n```\n\n---\n\n## EMAIL & SMTP\n\nSMTP config:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT path,value FROM core_config_data WHERE path LIKE \\\"%smtp%\\\" OR path LIKE \\\"%trans_email%\\\" ORDER BY path;' 2>&1\"\n```\n\nTest send (replace RECIPIENT):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento sparsh_smtp:test-mail --recipient=RECIPIENT 2>&1\"\n```\n\n---\n\n## PRICE RULES & COUPONS\n\nActive cart price rules:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT rule_id,name,discount_amount,coupon_type,is_active FROM salesrule WHERE is_active=1 ORDER BY rule_id;' 2>&1\"\n```\n\nCoupon usage (replace COUPON_CODE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT c.code,c.times_used,c.usage_limit,r.name FROM salesrule_coupon c JOIN salesrule r ON c.rule_id=r.rule_id WHERE c.code=\\\"COUPON_CODE\\\";' 2>&1\"\n```\n\nGenerate coupons via REST (replace RULE_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/salesRules/RULE_ID/coupons/generate \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"couponSpec\\\":{\\\"rule_id\\\":RULE_ID,\\\"qty\\\":5,\\\"length\\\":10,\\\"format\\\":\\\"alphanum\\\",\\\"prefix\\\":\\\"PROMO-\\\"}}' 2>/dev/null\n\"\n```\n\n---\n\n## MODULES\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento module:status 2>&1\"\n```\n\nEnable module (replace Vendor_Module):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento module:enable Vendor_Module 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nDisable module:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento module:disable Vendor_Module 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## COMPOSER — EXTENSIONS\n\nInstall extension (replace vendor/package:^version):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH require vendor/package:^version --no-interaction 2>&1'\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:di:compile 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:static-content:deploy -f 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\nRemove extension:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH remove vendor/package --no-interaction 2>&1'\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\n---\n\n## DEPLOYMENT\n\nFull deploy sequence:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:di:compile 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:static-content:deploy -f 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\n---\n\n## GRAPHQL\n\nStore config:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/graphql -H 'Content-Type: application/json' \\\n   -d '{\\\"query\\\":\\\"{storeConfig{store_code store_name base_url locale default_display_currency_code}}\\\"}' 2>/dev/null | python3 -m json.tool\"\n```\n\nProduct search (replace SEARCH_TERM):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/graphql -H 'Content-Type: application/json' \\\n   -d '{\\\"query\\\":\\\"{products(search:\\\\\\\"SEARCH_TERM\\\\\\\",pageSize:5){items{sku name price{regularPrice{amount{value currency}}}}}}\\\"}' 2>/dev/null | python3 -m json.tool\"\n```\n\nCategory list:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/graphql -H 'Content-Type: application/json' \\\n   -d '{\\\"query\\\":\\\"{categoryList{id name url_key level children{id name url_key}}}\\\"}' 2>/dev/null | python3 -m json.tool\"\n```\n\n---\n\n## BACKUP & RESTORE\n\nDB backup:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  TS=\\$(date +%Y%m%d_%H%M%S)\n  mkdir -p /opt/magento_backups\n  MYSQL_PWD=MAGENTO_DB_PASS mysqldump -uMAGENTO_DB_USER MAGENTO_DB_NAME | gzip > /opt/magento_backups/db_\\${TS}.sql.gz\n  ls -lh /opt/magento_backups/db_\\${TS}.sql.gz && echo BACKUP_DONE\n\"\n```\n\nList backups:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"ls -lhrt /opt/magento_backups/ 2>/dev/null | tail -10\"\n```\n\nRestore DB (replace BACKUPFILE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  gunzip -c BACKUPFILE | MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME && echo DB_RESTORED\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\n---\n\n## DATABASE QUERIES\n\nDB size and largest tables:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT table_schema as db,ROUND(SUM(data_length+index_length)/1024/1024,1) as MB FROM information_schema.tables WHERE table_schema=database() GROUP BY table_schema;' 2>&1\n  MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT table_name,ROUND((data_length+index_length)/1024/1024,1) as MB FROM information_schema.tables WHERE table_schema=database() ORDER BY MB DESC LIMIT 15;' 2>&1\n\"\n```\n\nRun a specific SQL query (owner use — verify query before execution):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT ...; -- replace with specific query' 2>&1\"\n```\n\nPurge old log tables:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'DELETE FROM report_event WHERE logged_at<DATE_SUB(NOW(),INTERVAL 30 DAY); DELETE FROM customer_visitor WHERE last_visit_at<DATE_SUB(NOW(),INTERVAL 1 DAY); SELECT \\\"Done\\\";' 2>&1\"\n```\n\nOptimize slow tables:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'OPTIMIZE TABLE cron_schedule,quote,report_event,customer_visitor;' 2>&1\"\n```\n\n---\n\n## LOGS\n\nException log:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"tail -50 MAGENTO_WEB_ROOT/var/log/exception.log 2>/dev/null\"\n```\n\nSystem log:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"tail -30 MAGENTO_WEB_ROOT/var/log/system.log 2>/dev/null\"\n```\n\nAll log files with sizes:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"ls -lh MAGENTO_WEB_ROOT/var/log/ 2>/dev/null | sort -k5 -hr | head -20\"\n```\n\n---\n\n## SERVICES\n\nCheck all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo systemctl is-active apache2 nginx mariadb mysql redis-server opensearch 2>/dev/null\"\n```\n\nRestart all (safe order):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo systemctl restart mariadb mysql redis-server 2>&1\n  sleep 5\n  sudo systemctl restart apache2 nginx 2>&1\n  echo ALL_RESTARTED\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## OPENSEARCH\n\nHealth:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s MAGENTO_OS_URL/_cluster/health 2>/dev/null | python3 -m json.tool\"\n```\n\nList indices:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s 'MAGENTO_OS_URL/_cat/indices?v' 2>/dev/null\"\n```\n\n---\n\n## SECURITY\n\n2FA status:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT u.username,u.email,t.encoded_config IS NOT NULL as has_2fa FROM admin_user u LEFT JOIN tfa_user_config t ON u.user_id=t.user_id;' 2>&1\"\n```\n\nReset 2FA (replace USERNAME):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento security:tfa:reset USERNAME google 2>&1\"\n```\n\n---\n\n## AUTO-HEALING\n\nSite slow / high load:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  echo LOAD: \\$(cat /proc/loadavg)\n  MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e \\\"UPDATE cron_schedule SET status='missed' WHERE status='running' AND executed_at<DATE_SUB(NOW(),INTERVAL 2 HOUR);\\\" 2>&1\n  sudo pkill -f 'php.*cron:run' 2>/dev/null || true\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  echo NEW_LOAD: \\$(cat /proc/loadavg)\n\"\n```\n\nAdmin locked out:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento admin:user:unlock MAGENTO_ADMIN_USER 2>&1\n  redis-cli -n 2 FLUSHDB\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nSearch broken:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  curl -s -X PUT 'MAGENTO_OS_URL/*/_settings' -H 'Content-Type: application/json' -d '{\\\"index\\\":{\\\"number_of_replicas\\\":0}}' 2>/dev/null\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reset catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## MESSAGE QUEUE\n\nList consumers:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento queue:consumers:list 2>&1\"\n```\n\n---\n\n## Intended Use and Risk Acknowledgement\n\nThis skill is designed for **server owners** administering their own Magento 2\ninstallation. The broad privilege scope (SSH, DB, REST admin) is intentional\nand required for full store administration.\n\n**This skill should not be installed if:**\n- You do not own and control MAGENTO_HOST\n- You are not the Magento store administrator\n- You have not reviewed the commands this skill will execute\n\n**Risk mitigations included:**\n- SSH key authentication only (no passwords on command lines)\n- DB password via MYSQL_PWD env var (not visible in process list)\n- All credentials user-supplied — nothing hardcoded in skill\n- Commands connect only to MAGENTO_HOST — no third-party calls\n- Least-privilege recommendations provided (see above section)\n- TLS verification enforced via CA store or `--cacert`; `-k` is never used\n- User-supplied operands validated against allowlist patterns before use\n  (see \"Input Handling & Injection Safety\") — connection params come only\n  from fixed `MAGENTO_*` config\n\n## AGENT INSTRUCTIONS\n\nWhen a user asks about their Magento store, use the commands above to retrieve\nreal data from the server and provide a clear, formatted response.\n\nAll commands connect only to the server configured in MAGENTO_HOST using\ncredentials supplied by the user. No data is sent to third parties.\n\nFormat responses with:\n- 🟢 OK  🔴 error  ⚠️ warning  📦 orders  🛍️ products  👥 customers\n- 💰 revenue  🔧 running  ✅ done  🔒 security  📧 email  🚚 shipping\n- Plain English summary with key numbers — avoid dumping raw output\n- If something is wrong, identify it and suggest the fix\n\n**Before running any command that includes a user-supplied value**, validate\nthat value against the pattern in the \"Input Handling & Injection Safety\"\nsection and refuse if it does not match. Connection parameters come only from\nthe fixed `MAGENTO_*` config; operands from chat are validated, never trusted\nraw. Never interpolate unvalidated free-form text into a shell command, SQL\nstatement, or URL, and never use `curl -k`.\n\nFile v5.7.0:_meta.json\n\n{\n  \"ownerId\": \"kn75wmg9n12pjn92x60r99d04983gkgd\",\n  \"slug\": \"magento-admin\",\n  \"version\": \"5.7.0\",\n  \"publishedAt\": 1791020579885\n}\n\nFile v5.7.0:skill-card.md\n\n## Description:\n\nHelps store owners administer their Magento 2 installations through SSH, REST, GraphQL, and database access.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[nj070574-gif](https://clawhub.ai/user/nj070574-gif)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMagento store owners and administrators use this skill to inspect and manage their own stores, including orders, products, configuration, maintenance, and backups.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Broad SSH, database, admin API, and sudo access can change or disrupt a store.\n\nMitigation: Install only on infrastructure you own and administer; limit granted privileges and review high-impact commands before execution.\n\nRisk: Refunds, admin-user creation, extension installs, database restores, service restarts, and raw SQL can have significant effects.\n\nMitigation: Require explicit owner approval for these operations before allowing autonomous execution.\n\n## Reference(s):\n\n- [Magento Admin skill on ClawHub](https://clawhub.ai/nj070574-gif/skills/magento-admin)\n- [Publisher profile on ClawHub](https://clawhub.ai/user/nj070574-gif)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, API calls, Configuration guidance, Text]\n\n**Output Format:** [Markdown with command examples and plain-language status summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires owner-supplied access to the Magento host, database, and admin API.]\n\n## Skill Version(s):\n\n5.7.0 (source: server release and skill frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v5.6.1: 3 files, 9350 bytes\n\nFiles: skill-card.md (2075b), SKILL.md (37128b), _meta.json (132b)\n\nFile v5.6.1:SKILL.md\n\n---\nname: magento-admin\nversion: \"5.6.1\"\ndescription: >\n  Complete Magento 2 store administration via SSH key auth, REST API, GraphQL,\n  and direct DB access. For server owners on their own infrastructure.\n  SSH key auth and passwordless sudo required.\nauthor: openclaw-community\nlicense: MIT\ntags: [magento, ecommerce, devops, store-admin, ssh, rest-api, graphql, composer]\n\nrequires:\n  primary_credential: MAGENTO_SSH_KEY\n  env:\n    - name: MAGENTO_HOST\n      description: Magento server IP or hostname\n    - name: MAGENTO_SSH_USER\n      description: SSH username (passwordless sudo required on server)\n    - name: MAGENTO_SSH_KEY\n      description: Path to SSH private key (e.g. ~/.ssh/magento_deploy)\n    - name: MAGENTO_WEB_ROOT\n      description: Magento installation path (e.g. /var/www/html/magento2)\n    - name: MAGENTO_PHP\n      description: PHP binary (e.g. /usr/bin/php8.4)\n    - name: MAGENTO_WEB_USER\n      description: Web server user (e.g. www-data)\n    - name: MAGENTO_DB_NAME\n      description: Database name\n    - name: MAGENTO_DB_USER\n      description: Database username\n    - name: MAGENTO_DB_PASS\n      description: Database password\n    - name: MAGENTO_BASE_URL\n      description: Store base URL (e.g. https://store.example.com)\n    - name: MAGENTO_ADMIN_USER\n      description: Magento admin username\n    - name: MAGENTO_ADMIN_PASS\n      description: Magento admin password (REST API token generation only)\n  optional_env:\n    - name: MAGENTO_CA_CERT\n      description: CA cert path for HTTPS (e.g. /opt/ssl/ca.crt)\n    - name: MAGENTO_OS_URL\n      description: OpenSearch URL (default http://127.0.0.1:9200)\n    - name: MAGENTO_ADMIN_PATH\n      description: Admin path (default admin)\n    - name: COMPOSER_PATH\n      description: Composer binary path (e.g. /usr/local/bin/composer)\n  binaries:\n    - ssh\n    - mysql\n    - curl\n    - redis-cli\n    - python3\n\nsecurity:\n  scope: owner-operated\n  risk_level: high\n  risk_acknowledged: true\n  risk_justification: >-\n    Full store admin requires SSH + DB + REST access by design. High privilege\n    is inherent and intentional. Install only on infrastructure you own.\n  auth_method: ssh-key-only\n  sudo_method: passwordless-sudoers\n  credential_handling: user-supplied-only\n  network_access: user-own-server-only\n  note: >\n    SSH key auth only. DB password via MYSQL_PWD env var (not in process args).\n    REST API password in HTTPS body only. All credentials user-supplied.\n    Connects only to MAGENTO_HOST. Nothing sent to third parties.\n\nprompt_injection_mitigation: >\n  All commands use fixed config variables only. Free-form user input is\n  never interpolated into shell commands.\n---\n\n# magento-admin v5.6 — Complete Magento 2 Administration\n\n## Overview\n\nThis skill gives an OpenClaw agent the ability to fully administer a Magento 2\nstore via SSH, REST API, GraphQL, and direct database access. It is designed\nfor use by the **server owner** on their own infrastructure.\n\nAll credentials are supplied by you in your private config file and are used\nonly to connect to your own server. Nothing is sent to third parties.\n\n## Security Notes\n\n- **SSH key auth recommended** over password auth where possible\n- All credentials are stored only in your private config, never in the skill itself\n- The skill connects only to the server you configure\n- Review all commands before enabling autonomous execution\n\n## Configuration\n\nCreate a private config file at:\nSet the following variables in your openclaw.json env block:\n\nSet these variables — all commands in this skill use them as placeholders:\n\n| Variable | Description | Example |\n|---|---|---|\n| MAGENTO_HOST | Server IP or hostname | 10.0.1.50 |\n| MAGENTO_SSH_USER | SSH username | deploy |\n| MAGENTO_SSH_KEY | Path to SSH private key | ~/.ssh/magento_deploy |\n| MAGENTO_WEB_ROOT | Magento path | /var/www/html/magento2 |\n| MAGENTO_PHP | PHP binary | /usr/bin/php8.3 |\n| MAGENTO_WEB_USER | Web server user | www-data |\n| MAGENTO_DB_NAME | Database name | magento_db |\n| MAGENTO_DB_USER | DB username | magento_user |\n| MAGENTO_DB_PASS | DB password | *(your db password)* |\n| MAGENTO_BASE_URL | Store URL | https://store.example.com |\n| MAGENTO_ADMIN_PATH | Admin path | admin |\n| MAGENTO_ADMIN_USER | Admin username | admin |\n| MAGENTO_ADMIN_PASS | Admin password | *(your admin password)* |\n| MAGENTO_OS_URL | OpenSearch URL | http://127.0.0.1:9200 |\n| COMPOSER_PATH | Composer binary | /usr/local/bin/composer |\n\n## Recommended: SSH Key Authentication\n\nFor better security, set up SSH key auth instead of password auth:\n\n```bash\n\n\nssh -i ~/.ssh/magento_deploy -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"COMMAND\"\n```\n\n\n## Least-Privilege Recommendations\n\n- **DB user:** Create a dedicated MariaDB/MySQL user with SELECT, INSERT,\n  UPDATE, DELETE on the Magento DB only — not GRANT or CREATE.\n- **SSH user:** Restrict passwordless sudo to specific binaries if possible\n  (e.g. `php`, `systemctl restart`, `redis-cli`) rather than `ALL`.\n- **REST API:** MAGENTO_ADMIN_PASS is used only to obtain a short-lived\n  session token via the Magento REST API. Consider creating a dedicated\n  admin user with only the roles your agent needs.\n- **SSH key:** Use a dedicated key pair for the agent, not your personal key.\n## SSH Patterns\n\n```bash\nssh -i ~/.ssh/magento_deploy MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento COMMAND 2>&1\"\n```\n\n\n**DB queries:**\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'QUERY' 2>&1\"\n```\n\n**REST API — get token then use it:**\n```bash\nTOKEN=$(ssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n   -H 'Content-Type: application/json' \\\n   -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"'\")\n```\n\n**Composer:**\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH COMMAND 2>&1'\"\n```\n\n---\n\n## FULL HEALTH CHECK\n\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\necho '=== VERSION ===' && sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento --version 2>&1\necho '=== MODE ===' && sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento deploy:mode:show 2>&1\necho '=== SERVICES ===' && sudo systemctl is-active apache2 nginx mariadb mysql redis-server opensearch php8.3-fpm php8.4-fpm 2>/dev/null\necho '=== LOAD ===' && uptime\necho '=== MEMORY ===' && free -h | grep Mem\necho '=== DISK ===' && df -h MAGENTO_WEB_ROOT | tail -1\necho '=== OPENSEARCH ===' && curl -s MAGENTO_OS_URL/_cluster/health 2>/dev/null | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d[\\\"status\\\"])'\necho '=== REDIS ===' && redis-cli ping && redis-cli info keyspace\necho '=== CRON ===' && MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT status,COUNT(*) FROM cron_schedule WHERE scheduled_at>DATE_SUB(NOW(),INTERVAL 2 HOUR) GROUP BY status;' 2>&1\necho '=== ERRORS ===' && tail -3 MAGENTO_WEB_ROOT/var/log/exception.log 2>/dev/null | grep -c CRITICAL || echo 0\n\" 2>&1\n```\n\n---\n\n## CACHE\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:status 2>&1\"\n```\n\nFlush all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\"\n```\n\nClean specific type (replace TYPE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:clean TYPE 2>&1\"\n```\nTypes: config layout block_html collections reflection db_ddl compiled_config eav customer_notification full_page config_integration config_integration_api translate config_webservice graphql_query_resolver_result\n\nRedis flush by DB (0=config 1=page 2=sessions):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"redis-cli -n 0 FLUSHDB && echo cache_cleared\"\n```\n\n---\n\n## INDEXING\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:status 2>&1\"\n```\n\nReindex all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex 2>&1\"\n```\n\nReindex specific (replace INDEXER_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex INDEXER_ID 2>&1\"\n```\nIDs: cataloginventory_stock catalog_category_product catalog_product_category catalog_product_price catalog_product_attribute catalogsearch_fulltext catalogrule_rule catalogrule_product customer_grid design_config_grid inventory\n\nRebuild OpenSearch (search broken):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  curl -s -X PUT 'MAGENTO_OS_URL/*/_settings' -H 'Content-Type: application/json' -d '{\\\"index\\\":{\\\"number_of_replicas\\\":0}}' 2>/dev/null\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reset catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## CRON\n\nRun now:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cron:run 2>&1\"\n```\n\nBacklog summary:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT status,COUNT(*) AS cnt FROM cron_schedule GROUP BY status ORDER BY cnt DESC;' 2>&1\"\n```\n\nTop failing jobs:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT job_code,COUNT(*) as cnt,MAX(messages) as err FROM cron_schedule WHERE status=\\\"error\\\" GROUP BY job_code ORDER BY cnt DESC LIMIT 10;' 2>&1\"\n```\n\nClear old error/missed history:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'DELETE FROM cron_schedule WHERE status IN (\\\"error\\\",\\\"missed\\\") AND scheduled_at<DATE_SUB(NOW(),INTERVAL 1 DAY);' 2>&1\"\n```\n\nInstall crontab:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cron:install 2>&1\"\n```\n\n---\n\n## MAINTENANCE MODE\n\n```bash\n# Enable\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\"\n# Disable\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\"\n```\n\n---\n\n## ORDERS\n\nRevenue today:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE DATE(created_at)=CURDATE() AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nRevenue this week:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE created_at>=DATE_SUB(NOW(),INTERVAL 7 DAY) AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nRevenue this month:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE YEAR(created_at)=YEAR(NOW()) AND MONTH(created_at)=MONTH(NOW()) AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nLast 10 orders:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT increment_id,customer_email,grand_total,status,created_at FROM sales_order ORDER BY created_at DESC LIMIT 10;' 2>&1\"\n```\n\nOrder detail (replace ORDERID with increment_id):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT o.increment_id,o.customer_email,o.grand_total,o.status,o.state,o.created_at,a.street,a.city,a.postcode FROM sales_order o LEFT JOIN sales_order_address a ON o.entity_id=a.parent_id AND a.address_type=\\\"shipping\\\" WHERE o.increment_id=\\\"ORDERID\\\";' 2>&1\"\n```\n\nCancel order (REST API — replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/orders/ORDER_ENTITY_ID/cancel \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" 2>/dev/null\n\"\n```\n\nInvoice order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/invoice \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"capture\\\":true,\\\"notify\\\":true}' 2>/dev/null\n\"\n```\n\nShip order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/ship \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"notify\\\":true}' 2>/dev/null\n\"\n```\n\nRefund order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/refund \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"notify\\\":true,\\\"arguments\\\":{\\\"shipping_amount\\\":0,\\\"adjustment_positive\\\":0,\\\"adjustment_negative\\\":0}}' 2>/dev/null\n\"\n```\n\nAbandoned carts today:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT entity_id,customer_email,ROUND(grand_total,2) as value,items_count,updated_at FROM quote WHERE is_active=1 AND items_count>0 AND DATE(updated_at)=CURDATE() AND customer_email IS NOT NULL ORDER BY updated_at DESC LIMIT 20;' 2>&1\"\n```\n\nSales report by day (last 30 days):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT DATE(created_at) as day,COUNT(*) as orders,ROUND(SUM(grand_total),2) as revenue FROM sales_order WHERE created_at>=DATE_SUB(NOW(),INTERVAL 30 DAY) AND state <> \\\"canceled\\\" GROUP BY DATE(created_at) ORDER BY day DESC;' 2>&1\"\n```\n\n---\n\n## PRODUCTS\n\nTotal count by type:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as total,type_id FROM catalog_product_entity GROUP BY type_id;' 2>&1\"\n```\n\nOut of stock:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT cpe.sku,csi.qty FROM catalog_product_entity cpe JOIN cataloginventory_stock_item csi ON cpe.entity_id=csi.product_id WHERE csi.is_in_stock=0 OR csi.qty<=0 ORDER BY cpe.sku LIMIT 30;' 2>&1\"\n```\n\nUpdate stock via REST (replace SKU and QTY):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/products/SKU/stockItems/1 \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"stockItem\\\":{\\\"qty\\\":QTY,\\\"is_in_stock\\\":true}}' 2>/dev/null\n\"\n```\n\nUpdate product price via REST (replace SKU and PRICE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/products/SKU \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"product\\\":{\\\"sku\\\":\\\"SKU\\\",\\\"price\\\":PRICE}}' 2>/dev/null\n\"\n```\n\n---\n\n## CUSTOMERS\n\nFind by email (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT entity_id,firstname,lastname,email,created_at,is_active FROM customer_entity WHERE email=\\\"EMAIL\\\";' 2>&1\"\n```\n\nCustomer LTV (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as ltv FROM sales_order WHERE customer_email=\\\"EMAIL\\\" AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nTop 10 customers by revenue:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT customer_email,COUNT(*) as orders,ROUND(SUM(grand_total),2) as ltv FROM sales_order WHERE state <> \\\"canceled\\\" GROUP BY customer_email ORDER BY ltv DESC LIMIT 10;' 2>&1\"\n```\n\nReset customer password via REST (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/customers/password \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"email\\\":\\\"EMAIL\\\",\\\"template\\\":\\\"email_reset\\\",\\\"websiteId\\\":1}' 2>/dev/null\n\"\n```\n\n---\n\n## ADMIN USERS\n\nList all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT user_id,username,email,is_active,failures_num,lock_expires FROM admin_user;' 2>&1\"\n```\n\nUnlock admin (replace USERNAME):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento admin:user:unlock USERNAME 2>&1\n  redis-cli -n 2 FLUSHDB\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nCreate admin user (owner use — use dedicated limited-role account):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento admin:user:create --admin-firstname=FIRST --admin-lastname=LAST --admin-email=EMAIL --admin-user=USERNAME --admin-password=PASSWORD 2>&1\"\n```\n\n---\n\n## CONFIGURATION\n\nShow config path (replace PATH):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento config:show PATH 2>&1\"\n```\n\nSet config value (replace PATH and VALUE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento config:set PATH VALUE 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nRaw DB config lookup (replace SEARCH):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT scope,scope_id,path,value FROM core_config_data WHERE path LIKE \\\"%SEARCH%\\\" ORDER BY scope,scope_id;' 2>&1\"\n```\n\nMulti-store list:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT w.name as website,g.name as store_group,s.name as store,s.code FROM store s JOIN store_group g ON s.group_id=g.group_id JOIN store_website w ON g.website_id=w.website_id ORDER BY w.website_id,g.group_id;' 2>&1\"\n```\n\n---\n\n## EMAIL & SMTP\n\nSMTP config:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT path,value FROM core_config_data WHERE path LIKE \\\"%smtp%\\\" OR path LIKE \\\"%trans_email%\\\" ORDER BY path;' 2>&1\"\n```\n\nTest send (replace RECIPIENT):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento sparsh_smtp:test-mail --recipient=RECIPIENT 2>&1\"\n```\n\n---\n\n## PRICE RULES & COUPONS\n\nActive cart price rules:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT rule_id,name,discount_amount,coupon_type,is_active FROM salesrule WHERE is_active=1 ORDER BY rule_id;' 2>&1\"\n```\n\nCoupon usage (replace COUPON_CODE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT c.code,c.times_used,c.usage_limit,r.name FROM salesrule_coupon c JOIN salesrule r ON c.rule_id=r.rule_id WHERE c.code=\\\"COUPON_CODE\\\";' 2>&1\"\n```\n\nGenerate coupons via REST (replace RULE_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/salesRules/RULE_ID/coupons/generate \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"couponSpec\\\":{\\\"rule_id\\\":RULE_ID,\\\"qty\\\":5,\\\"length\\\":10,\\\"format\\\":\\\"alphanum\\\",\\\"prefix\\\":\\\"PROMO-\\\"}}' 2>/dev/null\n\"\n```\n\n---\n\n## MODULES\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento module:status 2>&1\"\n```\n\nEnable module (replace Vendor_Module):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento module:enable Vendor_Module 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nDisable module:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento module:disable Vendor_Module 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## COMPOSER — EXTENSIONS\n\nInstall extension (replace vendor/package:^version):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH require vendor/package:^version --no-interaction 2>&1'\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:di:compile 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:static-content:deploy -f 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\nRemove extension:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH remove vendor/package --no-interaction 2>&1'\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\n---\n\n## DEPLOYMENT\n\nFull deploy sequence:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:di:compile 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:static-content:deploy -f 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\n---\n\n## GRAPHQL\n\nStore config:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/graphql -H 'Content-Type: application/json' \\\n   -d '{\\\"query\\\":\\\"{storeConfig{store_code store_name base_url locale default_display_currency_code}}\\\"}' 2>/dev/null | python3 -m json.tool\"\n```\n\nProduct search (replace SEARCH_TERM):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/graphql -H 'Content-Type: application/json' \\\n   -d '{\\\"query\\\":\\\"{products(search:\\\\\\\"SEARCH_TERM\\\\\\\",pageSize:5){items{sku name price{regularPrice{amount{value currency}}}}}}\\\"}' 2>/dev/null | python3 -m json.tool\"\n```\n\nCategory list:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/graphql -H 'Content-Type: application/json' \\\n   -d '{\\\"query\\\":\\\"{categoryList{id name url_key level children{id name url_key}}}\\\"}' 2>/dev/null | python3 -m json.tool\"\n```\n\n---\n\n## BACKUP & RESTORE\n\nDB backup:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  TS=\\$(date +%Y%m%d_%H%M%S)\n  mkdir -p /opt/magento_backups\n  MYSQL_PWD=MAGENTO_DB_PASS mysqldump -uMAGENTO_DB_USER MAGENTO_DB_NAME | gzip > /opt/magento_backups/db_\\${TS}.sql.gz\n  ls -lh /opt/magento_backups/db_\\${TS}.sql.gz && echo BACKUP_DONE\n\"\n```\n\nList backups:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"ls -lhrt /opt/magento_backups/ 2>/dev/null | tail -10\"\n```\n\nRestore DB (replace BACKUPFILE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  gunzip -c BACKUPFILE | MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME && echo DB_RESTORED\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\n---\n\n## DATABASE QUERIES\n\nDB size and largest tables:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT table_schema as db,ROUND(SUM(data_length+index_length)/1024/1024,1) as MB FROM information_schema.tables WHERE table_schema=database() GROUP BY table_schema;' 2>&1\n  MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT table_name,ROUND((data_length+index_length)/1024/1024,1) as MB FROM information_schema.tables WHERE table_schema=database() ORDER BY MB DESC LIMIT 15;' 2>&1\n\"\n```\n\nRun a specific SQL query (owner use — verify query before execution):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT ...; -- replace with specific query' 2>&1\"\n```\n\nPurge old log tables:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'DELETE FROM report_event WHERE logged_at<DATE_SUB(NOW(),INTERVAL 30 DAY); DELETE FROM customer_visitor WHERE last_visit_at<DATE_SUB(NOW(),INTERVAL 1 DAY); SELECT \\\"Done\\\";' 2>&1\"\n```\n\nOptimize slow tables:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'OPTIMIZE TABLE cron_schedule,quote,report_event,customer_visitor;' 2>&1\"\n```\n\n---\n\n## LOGS\n\nException log:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"tail -50 MAGENTO_WEB_ROOT/var/log/exception.log 2>/dev/null\"\n```\n\nSystem log:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"tail -30 MAGENTO_WEB_ROOT/var/log/system.log 2>/dev/null\"\n```\n\nAll log files with sizes:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"ls -lh MAGENTO_WEB_ROOT/var/log/ 2>/dev/null | sort -k5 -hr | head -20\"\n```\n\n---\n\n## SERVICES\n\nCheck all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo systemctl is-active apache2 nginx mariadb mysql redis-server opensearch 2>/dev/null\"\n```\n\nRestart all (safe order):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo systemctl restart mariadb mysql redis-server 2>&1\n  sleep 5\n  sudo systemctl restart apache2 nginx 2>&1\n  echo ALL_RESTARTED\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## OPENSEARCH\n\nHealth:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s MAGENTO_OS_URL/_cluster/health 2>/dev/null | python3 -m json.tool\"\n```\n\nList indices:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s 'MAGENTO_OS_URL/_cat/indices?v' 2>/dev/null\"\n```\n\n---\n\n## SECURITY\n\n2FA status:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT u.username,u.email,t.encoded_config IS NOT NULL as has_2fa FROM admin_user u LEFT JOIN tfa_user_config t ON u.user_id=t.user_id;' 2>&1\"\n```\n\nReset 2FA (replace USERNAME):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento security:tfa:reset USERNAME google 2>&1\"\n```\n\n---\n\n## AUTO-HEALING\n\nSite slow / high load:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  echo LOAD: \\$(cat /proc/loadavg)\n  MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e \\\"UPDATE cron_schedule SET status='missed' WHERE status='running' AND executed_at<DATE_SUB(NOW(),INTERVAL 2 HOUR);\\\" 2>&1\n  sudo pkill -f 'php.*cron:run' 2>/dev/null || true\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  echo NEW_LOAD: \\$(cat /proc/loadavg)\n\"\n```\n\nAdmin locked out:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento admin:user:unlock MAGENTO_ADMIN_USER 2>&1\n  redis-cli -n 2 FLUSHDB\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nSearch broken:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  curl -s -X PUT 'MAGENTO_OS_URL/*/_settings' -H 'Content-Type: application/json' -d '{\\\"index\\\":{\\\"number_of_replicas\\\":0}}' 2>/dev/null\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reset catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## MESSAGE QUEUE\n\nList consumers:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento queue:consumers:list 2>&1\"\n```\n\n---\n\n## Intended Use and Risk Acknowledgement\n\nThis skill is designed for **server owners** administering their own Magento 2\ninstallation. The broad privilege scope (SSH, DB, REST admin) is intentional\nand required for full store administration.\n\n**This skill should not be installed if:**\n- You do not own and control MAGENTO_HOST\n- You are not the Magento store administrator\n- You have not reviewed the commands this skill will execute\n\n**Risk mitigations included:**\n- SSH key authentication only (no passwords on command lines)\n- DB password via MYSQL_PWD env var (not visible in process list)\n- All credentials user-supplied — nothing hardcoded in skill\n- Commands connect only to MAGENTO_HOST — no third-party calls\n- Least-privilege recommendations provided (see above section)\n- prompt_injection_mitigation declared — commands use fixed vars only\n\n## AGENT INSTRUCTIONS\n\nWhen a user asks about their Magento store, use the commands above to retrieve\nreal data from the server and provide a clear, formatted response.\n\nAll commands connect only to the server configured in MAGENTO_HOST using\ncredentials supplied by the user. No data is sent to third parties.\n\nFormat responses with:\n- 🟢 OK  🔴 error  ⚠️ warning  📦 orders  🛍️ products  👥 customers\n- 💰 revenue  🔧 running  ✅ done  🔒 security  📧 email  🚚 shipping\n- Plain English summary with key numbers — avoid dumping raw output\n- If something is wrong, identify it and suggest the fix\n\nprompt_injection_mitigation: >\n  All commands use fixed configuration variables only. Free-form user\n  input is never interpolated into shell commands.\n\nFile v5.6.1:_meta.json\n\n{\n  \"ownerId\": \"kn75wmg9n12pjn92x60r99d04983gkgd\",\n  \"slug\": \"magento-admin\",\n  \"version\": \"5.6.1\",\n  \"publishedAt\": 1777060313555\n}\n\nFile v5.6.1:skill-card.md\n\n## Description:\n\nComplete Magento 2 store administration via SSH key auth, REST API, GraphQL, and direct DB access for server owners on their own infrastructure.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[nj070574-gif](https://clawhub.ai/user/nj070574-gif)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal Magento store owners and administrators use this skill to inspect, operate, and maintain their own Magento 2 installations through SSH, database queries, REST, GraphQL, Composer, and Magento CLI workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Broad SSH, database, REST, GraphQL, Composer, and Magento CLI access can change store state, customer data, orders, services, modules, and backups.\n\nMitigation: Install only on infrastructure the user owns and administers, use dedicated least-privilege accounts, and require manual approval for write, refund, password, service, Composer, and restore actions.\n\nRisk: Unsafe command templates for user-supplied values can make replacement values hazardous if they are not reviewed and escaped.\n\nMitigation: Validate and escape every replacement value before execution and prefer fixed, parameterized wrappers before allowing autonomous operation.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/nj070574-gif/skills/magento-admin)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with shell command, SQL, REST, and GraphQL request templates]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires user-supplied Magento server, SSH, database, and admin API configuration.]\n\n## Skill Version(s):\n\n5.6.1 (source: server release metadata and frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v5.6.0: 2 files, 8192 bytes\n\nFiles: SKILL.md (37128b), _meta.json (132b)\n\nFile v5.6.0:SKILL.md\n\n---\nname: magento-admin\nversion: \"5.6.0\"\ndescription: >\n  Complete Magento 2 store administration via SSH key auth, REST API, GraphQL,\n  and direct DB access. For server owners on their own infrastructure.\n  SSH key auth and passwordless sudo required.\nauthor: openclaw-community\nlicense: MIT\ntags: [magento, ecommerce, devops, store-admin, ssh, rest-api, graphql, composer]\n\nrequires:\n  primary_credential: MAGENTO_SSH_KEY\n  env:\n    - name: MAGENTO_HOST\n      description: Magento server IP or hostname\n    - name: MAGENTO_SSH_USER\n      description: SSH username (passwordless sudo required on server)\n    - name: MAGENTO_SSH_KEY\n      description: Path to SSH private key (e.g. ~/.ssh/magento_deploy)\n    - name: MAGENTO_WEB_ROOT\n      description: Magento installation path (e.g. /var/www/html/magento2)\n    - name: MAGENTO_PHP\n      description: PHP binary (e.g. /usr/bin/php8.4)\n    - name: MAGENTO_WEB_USER\n      description: Web server user (e.g. www-data)\n    - name: MAGENTO_DB_NAME\n      description: Database name\n    - name: MAGENTO_DB_USER\n      description: Database username\n    - name: MAGENTO_DB_PASS\n      description: Database password\n    - name: MAGENTO_BASE_URL\n      description: Store base URL (e.g. https://store.example.com)\n    - name: MAGENTO_ADMIN_USER\n      description: Magento admin username\n    - name: MAGENTO_ADMIN_PASS\n      description: Magento admin password (REST API token generation only)\n  optional_env:\n    - name: MAGENTO_CA_CERT\n      description: CA cert path for HTTPS (e.g. /opt/ssl/ca.crt)\n    - name: MAGENTO_OS_URL\n      description: OpenSearch URL (default http://127.0.0.1:9200)\n    - name: MAGENTO_ADMIN_PATH\n      description: Admin path (default admin)\n    - name: COMPOSER_PATH\n      description: Composer binary path (e.g. /usr/local/bin/composer)\n  binaries:\n    - ssh\n    - mysql\n    - curl\n    - redis-cli\n    - python3\n\nsecurity:\n  scope: owner-operated\n  risk_level: high\n  risk_acknowledged: true\n  risk_justification: >-\n    Full store admin requires SSH + DB + REST access by design. High privilege\n    is inherent and intentional. Install only on infrastructure you own.\n  auth_method: ssh-key-only\n  sudo_method: passwordless-sudoers\n  credential_handling: user-supplied-only\n  network_access: user-own-server-only\n  note: >\n    SSH key auth only. DB password via MYSQL_PWD env var (not in process args).\n    REST API password in HTTPS body only. All credentials user-supplied.\n    Connects only to MAGENTO_HOST. Nothing sent to third parties.\n\nprompt_injection_mitigation: >\n  All commands use fixed config variables only. Free-form user input is\n  never interpolated into shell commands.\n---\n\n# magento-admin v5.6 — Complete Magento 2 Administration\n\n## Overview\n\nThis skill gives an OpenClaw agent the ability to fully administer a Magento 2\nstore via SSH, REST API, GraphQL, and direct database access. It is designed\nfor use by the **server owner** on their own infrastructure.\n\nAll credentials are supplied by you in your private config file and are used\nonly to connect to your own server. Nothing is sent to third parties.\n\n## Security Notes\n\n- **SSH key auth recommended** over password auth where possible\n- All credentials are stored only in your private config, never in the skill itself\n- The skill connects only to the server you configure\n- Review all commands before enabling autonomous execution\n\n## Configuration\n\nCreate a private config file at:\nSet the following variables in your openclaw.json env block:\n\nSet these variables — all commands in this skill use them as placeholders:\n\n| Variable | Description | Example |\n|---|---|---|\n| MAGENTO_HOST | Server IP or hostname | 10.0.1.50 |\n| MAGENTO_SSH_USER | SSH username | deploy |\n| MAGENTO_SSH_KEY | Path to SSH private key | ~/.ssh/magento_deploy |\n| MAGENTO_WEB_ROOT | Magento path | /var/www/html/magento2 |\n| MAGENTO_PHP | PHP binary | /usr/bin/php8.3 |\n| MAGENTO_WEB_USER | Web server user | www-data |\n| MAGENTO_DB_NAME | Database name | magento_db |\n| MAGENTO_DB_USER | DB username | magento_user |\n| MAGENTO_DB_PASS | DB password | *(your db password)* |\n| MAGENTO_BASE_URL | Store URL | https://store.example.com |\n| MAGENTO_ADMIN_PATH | Admin path | admin |\n| MAGENTO_ADMIN_USER | Admin username | admin |\n| MAGENTO_ADMIN_PASS | Admin password | *(your admin password)* |\n| MAGENTO_OS_URL | OpenSearch URL | http://127.0.0.1:9200 |\n| COMPOSER_PATH | Composer binary | /usr/local/bin/composer |\n\n## Recommended: SSH Key Authentication\n\nFor better security, set up SSH key auth instead of password auth:\n\n```bash\n\n\nssh -i ~/.ssh/magento_deploy -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"COMMAND\"\n```\n\n\n## Least-Privilege Recommendations\n\n- **DB user:** Create a dedicated MariaDB/MySQL user with SELECT, INSERT,\n  UPDATE, DELETE on the Magento DB only — not GRANT or CREATE.\n- **SSH user:** Restrict passwordless sudo to specific binaries if possible\n  (e.g. `php`, `systemctl restart`, `redis-cli`) rather than `ALL`.\n- **REST API:** MAGENTO_ADMIN_PASS is used only to obtain a short-lived\n  session token via the Magento REST API. Consider creating a dedicated\n  admin user with only the roles your agent needs.\n- **SSH key:** Use a dedicated key pair for the agent, not your personal key.\n## SSH Patterns\n\n```bash\nssh -i ~/.ssh/magento_deploy MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento COMMAND 2>&1\"\n```\n\n\n**DB queries:**\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'QUERY' 2>&1\"\n```\n\n**REST API — get token then use it:**\n```bash\nTOKEN=$(ssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n   -H 'Content-Type: application/json' \\\n   -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"'\")\n```\n\n**Composer:**\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH COMMAND 2>&1'\"\n```\n\n---\n\n## FULL HEALTH CHECK\n\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\necho '=== VERSION ===' && sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento --version 2>&1\necho '=== MODE ===' && sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento deploy:mode:show 2>&1\necho '=== SERVICES ===' && sudo systemctl is-active apache2 nginx mariadb mysql redis-server opensearch php8.3-fpm php8.4-fpm 2>/dev/null\necho '=== LOAD ===' && uptime\necho '=== MEMORY ===' && free -h | grep Mem\necho '=== DISK ===' && df -h MAGENTO_WEB_ROOT | tail -1\necho '=== OPENSEARCH ===' && curl -s MAGENTO_OS_URL/_cluster/health 2>/dev/null | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d[\\\"status\\\"])'\necho '=== REDIS ===' && redis-cli ping && redis-cli info keyspace\necho '=== CRON ===' && MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT status,COUNT(*) FROM cron_schedule WHERE scheduled_at>DATE_SUB(NOW(),INTERVAL 2 HOUR) GROUP BY status;' 2>&1\necho '=== ERRORS ===' && tail -3 MAGENTO_WEB_ROOT/var/log/exception.log 2>/dev/null | grep -c CRITICAL || echo 0\n\" 2>&1\n```\n\n---\n\n## CACHE\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:status 2>&1\"\n```\n\nFlush all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\"\n```\n\nClean specific type (replace TYPE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:clean TYPE 2>&1\"\n```\nTypes: config layout block_html collections reflection db_ddl compiled_config eav customer_notification full_page config_integration config_integration_api translate config_webservice graphql_query_resolver_result\n\nRedis flush by DB (0=config 1=page 2=sessions):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"redis-cli -n 0 FLUSHDB && echo cache_cleared\"\n```\n\n---\n\n## INDEXING\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:status 2>&1\"\n```\n\nReindex all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex 2>&1\"\n```\n\nReindex specific (replace INDEXER_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex INDEXER_ID 2>&1\"\n```\nIDs: cataloginventory_stock catalog_category_product catalog_product_category catalog_product_price catalog_product_attribute catalogsearch_fulltext catalogrule_rule catalogrule_product customer_grid design_config_grid inventory\n\nRebuild OpenSearch (search broken):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  curl -s -X PUT 'MAGENTO_OS_URL/*/_settings' -H 'Content-Type: application/json' -d '{\\\"index\\\":{\\\"number_of_replicas\\\":0}}' 2>/dev/null\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reset catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## CRON\n\nRun now:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cron:run 2>&1\"\n```\n\nBacklog summary:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT status,COUNT(*) AS cnt FROM cron_schedule GROUP BY status ORDER BY cnt DESC;' 2>&1\"\n```\n\nTop failing jobs:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT job_code,COUNT(*) as cnt,MAX(messages) as err FROM cron_schedule WHERE status=\\\"error\\\" GROUP BY job_code ORDER BY cnt DESC LIMIT 10;' 2>&1\"\n```\n\nClear old error/missed history:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'DELETE FROM cron_schedule WHERE status IN (\\\"error\\\",\\\"missed\\\") AND scheduled_at<DATE_SUB(NOW(),INTERVAL 1 DAY);' 2>&1\"\n```\n\nInstall crontab:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cron:install 2>&1\"\n```\n\n---\n\n## MAINTENANCE MODE\n\n```bash\n# Enable\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\"\n# Disable\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\"\n```\n\n---\n\n## ORDERS\n\nRevenue today:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE DATE(created_at)=CURDATE() AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nRevenue this week:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE created_at>=DATE_SUB(NOW(),INTERVAL 7 DAY) AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nRevenue this month:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE YEAR(created_at)=YEAR(NOW()) AND MONTH(created_at)=MONTH(NOW()) AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nLast 10 orders:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT increment_id,customer_email,grand_total,status,created_at FROM sales_order ORDER BY created_at DESC LIMIT 10;' 2>&1\"\n```\n\nOrder detail (replace ORDERID with increment_id):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT o.increment_id,o.customer_email,o.grand_total,o.status,o.state,o.created_at,a.street,a.city,a.postcode FROM sales_order o LEFT JOIN sales_order_address a ON o.entity_id=a.parent_id AND a.address_type=\\\"shipping\\\" WHERE o.increment_id=\\\"ORDERID\\\";' 2>&1\"\n```\n\nCancel order (REST API — replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/orders/ORDER_ENTITY_ID/cancel \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" 2>/dev/null\n\"\n```\n\nInvoice order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/invoice \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"capture\\\":true,\\\"notify\\\":true}' 2>/dev/null\n\"\n```\n\nShip order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/ship \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"notify\\\":true}' 2>/dev/null\n\"\n```\n\nRefund order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/refund \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"notify\\\":true,\\\"arguments\\\":{\\\"shipping_amount\\\":0,\\\"adjustment_positive\\\":0,\\\"adjustment_negative\\\":0}}' 2>/dev/null\n\"\n```\n\nAbandoned carts today:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT entity_id,customer_email,ROUND(grand_total,2) as value,items_count,updated_at FROM quote WHERE is_active=1 AND items_count>0 AND DATE(updated_at)=CURDATE() AND customer_email IS NOT NULL ORDER BY updated_at DESC LIMIT 20;' 2>&1\"\n```\n\nSales report by day (last 30 days):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT DATE(created_at) as day,COUNT(*) as orders,ROUND(SUM(grand_total),2) as revenue FROM sales_order WHERE created_at>=DATE_SUB(NOW(),INTERVAL 30 DAY) AND state <> \\\"canceled\\\" GROUP BY DATE(created_at) ORDER BY day DESC;' 2>&1\"\n```\n\n---\n\n## PRODUCTS\n\nTotal count by type:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as total,type_id FROM catalog_product_entity GROUP BY type_id;' 2>&1\"\n```\n\nOut of stock:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT cpe.sku,csi.qty FROM catalog_product_entity cpe JOIN cataloginventory_stock_item csi ON cpe.entity_id=csi.product_id WHERE csi.is_in_stock=0 OR csi.qty<=0 ORDER BY cpe.sku LIMIT 30;' 2>&1\"\n```\n\nUpdate stock via REST (replace SKU and QTY):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/products/SKU/stockItems/1 \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"stockItem\\\":{\\\"qty\\\":QTY,\\\"is_in_stock\\\":true}}' 2>/dev/null\n\"\n```\n\nUpdate product price via REST (replace SKU and PRICE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/products/SKU \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"product\\\":{\\\"sku\\\":\\\"SKU\\\",\\\"price\\\":PRICE}}' 2>/dev/null\n\"\n```\n\n---\n\n## CUSTOMERS\n\nFind by email (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT entity_id,firstname,lastname,email,created_at,is_active FROM customer_entity WHERE email=\\\"EMAIL\\\";' 2>&1\"\n```\n\nCustomer LTV (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as ltv FROM sales_order WHERE customer_email=\\\"EMAIL\\\" AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nTop 10 customers by revenue:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT customer_email,COUNT(*) as orders,ROUND(SUM(grand_total),2) as ltv FROM sales_order WHERE state <> \\\"canceled\\\" GROUP BY customer_email ORDER BY ltv DESC LIMIT 10;' 2>&1\"\n```\n\nReset customer password via REST (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/customers/password \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"email\\\":\\\"EMAIL\\\",\\\"template\\\":\\\"email_reset\\\",\\\"websiteId\\\":1}' 2>/dev/null\n\"\n```\n\n---\n\n## ADMIN USERS\n\nList all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT user_id,username,email,is_active,failures_num,lock_expires FROM admin_user;' 2>&1\"\n```\n\nUnlock admin (replace USERNAME):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento admin:user:unlock USERNAME 2>&1\n  redis-cli -n 2 FLUSHDB\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nCreate admin user (owner use — use dedicated limited-role account):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento admin:user:create --admin-firstname=FIRST --admin-lastname=LAST --admin-email=EMAIL --admin-user=USERNAME --admin-password=PASSWORD 2>&1\"\n```\n\n---\n\n## CONFIGURATION\n\nShow config path (replace PATH):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento config:show PATH 2>&1\"\n```\n\nSet config value (replace PATH and VALUE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento config:set PATH VALUE 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nRaw DB config lookup (replace SEARCH):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT scope,scope_id,path,value FROM core_config_data WHERE path LIKE \\\"%SEARCH%\\\" ORDER BY scope,scope_id;' 2>&1\"\n```\n\nMulti-store list:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT w.name as website,g.name as store_group,s.name as store,s.code FROM store s JOIN store_group g ON s.group_id=g.group_id JOIN store_website w ON g.website_id=w.website_id ORDER BY w.website_id,g.group_id;' 2>&1\"\n```\n\n---\n\n## EMAIL & SMTP\n\nSMTP config:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT path,value FROM core_config_data WHERE path LIKE \\\"%smtp%\\\" OR path LIKE \\\"%trans_email%\\\" ORDER BY path;' 2>&1\"\n```\n\nTest send (replace RECIPIENT):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento sparsh_smtp:test-mail --recipient=RECIPIENT 2>&1\"\n```\n\n---\n\n## PRICE RULES & COUPONS\n\nActive cart price rules:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT rule_id,name,discount_amount,coupon_type,is_active FROM salesrule WHERE is_active=1 ORDER BY rule_id;' 2>&1\"\n```\n\nCoupon usage (replace COUPON_CODE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT c.code,c.times_used,c.usage_limit,r.name FROM salesrule_coupon c JOIN salesrule r ON c.rule_id=r.rule_id WHERE c.code=\\\"COUPON_CODE\\\";' 2>&1\"\n```\n\nGenerate coupons via REST (replace RULE_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/salesRules/RULE_ID/coupons/generate \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"couponSpec\\\":{\\\"rule_id\\\":RULE_ID,\\\"qty\\\":5,\\\"length\\\":10,\\\"format\\\":\\\"alphanum\\\",\\\"prefix\\\":\\\"PROMO-\\\"}}' 2>/dev/null\n\"\n```\n\n---\n\n## MODULES\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento module:status 2>&1\"\n```\n\nEnable module (replace Vendor_Module):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento module:enable Vendor_Module 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nDisable module:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento module:disable Vendor_Module 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## COMPOSER — EXTENSIONS\n\nInstall extension (replace vendor/package:^version):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH require vendor/package:^version --no-interaction 2>&1'\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:di:compile 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:static-content:deploy -f 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\nRemove extension:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH remove vendor/package --no-interaction 2>&1'\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\n---\n\n## DEPLOYMENT\n\nFull deploy sequence:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:upgrade 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:di:compile 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento setup:static-content:deploy -f 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\n---\n\n## GRAPHQL\n\nStore config:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/graphql -H 'Content-Type: application/json' \\\n   -d '{\\\"query\\\":\\\"{storeConfig{store_code store_name base_url locale default_display_currency_code}}\\\"}' 2>/dev/null | python3 -m json.tool\"\n```\n\nProduct search (replace SEARCH_TERM):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/graphql -H 'Content-Type: application/json' \\\n   -d '{\\\"query\\\":\\\"{products(search:\\\\\\\"SEARCH_TERM\\\\\\\",pageSize:5){items{sku name price{regularPrice{amount{value currency}}}}}}\\\"}' 2>/dev/null | python3 -m json.tool\"\n```\n\nCategory list:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/graphql -H 'Content-Type: application/json' \\\n   -d '{\\\"query\\\":\\\"{categoryList{id name url_key level children{id name url_key}}}\\\"}' 2>/dev/null | python3 -m json.tool\"\n```\n\n---\n\n## BACKUP & RESTORE\n\nDB backup:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  TS=\\$(date +%Y%m%d_%H%M%S)\n  mkdir -p /opt/magento_backups\n  MYSQL_PWD=MAGENTO_DB_PASS mysqldump -uMAGENTO_DB_USER MAGENTO_DB_NAME | gzip > /opt/magento_backups/db_\\${TS}.sql.gz\n  ls -lh /opt/magento_backups/db_\\${TS}.sql.gz && echo BACKUP_DONE\n\"\n```\n\nList backups:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"ls -lhrt /opt/magento_backups/ 2>/dev/null | tail -10\"\n```\n\nRestore DB (replace BACKUPFILE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\n  gunzip -c BACKUPFILE | MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME && echo DB_RESTORED\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\n\"\n```\n\n---\n\n## DATABASE QUERIES\n\nDB size and largest tables:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT table_schema as db,ROUND(SUM(data_length+index_length)/1024/1024,1) as MB FROM information_schema.tables WHERE table_schema=database() GROUP BY table_schema;' 2>&1\n  MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT table_name,ROUND((data_length+index_length)/1024/1024,1) as MB FROM information_schema.tables WHERE table_schema=database() ORDER BY MB DESC LIMIT 15;' 2>&1\n\"\n```\n\nRun a specific SQL query (owner use — verify query before execution):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT ...; -- replace with specific query' 2>&1\"\n```\n\nPurge old log tables:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'DELETE FROM report_event WHERE logged_at<DATE_SUB(NOW(),INTERVAL 30 DAY); DELETE FROM customer_visitor WHERE last_visit_at<DATE_SUB(NOW(),INTERVAL 1 DAY); SELECT \\\"Done\\\";' 2>&1\"\n```\n\nOptimize slow tables:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'OPTIMIZE TABLE cron_schedule,quote,report_event,customer_visitor;' 2>&1\"\n```\n\n---\n\n## LOGS\n\nException log:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"tail -50 MAGENTO_WEB_ROOT/var/log/exception.log 2>/dev/null\"\n```\n\nSystem log:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"tail -30 MAGENTO_WEB_ROOT/var/log/system.log 2>/dev/null\"\n```\n\nAll log files with sizes:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"ls -lh MAGENTO_WEB_ROOT/var/log/ 2>/dev/null | sort -k5 -hr | head -20\"\n```\n\n---\n\n## SERVICES\n\nCheck all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo systemctl is-active apache2 nginx mariadb mysql redis-server opensearch 2>/dev/null\"\n```\n\nRestart all (safe order):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo systemctl restart mariadb mysql redis-server 2>&1\n  sleep 5\n  sudo systemctl restart apache2 nginx 2>&1\n  echo ALL_RESTARTED\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## OPENSEARCH\n\nHealth:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s MAGENTO_OS_URL/_cluster/health 2>/dev/null | python3 -m json.tool\"\n```\n\nList indices:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s 'MAGENTO_OS_URL/_cat/indices?v' 2>/dev/null\"\n```\n\n---\n\n## SECURITY\n\n2FA status:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT u.username,u.email,t.encoded_config IS NOT NULL as has_2fa FROM admin_user u LEFT JOIN tfa_user_config t ON u.user_id=t.user_id;' 2>&1\"\n```\n\nReset 2FA (replace USERNAME):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento security:tfa:reset USERNAME google 2>&1\"\n```\n\n---\n\n## AUTO-HEALING\n\nSite slow / high load:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  echo LOAD: \\$(cat /proc/loadavg)\n  MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e \\\"UPDATE cron_schedule SET status='missed' WHERE status='running' AND executed_at<DATE_SUB(NOW(),INTERVAL 2 HOUR);\\\" 2>&1\n  sudo pkill -f 'php.*cron:run' 2>/dev/null || true\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n  echo NEW_LOAD: \\$(cat /proc/loadavg)\n\"\n```\n\nAdmin locked out:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento admin:user:unlock MAGENTO_ADMIN_USER 2>&1\n  redis-cli -n 2 FLUSHDB\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\nSearch broken:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  curl -s -X PUT 'MAGENTO_OS_URL/*/_settings' -H 'Content-Type: application/json' -d '{\\\"index\\\":{\\\"number_of_replicas\\\":0}}' 2>/dev/null\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reset catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## MESSAGE QUEUE\n\nList consumers:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento queue:consumers:list 2>&1\"\n```\n\n---\n\n## Intended Use and Risk Acknowledgement\n\nThis skill is designed for **server owners** administering their own Magento 2\ninstallation. The broad privilege scope (SSH, DB, REST admin) is intentional\nand required for full store administration.\n\n**This skill should not be installed if:**\n- You do not own and control MAGENTO_HOST\n- You are not the Magento store administrator\n- You have not reviewed the commands this skill will execute\n\n**Risk mitigations included:**\n- SSH key authentication only (no passwords on command lines)\n- DB password via MYSQL_PWD env var (not visible in process list)\n- All credentials user-supplied — nothing hardcoded in skill\n- Commands connect only to MAGENTO_HOST — no third-party calls\n- Least-privilege recommendations provided (see above section)\n- prompt_injection_mitigation declared — commands use fixed vars only\n\n## AGENT INSTRUCTIONS\n\nWhen a user asks about their Magento store, use the commands above to retrieve\nreal data from the server and provide a clear, formatted response.\n\nAll commands connect only to the server configured in MAGENTO_HOST using\ncredentials supplied by the user. No data is sent to third parties.\n\nFormat responses with:\n- 🟢 OK  🔴 error  ⚠️ warning  📦 orders  🛍️ products  👥 customers\n- 💰 revenue  🔧 running  ✅ done  🔒 security  📧 email  🚚 shipping\n- Plain English summary with key numbers — avoid dumping raw output\n- If something is wrong, identify it and suggest the fix\n\nprompt_injection_mitigation: >\n  All commands use fixed configuration variables only. Free-form user\n  input is never interpolated into shell commands.\n\nFile v5.6.0:_meta.json\n\n{\n  \"ownerId\": \"kn75wmg9n12pjn92x60r99d04983gkgd\",\n  \"slug\": \"magento-admin\",\n  \"version\": \"5.6.0\",\n  \"publishedAt\": 1777058951836\n}\n\nArchive v5.5.1: 2 files, 7644 bytes\n\nFiles: SKILL.md (35937b), _meta.json (132b)\n\nFile v5.5.1:SKILL.md\n\n---\nname: magento-admin\nversion: \"5.5.1\"\ndescription: >\n  Complete Magento 2 store administration via SSH key auth, REST API, GraphQL,\n  and direct DB access. For server owners on their own infrastructure.\n  SSH key auth and passwordless sudo required.\nauthor: openclaw-community\nlicense: MIT\ntags: [magento, ecommerce, devops, store-admin, ssh, rest-api, graphql, composer]\n\nrequires:\n  primary_credential: MAGENTO_SSH_KEY\n  env:\n    - name: MAGENTO_HOST\n      description: Magento server IP or hostname\n    - name: MAGENTO_SSH_USER\n      description: SSH username (passwordless sudo required on server)\n    - name: MAGENTO_SSH_KEY\n      description: Path to SSH private key (e.g. ~/.ssh/magento_deploy)\n    - name: MAGENTO_WEB_ROOT\n      description: Magento installation path (e.g. /var/www/html/magento2)\n    - name: MAGENTO_PHP\n      description: PHP binary (e.g. /usr/bin/php8.4)\n    - name: MAGENTO_WEB_USER\n      description: Web server user (e.g. www-data)\n    - name: MAGENTO_DB_NAME\n      description: Database name\n    - name: MAGENTO_DB_USER\n      description: Database username\n    - name: MAGENTO_DB_PASS\n      description: Database password\n    - name: MAGENTO_BASE_URL\n      description: Store base URL (e.g. https://store.example.com)\n    - name: MAGENTO_ADMIN_USER\n      description: Magento admin username\n    - name: MAGENTO_ADMIN_PASS\n      description: Magento admin password (REST API token generation only)\n  optional_env:\n    - name: MAGENTO_CA_CERT\n      description: CA cert path for HTTPS (e.g. /opt/ssl/ca.crt)\n    - name: MAGENTO_OS_URL\n      description: OpenSearch URL (default http://127.0.0.1:9200)\n    - name: MAGENTO_ADMIN_PATH\n      description: Admin path (default admin)\n    - name: COMPOSER_PATH\n      description: Composer binary path (e.g. /usr/local/bin/composer)\n  binaries:\n    - ssh\n    - mysql\n    - curl\n    - redis-cli\n    - python3\n\nsecurity:\n  scope: owner-operated\n  auth_method: ssh-key-only\n  sudo_method: passwordless-sudoers\n  credential_handling: user-supplied-only\n  network_access: user-own-server-only\n  note: >\n    SSH key auth only. DB password via MYSQL_PWD env var (not in process args).\n    REST API password in HTTPS body only. All credentials user-supplied.\n    Connects only to MAGENTO_HOST. Nothing sent to third parties.\n\nprompt_injection_mitigation: >\n  All commands use fixed config variables only. Free-form user input is\n  never interpolated into shell commands.\n---\n\n# magento-admin v5.5 — Complete Magento 2 Administration\n\n## Overview\n\nThis skill gives an OpenClaw agent the ability to fully administer a Magento 2\nstore via SSH, REST API, GraphQL, and direct database access. It is designed\nfor use by the **server owner** on their own infrastructure.\n\nAll credentials are supplied by you in your private config file and are used\nonly to connect to your own server. Nothing is sent to third parties.\n\n## Security Notes\n\n- **SSH key auth recommended** over password auth where possible\n- All credentials are stored only in your private config, never in the skill itself\n- The skill connects only to the server you configure\n- Review all commands before enabling autonomous execution\n\n## Configuration\n\nCreate a private config file at:\nSet the following variables in your openclaw.json env block:\n\nSet these variables — all commands in this skill use them as placeholders:\n\n| Variable | Description | Example |\n|---|---|---|\n| MAGENTO_HOST | Server IP or hostname | 10.0.1.50 |\n| MAGENTO_SSH_USER | SSH username | deploy |\n| MAGENTO_SSH_KEY | Path to SSH private key | ~/.ssh/magento_deploy |\n| MAGENTO_WEB_ROOT | Magento path | /var/www/html/magento2 |\n| MAGENTO_PHP | PHP binary | /usr/bin/php8.3 |\n| MAGENTO_WEB_USER | Web server user | www-data |\n| MAGENTO_DB_NAME | Database name | magento_db |\n| MAGENTO_DB_USER | DB username | magento_user |\n| MAGENTO_DB_PASS | DB password | *(your db password)* |\n| MAGENTO_BASE_URL | Store URL | https://store.example.com |\n| MAGENTO_ADMIN_PATH | Admin path | admin |\n| MAGENTO_ADMIN_USER | Admin username | admin |\n| MAGENTO_ADMIN_PASS | Admin password | *(your admin password)* |\n| MAGENTO_OS_URL | OpenSearch URL | http://127.0.0.1:9200 |\n| COMPOSER_PATH | Composer binary | /usr/local/bin/composer |\n\n## Recommended: SSH Key Authentication\n\nFor better security, set up SSH key auth instead of password auth:\n\n```bash\n\n\nssh -i ~/.ssh/magento_deploy -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"COMMAND\"\n```\n\n\n## Least-Privilege Recommendations\n\n- **DB user:** Create a dedicated MariaDB/MySQL user with SELECT, INSERT,\n  UPDATE, DELETE on the Magento DB only — not GRANT or CREATE.\n- **SSH user:** Restrict passwordless sudo to specific binaries if possible\n  (e.g. `php`, `systemctl restart`, `redis-cli`) rather than `ALL`.\n- **REST API:** MAGENTO_ADMIN_PASS is used only to obtain a short-lived\n  session token via the Magento REST API. Consider creating a dedicated\n  admin user with only the roles your agent needs.\n- **SSH key:** Use a dedicated key pair for the agent, not your personal key.\n## SSH Patterns\n\n```bash\nssh -i ~/.ssh/magento_deploy MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento COMMAND 2>&1\"\n```\n\n\n**DB queries:**\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'QUERY' 2>&1\"\n```\n\n**REST API — get token then use it:**\n```bash\nTOKEN=$(ssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n   -H 'Content-Type: application/json' \\\n   -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"'\")\n```\n\n**Composer:**\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH COMMAND 2>&1'\"\n```\n\n---\n\n## FULL HEALTH CHECK\n\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\necho '=== VERSION ===' && sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento --version 2>&1\necho '=== MODE ===' && sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento deploy:mode:show 2>&1\necho '=== SERVICES ===' && sudo systemctl is-active apache2 nginx mariadb mysql redis-server opensearch php8.3-fpm php8.4-fpm 2>/dev/null\necho '=== LOAD ===' && uptime\necho '=== MEMORY ===' && free -h | grep Mem\necho '=== DISK ===' && df -h MAGENTO_WEB_ROOT | tail -1\necho '=== OPENSEARCH ===' && curl -s MAGENTO_OS_URL/_cluster/health 2>/dev/null | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d[\\\"status\\\"])'\necho '=== REDIS ===' && redis-cli ping && redis-cli info keyspace\necho '=== CRON ===' && MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT status,COUNT(*) FROM cron_schedule WHERE scheduled_at>DATE_SUB(NOW(),INTERVAL 2 HOUR) GROUP BY status;' 2>&1\necho '=== ERRORS ===' && tail -3 MAGENTO_WEB_ROOT/var/log/exception.log 2>/dev/null | grep -c CRITICAL || echo 0\n\" 2>&1\n```\n\n---\n\n## CACHE\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:status 2>&1\"\n```\n\nFlush all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\"\n```\n\nClean specific type (replace TYPE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:clean TYPE 2>&1\"\n```\nTypes: config layout block_html collections reflection db_ddl compiled_config eav customer_notification full_page config_integration config_integration_api translate config_webservice graphql_query_resolver_result\n\nRedis flush by DB (0=config 1=page 2=sessions):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"redis-cli -n 0 FLUSHDB && echo cache_cleared\"\n```\n\n---\n\n## INDEXING\n\nStatus:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:status 2>&1\"\n```\n\nReindex all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex 2>&1\"\n```\n\nReindex specific (replace INDEXER_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex INDEXER_ID 2>&1\"\n```\nIDs: cataloginventory_stock catalog_category_product catalog_product_category catalog_product_price catalog_product_attribute catalogsearch_fulltext catalogrule_rule catalogrule_product customer_grid design_config_grid inventory\n\nRebuild OpenSearch (search broken):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  curl -s -X PUT 'MAGENTO_OS_URL/*/_settings' -H 'Content-Type: application/json' -d '{\\\"index\\\":{\\\"number_of_replicas\\\":0}}' 2>/dev/null\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reset catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento indexer:reindex catalogsearch_fulltext 2>&1\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cache:flush 2>&1\n\"\n```\n\n---\n\n## CRON\n\nRun now:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cron:run 2>&1\"\n```\n\nBacklog summary:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT status,COUNT(*) AS cnt FROM cron_schedule GROUP BY status ORDER BY cnt DESC;' 2>&1\"\n```\n\nTop failing jobs:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT job_code,COUNT(*) as cnt,MAX(messages) as err FROM cron_schedule WHERE status=\\\"error\\\" GROUP BY job_code ORDER BY cnt DESC LIMIT 10;' 2>&1\"\n```\n\nClear old error/missed history:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'DELETE FROM cron_schedule WHERE status IN (\\\"error\\\",\\\"missed\\\") AND scheduled_at<DATE_SUB(NOW(),INTERVAL 1 DAY);' 2>&1\"\n```\n\nInstall crontab:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento cron:install 2>&1\"\n```\n\n---\n\n## MAINTENANCE MODE\n\n```bash\n# Enable\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:enable 2>&1\"\n# Disable\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento maintenance:disable 2>&1\"\n```\n\n---\n\n## ORDERS\n\nRevenue today:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE DATE(created_at)=CURDATE() AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nRevenue this week:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE created_at>=DATE_SUB(NOW(),INTERVAL 7 DAY) AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nRevenue this month:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as revenue FROM sales_order WHERE YEAR(created_at)=YEAR(NOW()) AND MONTH(created_at)=MONTH(NOW()) AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nLast 10 orders:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT increment_id,customer_email,grand_total,status,created_at FROM sales_order ORDER BY created_at DESC LIMIT 10;' 2>&1\"\n```\n\nOrder detail (replace ORDERID with increment_id):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT o.increment_id,o.customer_email,o.grand_total,o.status,o.state,o.created_at,a.street,a.city,a.postcode FROM sales_order o LEFT JOIN sales_order_address a ON o.entity_id=a.parent_id AND a.address_type=\\\"shipping\\\" WHERE o.increment_id=\\\"ORDERID\\\";' 2>&1\"\n```\n\nCancel order (REST API — replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/orders/ORDER_ENTITY_ID/cancel \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" 2>/dev/null\n\"\n```\n\nInvoice order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/invoice \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"capture\\\":true,\\\"notify\\\":true}' 2>/dev/null\n\"\n```\n\nShip order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/ship \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"notify\\\":true}' 2>/dev/null\n\"\n```\n\nRefund order (replace ORDER_ENTITY_ID):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/order/ORDER_ENTITY_ID/refund \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"notify\\\":true,\\\"arguments\\\":{\\\"shipping_amount\\\":0,\\\"adjustment_positive\\\":0,\\\"adjustment_negative\\\":0}}' 2>/dev/null\n\"\n```\n\nAbandoned carts today:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT entity_id,customer_email,ROUND(grand_total,2) as value,items_count,updated_at FROM quote WHERE is_active=1 AND items_count>0 AND DATE(updated_at)=CURDATE() AND customer_email IS NOT NULL ORDER BY updated_at DESC LIMIT 20;' 2>&1\"\n```\n\nSales report by day (last 30 days):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT DATE(created_at) as day,COUNT(*) as orders,ROUND(SUM(grand_total),2) as revenue FROM sales_order WHERE created_at>=DATE_SUB(NOW(),INTERVAL 30 DAY) AND state <> \\\"canceled\\\" GROUP BY DATE(created_at) ORDER BY day DESC;' 2>&1\"\n```\n\n---\n\n## PRODUCTS\n\nTotal count by type:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as total,type_id FROM catalog_product_entity GROUP BY type_id;' 2>&1\"\n```\n\nOut of stock:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT cpe.sku,csi.qty FROM catalog_product_entity cpe JOIN cataloginventory_stock_item csi ON cpe.entity_id=csi.product_id WHERE csi.is_in_stock=0 OR csi.qty<=0 ORDER BY cpe.sku LIMIT 30;' 2>&1\"\n```\n\nUpdate stock via REST (replace SKU and QTY):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/products/SKU/stockItems/1 \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"stockItem\\\":{\\\"qty\\\":QTY,\\\"is_in_stock\\\":true}}' 2>/dev/null\n\"\n```\n\nUpdate product price via REST (replace SKU and PRICE):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/products/SKU \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"product\\\":{\\\"sku\\\":\\\"SKU\\\",\\\"price\\\":PRICE}}' 2>/dev/null\n\"\n```\n\n---\n\n## CUSTOMERS\n\nFind by email (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT entity_id,firstname,lastname,email,created_at,is_active FROM customer_entity WHERE email=\\\"EMAIL\\\";' 2>&1\"\n```\n\nCustomer LTV (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT COUNT(*) as orders,ROUND(COALESCE(SUM(grand_total),0),2) as ltv FROM sales_order WHERE customer_email=\\\"EMAIL\\\" AND state <> \\\"canceled\\\";' 2>&1\"\n```\n\nTop 10 customers by revenue:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT customer_email,COUNT(*) as orders,ROUND(SUM(grand_total),2) as ltv FROM sales_order WHERE state <> \\\"canceled\\\" GROUP BY customer_email ORDER BY ltv DESC LIMIT 10;' 2>&1\"\n```\n\nReset customer password via REST (replace EMAIL):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\nTOKEN=\\$(curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"')\ncurl -s --cacert MAGENTO_CA_CERT -X PUT MAGENTO_BASE_URL/rest/V1/customers/password \\\n  -H \\\"Authorization: Bearer \\$TOKEN\\\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\\\"email\\\":\\\"EMAIL\\\",\\\"template\\\":\\\"email_reset\\\",\\\"websiteId\\\":1}' 2>/dev/null\n\"\n```\n\n---\n\n## ADMIN USERS\n\nList all:\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT user_id,username,email,is_active,failures_num,lock_expires FROM admin_user;' 2>&1\"\n```\n\nUnlock admin (replace USERNAME):\n```bash\nssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento admin:user:unlock USERNAME 2>&1\n  redis-cli -n 2 FLUSHDB\n  sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_W\n\nArchive v5.5.0: 2 files, 7774 bytes\n\nFiles: SKILL.md (36421b), _meta.json (132b)\n\nArchive v5.4.0: 2 files, 7444 bytes\n\nFiles: SKILL.md (35965b), _meta.json (132b)\n\nArchive v5.3.0: 2 files, 7358 bytes\n\nFiles: SKILL.md (35374b), _meta.json (132b)\n\nArchive v5.2.0: 2 files, 7481 bytes\n\nFiles: SKILL.md (35729b), _meta.json (132b)\n\nArchive v5.1.0: 2 files, 7538 bytes\n\nFiles: SKILL.md (38567b), _meta.json (132b)\n\nArchive v5.0.0: 2 files, 6670 bytes\n\nFiles: SKILL.md (34984b), _meta.json (132b)","readmeExcerpt":"Skill: magento-admin Owner: nj070574-gif Summary: Complete Magento 2 store administration via SSH key auth, REST API, GraphQL, and direct DB access. For server owners on their own infrastructure. SSH key auth and passwordless sudo required. Tags: latest:5.7.0 Version history: v5.7.0 | 2026-10-03T09:42:59.885Z | user v5.7.0 - Security hardening + fixes (verified against live Magento 2.4.9). Input Handling & Injection ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"ssh -i ~/.ssh/magento_deploy -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"COMMAND\""},{"language":"bash","snippet":"ssh -i ~/.ssh/magento_deploy MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento COMMAND 2>&1\""},{"language":"bash","snippet":"ssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'QUERY' 2>&1\""},{"language":"bash","snippet":"TOKEN=$(ssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"curl -s --cacert MAGENTO_CA_CERT -X POST MAGENTO_BASE_URL/rest/V1/integration/admin/token \\\n   -H 'Content-Type: application/json' \\\n   -d '{\\\"username\\\":\\\"MAGENTO_ADMIN_USER\\\",\\\"password\\\":\\\"MAGENTO_ADMIN_PASS\\\"}' 2>/dev/null | tr -d '\\\"'\")"},{"language":"bash","snippet":"ssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \\\n  \"sudo -u MAGENTO_WEB_USER bash -c 'cd MAGENTO_WEB_ROOT && php COMPOSER_PATH COMMAND 2>&1'\""},{"language":"bash","snippet":"ssh -i MAGENTO_SSH_KEY -o StrictHostKeyChecking=yes MAGENTO_SSH_USER@MAGENTO_HOST \"\necho '=== VERSION ===' && sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento --version 2>&1\necho '=== MODE ===' && sudo -u MAGENTO_WEB_USER MAGENTO_PHP MAGENTO_WEB_ROOT/bin/magento deploy:mode:show 2>&1\necho '=== SERVICES ===' && sudo systemctl is-active apache2 nginx mariadb mysql redis-server opensearch php8.3-fpm php8.4-fpm 2>/dev/null\necho '=== LOAD ===' && uptime\necho '=== MEMORY ===' && free -h | grep Mem\necho '=== DISK ===' && df -h MAGENTO_WEB_ROOT | tail -1\necho '=== OPENSEARCH ===' && curl -s MAGENTO_OS_URL/_cluster/health 2>/dev/null | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d[\\\"status\\\"])'\necho '=== REDIS ===' && redis-cli ping && redis-cli info keyspace\necho '=== CRON ===' && MYSQL_PWD=MAGENTO_DB_PASS mysql -uMAGENTO_DB_USER MAGENTO_DB_NAME -e 'SELECT status,COUNT(*) FROM cron_schedule WHERE scheduled_at>DATE_SUB(NOW(),INTERVAL 2 HOUR) GROUP BY status;' 2>&1\necho '=== ERRORS ===' && tail -3 MAGENTO_WEB_ROOT/var/log/exception.log 2>/dev/null | grep -c CRITICAL || echo 0\n\" 2>&1"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: magento-admin\nversion: \"5.7.0\"\ndescription: >\n  Complete Magento 2 store administration via SSH key auth, REST API, GraphQL,\n  and direct DB access. For server owners on their own infrastructure.\n  SSH key auth and passwordless sudo required.\nauthor: openclaw-community\nlicense: MIT\ntags: [magento, ecommerce, devops, store-admin, ssh, rest-api, graphql, composer]\n\nrequires:\n  primary_credential: MAGENTO_SSH_KEY\n  env:\n    - name: MAGENTO_HOST\n      description: Magento server IP or hostname\n    - name: MAGENTO_SSH_USER\n      description: SSH username (passwordless sudo required on server)\n    - name: MAGENTO_SSH_KEY\n      description: Path to SSH private key (e.g. ~/.ssh/magento_deploy)\n    - name: MAGENTO_WEB_ROOT\n      description: Magento installation path (e.g. /var/www/html/magento2)\n    - name: MAGENTO_PHP\n      description: PHP binary (e.g. /usr/bin/php8.4)\n    - name: MAGENTO_WEB_USER\n      description: Web server user (e.g. www-data)\n    - name: MAGENTO_DB_NAME\n      description: Database name\n    - name: MAGENTO_DB_USER\n      description: Database username\n    - name: MAGENTO_DB_PASS\n      description: Database password\n    - name: MAGENTO_BASE_URL\n      description: Store base URL (e.g. https://store.example.com)\n    - name: MAGENTO_ADMIN_USER\n      description: Magento admin username\n    - name: MAGENTO_ADMIN_PASS\n      description: Magento admin password (REST API token generation only)\n  optional_env:\n    - name: MAGENTO_CA_CERT\n      description: CA cert path for HTTPS (e.g. /opt/ssl/ca.crt)\n    - name: MAGENTO_OS_URL\n      description: OpenSearch URL (default http://127.0.0.1:9200)\n    - name: MAGENTO_ADMIN_PATH\n      description: Admin path (default admin)\n    - name: COMPOSER_PATH\n      description: Composer binary path (e.g. /usr/local/bin/composer)\n  binaries:\n    - ssh\n    - mysql\n    - curl\n    - redis-cli\n    - python3\n\nsecurity:\n  scope: owner-operated\n  risk_level: high\n  risk_acknowledged: true\n  risk_justification: >-\n    Full store admin requires SSH + DB + REST access by design. High privilege\n    is inherent and intentional. Install only on infrastructure you own.\n  auth_method: ssh-key-only\n  sudo_method: passwordless-sudoers\n  credential_handling: user-supplied-only\n  network_access: user-own-server-only\n  note: >\n    SSH key auth only. DB password via MYSQL_PWD env var (not in process args).\n    REST API password in HTTPS body only. All credentials user-supplied.\n    Connects only to MAGENTO_HOST. Nothing sent to third parties.\n\nprompt_injection_mitigation: >\n  Connection parameters come only from the fixed MAGENTO_* config variables and\n  are never taken from chat. User-supplied operands (order IDs, emails, SKUs,\n  module names, config paths, etc.) are validated against strict allowlist\n  patterns before substitution and refused if they do not match — see the\n  \"Input Handling & Injection Safety\" section. Never interpolate unvalidated\n  free-form text into a shell command, SQL statement, or URL.\n---\n\n# m"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn75wmg9n12pjn92x60r99d04983gkgd\",\n  \"slug\": \"magento-admin\",\n  \"version\": \"5.7.0\",\n  \"publishedAt\": 1791020579885\n}"},{"path":"skill-card.md","content":"## Description:\n\nHelps store owners administer their Magento 2 installations through SSH, REST, GraphQL, and database access.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[nj070574-gif](https://clawhub.ai/user/nj070574-gif)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMagento store owners and administrators use this skill to inspect and manage their own stores, including orders, products, configuration, maintenance, and backups.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Broad SSH, database, admin API, and sudo access can change or disrupt a store.\n\nMitigation: Install only on infrastructure you own and administer; limit granted privileges and review high-impact commands before execution.\n\nRisk: Refunds, admin-user creation, extension installs, database restores, service restarts, and raw SQL can have significant effects.\n\nMitigation: Require explicit owner approval for these operations before allowing autonomous execution.\n\n## Reference(s):\n\n- [Magento Admin skill on ClawHub](https://clawhub.ai/nj070574-gif/skills/magento-admin)\n- [Publisher profile on ClawHub](https://clawhub.ai/user/nj070574-gif)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, API calls, Configuration guidance, Text]\n\n**Output Format:** [Markdown with command examples and plain-language status summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires owner-supplied access to the Magento host, database, and admin API.]\n\n## Skill Version(s):\n\n5.7.0 (source: server release and skill frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Complete Magento 2 store administration via SSH key auth, REST API, GraphQL, and direct DB access. For server owners on their own infrastructure. SSH key auth and passwordless sudo required. Skill: magento-admin Owner: nj070574-gif Summary: Complete Magento 2 store administration via SSH key auth, REST API, GraphQL, and direct DB access. For server owners on their own infrastructure. SSH key auth and passwordless sudo required. Tags: latest:5.7.0 Version history: v5.7.0 | 2026-10-03T09:42:59.885Z | user v5.7.0 - Security hardening + fixes (verified against live Magento 2.4.9). Input Handling & Injection","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1429,"uniquenessScore":46,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T15:56:59.507Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T15:56:59.507Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:59:28.823Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}