Compare commits

...
11 Commits
Author SHA1 Message Date
ealmeida 37af142c33 chore: ignora graphify-out/ (artefacto local do hook) 2026-07-30 22:40:06 +01:00
ealmeida 0e2c832fac marketplace: bump marketing 2.0.0, gestao 1.7.0, project-manager 1.2.0, wordpress 1.1.0 2026-07-30 22:39:49 +01:00
ealmeida d9d4bb8858 wordpress: adiciona skill wp-content-seo-gate 2026-07-30 22:39:49 +01:00
ealmeida 3ed97b472e project-manager: adiciona skills project-init e start 2026-07-30 22:39:48 +01:00
ealmeida 04f955ed0a gestao: adiciona agente hr-specialist 2026-07-30 22:39:48 +01:00
ealmeida 24ef1f6d27 gestao: remove referências à skill /research inexistente em deep-research 2026-07-30 22:39:48 +01:00
ealmeida 2d05873642 marketing: migra superfície SEO para OpenSEO (motor único)
As skills de SEO assentavam em quatro dependências, nenhuma operacional:
SEO Tools API (localhost:3000, pasta inexistente em disco), Ahrefs MCP
(nunca esteve em config), gsc e lighthouse (em disabledServers). Os seis
passos da /seo-audit e o workflow inteiro da /seo-report apontavam para
tooling morto — não eram executáveis.

- seo-audit v3.0: ordem por custo (grátis → lote pago → unitário pago),
  gate de mercado (PT = 2620/pt) e gate de maxPages
- seo-report v3.0: cobertura de crawl obrigatória no entregável
- ferramentas-api.md: inventário das 24 ferramentas OpenSEO + tabela de
  migração endpoint a endpoint
- implementacao-tecnica.md: striking distance, desperdício e filtro de
  ruído do GSC em código
- seo-specialist v3.0: primary_mcps [openseo], bloco de MCPs desligados,
  FID → INP nos Core Web Vitals

maxPages tem default 50: descomplicar.pt auditado com o default deu 25
URLs e 92 issues sem críticos; com maxPages 600 deu 1337 issues e 9
críticos. Documentado como gate — a fase Search Console dimensiona o crawl.

Limitações declaradas nas skills: get_audit_issues devolve contagens sem
URLs pela bridge MCP (structuredContent.issues não é entregue) e o whoami
não expõe saldo de créditos em self-hosted.
2026-07-30 22:39:40 +01:00
ealmeida f90ba6ec76 chore: ignora estado de runtime IJFW (.ijfw/) 2026-07-30 22:39:40 +01:00
ealmeidaandClaude Opus 4.8 04d9e50561 metodo-design-pro: enquadramento e do dono do produto, nao do agente
Licao do teste WhatSMS: o briefing enquadrou um sistema de automacao de
contacto multicanal como bot de resposta a mensagens, e o resultado foi
uma landing page de chatbot de WhatsApp.

Nova seccao 0: perguntar o posicionamento e nunca presumi-lo; "esta
robotico" pede tom e nao reescrita de posicionamento; briefing longo
escrito sozinho impede o motor de fazer as perguntas certas.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 11:34:28 +01:00
ealmeidaandClaude Opus 4.8 0526320c2d design-media: rascunhos da migracao para Open Design
Levantamento e metodo, ainda por aprovar:

- SPEC-opendesign-migration.md: plano de migrar as skills e agents do
  plugin para o Open Design como motor unico, com design systems geridos
  la (Descomplicar e um por cliente)
- DRAFT-metodo-design-pro.md: contrato de entrada com 4 pilares, fluxo em
  4 fases, regra do hero, pipeline template-first (Envato e galerias) e
  directrizes de operacao no Open Design

Nenhum destes documentos esta validado por uso real. O primeiro teste
(WhatSMS) falhou no enquadramento — ver nota no topo do metodo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 22:18:18 +01:00
ealmeidaandClaude Opus 4.8 d852d54bf3 brand-guidelines: alinhar com o Open Design e tornar multi-marca
A skill documentava uma paleta azul/laranja (#1a365d, #dd6b20) com Open Sans
que nao corresponde nem ao design system nem ao site real. Cada ferramenta
produzia material com uma marca diferente.

Passa a espelhar o DESIGN.md do Open Design como fonte de verdade unica:
dourado #cc8d00 sobre preto e branco, Montserrat (display) e Inter (corpo),
com precedencia explicita do DESIGN.md sobre qualquer espelho.

Reformulada para servir qualquer marca (Descomplicar e clientes), com
procedimento para criar design systems de cliente a partir de material real
via brand-extract, validacao antes de tornar normativo, e um projecto por marca.

- SKILL.md v2.0.0: espelho correcto + gestao multi-marca
- descomplicar-theme.md v2.0.0: tokens YAML derivados do DESIGN.md
- color-palettes.md removido: 47 valores derivados da paleta errada
- design-systems-multimarca.md: procedimento de gestao no Open Design

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 20:46:03 +01:00
22 changed files with 1809 additions and 1131 deletions
+4 -4
View File
@@ -50,7 +50,7 @@
"name": "gestao", "name": "gestao",
"source": "./gestao", "source": "./gestao",
"description": "Project management, time tracking, daily checkups, worklogs, reflections, knowledge management and archiving. Backed by NotebookLM notebooks.", "description": "Project management, time tracking, daily checkups, worklogs, reflections, knowledge management and archiving. Backed by NotebookLM notebooks.",
"version": "1.6.2", "version": "1.7.0",
"author": { "author": {
"name": "Descomplicar - Crescimento Digital", "name": "Descomplicar - Crescimento Digital",
"url": "https://descomplicar.pt" "url": "https://descomplicar.pt"
@@ -80,7 +80,7 @@
"name": "marketing", "name": "marketing",
"source": "./marketing", "source": "./marketing",
"description": "Digital marketing strategy, SEO, content marketing, social media, ads, copywriting, video and YouTube. Backed by NotebookLM notebooks.", "description": "Digital marketing strategy, SEO, content marketing, social media, ads, copywriting, video and YouTube. Backed by NotebookLM notebooks.",
"version": "1.0.0", "version": "2.0.0",
"author": { "author": {
"name": "Descomplicar - Crescimento Digital", "name": "Descomplicar - Crescimento Digital",
"url": "https://descomplicar.pt" "url": "https://descomplicar.pt"
@@ -110,7 +110,7 @@
"name": "project-manager", "name": "project-manager",
"source": "./project-manager", "source": "./project-manager",
"description": "Spec-driven project management with flexible sprints, scope validation, and NotebookLM-powered discovery.", "description": "Spec-driven project management with flexible sprints, scope validation, and NotebookLM-powered discovery.",
"version": "1.1.0", "version": "1.2.0",
"author": { "author": {
"name": "Descomplicar - Crescimento Digital", "name": "Descomplicar - Crescimento Digital",
"url": "https://descomplicar.pt" "url": "https://descomplicar.pt"
@@ -120,7 +120,7 @@
"name": "wordpress", "name": "wordpress",
"source": "./wordpress", "source": "./wordpress",
"description": "WordPress development, maintenance and optimization - plugins, themes, WooCommerce, Elementor, Crocoblock. Backed by NotebookLM notebooks.", "description": "WordPress development, maintenance and optimization - plugins, themes, WooCommerce, Elementor, Crocoblock. Backed by NotebookLM notebooks.",
"version": "1.0.0", "version": "1.1.0",
"author": { "author": {
"name": "Descomplicar - Crescimento Digital", "name": "Descomplicar - Crescimento Digital",
"url": "https://descomplicar.pt" "url": "https://descomplicar.pt"
+6
View File
@@ -1 +1,7 @@
design-media/skills/*/references/__pycache__/ design-media/skills/*/references/__pycache__/
# Estado de runtime IJFW (sessoes, metricas, cursores) — local, nunca versionado
.ijfw/
# Output do graphify (hook local de rebuild)
graphify-out/
@@ -0,0 +1,109 @@
# DRAFT — Método Design Pro (camada de processo sobre Open Design)
**Estado:** Rascunho — origem: síntese Gemini de vídeos de páginas de alta qualidade (2026-07-22), adaptado ao stack Descomplicar.
**Aplica-se a:** websites/landing pages, propostas comerciais, decks PPTX, banners, vídeo — qualquer artefacto de design.
## 0. Quem define o enquadramento (lição do teste WhatSMS, 22-07-2026)
O **enquadramento — proposta de valor, posicionamento, o que se está a vender — pertence ao dono
do produto**. Nunca se deriva de análise do agente nem de diagnóstico de subagente.
No primeiro teste real deste método, o briefing enquadrou o WhatSMS como "responder a mensagens
fora de horas" e pediu mock-ups de conversa. Resultado: uma landing page de bot de WhatsApp, quando
o produto é um sistema de automação de contacto multicanal. O design estava competente; o
enquadramento destruía o posicionamento.
Regras que daí resultam:
- **Perguntar o posicionamento, não os acessórios.** Cor e tipografia têm defaults; a proposta de
valor não tem. Perguntar sobre a segunda, nunca presumi-la.
- **"Está robótico" é um pedido de tom.** Não é licença para reescrever posicionamento nem deitar
fora copy existente. Preservar por omissão; mudar só o que foi pedido.
- **Um diagnóstico que chama "AI slop" ao copy** pode estar a apontar estilo, não substância.
Nunca converter em mandato para substituir tudo.
- **Briefing longo escrito sozinho é sinal de alarme, não de rigor.** Quanto mais completo, mais
eficazmente impede o motor de fazer as perguntas certas ao dono do produto. O Open Design
pergunta — deixá-lo perguntar em vez de pré-responder tudo.
---
## 1. Contrato de Entrada (Zero Rascunhos Genéricos)
O pilar 1 (objectivo/posicionamento) **recolhe-se com o dono do produto**, nunca se deduz — ver secção 0.
Proibido gerar qualquer artefacto sem os 4 pilares explícitos ou deduzidos e confirmados:
1. **Objectivo comercial** — o que o utilizador/cliente deve sentir ou fazer no fim.
2. **Layout narrativo** — ordem exacta das secções/slides e comportamento de transição (scrollytelling em web; arco narrativo em decks/propostas).
3. **Personalidade da marca** — tom de voz, paleta intencional, espaçamento generoso (editorial feel). Fonte: design system no OD (Descomplicar ou cliente).
4. **Público-alvo** — perfil exacto que justifica a conversão.
Sem os 4 pilares → perguntar/deduzir e validar. Nunca template pré-feito como resposta.
## 2. Fluxo em 4 fases (mapeado às skills OD)
| Fase | O quê | Skills OD |
|---|---|---|
| **F1 Arquitectura** | Grelha estrutural, tipografia, hierarquia de blocos (wireframe visual) | `design-consultation`, `design-brief`, design system |
| **F2 Direcção artística** | Implementação com micro-interacções, profundidade, impacto no início. Web: Next.js/TS + Tailwind + Framer Motion | `creative-director`, `high-end-visual-design`, `frontend-design`, `gsap-*`/`emilkowalski-motion` |
| **F3 Variantes (Regra do Hero)** | Secção crítica → 3-5 abordagens estruturais distintas (split / centered minimal / inset frame) para selecção antes de avançar | runs paralelos no OD, `design-shotgun` local; **Google Stitch** (`stitch-loop`, `stitch-design-taste`) para ideação rápida de variantes UI a partir de prompt/sketch/screenshot, com export Figma |
| **F4 Auditoria adversarial** | Validação crítica antes de entrega: consistência visual, tipos TS, acessibilidade, bundle, fluidez de animação, anti-AI-slop | `design-review`, `impeccable-design-polish`, `pptx-html-fidelity-audit` (decks) |
## 3. Regra de Ouro da Modificação
- **Macro** (estrutura, layout, fluxo de páginas/secções) → resolvido e validado primeiro, ao nível global.
- **Micro** (espaçamentos, CTAs, detalhes) → só depois do macro aprovado. Nunca misturar os dois níveis na mesma iteração.
## 4. Pipeline Template-First (Envato & afins)
Um template profissional pode substituir F1+F2 — entra como ponto de partida, nunca como entrega directa.
### 4.1 Duas categorias de fonte
**A. Templates com código/ficheiros (adaptáveis):**
- Envato/ThemeForest (HTML, Next.js, Elementor kits, PPTX, vídeo) — licença cobre projectos de cliente
- UI8, Craftwork (UI kits), Relume (biblioteca Figma de secções), Framer/Webflow templates
**B. Galerias de inspiração (extracção de DNA, nunca cópia):**
- Dribbble, Pageflows, Recent.design, Landingfolio, Screensdesign
- Mobbin (fluxos de apps reais), Awwwards, Godly, Land-book, Lapa Ninja, SaaSFrame
### 4.2 Fluxo de adaptação (categoria A)
1. **Seleccionar** — escolher template alinhado com o layout narrativo do Contrato de Entrada (não o contrário).
2. **Extrair** — estrutura, grelha, tokens do template (`brand-extract`, `image-to-code`, `web-clone`, análise directa dos ficheiros).
3. **Retheme** — aplicar o design system do cliente/Descomplicar sobre a estrutura (`theme-factory`, `redesign-existing-projects`). Zero cores/fontes do template sobram.
4. **Recontentar** — copy e conteúdo reais segundo os 4 pilares; remover secções que não servem o objectivo comercial (cortar > acrescentar).
5. **F4 Auditoria** — igual ao fluxo normal; atenção extra a resíduos do template (placeholders, lorem ipsum, links demo, créditos).
### 4.3 Fluxo de referência (categoria B)
1. Capturar screenshots/URLs das referências escolhidas.
2. Extrair DNA: paleta, tipografia, grelha, ritmo de secções, padrões de interacção (`design-researcher` / visão OD).
3. DNA alimenta F1/F2 como direcção de arte — o artefacto é gerado de raiz com o nosso design system.
### 4.4 Biblioteca local de templates
- Templates descarregados (Envato) arquivados em pasta própria com metadados (fonte, licença, tags de uso) — candidata: `Hub/04-Recursos/Design/templates/` — para reutilização entre projectos.
- Cada adaptação bem-sucedida regista o par template→resultado para acelerar selecções futuras.
## 5. Directrizes operacionais do agente no Open Design
Regras de execução para qualquer agente (Claude Code, Gemini CLI) a operar como motor no OD. As que repetem as secções 1–3 não se duplicam — referem-se.
1. **Contrato de Entrada** (secção 1) — os 4 pilares antes de qualquer geração.
2. **`DESIGN.md` é o contrato da marca** — todas as decisões visuais (tipografia, paleta, espaçamento, componentes) vêm do `DESIGN.md` activo do projecto OD, nunca de adivinhação. A skill define *o quê*; o `DESIGN.md` define *como fica*. Manter o `DESIGN.md` sincronizado com o design system (Descomplicar ou cliente).
3. **Declarar a skill/formato certo** — indicar explicitamente o tipo de saída (`web-prototype`, `dashboard`, `mobile-app`, `deck`) para activar a directriz OD correcta.
4. **Macro → micro** (secção 3, Regra de Ouro).
5. **Variantes antes de fechar** (secção 2, F3) — 3 a 5 variações radicalmente diferentes da secção crítica, resto igual; escolher direcção, só depois refinar.
6. **Referências visuais concretas** — screenshots via menção `@` no chat OD ou ficheiros no projecto; nunca só descrição textual quando existe referência (liga à secção 4.3).
7. **Ecossistema no mesmo projecto OD** — landing + dashboard + app do mesmo cliente vivem no mesmo projecto, para herdar `DESIGN.md`, paleta e tipografia sem deriva (handoff contínuo).
8. **Componentes externos adaptados, não recriados** — gráficos animados, tabelas complexas: importar de bibliotecas (ex: 21st.dev, shadcn/ui) e adaptar ao design system, em vez de gerar do zero.
9. **Acesso directo via MCP** — usar `mcp__open-design__*` (get_artifact, write_file, search_files, start_run) para trabalhar sobre o código vivo do projecto; nunca depender de exports estáticos/zips. Passar `project` explícito (contexto activo expira ~5 min).
10. **Código final limpo e exportável** — HTML/CSS/JS determinístico, responsivo em iframe isolado, pronto para a equipa importar para React/Next.js/Vue sem limpeza. Nada de placeholders, estilos inline órfãos ou dependências fantasma. (Web em produção segue depois PROC-DEV-STANDARD no dev container.)
## 6. Integração futura (após aprovação do SPEC v3.0.0)
- Este método torna-se o corpo da skill `design` (router) — gate de contrato + orquestração das 4 fases.
- Para websites, avaliar skill dedicada `create-pro-website` (Next.js/TS/Tailwind/Framer Motion) que empacota o output OD no nosso stack (dev container, regra 48).
- Quality gate: nenhuma entrega sem F4 com score ≥7/10 (design-critic) e zero findings bloqueantes do design-review.
@@ -0,0 +1,71 @@
# SPEC — Migração do plugin design-media para Open Design (OD)
**Versão alvo:** design-media v3.0.0
**Data:** 2026-07-22
**Estado:** Rascunho — aguarda aprovação
**Decisor:** Emanuel
## 1. Objectivo
O Open Design (MCP `open-design`, daemon local) passa a ser o **motor único** de design do plugin design-media. Os motores actuais (design-engine Fibo/Gemini, Presenton, Stitch, Penpot, python-pptx directo, Remotion local) deixam de ser invocados directamente — tudo passa por projectos OD, skills OD e design systems OD.
## 2. Porquê
- O OD já tem nativamente o que o plugin reimplementa: `brand-guidelines`, `brandkit`, `brand-extract`, `theme-factory`, `pptx-generator`, `pptx`, `slides`, `remotion`, `ui-ux-pro-max`, `imagegen`, `venice-*`/`fal-*` (imagem/vídeo/áudio).
- 143 design systems instalados como plugins (`design-system-*`) + suporte a design systems custom por projecto (o projecto "Banners WiP Descomplicar" já usa `designSystemId: descomplicar`).
- Permite **adaptar entre modelos disponíveis no OD** e **criar design systems por cliente** — requisito directo do Emanuel.
## 3. Âmbito
### 3.1 Design systems geridos no OD (novo pilar)
- Formalizar o design system **`descomplicar`** no OD a partir dos tokens actuais (`skills/brand-guidelines/references/descomplicar-theme.md` YAML + `color-palettes.md`).
- Fluxo **novo cliente**: skill OD `brand-extract` (site do cliente) → `theme-factory`/`brand-guidelines` → design system custom no OD, nome = slug do cliente.
- Os brand packs em `Hub/04-Recursos/Design/brands/*.json` são migrados/sincronizados para design systems OD (o JSON local mantém-se como fonte exportável, mas o OD é a fonte operacional).
- Os 4 design systems sectoriais (b2b, ecommerce, saude, solar) passam a design systems OD; as skills locais `design-{b2b,ecommerce,saude,solar}` são reduzidas a referência/routing.
### 3.2 Skills adaptadas (wrappers finos sobre OD)
| Skill local | Passa a |
|---|---|
| `design` | Router: cria/reutiliza projecto OD, aplica design system, escolhe skill OD (`imagegen`, `slides`, `poster-hero`, etc.), `start_run` → `get_run` → entrega |
| `brand-guidelines` | Gestão de design systems no OD (criar/actualizar/listar Descomplicar + clientes); mantém a norma escrita (tom, ®) |
| `pptx-generator` | Wrapper das skills OD `pptx-generator`/`pptx`/`slides` com design system aplicado; python-pptx mantido só para leitura/QA de ficheiros existentes |
| `remotion-video` | Wrapper da skill OD `remotion` (+ `venice-video`/`fal-*` quando fizer sentido) |
| `clone-style` | Substituída pela skill OD `brand-extract` (wrapper) |
| `cinematic-site` | Usa skills OD de web (`web-clone`, `frontend-design`) via projecto OD |
| `ui-ux-pro-max`, `design-b2b/ecommerce/saude/solar` | Referência local mantida; apontam para design systems OD |
### 3.3 Agents actualizados
- `design-lead`, `design-prompt-architect`, `design-generator`: MCPs alvo passam a `mcp__open-design__*`; remoção de referências a Penpot/Presenton/Stitch/design-engine como motores.
- `design-critic`, `design-researcher`, `ui-designer`, `web-designer`, `video-production-specialist`: actualizar referências de ferramentas; lógica mantém-se.
### 3.4 Fora de âmbito
- Alterar o OD em si (daemon, skills OD).
- Migrar histórico de projectos antigos Presenton/Stitch.
- Desligar os MCPs antigos da máquina (fica para limpeza posterior, decisão separada).
## 4. Critérios de aceitação
1. `/design` gera um artefacto real num projecto OD com design system `descomplicar` aplicado (prova: run `succeeded` + artefacto).
2. Design system `descomplicar` existe no OD com os tokens oficiais (cores/fontes verificadas contra `descomplicar-theme.md`).
3. Fluxo de cliente demonstrado: criar design system custom para 1 cliente de teste via `brand-extract`.
4. `pptx-generator` produz um deck via OD com brand Descomplicar.
5. `remotion-video` produz/inicia um vídeo via skill OD `remotion`.
6. Zero referências activas a Penpot/Presenton/Stitch/design-engine como motores nas skills/agents adaptados.
7. CHANGELOG.md + versão 3.0.0 + commit atómico.
## 5. Riscos
- **Paridade de export**: garantir que o OD exporta PPTX/PNG/PDF nos formatos que os fluxos actuais (propostas, LinkedIn) exigem — validar cedo (crit. 4).
- **Contexto activo OD expira ~5 min**: wrappers devem passar `project` explícito, nunca depender do contexto activo.
- **Outputs grandes do MCP** (`list_plugins` ~270KB): wrappers devem usar filtros/ids directos, nunca listagens completas no contexto (regra 62).
## 6. Faseamento
- **F1** — Design system `descomplicar` no OD + skill `brand-guidelines` adaptada.
- **F2** — `design` (router) + agents lead/architect/generator.
- **F3** — `pptx-generator` + `remotion-video` + `clone-style`→`brand-extract`.
- **F4** — Sectoriais + cinematic-site + fluxo cliente de teste + QA final + CHANGELOG/commit.
+217 -241
View File
@@ -1,66 +1,113 @@
--- ---
name: brand-guidelines name: brand-guidelines
description: Guia de identidade visual Descomplicar® — cores, tipografia, logotipo, tom de comunicacao e aplicacao por contexto (slides, docs, web, emails). Usar quando "brand descomplicar", "marca descomplicar", "cores descomplicar", "identidade visual", "branding", "paleta de cores", "guia de marca", ou qualquer material que necessite conformidade visual com a marca. description: Gestão de identidade visual multi-marca (Descomplicar® e clientes) — design systems no Open Design, cores, tipografia, logótipo, tom e aplicação por contexto. O DESIGN.md de cada marca no Open Design é a fonte de verdade. Usar quando "brand", "marca", "identidade visual", "branding", "paleta de cores", "guia de marca", "design system cliente", "criar marca", ou qualquer material que necessite conformidade visual.
--- ---
# /brand-guidelines - Identidade Visual Descomplicar® # /brand-guidelines — Gestão de Identidade Visual Multi-Marca
Referencia normativa da marca Descomplicar®. Aplicar em todos os materiais de comunicacao, Esta skill serve **qualquer marca** — a Descomplicar® e cada cliente. A Descomplicar é apenas
design e desenvolvimento. a marca por omissão quando nenhuma outra é indicada.
## Fonte de verdade: o Open Design
Cada marca tem o seu design system no Open Design, um por pasta:
```
~/workspace/open-design/design-systems/<marca>/DESIGN.md
```
- `descomplicar/` — a nossa marca (espelhada em detalhe abaixo)
- `<slug-do-cliente>/` — uma pasta por cliente
O `DESIGN.md` da marca activa é **normativo**.
**Regras de precedência:**
- Em caso de divergência entre qualquer documento e o `DESIGN.md` da marca, **o `DESIGN.md` ganha sempre**.
- Nunca inventar cores, fontes ou tokens de nenhuma marca. Ler o `DESIGN.md` antes de produzir.
- Alterações à identidade fazem-se no `DESIGN.md` e só depois se propagam.
> Versões anteriores desta skill documentavam uma paleta azul/laranja (`#1a365d`, `#dd6b20`) com Open Sans
> para a Descomplicar. Estava **errada** — não corresponde ao site nem ao design system. Corrigida em 22-07-2026.
---
## Trabalhar com a marca de um cliente
**1. Verificar se já existe** — procurar a pasta do cliente em `design-systems/`. Se existir, ler o
`DESIGN.md` e usá-lo. Nunca criar um segundo design system para a mesma marca.
**2. Criar quando não existe** — extrair a identidade a partir de material real do cliente
(site, manual de marca, ficheiros fornecidos) com as skills do Open Design `brand-extract`
e `theme-factory`. O resultado é revisto com o cliente antes de se tornar normativo.
Nunca inventar a identidade de um cliente a partir do nada.
**3. Aplicar num projecto** — indicar a marca ao criar o projecto no Open Design
(`create_project` com `designSystem: "<slug>"`) para que todos os artefactos herdem
cor, tipografia e componentes sem deriva.
**4. Manter separado** — um projecto do Open Design serve uma marca só. Ecossistemas do
mesmo cliente (landing, dashboard, app) vivem no mesmo projecto para herdarem o mesmo
`DESIGN.md`; marcas diferentes nunca partilham projecto.
**Estrutura mínima de um `DESIGN.md`** (o da Descomplicar serve de modelo):
tema e atmosfera, cor, tipografia, espaçamento e grelha, layout e composição,
componentes, movimento, voz e tom, anti-padrões.
---
## Marca por omissão: Descomplicar®
O resto deste documento espelha o `DESIGN.md` da Descomplicar, para leitura rápida fora do
Open Design. Para clientes, ler sempre o `DESIGN.md` respectivo — os valores abaixo **não se
aplicam** a marcas de clientes.
--- ---
## Identidade da Marca ## Identidade da Marca
**Nome oficial:** Descomplicar® **Nome oficial:** Descomplicar®
**Slogan:** Crescimento Digital
**Website:** descomplicar.pt **Website:** descomplicar.pt
**Tom:** Profissional mas acessivel, tecnologico sem ser frio **Categoria:** agência de aceleração digital portuguesa — artigos, podcast semanal e automações de IA
**Valores:** Simplicidade, transparencia, resultados mensuraveis **Atmosfera:** editorial profissional com acentos dourados; confiança técnica sem arrogância, clareza imediata sem frieza corporativa
**Acabamento:** plano e limpo, sem gradientes decorativos — a hierarquia faz o trabalho visual
> A marca registada (®) e obrigatoria na primeira ocorrencia em qualquer documento ou comunicacao. > A marca registada (®) é obrigatória na primeira ocorrência em qualquer documento ou comunicação.
> Nas ocorrencias seguintes, pode usar-se apenas "Descomplicar". > Nas ocorrências seguintes, pode usar-se apenas "Descomplicar".
--- ---
## Paleta de Cores Principal ## Paleta de Cores
| Nome | Hex | RGB | Uso | | Token | Hex | Uso |
|------|-----|-----|-----| |-------|-----|-----|
| Azul Escuro | `#1a365d` | 26, 54, 93 | Texto principal, fundos escuros, cabecalhos | | Primary (Dourado) | `#cc8d00` | CTAs, faixas de destaque, ícones, bordas activas, badges |
| Azul Medio | `#2b6cb0` | 43, 108, 176 | Links, acentos, botoes secundarios | | Primary Light | `#f2d9a2` | Fundos secundários, hover suave, tags — **nunca para texto** |
| Laranja | `#dd6b20` | 221, 107, 32 | CTA, destaques, elementos de accao | | Surface | `#ffffff` | Fundo de página, cards, modais |
| Branco | `#ffffff` | 255, 255, 255 | Fundos claros, texto sobre escuro | | Text | `#000000` | Headlines, corpo principal, labels importantes |
| Cinza Claro | `#f7fafc` | 247, 250, 252 | Fundos secundarios, secoes alternadas | | Text Muted | `#6e6e6e` | Subtítulos, metadados, placeholders |
| Cinza Texto | `#4a5568` | 74, 85, 104 | Texto de corpo, descricoes | | Border | `#e5e5e5` | Divisórias, bordas de card, separadores |
| Surface Alt | `#f8f8f8` | Secções alternadas, blocos de código |
| Danger | `#dc2626` | Erros, alertas críticos |
| Success | `#16a34a` | Confirmações, estados de sucesso |
Paleta completa com variacoes de contexto: `references/color-palettes.md` **Regras de uso:**
- O dourado (`#cc8d00`) é o **único acento cromático** — usar com parcimónia e intenção.
--- - Nunca mais de 3 cores simultâneas no mesmo visual.
- Fundos grandes sempre em Surface (`#ffffff`) ou Surface Alt (`#f8f8f8`).
## CSS Variables (Web) - CTA principal: fundo dourado com texto preto.
- A secção de maior destaque usa fundo preto, texto branco e acento dourado.
```css ```css
:root { :root {
/* Cores principais */ --color-primary: #cc8d00;
--color-primary: #1a365d; --color-primary-light: #f2d9a2;
--color-secondary: #2b6cb0; --color-surface: #ffffff;
--color-accent: #dd6b20; --color-surface-alt: #f8f8f8;
--color-text: #000000;
/* Neutros */ --color-text-muted: #6e6e6e;
--color-white: #ffffff; --color-border: #e5e5e5;
--color-bg-light: #f7fafc; --color-danger: #dc2626;
--color-text-body: #4a5568; --color-success: #16a34a;
--color-text-heading: #1a365d;
/* Estados */
--color-primary-hover: #2a4a7f;
--color-secondary-hover: #2c5282;
--color-accent-hover: #c05621;
/* Bordas e divisores */
--color-border: #e2e8f0;
--color-border-light: #edf2f7;
} }
``` ```
@@ -68,254 +115,183 @@ Paleta completa com variacoes de contexto: `references/color-palettes.md`
## Tipografia ## Tipografia
### Hierarquia | Papel | Família | Pesos |
|-------|---------|-------|
| Display | Montserrat, Poppins, system-ui, sans-serif | 700, 800 |
| Corpo | Inter, Open Sans, system-ui, sans-serif | 400, 500, 600 |
| Mono | JetBrains Mono, IBM Plex Mono, monospace | 400 |
| Elemento | Familia | Peso | Tamanho base | ### Escala
|----------|---------|------|--------------|
| H1 / Titulo principal | Montserrat | Extra Bold (800) | 48px / 3rem |
| H2 / Titulo secao | Montserrat | Bold (700) | 36px / 2.25rem |
| H3 / Subtitulo | Montserrat | Semi Bold (600) | 24px / 1.5rem |
| H4 / Label | Montserrat | Semi Bold (600) | 18px / 1.125rem |
| Corpo / Paragrafo | Open Sans | Regular (400) | 16px / 1rem |
| Destaque / Lead | Open Sans | Semi Bold (600) | 18px / 1.125rem |
| Legenda / Caption | Open Sans | Regular (400) | 14px / 0.875rem |
| Codigo | JetBrains Mono | Regular (400) | 14px / 0.875rem |
### CSS Tipografia | Token | Tamanho | Peso | Line-height | Uso |
|-------|---------|------|-------------|-----|
| `text-5xl` | 48px | 800 | 1.1 | Hero headline |
| `text-4xl` | 36px | 700 | 1.15 | Título de página (H1) |
| `text-3xl` | 30px | 700 | 1.2 | Título de secção (H2) |
| `text-2xl` | 24px | 700 | 1.3 | Subsecção (H3) |
| `text-xl` | 20px | 600 | 1.4 | Título de card, H4 |
| `text-lg` | 18px | 500 | 1.5 | Parágrafo de entrada |
| `text-base` | 16px | 400 | 1.6 | Corpo |
| `text-sm` | 14px | 400 | 1.5 | Legendas, labels, UI |
| `text-xs` | 12px | 500 | 1.4 | Tags, badges, micro-copy |
**Regras:**
- Montserrat exclusivamente para títulos — nunca em parágrafos longos.
- Inter para tudo o que é lido em detalhe.
- `letter-spacing: 0.02em` em labels e badges em maiúsculas.
- Sem itálico decorativo — usar peso e tamanho para hierarquia.
```css ```css
:root { @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@700;800&family=Inter:wght@400;500;600&family=JetBrains+Mono&display=swap');
--font-heading: 'Montserrat', 'Arial Black', sans-serif;
--font-body: 'Open Sans', 'Helvetica Neue', Arial, sans-serif;
--font-code: 'JetBrains Mono', 'Fira Code', 'Courier New', monospace;
--line-height-heading: 1.2;
--line-height-body: 1.6;
--letter-spacing-heading: -0.025em;
}
``` ```
### Fallbacks de Sistema ---
- **Montserrat** indisponivel: `'Arial Black', 'Impact', sans-serif` ## Espaçamento, Grelha e Raios
- **Open Sans** indisponivel: `'Helvetica Neue', Arial, sans-serif`
- **JetBrains Mono** indisponivel: `'Fira Code', 'Courier New', monospace` Escala base de 4px: `space-1` 4px, `space-2` 8px, `space-3` 12px, `space-4` 16px, `space-6` 24px, `space-8` 32px, `space-12` 48px, `space-16` 64px, `space-24` 96px.
**Grelha:** 12 colunas, gutter 24px, conteúdo centrado com max-width 1280px (960px em artigos, 760px em texto corrido com line-height 1.7).
**Breakpoints:** mobile ≤768px, tablet 769–1024px, desktop >1024px.
**Padding lateral:** 16px mobile, 32px tablet, 48px desktop.
**Raios:** `sm` 4px (inputs, badges), `md` 8px (cards, botões), `lg` 12px (modais), `full` 9999px (pills, avatares).
---
## Componentes
**Botão** — Primary: fundo `#cc8d00`, texto `#000000`, Montserrat SemiBold, raio 8px. Secondary: transparente, borda 2px dourada, texto dourado. Ghost: transparente, texto preto, sublinhado no hover. Alturas: sm 32px, md 40px, lg 48px.
**Badge** — Default: fundo `#f8f8f8`, texto `#6e6e6e`, maiúsculas, 12px, tracking alargado. Primary: fundo `#f2d9a2`, texto `#7a5500`.
**Card** — Fundo branco, borda 1px `#e5e5e5`, raio 8px, padding 24px, imagem 16:9 no topo. Sombra no hover: `0 4px 16px rgba(0,0,0,0.1)`.
**Input** — Borda 1px `#e5e5e5`, raio 8px, padding 12px 16px. Focus: borda 2px dourada, sem outline. Erro: borda 2px `#dc2626` com mensagem abaixo. Label em Inter SemiBold 14px maiúsculas.
**Navbar** — Fundo preto, logótipo à esquerda, links brancos, CTA dourado à direita, sticky com `backdrop-filter: blur(8px)`.
**Rodapé** — Fundo preto, texto branco/cinza, links com hover dourado, 3 colunas (marca, navegação, contacto) e copyright em `text-xs`.
---
## Movimento
O movimento **confirma acções, nunca decora**.
- 150ms em micro-interacções (hover, focus); 250ms em transições de estado.
- `ease-out` nas entradas, `ease-in-out` nas transições bidireccionais.
- Cards no hover: `translateY(-2px)` mais sombra, 200ms.
- Transições de página: fade simples 200ms.
- Estados de carregamento: skeleton em `#f8f8f8` com shimmer subtil.
- Sem parallax, sem animações de entrada elaboradas, sem auto-play.
--- ---
## Logótipo ## Logótipo
### Regras de Uso | Regra | Descrição |
| Regra | Descricao |
|-------|-----------| |-------|-----------|
| Espaco minimo | Margem de pelo menos 2x a altura da letra "D" em todos os lados | | Espaço mínimo | Margem de pelo menos 2x a altura da letra "D" em todos os lados |
| Tamanho minimo | 120px de largura em digital; 30mm em impressao | | Tamanho mínimo | 120px de largura em digital; 30mm em impressão |
| Fundo permitido | Branco `#ffffff`, Azul Escuro `#1a365d`, Cinza Claro `#f7fafc` | | Fundos permitidos | Branco `#ffffff`, preto `#000000`, cinza claro `#f8f8f8` |
| Fundo proibido | Qualquer fundo com baixo contraste, fotografias sem overlay | | Fundos proibidos | Baixo contraste, fotografias sem overlay |
| Distorcao | Nunca esticar, rodar ou alterar proporcoes | | Proibido | Esticar, rodar, alterar proporções, alterar cores, sobrepor texto |
| Cores proibidas | Nunca alterar as cores do logótipo original |
| Texto junto | Nunca sobrepor texto ao logótipo |
### Variantes Disponiveis **Variantes:** principal (horizontal), compacta, monocromática escura, monocromática clara, ícone isolado (favicon, avatar).
| Variante | Quando usar | **Ficheiros:** `Hub/04-Recursos/Design/brands/descomplicar/`
|----------|-------------|
| Principal (horizontal) | Uso geral, cabecalhos, documentos |
| Compacta (icone + nome vertical) | Espacos reduzidos, avatares |
| Monocromatica escura | Documentos a preto e branco, impressao simples |
| Monocromatica clara | Sobre fundos escuros, rodapes |
| Icone isolado | Favicon, app icon, redes sociais (foto de perfil) |
### Ficheiros Logótipo
```
Hub/04-Recursos/Design/brands/descomplicar/
logo-principal.svg
logo-compacto.svg
logo-mono-escuro.svg
logo-mono-claro.svg
favicon.png
favicon.svg
```
--- ---
## Aplicacao por Contexto ## Aplicação por Contexto
### Apresentacoes e Slides **Apresentações e slides** — Capa e secções de destaque com fundo preto, título Montserrat ExtraBold branco, acento dourado. Slides de conteúdo com fundo branco ou `#f8f8f8`, corpo em Inter `#000000`, destaques e números em dourado.
``` **Documentos e propostas** — Cabeçalho preto com logótipo claro; corpo branco com texto preto; títulos de secção em Montserrat; callouts com fundo `#f8f8f8` e borda esquerda dourada; rodapé `#f8f8f8` com borda superior `#e5e5e5`.
Fundo slides: #1a365d (escuro) ou #ffffff (claro)
Titulo slide: Montserrat Extra Bold, #ffffff (sobre escuro) / #1a365d (sobre claro)
Corpo texto: Open Sans Regular, #ffffff ou #4a5568
Destaques/CTA: #dd6b20
Divisores: #2b6cb0
Slide titulo (capa): fundo #1a365d, logótipo variante clara
```
Modelo: `/design presentation --brand descomplicar` **Web e landing pages** — Hero claro ou escuro conforme a variante escolhida; CTA primário dourado com texto preto; secções alternadas em `#f8f8f8`; cards brancos com borda `#e5e5e5`.
### Documentos e Propostas **Emails e newsletter** — Pré-header preto, corpo branco com texto preto, cabeçalhos Montserrat, botão CTA dourado com texto preto e raio 8px, rodapé `#f8f8f8`.
``` **Redes sociais** — Fundo preto ou branco, elemento de marca em dourado, texto sem emojis.
Cabecalho: fundo #1a365d, logótipo clara, texto branco
Corpo: fundo #ffffff, texto #4a5568
Titulos secao: Montserrat Bold, #1a365d
Destaques/callouts: fundo #f7fafc, borda esquerda #dd6b20
Links: #2b6cb0, sublinhado no hover
Rodape: fundo #f7fafc, texto #4a5568, borda topo #e2e8f0
```
### Web e Landing Pages
```
Hero section: fundo #1a365d ou gradiente #1a365d -> #2b6cb0
Botao primario (CTA): fundo #dd6b20, texto #ffffff, hover #c05621
Botao secundario: borda #2b6cb0, texto #2b6cb0, hover fundo #2b6cb0 branco
Seccao alternada: fundo #f7fafc
Cards: fundo #ffffff, sombra suave, borda-topo #2b6cb0 (destaque)
Cards destaque: borda-topo ou borda-esquerda #dd6b20
```
### Emails e Newsletter
```
Pre-header: fundo #1a365d, texto #ffffff
Corpo email: fundo #ffffff, texto #4a5568
Cabecalhos: Montserrat Bold, #1a365d
CTA button: fundo #dd6b20, texto #ffffff, border-radius 4px
Rodape email: fundo #f7fafc, texto #4a5568 (tamanho reduzido)
Links: #2b6cb0
```
### Redes Sociais
```
Fundo posts: #1a365d (principal) ou #ffffff
Texto sobre escuro: #ffffff (titulo), #f7fafc (corpo)
Texto sobre claro: #1a365d (titulo), #4a5568 (corpo)
Elemento de marca (cantos, bandas): #dd6b20 ou #2b6cb0
Hashtags/links: #2b6cb0
```
--- ---
## Tom de Comunicacao ## Tom de Comunicação
### Principios **Tom:** profissional mas acessível, directo, orientado à acção, confiante sem arrogância.
| Principio | Descricao | **Princípios de copy:**
|-----------|-----------| - PT-PT estrito — "utilizador" não "usuário", "transferir" não "baixar", "ecrã" não "tela", "equipa" não "time".
| Claro e directo | Frases curtas, vocabulario acessivel, sem jargao desnecessario | - Frases curtas, verbo no início nos CTAs: "Saber mais", "Ver guia", "Falar connosco".
| Confiante mas humilde | Mostramos resultados, nao promessas vazias | - Títulos assertivos, sem interrogações desnecessárias.
| Tecnico sem ser frio | Tecnologia ao servico das pessoas, nao o contrario | - Dados concretos: "400+ artigos", não "muitos artigos".
| Orientado a resultados | Sempre ligar accoes a beneficios mensuravelis | - Sem emojis e sem exclamações excessivas em qualquer contexto de marca.
| Em portugues correcto | PT-PT sempre, sem brasileirismos, sem calao |
### Vocabulario da Marca **Headlines** — Directas e específicas: "SEO para PMEs que funciona" em vez de "Descubra como o SEO pode transformar o seu negócio".
| Usar | Evitar | **CTAs correctos:** "Ver todos os guias", "Pedir auditoria gratuita", "Subscrever newsletter".
|------|--------| **CTAs incorrectos:** "Clique aqui!", "Saiba Mais!!!", qualquer CTA com emoji.
| crescimento digital | growth hacking |
| resultados mensuraveis | metricas (sem contexto) |
| simplicidade | user-friendly (em textos publicos) |
| parceiros / clientes | users / leads (em comunicacao externa) |
| solucoes | produtos (quando sao servicos) |
| equipa | time (brasileirismo) |
### Voz por Canal
- **Website / Propostas:** Formal-acessivel. Nos apresentamos, o cliente decide.
- **Redes Sociais:** Mais conversacional, com pergunta ou convite a interaccao.
- **Emails:** Directo e pessoal, nome do destinatario sempre que possivel.
- **Documentacao tecnica:** Preciso e estruturado, sem ambiguidade.
--- ---
## Iconografia e Imagens ## Iconografia e Imagens
### Icones **Ícones:** lineares, peso 1.5–2px, cantos ligeiramente arredondados. Lucide, Heroicons ou Phosphor. Tamanhos 16/20/24/32px. Cor herdada do contexto ou dourada.
- **Estilo:** Linear, peso medio (1.5-2px), cantos ligeiramente arredondados **Fotografia:** profissional e luminosa, pessoas reais em contexto. Overlay preto (20–40%) quando houver texto por cima. **Proibidas** stock photos genéricas — pessoas a sorrir para portáteis, apertos de mão corporativos.
- **Bibliotecas recomendadas:** Lucide Icons, Heroicons, Phosphor Icons
- **Tamanhos:** 16px, 20px, 24px, 32px (escala 4px)
- **Cor:** Herdar da cor de texto do contexto ou usar cor de acento
### Fotografia **Ilustrações e gráficos:** flat, linhas limpas, paleta restrita à marca; destaques a dourado.
- **Estilo:** Profissional, luminosa, pessoas reais em contexto de trabalho
- **Tratamento:** Sem filtros excessivos; overlay azul escuro (#1a365d, 20-40% opacidade) para texto
- **Evitar:** Stock photos genericas, imagens de baixa qualidade, estilos vintage/retro
### Ilustracoes e Graficos
- **Estilo:** Flat design com linhas limpas, paleta restrita as cores da marca
- **Graficos de dados:** Usar sempre cores da paleta principal, legenda clara
- **Infograficos:** Fundo branco ou cinza claro, acentos em laranja para destaques
---
## Espacamento e Grid
```css
:root {
/* Espacamento base: multiplos de 4px */
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-6: 24px;
--space-8: 32px;
--space-12: 48px;
--space-16: 64px;
--space-24: 96px;
/* Border radius */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 16px;
/* Sombras */
--shadow-sm: 0 1px 3px rgba(26, 54, 93, 0.1);
--shadow-md: 0 4px 12px rgba(26, 54, 93, 0.15);
--shadow-lg: 0 8px 24px rgba(26, 54, 93, 0.2);
}
```
--- ---
## Acessibilidade ## Acessibilidade
| Par de cores | Racio contraste | Nivel WCAG | | Par de cores | Rácio | Nível |
|-------------|-----------------|------------| |--------------|-------|-------|
| Branco sobre Azul Escuro | 12.6:1 | AAA | | Preto sobre branco | 21:1 | AAA |
| Branco sobre Azul Medio | 5.1:1 | AA | | Preto sobre dourado `#cc8d00` | ~7.4:1 | AAA |
| Branco sobre Laranja | 3.1:1 | AA (texto grande) | | Dourado `#cc8d00` sobre preto | ~7.4:1 | AAA |
| Cinza Texto sobre Branco | 7.0:1 | AAA | | Text Muted `#6e6e6e` sobre branco | ~5.1:1 | AA |
| Azul Escuro sobre Cinza Claro | 11.9:1 | AAA | | **Branco sobre dourado** | **~2.9:1** | **falha — proibido** |
> Texto de corpo (abaixo de 18px normal ou 14px bold) requer minimo AA (4.5:1). Texto de corpo requer no mínimo AA (4.5:1). Todos os botões precisam de estados hover, focus e disabled explícitos.
> Nunca usar Laranja como fundo de texto de corpo.
--- ---
## Checklist Conformidade de Marca ## Anti-padrões (proibido)
- [ ] Logótipo com espaco de respiro correcto - Gradientes multicolor ou agressivos em elementos de marca
- [ ] Apenas cores da paleta oficial - Mais de 3 cores simultâneas num visual
- [ ] Tipografia Montserrat (headings) e Open Sans (corpo) - Stock photos genéricas
- [ ] Tom de comunicacao adequado ao canal - Emojis em qualquer contexto de marca
- [ ] Marca registada (®) na primeira ocorrencia - Tipografia decorativa além de Montserrat e Inter
- [ ] Contraste WCAG AA minimo em texto - Sombras pesadas ou neumorfismo
- [ ] Slogan "Crescimento Digital" presente (quando relevante) - Animações que distraem (rotações, bounces, pulse contínuo)
- [ ] Sem brasileirismos no texto - Texto branco sobre dourado — contraste insuficiente
- [ ] Espacamento em multiplos de 4px - Primary Light (`#f2d9a2`) como cor de texto
- Layouts com mais de 4 colunas de conteúdo editorial
- Botões sem estados hover, focus e disabled
- Português do Brasil — sempre PT-PT com acentuação completa
--- ---
**Versao**: 1.0.0 | **Data**: 2026-03-10 | **Autor**: Descomplicar® ## Checklist de Conformidade
*Paletas detalhadas por contexto: `references/color-palettes.md`*
- [ ] `DESIGN.md` do Open Design consultado antes de produzir
- [ ] Apenas cores da paleta oficial; dourado como único acento
- [ ] Montserrat nos títulos, Inter no corpo
- [ ] Logótipo com espaço de respiro e fundo permitido
- [ ] Marca registada (®) na primeira ocorrência
- [ ] Contraste mínimo AA; nunca branco sobre dourado
- [ ] Espaçamento em múltiplos de 4px
- [ ] PT-PT sem brasileirismos e sem emojis
- [ ] Nenhum anti-padrão presente
---
**Versão**: 2.0.0 | **Data**: 22-07-2026 | **Autor**: Descomplicar®
*Fonte normativa: `~/workspace/open-design/design-systems/descomplicar/DESIGN.md`*
--- ---
@@ -324,7 +300,7 @@ Hashtags/links: #2b6cb0
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar. Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl ```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"} {"date":"2026-07-22","issue":"Skill documentava paleta azul/laranja (#1a365d, #dd6b20) e Open Sans, divergente do design system e do site real","fix":"Reescrita para espelhar o DESIGN.md do Open Design (dourado #cc8d00 sobre preto/branco, Montserrat + Inter) e declarar precedencia da fonte de verdade","source":"user"}
``` ```
*Adicionar nova linha após cada erro corrigido.* *Adicionar nova linha após cada erro corrigido.*
@@ -1,227 +0,0 @@
# Paletas de Cores Descomplicar® — Referencia Detalhada
Extensao de `brand-guidelines/SKILL.md`. Paletas completas com variacoes de contexto,
estados de interaccao e combinacoes aprovadas.
---
## Paleta Principal
| Token | Hex | RGB | HSL |
|-------|-----|-----|-----|
| `--color-primary` | `#1a365d` | 26, 54, 93 | 213°, 56%, 23% |
| `--color-secondary` | `#2b6cb0` | 43, 108, 176 | 211°, 61%, 43% |
| `--color-accent` | `#dd6b20` | 221, 107, 32 | 27°, 74%, 50% |
| `--color-white` | `#ffffff` | 255, 255, 255 | — |
| `--color-bg-light` | `#f7fafc` | 247, 250, 252 | 204°, 33%, 98% |
| `--color-text-body` | `#4a5568` | 74, 85, 104 | 220°, 17%, 35% |
---
## Escala Azul Escuro (Primary)
| Variacao | Hex | Uso |
|----------|-----|-----|
| 50 (mais claro) | `#ebf4ff` | Fundos hover muito suaves |
| 100 | `#dbeafe` | Fundos informativos |
| 200 | `#bfdbfe` | Bordas suaves |
| 300 | `#93c5fd` | Icones em fundo claro |
| 400 | `#60a5fa` | Interaccao hover em elementos claros |
| 500 | `#2b6cb0` | Azul medio (secondary) |
| 600 | `#1d4ed8` | Links hover |
| 700 | `#1e40af` | Botoes primarios hover |
| 800 | `#1e3a8a` | Variacao escura |
| **900 (base)** | `#1a365d` | **Cor primaria — uso principal** |
---
## Escala Laranja (Accent)
| Variacao | Hex | Uso |
|----------|-----|-----|
| 50 | `#fff7ed` | Fundo callout de atencao |
| 100 | `#ffedd5` | Destaque suave |
| 200 | `#fed7aa` | Borda callout |
| 300 | `#fdba74` | Icones de alerta em fundo claro |
| 400 | `#fb923c` | Hover em elementos de acento |
| **500 (base)** | `#dd6b20` | **Cor de acento — CTA principal** |
| 600 | `#c05621` | Hover botao CTA |
| 700 | `#9c4221` | Pressed state / active |
| 800 | `#7c2d12` | Texto sobre fundo laranja claro |
---
## Escala de Neutros
| Token | Hex | Uso |
|-------|-----|-----|
| Branco | `#ffffff` | Fundos principais, texto sobre escuro |
| Gray 50 | `#f7fafc` | Fundos secundarios, seccoes alternadas |
| Gray 100 | `#edf2f7` | Hover em items de lista |
| Gray 200 | `#e2e8f0` | Bordas, divisores |
| Gray 300 | `#cbd5e0` | Bordas de formularios desactivados |
| Gray 400 | `#a0aec0` | Placeholder text, icones inactivos |
| Gray 500 | `#718096` | Texto auxiliar, labels |
| **Gray 600** | `#4a5568` | **Texto de corpo principal** |
| Gray 700 | `#2d3748` | Texto secundario escuro |
| Gray 800 | `#1a202c` | Texto titulo alternativo |
| Gray 900 | `#171923` | Fundo ultra-escuro (raro) |
---
## Combinacoes de Cor Aprovadas
### Combinacoes de Alta Prioridade (CTA e Heroi)
| Fundo | Texto / Elemento | Racio | Nota |
|-------|-----------------|-------|------|
| `#1a365d` | `#ffffff` | 12.6:1 | Preferencial — hero, capa, footer |
| `#2b6cb0` | `#ffffff` | 5.1:1 | Botoes, badges, chips |
| `#dd6b20` | `#ffffff` | 3.1:1 | CTA (apenas texto grande >=18px ou bold >=14px) |
| `#ffffff` | `#1a365d` | 12.6:1 | Documentos, corpo pagina |
| `#f7fafc` | `#1a365d` | 11.9:1 | Cards, seccoes alternadas |
### Combinacoes de Texto (Corpo)
| Fundo | Texto | Racio | Nivel WCAG |
|-------|-------|-------|-----------|
| `#ffffff` | `#4a5568` | 7.0:1 | AAA |
| `#f7fafc` | `#4a5568` | 6.6:1 | AAA |
| `#ffffff` | `#2d3748` | 10.7:1 | AAA |
| `#1a365d` | `#f7fafc` | 12.0:1 | AAA |
### Combinacoes Proibidas
| Fundo | Texto | Motivo |
|-------|-------|--------|
| `#dd6b20` | `#ffffff` | Contraste insuficiente para texto pequeno (3.1:1) |
| `#2b6cb0` | `#1a365d` | Contraste insuficiente entre tons de azul (2.2:1) |
| `#4a5568` | `#2b6cb0` | Baixo contraste em textos de corpo (2.8:1) |
| Qualquer cor | `#a0aec0` | Gray 400 nunca como texto (max 2.9:1 sobre branco) |
---
## Paleta por Contexto de Produto
### Dashboard / Aplicacao Web
```
Sidebar: fundo #1a365d, icones #f7fafc (inactivo), #dd6b20 (activo)
Top bar: fundo #ffffff, borda inferior #e2e8f0
Conteudo: fundo #f7fafc
Cards: fundo #ffffff, sombra --shadow-sm
Tabelas: linhas alternas #f7fafc / #ffffff
Botao primario: #dd6b20 (fundo), #ffffff (texto)
Botao secundario: #2b6cb0 (borda e texto), transparente (fundo)
Botao ghost: #4a5568 (texto), hover #f7fafc (fundo)
Links inline: #2b6cb0, hover #1a365d
```
### Apresentacoes (Slides)
```
Slide escuro (capa, divider): fundo #1a365d
- Titulo: Montserrat 800, #ffffff
- Subtitulo: Montserrat 600, #f7fafc
- Acento barra: #dd6b20
- Logótipo: variante clara
Slide claro (conteudo): fundo #ffffff
- Titulo: Montserrat 700, #1a365d
- Corpo: Open Sans 400, #4a5568
- Highlight box: fundo #f7fafc, borda esquerda #dd6b20 4px
- Numero/stat: Montserrat 800, #dd6b20 ou #2b6cb0
Slide citacao: fundo #f7fafc
- Aspas: #dd6b20
- Texto citacao: Montserrat 600, #1a365d
- Atribuicao: Open Sans 400, #4a5568
```
### Email Marketing
```
Wrapper: fundo #f7fafc
Container: fundo #ffffff, max-width 600px
Pre-header (top bar): fundo #1a365d, altura 4px ou bloco com logótipo
Header: fundo #1a365d, logótipo clara, padding 32px
Titulo: Montserrat 700, #ffffff, 28px
Body: fundo #ffffff, padding 32px
H2: Montserrat 600, #1a365d, 22px
Paragrafo: Open Sans 400, #4a5568, 16px, line-height 1.6
Link inline: #2b6cb0
CTA block: centrado, botao #dd6b20, texto #ffffff, border-radius 4px, padding 14px 28px
Divisor: border-top 1px solid #e2e8f0
Footer: fundo #f7fafc, texto #718096, 13px, links #4a5568
```
### Social Media
```
Post Instagram (1080x1080):
Opcao A (escuro): fundo #1a365d, titulo #ffffff, acento #dd6b20
Opcao B (claro): fundo #ffffff, titulo #1a365d, detalhe #dd6b20
Borda/frame: strip #dd6b20 (8-12px) em baixo ou em cima
Logo: canto inferior direito, variante adequada ao fundo
Story Instagram (1080x1920):
Gradiente vertical: #1a365d (topo) -> #2b6cb0 (base)
Texto: #ffffff
CTA button area: #dd6b20
LinkedIn Banner (1584x396):
Fundo: #1a365d ou fotografia com overlay #1a365d 60%
Texto: #ffffff (titulo), #f7fafc (sub)
Acento: strip ou elemento #dd6b20
```
### Documentos PDF / Propostas
```
Capa: fundo #1a365d
Logo: variante clara, centrado no topo
Titulo: Montserrat 800, #ffffff, 36px
Subtitulo: Montserrat 400, #f7fafc, 18px
Data/ref: Open Sans 400, #a0aec0, 14px, em baixo
Paginas internas:
Cabecalho: altura 48px, fundo #1a365d, logótipo pequena (variante clara), numero de pagina
Titulo capitulo: Montserrat 700, #1a365d, 22px, fundo #f7fafc, padding 12px, borda esquerda #dd6b20 4px
Corpo: Open Sans 400, #4a5568, 11pt, line-height 1.6
Callout/destaque: fundo #f7fafc, borda #dd6b20, icone #dd6b20
Tabelas: header fundo #1a365d texto #ffffff; linhas alternas #f7fafc / #ffffff
Rodape: borda topo #e2e8f0, texto #718096, 9pt
```
---
## Gradientes Aprovados
| Nome | Valor CSS | Uso |
|------|-----------|-----|
| Hero primario | `linear-gradient(135deg, #1a365d 0%, #2b6cb0 100%)` | Heroi web, fundo apresentacao |
| Acento | `linear-gradient(135deg, #dd6b20 0%, #f6ad55 100%)` | Banners promocionais |
| Escuro suave | `linear-gradient(180deg, #1a365d 0%, #2d3748 100%)` | Sidebars, overlays |
| Claro | `linear-gradient(180deg, #ffffff 0%, #f7fafc 100%)` | Seccoes de transicao |
> Nunca usar gradientes em texto (excecto como elemento decorativo com contraste garantido).
> Maximo 2 gradientes por composicao visual.
---
## Cores de Estado e Feedback
| Estado | Cor | Hex | Uso |
|--------|-----|-----|-----|
| Sucesso | Verde | `#38a169` | Confirmacoes, checkmarks, alertas positivos |
| Aviso | Amarelo | `#d69e2e` | Alertas de atencao, pendentes |
| Erro | Vermelho | `#e53e3e` | Erros, validacoes negativas |
| Informacao | Azul Medio | `#2b6cb0` | Mensagens informativas, tooltips |
> Cores de estado nao fazem parte da identidade visual principal.
> Usar apenas para feedback de interface, nunca como cor de marca.
---
*Referencia de paletas v1.0.0 | 2026-03-10 | Descomplicar®*
*Fonte principal: `brand-guidelines/SKILL.md`*
@@ -1,188 +1,123 @@
--- ---
name: "Descomplicar Digital" name: "Descomplicar"
description: "Professional technology consulting theme with warm accents" description: "Tokens da marca Descomplicar® — espelho legível por máquina do DESIGN.md no Open Design"
version: "1.0.0" version: "2.0.0"
updated: "2026-03-10" updated: "2026-07-22"
source: "~/workspace/open-design/design-systems/descomplicar/DESIGN.md"
--- ---
# Tema Descomplicar Digital # Tokens — Descomplicar®
Tema oficial Descomplicar® para uso em apresentações, relatórios, designs e qualquer material de comunicação. > **Fonte de verdade:** `~/workspace/open-design/design-systems/descomplicar/DESIGN.md`
> Este ficheiro é um espelho para consumo automático (geradores, templates, scripts).
> Se divergir do `DESIGN.md`, o `DESIGN.md` ganha e este ficheiro deve ser corrigido.
>
> **Para marcas de clientes**, não usar estes valores — ler o `DESIGN.md` da marca respectiva
> em `design-systems/<slug-do-cliente>/`.
--- ## Cores
## Paleta de Cores
```yaml ```yaml
colors: colors:
primary: "#1a365d" # Azul escuro — headers, fundos principais primary: "#cc8d00" # Dourado — CTAs, destaques, ícones, bordas activas
secondary: "#2b6cb0" # Azul médio — links, sub-headers primary_light: "#f2d9a2" # Fundos secundários, hover suave, tags (nunca texto)
accent: "#dd6b20" # Laranja — CTAs, destaques, números surface: "#ffffff" # Fundo de página, cards, modais
background: "#ffffff" # Branco — fundo principal surface_alt: "#f8f8f8" # Secções alternadas, blocos de código
surface: "#f7fafc" # Cinza muito claro — secções alternadas text: "#000000" # Headlines, corpo principal
text_primary: "#2d3748" # Cinza escuro — texto corpo text_muted: "#6e6e6e" # Subtítulos, metadados, placeholders
text_secondary: "#4a5568" # Cinza médio — subtítulos, legendas border: "#e5e5e5" # Divisórias, bordas de card
border: "#e2e8f0" # Cinza claro — bordas, separadores danger: "#dc2626" # Erros, alertas críticos
success: "#38a169" # Verde — confirmações success: "#16a34a" # Confirmações
warning: "#d69e2e" # Amarelo — avisos
error: "#e53e3e" # Vermelho — erros
``` ```
### Referência Visual **Regras:** dourado é o único acento cromático; máximo 3 cores por visual; fundos grandes em
`surface` ou `surface_alt`; CTA com fundo dourado e texto preto; nunca texto branco sobre dourado.
| Token | Hex | Uso |
|-------|-----|-----|
| `primary` | `#1a365d` | Headers H1/H2, fundos de navegação, capa de apresentação |
| `secondary` | `#2b6cb0` | Links, H3/H4, badges, ícones activos |
| `accent` | `#dd6b20` | Botões CTA, números em destaque, linhas de separação principais |
| `background` | `#ffffff` | Fundo padrão de slides e páginas |
| `surface` | `#f7fafc` | Slides alternados, tabelas linha par, painéis laterais |
| `text_primary` | `#2d3748` | Corpo de texto, parágrafos, listas |
| `text_secondary` | `#4a5568` | Subtítulos, legendas, texto auxiliar |
| `border` | `#e2e8f0` | Bordas de tabela, separadores horizontais, cards |
| `success` | `#38a169` | Confirmações, métricas positivas, status "concluído" |
| `warning` | `#d69e2e` | Avisos, métricas de atenção, status "em risco" |
| `error` | `#e53e3e` | Erros, métricas negativas, status "crítico" |
---
## Tipografia ## Tipografia
```yaml ```yaml
fonts: fonts:
heading: "Montserrat" display: "Montserrat"
heading_weight: "700, 800" display_fallback: "Poppins, system-ui, sans-serif"
heading_fallback: "Arial, sans-serif" display_weights: [700, 800]
body: "Open Sans" body: "Inter"
body_weight: "400, 600" body_fallback: "Open Sans, system-ui, sans-serif"
body_fallback: "Helvetica, sans-serif" body_weights: [400, 500, 600]
code: "JetBrains Mono" mono: "JetBrains Mono"
code_fallback: "Consolas, monospace" mono_fallback: "IBM Plex Mono, monospace"
mono_weights: [400]
scale:
text_5xl: { size: 48, weight: 800, line_height: 1.1 } # Hero headline
text_4xl: { size: 36, weight: 700, line_height: 1.15 } # H1
text_3xl: { size: 30, weight: 700, line_height: 1.2 } # H2
text_2xl: { size: 24, weight: 700, line_height: 1.3 } # H3
text_xl: { size: 20, weight: 600, line_height: 1.4 } # H4, título de card
text_lg: { size: 18, weight: 500, line_height: 1.5 } # Parágrafo de entrada
text_base:{ size: 16, weight: 400, line_height: 1.6 } # Corpo
text_sm: { size: 14, weight: 400, line_height: 1.5 } # Legendas, UI
text_xs: { size: 12, weight: 500, line_height: 1.4 } # Tags, badges
``` ```
### Hierarquia Tipográfica
| Nível | Fonte | Peso | Tamanho (slides) | Tamanho (docs) |
|-------|-------|------|-----------------|----------------|
| H1 — Título principal | Montserrat | 800 | 40-48px | 32px |
| H2 — Título secção | Montserrat | 700 | 28-36px | 24px |
| H3 — Subtítulo | Montserrat | 700 | 22-26px | 20px |
| H4 — Label | Open Sans | 600 | 18-20px | 16px |
| Corpo | Open Sans | 400 | 16-18px | 14-16px |
| Caption | Open Sans | 400 | 12-14px | 12px |
| Código | JetBrains Mono | 400 | 14-16px | 13px |
### Google Fonts — Import
```css ```css
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@700;800&family=Open+Sans:wght@400;600&family=JetBrains+Mono&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@700;800&family=Inter:wght@400;500;600&family=JetBrains+Mono&display=swap');
``` ```
--- ## Espaçamento, grelha e raios
## Regras de Uso
```yaml ```yaml
usage_notes: spacing: # base 4px
- Usar laranja com moderação (apenas CTAs e destaques-chave) space_1: 4
- Azul escuro para headers e elementos de navegação space_2: 8
- Fundos alternados branco/cinza para secções longas space_3: 12
- Nunca usar mais de 3 cores numa slide space_4: 16
- Manter contraste WCAG AA em todos os textos space_6: 24
space_8: 32
space_12: 48
space_16: 64
space_24: 96
grid:
columns: 12
gutter: 24
max_width: 1280 # conteúdo geral
max_width_article: 960 # artigos
max_width_prose: 760 # texto corrido (line-height 1.7)
padding_x: { mobile: 16, tablet: 32, desktop: 48 }
breakpoints:
mobile: "<=768"
tablet: "769-1024"
desktop: ">1024"
radius:
sm: 4 # inputs, badges
md: 8 # cards, botões
lg: 12 # modais
full: 9999 # pills, avatares
``` ```
### Regras Expandidas ## Movimento
**Cores** ```yaml
- O laranja (`accent`) é reservado para no máximo 1-2 elementos por slide/página motion:
- Nunca usar `primary` e `accent` em simultâneo em texto — garante legibilidade micro: 150 # hover, focus (ms)
- Fundo `surface` em slides alternados cria ritmo visual sem poluição transition: 250 # mudanças de estado (ms)
- Combinação permitida em texto: `primary` fundo + `background` texto, ou `background` fundo + `primary` texto page_fade: 200 # transições de página (ms)
easing_in: "ease-out"
**Tipografia** easing_both: "ease-in-out"
- Nunca misturar Montserrat com outra fonte de títulos no mesmo documento card_hover: "translateY(-2px) + sombra 0 4px 16px rgba(0,0,0,0.1)"
- Open Sans é a única fonte de corpo permitida proibido: ["parallax", "auto-play", "animações de entrada elaboradas"]
- Código inline e blocos de código: sempre JetBrains Mono
- Não usar itálico em títulos — usar peso (bold) para ênfase
**Contraste WCAG AA**
- `text_primary` (#2d3748) sobre `background` (#ffffff): rácio 12.6:1 — aprovado
- `text_secondary` (#4a5568) sobre `background` (#ffffff): rácio 7.4:1 — aprovado
- `accent` (#dd6b20) sobre `background` (#ffffff): rácio 3.8:1 — aprovado para texto grande (>18px bold)
- `background` (#ffffff) sobre `primary` (#1a365d): rácio 12.6:1 — aprovado
---
## Aplicação em Slides
### Layout Tipo Capa
```
[Fundo: primary #1a365d]
[Logo Descomplicar — branco, topo esquerdo]
[H1: Montserrat 800, branco]
[H2: Montserrat 700, accent #dd6b20]
[Rodapé: Open Sans 400, text_secondary, separador border]
``` ```
### Layout Tipo Conteúdo ## Acessibilidade
```yaml
contrast:
preto_sobre_branco: 21.0 # AAA
preto_sobre_dourado: 7.4 # AAA
dourado_sobre_preto: 7.4 # AAA
muted_sobre_branco: 5.1 # AA
branco_sobre_dourado: 2.9 # FALHA — proibido
minimo_corpo: 4.5 # AA
``` ```
[Fundo: background #ffffff]
[Header barra: primary #1a365d, 8px altura]
[H2: primary #1a365d, Montserrat 700]
[Corpo: text_primary #2d3748, Open Sans 400]
[Sidebar ou destaque: surface #f7fafc]
[CTA ou número chave: accent #dd6b20, Montserrat 800]
```
### Layout Tipo Dados / Métricas
```
[Fundo alternado: surface #f7fafc]
[Número grande: accent #dd6b20, Montserrat 800, 60-80px]
[Label: text_secondary #4a5568, Open Sans 600, 14px]
[Ícone: secondary #2b6cb0]
```
---
## Aplicação em HTML (Desk CRM / Relatórios)
```css
:root {
--color-primary: #1a365d;
--color-secondary: #2b6cb0;
--color-accent: #dd6b20;
--color-background: #ffffff;
--color-surface: #f7fafc;
--color-text-primary: #2d3748;
--color-text-secondary: #4a5568;
--color-border: #e2e8f0;
--color-success: #38a169;
--color-warning: #d69e2e;
--color-error: #e53e3e;
--font-heading: 'Montserrat', Arial, sans-serif;
--font-body: 'Open Sans', Helvetica, sans-serif;
--font-code: 'JetBrains Mono', Consolas, monospace;
}
h1, h2 { font-family: var(--font-heading); font-weight: 800; color: var(--color-primary); }
h3, h4 { font-family: var(--font-heading); font-weight: 700; color: var(--color-secondary); }
p, li { font-family: var(--font-body); color: var(--color-text-primary); }
code { font-family: var(--font-code); }
.accent { color: var(--color-accent); }
.surface { background: var(--color-surface); }
```
---
## Compatibilidade com /design
Este tema é carregado automaticamente quando se usa `--brand descomplicar` no skill `/design`.
**Pack JSON:** `/media/ealmeida/Dados/Hub/04-Recursos/Design/brands/descomplicar.json`
---
*Tema v1.0.0 | 2026-03-10 | Descomplicar®*
@@ -0,0 +1,89 @@
# Gestão de Design Systems Multi-Marca no Open Design
Referência operacional para criar e manter a identidade visual de **qualquer marca** — a
Descomplicar® e cada cliente — dentro do Open Design.
> Substituiu `color-palettes.md` em 22-07-2026. Esse ficheiro continha escalas de cor derivadas
> de uma paleta incorrecta (azul/laranja) que nunca foi a identidade da Descomplicar.
> Escalas de cor não se inventam aqui — vivem no `DESIGN.md` de cada marca.
---
## Onde vivem
```
~/workspace/open-design/design-systems/
descomplicar/DESIGN.md # a nossa marca
<slug-cliente>/DESIGN.md # uma pasta por cliente
```
O Open Design traz ainda mais de 140 design systems de referência instalados como plugins
(`design-system-apple`, `design-system-swiss`, `design-system-bento`, …). Servem de **referência
e ponto de partida** — nunca se entrega material de cliente com a identidade de outra marca.
---
## Criar o design system de um cliente
**1. Verificar duplicados** — procurar a pasta do cliente em `design-systems/`. Se já existir,
usar essa. Nunca criar um segundo design system para a mesma marca.
**2. Recolher material real** — site do cliente, manual de marca, logótipos, materiais impressos.
Sem material não há extracção: a identidade de um cliente **nunca se inventa**.
**3. Extrair** — skill `brand-extract` do Open Design sobre o site ou os ficheiros fornecidos.
Devolve cor, tipografia e padrões observados.
**4. Estruturar** — skill `theme-factory` ou redacção directa do `DESIGN.md`, seguindo a mesma
estrutura do da Descomplicar:
| Secção | Conteúdo |
|--------|----------|
| 1. Tema e atmosfera | Categoria, estilo visual, postura cromática, mood, acabamento |
| 2. Cor | Tokens com hex e uso; regras de aplicação |
| 3. Tipografia | Famílias, pesos, escala com tamanho/peso/line-height |
| 4. Espaçamento e grelha | Escala base, colunas, gutter, max-width, breakpoints, raios |
| 5. Layout e composição | Hierarquia, padrões de layout frequentes |
| 6. Componentes | Botões, badges, cards, inputs, navbar, rodapé |
| 7. Movimento | Durações, easing, o que é proibido |
| 8. Voz e marca | Tom, princípios de copy, exemplos certos e errados |
| 9. Anti-padrões | Lista explícita do que nunca fazer |
**5. Validar com o cliente** antes de tornar normativo. Um `DESIGN.md` por aprovar não deve
gerar material final.
**6. Registar** — anotar a marca e a origem do material no projecto ou tarefa correspondente.
---
## Aplicar numa produção
```
create_project(name: "<projecto>", designSystem: "<slug-da-marca>")
```
- Um projecto do Open Design serve **uma marca só**.
- Ecossistemas do mesmo cliente (landing, dashboard, app, deck) ficam **no mesmo projecto**,
para herdarem o mesmo `DESIGN.md` sem deriva entre artefactos.
- Marcas diferentes nunca partilham projecto.
---
## Manter
- Alterações de identidade fazem-se **no `DESIGN.md`** e só depois se propagam para espelhos
(skill `brand-guidelines`, `descomplicar-theme.md`, materiais no Hub).
- Ao detectar divergência entre um espelho e o `DESIGN.md`, corrigir o espelho — nunca o inverso.
- Rebranding de cliente: actualizar o `DESIGN.md` e regenerar os artefactos afectados, em vez de
corrigir peça a peça.
---
## Acessibilidade — verificação obrigatória
Independentemente da marca, validar antes de entregar:
- Texto de corpo com contraste mínimo AA (4.5:1); títulos grandes 3:1.
- Nenhum par de cores da marca usado abaixo do mínimo, mesmo que o cliente o use hoje —
quando o material de origem falha contraste, sinalizar ao cliente em vez de replicar o erro.
- Estados hover, focus e disabled explícitos em todos os elementos interactivos.
+213
View File
@@ -0,0 +1,213 @@
---
name: hr-specialist
description: >
Especialista de RH D4 para onboarding, contratos, férias e gestão de colaboradores.
Executor autónomo baseado nos PROCs D4-RH-001/002/004. Usar para: onboarding novo
colaborador, gestão contratos, férias, offboarding, checklist RH, integração equipa.
role: Especialista de RH D4
domain: HR, Operations
model: sonnet
tools: Read, Glob, Grep, ToolSearch
# Nota: MCPs como desk-crm-v3, moloni, easypanel, lighthouse, authentik, spaceship e youtube
# estão desligados por omissão — pedir activação via /mcp (regra 57) antes de os usar.
primary_mcps:
- desk-crm-v3
- google-workspace
recommended_mcps:
- mem0
- mcp-time
primary_skills:
- onboarding
- calendar-manager
- today
recommended_skills:
- worklog
- crm
desk_project: 65
tags:
- agent
- rh
- d4
- onboarding
- contratos
- ferias
version: "1.0"
status: active
quality_score: 75
compliance:
sacred_rules: true
data_sources: true
reports_to: Emanuel Almeida
collaborates_with:
- support-specialist
- project-manager
escalates_to:
- Emanuel Almeida (decisões contratuais, rescisões, conflitos)
- D3 Contabilidade (processamento salarial, IRS)
created: "2026-04-08"
updated: "2026-04-08"
author: "Descomplicar®"
---
# HR Specialist Descomplicar
Especialista de RH D4 responsável pela gestão do ciclo de vida de colaboradores: onboarding, contratos, férias e offboarding. Opera de forma autónoma seguindo os PROCs D4-RH.
## System Prompt
Você é o especialista de RH D4 da Descomplicar®. A sua missão é garantir que todo o ciclo de vida de colaboradores é gerido com rigor, cumprindo obrigações legais portuguesas e mantendo a Descomplicar® como um bom sítio para trabalhar.
### Regras Obrigatórias (checklist antes de agir)
- [ ] **Lei Laboral PT**: Verificar sempre se acção cumpre Código do Trabalho português
- [ ] **Confidencialidade**: Dados de colaboradores são sensíveis — nunca partilhar fora do contexto
- [ ] **Documentação**: Todo contrato, férias ou decisão relevante fica registada no Desk CRM
- [ ] **Onboarding completo**: Checklist 100% antes de marcar colaborador como operacional
- [ ] **Escalar decisões**: Rescisões, alterações contratuais e conflitos sobem a Emanuel
- [ ] **Calendário**: Férias e ausências sempre sincronizadas no Google Calendar da equipa
### Prioridades de Actuação
1. **Onboarding novo colaborador** — Checklist completa, contas criadas, contrato assinado
2. **Gestão férias** — Aprovação, registo, cobertura, sincronização calendário
3. **Renovações/alterações contratuais** — Rigor legal, arquivo completo
4. **Offboarding** — Entrega equipamento, revogação acessos, contas desactivadas
5. **Conflitos/queixas** — Escalar a Emanuel imediatamente
### Output Format Padrão
```markdown
## Acção RH — [Tipo] — [Colaborador]
### Estado
- **Tipo:** [Onboarding/Ferias/Contrato/Offboarding]
- **Colaborador:** [Nome]
- **Data:** [DD-MM-YYYY]
- **PROC aplicado:** [D4-RH-00X]
### Acção Tomada
[Descrição]
### Checklist
- [x] Item 1
- [ ] Item 2 — pendente (responsável + prazo)
### Próximo Passo
[Acção seguinte + responsável + prazo]
```
## Responsabilidades
- Onboarding completo de novos colaboradores (contas, docs, equipamento, integração)
- Gestão de contratos: criação, renovação, alterações, arquivo digital
- Aprovação e registo de férias com verificação de cobertura
- Offboarding limpo: entrega equipamento + revogação acessos + documentação
- Acompanhamento do período experimental
- Registo de avaliações de desempenho e feedback
- Ligação com D3 Contabilidade para processamento salarial
## Workflows
### Workflow 1: Onboarding Novo Colaborador
```
1. Invocar skill /onboarding → recolher dados do novo colaborador
2. Ler PROC-D4-RH-001-Onboarding-Colaborador.md (checklist completa)
3. Criar tarefa no Desk CRM projecto #65 com checklist derivada do PROC
4. Criar contas necessárias (Google Workspace, Desk CRM, Gitea, etc)
5. Gerar contrato via PROC-D4-RH-002-Contratos.md
6. Preparar equipamento (laptop, acessos físicos)
7. Dia 1: reunião de boas-vindas + tour ferramentas
8. Dia 7: check-in + ajustes
9. Dia 30: revisão período experimental
10. Só marcar tarefa como done após checklist 100%
```
### Workflow 2: Gestão de Férias
```
1. Pedido de férias chega via Desk/email
2. Ler PROC-D4-RH-004-Ferias.md para regras
3. Verificar saldo dias disponíveis
4. Verificar cobertura durante ausência (quem substitui)
5. Validar conflitos com outros colaboradores ausentes
6. Aprovar ou escalar a Emanuel se há risco operacional
7. Registar no Desk CRM + Google Calendar da equipa
8. Enviar confirmação ao colaborador
```
### Workflow 3: Alteração Contratual
```
1. Ler PROC-D4-RH-002-Contratos.md
2. Preparar minuta com alterações claramente marcadas
3. Escalar a Emanuel para validação ANTES de enviar ao colaborador
4. Após aprovação: enviar ao colaborador para revisão
5. Assinar (ambas as partes) e arquivar no GDrive confidencial
6. Registar alteração no Desk CRM como tarefa concluída
7. Notificar D3 Contabilidade se há impacto salarial
```
### Workflow 4: Offboarding
```
1. Recolher data última + motivo (amigável/demissão/rescisão)
2. Preparar carta de cessação via PROC-D4-RH-002
3. Calcular valores finais: férias não gozadas, subsídios, 13º/14º
4. Escalar a D3 Contabilidade para processamento
5. Revogar acessos: Google Workspace, Desk, Gitea, servidores, VPN
6. Recolher equipamento (laptop, telemóvel, chaves)
7. Registar saída no Desk CRM + arquivo histórico
8. Exit interview (se aplicável) e registar aprendizagens
```
## Knowledge Sources
### Referências PROCs (Consultar SEMPRE)
```
Read: /media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D4-RH/PROC-D4-RH-001-Onboarding-Colaborador.md
Read: /media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D4-RH/PROC-D4-RH-002-Contratos.md
Read: /media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D4-RH/PROC-D4-RH-004-Ferias.md
```
### Desk CRM
```
mcp__desk-crm-v3__create_task({ project_id: 65, title, checklist })
mcp__desk-crm-v3__add_task_checklist_item({ task_id, description })
mcp__desk-crm-v3__update_task({ task_id, status })
```
### Google Workspace
```
mcp__google-workspace__gmail_send_email (boas-vindas, confirmações)
mcp__google-workspace__create_calendar_event (férias, onboarding)
mcp__google-workspace__drive_create_folder (pasta pessoal do colaborador)
```
## Métricas de Sucesso
| Métrica | Meta |
|---------|------|
| Tempo médio onboarding completo | <7 dias úteis |
| Checklist onboarding cumprida | 100% |
| Férias sem conflitos de cobertura | 100% |
| Contratos arquivados no próprio dia | >95% |
| Período experimental falhado | <10% |
## Colaboração
- **Reporta a**: Emanuel Almeida
- **Colabora com**: support-specialist (onboarding de suporte), project-manager (alocação a projectos)
- **Escalar para**: Emanuel (rescisões, contratuais, conflitos), D3 Contabilidade (salarial)
---
**Tarefa Desk:** #65 · G4.3 (Plano Resolução Gaps Q2 2026) · criado 08-04-2026
+3 -3
View File
@@ -8,7 +8,7 @@ description: >
# /deep-research — Pesquisa Profunda com RAG Trinity # /deep-research — Pesquisa Profunda com RAG Trinity
Pesquisa em 3 camadas com síntese final. Mais profundo que `/research`, mais estruturado que `/hub-search`. Pesquisa em 3 camadas com síntese final. Mais estruturado que `/hub-search` (que só cobre a Layer 1).
--- ---
@@ -17,9 +17,9 @@ Pesquisa em 3 camadas com síntese final. Mais profundo que `/research`, mais es
| Situação | Skill Correcta | | Situação | Skill Correcta |
|---------|----------------| |---------|----------------|
| "Onde está X no Hub?" | `/hub-search` | | "Onde está X no Hub?" | `/hub-search` |
| "Analisa este documento" | `/research` | | "Analisa este documento" | Leitura directa (Read/Grep) — não há skill dedicada para análise de documento único |
| "Pesquisa profunda + síntese de múltiplas fontes" | `/deep-research` ← este | | "Pesquisa profunda + síntese de múltiplas fontes" | `/deep-research` ← este |
| "Análise competitiva completa" | `/deep-research` + `/research competitive` | | "Análise competitiva completa" | `/deep-research` (foco competitivo na query) |
--- ---
+55 -55
View File
@@ -5,22 +5,21 @@ description: >
Use for SEO strategy, keyword research, technical SEO audits, on-page optimization, Core Web Vitals, rankings monitoring, link building, SERP analysis, Use for SEO strategy, keyword research, technical SEO audits, on-page optimization, Core Web Vitals, rankings monitoring, link building, SERP analysis,
or when user mentions "SEO", "keywords", "rankings", "tráfego orgânico", "SERP", "technical SEO", "link building", "Google", "optimização", "indexação". or when user mentions "SEO", "keywords", "rankings", "tráfego orgânico", "SERP", "technical SEO", "link building", "Google", "optimização", "indexação".
author: Descomplicar® Crescimento Digital author: Descomplicar® Crescimento Digital
version: 2.0.0 version: 3.0.0
category: business category: business
model: sonnet model: sonnet
tools: Read, Glob, Grep, ToolSearch tools: Read, Glob, Grep, ToolSearch
# Dependencies # Dependencies
# Nota: MCPs como desk-crm-v3, moloni, easypanel, lighthouse, authentik, spaceship e youtube # OpenSEO é o motor único de SEO. O stack antigo (gsc, lighthouse, Ahrefs,
# estão desligados por omissão — pedir activação via /mcp (regra 57) antes de os usar. # SEO Tools API) está desligado ou não existe — não o invocar.
primary_mcps: primary_mcps:
- gsc - openseo
- google-analytics
- desk-crm-v3
recommended_mcps: recommended_mcps:
- lighthouse - chrome-devtools
- google-workspace
- context7 - context7
allowed-mcps: ssh-unified, google-workspace, gsc, lighthouse, google-analytics, tavily allowed-mcps: openseo, chrome-devtools, google-workspace, context7
skills: skills:
- _core - _core
- seo-audit - seo-audit
@@ -31,18 +30,18 @@ desk_task: 1516
# SEO Specialist Descomplicar # SEO Specialist Descomplicar
Especialista em optimizacao para motores de busca, focado em crescimento de trafego organico atraves de SEO tecnico, optimizacao de conteudo e estrategias de link building. Especialista em optimização para motores de busca, focado em crescimento de tráfego orgânico através de SEO técnico, optimização de conteúdo e estratégias de link building.
## Responsabilidades ## Responsabilidades
- Conduzir pesquisa de keywords e analise competitiva - Conduzir pesquisa de keywords e análise competitiva
- Optimizar elementos on-page (titulos, meta descriptions, headers) - Optimizar elementos on-page (títulos, meta descriptions, headers)
- Melhorar SEO tecnico (velocidade, crawlability, indexacao, Core Web Vitals) - Melhorar SEO técnico (velocidade, crawlability, indexação, Core Web Vitals)
- Desenvolver estrategias de link building e autoridade de dominio - Desenvolver estratégias de link building e autoridade de domínio
- Monitorizar rankings e reportar metricas de trafego organico - Monitorizar rankings e reportar métricas de tráfego orgânico
## Knowledge Sources (Consultar SEMPRE) ## Knowledge Sources (Consultar SEMPRE)
### NotebookLM (Primario - usar PRIMEIRO) ### NotebookLM (Primário — usar PRIMEIRO)
``` ```
mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"keywords rankings optimizacao SERP" mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"keywords rankings optimizacao SERP"
@@ -51,13 +50,13 @@ mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf565
## System Prompt ## System Prompt
### Papel ### Papel
Especialista SEO responsavel por aumentar trafego organico atraves de optimizacao tecnica, keyword research e estrategias de link building alinhadas com algoritmos 2026. Especialista SEO responsável por aumentar tráfego orgânico através de optimização técnica, keyword research e estratégias de link building alinhadas com algoritmos 2026.
### Regras Obrigatorias ### Regras Obrigatórias
1. SEMPRE priorizar Core Web Vitals (LCP, FID, CLS) 1. SEMPRE priorizar Core Web Vitals (LCP < 2,5s, INP < 200ms, CLS < 0,1 — o INP substituiu o FID)
2. NUNCA usar black-hat SEO (keyword stuffing, PBNs, cloaking) 2. NUNCA usar black-hat SEO (keyword stuffing, PBNs, cloaking)
3. Keyword research baseado em search intent, nao volume 3. Keyword research baseado em search intent, não volume
4. E-E-A-T obrigatorio (Experience, Expertise, Authority, Trust) 4. E-E-A-T obrigatório (Experience, Expertise, Authority, Trust)
5. Mobile-first indexing (testar sempre em mobile) 5. Mobile-first indexing (testar sempre em mobile)
6. Structured data (Schema.org) para rich snippets 6. Structured data (Schema.org) para rich snippets
@@ -69,73 +68,74 @@ Especialista SEO responsavel por aumentar trafego organico atraves de optimizaca
## Workflows ## Workflows
### Workflow 1: Keyword Research ### Workflow 1: Keyword Research
1. Seed keywords: Brainstorm com cliente, analise concorrentes 1. **Search Console primeiro** (grátis): `get_search_console_performance` — o que já posiciona
2. Expansion: Google Keyword Planner, Ahrefs, SEMrush 2. Striking distance: filtrar pos 4-20 com impressões ≥ 25 (o GSC não filtra por posição)
3. Intent mapping: Informacional, navegacional, transaccional 3. Hidratar: `get_keyword_metrics` — até 700 keywords/chamada, volume + KD + intenção
4. Difficulty: Avaliar competicao (DA de top 10) 4. Expandir (só se necessário): `research_keywords`, 1-5 seeds
5. Priorization: Quick wins (low difficulty, medium volume) 5. Priorizar: quick wins (KD baixo, volume médio, intenção comercial)
6. Mapping: Atribuir keywords a paginas/conteudos 6. Mapear keywords a páginas; guardar com `save_keywords`
### Workflow 2: Technical SEO Audit ### Workflow 2: Technical SEO Audit
1. Crawl: Screaming Frog, Google Search Console 1. GSC por página: conta quantas páginas têm procura real
2. Core Web Vitals: PageSpeed Insights, Lighthouse 2. `run_site_audit` com **maxPages ≥ páginas do GSC + 25%** (o default 50 cega a auditoria)
3. Indexation: Sitemap, robots.txt, canonicals, redirects 3. `get_audit_status` em poll até "completed"; depois `get_audit_issues` por severidade
4. Structure: URL structure, internal linking, breadcrumbs 4. Priorizar issues pelas páginas com impressões — nunca por contagem bruta
5. Mobile: Responsive design, tap targets, viewport 5. Core Web Vitals das páginas que importam: `chrome-devtools → performance_start_trace`
6. Schema: Structured data validation (Google Rich Results Test) 6. Indexação: `inspect_urls` (até 10 URLs)
### Workflow 3: On-Page Optimization ### Workflow 3: On-Page Optimization
1. Title tag: Keyword + brand, <60 chars 1. Title tag: Keyword + brand, <60 chars
2. Meta description: CTR-focused, <160 chars 2. Meta description: CTR-focused, <160 chars
3. Headers: H1 (1x), H2/H3 hierarchy com keywords 3. Headers: H1 (1x), H2/H3 hierarchy com keywords
4. Content: E-E-A-T, >1000 words para pillar content 4. Content: E-E-A-T, >1000 words para pillar content
5. Images: Alt text descritivo, compressao, lazy loading 5. Images: Alt text descritivo, compressão, lazy loading
6. Internal links: Link para conteudo relacionado 6. Internal links: Link para conteúdo relacionado
## MCPs Relevantes ## MCPs Relevantes
- ssh-unified: Optimizacoes tecnicas em servidores WP - **openseo**: motor único — crawl, Search Console, keywords, SERP, backlinks
- google-workspace: GSC data, relatorios em Sheets - **chrome-devtools**: Core Web Vitals e Lighthouse por página
- **google-workspace**: exportar relatórios para Docs/Sheets
## Metricas Chave ## Métricas Chave
- **Organic Traffic**: Visitantes de search engines - **Organic Traffic**: Visitantes de search engines
- **Rankings**: Posicoes keywords alvo (top 3 = sucesso) - **Rankings**: Posições das keywords alvo (top 3 = sucesso)
- **CTR**: Click-through rate em SERPs - **CTR**: Click-through rate em SERPs
- **Core Web Vitals**: LCP <2.5s, FID <100ms, CLS <0.1 - **Core Web Vitals**: LCP < 2,5s, INP < 200ms, CLS < 0,1
- **Backlinks**: Numero e qualidade (DA dos sites) - **Backlinks**: Número e qualidade (DA dos sites)
## Colaboracao ## Colaboração
- Reports to: Digital Marketing Manager - Reports to: Digital Marketing Manager
- Colabora com: Content Manager, Copywriter, Web Designer, WordPress Developer - Colabora com: Content Manager, Copywriter, Web Designer, WordPress Developer
## Your Available MCPs ## Your Available MCPs
### Primary MCPs (Your Domain) ### Primary MCPs (Your Domain)
✓ **ssh-unified** (infra) ✓ **openseo** (motor SEO)
- SSH, SFTP, servidor management - Crawl e issues, Search Console, keywords, SERP, backlinks, rank tracking
- Usage: `mcp__ssh-unified__*` - Ferramentas grátis primeiro; pagas só depois de esgotar as grátis
- Mercado PT obrigatório: `locationCode: 2620`, `languageCode: "pt"`
✓ **google-workspace** (integration) ✓ **chrome-devtools** (performance)
- Email, calendário, docs, drive - `lighthouse_audit`, `performance_start_trace` — CWV reais por página
- Usage: `mcp__google-workspace__*`
### Recommended for seo ### Recommended for seo
- **gsc** - Google Search Console - **google-workspace** — Exportar relatórios (Docs, Sheets)
- **lighthouse** - Performance audits - **context7** — Documentação de bibliotecas e frameworks
- **google-analytics** - Google Analytics 4
- **tavily** - AI-powered search API - web search optimizado para LLMs
### All Available (32 total) ### Desligados — NÃO invocar
desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, imap, outline-api, youtube-research, youtube-uploader, mcp-time, mem0, puppeteer, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, elevenlabs, magic, vimeo, design-systems, replicate `gsc`, `lighthouse`, `google-analytics` estão em disabledServers. `Ahrefs` e a
`SEO Tools API` (localhost:3000) não existem. Se precisares de um deles, pedir
activação via `/mcp` — nunca contornar com bash/curl.
**Discovery:** Use ToolSearch to find specific tools. **Discovery:** Use ToolSearch to find specific tools.
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools. **Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
## Your Available Skills ## Your Available Skills
### Primary Skills (Your Domain) ### Primary Skills (Your Domain)
✓ **/seo-audit** - Auditoria SEO completa usando todas as ferramentas instaladas - Lighthouse, SEO ✓ **/seo-audit** - Auditoria SEO completa com dados reais via OpenSEO (crawl, GSC, SERP, backlinks)
- Invoke: `/seo-audit` - Invoke: `/seo-audit`
✓ **/seo-report** - Relatório SEO completo com dados de múltiplas fontes (Lighthouse, GSC, SEO Tools ✓ **/seo-report** - Relatório SEO para cliente com OpenSEO, exportado para Google Docs
- Invoke: `/seo-report` - Invoke: `/seo-report`
### Recommended for seo ### Recommended for seo
+141 -135
View File
@@ -1,202 +1,208 @@
--- ---
name: seo-audit name: seo-audit
description: Auditoria SEO completa com recomendacoes de optimizacao. Analisa SEO tecnico, conteudo, backlinks e desempenho. description: Auditoria SEO completa com dados reais via OpenSEO (crawl, Search Console, SERP, backlinks, keywords). Analisa SEO técnico, conteúdo, autoridade e desempenho, e prioriza por retorno. Usar quando "auditoria SEO", "audit", "analisar site", "Core Web Vitals", "Search Console", "striking distance", "porque não tenho tráfego".
--- ---
# SEO Audit - Auditoria Completa # SEO Audit — Auditoria Completa (OpenSEO)
Skill para realizar auditorias SEO completas usando o stack de ferramentas instalado. Best practices 2026. Auditoria SEO com dados reais. **Motor único: OpenSEO** (`seo.descomplicar.pt`), que substituiu o stack antigo (SEO Tools API + Ahrefs + GSC MCP + Lighthouse MCP) — ver `references/ferramentas-api.md` para a tabela de migração.
--- ---
## Contexto NotebookLM ## Regra zero — a ordem é económica, não estética
ANTES de executar, consultar notebook para contexto especializado: O OpenSEO tem ferramentas **grátis** e ferramentas **que gastam créditos**. Executar pela ordem errada gasta dinheiro a produzir conclusões que as ferramentas grátis já davam.
| Notebook | ID | Consultar quando | | Fase | Ferramentas | Custo | Porquê nesta ordem |
|----------|-----|-----------------| |---|---|---|---|
| Marketing Digital PT | `4c595973` | Sempre | | 1 | `get_search_console_performance`, `inspect_urls` | **grátis** | Dados de primeira mão. Diz o que já posiciona e quais páginas importam |
| 2 | `run_site_audit`, `get_audit_issues`, `get_audit_pages` | **grátis** | Estado técnico. O dimensionamento do crawl depende da fase 1 |
| 3 | `get_keyword_metrics` | pago (lote) | Hidrata até 700 keywords conhecidas de uma vez — a melhor relação valor/crédito |
| 4 | `get_ranked_keywords`, `get_domain_overview`, `get_backlinks_overview` | pago | Contexto competitivo |
| 5 | `get_serp_results`, `find_serp_competitors` | pago (~30-60/keyword) | Só nas keywords que sobreviveram à filtragem |
``` **Nunca começar pela fase 3 ou acima.** As fases 1-2 resolvem a maioria das auditorias sem gastar um crédito.
mcp__notebooklm__notebook_query({
notebook_id: "4c595973-ba10-420a-a3bf-e4389e424ad3",
query: "<adaptar ao contexto — ex: auditoria SEO tecnico, Core Web Vitals, backlinks, E-E-A-T>"
})
```
**Procedimento relacionado:** `PROC-DMARC-Email-Entregabilidade.md` -- consultar quando a auditoria envolve email deliverability.
--- ---
## Quando Usar ## Pré-voo obrigatório (3 verificações, 30 segundos)
- Auditar um site completo (tecnico + conteudo + performance) ```
- Verificar Core Web Vitals e ranking factors 1. openseo → whoami → confirma ligação, org, modo
- Analisar backlinks e autoridade de dominio 2. openseo → list_projects → obtém projectId E o mercado do projecto
- Obter dados reais do Google Search Console 3. confirmar mercado → PT = locationCode 2620, languageCode "pt"
- Identificar oportunidades de optimizacao ```
- Comparar com concorrencia
**GATE — mercado.** Se o projecto estiver em `2840/en` (EUA/inglês, que é o default) e o cliente for português, **todas** as chamadas pagas devolvem dados do mercado errado. Ou se corrige o mercado do projecto, ou se passa `locationCode`/`languageCode` explicitamente em **cada** chamada. Um esquecimento = créditos gastos em lixo.
> `locationCode: 2620` = Portugal — confirmado empiricamente (SERP devolve domínios `.pt`). Não inventar códigos: se houver dúvida, correr uma query de teste e validar pelos resultados.
--- ---
## Google Updates 2026 ## Fase 1 — Search Console primeiro (grátis, é o mapa)
### Core Algorithm Updates ```
openseo → get_search_console_performance
dimensions: ["query"] dateRange: "last_3_months" rowLimit: 1000
openseo → get_search_console_performance
dimensions: ["page"] dateRange: "last_3_months" rowLimit: 1000
```
| Update | Data | Impacto | Paginar com `startRow` enquanto o cabeçalho disser `more available`.
|--------|------|---------|
| **Helpful Content Q1** | Jan 2026 | Penaliza conteudo AI de baixa qualidade |
| **Core Web Vitals 3.0** | Mar 2026 | INP substitui FID, thresholds mais rigorosos |
| **E-E-A-T Focus** | Q1-Q2 | Experiencia pratica obrigatoria |
| **Mobile-First Index** | Universal | 100% dos sites |
### Novos Ranking Factors 2026 ### As três armadilhas do GSC
1. **INP (Interaction to Next Paint)** -- Bom: < 200ms | Medio: 200-500ms | Mau: > 500ms **1. Vista por query ≠ vista por página.** O GSC anonimiza queries raras, por isso os totais por query são sempre **muito menores** que os totais por página. A vista por **página** é a real; usar essa para números globais.
2. **E-E-A-T** -- Autor identificado com bio, credenciais verificaveis, experiencia real
3. **Page Experience Signals** -- HTTPS obrigatorio, intrusive interstitials penalizados **2. O GSC não filtra por posição.** `striking distance` tem de ser filtrado do lado do cliente, depois de puxar as linhas.
**3. Há lixo nas queries.** Colagens de relatórios do Google Ads, operadores `site:`, strings com mojibake. Filtrar antes de contar, ou as métricas mentem.
```python
def is_noise(k):
return ('ativado' in k and 'correspond' in k) or k.startswith('-site:') \
or k.startswith('=') or len(k) > 90 or '0,00' in k
```
### O que extrair
| Métrica | Cálculo | Leitura |
|---|---|---|
| CTR global | cliques ÷ impressões (vista por página) | < 1% = problema de captação, não de ranking |
| Distribuição por posição | buckets 1-3 / 4-10 / 11-20 / 21-50 / 51+ | Impressões concentradas em 21+ = visibilidade inútil |
| Branded vs não-branded | queries com o nome da marca vs resto | Se só a marca converte, o SEO não está a trabalhar |
| **Striking distance** | pos 4-20 **e** impressões ≥ 25 | **É aqui que está o retorno** |
| Desperdício | pos > 40 **e** impressões ≥ 300 | Páginas com procura real enterradas |
### O sinal mais accionável de todos
**Posição 4-10 com CTR perto de 0%.** Não é problema de ranking — o site está na primeira página. É o **título e a meta description** a não convencerem. Cruzar esta lista com os issues `missing-meta-description` e `title-too-long` da fase 2: a intersecção é a lista de trabalho, por ordem.
--- ---
## Workflow de Auditoria Completa ## Fase 2 — Auditoria técnica (grátis)
### Passo 1: Analise Tecnica Basica (3 min)
``` ```
1. SEO Tools API -> /seo-audit -> Meta tags, headings, estrutura HTML openseo → run_site_audit
2. SEO Tools API -> /page-speed-analyzer -> Velocidade, sugestoes url: "<url>" maxPages: <N> runLighthouse: true
3. Lighthouse -> run_audit -> Performance, SEO, Accessibility scores openseo → get_audit_status (poll até "completed")
openseo → get_audit_issues (severity: critical → warning → info)
``` ```
**Checklist Critico:** ### GATE — `maxPages` (o erro que cega a auditoria)
- [ ] Meta title (50-60 chars)
- [ ] Meta description (150-160 chars)
- [ ] H1 unico com keyword
- [ ] Canonical URL definido
- [ ] Robots.txt acessivel
- [ ] Sitemap.xml presente
- [ ] HTTPS activo
- [ ] Mobile-friendly
### Passo 2: Core Web Vitals (2 min) **`maxPages` tem default 50.** Um site de 600 páginas auditado com o default devolve um relatório limpo e falso: descreve 8% do site e omite exactamente o hub de conteúdo que gera o tráfego.
**Regra:** `maxPages` ≥ número de páginas com impressões no GSC (fase 1), com folga de ~25%. Por isso é que a fase 1 vem primeiro — é ela que dimensiona o crawl.
> Caso real (descomplicar.pt, 07-2026): auditoria com default 50 → 25 URLs únicos, 92 issues, **zero críticos**, nenhuma das 119 páginas `/guia-*`. Relançada com `maxPages: 600` → **1337 issues, 9 críticos**. O relatório "limpo" descrevia 4% do site.
### Prioridade dos issues
| Severidade | Tipos | Acção |
|---|---|---|
| **critical** | `broken-internal-link`, `blocked-page`, `server-error`, `broken-page` | Corrigir já — sangram autoridade e crawl budget |
| **warning** | `missing-h1`, `missing-meta-description`, `duplicate-content`, `multiple-h1`, `duplicate-title` | Priorizar pelas páginas com impressões (fase 1) |
| **info** | `title-too-long`, `noindex-page`, `slow-response`, `heading-order-skip` | Lote; só vale a pena onde há procura |
**Nunca tratar a lista de issues por ordem de contagem.** 300 metas em falta em páginas sem impressões valem menos que 6 em páginas na posição 8. A fase 1 é que ordena a fase 2.
### Limitação conhecida — issues sem URL
`get_audit_issues` e `get_audit_pages` devolvem **apenas contagens agregadas** através da bridge MCP. As linhas por URL vivem em `structuredContent.issues`, que a bridge não entrega; `get_audit_pages` trunca a listagem em ~25 linhas independentemente do `limit`.
**Contorno:** o campo `details.mcpMeta.url` da resposta traz o link do relatório na UI. Entregar esse link ao humano para os URLs concretos:
```
https://seo.descomplicar.pt/p/<projectId>/audit?auditId=<auditId>
```
Declarar esta limitação no relatório — não fingir que se verificaram URLs que não se viram.
### Core Web Vitals por página
`run_site_audit` com `runLighthouse: true` corre Lighthouse numa amostra (até 20 páginas). Para uma página específica, usar `chrome-devtools`:
``` ```
1. Lighthouse -> get_core_web_vitals -> LCP, INP, CLS (mobile + desktop) chrome-devtools → lighthouse_audit (SEO, acessibilidade, best practices)
2. Lighthouse -> compare_mobile_desktop -> Identificar gaps chrome-devtools → performance_start_trace (LCP, INP, CLS reais)
3. Lighthouse -> get_lcp_opportunities -> Sugestoes optimizacao
``` ```
**Thresholds 2026:** **Thresholds 2026:** LCP < 2,5s · **INP** < 200ms · CLS < 0,1
(INP substituiu o FID — se algum documento ainda disser FID, está desactualizado.)
| Metrica | Bom | Necessita Melhoria | Mau | ---
|---------|-----|-------------------|-----|
| **LCP** | < 2.5s | 2.5-4s | > 4s |
| **INP** | < 200ms | 200-500ms | > 500ms |
| **CLS** | < 0.1 | 0.1-0.25 | > 0.25 |
### Passo 3: Analise de Conteudo (3 min) ## Fase 3 — Hidratar keywords (pago, lote)
``` ```
1. SEO Tools API -> /content-optimization -> On-page SEO, keyword density openseo → get_keyword_metrics
2. SEO Tools API -> /internal-linking -> Estrutura links internos keywords: [<as keywords em striking distance da fase 1>]
3. SEO Ahrefs -> keyword_generator -> Keywords relacionadas, volume, KD locationCode: 2620 languageCode: "pt"
``` ```
**Checklist E-E-A-T:** Até **700 keywords numa só chamada** — volume, dificuldade (KD), intenção, CPC, tendência. É a forma barata de priorizar. Só depois disto se decide onde vale a pena competir.
- [ ] Autor identificado com bio
- [ ] Credenciais verificaveis
- [ ] Data publicacao/actualizacao
- [ ] Fontes citadas (links externos autoritativos)
- [ ] Experiencia real demonstrada
### Passo 4: Backlinks e Autoridade (2 min) Guardar o que sobreviver: `openseo → save_keywords` (grátis, idempotente).
---
## Fase 4 — Contexto competitivo (pago)
``` ```
1. SEO Tools API -> /backlink-checker -> Backlinks basicos, DR/UR openseo → get_domain_overview (tráfego orgânico estimado, nº keywords, backlinks)
2. SEO Ahrefs -> get_backlinks_list -> Lista detalhada (DR, anchor text) openseo → get_ranked_keywords (onde o domínio posiciona, por mercado)
3. SEO Ahrefs -> get_traffic -> Trafego estimado mensal openseo → get_backlinks_overview (~50 créditos por domínio)
``` openseo → get_backlinks_profile (linhas detalhadas: anchors, dofollow, spam)
**Metricas Autoridade:**
- **DR (Domain Rating)**: 0-100 (forca backlink profile)
- **UR (URL Rating)**: 0-100 (forca pagina especifica)
- **Backlinks**: Quantidade + qualidade (DR > 30)
- **Referring Domains**: Numero de dominios unicos
### Passo 5: Dados Reais GSC (3 min)
```
1. GSC -> get_search_analytics -> Queries, impressoes, CTR real (ultimos 90 dias)
2. GSC -> check_indexing_issues -> Problemas de indexacao
3. GSC -> get_sitemaps -> Status sitemaps submetidos
```
**Metricas GSC a Analisar:**
- **Impressoes vs Cliques**: CTR medio > 2%
- **Posicao media**: Top 3 para keywords principais
- **Cobertura**: % paginas indexadas vs submetidas
- **Mobile Usability**: Erros especificos mobile
### Passo 6: Concorrencia (opcional, 2 min)
```
SEO Tools API -> /competitor-analysis -> Comparar com 2-3 concorrentes
- Keywords gap
- Backlinks gap
- Content gap
``` ```
--- ---
## Propriedades GSC Disponiveis ## Fase 5 — SERP (pago, por último)
``` ```
sc-domain:descomplicar.pt openseo → get_serp_results (1-10 keywords por chamada, ~30-60 créditos cada)
https://emanuelalmeida.pt/ openseo → find_serp_competitors (quem compete num conjunto de keywords)
https://carstuff.pt/
https://solarfvengenharia.com/
https://aquisevende.pt/
https://alojadamaria.com/
https://e-commerce.descomplicar.pt/
``` ```
--- Ler a SERP como **estrutura**, não como lista: se o top-10 estiver cheio de directórios e artigos "melhores X", a intenção é comparativa e uma homepage não entra — é preciso uma página de comparação. Se estiver cheio de homepages de concorrentes, é disputa de marca.
## Notas Importantes Local/Maps: `get_local_serp_results`, `search_local_businesses`, `get_google_business_questions`.
### Requisitos
- **SEO Tools API** deve estar a correr: `~/mcp-servers/seo-tools-api/start.sh`
- **GSC** requer autenticacao OAuth na primeira utilizacao
- **GA** requer ADC credentials configuradas
### Limitacoes
- Ahrefs API tem rate limiting (100 req/day free tier)
- GSC data maximo: 16 meses historico
- Lighthouse scores variam +/- 5 pontos entre execucoes
--- ---
## References (conteudo detalhado) ## Custos — o que sabemos e o que não sabemos
| Ficheiro | Conteudo | `whoami` **não expõe saldo de créditos** em modo self-hosted (verificado antes e depois de uma chamada paga: output idêntico). Os `~30-60 créditos/keyword` são a **estimativa do schema**, não uma medição.
|----------|----------|
| `references/template-relatorio-auditoria.md` | Template completo do relatorio com todas as seccoes e tabelas | **Consequência prática:** não há medidor no OpenSEO. O contador real vive na conta DataForSEO. Para lotes grandes, confirmar saldo aí primeiro. Nunca reportar custo consumido como facto — reportar como estimativa.
| `references/ferramentas-api.md` | Endpoints SEO Tools API, Lighthouse MCP, Ahrefs, GSC, GA |
--- ---
## Anti-Patterns ## Anti-patterns
- Auditar sem dados reais (nunca simular metricas) - **Correr `run_site_audit` com o `maxPages` por omissão.** Produz relatórios limpos e falsos.
- Ignorar gap mobile vs desktop - **Começar por ferramentas pagas.** O GSC é grátis e responde a metade das perguntas.
- Nao verificar se site esta no GSC antes de recolher dados - Usar totais por query como totais do site (o GSC anonimiza — usar a vista por página).
- Recomendacoes sem priorizacao (critico/importante/melhoria) - Priorizar issues por contagem em vez de por impressões da página afectada.
- Esquecer E-E-A-T na analise de conteudo - Correr chamadas pagas sem confirmar o mercado do projecto.
- Apresentar contagens de issues como se fossem URLs verificados.
- Auditar sem dados reais ou simular métricas.
- Recomendações sem prioridade (crítico/importante/melhoria) e sem esforço estimado.
--- ---
**Versao:** 2.1.0 | **Autor:** Descomplicar ## References
| Ficheiro | Conteúdo |
|---|---|
| `references/ferramentas-api.md` | Inventário OpenSEO completo + tabela de migração do stack antigo |
| `references/template-relatorio-auditoria.md` | Template do relatório com todas as secções e tabelas |
---
**Versão:** 3.0.0 | **Autor:** Descomplicar® | **Motor:** OpenSEO
## Healing Log ## Healing Log
<!-- Registo automático de erros e correcções nesta skill --> <!-- Registo automático de erros e correcções nesta skill -->
```jsonl
{"date":"2026-07-30","issue":"Skill dependia de SEO Tools API (localhost:3000), Ahrefs MCP, GSC MCP e Lighthouse MCP — todos inexistentes ou desligados. Nenhum dos 6 passos era executável.","fix":"Reescrita completa sobre OpenSEO, com ordem por custo, gates de mercado e maxPages.","source":"auto"}
```
@@ -1,75 +1,113 @@
# Ferramentas e APIs - SEO Audit # Ferramentas SEO — OpenSEO
## 1. SEO Tools API (http://localhost:3000) Motor único do SEO Descomplicar®. Substituiu integralmente o stack anterior.
UI: `https://seo.descomplicar.pt` · Projecto default: `1e5ad4d6-a285-4fd3-9633-339abef4b6af`
```bash ---
# Auditoria basica
curl "http://localhost:3000/seo-audit?url=URL"
# Velocidade PageSpeed Insights style ## 1. Migração — o que morreu e o que o substitui
curl "http://localhost:3000/page-speed-analyzer?url=URL"
# Backlinks + DR/UR O stack antigo desta skill (v2.1.0) apontava para quatro dependências. **Nenhuma está operacional** (verificado 30-07-2026):
curl "http://localhost:3000/backlink-checker?url=URL"
# Rankings para keywords | Dependência antiga | Estado real | Substituto OpenSEO |
curl "http://localhost:3000/rank-checker?url=URL&keywords=keyword1,keyword2" |---|---|---|
| **SEO Tools API** `localhost:3000` | `~/mcp-servers/seo-tools-api/` **não existe em disco** | ver tabela abaixo |
| **Ahrefs MCP** | nunca esteve em nenhuma config MCP | `get_backlinks_*`, `get_domain_overview`, `get_keyword_metrics` |
| **GSC MCP** | em `disabledServers` | `get_search_console_performance`, `inspect_urls` |
| **Lighthouse MCP** | em `disabledServers` | `run_site_audit` (`runLighthouse`) ou `chrome-devtools` |
# Optimizacao conteudo on-page ### Endpoint a endpoint
curl "http://localhost:3000/content-optimization?url=URL"
# Internal linking structure | Antigo | Novo | Nota |
curl "http://localhost:3000/internal-linking?url=URL" |---|---|---|
| `/seo-audit` | `run_site_audit` + `get_audit_issues` | Atenção ao `maxPages` |
| `/page-speed-analyzer` | `run_site_audit` com `runLighthouse: true` | Amostra até 20 páginas |
| `/content-optimization` | `get_audit_issues` (`thin-content`, `title-*`, `meta-description-*`) | |
| `/internal-linking` | `get_audit_issues` (`orphan-page`, `broken-internal-link`, `no-outgoing-links`) | |
| `/backlink-checker` | `get_backlinks_overview` | |
| `/rank-checker` | `get_rank_tracker` (grátis) ou `get_ranked_keywords` (pago) | |
| `/competitor-analysis` | `find_serp_competitors` + `get_domain_overview` | |
| `/sitemap-generator` | **sem equivalente** | Usar plugin WP ou gerar à mão |
| Ahrefs `keyword_generator` | `research_keywords` (novas) / `get_keyword_metrics` (conhecidas) | |
| Ahrefs `get_backlinks_list` | `get_backlinks_profile` | |
| Ahrefs `get_traffic` | `get_domain_overview` | Estimado |
| Lighthouse `run_audit` | `chrome-devtools → lighthouse_audit` | Por página |
| Lighthouse `get_core_web_vitals` | `chrome-devtools → performance_start_trace` | LCP/INP/CLS reais |
| GSC `get_search_analytics` | `get_search_console_performance` | |
| GSC `check_indexing_issues` | `inspect_urls` | Até 10 URLs por chamada |
| GSC `get_sitemaps` | **sem equivalente** | Ver na UI do Search Console |
# Sitemap XML generator ---
curl "http://localhost:3000/sitemap-generator?url=URL"
# Analise concorrencia ## 2. Inventário OpenSEO (24 ferramentas)
curl "http://localhost:3000/competitor-analysis?url=URL&competitors=site1.com,site2.com"
```
## 2. Lighthouse MCP ### Grátis — não tocam no DataForSEO
| Tool | Funcao | Output | | Ferramenta | Função |
|------|--------|--------| |---|---|
| `run_audit(url)` | Auditoria completa | Performance, SEO, A11y, Best Practices | | `whoami` | Utilizador, org, modo, scopes. **Não mostra saldo em self-hosted** |
| `get_performance_score(url)` | Score performance | 0-100 | | `list_projects` | Projectos + `projectId` + mercado default |
| `get_core_web_vitals(url)` | LCP, INP, CLS | Mobile + Desktop | | `create_project` | Novo projecto (nome, domínio, mercado) |
| `get_accessibility_score(url)` | Acessibilidade | 0-100 + issues | | `run_site_audit` | Crawl same-origin, robots-aware. `maxPages` **default 50** |
| `get_seo_analysis(url)` | Analise SEO tecnico | Meta, headings, indexabilidade | | `get_audit_status` | Progresso (fase, páginas, Lighthouse) |
| `get_security_audit(url)` | Seguranca | HTTPS, mixed content, headers | | `get_audit_issues` | Relatório priorizado. Filtros `severity`/`issueType` |
| `compare_mobile_desktop(url)` | Comparacao | Diferencas performance | | `get_audit_pages` | Páginas crawladas com dados SEO por página |
| `get_lcp_opportunities(url)` | Optimizacoes LCP | Preload, lazy load | | `get_search_console_performance` | Search Analytics: cliques, impressões, CTR, posição |
| `find_unused_javascript(url)` | JS nao usado | Tamanhos, % savings | | `inspect_urls` | URL Inspection do GSC (até 10 URLs): indexação, canónico |
| `get_rank_tracker` | Configs de rank tracking + último snapshot |
| `save_keywords` | Guardar keywords no projecto (idempotente) |
| `list_saved_keywords` | Keywords guardadas + métricas em cache |
## 3. SEO Ahrefs MCP (via API) ### Pagas — consomem créditos
| Tool | Funcao | Dados | | Ferramenta | Custo aprox. | Função |
|------|--------|-------| |---|---|---|
| `get_backlinks_list(domain)` | Lista backlinks | DR, UR, anchor text | | `get_keyword_metrics` | lote | **Até 700 keywords/chamada**: volume, KD, intenção, CPC, tendência |
| `keyword_generator(keyword, country)` | Ideias keywords | Volume, KD, CPC | | `research_keywords` | ~30-100/seed | 1-5 seeds → ideias novas + métricas |
| `get_traffic(domain)` | Trafego estimado | Visitas mensais, keywords | | `get_serp_results` | ~30-60/keyword | Google orgânico ao vivo, 1-10 keywords |
| `keyword_difficulty(keyword)` | Dificuldade keyword | 0-100 (KD score) | | `find_serp_competitors` | pago | Domínios que competem num conjunto de keywords |
| `get_ranked_keywords` | pago | Keywords onde um domínio posiciona, por mercado |
| `get_domain_overview` | pago | Tráfego orgânico, nº keywords, backlinks, ref. domains |
| `get_domain_keyword_suggestions` | pago | Lista detalhada de keywords de um domínio |
| `get_backlinks_overview` | ~50/domínio, ~25/página | Resumo do perfil de backlinks |
| `get_backlinks_profile` | pago | Linhas detalhadas: anchors, dofollow, spam, lost/broken |
| `get_local_serp_results` | pago | Google Maps / Local Finder junto a coordenadas |
| `search_local_businesses` | pago | Negócios locais perto de coordenadas |
| `get_google_business_questions` | pago | Q&A de Google Business Profile |
## 4. Google Search Console MCP ---
| Tool | Funcao | Dados Reais | ## 3. Mercados
|------|--------|-------------|
| `list_properties` | Listar sites verificados | URLs properties |
| `get_search_analytics(site, period)` | Queries, cliques, CTR | Ultimos 16 meses |
| `inspect_url_enhanced(site, url)` | Inspeccionar URL | Indexacao, mobile usability |
| `check_indexing_issues(site, urls)` | Problemas indexacao | Erros, avisos |
| `get_sitemaps(site)` | Listar sitemaps | Status, URLs submetidos |
## 5. Google Analytics MCP | Mercado | `locationCode` | `languageCode` |
|---|---|---|
| **Portugal** | `2620` | `pt` |
| EUA (default do projecto) | `2840` | `en` |
| Tool | Funcao | Metricas | `2620` = Portugal, confirmado empiricamente (SERP devolve domínios `.pt`). **Não inventar códigos** — validar sempre por uma query de teste. Referência oficial: `dataforseo.com/help-center/locations`.
|------|--------|----------|
| `get_account_summaries` | Listar contas | Properties disponiveis |
| `run_report(property, metrics, dimensions)` | Relatorio custom | Sessions, users, bounce rate |
| `run_realtime_report(property)` | Tempo real | Utilizadores activos now |
## Propriedades GSC Disponiveis **Aviso:** alguns países são servidos por dados do Google Ads — volume/CPC funcionam, mas KD, intenção e analytics de domínio não estão disponíveis.
---
## 4. Limitações conhecidas (verificadas, não presumidas)
1. **Issues sem URL.** `get_audit_issues` e `get_audit_pages` devolvem só contagens agregadas via bridge MCP. As linhas por URL vivem em `structuredContent.issues`, que a bridge não entrega. `get_audit_pages` trunca em ~25 linhas mesmo com `limit: 1000`.
→ Contorno: `details.mcpMeta.url` traz o link do relatório na UI.
2. **Sem medidor de créditos.** `whoami` em self-hosted devolve o mesmo output antes e depois de chamadas pagas. Os custos documentados são estimativas do schema. O contador real está na conta DataForSEO.
3. **`maxPages` default 50.** A causa mais comum de auditorias falsamente limpas.
4. **GSC anonimiza queries.** Totais por query são sempre inferiores aos totais por página. Usar a vista por página para números globais.
5. **GSC não filtra por posição.** Striking distance filtra-se do lado do cliente.
6. **Lag do GSC:** os últimos ~3 dias podem estar incompletos. Datas em Pacific Time. Máximo 16 meses de histórico.
---
## 5. Propriedades Search Console disponíveis
``` ```
sc-domain:descomplicar.pt sc-domain:descomplicar.pt
@@ -81,14 +119,6 @@ https://alojadamaria.com/
https://e-commerce.descomplicar.pt/ https://e-commerce.descomplicar.pt/
``` ```
## Requisitos ---
- **SEO Tools API** deve estar a correr: `~/mcp-servers/seo-tools-api/start.sh` **Actualizado:** 30-07-2026 | Substitui a versão baseada em SEO Tools API + Ahrefs + GSC/Lighthouse MCP
- **GSC** requer autenticacao OAuth na primeira utilizacao
- **GA** requer ADC credentials configuradas (`gcloud auth application-default login`)
## Limitacoes
- Ahrefs API tem rate limiting (100 req/day free tier)
- GSC data maximo: 16 meses historico
- Lighthouse scores variam +/- 5 pontos entre execucoes (network dependent)
@@ -183,11 +183,14 @@ H1: [Texto] OK
--- ---
## Ferramentas Utilizadas ## Ferramentas Utilizadas
- SEO Tools API (localhost:3000) - OpenSEO — crawl e issues (`run_site_audit`, `get_audit_issues`)
- Lighthouse MCP - OpenSEO — Search Console (`get_search_console_performance`)
- SEO Ahrefs MCP - OpenSEO — keywords e SERP (`get_keyword_metrics`, `get_serp_results`)
- Google Search Console MCP - OpenSEO — autoridade (`get_backlinks_overview`, `get_domain_overview`)
- Google Analytics MCP (opcional) - chrome-devtools — Core Web Vitals por página (opcional)
**Cobertura do crawl**: [N páginas crawladas] de [M páginas com impressões no GSC]
**Chamadas pagas**: [listar] — custo estimado, não medido (OpenSEO não expõe saldo)
--- ---
@@ -161,20 +161,26 @@ mcp__notebooklm__notebook_query({
## Ferramentas Recomendadas ## Ferramentas Recomendadas
### Validacao ### No stack (usar primeiro — são estes que temos)
- **Google Search Console** - Monitorizacao, indexacao | Necessidade | Ferramenta OpenSEO | Custo |
- **PageSpeed Insights** - Core Web Vitals |---|---|---|
- **Schema Validator** - Testar structured data (schema.org/validator) | Monitorização, indexação | `get_search_console_performance`, `inspect_urls` | grátis |
- **Mobile-Friendly Test** - Google mobile test | Auditoria técnica completa | `run_site_audit` → `get_audit_issues` | grátis |
- **Rich Results Test** - Google rich results | Conteúdo fino, títulos, metas | `get_audit_issues` (`thin-content`, `title-*`, `meta-description-*`) | grátis |
| Keyword research | `get_keyword_metrics` (conhecidas) / `research_keywords` (novas) | pago |
| Backlinks | `get_backlinks_overview`, `get_backlinks_profile` | pago |
| Core Web Vitals | `chrome-devtools → performance_start_trace` | grátis |
### Analise Inventário e tabela de migração: `../seo-audit/references/ferramentas-api.md`
- **Screaming Frog** - Auditoria tecnica completa ### Externas (validação manual)
- **Ahrefs/Semrush** - Keyword research, backlinks
- **AnswerThePublic** - Long-tail questions - **Schema Validator** — testar structured data (schema.org/validator)
- **Google Trends** - Sazonalidade keywords - **Rich Results Test** — Google rich results
- **Mobile-Friendly Test** — Google mobile test
- **AnswerThePublic** — long-tail questions
- **Google Trends** — sazonalidade de keywords
### Optimizacao ### Optimizacao
@@ -249,13 +249,16 @@ https://site.pt/este-url-e-muito-longo-com-muitas-palavras-desnecessarias/
### Ferramentas ### Ferramentas
| Ferramenta | Uso | Métricas | | Ferramenta | Uso | Métricas | Custo |
|------------|-----|----------| |------------|-----|----------|-------|
| Google Keyword Planner | Volume, CPC | Volume mensal, competição | | **OpenSEO** `get_keyword_metrics` | Hidratar até 700 keywords conhecidas | Volume, KD, intenção, CPC, tendência | pago (lote) |
| Ahrefs | KD, SERP analysis | Keyword Difficulty, DR necessário | | **OpenSEO** `research_keywords` | Descobrir keywords novas (1-5 seeds) | Volume, KD, ideias relacionadas | pago (~30-100/seed — estimativa do schema, não medida) |
| Semrush | Concorrência | Gap analysis, trending | | **OpenSEO** `get_search_console_performance` | O que já posiciona (dados próprios) | Cliques, impressões, CTR, posição | **grátis** |
| AnswerThePublic | Long-tail questions | Questões reais utilizadores | | **OpenSEO** `get_ranked_keywords` | Keywords de um domínio (nosso ou concorrente) | Posição, volume, tráfego | pago |
| Google Trends | Sazonalidade | Tendência temporal | | AnswerThePublic | Long-tail questions | Questões reais de utilizadores | grátis |
| Google Trends | Sazonalidade | Tendência temporal | grátis |
**Ordem obrigatória:** Search Console primeiro (grátis e são dados de primeira mão), só depois as pagas. Mercado PT: `locationCode: 2620`, `languageCode: "pt"`.
### Keyword Difficulty Benchmarks ### Keyword Difficulty Benchmarks
+76 -105
View File
@@ -1,30 +1,13 @@
--- ---
name: seo-report name: seo-report
description: Relatorio de auditoria SEO completo com Lighthouse, Google Search Console e exportacao para Google Docs. Analisa Core Web Vitals, desempenho, SEO on-page e gera recomendacoes accionaveis. description: Relatório SEO completo com dados reais via OpenSEO (Search Console, crawl, Core Web Vitals, backlinks) e exportação para Google Docs. Prioriza por retorno e gera plano de acção. Usar quando "relatório SEO", "seo report", "relatório cliente SEO", "auditoria para cliente".
--- ---
# Skill: /seo-report # Skill: /seo-report
Gera relatorio SEO completo com dados de multiplas fontes e exporta automaticamente para Google Docs. Relatório SEO para cliente, com dados reais do **OpenSEO**, exportado para Google Docs.
--- Diferença face a `/seo-audit`: a auditoria é o **diagnóstico técnico interno**; o report é o **entregável ao cliente** — mesma recolha, apresentação orientada a decisão e a orçamento.
## Contexto NotebookLM
ANTES de executar, consultar notebook para contexto especializado:
| Notebook | ID | Consultar quando |
|----------|-----|-----------------|
| Marketing Digital PT | `4c595973` | Sempre |
```
mcp__notebooklm__notebook_query({
notebook_id: "4c595973-ba10-420a-a3bf-e4389e424ad3",
query: "<adaptar ao contexto — ex: auditoria SEO, relatorio performance, recomendacoes tecnicas>"
})
```
**Procedimento relacionado:** `PROC-DMARC-Email-Entregabilidade.md` -- consultar quando o relatorio envolve email deliverability.
--- ---
@@ -32,127 +15,115 @@ mcp__notebooklm__notebook_query({
`/seo-report <url>` ou `/seo-report <url> <email_destino>` `/seo-report <url>` ou `/seo-report <url> <email_destino>`
---
## Exemplos
```bash ```bash
# Relatorio basico (envia para emanuelalmeidaa@gmail.com)
/seo-report https://descomplicar.pt /seo-report https://descomplicar.pt
# Relatorio para cliente especifico
/seo-report https://cliente.pt cliente@email.com /seo-report https://cliente.pt cliente@email.com
# Relatorio com analise concorrencia
/seo-report https://site.pt --competitors=concorrente1.pt,concorrente2.pt /seo-report https://site.pt --competitors=concorrente1.pt,concorrente2.pt
``` ```
--- ---
## Fontes de Dados ## Fontes de dados
| Fonte | Dados Recolhidos | Tempo | | Fonte | Ferramenta | Dados | Custo |
|-------|------------------|-------| |---|---|---|---|
| **Lighthouse (Desktop)** | Performance, SEO, Accessibility, Best Practices | ~30s | | **Search Console** | `get_search_console_performance` | Cliques, impressões, CTR, posição, por query e por página | grátis |
| **Lighthouse (Mobile)** | Core Web Vitals, INP, comparacao mobile/desktop | ~30s | | **Indexação** | `inspect_urls` | Estado de indexação (até 10 URLs) | grátis |
| **Lighthouse (Optimizacoes)** | Oportunidades LCP, JS nao usado, images optimization | ~15s | | **Crawl técnico** | `run_site_audit` → `get_audit_issues` | Issues por severidade, Lighthouse em amostra | grátis |
| **GSC** | Cliques, impressoes, CTR, posicao media, top queries, tendencia 90 dias | ~10s | | **Core Web Vitals** | `chrome-devtools → performance_start_trace` | LCP, INP, CLS por página | grátis |
| **SEO Tools API** | Meta tags, imagens, alt text, links internos/externos, estrutura HTML | ~5s | | **Keywords** | `get_keyword_metrics` | Volume, KD, intenção (até 700/chamada) | pago |
| **Ahrefs (opcional)** | DR, UR, backlinks, referring domains | ~10s | | **Autoridade** | `get_backlinks_overview`, `get_domain_overview` | Backlinks, ref. domains, tráfego estimado | pago |
| **Concorrência** | `find_serp_competitors`, `get_serp_results` | Quem ocupa a SERP | pago |
**Tempo Total:** ~1m40s (sem concorrencia) | ~3m (com 2 concorrentes) **Tempo:** ~5-10 min (crawl de 600 páginas demora ~4 min). Não é instantâneo — avisar o cliente.
--- ---
## Workflow ## Workflow
1. Validar URL de entrada
2. Verificar se site esta no GSC (skip se nao)
3. Executar auditorias em paralelo:
- Lighthouse Desktop + Mobile
- Core Web Vitals
- SEO Tools API
- GSC Analytics (se disponivel)
- Ahrefs (se habilitado)
4. Processar e formatar dados
5. Gerar relatorio Markdown
6. Criar Google Doc e partilhar
7. Retornar link do documento
---
## Estrutura do Relatorio
O relatorio final tem 8 seccoes:
1. **Sumario Executivo** -- Top 5 descobertas + accao imediata recomendada
2. **Pontuacoes Globais** -- Desktop vs Mobile (Performance, SEO, A11y, Best Practices)
3. **Core Web Vitals** -- LCP, INP, CLS com oportunidades de optimizacao
4. **GSC Analytics** -- Performance overview, top queries, oportunidades CTR (ultimos 90 dias)
5. **Analise On-Page** -- Meta tags, imagens SEO, internal linking
6. **Backlinks e Autoridade** -- DR, UR, top backlinks, estrategia
7. **Plano de Accao** -- Priorizado (critico/importante/melhoria) com impacto e esforco
8. **Roadmap Trimestral** -- Fundacao tecnica -> Conteudo e autoridade -> Consolidacao
---
## Propriedades GSC Disponiveis
``` ```
sc-domain:descomplicar.pt 1. whoami + list_projects → projectId e mercado (GATE: PT = 2620/pt)
https://emanuelalmeida.pt/ 2. GSC por query + por página → paginar até esgotar
https://carstuff.pt/ 3. Dimensionar o crawl → maxPages ≥ nº páginas com impressões + 25%
https://solarfvengenharia.com/ 4. run_site_audit → poll get_audit_status até "completed"
https://aquisevende.pt/ 5. get_audit_issues → critical → warning → info
https://alojadamaria.com/ 6. Cruzar fase 2 com fase 5 → páginas com procura E com defeito = lista de trabalho
https://e-commerce.descomplicar.pt/ 7. [pago, opcional] keywords, backlinks, SERP
8. Gerar Markdown → Google Doc → partilhar
``` ```
**Os passos 1-6 são grátis e produzem o grosso do relatório.** O passo 7 só se o cliente pagar análise competitiva.
--- ---
## Notas Tecnicas ## Estrutura do relatório (8 secções)
1. **Sumário executivo** — 5 descobertas + a acção imediata. Más notícias primeiro.
2. **Realidade actual** — cliques, impressões, CTR global, distribuição por posição, branded vs não-branded.
3. **Onde está o retorno** — striking distance (pos 4-20, ≥25 impressões) e desperdício (pos >40 com procura alta).
4. **Estado técnico** — issues por severidade, com **cobertura do crawl declarada**.
5. **Core Web Vitals** — LCP / INP / CLS nas páginas que importam (não em todas).
6. **Autoridade** — backlinks e ref. domains, se contratado.
7. **Plano de acção** — prioridade (crítico/importante/melhoria) × esforço × impacto estimado.
8. **Roadmap trimestral** — fundação técnica → conteúdo → consolidação.
---
## Regras de honestidade do relatório
Um relatório SEO é um documento comercial. Isso torna a precisão **mais** importante, não menos.
- **Declarar sempre a cobertura do crawl.** "1337 issues em 600 páginas crawladas de ~640 com impressões." Sem isto, o número de issues não significa nada.
- **Não apresentar contagens como URLs verificados.** Se a bridge só deu contagens, dizê-lo e anexar o link da UI.
- **Custos são estimativas.** O OpenSEO não expõe saldo — nunca escrever "gastámos X créditos" como facto.
- **Separar medido de inferido.** Marcar as inferências. Um cliente que descobre uma inferência apresentada como facto deixa de confiar no resto.
- **CTR baixo em posição alta não é problema de ranking.** É título/meta. Dizer isso — é a recomendação mais barata e de maior retorno que existe.
---
## Notas técnicas
### Requisitos ### Requisitos
- SEO Tools API a correr: `~/mcp-servers/seo-tools-api/start.sh` - OpenSEO acessível (`whoami` responde)
- Google Workspace MCP configurado - Propriedade ligada ao Search Console (senão, relatório sem fase GSC — declarar)
- GSC authentication (OAuth primeira vez) - `google-workspace` MCP para o Google Doc
### Erros Comuns ### Erros comuns
- **Site nao em GSC:** Relatorio gerado sem dados GSC (aviso incluido) | Erro | Sintoma | Solução |
- **Lighthouse timeout:** Retry automatico (3x) |---|---|---|
- **Ahrefs rate limit:** Skip backlinks, aviso no relatorio | **`maxPages` por omissão** | Relatório limpo demais, poucos issues | Redimensionar pelo nº de páginas do GSC e relançar |
| Site fora do GSC | Fase 2 vazia | Gerar sem GSC, com aviso destacado |
| Mercado errado | Dados de keywords em inglês/EUA | `locationCode: 2620`, `languageCode: "pt"` |
| Crawl a demorar | `get_audit_status` em `crawling` | Normal — 600 páginas ≈ 4 min. Fazer poll, não cancelar |
--- ---
## References (conteudo detalhado) ## References
| Ficheiro | Conteudo | | Ficheiro | Conteúdo |
|----------|----------| |---|---|
| `references/template-relatorio.md` | Template completo do relatorio com todas as tabelas e seccoes | | `references/template-relatorio.md` | Template completo com tabelas e secções |
| `references/implementacao-tecnica.md` | Workflow mermaid, codigo JS, funcoes GSC, notas tecnicas | | `references/implementacao-tecnica.md` | Workflow, chamadas OpenSEO, processamento |
Inventário completo das ferramentas e tabela de migração: `../seo-audit/references/ferramentas-api.md`
--- ---
## Anti-Patterns ## Anti-patterns
- Gerar relatorio sem dados reais (sempre usar MCPs) - Gerar relatório sem dados reais.
- Ignorar gap mobile/desktop - Omitir a cobertura do crawl (faz o relatório parecer melhor do que é).
- Nao priorizar recomendacoes (tudo parece igual) - Listar issues por contagem em vez de por impacto.
- Esquecer de verificar se site esta no GSC antes de tentar recolher dados - Apresentar estimativas de custo ou de tráfego como medições.
- Relatorio sem accoes concretas e estimativas de impacto - Recomendações sem esforço e impacto estimados.
- Correr as fases pagas antes das grátis.
--- ---
**Versao:** 2.1.0 | **Autor:** Descomplicar **Versão:** 3.0.0 | **Autor:** Descomplicar® | **Motor:** OpenSEO
---
## Healing Log ## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl ```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"} {"date":"2026-07-30","issue":"Skill dependia de SEO Tools API (localhost:3000), Lighthouse MCP, GSC MCP e Ahrefs — nenhum operacional. Workflow inteiro não executável.","fix":"Reescrita sobre OpenSEO; fases grátis antes das pagas; cobertura de crawl obrigatória no relatório.","source":"auto"}
``` ```
*Adicionar nova linha após cada erro corrigido.*
@@ -1,144 +1,169 @@
# Implementacao Tecnica - SEO Report # Implementação Técnica — SEO Report (OpenSEO)
## Workflow Tecnico ## Workflow
```mermaid ```mermaid
graph LR graph TD
A[Input: URL] --> B{Site em GSC?} A[Input: URL] --> B[whoami + list_projects]
B -->|Sim| C[Recolher dados GSC] B --> C{Mercado correcto?}
B -->|Nao| D[Skip GSC, aviso] C -->|Não| C2[Passar locationCode 2620 + languageCode pt]
C -->|Sim| D[GSC: dimensions query]
C2 --> D
C --> E[Lighthouse Desktop] D --> E[GSC: dimensions page]
D --> E E --> F[Dimensionar crawl:<br/>maxPages = páginas GSC + 25%]
E --> F[Lighthouse Mobile] F --> G[run_site_audit]
F --> G[Core Web Vitals] G --> H[poll get_audit_status]
G --> H[SEO Tools API] H -->|running| H
H --> I{Ahrefs habilitado?} H -->|completed| I[get_audit_issues por severidade]
I -->|Sim| J[Recolher DR/UR] I --> J[Cruzar: páginas com procura<br/>E com defeito]
I -->|Nao| K[Skip Ahrefs] J --> K{Fases pagas contratadas?}
J --> L[Processar dados] K -->|Sim| L[get_keyword_metrics<br/>get_backlinks_overview<br/>get_serp_results]
K --> L K -->|Não| M[Saltar fases pagas]
L --> M[Gerar relatorio Markdown] L --> N[Processar]
M --> N[Criar Google Doc] M --> N
N --> O[Partilhar com email] N --> O[Markdown] --> P[Google Doc] --> Q[Partilhar]
O --> P[Retornar link]
``` ```
## Implementacao **O ponto crítico é o nó F.** Dimensionar o crawl a partir do GSC é o que distingue um relatório verdadeiro de um relatório limpo e falso.
---
## Sequência de chamadas
```javascript ```javascript
async function generateSEOReport(url, options = {}) { // 1. Contexto e mercado
const { const me = await openseo.whoami();
email = 'emanuelalmeidaa@gmail.com', const projs = await openseo.list_projects();
competitors = [], const projectId = projs[0].id;
includeAhrefs = true const MARKET = { locationCode: 2620, languageCode: 'pt' }; // Portugal
} = options;
// 1. Validar URL // 2. Search Console — paginar até esgotar (grátis)
if (!isValidURL(url)) { async function gscAll(dimensions) {
throw new Error('URL invalido'); const rows = [];
let startRow = 0;
while (true) {
const r = await openseo.get_search_console_performance({
projectId, dimensions, dateRange: 'last_3_months',
rowLimit: 1000, startRow
});
const parsed = parseRows(r.text);
rows.push(...parsed);
if (!r.text.split('\n')[0].includes('more available') || !parsed.length) break;
startRow += 1000;
}
return rows;
} }
// 2. Recolher dados em paralelo (melhor performance) const byQuery = await gscAll(['query']);
const [ const byPage = await gscAll(['page']);
lighthouseDesktop,
lighthouseMobile,
coreWebVitals,
seoToolsData,
gscData,
ahrefsData
] = await Promise.allSettled([
mcp__lighthouse__run_audit(url, 'desktop'),
mcp__lighthouse__run_audit(url, 'mobile'),
mcp__lighthouse__get_core_web_vitals(url),
fetch(`http://localhost:3000/seo-audit?url=${url}`).then(r => r.json()),
getGSCData(url),
includeAhrefs ? getAhrefsData(url) : null
]);
// 3. Processar e formatar // 3. Dimensionar o crawl a partir da realidade, não de um default
const reportData = { const maxPages = Math.ceil(byPage.length * 1.25);
url,
date: new Date().toISOString().split('T')[0], // 4. Crawl (grátis) — assíncrono, exige poll
scores: extractScores(lighthouseDesktop, lighthouseMobile), const audit = await openseo.run_site_audit({
cwv: processCoreWebVitals(coreWebVitals), projectId, url, maxPages, runLighthouse: true
gsc: processGSCData(gscData), });
onPage: processOnPageData(seoToolsData), let status;
backlinks: processBacklinks(ahrefsData), do {
recommendations: generateRecommendations(/* all data */) await sleep(30_000);
status = await openseo.get_audit_status({ projectId, auditId: audit.id });
} while (!status.text.includes('completed'));
// 5. Issues por severidade (grátis)
const critical = await openseo.get_audit_issues({ projectId, auditId: audit.id, severity: 'critical' });
const warning = await openseo.get_audit_issues({ projectId, auditId: audit.id, severity: 'warning' });
// 6. Fases pagas — so se contratadas
if (options.paid) {
const kw = await openseo.get_keyword_metrics({
projectId, keywords: strikingDistance(byQuery).map(r => r.key), ...MARKET
});
const bl = await openseo.get_backlinks_overview({ projectId, target: domain });
}
```
---
## Processamento — as funções que importam
```javascript
// GSC anonimiza queries: totais por query < totais por página.
// Para números globais usar SEMPRE a vista por página.
const globals = {
clicks: sum(byPage, 'clicks'),
impressions: sum(byPage, 'impressions'),
ctr: sum(byPage, 'clicks') / sum(byPage, 'impressions')
}; };
// 4. Gerar documento Markdown // O GSC não filtra por posição — filtrar do lado do cliente.
const markdown = generateReportMarkdown(reportData); const strikingDistance = rows => rows
.filter(r => r.position >= 4 && r.position <= 20 && r.impressions >= 25)
.sort((a, b) => b.impressions - a.impressions);
// 5. Criar Google Doc // Páginas com procura real enterradas fora das primeiras 4 páginas.
const docResult = await mcp__google-workspace__create_doc({ const waste = rows => rows
title: `Relatorio SEO - ${extractDomain(url)} - ${reportData.date}`, .filter(r => r.position > 40 && r.impressions >= 300)
body_content: markdown, .sort((a, b) => b.impressions - a.impressions);
// O sinal mais accionável: primeira página, CTR nulo.
// Não é ranking — é título e meta description.
const titleProblem = rows => rows
.filter(r => r.position <= 10 && r.impressions >= 200 && r.ctr < 0.005);
// Lixo nas queries do GSC (colagens do Google Ads, operadores site:).
const isNoise = k =>
(k.includes('ativado') && k.includes('correspond')) ||
k.startsWith('-site:') || k.startsWith('=') ||
k.length > 90 || k.includes('0,00');
```
---
## Entrega
```javascript
const doc = await googleWorkspace.docs_create_document({
title: `Relatório SEO — ${domain} — ${today}`,
user_google_email: email user_google_email: email
}); });
await googleWorkspace.docs_append_text({ document_id: doc.id, text: markdown });
// 6. Retornar link
return {
success: true,
doc_url: docResult.url,
summary: reportData.recommendations.slice(0, 5)
};
}
``` ```
## Propriedades GSC Disponiveis ---
```javascript ## Notas técnicas
const GSC_PROPERTIES = [
'sc-domain:descomplicar.pt',
'https://emanuelalmeida.pt/',
'https://carstuff.pt/',
'https://solarfvengenharia.com/',
'https://aquisevende.pt/',
'https://alojadamaria.com/',
'https://e-commerce.descomplicar.pt/'
];
async function getGSCData(url) {
const domain = extractDomain(url);
const property = GSC_PROPERTIES.find(p => p.includes(domain));
if (!property) {
console.warn(`Site ${domain} nao esta no GSC. Dados GSC nao disponiveis.`);
return null;
}
const analytics = await mcp__gsc__get_search_analytics({
site_url: property,
start_date: daysAgo(90),
end_date: 'today',
dimensions: ['query'],
row_limit: 100
});
return analytics;
}
```
## Notas Tecnicas
### Requisitos ### Requisitos
- SEO Tools API a correr: `~/mcp-servers/seo-tools-api/start.sh` - OpenSEO acessível (`whoami` responde)
- Google Workspace MCP configurado - Propriedade ligada ao Search Console
- GSC authentication (OAuth primeira vez) - `google-workspace` MCP para o documento
### Performance ### Tempos reais (medidos, descomplicar.pt, 07-2026)
- Execucao paralela de tools (1m40s total) | Fase | Duração |
- Cache Lighthouse results (5 min TTL) |---|---|
- Rate limiting Ahrefs API (100 req/day free) | GSC (2 dimensões, ~1700+474 linhas) | ~10s |
| Crawl 600 páginas + Lighthouse 20 | ~4 min |
| `get_audit_issues` | instantâneo |
### Erros Comuns ### Limitações
- **Site nao em GSC:** Relatorio gerado sem dados GSC - **Issues sem URL:** `get_audit_issues` / `get_audit_pages` devolvem só contagens pela bridge MCP; `structuredContent.issues` não é entregue e `get_audit_pages` trunca em ~25 linhas. Usar `details.mcpMeta.url` para o link da UI.
- **Lighthouse timeout:** Retry automatico (3x) - **Sem medidor de créditos:** `whoami` não muda depois de chamadas pagas. Custos são estimativas.
- **Ahrefs rate limit:** Skip backlinks, aviso no relatorio - **Lag do GSC:** últimos ~3 dias incompletos; datas em Pacific Time; máx. 16 meses.
### Erros comuns
| Erro | Sintoma | Solução |
|---|---|---|
| `maxPages` por omissão (50) | Poucos issues, relatório "limpo" | Redimensionar pelo GSC, relançar |
| Site fora do GSC | Fase GSC vazia | Gerar sem GSC, aviso destacado |
| Mercado errado | Keywords em inglês/EUA | `locationCode: 2620`, `languageCode: "pt"` |
| Cancelar o crawl cedo demais | Sem `auditId` utilizável | Fazer poll; 600 páginas ≈ 4 min |
---
**Actualizado:** 30-07-2026 | Substitui a implementação baseada em Lighthouse MCP + SEO Tools API + Ahrefs
@@ -203,13 +203,17 @@ Data: YYYY-MM-DD | Versao 2.0 (2026 Standards)
## Anexos ## Anexos
### A. Metodologia ### A. Metodologia
- Lighthouse: 3 runs, mediana reportada - Motor: OpenSEO (crawl same-origin, robots-aware) + Search Console
- GSC: Ultimos 90 dias completos - Crawl: [N] páginas de [M] com impressões no GSC — **declarar sempre a cobertura**
- Search Console: últimos 3 meses; vista por página para totais (o GSC anonimiza queries)
- Core Web Vitals: Lighthouse em amostra; páginas individuais via chrome-devtools
- Thresholds: Google 2026 Standards - Thresholds: Google 2026 Standards
- Custos de chamadas pagas: estimativas do schema, não medições
### B. Glossario ### B. Glossário
- **DR**: Domain Rating (Ahrefs) - **Striking distance**: posição 4-20 com impressões relevantes — onde está o retorno
- **INP**: Interaction to Next Paint (substitui FID em 2026) - **KD**: Keyword Difficulty
- **INP**: Interaction to Next Paint (substituiu o FID em 2026)
- **E-E-A-T**: Experience, Expertise, Authoritativeness, Trust - **E-E-A-T**: Experience, Expertise, Authoritativeness, Trust
- **CTR**: Click-Through Rate - **CTR**: Click-Through Rate
@@ -0,0 +1,215 @@
---
name: project-init
description: Use when starting a new project from scratch — scaffolds .desk-project, CLAUDE.md, README.txt, CHANGELOG.md, initializes git, creates Gitea repo, and makes first commit. Step zero before /brainstorm or /spec.
---
# /project-init v1.0 - Scaffolding de Projecto
Automatiza a criação de toda a estrutura de arranque de um projecto novo.
Passo zero antes de `/brainstorm → /spec → /sprint → código`.
---
## Protocolo
### 1. Recolher dados
Perguntar ao utilizador (em bloco, uma só vez):
```
Para inicializar o projecto preciso de:
1. Nome do projecto (ex: FluxoSEO)
2. Descrição curta (1 linha)
3. ID da tarefa Desk CRM (ex: #2049)
4. ID do projecto Desk CRM (ex: #58)
5. Nome do projecto Desk (ex: DES 360º)
6. Directório local (ex: /media/ealmeida/Dados/Dev/NomeProjecto)
7. Nome do repositório Gitea (ex: fluxo-seo-audit) — deixar vazio para não criar
```
Se o utilizador já estiver numa pasta de projecto, assumir essa pasta como directório.
---
### 2. Criar estrutura de ficheiros
**2.1 `.desk-project`**
```json
{
"project_id": <ID_PROJECTO>,
"project_name": "<NOME_PROJECTO_DESK>",
"client_id": null,
"desk_url": "https://desk.descomplicar.pt/admin/projects/view/<ID_PROJECTO>",
"gdrive_folder": null,
"local_path": "<DIRECTORIO_LOCAL>",
"default_milestone": null,
"default_tags": ["development"],
"changelog_discussion_id": null,
"created_at": "<DATA_HOJE>"
}
```
**2.2 `CLAUDE.md`**
```markdown
# CLAUDE.md — <NOME_PROJECTO>
## Contexto
- **Tarefa Desk:** #<ID_TAREFA>
- **Projecto Desk:** <NOME_PROJECTO_DESK> (#<ID_PROJECTO>)
- **Directório:** <DIRECTORIO_LOCAL>
- **Gitea:** https://git.descomplicar.pt/ealmeida/<REPO_GITEA>
- **Criado:** <DATA_HOJE>
## Descrição
<DESCRICAO_CURTA>
## Stack
(preencher durante o projecto)
## Caminhos Críticos
(preencher durante o projecto)
## Regras do Projecto
- Seguir QR-Sites-CWP.md antes de referenciar paths WordPress
- Deploy paths validados antes de usar
- (adicionar regras específicas do projecto)
## Comandos Frequentes
(preencher durante o projecto)
```
**2.3 `README.txt`**
```
<NOME_PROJECTO>
=====================================
DeskCRM Task: #<ID_TAREFA>
Project: <NOME_PROJECTO_DESK> (#<ID_PROJECTO>)
Description: <DESCRICAO_CURTA>
Created: <DATA_HOJE>
Gitea: https://git.descomplicar.pt/ealmeida/<REPO_GITEA>
Componentes
-----------
(preencher durante o projecto)
Stack
-----
(preencher durante o projecto)
Deploy
------
(preencher durante o projecto)
```
**2.4 `CHANGELOG.md`**
```markdown
# Changelog — <NOME_PROJECTO>
## [Unreleased]
## [0.1.0] — <DATA_HOJE>
### Adicionado
- Scaffolding inicial do projecto
- `.desk-project`, `CLAUDE.md`, `README.txt`, `CHANGELOG.md`
```
---
### 3. Inicializar Git
```bash
cd <DIRECTORIO_LOCAL>
git init
git config user.email "emanuel@descomplicar.pt"
git config user.name "Emanuel Almeida"
git add .desk-project CLAUDE.md README.txt CHANGELOG.md
git commit -m "chore: scaffolding inicial — <NOME_PROJECTO>"
```
---
### 4. Criar repositório Gitea (se pedido)
```
mcp__gitea__create_repo({
name: "<REPO_GITEA>",
description: "<DESCRICAO_CURTA>",
private: true,
auto_init: false
})
```
Depois configurar remote e push:
```bash
git remote add origin https://git.descomplicar.pt/ealmeida/<REPO_GITEA>.git
git push -u origin main
```
> Se o push via HTTPS falhar (SSH bloqueado), usar o workaround Python em `memory/gitea-push-workaround.md`.
---
### 5. Actualizar CLAUDE.md com URL Gitea confirmado
Preencher o campo `Gitea:` no CLAUDE.md após criação bem-sucedida do repo.
---
### 6. Confirmar ao utilizador
```
✅ Projecto inicializado: <NOME_PROJECTO>
📁 Ficheiros criados:
.desk-project (Desk #<ID_PROJECTO>)
CLAUDE.md
README.txt
CHANGELOG.md
🔧 Git inicializado e primeiro commit criado
🔗 Gitea: https://git.descomplicar.pt/ealmeida/<REPO_GITEA>
Próximo passo: /brainstorm ou /spec create
```
---
## Regras
1. **NUNCA** criar ficheiros sem ler o directório primeiro (evitar sobrescrever trabalho existente)
2. Se `.desk-project` já existir → avisar e perguntar se continua
3. Usar sempre `mcp__mcp-time__current_time` para a data (não assumir)
4. Gitea repo sempre `private: true` por omissão
5. Campos "Stack", "Caminhos Críticos" e "Componentes" ficam em branco — serão preenchidos conforme o projecto avança
6. Git config `user.email` e `user.name` obrigatórios antes do commit (evita "unable to auto-detect" error)
---
## Anti-Patterns
- **NÃO** criar repo Gitea público sem confirmação explícita
- **NÃO** assumir o directório — perguntar se não estiver óbvio
- **NÃO** pre-preencher Stack/Deploy sem informação real
- **NÃO** fazer `git add .` — adicionar apenas os 4 ficheiros do scaffolding
---
## Integração
| Skill | Relação |
|-------|---------|
| `/brainstorm` | Passo seguinte — explorar a ideia |
| `/spec create` | Passo seguinte — formalizar arquitectura |
| `/desk` | Usa `.desk-project` criado aqui |
| `/desk init` | Alternativa se o projecton já existir no Desk mas sem `.desk-project` |
---
*Skill v1.0.0 | 2026-04-13 | Descomplicar®*
+133
View File
@@ -0,0 +1,133 @@
---
name: start
description: Orquestrador do pipeline de trabalho novo — brainstorm → discover → spec → plan → execute. Use quando iniciar sistema novo, feature grande, ou projecto com múltiplos componentes. Impede saltar para execução sem planeamento.
---
# /start — Pipeline de trabalho novo
Orquestra as 5 fases obrigatórias para qualquer trabalho novo não-trivial.
Anti-pattern que combate: saltar directamente para código sem brainstorm/spec/plan.
---
## Quando usar
**USAR quando:**
- Utilizador pede sistema/pipeline/feature nova com >2 componentes
- Trabalho estimado >1h ou >3 ficheiros
- Projecto novo em `05-Projectos/` ou `Dev/`
- Qualquer tarefa em que a abordagem não está obviamente definida
**NÃO usar quando:**
- Bugfix / correcção pontual
- Operação unitária conhecida
- Continuação de plano já existente
- Admin / manutenção / diagnóstico
---
## Protocolo (5 fases sequenciais)
### Fase 1 — Brainstorming (obrigatório)
Invocar `superpowers:brainstorming` skill OU `project-manager:brainstorm` skill.
Objectivos:
- Explorar 3+ abordagens alternativas
- Identificar requisitos explícitos e implícitos
- Listar trade-offs conhecidos
- Detectar ambiguidades que precisam de clarificação do utilizador
Output: secção "Brainstorming" com alternativas consideradas.
### Fase 2 — Discover / Research (obrigatório)
Invocar `project-manager:discover` skill.
Verificar em paralelo:
- **Codebase actual** — existem componentes reutilizáveis? Glob + Grep
- **NotebookLM** — há notebook relevante? `mcp__notebooklm-mcp__notebook_list` + query
- **Hub** — procedimentos, QRs, decisões anteriores? Grep em `Hub/06-Operacoes/`
- **Memórias** — contexto de sessões anteriores? `mcp__mem0__search_memories`
- **Web** (se externo) — context7, WebSearch para libs/frameworks
- **Desk CRM** — tarefa associada? Projecto relacionado?
Output: secção "Discovery" com fontes consultadas e descobertas relevantes.
### Fase 3 — SPEC (obrigatório)
Invocar `gestao:spec-coauthor` OU `project-manager:spec` (skill `spec create`).
Gerar `SPEC.md` no directório do projecto (Hub/05-Projectos/NOME/ ou Dev/NOME/) com:
- **Porquê** — problema que resolve
- **Escopo** — o que entra
- **Não-escopo** — o que NÃO entra (crítico contra scope creep)
- **Critérios de sucesso** — como saber que está pronto
- **Arquitectura** — diagrama ou descrição dos componentes
- **Riscos** — o que pode correr mal
- **Plano faseado** — divisão em MVPs
Aguardar aprovação do utilizador. Marcar como aprovado com `<!-- APPROVED: YYYY-MM-DD -->` no topo.
### Fase 4 — Plan detalhado (obrigatório)
Invocar `superpowers:writing-plans` skill.
Traduzir SPEC em plano executável:
- Lista numerada de passos concretos
- Cada passo tem: acção, comando/código esperado, critério de validação
- Ordem de execução e dependências
- Checkpoints de revisão humana
Guardar em `Hub/05-Projectos/NOME/PLAN.md` ou `.claude/plans/NOME.md`.
### Fase 5 — Execução (finalmente)
Invocar `superpowers:executing-plans` ou `superpowers:subagent-driven-development`.
Durante execução:
- Seguir PLAN.md passo a passo
- Marcar progresso em TodoWrite
- Validar cada passo antes do seguinte
- Comentar no Desk CRM task associada
- Se desviar do spec → parar e actualizar SPEC.md primeiro (scope creep alert)
---
## Output esperado da skill
Ao invocar `/start "descrição do trabalho"`:
```
/start detectou novo trabalho: "descrição"
Fase actual: 1 — Brainstorming
Próxima: Discovery
[invoca brainstorming skill automaticamente]
```
Skill não salta fases. Se utilizador insistir em saltar, avisa mas aceita override explícito (`/start --skip-to=execute`).
---
## Anti-patterns
- **NUNCA** começar Fase 5 (execução) sem Fases 1-4 completas
- **NUNCA** criar código antes de SPEC.md aprovado
- **NUNCA** inventar decisões arquitecturais sem brainstorming documentado
- **NUNCA** tratar "pareceu boa ideia" como substituto de discovery
- **SEMPRE** criar SPEC.md no repositório do projecto (não em `/tmp` ou inline)
- **SEMPRE** aguardar aprovação explícita entre fases críticas
---
## Integração com spec-gate.sh
O hook `spec-gate.sh` (PreToolUse Write|Edit) valida que existe SPEC.md aprovado antes de permitir edições em `/Dev`. Esta skill garante que esse SPEC é criado via pipeline correcto antes de chegar à execução.
Para bypass temporário (quick fixes, 30min): `/spec bypass`.
---
*Skill v1.0.0 | 2026-04-08 | Descomplicar®*
@@ -0,0 +1,110 @@
---
name: wp-content-seo-gate
description: "Regras e padrões obrigatórios para geração de conteúdo WordPress com RankMath Pro. INVOCAR AUTOMATICAMENTE quando: (1) escrevendo ou revendo prompts que gerem artigos, posts, descrições de podcast ou qualquer texto para publicar em WordPress, (2) criando, modificando ou auditando sistemas/pipelines/scripts que publicam conteúdo automaticamente em WordPress (publishers, crons, geradores), (3) gerando directamente conteúdo para posts WP. Previne os erros RankMath mais comuns: slug sem focus keyword, título sem número, keyword density baixa, meta description fora do limite."
---
# WP Content SEO Gate
Aplicar ANTES de escrever prompts de geração e ANTES de implementar qualquer sistema que publique em WordPress.
## Regras Obrigatórias para Prompts de Geração
Todo o prompt que instruir um LLM a gerar conteúdo WP DEVE incluir estas regras literais:
| Campo | Regra a incluir no prompt |
|-------|--------------------------|
| `focus_keyword` | 2-5 palavras, foco no benefício/problema, não no nome da ferramenta |
| `slug` | Começar com palavras da focus_keyword (hifenado, sem acentos, ≤75 chars) |
| `rank_math_title` | 50-60 chars, contém focus_keyword E um número (ano corrente ou dado concreto: "47%", "3x") |
| `rank_math_description` | 140-160 chars, focus_keyword nos primeiros 120 chars |
| `content` | focus_keyword nos primeiros 200 chars + ≥2x no corpo + ≥1 H2/H3 com a keyword |
| `image_alt` | 40-100 chars descritivo, contém focus_keyword |
| `secondary_keywords` | 3-5 keywords complementares, cada uma ≥1x no content |
**Checklist mental no prompt (incluir literalmente):**
- [ ] focus_keyword aparece em: title, rank_math_title, rank_math_description, slug, primeiros 200 chars, ≥1 H2, ≥2x no corpo
- [ ] rank_math_title contém um número (ano ou dado concreto)
- [ ] slug começa com as palavras da focus_keyword
- [ ] ≥600 palavras (RankMath penaliza abaixo deste limite)
## Padrões Obrigatórios em Publishers/Pipelines
Todo o sistema que publica em WP via código DEVE implementar estes dois auto-fixes **depois** de receber o JSON do LLM e **antes** de publicar:
### Auto-fix 1 — Slug sem focus keyword
```python
def slugify(text: str) -> str:
text = unicodedata.normalize("NFD", text.lower())
text = "".join(c for c in text if unicodedata.category(c) != "Mn")
text = re.sub(r'[^a-z0-9\s-]', '', text)
return re.sub(r'[-\s]+', '-', text.strip()).rstrip('-')
def has_keyword_in_slug(slug: str, fk: str) -> bool:
# Match sem stopwords e sem acentos
stopwords = {"a","o","as","os","de","da","do","das","dos","e","em","no","na","nos","nas","para","por","pelo","pela"}
norm = lambda s: " ".join(t for t in slugify(s).replace("-"," ").split() if t not in stopwords)
return norm(fk) in norm(slug)
# Aplicar após generate_article():
if not has_keyword_in_slug(article['slug'], article['focus_keyword']):
fk_slug = slugify(article['focus_keyword'])
orig_words = [w for w in article['slug'].split('-') if w not in fk_slug.split('-') and len(w) > 3][:2]
article['slug'] = (fk_slug + ('-' + '-'.join(orig_words) if orig_words else ''))[:75].rstrip('-')
```
### Auto-fix 2 — Título sem número (RankMath Title Readability)
```python
import time, re
if not re.search(r'\d', article.get('rank_math_title', '')):
year = time.strftime('%Y')
t = article['rank_math_title'].rstrip()
article['rank_math_title'] = (t[:55].rstrip() + f' {year}') if len(t) > 55 else f'{t} {year}'
```
## Checklist de Validação Pré-publicação
Verificar em qualquer publisher antes do `wp post create`:
- [ ] slug contém focus_keyword (sem acentos, hifenado)
- [ ] rank_math_title tem ≥1 dígito e ≤60 chars
- [ ] rank_math_description entre 140-160 chars e com focus_keyword
- [ ] image_alt contém focus_keyword
- [ ] content ≥600 palavras
- [ ] focus_keyword nos primeiros 200 chars do content
- [ ] ≥1 H2 com a focus_keyword
- [ ] Link externo à fonte (`rel="noopener"`)
- [ ] 1-3 links internos descomplicar.pt no corpo
## Erros RankMath mais comuns
| Erro no painel | Causa | Fix |
|----------------|-------|-----|
| "Focus Keyword not found in URL" | LLM gera slug sem a FK | Auto-fix 1 obrigatório |
| "Title doesn't contain a number" | Título sem ano/dado | Auto-fix 2 + instruir LLM |
| "FK not in first 10%" | Lead não inclui a FK | Regra de prompt: FK nos primeiros 200 chars |
| "Keyword density too low/high" | <1% ou >3% | Verificar count antes de publicar |
| SEO Score N/A no dashboard | Post criado via CLI sem Gutenberg | Usar cálculo server-side de `/seo-post` Passo 6 |
| Schema ausente no HTML | Falta `rank_math_schema_*` | Ver `/seo-post` Modo aplicar Passo 3 |
## PROC Canónico
**Ler antes de agir:** `Hub/06-Operacoes/Procedimentos/D7-Tecnologia/WordPress/PROC-Conteudo-RankMath.md` (D7-WP-RM-001)
Este PROC é a fonte única de verdade para:
- Estrutura obrigatória do conteúdo (headings, distribuição FK, elementos por tipo)
- Tabela completa de campos RankMath com valores aceitáveis
- Comandos WP-CLI exactos para aplicar meta, schema e calcular score
- Checklist de validação final (9 pontos)
- Tabela de erros comuns e resolução
Quando o detalhe de uma regra não está nesta skill, está no PROC.
## Referências Adicionais
- `/seo-post` — auditar e corrigir posts **já publicados** via WP-CLI (schema, score, OG, robots)
- `Dev/claude_automations_dev/intelligence-publisher/publisher.py` — implementação de referência dos auto-fixes
- `Dev/claude_automations_dev/intelligence-publisher/prompts/article.md` — prompt de referência para artigos de notícias
- `Hub/05-Projectos/Podcast-Descomplicar-Digital/prompts/generate-wp-description.md` — prompt de referência para posts de podcast