From 36a072134986acd799cf6254d862bdf599e37a74 Mon Sep 17 00:00:00 2001 From: Descomplicar Agent Date: Wed, 19 Aug 2026 07:06:30 +0100 Subject: [PATCH] =?UTF-8?q?feat(wordpress):=20nova=20skill=20mcp-skyboot-i?= =?UTF-8?q?cons=20=E2=80=94=20MCP=20Skyboot=20Custom=20Icons=20for=20Eleme?= =?UTF-8?q?ntor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Estado do plugin, catalogo dos 15 icon packs, listar icones de um pack activo, activar/desactivar pack. - Plugin so encontrado activo em descomplicar.pt (producao); os outros 7 sites do bundle confirmados sem ele. - MCP maioritariamente so-leitura: unica escrita real e o toggle on/off por pack (skb_cife_manage_icon), testada em ciclo idempotente contra producao. --- wordpress/skills/mcp-skyboot-icons/SKILL.md | 112 ++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 wordpress/skills/mcp-skyboot-icons/SKILL.md diff --git a/wordpress/skills/mcp-skyboot-icons/SKILL.md b/wordpress/skills/mcp-skyboot-icons/SKILL.md new file mode 100644 index 0000000..9f27a0a --- /dev/null +++ b/wordpress/skills/mcp-skyboot-icons/SKILL.md @@ -0,0 +1,112 @@ +--- +name: mcp-skyboot-icons +description: MCP dedicado (node stdio, ligação `skyboot-icons` em ~/.omp/agent/mcp.json) para o Skyboot Custom Icons for Elementor — confirmado activo só em descomplicar.pt (produção). Estado do plugin, catálogo dos 15 icon packs bundlados (Elegant, Linearicons, Themify, Simple Line, Line, Ionicons, Icofont, Line Awesome, Material Design, Devicons, Icomoon, Elusive, Iconic, Brands, Open Iconic) com prefixo CSS e contagem de ícones ao vivo, listar os nomes de ícone de um pack activo, activar/desactivar um pack no selector de ícones do Elementor. Usar quando "skyboot icons", "custom icons elementor", "icon pack elementor", "activar pack de ícones", "material design icons elementor", "brands icon elementor", "quantos ícones tem o pack X". +layer: wiki +--- + +# /mcp-skyboot-icons — MCP dedicado ao Skyboot Custom Icons for Elementor + +Projecto em `/media/ealmeida/Dados/Dev/mcp-skyboot-icons/` (TypeScript, SDK MCP oficial, stdio). +Sem código PHP novo no WordPress — leituras via `wp option get`/`wp plugin list` e `wp eval` sobre o +próprio filtro que o plugin usa (`elementor/icons_manager/additional_tabs`); a única escrita é +`wp option update` sobre o option nativo do plugin. + +## Âmbito real do plugin (investigado no código-fonte v1.2.0 em 19-08-2026) + +O Skyboot Custom Icons for Elementor **não gere ícones custom enviados pelo utilizador** — é um +plugin utilitário que embrulha **15 fontes de ícones de terceiros já bundladas** (CSS + fontes +estáticas em `assets/`, ~18k linhas de PHP a registá-las) e as regista no selector de ícones nativo +do Elementor via `add_filter('elementor/icons_manager/additional_tabs', ...)`, uma classe PHP +dedicada por pack em `classes/icons/class--icon.php`. + +A **única configuração real e gravável** é um interruptor on/off por pack, tudo dentro de UM único +wp_option: + +- **`skb_cife_manage_icon`** — array associativo nativo `{ pack_key: "on"|"off" }`, um por cada um + dos 15 packs. Confirmado como **array PHP nativo** (não string com JSON dentro) — `wp option get` + com e sem `--format=json` devolvem a mesma estrutura, logo `--format=json` é seguro tanto para + leitura como escrita. `Skb_Cife_Base::include_files()` só faz `require_once` da classe de um pack + se a sua chave estiver `"on"` — um pack desactivado nunca chega a registar o seu tab no Elementor + nem a enfileirar o CSS (`classes/class-scripts-manager.php` segue exactamente a mesma condição + para o `wp_enqueue_style`). +- **`skb_cife_version`** — string simples com a versão gravada na última activação/upgrade + (`Skb_Cife_Base::activate()`/`check_for_updates()`). + +Não há upload de packs SVG custom, não há gestão de licença PRO gravável (o gate PRO é só +`defined('SKB_CIFE_PRO_VERSION')` + filtro `skb_cife_is_pro`, sem UI de licença na Free), e não há +nenhuma outra opção do utilizador exposta pelo `settings-api/` além deste único toggle por pack — +confirmado por leitura de `settings-api/settings-fields.php::get_icon_packs()` (15 entradas, sem +mais nada). Por isso este MCP é **maioritariamente só-leitura com uma única tool de escrita real**, +em vez de inventar capacidades que o plugin não tem. + +## Sites conhecidos + +Chamar `skyboot_list_sites` para a lista actual. Verificado ao vivo via `wp plugin list` nos 8 sites +reais do bundle em 19-08-2026: **só `descomplicar` (produção, `/home/ealmeida/public_html`)** tem o +plugin instalado (v1.2.0, activo). Os outros 7 (`starter`, `emanuelalmeida`, `ccv`, `care`, +`ecommerce-demo`, `e-commerce`, `ecommerce`) não o têm. Também aceita um path absoluto directamente +(`/home/ealmeida/`) para sites fora desta lista, sem exigir rebuild do MCP. + +Estado verificado em produção em 19-08-2026: **todos os 15 packs activos** (`"on"`), PRO **não** +activo, Elementor 4.2.2, PHP 8.2.31. + +## Tools (5) + +| Tool | Read-only | Uso | +|---|---|---| +| `skyboot_list_sites` | sim | Aliases conhecidos, path WP, nota de estado | +| `skyboot_get_status` | sim | Instalado/activo, versão (plugin list + option), PRO activo, Elementor/PHP vistos pelo plugin, contagem de packs activos/totais | +| `skyboot_list_icon_packs` | sim | 15 packs: nome, descrição, fonte, contagem aproximada estática, estado activo/inactivo (`skb_cife_manage_icon`) e, se activo, prefixo CSS real + contagem exacta de ícones ao vivo | +| `skyboot_get_icon_pack_icons` | sim | Nomes de ícone (sufixo, sem prefixo CSS) de UM pack **activo**, com pesquisa por substring e paginação (`limit`/`offset`) | +| `skyboot_set_icon_pack_state` | não | Activa/desactiva um pack — merge sobre o `skb_cife_manage_icon` actual, as outras chaves ficam intactas | + +Todas as tools exigem `site` como primeiro parâmetro. `skyboot_get_icon_pack_icons` e +`skyboot_set_icon_pack_state` exigem `pack` como uma das 15 chaves de `ICON_PACK_KEYS` (validado +pelo próprio schema Zod da tool — `elegant_icon`, `linearicons_icon`, `themify_icon`, +`simpleline_icon`, `line_icon`, `ion_icon`, `icofont_icon`, `lineawesome_icon`, +`materialdesign_icon`, `devicons_icon`, `icomoon_icon`, `elusive_icon`, `iconic_icon`, +`brands_icon`, `open_iconic_icon`). + +**Gotcha ao consultar ícones:** `skyboot_get_icon_pack_icons` só funciona para um pack **já +activo** — se estiver desactivado a sua classe PHP nunca é carregada e o Elementor nunca viu o tab +(`tab_not_found`, mensagem de erro explícita a sugerir activar primeiro com +`skyboot_set_icon_pack_state`). Não há forma segura de ler os nomes de ícone de um pack desactivado +sem carregar código PHP arbitrário fora do fluxo normal do WordPress. + +## Segurança + +Todas as escritas usam `wp option update` sobre o option nativo do plugin, nunca SQL directo. O +merge (ler o option completo → alterar só a chave do pack pedido → escrever o objecto completo) +replica exactamente o que acontece quando um humano grava a página "Manage Icons" via +`options.php` (confirmado em `settings-api/class.settings-api.php::sanitize_options()` — o +`register_setting` por secção substitui o option inteiro, por isso o form da própria página também +submete sempre todas as checkboxes de uma vez). O JSON completo viaja em base64 pelo STDIN do +processo SSH remoto (`base64 -d | wp option update ... --format=json`), nunca interpolado na linha +de comando. As leituras dinâmicas (`skyboot_list_icon_packs`, `skyboot_get_icon_pack_icons`) usam +`wp eval` com um corpo PHP estático (template fixo, só os parâmetros `tabKey`/`search`/`limit`/ +`offset` são interpolados via `JSON.stringify`, nunca texto livre do utilizador sem escaping JSON). + +## Verificação + +Construído e testado ponta-a-ponta contra produção (`descomplicar.pt`) em 19-08-2026: + +- `npm run build` limpo, smoke test stdio (`initialize` + `tools/list`, 5 tools confirmadas). +- **3 leituras reais**: `skyboot_get_status` devolveu `v1.2.0 activo, PRO false, Elementor 4.2.2, + PHP 8.2.31, 15/15 packs activos` — confirmado byte-a-byte contra `wp plugin list`/`wp option get` + directos fora do MCP. `skyboot_list_icon_packs` devolveu as 15 entradas com contagens ao vivo + idênticas às lidas manualmente via `wp eval` (ex. `materialdesign_icon` 5346, `brands_icon` 934, + `icofont_icon` 2095). `skyboot_get_icon_pack_icons(brands_icon, search="adobe")` devolveu as 14 + entradas Adobe (`adobe`, `adobeacrobatreader`, …, `adobexd`), idênticas ao array PHP lido + directamente do código-fonte da classe. +- **Escrita testada com ciclo completo idempotente**: `skyboot_set_icon_pack_state(open_iconic_icon, + false)` → confirmado `wp option get skb_cife_manage_icon` com `"open_iconic_icon":"off"` e as + outras 14 chaves intactas, e `apply_filters('elementor/icons_manager/additional_tabs', [])` já sem + o tab `skb_cife-open_iconic-icon` (`false`) → `skyboot_set_icon_pack_state(open_iconic_icon, true)` + → confirmado `wp option get skb_cife_manage_icon` byte-a-byte idêntico ao estado inicial (todos os + 15 packs `"on"`). + +## Skills relacionadas + +Nenhuma skill de conhecimento dedicada ao Skyboot Custom Icons for Elementor existe neste bundle — +esta skill é a única documentação (âmbito real + tools). Ver `elementor` para o ecossistema +Elementor/Crocoblock mais amplo e `wp-cli` para o padrão geral de gestão via WP-CLI no servidor CWP.