feat: sync all plugins, skills, agents updates

New plugins: core-tools
New skills: auto-expense, ticket-triage, design, security-check,
  aiktop-tasks, daily-digest, imap-triage, index-update, mindmap,
  notebooklm, proc-creator, tasks-overview, validate-component,
  perfex-module, report, calendar-manager
New agents: design-critic, design-generator, design-lead,
  design-prompt-architect, design-researcher, compliance-auditor,
  metabase-analyst, gitea-integration-specialist
Updated: all plugin configs, knowledge datasets, existing skills

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-05 17:16:15 +00:00
parent f2b5171ea2
commit 9404af7ac9
184 changed files with 20865 additions and 1993 deletions

View File

@@ -0,0 +1,294 @@
# Crocoblock — Automação Headless e Integrações Avançadas
## 1. JetEngine 3.8.0 — MCP Server Nativo
A partir da versão 3.8.0, o JetEngine inclui um **MCP Server nativo** que expõe a topologia completa do site a agentes IA (Claude, Copilot, Cursor).
### Activar o MCP Server
```
WP Admin > JetEngine > AI Command Center > Enable MCP Server
→ URL do servidor: https://site.pt/wp-json/jet-engine/v1/mcp
→ Autenticação: Application Password
```
### Capacidades do MCP
| Capacidade | Descrição |
|-----------|-----------|
| Inspecção de schema | Lista CPTs, CCTs, Meta Boxes, Taxonomias, Relações |
| Criação de CPT | Instanciar novo Custom Post Type via prompt |
| Criação de CCT | Definir Custom Content Type com campos tipados |
| Definir relações | Criar estruturas relacionais entre entidades |
| Query Builder | Criar queries estruturadas |
**Caso de uso:** Cliente especifica necessidades → Claude interroga MCP → constrói arquitectura completa (CPT + CCT + Relations + Queries) sem GUI.
---
## 2. JetFormBuilder — Formless Actions Endpoints
O addon **Formless Actions Endpoints** permite usar as acções de um formulário JetFormBuilder como endpoint REST puro, sem renderizar formulário no frontend.
### Como Activar
```
JetFormBuilder > Settings > Formless Actions Endpoints: Enable
Cada formulário recebe rota: POST /wp-json/jet-fb/v1/form/{form_id}
```
### Payload de Exemplo
```bash
# Submeter dados para formulário sem interface visual
# Acciona todas as Post Submit Actions configuradas (Create Post, Email, Webhook, etc.)
curl -X POST https://site.pt/wp-json/jet-fb/v1/form/1234 \
-H "Authorization: Basic dXNlcjpwYXNz..." \
-H "Content-Type: application/json" \
-d '{
"nome_cliente": "Empresa ABC",
"email": "contacto@empresaabc.pt",
"valor_contrato": 5000,
"tipo_servico": "website"
}'
```
### Encadear Acções Complexas
```
Um único request pode:
1. Criar Post no CPT "Projecto" com status pending
2. Enviar email ao admin
3. Actualizar relação Cliente↔Projecto
4. Enviar Webhook para n8n
5. Criar registo em CCT "Notificacoes"
```
### Interceptar com Hook Custom
```php
<?php
// Interceptar antes de gravar para validação externa
add_action('jet-form-builder/custom-action/analise_risco', function($request, $action_handler) {
$dados = $request->get_all();
$texto = sanitize_textarea_field($dados['descricao'] ?? '');
$post_id = absint($dados['post_id'] ?? 0);
if (empty($texto) || !$post_id) {
// Cancelar o processamento com erro
throw new \Jet_Form_Builder\Exceptions\Action_Exception('campos_obrigatorios_vazios');
}
// Validação via API externa (exemplo: análise de risco)
$score = minha_api_de_risco($texto);
if ($score > 90) {
throw new \Jet_Form_Builder\Exceptions\Action_Exception('risco_inaceitavel');
}
// Actualizar meta field com o score calculado
update_post_meta($post_id, '_score_risco', $score);
$action_handler->add_response([
'status' => 'success',
'message' => 'Processado com sucesso.',
'score' => $score,
]);
}, 10, 2);
```
### Tabela de Registos
```sql
-- JetFormBuilder guarda registo de cada submissão
SELECT *
FROM wp_jet_fb_records
WHERE form_id = 1234
ORDER BY id DESC
LIMIT 10;
```
---
## 3. JetSmartFilters — Indexer e Automação
### O Indexer
O JetSmartFilters tem um subsistema de contagem chamado **Indexer** que mapeia contadores em `jet_smart_filters_indexer`.
```sql
-- Ver contagens indexadas
SELECT * FROM jet_smart_filters_indexer
WHERE filter_id = 550
LIMIT 20;
```
**Problema:** Após actualizações SQL directas nas tabelas CCT ou wp_jet_rel_default, os contadores dos filtros ficam desactualizados.
**Solução:**
```php
<?php
// Recalcular Indexer após bulk update
add_action('meu_evento_pos_atualizacao', function() {
if (function_exists('jet_smart_filters')) {
jet_smart_filters()->indexer->index_all();
}
});
```
```bash
# Via WP-CLI
PHP="/opt/alt/php-fpm83/usr/bin/php"
WP="$PHP /usr/local/bin/wp --allow-root --path=/home/USER/public_html"
$WP eval "jet_smart_filters()->indexer->index_all();"
```
### Manipular Filtros Programaticamente
```php
<?php
// Injectar limites automáticos num filtro (ex: baseado no role do utilizador)
add_filter('jet-smart-filters/filter-instance/args', function($args, $filter_instance) {
// Só aplicar ao filtro #2550
if ((int) $args['filter_id'] !== 2550) {
return $args;
}
// Forçar range baseado em contexto (ex: permissões do utilizador)
$args['current_value'] = [
'min' => '100',
'max' => '500',
];
// Forçar AJAX
$args['apply_type'] = 'ajax';
return $args;
}, 10, 2);
```
### Forçar Re-indexação após SQL Massivo
```php
<?php
// Pipeline completo pós-sync ERP (exemplo: n8n aciona via HTTP)
add_action('rest_api_init', function() {
register_rest_route('descomplicar/v1', '/reindex', [
'methods' => 'POST',
'callback' => function() {
wp_cache_flush();
\Jet_Engine\Query_Builder\Manager::instance()->listings_cache->clear();
jet_smart_filters()->indexer->index_all();
return rest_ensure_response(['success' => true, 'message' => 'Re-indexação concluída.']);
},
'permission_callback' => function() {
return current_user_can('edit_posts');
},
]);
});
```
---
## 4. Kits e Templates — Export/Import Programático
### Estrutura de um Kit
```
Kit JSON (manifest.json):
├── CPTs com todas as configurações
├── CCTs com schema de campos
├── Meta Boxes
├── Taxonomias
├── Relações
├── Query Builder queries
├── Listing Templates (Elementor)
└── JetFormBuilder forms
```
### Export via WP-CLI
```bash
PHP="/opt/alt/php-fpm83/usr/bin/php"
WP="$PHP /usr/local/bin/wp --allow-root --path=/home/USER/public_html"
# Exportar estrutura JetEngine para JSON
$WP eval '
$cpts = get_option("jet_engine_cpt", []);
$ccls = get_option("jet_engine_ccl", []);
$rels = get_option("jet_engine_relations", []);
$metas = get_option("jet_engine_meta_boxes", []);
$kit_data = compact("cpts", "ccls", "rels", "metas");
file_put_contents("/tmp/kit-jetengine.json", json_encode($kit_data, JSON_PRETTY_PRINT));
'
echo "Kit exportado para /tmp/kit-jetengine.json"
```
### Import em Novo Ambiente
```bash
# ATENÇÃO: os IDs das relações mudam entre ambientes
# Sempre usar slugs como referência, não IDs numéricos
$WP eval-file /tmp/import-kit.php
$WP cache flush
$WP rewrite flush
```
### Pitfall de Migração — IDs de Relações
```
Problema: CCT item #45 no staging → ID #45
Mesmo item no production após import → ID #102
→ Relações wp_jet_rel_default ficam com IDs errados
Solução: Usar slug/título como referência durante migração
Converter para ID após import via get_posts(['name' => 'slug'])
Ou usar WP All Import para recriar relações com mapeamento de IDs
```
---
## 5. Integração WooCommerce + JetEngine
### Queries em Produtos WooCommerce
```
Produtos WooCommerce são CPT 'product' → compatíveis com JetEngine
Query Builder pode filtrar produtos por meta fields JetEngine adicionados
JetWooBuilder consome estas queries para listagens customizadas
```
### Relações com Produtos
```sql
-- Produtos relacionados com CPT "Fornecedor" via JetEngine Relations
SELECT p.post_title AS produto, f.post_title AS fornecedor
FROM wp_posts p
JOIN wp_jet_rel_default r ON r.child_object_id = p.ID
JOIN wp_posts f ON f.ID = r.parent_object_id
WHERE r.rel_id = 'relacao_fornecedores_produtos'
AND p.post_status = 'publish';
```
---
## 6. Limitações e Riscos Críticos
| Risco | Impacto | Mitigação |
|-------|---------|-----------|
| SQL directo em wp_postmeta serializado | **Crítico** — corrupção de dados | NUNCA. Usar PHP `unserialize → edit → serialize` |
| store_items_type = "replace" na REST API | **Destrutivo** — apaga todas as relações | Usar "update" salvo intenção explícita |
| Alterar wp_options serializados via SQL | **Crítico** — instalação WordPress corrompida | Sempre via PHP `get_option → update_option` |
| SQL sem flush de cache | Dados obsoletos em listings | Sempre `wp_cache_flush()` + `listings_cache->clear()` + `indexer->index_all()` |
| Registar meta boxes antes de init prioridade 12 | Falha silenciosa | Usar hook `jet-engine/meta-boxes/register-instances` |
| Importar Kit entre versões JetEngine diferentes | Dependências fantasma no Query Builder | Manter versões alinhadas em staging e production |
---
*Crocoblock Automation | Descomplicar® | 18-02-2026*

View File

@@ -0,0 +1,220 @@
# Crocoblock — Padrões de Integração Avançados
## Padrão 1: Directório com Filtros + Mapa
**Plugins:** JetEngine + JetSmartFilters + JetElements (Maps)
```
Arquitectura:
CPT "Negócio" (com meta: morada, coordenadas, categoria, horário)
Query Builder (posts, post_type=negocio)
┌────────────────┬──────────────────┐
│ Listing Grid │ Listing Map │
│ (cards) │ (pins) │
└────────────────┴──────────────────┘
↑ sincronizados ↑
JetSmartFilters:
- Categoria (checkbox, taxonomy)
- Localização (select, meta)
- Pesquisa (search text)
- Raio de distância (range, meta GPS)
```
**Configuração de sincronização:**
```
Listing Map > Settings:
├── Synchronize with Listing Grid: YES
└── Listing Grid Selector: ID do widget Listing Grid
JetSmartFilters > Apply For:
└── Seleccionar ID do Listing Grid
(o mapa segue automaticamente via sincronização)
```
---
## Padrão 2: Marketplace / Multi-vendor Simples
**Plugins:** JetEngine + JetFormBuilder + JetSmartFilters + Profile Builder
```
Fluxo do vendedor:
1. Registo (JetFormBuilder → Register User)
2. Login
3. Dashboard vendedor (Profile Builder)
4. Criar produto (JetFormBuilder → Create Post no CPT)
5. Produto aparece no catálogo (Listing Grid filtrado por author)
Fluxo do comprador:
1. Catálogo com filtros (JetSmartFilters)
2. Contactar vendedor (JetFormBuilder → Email ao author)
3. Ver perfil vendedor (Profile Builder page pública)
```
**Relations necessárias:**
```
User → N Produtos (one-to-many)
User → N Favoritos (many-to-many)
Produto → N Reviews (one-to-many, via JetReviews)
```
---
## Padrão 3: Portal de Imobiliário
**Plugins:** JetEngine + JetSmartFilters + JetWooBuilder (opcional) + JetBooking
```
CPT: Imóvel
Meta Boxes:
├── Preço (number)
├── Área m² (number)
├── Tipologia (select: T0/T1/T2/T3/T4+)
├── Tipo (select: venda/arrendamento)
├── Localização (taxonomy: Distrito → Concelho → Freguesia)
├── Coordenadas (map)
├── Galeria (gallery)
├── Características (checkbox-list: piscina, garagem, jardim...)
└── Agente responsável (posts: CPT Agente)
Query Builder:
├── Ordenação: data / preço / área
└── Meta Query: tipo = "arrendamento" (para página específica)
JetSmartFilters:
├── Range: Preço min-max
├── Range: Área min-max
├── Checkboxes: Tipologia
├── Select Hierarchical: Localização
├── Checkboxes: Características
└── Sorting: Preço ASC/DESC, Mais recentes
```
---
## Padrão 4: E-learning / Cursos
**Plugins:** JetEngine + JetFormBuilder + Profile Builder
```
CPTs:
├── Curso (conteúdo, preço, dutor)
├── Lição (sub-item do curso)
└── Avaliação (questionário)
Relations:
├── Curso → N Lições (one-to-many)
├── Utilizador → N Cursos Inscritos (many-to-many)
└── Utilizador → N Avaliações (one-to-many)
Profile Builder Pages:
├── Meus Cursos (Query: cursos onde utilizador está inscrito)
├── Continuar Lição (última lição acedida)
└── Certificados (download PDF após conclusão)
Automatização:
JetFormBuilder → compra → Inscrever no curso → Criar relação User↔Curso
```
---
## Padrão 5: Multi-Relation (Relações Aninhadas)
```
Exemplo: Agência → Clientes → Projectos → Tarefas
Relations JetEngine:
├── agencia_clientes: Agência (1) → Clientes (N)
├── cliente_projectos: Cliente (1) → Projectos (N)
└── projecto_tarefas: Projecto (1) → Tarefas (N)
No Listing Template de Agência:
├── Lista de Clientes (Relation Field Widget)
│ └── Dentro de cada Cliente: Lista de Projectos (nested listing)
│ └── Dentro de cada Projecto: Contador de Tarefas
Nota: Listings aninhados afectam performance.
Limitar a 2 níveis de profundidade.
Para listas longas, usar AJAX/JetSmartFilters paginado.
```
---
## Padrão 6: User-Generated Content (UGC)
**Plugins:** JetEngine + JetFormBuilder + Profile Builder + JetSmartFilters
```
Fluxo:
1. Utilizador logado → Dashboard (Profile Builder)
2. Formulário "Submeter Conteúdo" (JetFormBuilder)
→ Action: Create Post no CPT "Aviso" com status "pending"
→ Action: Email de notificação ao admin
3. Admin aprova → post_status = publish
4. Conteúdo aparece no listing público
Queries do Dashboard:
├── "Os meus avisos" → Query: author = %current_user_id% + status = any
└── "Aprovados" → Query: author = %current_user_id% + status = publish
Moderação rápida:
├── Admin lista pendentes com Listing Grid
└── JetFormBuilder inline para aprovar/rejeitar (Update Post Status)
```
---
## Padrão 7: JetBooking + WooCommerce + JetEngine
```
Fluxo de Reserva:
1. Página de serviço (CPT Serviço com meta JetEngine)
2. Calendário JetBooking (disponibilidade em tempo real)
3. Seleccionar datas → Form de reserva (JetFormBuilder ou JetBooking nativo)
4. Checkout WooCommerce (JetBooking cria produto temporário)
5. Pagamento → Reserva confirmada
6. Email de confirmação (JetBooking + SMTP)
7. Dashboard cliente (Profile Builder → Minhas Reservas)
Automatização n8n:
JetBooking webhook → n8n → Google Calendar → SMS (via Twilio)
```
---
## Anti-Padrões (Evitar)
### Demasiados JetPlugins Activos
```
Problema: Cada JetPlugin adiciona JS/CSS extra
Solução: Desactivar plugins não usados em cada site específico
Ferramenta: JetPlugins > Settings > Disable components não usados
```
### Listings Sem Paginação em Catálogos Grandes
```
Problema: Listing Grid sem paginação carrega todos os posts → PHP timeout
Solução: Sempre activar paginação ou Load More em listas >20 items
```
### JetSmartFilters Sem AJAX
```
Problema: URL-based filters recarregam a página inteira
Uso correcto: AJAX filters para UX fluida; URL-based apenas para SEO
```
### Meta Boxes em CCT Desnecessariamente
```
CCT não suporta taxonomies nativas, comentários, revisões.
Usar CPT quando precisar dessas funcionalidades WordPress.
```
---
*Crocoblock Patterns | Descomplicar® | 18-02-2026*

View File

@@ -0,0 +1,240 @@
# Crocoblock — Referência Detalhada de Plugins
## JetElements
Widgets adicionais para Elementor. Não depende do JetEngine.
### Widgets Principais
| Widget | Uso |
|--------|-----|
| Animated Box | Caixa com flip/hover reveal |
| Circle Progress | Gauge circular animado |
| Timeline | Cronologia vertical/horizontal |
| Countdown Timer | Contador regressivo |
| Scroll Navigation | Navegação por secções |
| Maps | Google Maps avançado |
| Weather | Widget de meteorologia |
| Price List | Lista de preços |
| Progress Bar | Barra de progresso |
| Slider | Slider de imagens/conteúdo |
| Portfolio | Grid de portfolio com filtros |
| Testimonials | Slider de testemunhos |
---
## JetSmartFilters
Filtros AJAX para qualquer listing (JetEngine, WooCommerce, Archive).
### Tipos de Filtros
| Tipo | Quando Usar |
|------|-------------|
| Checkboxes | Categorias múltiplas |
| Radio | Opção única (ordenação) |
| Select | Dropdown de valores |
| Range | Preço, área (slider min-max) |
| Date Range | Filtrar por datas |
| Search | Pesquisa por texto |
| Rating | Filtrar por estrelas |
| Color Picker | Filtros visuais por cor |
### Configuração Essencial
```
1. Criar filter em JetSmartFilters > Filters
2. Seleccionar Source: JetEngine Query / WC_Query / WP_Query
3. Seleccionar Field: meta field / taxonomy / post field
4. Adicionar Filter Widget ao Elementor
5. Ligar ao Listing Grid via "Apply filters for" (seleccionar ID do listing)
```
### Filtros Aninhados (Dependent Filters)
```
Exemplo: Distrito → Concelho (filho depende do pai)
- Configurar taxonomy pai e filho no JetEngine
- Em JetSmartFilters: activar "Hierarchical taxonomy filter"
- Ou usar "Visible terms" com condição dinâmica
```
---
## JetWooBuilder
Templates custom para WooCommerce via Elementor.
### Templates Disponíveis
| Template | Substitui |
|----------|-----------|
| Shop (Archive) | Página principal da loja |
| Product | Single product page |
| Cart | Página de carrinho |
| Checkout | Página de checkout |
| My Account | Dashboard do cliente |
| Thank You | Página pós-compra |
| Category | Página de categoria |
### Widgets JetWooBuilder
```
Products Grid # Grid de produtos com query custom
Product Price # Preço com styling avançado
Product Gallery # Galeria com thumbnails
Add to Cart # Botão com variantes
Product Tabs # Descrição, Reviews, Atributos
Related Products # Produtos relacionados
Mini Cart # Cart dropdown
```
### Configurar Template de Produto
```
1. JetWooBuilder > Templates > Add New
2. Template Type: Product
3. Editar com Elementor — arrastar widgets JetWoo
4. Conditions: incluir "Product" (todos) ou específico por categoria/tag
```
---
## JetFormBuilder
Forms com lógica condicional, integrações e notificações.
### Tipos de Campos
```
Text, Email, Tel, URL, Number, Textarea
Date, Time, DateTime
Select, Radio, Checkboxes
File Upload, Image Upload
Hidden Field, Calculated Field
Repeater Field (subformulário dinâmico)
```
### Acções Pós-Submit
| Acção | Função |
|-------|--------|
| Send Email | Notificação email standard |
| Send Email (Advanced) | Template HTML customizado |
| Create Post | Criar CPT (com JetEngine) |
| Update User | Actualizar user meta |
| Webhook | Enviar para n8n/Make/Zapier |
| Redirect | Redirecionar após submit |
| Register User | Criar conta WP |
| Login User | Login automático |
| MailChimp/ActiveCampaign | Subscrição newsletter |
### Formulário Silencioso (Para n8n)
```php
// Receber POST externo que passa pelas validações do JetFormBuilder
// Criar formulário com campos que correspondem ao payload
// Submeter via HTTP POST para: /wp-json/jet-form-builder/v1/process-form
// Autenticação: Application Passwords
```
---
## JetPopup
Popups com triggers e condições de display avançadas.
### Triggers
| Trigger | Config |
|---------|--------|
| On Page Load | Delay em segundos |
| Exit Intent | Detecta movimento para fora |
| Scroll to Element | Scroll até % ou selector CSS |
| Click on Element | Selector CSS do trigger |
| After Inactivity | Segundos sem interacção |
| After N Page Views | Contador de visitas |
| Once Per Session | Não repete na sessão |
### Conditions (Display)
```
URL match / URL contains
User logged in / out
User role
Device type (mobile/desktop)
WooCommerce: cart empty/not empty, specific product in cart
JetEngine: post type, taxonomy, specific post
```
---
## JetBooking
Sistema de booking com calendário de disponibilidade.
### Fluxo Base
```
1. Configurar Unidade de Booking (ex: Quarto, Serviço)
2. Definir preços (diários, por horas, temporada)
3. Definir disponibilidade e check-in/check-out rules
4. Criar template de booking com Elementor
5. Adicionar Calendário + Booking Form ao template
6. Configurar emails de confirmação
```
### Integração WooCommerce
```
JetBooking → WooCommerce Product → Checkout WooCommerce
- Preço calculado automaticamente (n noites × preço/noite)
- Stock = disponibilidade do calendário
```
---
## JetBlocks
Widgets para construir headers e footers com Elementor.
### Widgets Disponíveis
```
Navigation Menu # Menu responsivo avançado
Site Logo # Logo com dark mode toggle
Cart Button # Contador de itens no carrinho
Search Box # Pesquisa com AJAX
Auth Links # Login/Logout dinâmico
User Name # Nome do utilizador logado
Breadcrumbs # Fil d'Ariane
Mobile Menu # Menu hamburger
```
---
## JetThemeCore
Theme Builder alternativo ao Elementor Pro (para licenças Free).
### Templates
```
Header / Footer
Single (Posts, CPT)
Archive (Category, Tag, CPT Archive)
Search Results
404
```
### Diferença vs Elementor Pro Theme Builder
```
JetThemeCore: Gratuito, condições básicas
Elementor Pro: Mais condições, melhor integração com Popup Builder
Recomendação: Usar Elementor Pro se disponível
```
---
*Crocoblock Plugins Reference | Descomplicar® | 18-02-2026*