diff --git a/wordpress/skills/mcp-pro-elements/SKILL.md b/wordpress/skills/mcp-pro-elements/SKILL.md new file mode 100644 index 0000000..adc9dd9 --- /dev/null +++ b/wordpress/skills/mcp-pro-elements/SKILL.md @@ -0,0 +1,117 @@ +--- +name: mcp-pro-elements +description: MCP dedicado (node stdio, ligação `pro-elements` em ~/.omp/agent/mcp.json) para gerir o PRO Elements (fork GPL do Elementor Pro) em starter/ccv/care.descomplicar.pt — estado/versão do plugin, os 4 módulos com toggle próprio via Elementor Experiments (mega_menu, size_variables, atomic_form, pro_interactions), reCAPTCHA v2/v3 das Forms (secret sempre mascarada), licença (vestígio histórico, sempre mascarada), restrições do Element Manager por role (read-only), via WP-CLI/SSH. Usar quando "pro elements", "elementor pro fork", "modulos pro elements", "experiment mega menu", "recaptcha forms elementor", "licenca pro elements", "elementor experiment toggle". +layer: wiki +--- + +# /mcp-pro-elements — MCP dedicado ao PRO Elements + +Projecto em `/media/ealmeida/Dados/Dev/mcp-pro-elements/` (TypeScript, SDK MCP oficial, stdio). +Sem código PHP novo no WordPress — cada tool executa `wp option get/update` via `ssh server` sobre +o WP-CLI já instalado. Não é uma extensão do EMCP Tools (plugin comercial Freemius, catálogo de +tools fixo curado pelo autor, sem mecanismo de terceiros). + +## O que é o PRO Elements (achado por leitura de código-fonte, 19-08-2026) + +**Não** é um addon pack de terceiros como o Element Pack Pro (BdThemes) — é literalmente o +código-fonte do **Elementor Pro**, rebrandeado: `pro-elements.php` define +`ELEMENTOR_PRO_VERSION`/`namespace ElementorPro`, os mesmos `core/`, `modules/`, `base/` do +Elementor Pro genuíno. A diferença está em `license/api.php`: `License\API::get_license_data()` +está **hardcoded** para devolver sempre `success:true, expires:'lifetime'` com a lista completa de +features Pro — não há licença real a validar. `wp elementor-pro license activate/deactivate` +(comando WP-CLI próprio) tem os métodos vazios (no-ops). A própria description do plugin em +care.descomplicar.pt confirma: *"This plugin enables GPL features of Elementor Pro... is not a +substitute for Elementor Pro."* + +## Âmbito + +Ao contrário do Element Pack Pro (~150 widgets num único array com toggle individual), o PRO +Elements **não tem ecrã "Modules" com toggle por widget**. Só **4 dos ~80 módulos** têm toggle +próprio, via **Elementor Experiments** (`wp_options.elementor_experiment-`, string simples +`active`/`inactive`/`default`): + +| Tool id | Experiment | Default | Disponível | +|---|---|---|---| +| `mega_menu` | `mega-menu` | inactive | 3.31.2 e 3.35.0 (confirmado nos 3 sites) | +| `size_variables` | `e_pro_variables` | active | só 3.35.0 (starter/ccv) — pasta ausente em 3.31.2 (care) | +| `atomic_form` | `e_pro_atomic_form` | inactive | só 3.35.0 | +| `pro_interactions` | `e_pro_interactions` | inactive | só 3.35.0 | + +Os restantes módulos (query-control, popup, theme-builder, forms, woocommerce, etc.) activam +sempre — `Module::is_active()` por omissão `true` + licença hardcoded sempre completa. + +A única **configuração geral real e gravável** é o **reCAPTCHA das Forms** (v2/v3). Não existe +"Google Maps API key" própria do PRO Elements — o Google Maps usa a key do Elementor **core** +(`elementor_google_maps_api_key`), fora do âmbito deste MCP. + +## Sites conhecidos + +Confirmado por `wp plugin get pro-elements` nos 3 (19-08-2026) — únicos do bundle com o plugin +activo: + +- `starter` → starter.descomplicar.pt, v3.35.0 +- `ccv` → ccv.descomplicar.pt, v3.35.0 +- `care` → care.descomplicar.pt, v3.31.2 + +`descomplicar.pt` (produção), `emanuelalmeida.pt` e os sites `*ecommerce*` **não** têm o plugin. + +## Tools (8) + +| Tool | Read-only | Uso | +|---|---|---| +| `pe_list_sites` | sim | Aliases conhecidos + versão confirmada, sem SSH | +| `pe_get_status` | sim | Versão/estado do plugin via `wp plugin get` | +| `pe_get_modules` | sim | Estado dos 4 módulos: `installed_in_this_version` (dir existe nesta versão), `raw_state` (valor gravado ou `null`), `effective_active` (resolvido incl. default) | +| `pe_set_module_state` | não | `active`/`inactive`/`default` num módulo; recusa se `installed_in_this_version=false` (nunca escreve lixo sem efeito) | +| `pe_get_recaptcha_settings` | sim | Site keys em claro (públicas), secret keys sempre mascaradas (`{configured, length}`) | +| `pe_set_recaptcha_settings` | não | Actualiza campos v2/v3 passados; `threshold` só válido em v3, 0–1 | +| `pe_get_license_status` | sim | Vestígio de `elementor_pro_license_key` mascarado + nota fixa sobre o bypass hardcoded | +| `pe_get_role_restrictions` | sim | `elementor_pro_element_manager_role_permission` — restrições de widgets por role (vazio nos 3 sites) | + +## Segurança + +- Allowlist fixa de option keys (`src/wpcli.ts`) — nunca `wp option update` genérico. +- **Secrets nunca em claro**: `secret_key` do reCAPTCHA e `elementor_pro_license_key` passam + sempre por `describeSecret()` → só `{configured: boolean, length: number}`. Site keys reCAPTCHA + são públicas por natureza (embutidas em JS no browser) e são devolvidas em claro. +- Escritas via base64 em stdin, nunca interpoladas no comando SSH remoto. +- `elementor_experiment-*` e as chaves `elementor_pro_recaptcha_*` são strings escalares simples + (nunca `--format=json` — corromperia o valor, mesmo gotcha da skill `mcp-wpfc`). + `elementor_pro_element_manager_role_permission` é o único array PHP nativo do allowlist — + lido com `--format=json`, nunca escrito por aqui (formato complexo por-widget-por-role gerido + pela app React do editor, sem valor real a expor um write raw). +- `elementor_pro_license_key` fica fora da allowlist de escrita — o runtime ignora-a de qualquer + forma (ver acima), escrevê-la não activaria nada. + +## Verificação + +Construído e testado ponta-a-ponta contra produção (19-08-2026), os 3 sites: + +- `pe_get_status` idêntico a `wp plugin get pro-elements` directo em starter (3.35.0), ccv + (3.35.0) e care (3.31.2). +- `pe_get_modules(care)` confirmou `installed_in_this_version` correcto — só `mega_menu=true` + (os outros 3 `false`, ausência das pastas `modules/{variables,atomic-form,interactions}` + confirmada em disco); `pe_get_modules(ccv)` confirmou os 4 `true` e `size_variables. + effective_active=true` (resolve o default `active` porque `raw_state` nunca foi gravado). +- `pe_get_recaptcha_settings(care)` idêntico à leitura directa (`site_key`/`secret_key` vazios, + `threshold=0.5`). +- `pe_get_license_status`: `care` → `{configured:true, length:45}` (o vestígio real de uma + instalação Elementor Pro genuína anterior, encontrado em `wp_options`); `starter`/`ccv` → + `{configured:false}` (nunca tiveram licença real). +- **Escrita com round-trip idempotente**, duas vezes: `pe_set_module_state(care, mega_menu, + "default")` — valor antes/depois idêntico (`"default"`), confirmado por `wp option get` + directo fora do MCP; `pe_set_recaptcha_settings(care, v3, threshold=0.5)` — valor antes/depois + idêntico (`0.5`), confirmado da mesma forma. +- Guard testado: `pe_set_module_state(care, size_variables, "active")` recusado com erro claro + (módulo não existe em 3.31.2) — nenhuma escrita tentada. +- Nenhum segredo devolvido em claro em qualquer chamada. + +## Skills relacionadas + +- `mcp-element-pack` — Element Pack Pro (BdThemes), um addon pack de terceiros genuíno, com + ~150 widgets num único array de toggle — **não confundir** com este MCP (o PRO Elements é o + próprio Elementor Pro rebrandeado, mecanismo de toggle completamente diferente). +- `element-pack-widgets` — catálogo/inserção de widgets Element Pack via EMCP; não aplicável ao + PRO Elements (os widgets Pro do Elementor inserem-se pela ligação EMCP normal do site, não por + este MCP de configuração admin). +- `mcp-wpfc` — mesmo padrão de gotcha JSON vs string escalar em `wp option get/update`.