Compare commits

...

13 Commits

Author SHA1 Message Date
ealmeida d3f9c950cd fix(worklog): v4.1 — proíbe fork via Skill/Agent tool (perde contexto)
Skills /worklog e /reflect dependem do histórico conversacional do agente
principal. Invocá-las via Skill tool ou Agent tool cria subagente sem
contexto e reporta 'nothing to log'. Banner obrigatório no topo, fonte A
(conversa) reforçada como primária, fonte C (activity log) rebaixada para
fallback.

Incidente 2026-04-23: após 28h+ trabalho Observabilidade, /worklog via
Skill tool retornou vazio.
2026-04-23 03:35:40 +01:00
ealmeida b6690a75fd feat(today): v11.0 — migração para cron local desktop (CT 102 eliminado)
- Remove SSH dev, todos os logs lidos localmente em /media/ealmeida/Dados/Dev/claude_automations_dev/
- Actualiza descrição, arquitectura e tabela de agentes
- Adiciona weekly-digest-podcast, improvement-evaluator, gitea-ci-cleaner
- Remove referência ao ct-backup-unlock-watchdog (CT 102 eliminado)
2026-04-20 13:28:44 +01:00
ealmeida b3cb108ca7 feat(gestao): remover LightRAG das skills de knowledge — Fase 1 RAG-System
- knowledge/SKILL.md v2.2.0: Família A passa a 4 fontes (Supabase, CC memory, Hub, Desk CRM)
- hub-search/SKILL.md v1.1.0: RAG Trinity actualizada (2 layers)
- research-pipeline/SKILL.md v1.1.0: Layer 3 LightRAG removida
- deep-research/SKILL.md v1.1.0: Layer 3 passa a Web apenas

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 18:21:45 +01:00
ealmeida dada9ef7db feat(skills): integra consulta ao Media Bank D7-MB-001 2026-04-08 23:18:23 +01:00
ealmeida 82063391dd feat(skills): integra consulta ao Media Bank D7-MB-001 2026-04-08 23:18:22 +01:00
ealmeida 940c3903aa feat(skills): integra consulta ao Media Bank D7-MB-001 2026-04-08 23:18:21 +01:00
ealmeida c534051774 feat(gestao/knowledge): v2.1.1 — 17 tools LightRAG-HKU reais
Actualização derivada da restauração do LightRAG-HKU no gateway
(ver Hub/04-Stack/CHANGELOG.md sessão 3 extensão).

A v2.1.0 tinha sido escrita assumindo FastMCP file-based com 11 tools
(lightrag_query, lightrag_stats, etc) porque outra sessão tinha
migrado temporariamente o backend. Essa migração foi revertida e o
stack voltou ao LightRAG-HKU 1.4.13 completo com 17 tools originais.

Mudanças:
- Router Família A agora usa mcp__lightrag__query_document (não lightrag_query)
- Documentada a lista completa de 17 tools MCP (query, insert, pipeline, graph edit)
- Referência à UI rag.descomplicar.pt/webui
- PG storage notado (331 docs workspace default)
- Graceful fallback para mcp__memory-supabase__ quando MCP indisponível

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 17:17:17 +01:00
ealmeida 1d0b2b5441 feat(gestao/knowledge): v2.1.0 router Família A/B
Correcção arquitectural 08-04-2026. A v2.0.0 tratava NotebookLM como
fonte primária. Isso estava errado — NotebookLM não vê operações, só
tem ebooks e transcripts. Racional em memory/feedback_knowledge-router-
arquitectura.md.

Nova arquitectura (não é fallback linear, é router por tipo):

- Família A (operacional interna, paralelo): LightRAG + memory-supabase +
  grep ~/.claude/projects/*/memory/ cross-projecto + Obsidian/Hub + Desk CRM
- Família B (externa, NotebookLM): só conceptual/teórico/research/mercado
- Ambíguo: perguntar ao utilizador

Tools LightRAG actualizadas para as reais (FastMCP file-based,
confirmadas na recuperação sessão 3 do plano gaps): lightrag_query
(hybrid), lightrag_stats, lightrag_get_entity, lightrag_get_graph.

Grep cross-projecto obrigatório em ~/.claude/projects/*/memory/*.md
(101 ficheiros em 34 projectos) porque o harness só carrega
automaticamente a memória do cwd — este é um gap de contexto do CC
que nenhum sistema anterior endereçava.

Mantidas as tabelas de routing NotebookLM como Família B.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 17:01:44 +01:00
ealmeida 3115ff24a5 chore: remove __pycache__ acidentalmente committed 2026-04-07 05:13:20 +01:00
ealmeida a33c5e1b05 feat(design-media): /clone-style — extracção de design tokens (web + pptx)
Resolve dor real: clonar estilos visuais de sites e slides para propostas.
Tentativas anteriores (Penpot, scrapers HTML, Figma import) falharam porque
tentavam reproduzir layouts. Esta skill extrai tokens (cores, fontes,
espaçamento, raios, sombras) e alimenta gerador (Stitch / design-engine).

Modos:
- /clone-style web <url>: extract-web-tokens.js via chrome real (CSS computado)
- /clone-style slides <pptx>: extract-pptx-theme.py (theme1.xml + slideMasters)
- /clone-style apply <tokens.json>: mapeia para Stitch / design-engine / pptx

Validado: PPTX (Calibri/Calibri Light + 6 accent colors do Office default theme).
Web: aguarda primeiro teste end-to-end com browser real.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 05:13:16 +01:00
ealmeida 37f62eb733 chore(design-media): suspender Penpot, adoptar Stitch como motor principal web/ui
- /penpot-pipeline arquivada (backup GDrive)
- /design v2.1.0: routing actualizado, MCPs reduzidos 5→4, Penpot removido
- design-engine assume infographic/social/logo (era Penpot)
- Stitch assume web/landing/ui (era também Stitch, agora primário)

Decisão sessão 5 (07-04): match com workflow real (mockups para propostas).
Penpot exigia build manual; Stitch faz text→UI generation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 05:06:20 +01:00
ealmeida 2ec16674c2 chore(skills): consolidar n8n-* (6→1) e cwp-* (8→1) em meta-skills
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 05:00:35 +01:00
ealmeida faef9b47dc fix(project-manager): remover Dify KB das descriptions, marcar nota TODO
Dify foi removido 06-03-2026. Skills brainstorm/discover ainda referenciam-no
no corpo. Bump v1.2 + nota top-of-file. Reescrita workflow para próxima sessão.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 04:52:03 +01:00
190 changed files with 10778 additions and 4521 deletions
+1
View File
@@ -0,0 +1 @@
design-media/skills/*/references/__pycache__/
+14 -2
View File
@@ -8,7 +8,7 @@ allowed-tools: Read, Write, Edit, Bash, mcp__gitea__list_repo_action_workflows,
Skill para criar e gerir pipelines CI/CD do AcidaOS via **Gitea Actions**. Skill para criar e gerir pipelines CI/CD do AcidaOS via **Gitea Actions**.
> **Atenção:** O AcidaOS usa **Gitea Actions**, não GitHub Actions. A sintaxe é compatível mas o runner é self-hosted em `mcp-hub.descomplicar.pt`. > **Atenção:** O AcidaOS usa **Gitea Actions**, não GitHub Actions. A sintaxe é compatível mas o runner é self-hosted em `gateway.descomplicar.pt`.
## Contexto ## Contexto
@@ -18,7 +18,7 @@ Repositórios Gitea:
acidaos-dashboard → Next.js Dashboard acidaos-dashboard → Next.js Dashboard
Runners: Runners:
self-hosted @ mcp-hub.descomplicar.pt self-hosted @ gateway.descomplicar.pt
Labels: [self-hosted, linux, rust, node] Labels: [self-hosted, linux, rust, node]
Deploy target: Deploy target:
@@ -314,3 +314,15 @@ mcp__gitea__get_repo_action_job_log_preview({ owner: "descomplicar", repo: "acid
--- ---
**Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: acidaos **Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: acidaos
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -189,3 +189,15 @@ Antes de marcar tarefa como concluída:
--- ---
**Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: acidaos **Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: acidaos
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -230,3 +230,15 @@ cargo fmt --check # formatação correcta
--- ---
**Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: acidaos **Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: acidaos
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -237,3 +237,15 @@ pnpm lint # zero erros ESLint
--- ---
**Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: acidaos **Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: acidaos
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -104,3 +104,15 @@ A sandbox fornece um ambiente isolado com dados fictícios para desenvolvimento
- **[references/endpoints.md](references/endpoints.md)** - Catálogo completo de endpoints - **[references/endpoints.md](references/endpoints.md)** - Catálogo completo de endpoints
- **Docs oficiais:** https://www.moloni.pt/dev/endpoints/ - **Docs oficiais:** https://www.moloni.pt/dev/endpoints/
- **Sandbox:** https://www.moloni.pt/dev/sandbox/ - **Sandbox:** https://www.moloni.pt/dev/sandbox/
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
-301
View File
@@ -1,301 +0,0 @@
---
name: n8n-chatbot
description: Criação de chatbots e workflows com inteligência artificial usando LangChain no n8n.
---
# /n8n-chatbot - Chatbots e AI Agents n8n
Criar chatbots e workflows com AI usando LangChain.
## Contexto NotebookLM
ANTES de executar, consultar notebooks para contexto especializado:
| Notebook | ID | Consultar quando |
|----------|-----|-----------------|
| n8n Deep Research | f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1 | Sempre |
```
mcp__notebooklm__notebook_query({
notebook_id: "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1",
query: "<adaptar ao contexto do pedido do utilizador>"
})
```
Integrar insights do NotebookLM nas recomendações e decisões.
---
## Uso
```
/n8n-chatbot create <descrição> # Criar chatbot
/n8n-chatbot agent <tipo> # Criar AI agent
/n8n-chatbot rag <knowledge_base> # Criar sistema RAG
```
---
## Workflow Obrigatório
```
1. Health check → mcp__n8n__n8n_health_check()
2. Pesquisar template → mcp__n8n__search_templates({ task: "ai_automation" })
3. Se template OK → mcp__n8n__n8n_deploy_template()
4. Se criar do zero → Seguir fluxo abaixo
```
---
## Nodes LangChain
### Core
| Node | Uso |
|------|-----|
| `@n8n/n8n-nodes-langchain.agent` | AI Agent principal |
| `@n8n/n8n-nodes-langchain.chainLlm` | Chain LLM simples |
| `@n8n/n8n-nodes-langchain.chainRetrievalQa` | RAG Q&A |
### Modelos
| Node | Provider |
|------|----------|
| `@n8n/n8n-nodes-langchain.lmChatOpenAi` | OpenAI GPT |
| `@n8n/n8n-nodes-langchain.lmChatAnthropic` | Claude |
| `@n8n/n8n-nodes-langchain.lmChatOllama` | Ollama local |
### Memória
| Node | Tipo |
|------|------|
| `@n8n/n8n-nodes-langchain.memoryBufferWindow` | Últimas N mensagens |
| `@n8n/n8n-nodes-langchain.memoryPostgresChat` | PostgreSQL |
| `@n8n/n8n-nodes-langchain.memoryRedisChat` | Redis |
### Tools
| Node | Função |
|------|--------|
| `@n8n/n8n-nodes-langchain.toolCalculator` | Cálculos |
| `@n8n/n8n-nodes-langchain.toolCode` | Executar código |
| `@n8n/n8n-nodes-langchain.toolHttpRequest` | Chamar APIs |
| `@n8n/n8n-nodes-langchain.toolWorkflow` | Chamar workflows |
### Vector Stores (RAG)
| Node | Sistema |
|------|---------|
| `@n8n/n8n-nodes-langchain.vectorStoreSupabase` | Supabase |
| `@n8n/n8n-nodes-langchain.vectorStorePinecone` | Pinecone |
| `@n8n/n8n-nodes-langchain.vectorStorePgVector` | PostgreSQL |
---
## Chatbot Básico
### Estrutura
```
Webhook/Trigger
LLM Chat Model (OpenAI/Claude)
Memory (Buffer)
Agent
Resposta
```
### Implementação
```javascript
// 1. Modelo LLM
mcp__n8n__get_node({
nodeType: "@n8n/n8n-nodes-langchain.lmChatOpenAi",
detail: "standard"
})
// 2. Memória
mcp__n8n__get_node({
nodeType: "@n8n/n8n-nodes-langchain.memoryBufferWindow",
detail: "standard"
})
// 3. Agent
mcp__n8n__get_node({
nodeType: "@n8n/n8n-nodes-langchain.agent",
detail: "standard"
})
```
---
## RAG (Retrieval Augmented Generation)
### Estrutura
```
Documentos
Embeddings
Vector Store
Query (pergunta)
Retriever
LLM (resposta contextualizada)
```
### Configuração Vector Store
```javascript
mcp__n8n__validate_node({
nodeType: "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
config: {
mode: "insert", // ou "retrieve"
tableName: "documents",
queryName: "match_documents"
},
mode: "minimal"
})
```
---
## AI Agent com Tools
### Estrutura
```
Input
Agent
├── Tool: Calculator
├── Tool: HTTP Request
├── Tool: Code
└── Tool: Workflow
Output
```
### Configuração Agent
```javascript
mcp__n8n__validate_node({
nodeType: "@n8n/n8n-nodes-langchain.agent",
config: {
agentType: "conversationalAgent",
systemMessage: "Tu és um assistente prestável...",
options: {
returnIntermediateSteps: true
}
},
mode: "minimal"
})
```
---
## Exemplos Práticos
### Chatbot de Suporte
```
Webhook (mensagem cliente)
Memory PostgreSQL (histórico)
Vector Store (docs suporte)
Chain Retrieval QA
Webhook Response
```
### Agent CRM
```
Webhook (comando)
Agent
├── Tool: Pesquisar clientes
├── Tool: Criar lead
└── Tool: Actualizar tarefa
Slack (resultado)
```
### Resumo de Documentos
```
Webhook (upload PDF)
PDF Extract
Text Splitter
LLM Chain (resumo)
Email (enviar resumo)
```
---
## Templates Recomendados
```javascript
// AI templates
mcp__n8n__search_templates({
searchMode: "by_task",
task: "ai_automation"
})
// Por keyword
mcp__n8n__search_templates({
searchMode: "keyword",
query: "chatbot langchain openai"
})
```
---
## Credenciais Necessárias
| Provider | Credencial | Node |
|----------|------------|------|
| OpenAI | API Key | lmChatOpenAi |
| Anthropic | API Key | lmChatAnthropic |
| Supabase | URL + Key | vectorStoreSupabase |
| Pinecone | API Key | vectorStorePinecone |
---
## Boas Práticas
| Prática | Razão |
|---------|-------|
| System prompt claro | Define comportamento |
| Temperatura baixa (0.1-0.3) | Respostas consistentes |
| Memória limitada | Performance |
| Retry on error | Resiliência |
| Logs de conversas | Debug e melhoria |
---
## Troubleshooting
| Problema | Solução |
|----------|---------|
| Respostas inconsistentes | Baixar temperatura |
| Contexto perdido | Verificar memória |
| RAG não encontra | Verificar embeddings |
| Timeout | Aumentar limite |
| Token limit | Resumir contexto |
---
*Skill v1.0 | Descomplicar®*
-114
View File
@@ -1,114 +0,0 @@
---
name: n8n-health
description: Diagnóstico de conectividade e estado da instância n8n. Verificação de saúde do sistema.
---
# /n8n-health - Diagnóstico n8n
Verificar conectividade e estado da instância n8n.
## Contexto NotebookLM
ANTES de executar, consultar notebooks para contexto especializado:
| Notebook | ID | Consultar quando |
|----------|-----|-----------------|
| n8n Deep Research | f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1 | Sempre |
```
mcp__notebooklm__notebook_query({
notebook_id: "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1",
query: "<adaptar ao contexto do pedido do utilizador>"
})
```
Integrar insights do NotebookLM nas recomendações e decisões.
---
## Uso
```
/n8n-health # Status rápido
/n8n-health verbose # Diagnóstico completo
```
---
## Instância
| Aspecto | Valor |
|---------|-------|
| URL | `https://automator.descomplicar.pt` |
| MCP | `mcp__n8n__*` |
---
## Execução
### Status Rápido (default)
```
1. mcp__n8n__n8n_health_check({ mode: "status" })
2. Reportar: status, URL, versão, response time
```
### Diagnóstico Completo (verbose)
```
1. mcp__n8n__n8n_health_check({ mode: "diagnostic", verbose: true })
2. Reportar: env vars, tool status, cache, erros
```
---
## Output Esperado
```
n8n Health Check
----------------
Status: OK | ERRO
URL: https://automator.descomplicar.pt
MCP: 2.33.x
Response: XXXms
Workflows: XX activos
```
---
## Se Falhar
| Erro | Causa | Solução |
|------|-------|---------|
| Connection refused | n8n offline | Verificar servidor |
| 401 Unauthorized | API key inválida | Regenerar no n8n |
| Timeout | Rede lenta | Verificar latência |
### Diagnóstico Manual
```bash
# Verificar se n8n responde
curl -I https://automator.descomplicar.pt
# Verificar API
curl -H "X-N8N-API-KEY: $KEY" https://automator.descomplicar.pt/api/v1/workflows
# Logs MCP
~/.claude/logs/mcp-n8n.log
```
---
## Skills Relacionadas
| Skill | Quando Usar |
|-------|-------------|
| `/n8n-webhook` | Criar webhooks |
| `/n8n-schedule` | Automações cron |
| `/n8n-sync` | Sincronização dados |
| `/n8n-notify` | Alertas |
| `/n8n-chatbot` | AI/Chatbots |
---
*Skill v1.0 | Descomplicar®*
-234
View File
@@ -1,234 +0,0 @@
---
name: n8n-notify
description: Criação de sistemas de notificações e alertas n8n via Slack, email e SMS.
disable-model-invocation: true
---
# /n8n-notify - Notificações e Alertas n8n
Criar sistemas de alertas via Slack, email, SMS.
---
## Uso
```
/n8n-notify create <descrição> # Criar sistema de alertas
/n8n-notify slack <mensagem> # Quick Slack notification
/n8n-notify email <para> <assunto> # Quick email
```
---
## Workflow Obrigatório
```
1. Health check → mcp__n8n__n8n_health_check()
2. Pesquisar template → mcp__n8n__search_templates({ query: "notification" })
3. Se template OK → mcp__n8n__n8n_deploy_template()
4. Se criar do zero → Seguir fluxo abaixo
```
---
## Canais Disponíveis
| Canal | Node | Uso |
|-------|------|-----|
| Slack | `nodes-base.slack` | Notificações equipa |
| Email | `nodes-base.emailSend` | Alertas formais |
| Telegram | `nodes-base.telegram` | Alertas mobile |
| Discord | `nodes-base.discord` | Comunidades |
| SMS | `nodes-base.twilio` | Alertas críticos |
---
## Slack
### Documentação
```javascript
mcp__n8n__get_node({
nodeType: "nodes-base.slack",
detail: "standard",
includeExamples: true
})
```
### Configuração
```javascript
mcp__n8n__validate_node({
nodeType: "nodes-base.slack",
config: {
resource: "message",
operation: "post",
channel: "#alertas",
text: "Mensagem de alerta"
},
mode: "minimal"
})
```
### Mensagem Formatada (Blocks)
```javascript
{
blocksUi: {
blocksValues: [
{
type: "header",
text: { type: "plain_text", text: "Alerta" }
},
{
type: "section",
text: { type: "mrkdwn", text: "*Detalhes:*\n{{ $json.message }}" }
}
]
}
}
```
---
## Email
### Configuração
```javascript
mcp__n8n__validate_node({
nodeType: "nodes-base.emailSend",
config: {
fromEmail: "alertas@descomplicar.pt",
toEmail: "emanuel@descomplicar.pt",
subject: "Alerta: {{ $json.title }}",
text: "{{ $json.message }}"
},
mode: "minimal"
})
```
---
## Padrões Comuns
### Webhook → Slack
```
Webhook (evento externo)
Set (formatar)
Slack (enviar)
```
### Monitor → Multi-canal
```
Schedule (cada 5min)
HTTP Request (check health)
IF (erro?)
↓ TRUE
Slack + Email (alertar)
```
### Error Handler
```
Qualquer workflow
↓ (erro)
Error Trigger
Slack (alertar erro)
```
---
## Níveis de Alerta
| Nível | Canal | Quando |
|-------|-------|--------|
| Info | Slack | Eventos normais |
| Warning | Slack + Email | Atenção necessária |
| Critical | Todos + SMS | Acção imediata |
### Implementação
```
IF (severity = "critical")
↓ TRUE
Slack + Email + SMS
↓ FALSE
IF (severity = "warning")
↓ TRUE
Slack + Email
↓ FALSE
Slack
```
---
## Exemplos
### Alerta de Servidor Down
```
Schedule (5min)
HTTP Request (ping servidor)
IF (falhou?)
↓ TRUE
Slack (#infra)
Email (admin)
```
### Novo Lead
```
Webhook (lead criado)
Set (formatar)
Slack (#vendas)
```
### Factura Vencida
```
Schedule (diário 9h)
HTTP Request (facturas vencidas)
Loop (cada factura)
Email (cliente)
Slack (#contabilidade)
```
---
## Templates
```javascript
mcp__n8n__search_templates({
searchMode: "keyword",
query: "slack notification alert"
})
```
---
## Troubleshooting
| Problema | Solução |
|----------|---------|
| Slack não envia | Verificar token e canal |
| Email em spam | Configurar SPF/DKIM |
| Rate limited | Agrupar notificações |
---
*Skill v1.0 | Descomplicar®*
-169
View File
@@ -1,169 +0,0 @@
---
name: n8n-schedule
description: Criação de workflows n8n com execução agendada via cron para automações recorrentes.
disable-model-invocation: true
---
# /n8n-schedule - Automações Agendadas n8n
Criar workflows com execução agendada (cron).
---
## Uso
```
/n8n-schedule create <descrição> # Criar automação agendada
/n8n-schedule list # Listar agendamentos
/n8n-schedule disable <id> # Desactivar
```
---
## Workflow Obrigatório
```
1. Health check → mcp__n8n__n8n_health_check()
2. Pesquisar template → mcp__n8n__search_templates({ task: "scheduling" })
3. Se template OK → mcp__n8n__n8n_deploy_template()
4. Se criar do zero → Seguir fluxo abaixo
```
---
## Expressões Cron Comuns
| Expressão | Descrição |
|-----------|-----------|
| `0 9 * * *` | Diário às 9h |
| `0 9 * * 1-5` | Seg-Sex às 9h |
| `0 */2 * * *` | A cada 2 horas |
| `*/15 * * * *` | A cada 15 minutos |
| `0 0 1 * *` | Dia 1 de cada mês |
| `0 3 * * 0` | Domingos às 3h |
### Formato
```
┌───────── minuto (0-59)
│ ┌─────── hora (0-23)
│ │ ┌───── dia mês (1-31)
│ │ │ ┌─── mês (1-12)
│ │ │ │ ┌─ dia semana (0-6)
* * * * *
```
---
## Configuração Schedule Trigger
```javascript
mcp__n8n__validate_node({
nodeType: "nodes-base.scheduleTrigger",
config: {
rule: {
interval: [{
field: "cronExpression",
expression: "0 9 * * 1-5"
}]
}
},
mode: "minimal"
})
```
---
## Timezone
```javascript
{
options: {
timezone: "Europe/Lisbon"
}
}
```
---
## Exemplos
### Relatório Diário
```
Schedule (0 9 * * 1-5)
PostgreSQL (query)
Set (formatar)
Email (enviar)
```
### Backup Semanal
```
Schedule (0 3 * * 0)
SSH (backup)
IF (sucesso?)
Slack (confirmar/alertar)
```
### Limpeza de Logs
```
Schedule (0 2 * * *)
SSH (limpar)
Slack (reportar)
```
---
## Gestão
### Desactivar
```javascript
mcp__n8n__n8n_update_partial_workflow({
id: "wf-xxx",
operations: [{ type: "deactivateWorkflow" }]
})
```
### Reactivar
```javascript
mcp__n8n__n8n_update_partial_workflow({
id: "wf-xxx",
operations: [{ type: "activateWorkflow" }]
})
```
### Ver Execuções
```javascript
mcp__n8n__n8n_executions({
workflowId: "wf-xxx",
limit: 10,
status: "all"
})
```
---
## Troubleshooting
| Problema | Solução |
|----------|---------|
| Não executa | Verificar workflow activo |
| Hora errada | Verificar timezone |
| Duplicado | Verificar múltiplos triggers |
---
*Skill v1.0 | Descomplicar®*
-168
View File
@@ -1,168 +0,0 @@
---
name: n8n-sync
description: Sincronização de dados entre sistemas via workflows n8n. Mantém dados consistentes entre plataformas.
disable-model-invocation: true
---
# /n8n-sync - Sincronização de Dados n8n
Manter dados sincronizados entre sistemas.
---
## Uso
```
/n8n-sync create <origem> <destino> # Criar sync
/n8n-sync list # Listar syncs
/n8n-sync status <workflow_id> # Ver estado
```
---
## Workflow Obrigatório
```
1. Health check → mcp__n8n__n8n_health_check()
2. Pesquisar template → mcp__n8n__search_templates({ task: "data_sync" })
3. Se template OK → mcp__n8n__n8n_deploy_template()
4. Se criar do zero → Seguir fluxo abaixo
```
---
## Padrões de Sync
### One-Way (Unidireccional)
```
Origem → Transform → Destino
```
### Two-Way (Bidireccional)
```
A ←→ B (com resolução de conflitos)
```
### Hub-and-Spoke
```
A ↔ HUB ↔ B
C
```
---
## Nodes por Sistema
### APIs/CRM
| Node | Sistema |
|------|---------|
| `nodes-base.httpRequest` | APIs genéricas |
| `nodes-base.webhook` | Receber dados |
### Bases de Dados
| Node | Sistema |
|------|---------|
| `nodes-base.postgres` | PostgreSQL |
| `nodes-base.mySql` | MySQL |
| `nodes-base.mongoDb` | MongoDB |
### Ficheiros
| Node | Sistema |
|------|---------|
| `nodes-base.googleSheets` | Google Sheets |
| `nodes-base.spreadsheetFile` | Excel/CSV |
| `nodes-base.ftp` | FTP/SFTP |
---
## Exemplo: CRM → Sheets
```
Schedule (horário)
HTTP Request (GET leads)
IF (há dados?)
Set (mapear campos)
Google Sheets (append)
Slack (confirmar)
```
---
## Estratégias
| Estratégia | Uso |
|------------|-----|
| Full Sync | Apagar tudo + inserir tudo |
| Incremental | Apenas modificados (updated_at) |
| Delta | Comparar hashes |
---
## Upsert Pattern
```javascript
{
nodeType: "nodes-base.postgres",
config: {
operation: "upsert",
table: "clientes",
columns: "email,nome,empresa",
conflictColumns: "email"
}
}
```
---
## Gestão de Erros
### Retry
```javascript
{
options: {
retry: {
maxRetries: 3,
retryInterval: 1000
}
}
}
```
### Dead Letter Queue
```
Operação
↓ (erro)
Error Trigger
BD (guardar erro)
Slack (alertar)
```
---
## Troubleshooting
| Problema | Solução |
|----------|---------|
| Duplicados | Usar upsert |
| Timeout | Batches menores |
| Rate limit | Adicionar delays |
---
*Skill v1.0 | Descomplicar®*
-160
View File
@@ -1,160 +0,0 @@
---
name: n8n-webhook
description: Criação e gestão de webhooks n8n para receber dados de sistemas externos.
---
# /n8n-webhook - Webhooks n8n
Criar e gerir webhooks para receber dados externos.
---
## Uso
```
/n8n-webhook create <descrição> # Criar novo webhook
/n8n-webhook list # Listar webhooks existentes
/n8n-webhook test <workflow_id> # Testar webhook
```
---
## Workflow Obrigatório
```
1. Health check → mcp__n8n__n8n_health_check()
2. Pesquisar template → mcp__n8n__search_templates({ query: "webhook" })
3. Se template OK → mcp__n8n__n8n_deploy_template()
4. Se criar do zero → Seguir fluxo abaixo
```
---
## Criar Webhook do Zero
### Passo 1: Documentação do Node
```javascript
mcp__n8n__get_node({
nodeType: "nodes-base.webhook",
detail: "standard",
includeExamples: true
})
```
### Passo 2: Validar Configuração
```javascript
mcp__n8n__validate_node({
nodeType: "nodes-base.webhook",
config: {
httpMethod: "POST",
path: "meu-webhook",
responseMode: "onReceived"
},
mode: "minimal"
})
```
### Passo 3: Nodes de Processamento
| Node | Uso |
|------|-----|
| `nodes-base.set` | Transformar dados |
| `nodes-base.if` | Condicionais |
| `nodes-base.code` | JavaScript custom |
| `nodes-base.httpRequest` | Chamar APIs |
### Passo 4: Deploy
```javascript
mcp__n8n__n8n_create_workflow({
name: "Webhook - Descrição",
nodes: [...],
connections: {...},
active: true
})
```
---
## Configurações Webhook
| Parâmetro | Opções | Default |
|-----------|--------|---------|
| `httpMethod` | GET, POST, PUT, DELETE | POST |
| `path` | String única | (obrigatório) |
| `authentication` | none, basicAuth, headerAuth | none |
| `responseMode` | onReceived, lastNode | onReceived |
---
## URL do Webhook
Após deploy:
```
https://automator.descomplicar.pt/webhook/<path>
```
Modo teste (workflow inactivo):
```
https://automator.descomplicar.pt/webhook-test/<path>
```
---
## Exemplos
### Webhook → Slack
```
Webhook (POST /notify)
Set (formatar)
Slack (enviar)
```
### Webhook → CRM
```
Webhook (POST /lead)
HTTP Request (criar no Desk)
Email (notificar)
```
---
## Testar
```javascript
mcp__n8n__n8n_test_workflow({
workflowId: "wf-xxx",
inputData: {
body: { "test": "data" },
headers: { "Content-Type": "application/json" }
}
})
```
```bash
curl -X POST https://automator.descomplicar.pt/webhook/meu-webhook \
-H "Content-Type: application/json" \
-d '{"test": "data"}'
```
---
## Troubleshooting
| Problema | Solução |
|----------|---------|
| 404 Not Found | Workflow não está activo |
| 401 Unauthorized | Verificar autenticação |
| Dados não chegam | Verificar responseMode |
---
*Skill v1.0 | Descomplicar®*
+270
View File
@@ -0,0 +1,270 @@
---
name: n8n
description: Meta-skill n8n para criação e gestão de workflows na instância automator.descomplicar.pt. Cobre health check, webhooks, schedule (cron), sync de dados, notify (Slack/email/SMS) e chatbots/AI agents (LangChain/RAG). Triggers — n8n, workflow, automação, webhook, schedule, cron, sync, notify, alerta, slack, chatbot, ai agent, langchain, rag, automator, health check n8n.
---
# /n8n - Meta-skill n8n
Skill unificada para a instância n8n Descomplicar (`https://automator.descomplicar.pt`, MCP `mcp__n8n__*`). Substitui as antigas n8n-chatbot, n8n-health, n8n-notify, n8n-schedule, n8n-sync, n8n-webhook.
## Contexto NotebookLM (sempre antes de executar)
| Notebook | ID |
|----------|-----|
| n8n Deep Research | `f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1` |
```
mcp__notebooklm__notebook_query({ notebook_id: "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1", query: "<adaptar ao pedido>" })
```
## Workflow obrigatório (qualquer criação)
```
1. mcp__n8n__n8n_health_check()
2. mcp__n8n__search_templates({ task: "<webhook|scheduling|data_sync|notification|ai_automation>" })
3. Se template adequado -> mcp__n8n__n8n_deploy_template()
4. Caso contrário, criar do zero seguindo a secção apropriada abaixo
```
---
## 1. Health (diagnóstico)
```
/n8n health # status rápido
/n8n health verbose # diagnóstico completo
```
```js
mcp__n8n__n8n_health_check({ mode: "status" })
mcp__n8n__n8n_health_check({ mode: "diagnostic", verbose: true })
```
Output esperado: status (OK/ERRO), URL, versão MCP, response time, workflows activos.
Erros comuns: Connection refused (n8n offline), 401 (API key inválida — regenerar), timeout (rede). Diagnóstico manual:
```bash
curl -I https://automator.descomplicar.pt
curl -H "X-N8N-API-KEY: $KEY" https://automator.descomplicar.pt/api/v1/workflows
tail ~/.claude/logs/mcp-n8n.log
```
---
## 2. Webhook
Receber dados de sistemas externos.
```
/n8n webhook create <descrição>
/n8n webhook list
/n8n webhook test <workflow_id>
```
```js
mcp__n8n__get_node({ nodeType: "nodes-base.webhook", detail: "standard", includeExamples: true })
mcp__n8n__validate_node({ nodeType: "nodes-base.webhook", config: { httpMethod: "POST", path: "meu-webhook", responseMode: "onReceived" }, mode: "minimal" })
mcp__n8n__n8n_create_workflow({ name: "Webhook - X", nodes: [...], connections: {...}, active: true })
```
Parâmetros: `httpMethod` (GET/POST/PUT/DELETE, default POST), `path` (obrigatório), `authentication` (none/basicAuth/headerAuth), `responseMode` (onReceived/lastNode).
URLs: produção `https://automator.descomplicar.pt/webhook/<path>` | teste `https://automator.descomplicar.pt/webhook-test/<path>`.
Nodes processamento: `nodes-base.set`, `nodes-base.if`, `nodes-base.code`, `nodes-base.httpRequest`.
Teste:
```js
mcp__n8n__n8n_test_workflow({ workflowId: "wf-xxx", inputData: { body: {test:"data"}, headers: {"Content-Type":"application/json"} } })
```
```bash
curl -X POST https://automator.descomplicar.pt/webhook/meu-webhook -H "Content-Type: application/json" -d '{"test":"data"}'
```
Troubleshooting: 404 (workflow não activo), 401 (auth), dados não chegam (responseMode).
---
## 3. Schedule (cron)
Workflows com execução agendada.
```
/n8n schedule create <descrição>
/n8n schedule list
/n8n schedule disable <id>
```
Cron comuns: `0 9 * * *` (diário 9h), `0 9 * * 1-5` (Seg-Sex 9h), `0 */2 * * *` (cada 2h), `*/15 * * * *` (15min), `0 0 1 * *` (dia 1), `0 3 * * 0` (domingos 3h).
```js
mcp__n8n__validate_node({
nodeType: "nodes-base.scheduleTrigger",
config: { rule: { interval: [{ field: "cronExpression", expression: "0 9 * * 1-5" }] }, options: { timezone: "Europe/Lisbon" } },
mode: "minimal"
})
```
Gestão:
```js
mcp__n8n__n8n_update_partial_workflow({ id: "wf-xxx", operations: [{ type: "deactivateWorkflow" }] })
mcp__n8n__n8n_update_partial_workflow({ id: "wf-xxx", operations: [{ type: "activateWorkflow" }] })
mcp__n8n__n8n_executions({ workflowId: "wf-xxx", limit: 10, status: "all" })
```
Exemplos: relatório diário (Schedule -> Postgres -> Set -> Email), backup semanal (Schedule -> SSH -> IF -> Slack), limpeza logs.
Troubleshooting: não executa (workflow inactivo), hora errada (timezone), duplicado (múltiplos triggers).
---
## 4. Sync (sincronização de dados)
```
/n8n sync create <origem> <destino>
/n8n sync list
/n8n sync status <workflow_id>
```
Padrões: One-Way (origem -> transform -> destino), Two-Way (com resolução conflitos), Hub-and-Spoke.
Nodes:
- APIs: `nodes-base.httpRequest`, `nodes-base.webhook`
- BD: `nodes-base.postgres`, `nodes-base.mySql`, `nodes-base.mongoDb`
- Ficheiros: `nodes-base.googleSheets`, `nodes-base.spreadsheetFile`, `nodes-base.ftp`
Estratégias: Full Sync, Incremental (updated_at), Delta (hashes).
Upsert:
```js
{ nodeType: "nodes-base.postgres", config: { operation: "upsert", table: "clientes", columns: "email,nome,empresa", conflictColumns: "email" } }
```
Erros: retry (`{ options: { retry: { maxRetries: 3, retryInterval: 1000 } } }`), Dead Letter Queue (Error Trigger -> BD -> Slack).
Exemplo CRM->Sheets: Schedule -> HTTP GET leads -> IF -> Set -> Google Sheets append -> Slack.
Troubleshooting: duplicados (upsert), timeout (batches menores), rate limit (delays).
---
## 5. Notify (alertas)
```
/n8n notify create <descrição>
/n8n notify slack <mensagem>
/n8n notify email <para> <assunto>
```
Canais: Slack (`nodes-base.slack`), Email (`nodes-base.emailSend`), Telegram, Discord, SMS Twilio.
Slack:
```js
mcp__n8n__validate_node({
nodeType: "nodes-base.slack",
config: { resource: "message", operation: "post", channel: "#alertas", text: "..." },
mode: "minimal"
})
```
Mensagem formatada (Blocks): header + section com `mrkdwn` e `{{ $json.message }}`.
Email:
```js
mcp__n8n__validate_node({
nodeType: "nodes-base.emailSend",
config: { fromEmail: "alertas@descomplicar.pt", toEmail: "emanuel@descomplicar.pt", subject: "Alerta: {{ $json.title }}", text: "{{ $json.message }}" },
mode: "minimal"
})
```
Padrões: Webhook->Slack, Monitor->Multi-canal (Schedule -> HTTP -> IF -> Slack+Email), Error Handler (Error Trigger -> Slack).
Níveis: Info (Slack), Warning (Slack+Email), Critical (Slack+Email+SMS) — implementar com IF aninhado por `severity`.
Troubleshooting: Slack não envia (token/canal), email em spam (SPF/DKIM), rate limited (agrupar).
---
## 6. Chatbot / AI Agents (LangChain)
```
/n8n chatbot create <descrição>
/n8n chatbot agent <tipo>
/n8n chatbot rag <knowledge_base>
```
### Nodes LangChain
Core: `@n8n/n8n-nodes-langchain.agent`, `chainLlm`, `chainRetrievalQa`.
Modelos: `lmChatOpenAi`, `lmChatAnthropic`, `lmChatOllama`.
Memória: `memoryBufferWindow`, `memoryPostgresChat`, `memoryRedisChat`.
Tools: `toolCalculator`, `toolCode`, `toolHttpRequest`, `toolWorkflow`.
Vector Stores: `vectorStoreSupabase`, `vectorStorePinecone`, `vectorStorePgVector`.
### Chatbot básico
```
Webhook -> LLM Chat -> Memory Buffer -> Agent -> Resposta
```
### RAG
```
Documentos -> Embeddings -> Vector Store -> Query -> Retriever -> LLM
```
```js
mcp__n8n__validate_node({
nodeType: "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
config: { mode: "insert", tableName: "documents", queryName: "match_documents" },
mode: "minimal"
})
```
### AI Agent com tools
```js
mcp__n8n__validate_node({
nodeType: "@n8n/n8n-nodes-langchain.agent",
config: { agentType: "conversationalAgent", systemMessage: "Tu és um assistente prestável...", options: { returnIntermediateSteps: true } },
mode: "minimal"
})
```
### Exemplos práticos
- Suporte: Webhook -> Memory Postgres -> Vector Store -> Chain Retrieval QA -> Webhook Response.
- Agent CRM: Webhook -> Agent (tools: pesquisar/criar lead/actualizar tarefa) -> Slack.
- Resumo PDFs: Webhook -> PDF Extract -> Text Splitter -> LLM Chain -> Email.
### Credenciais
OpenAI/Anthropic (API Key), Supabase (URL+Key), Pinecone (API Key).
### Boas práticas
System prompt claro | temperatura 0.1-0.3 | memória limitada | retry on error | logs de conversas.
### Troubleshooting
Inconsistente (baixar temperatura), contexto perdido (memória), RAG vazio (embeddings), timeout (limite), token limit (resumir).
---
## Templates
```js
mcp__n8n__search_templates({ searchMode: "by_task", task: "ai_automation" })
mcp__n8n__search_templates({ searchMode: "keyword", query: "chatbot langchain openai" })
```
---
**Versão:** 2.0.0 (consolidação 6->1, 07-04-2026) | **Autor:** Descomplicar®
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
+12
View File
@@ -122,3 +122,15 @@ mcp__memory-supabase__save_memory {
--- ---
*Core Standards v1.1 | 2026-03-12* *Core Standards v1.1 | 2026-03-12*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+43 -127
View File
@@ -1,149 +1,65 @@
--- ---
name: agent-context-injector name: agent-context-injector
description: Injecção dinâmica de contexto específico para cada agente — MCPs disponíveis, skills relevantes e datasets Dify. description: Injeccao dinamica de contexto (MCPs e Skills) nos agentes via script Python + hook SessionStart com deteccao de staleness.
user-invocable: false user-invocable: false
allowed-tools: Read, Glob, Grep, ToolSearch allowed-tools: Read, Glob, Grep, ToolSearch
--- ---
# Agent Context Injector # Agent Context Injector
Injecção dinâmica de contexto específico para cada agente. Regeneracao automatica das seccoes "Your Available MCPs" e "Your Available Skills" em todos os agentes.
## Triggers ## Como funciona
Esta skill é activada automaticamente via hook `SubagentStart` quando: 1. **Hook SessionStart** (`~/.claude/hooks/agent-context-refresh.sh`) calcula hash dos inputs
- Um subagente é iniciado via Task tool 2. Se hash mudou → executa `~/.claude/scripts/regenerate-agent-context.py`
- Contexto precisa ser enriquecido com recursos do agente 3. Script le frontmatter de cada agente, inventario MCPs, mapeamento domain e skills dos plugins
4. Gera seccoes entre marcadores `<!-- BEGIN:AUTO-CONTEXT -->` / `<!-- END:AUTO-CONTEXT -->`
5. Guarda novo hash em `~/.claude/.agent-context-hash`
## Capabilities ## Ficheiros
### 1. Context Building | Ficheiro | Funcao |
- Consultar mapeamento agente → recursos na BD |----------|--------|
- Gerar lista de MCPs disponíveis para o agente | `~/.claude/scripts/regenerate-agent-context.py` | Script principal de regeneracao |
- Gerar lista de skills relevantes | `~/.claude/hooks/agent-context-refresh.sh` | Hook SessionStart com staleness |
- Incluir datasets Dify para consulta automática | `~/.claude/_resources/domain-mcp-map.json` | Mapeamento domain -> MCPs recomendados |
| `~/.claude/_resources/mcps.json` | Inventario de 34+ MCPs |
| `~/.claude/.agent-context-hash` | Hash MD5 dos inputs (staleness) |
### 2. Token Optimization ## Dados de entrada
- Calcular tokens do contexto gerado
- Priorizar recursos por relevância
- Truncar se exceder limite (~800 tokens)
- Cache de contextos frequentes
### 3. Dynamic Injection - **Agentes:** `~/.claude/agents/*.md` — frontmatter com `domain`, `skills`
- Adicionar contexto ao prompt do agente - **MCPs:** `~/.claude/_resources/mcps.json` — lista com `id`, `name`, `category`
- Incluir instruções de uso dos recursos - **Domain map:** `~/.claude/_resources/domain-mcp-map.json` — primary/recommended por domain
- Configurar auto-consult para datasets - **Skills:** `descomplicar-plugins/*/skills/*/SKILL.md` — frontmatter com `name`, `description`
## Template de Contexto ## Performance
```markdown | Cenario | Tempo |
## Recursos Disponíveis |---------|-------|
| Sem mudancas (hash match) | ~66ms |
| Com regeneracao (61 agentes) | ~2-3s |
### MCPs Activos ## Manutencao
$MCP_LIST
- Usar proactivamente para operações relevantes
### Skills Recomendadas - **Adicionar MCP:** actualizar `mcps.json` e `domain-mcp-map.json` → proximo SessionStart regenera
$SKILLS_LIST - **Adicionar skill:** criar SKILL.md no plugin → proximo SessionStart regenera
- Invocar quando tarefa corresponder - **Adicionar agente:** criar .md com frontmatter `domain:` → proximo SessionStart gera contexto
- **Mudar domain map:** editar `domain-mcp-map.json` → proximo SessionStart regenera
### Knowledge Base (Dify) ## Tarefa Desk
$DATASETS_LIST
- AUTO-CONSULT: Consultar ANTES de responder
- Query template: "$QUERY_TEMPLATE"
### Plugins #1996 — Sistema injeccao Skills e MCPs nos agentes
$PLUGINS_LIST
- Comandos disponíveis: $PLUGIN_COMMANDS ---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
``` ```
## Workflow *Adicionar nova linha após cada erro corrigido.*
```
SUBAGENT START → QUERY BD → BUILD CONTEXT → INJECT → EXECUTE
```
1. **Hook SubagentStart** dispara
2. **Identificar agente** pelo `subagent_type`
3. **Query MySQL**:
```sql
SELECT r.resource_type, r.resource_id, r.priority
FROM cr_agent_resources r
JOIN cr_agents a ON r.agent_id = a.id
WHERE a.slug = '{agent_slug}'
AND r.auto_inject = TRUE
ORDER BY r.priority ASC;
```
4. **Consultar agent-knowledge-config.json** para datasets
5. **Gerar contexto** com template
6. **Calcular tokens** e optimizar se necessário
7. **Injectar** no prompt do agente
## Métricas Target
| Métrica | Target |
|---------|--------|
| Tempo de injecção | < 2s |
| Tokens médios | ~772 |
| Cache hit rate | > 60% |
| Erro rate | < 1% |
## Exemplo de Output
Para `wordpress-plugin-developer`:
```markdown
## Recursos Disponíveis
### MCPs Activos
- `cwp` - Gestão servidor CentOS WebPanel
- `ssh-unified` - Acesso SSH a servidores
- `filesystem` - Operações de ficheiros
### Skills Recomendadas
- `/wp-dev` - Desenvolvimento WordPress
- `/wp-performance` - Optimização performance
- `/elementor` - Desenvolvimento Elementor
### Knowledge Base (Dify)
- `wordpress-development` - Docs WP, hooks, filters
- `woocommerce-api` - API WooCommerce
- AUTO-CONSULT: Consultar ANTES de implementar
### Plugins
- `superpowers` - TDD obrigatório
- `code-review` - Review automático
```
## Configuração
Ficheiro `agent-knowledge-config.json`:
```json
{
"wordpress-plugin-developer": {
"datasets": ["wordpress-development", "woocommerce-api"],
"auto_consult": true,
"query_template": "WordPress {topic} best practices 2026",
"priority_datasets": ["wordpress-development"]
}
}
```
## Integração com Scripts Existentes
Este skill complementa (não substitui) os scripts Python existentes:
- `inject-mcp-context.py` - Continua activo
- `inject-skills-context.py` - Continua activo
A skill adiciona:
- Datasets Dify dinâmicos
- Plugins activos
- Contexto mais rico e actualizado
## Limites
- Máximo ~800 tokens de contexto injectado (para preservar espaço)
- Não modifica comportamento do agente, apenas enriquece contexto
- Depende de mapeamentos correctos em `cr_agent_resources`
- Cache de 5 minutos pode mostrar dados desactualizados
- Não funciona para agentes não registados na BD
+12 -1
View File
@@ -282,4 +282,15 @@ Component Generator:
- Score inicial tipicamente 50-70 (Draft) - Score inicial tipicamente 50-70 (Draft)
- Não cria componentes duplicados (verifica slug existente) - Não cria componentes duplicados (verifica slug existente)
- Requer conexão MySQL para registo em cr_* - Requer conexão MySQL para registo em cr_*
- Não modifica componentes existentes (usar Edit tool) - Não modifica componentes existentes (usar Edit tool)
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
@@ -260,3 +260,15 @@ Resultado:
- Backup não inclui tabelas não-cr_* - Backup não inclui tabelas não-cr_*
- Optimização pode demorar em tabelas grandes (>1M registos) - Optimização pode demorar em tabelas grandes (>1M registos)
- Não substitui backups gerais do Desk CRM - Não substitui backups gerais do Desk CRM
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
@@ -203,3 +203,15 @@ Infrastructure Manager:
- Detecção de órfãos limitada a tabelas cr_* conhecidas - Detecção de órfãos limitada a tabelas cr_* conhecidas
- Não corrige problemas automaticamente (apenas reporta) - Não corrige problemas automaticamente (apenas reporta)
- Telemetria depende de hooks activos e funcionais - Telemetria depende de hooks activos e funcionais
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -175,3 +175,15 @@ Link Desk CRM: `https://desk.descomplicar.pt/admin/projects/view/65`
--- ---
**Desk CRM:** Projecto #65, Task #1637 **Desk CRM:** Projecto #65, Task #1637
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -141,3 +141,15 @@ Avalia todas as regras e sugere `/plugin-config apply` se detectar alteracoes ne
--- ---
*Skill v3.0.0 | 04-03-2026 | Descomplicar* *Skill v3.0.0 | 04-03-2026 | Descomplicar*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
@@ -188,3 +188,15 @@ Quality Validator:
- Não modifica componentes (apenas lê e reporta) - Não modifica componentes (apenas lê e reporta)
- Não cria componentes (usar component-generator) - Não cria componentes (usar component-generator)
- Não executa correções automáticas (usar /descomplicar:upgrade) - Não executa correções automáticas (usar /descomplicar:upgrade)
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
@@ -223,3 +223,15 @@ Relationship Manager:
- Análise de impacto limitada a relacionamentos directos - Análise de impacto limitada a relacionamentos directos
- Não propaga alterações automaticamente (requer confirmação) - Não propaga alterações automaticamente (requer confirmação)
- Depende de consistência das tabelas cr_* na BD - Depende de consistência das tabelas cr_* na BD
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+77 -29
View File
@@ -1,10 +1,10 @@
--- ---
name: auto-expense name: auto-expense
description: Criação automática de despesas a partir de facturas detectadas no IMAP e tickets. Extrai dados, verifica duplicados e cria despesas no Desk CRM com PDF anexo. description: Criação automática de despesas a partir de facturas detectadas no IMAP e tickets. Extrai dados, verifica duplicados por reference_no e cria despesas no Desk CRM com PDF anexo.
disable-model-invocation: true disable-model-invocation: true
--- ---
# /auto-expense v1.0 # /auto-expense v1.1
Cria despesas automaticamente a partir de facturas detectadas pelo IMAP e tickets. Cria despesas automaticamente a partir de facturas detectadas pelo IMAP e tickets.
@@ -49,28 +49,57 @@ Para cada factura na lista:
3. EXTRAIR DO HTML: 3. EXTRAIR DO HTML:
- Valor (padroes: $XX.XX, XX,XX EUR, USD XX.XX, Total: XX.XX) - Valor (padroes: $XX.XX, XX,XX EUR, USD XX.XX, Total: XX.XX)
- Referencia/Invoice number - Referencia/Invoice number (OBRIGATORIO — guardar para dedup)
- Data da factura - Data da factura
4. VERIFICAR DUPLICADO (2 camadas):
Camada 1 - Desk CRM:
Pesquisar: mesmo fornecedor + mesmo valor (±0.05) + mesma data (±3 dias)
Se match → NAO criar, registar como duplicado
5. CRIAR DESPESA:
mcp__desk-crm-v3__create_expense({
category: [cat_id da tabela],
amount: [valor],
date: [data factura YYYY-MM-DD],
expense_name: "[Fornecedor] - [Referencia]",
note: "Auto-criado via /auto-expense",
currency: [2=USD ou 3=EUR],
tax: [0 ou 1],
send_invoice_to_customer: 0
})
``` ```
### Passo 3: PDF (se existir anexo) ### Passo 3: Verificar duplicados (OBRIGATORIO — 3 camadas)
> **CRITICO: Este passo NUNCA pode ser saltado. Se saltado, causa duplicacao massiva de despesas.**
```
Camada 0 — Referencia de factura (PRIMARIA, mais fiavel):
get_expenses(search: "<reference_no>")
Para cada resultado: comparar campo reference_no
Se alguma despesa tem reference_no IGUAL → DUPLICADO CONFIRMADO
→ NAO criar, registar como duplicado com ID existente
Camada 1 — Fornecedor + Valor + Data:
get_expenses(search: "<fornecedor>")
Filtrar: mesmo valor (±0.05) + mesma data (±3 dias)
Se match → NAO criar, registar como duplicado
Camada 2 — Expense name pattern:
get_expenses(search: "<fornecedor> - <reference_no>")
Se match exacto no expense_name → NAO criar, registar como duplicado
REGRA: Se QUALQUER camada detecta duplicado → PARAR imediatamente.
Nunca criar despesa sem passar as 3 camadas com sucesso.
Registar cada duplicado detectado no output JSON (campo "duplicados").
```
### Passo 4: Criar despesa
```
APENAS se Passo 3 passou sem detectar duplicado:
mcp__desk-crm-v3__create_expense({
category: [cat_id da tabela],
amount: [valor],
date: [data factura YYYY-MM-DD],
expense_name: "[Fornecedor] - [Referencia]",
reference_no: "[numero factura/referencia]",
note: "Auto-criado via /auto-expense",
currency: [2=USD ou 3=EUR],
tax: [0 ou 1],
send_invoice_to_customer: 0
})
OBRIGATORIO: campo reference_no DEVE ser preenchido com o numero
de factura extraido. Este campo e a chave primaria de deduplicacao.
```
### Passo 5: PDF (se existir anexo)
``` ```
a. GUARDAR LOCAL: a. GUARDAR LOCAL:
@@ -100,14 +129,14 @@ c. REGISTAR no Desk BD:
d. LIMPAR temporarios d. LIMPAR temporarios
``` ```
### Passo 4: Actualizar CSV ### Passo 6: Actualizar CSV
``` ```
CSV Path: /media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/YYYY/MAPA-DESPESAS-YYYY.csv CSV Path: /media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/YYYY/MAPA-DESPESAS-YYYY.csv
Formato linha: id_desk;data;categoria;fornecedor;descricao;valor;SIM;ficheiro;email;Auto /auto-expense Formato linha: id_desk;data;categoria;fornecedor;descricao;valor;SIM;ficheiro;email;Auto /auto-expense
``` ```
### Passo 5: Escrever output JSON ### Passo 7: Escrever output JSON
``` ```
Escrever em ~/.claude-work/today-expenses-{date}.json: Escrever em ~/.claude-work/today-expenses-{date}.json:
@@ -115,12 +144,15 @@ Escrever em ~/.claude-work/today-expenses-{date}.json:
"despesas_criadas": [ "despesas_criadas": [
{"id": 1180, "fornecedor": "MEO", "valor": 76.26, "moeda": "EUR", "referencia": "FT A/861215955"} {"id": 1180, "fornecedor": "MEO", "valor": 76.26, "moeda": "EUR", "referencia": "FT A/861215955"}
], ],
"duplicados": 0, "duplicados": [
{"fornecedor": "MEO", "referencia": "FT A/861215955", "existente_id": 1175, "camada": 0}
],
"flagged": [ "flagged": [
{"fornecedor": "Desconhecido", "nota": "TOConline - emitente desconhecido: XPTO LDA"} {"fornecedor": "Desconhecido", "nota": "TOConline - emitente desconhecido: XPTO LDA"}
], ],
"erros": [], "erros": [],
"total_processadas": 1 "total_processadas": 1,
"total_duplicados": 0
} }
``` ```
@@ -152,7 +184,7 @@ tax = 0 → Fornecedores estrangeiros
send_invoice_to_customer = 0 → OBRIGATORIO (sem default na BD) send_invoice_to_customer = 0 → OBRIGATORIO (sem default na BD)
reference_no → coluna correcta (NAO "reference") reference_no → coluna correcta (NAO "reference") — CHAVE DE DEDUPLICACAO
``` ```
--- ---
@@ -167,7 +199,8 @@ reference_no → coluna correcta (NAO "reference")
|--------|-----------|-------|-------|-----|-----| |--------|-----------|-------|-------|-----|-----|
### Duplicados Detectados (Y) ### Duplicados Detectados (Y)
- [Fornecedor] [Valor] - ja existe como #ID | Fornecedor | Ref | ID Existente | Camada |
|-----------|-----|-------------|--------|
### Pendentes Revisao (Z) ### Pendentes Revisao (Z)
- [Plataforma] - emitente desconhecido: [nome] - [Plataforma] - emitente desconhecido: [nome]
@@ -179,11 +212,26 @@ reference_no → coluna correcta (NAO "reference")
- NUNCA usar currency=1 (nao existe) - NUNCA usar currency=1 (nao existe)
- NUNCA converter USD para EUR (manter original com currency=2) - NUNCA converter USD para EUR (manter original com currency=2)
- NUNCA criar despesa sem verificar duplicado primeiro - NUNCA criar despesa sem verificar duplicado primeiro (3 camadas obrigatorias)
- NUNCA omitir send_invoice_to_customer=0 - NUNCA omitir send_invoice_to_customer=0
- NUNCA omitir reference_no ao criar despesa (chave primaria de dedup)
- NUNCA saltar a Camada 0 (referencia de factura) — e a mais fiavel
- SEMPRE ler o email/ticket HTML para extrair valor real (nunca assumir) - SEMPRE ler o email/ticket HTML para extrair valor real (nunca assumir)
- SEMPRE incluir reference_no quando disponivel - SEMPRE incluir reference_no quando disponivel
- SEMPRE logar duplicados detectados no output JSON com camada e ID existente
--- ---
*Skill v1.0.0 | 04-03-2026 | Descomplicar®* *Skill v1.1.0 | 30-03-2026 | Descomplicar | Fix: dedup por reference_no (DES-137)*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -293,3 +293,15 @@ Skill:
3. Executar workflow integrado 3. Executar workflow integrado
Output: [resultado completo com referências] Output: [resultado completo com referências]
``` ```
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -223,3 +223,15 @@ Skill:
3. Executar workflow integrado 3. Executar workflow integrado
Output: [resultado completo com referências] Output: [resultado completo com referências]
``` ```
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
-432
View File
@@ -1,432 +0,0 @@
---
name: crm-ops
description: Operações CRM seguras com verificação obrigatória de duplicados e confirmações. Distinção Lead vs Customer, Proposal vs Estimate. Criação de entidades CRM.
disable-model-invocation: true
---
# /crm-ops - Operações CRM Seguras
Skill para operações CRM com verificações obrigatórias de duplicados e confirmações.
## Metadata
- **Version**: 1.2.0
- **Author**: Descomplicar
- **Date**: 2026-01-28
- **Status**: Active
---
## Quando Usar
- Criar lead, customer, proposal, estimate
- Pesquisar entidades CRM
- Converter lead para customer
- Operações que envolvem orçamentos/propostas
- Qualquer operação que pode criar duplicados
## Quando NÃO Usar
- Para desenvolvimento WordPress (usar /wp-dev)
- Para criar orçamentos completos (usar /orcamento)
- Para análise de leads (usar /lead-approach)
---
## DEFINIÇÕES CRÍTICAS
### Lead vs Customer
| Aspecto | LEAD | CUSTOMER |
|---------|------|----------|
| **O que é** | Contacto inicial, prospect | Cliente com relação comercial |
| **Quando usar** | Primeiro contacto, ainda a avaliar | Após qualificação, vai comprar |
| **Tabela** | `tblleads` | `tblclients` + `tblcontacts` |
| **Recebe** | Proposals (orçamentos) | Estimates, Invoices |
| **Conversão** | Pode virar Customer | Já é cliente |
**REGRA:** Novos contactos são SEMPRE leads primeiro. Só se tornam customers após qualificação.
### Proposal vs Estimate
| Aspecto | PROPOSAL (Orçamento) | ESTIMATE |
|---------|---------------------|----------|
| **Para quem** | **LEADS** (prospects) | **CUSTOMERS** (clientes) |
| **Quando usar** | Utilizador pede "orçamento" | Cliente existente, pedido formal |
| **Tabela** | `tblproposals` | `tblestimates` |
| **Converte para** | Nada (lead vira customer primeiro) | Invoice directamente |
| **Termo PT** | **Orçamento, Proposta** | Estimativa |
> **IMPORTANTE:** Quando o utilizador pede um "orçamento", usar **PROPOSAL** (para leads).
> Estimates são para clientes já existentes com pedidos formais.
### Fluxo Comercial Correcto
```
┌─────────────────────────────────────────────────────────────────────┐
│ FLUXO COMERCIAL PERFEX │
└─────────────────────────────────────────────────────────────────────┘
LEAD CUSTOMER
│ │
▼ ▼
PROPOSAL ──────────────────────▶ ESTIMATE
(orçamento) converter lead (formal)
│ para customer │
│ │ ▼
│ │ INVOICE
│ │ │
└───────────────┴──────────────────┘
PAYMENT
```
**Resumo:**
- Lead + Orçamento = **Proposal**
- Customer + Orçamento formal = **Estimate**
- Estimate aceite = **Invoice**
---
## Protocolo
### REGRA 0: NUNCA CRIAR SEM VERIFICAR (CRÍTICA)
> **PROIBIDO criar Lead ou Customer sem verificar se já existe.**
Esta regra é INVIOLÁVEL. Mesmo que o utilizador peça para criar, PRIMEIRO:
```
1. Pesquisar em LEADS: get_leads() + filtrar por nome/email/empresa
2. Pesquisar em CUSTOMERS: search_customers(termo)
3. SE encontrar match:
- MOSTRAR resultados ao utilizador
- PERGUNTAR: "Encontrei [X]. É este ou criar novo?"
4. SE não encontrar:
- PERGUNTAR: "Não encontrei [Nome]. Confirmas criação?"
5. SÓ CRIAR após confirmação explícita
```
**Violação desta regra causa duplicados que prejudicam operações comerciais.**
### REGRA 1: VERIFICAR DUPLICADOS (Detalhado)
ANTES de criar QUALQUER entidade (Lead, Customer, Proposal, Estimate):
1. Pesquisar por nome/email/empresa:
- `search_customers` para clientes
- `get_leads` com filtro search para leads
2. Se match encontrado: MOSTRAR ao utilizador
3. Se match parcial: PERGUNTAR se é o mesmo
4. Se sem match: PERGUNTAR confirmação antes de criar
### REGRA 2: CONFIRMAR ANTES DE CRIAR
NUNCA criar entidade sem confirmação EXPLÍCITA:
- Lead: "Não encontrei este contacto. Criar lead [Nome] com email [Email]?"
- Customer: "Criar cliente [Empresa]? (ACÇÃO IRREVERSÍVEL - só para clientes qualificados)"
- Proposal: "Criar orçamento para lead [Nome] no valor de [X]?"
- Estimate: "Criar estimativa formal para cliente [Empresa] no valor de [X]?"
### REGRA 3: MODELO DE DADOS PERFEX
| Regra | Descrição |
|-------|-----------|
| Email em tblcontacts | Email do cliente está em tblcontacts, NÃO em tblclients |
| userid é o ID | Usar `userid` para clientes, não `customer_id` |
| Contacto principal | `is_primary = 1` para contacto principal |
| Source obrigatório | Leads precisam de source_id (buscar default) |
| Itens em tblitemable | Todos os itens (estimate, invoice, proposal) usam `tblitemable` com `rel_type` |
| rel_type para items | 'estimate', 'invoice', 'proposal', 'credit_note' |
## Comandos
| Comando | Descrição |
|---------|-----------|
| `/crm-ops search <termo>` | Pesquisa unificada em leads + customers |
| `/crm-ops lead create` | Criar lead COM verificação de duplicados |
| `/crm-ops lead convert <id>` | Converter lead em customer |
| `/crm-ops customer create` | Criar customer COM confirmação obrigatória |
| `/crm-ops estimate create` | Criar estimate COM validação cliente |
| `/crm-ops status` | Mostrar códigos de status |
## Fluxos Detalhados
### Criar Lead
```
1. Receber dados do lead (nome, email, empresa)
2. search_customers(email/nome)
3. get_leads(search=email/nome)
4. SE match encontrado:
- Mostrar resultados
- Perguntar: "Usar existente ou criar novo?"
5. SE criar novo:
- Buscar source default se não fornecido
- create_lead
6. Retornar ID do lead criado
```
### Converter Lead para Customer
```
1. Verificar lead existe: get_lead(lead_id)
2. Mostrar dados do lead ao utilizador
3. Perguntar: "Converter lead X para cliente?"
4. SE confirmado:
- convert_lead_to_customer
- Notas são transferidas automaticamente
5. Retornar ID do novo cliente
```
### Criar Customer (SEM lead)
```
1. SEMPRE perguntar confirmação ao utilizador
2. Verificar se existe lead para converter
- SE existe: usar convert_lead_to_customer
3. SE não existe lead:
- search_customers para verificar duplicados
- Confirmar criação
- create_customer
```
### Criar Estimate
```
1. Identificar cliente (perguntar se não especificado)
2. get_customer para verificar se existe
- SE não existe: PARAR, NÃO criar customer automaticamente
- Perguntar se deve criar customer primeiro
3. Confirmar itens e valores com utilizador
4. create_estimate
5. Perguntar se deve enviar: send_estimate
```
### Criar Proposal (Suporta Lead OU Customer)
> **CORRIGIDO v3.5.3:** Proposals agora suportam leads directamente.
```
1. Identificar se é Lead ou Customer
2. Usar o parâmetro correcto:
- Lead: create_proposal(lead_id=204, subject="...")
- Customer: create_proposal(client_id=42, subject="...")
3. NÃO usar ambos parâmetros (um OU outro)
```
### Editar Proposal
```
1. Obter proposal_id
2. update_proposal(proposal_id=X, subject="...", status=2)
```
**Status de Proposal:**
- 1 = Draft
- 2 = Sent
- 3 = Open
- 4 = Revised
- 5 = Declined
- 6 = Accepted
### Adicionar Itens a Proposal (v3.5.4)
```
1. Preparar array de itens com: description, qty, rate, unit, long_description
2. Chamar add_proposal_items:
add_proposal_items(
proposal_id=78,
clear_existing=true, // opcional: limpar itens anteriores
items=[
{ description: "Serviço X", qty: 1, rate: 500, unit: "un" },
{ description: "Horas Dev", qty: 10, rate: 60, unit: "hora" }
]
)
3. Total da proposta é actualizado automaticamente
```
### Listar Itens de Proposal
```
get_proposal_items(proposal_id=78)
```
Retorna lista de itens com quantidade, valor e total calculado.
### Converter Estimate para Invoice
```
1. get_estimate para verificar status
2. SE status != 4 (Aceite): PARAR e informar
3. Confirmar com utilizador
4. convert_estimate_to_invoice
5. Retornar ID da nova factura
```
## Status Codes
### Estimates
- 1 = Rascunho
- 2 = Enviado
- 3 = Visto
- 4 = Aceite (pode converter)
- 5 = Recusado
- 6 = Expirado
### Proposals
- 1 = Draft
- 2 = Sent
- 3 = Open
- 4 = Revised
- 5 = Declined
- 6 = Accepted
### Invoices
- 1 = Unpaid
- 2 = Paid
- 3 = Partially Paid
- 4 = Overdue
## MCP Tools
### Leads
- get_leads - Listar leads com filtros
- create_lead - Criar lead
- update_lead - Actualizar lead
- convert_lead_to_customer - Converter para cliente
- lead_scoring - Pontuar lead
- lead_analytics - Métricas
### Customers
- get_customers - Listar clientes
- get_customer - Detalhes cliente
- create_customer - Criar cliente
- search_customers - Pesquisa multi-campo
- update_customer - Actualizar
- delete_customer - Eliminar
- manage_customer_contacts - Gerir contactos
- create/get/update/delete_customer_note - Notas
### Estimates
- get_estimates - Listar orçamentos
- get_estimate - Detalhes
- create_estimate - Criar orçamento
- update_estimate - Actualizar
- send_estimate - Marcar como enviado
- convert_estimate_to_invoice - Converter para factura
- estimate_analytics - Métricas
### Proposals
- get_proposals - Listar propostas
- create_proposal - Criar proposta (suporta lead_id OU client_id)
- update_proposal - Editar proposta existente
- add_proposal_items - Adicionar itens/linhas a proposta
- get_proposal_items - Listar itens de uma proposta
- proposal_builder - Construtor interactivo
- proposal_analytics - Métricas
## Anti-Patterns (NUNCA fazer)
### Criação sem Verificação (CRÍTICO)
1. **NUNCA** criar lead sem pesquisar se já existe
2. **NUNCA** criar customer sem pesquisar se já existe
3. **NUNCA** assumir que entidade não existe - verificar SEMPRE
### Confusão de Entidades
4. Criar customer quando devia ser lead (novos contactos = leads)
5. Usar estimate para leads (usar proposal)
6. Usar proposal para customers qualificados (usar estimate)
7. Criar customer automaticamente para associar estimate
### Erros Técnicos
8. Converter estimate não-aceite para invoice
9. Aceder a email directamente em tblclients (usar JOIN com tblcontacts)
10. Usar tabelas inventadas (ex: tblitems_in) - verificar schema real primeiro
### Terminologia
- Utilizador diz "orçamento" para lead → usar **PROPOSAL**
- Utilizador diz "orçamento" para cliente existente → usar **ESTIMATE**
## Exemplos
### Exemplo 1: Criar lead com verificação
```
User: /crm-ops lead create nome="João Silva" email="joao@example.com"
→ Pesquisa em leads e customers
→ Não encontra duplicado
→ Pergunta: "Não encontrei João Silva. Confirmas criação?"
→ User: Sim
→ Cria lead #215
→ Confirma: "Lead #215 criado com sucesso"
```
### Exemplo 2: Detectar duplicado
```
User: /crm-ops customer create empresa="TechStart Lda"
→ Pesquisa customers
→ Encontra match: TechStart Lda (#42)
→ Mostra: "Encontrei TechStart Lda (#42). É este ou criar novo?"
→ User: É esse
→ Retorna dados do cliente existente
```
### Exemplo 3: Proposal para lead
```
User: Criar orçamento para lead João Silva
→ Verifica que é lead (não customer)
→ Usa create_proposal(lead_id=215)
→ Adiciona itens via add_proposal_items
→ Confirma: "Proposal #78 criada para lead #215"
```
## Checklist Pré-Operação
- [ ] Verificar duplicados
- [ ] Confirmar com utilizador
- [ ] Validar campos obrigatórios
- [ ] Usar source/status default se não fornecido
- [ ] Mostrar resultado da operação
## Integração
- **MCP:** desk-crm-v3
- **Procedimento:** [[PROC-CRM-Operacoes]]
- **CLAUDE.md:** Secção "CRM (Perfex/DeskCRM)"
## Changelog
### v1.2.0 (2026-01-28)
- **REGRA 0** adicionada: NUNCA criar lead/customer sem verificar existência
- Secção "DEFINIÇÕES CRÍTICAS" com distinção clara:
- Lead vs Customer (tabela comparativa)
- Proposal vs Estimate (tabela comparativa)
- Diagrama de fluxo comercial actualizado
- "Orçamento" = Proposal (para leads), não Estimate
- Anti-patterns reorganizados por categoria
- Terminologia PT clarificada
### v1.1.0 (2026-01-28)
- Adicionadas ferramentas de itens: add_proposal_items, get_proposal_items
- Documentado padrão tblitemable para itens de documentos
- Adicionados novos anti-patterns (tabelas inventadas, proposals vs estimates)
- Fluxo completo para adicionar itens a proposals
- Actualizada lista de MCP tools para proposals
### v1.0.0 (2026-01-28)
- Versão inicial completa
- Fluxo comercial documentado
- Regras de verificação
- Status codes
- Integração com MCP desk-crm-v3
### v0.1.0 (2026-01-28)
- Estrutura inicial da skill
- Definição de comandos e fluxos
---
**Criado:** 2026-01-28
**Actualizado:** 2026-01-28
**Motivo:** Prevenção de erros CRM após incidente de duplicação
+18
View File
@@ -306,6 +306,24 @@ Skills descontinuadas:
- Distinção Lead vs Customer - Distinção Lead vs Customer
- Proposal vs Estimate - Proposal vs Estimate
---
## Self-Healing
Antes de executar, ler `~/.claude-work/healing/crm.jsonl` (se existir). Cada linha é um padrão de erro conhecido:
```json
{"date":"YYYY-MM-DD","issue":"descrição do problema","fix":"como evitar","source":"user|auto"}
```
Se encontrares um padrão relevante ao contexto actual, aplica o fix preventivamente. Após cada erro ou correcção do utilizador nesta skill, **adicionar nova linha** ao healing log com o padrão aprendido.
--- ---
*Skill v2.0.0 | 2026-02-05 | Descomplicar®* *Skill v2.0.0 | 2026-02-05 | Descomplicar®*
## Healing Log
<!-- Registo automático de erros e correcções nesta skill -->
+18
View File
@@ -235,6 +235,24 @@ Ao entrar numa pasta:
### v1.0.0 ### v1.0.0
- Versão inicial - Versão inicial
---
## Self-Healing
Antes de executar, ler `~/.claude-work/healing/desk.jsonl` (se existir). Cada linha é um padrão de erro conhecido:
```json
{"date":"YYYY-MM-DD","issue":"descrição do problema","fix":"como evitar","source":"user|auto"}
```
Se encontrares um padrão relevante ao contexto actual, aplica o fix preventivamente. Após cada erro ou correcção do utilizador nesta skill, **adicionar nova linha** ao healing log com o padrão aprendido.
--- ---
*Skill v3.0.0 | 2026-02-05 | Descomplicar®* *Skill v3.0.0 | 2026-02-05 | Descomplicar®*
## Healing Log
<!-- Registo automático de erros e correcções nesta skill -->
+174
View File
@@ -0,0 +1,174 @@
---
name: estrategia-marca
description: Cria estratégias de marca completas seguindo a metodologia Descomplicar® (ACIDA + Framework 16Ps). Inclui fase de pesquisa de mercado com /deep-research antes do briefing. Guia a análise de público, posicionamento, Pitch Canvas, copywriting e documento final entregável. Usar quando o utilizador diz "estratégia de marca", "branding", "criar marca", "posicionamento", "16Ps", "/estrategia-marca", "análise de público", "narrativa de marca", "proposta de valor", "pitch canvas", "pain + gain", "copywriting estratégico", "identidade de marca", "pesquisa de mercado para marca", ou quando um cliente adquire o serviço EST-MRK-010.
---
# Skill: Estratégia de Marca
Guia completo para criar estratégias de marca Descomplicar® — da pesquisa de mercado ao documento final entregável.
---
## Fluxo de trabalho (8 fases)
### Fase 0 — Pesquisa de mercado
Antes do briefing com o cliente, fazer pesquisa independente. Verificar primeiro se já existem ficheiros de pesquisa (ex: pasta `Pesquisas/` no projecto).
**Se a pesquisa já existe:** ler os ficheiros relevantes e extrair síntese.
**Se não existe:** usar `/deep-research` (ou `mcp__tavily__tavily_research`) com os seguintes focos:
1. **Mercado/sector** — dimensão, crescimento, tendências, regulação
2. **Concorrentes** — posicionamento, mensagens, pricing, pontos fracos
3. **Público** — linguagem online, canais activos, dores expressas em fóruns/reviews
4. **Oportunidades** — gaps de mercado, tendências emergentes não exploradas
Guardar síntese em `Pesquisas/sintese-mercado.md` no projecto do cliente.
**Resultado esperado:** chegar ao briefing já com hipóteses validadas sobre o mercado e o público — não para impor, mas para fazer perguntas mais certeiras e poupar tempo ao cliente.
### Fase 1 — Activação e contexto
Ao iniciar, perguntar:
- Qual o nome do cliente/marca?
- Já existe briefing ou material de partida?
- Qual o sector/indústria?
- Temos exemplos de concorrentes?
Se existir projecto no Desk CRM, verificar com `get_project` antes de prosseguir.
### Fase 2 — Briefing estruturado
Conduzir entrevista com as perguntas de `references/perguntas-briefing.md`.
Organizar por blocos:
1. Negócio (problema, serviços, mercado)
2. Público-alvo (segmentos identificados)
3. Posicionamento actual vs desejado
4. Tom de voz e personalidade
5. Concorrência e diferenciação
### Fase 3 — Fundamentos estratégicos
Desenvolver com o cliente:
- **Proposta de valor única** — o que nos torna únicos, diferenciais, benefícios por camada
- **Missão, Visão, Valores e Objectivos** — com exemplos de como se manifestam na prática
- **Apresentação sumária** — empresa + serviços com tabela clara
- **Posicionamento** — declaração de posicionamento testável
Ver `references/framework-16ps.md` → Bloco A para questões orientadoras.
### Fase 4 — Análise de público (20 pontos por segmento)
**Obrigatório:** Antes dos segmentos psicográficos, identificar os nichos sectoriais relevantes para o produto. Usar `references/nichos.md` para seleccionar e analisar **pelo menos 5 nichos específicos** (ex: clínicas de saúde, imobiliárias, agências digitais — não "PMEs" como categoria vaga). Para cada nicho preencher os 8 pontos do guia de análise sectorial. Cruzar com os 20 pontos psicográficos abaixo para construir personas completas.
Para cada segmento identificado, desenvolver os 20 pontos na seguinte ordem:
1. Perfil Demográfico
2. Perfil Psicográfico
3. Dores
4. Anseios
5. Desejos
6. Frustrações
7. Preocupações
8. Medos
9. Inimigos
10. Linguagem
11. Como procuram ajuda/informação/dicas
12. Canais digitais activos
13. Estilo de Decisão
14. Mudanças (que sabem necessárias)
15. Resistência à mudança
16. Objecções típicas (+ como ultrapassar)
17. Forma de gerar emoção
18. Argumentos (a que são mais sensíveis)
19. Concorrentes (que alternativas avaliam)
20. Propostas Recusadas (e porquê)
Ver `references/metodologia-acida.md` para contexto e profundidade em cada ponto.
### Fase 5 — Pitch Canvas
Estrutura de 5 elementos:
- **Para quem:** segmento + problema específico
- **O problema:** dor principal na linguagem do cliente
- **A solução:** mecanismo único de resolução
- **O resultado:** transformação concreta (antes/depois + métrica)
- **Por que nós:** razão para acreditar
Criar também a **Declaração de mudança no mundo** — frase que resume o impacto maior da marca.
### Fase 6 — Copywriting estratégico
Sequência obrigatória:
1. **Questionamento estratégico** — Qual é o objectivo da comunicação? Que transformação prometemos?
2. **Pain + Gain** — formulação problema/resultado na linguagem do cliente; depois refinar com especificidades do sector
3. **Narrativa por segmento** — fórmula: Problema (dor do público) → Solução (serviços) → Resultado (benefícios concretos)
4. **Mensagem central** — 1 frase que toda a equipa sabe de cor
5. **Headlines** — por segmento (principal + secundária)
Ver `references/narrativas-copywriting.md` para templates e exemplos reais.
### Fase 7 — Documento final + Investimentos
Completar as secções finais:
- **Demonstração dos serviços** — como demonstrar, preparação, follow-up
- **Investimentos prioritários** — canais, orçamento, ROI esperado
- **KPIs** — baseline + metas a 3m, 6m, 12m
- **Inventário de activos** — o que existe, estado, prioridade
Ver `references/template-documento.md` para a estrutura completa do documento.
**Checklist de entrega:**
- [ ] Pesquisa de mercado feita (Fase 0)
- [ ] Proposta de valor única definida
- [ ] Missão, Visão, Valores escritos
- [ ] Apresentação sumária da empresa e serviços
- [ ] Mínimo 5 nichos sectoriais analisados (8 pontos cada) — ver `references/nichos.md`
- [ ] Mínimo 2 segmentos psicográficos com 20 pontos completos
- [ ] Pitch Canvas preenchido
- [ ] Declaração de mudança no mundo
- [ ] Pain + Gain (original + refinado)
- [ ] Narrativa por segmento (Problema → Solução → Resultado)
- [ ] Mensagem central definida
- [ ] Investimentos prioritários identificados
- [ ] KPIs definidos com metas
---
## Referências (carregar conforme necessário)
| Ficheiro | Quando carregar |
|----------|----------------|
| `references/metodologia-acida.md` | Fases 3-4: ACIDA, 20 pontos por segmento |
| `references/framework-16ps.md` | Fase 3: fundamentos estratégicos (Bloco A) |
| `references/perguntas-briefing.md` | Fase 2: conduzir entrevista cliente |
| `references/narrativas-copywriting.md` | Fase 6: copywriting, Pain+Gain, narrativas |
| `references/template-documento.md` | Fase 7: estrutura completa do documento |
| `references/nichos.md` | Fase 4: análise sectorial dos 10 nichos PT/EU (mínimo 5 obrigatórios) |
---
## Contexto do serviço
- **Código:** EST-MRK-010
- **Preço:** 900 EUR
- **Prazo médio:** 30h de trabalho
- **Entregáveis:** Documento estratégico completo, dashboard personas, narrativa de marca, apresentação executiva editável, guia de implementação, sessão de alinhamento com equipa
- **Suporte pós-entrega:** WhatsApp 1 mês
Complementar com Branding WOW (BRAND-ESS/DIG/COM: 1.8004.500 EUR) se o cliente precisar de identidade visual.
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
@@ -0,0 +1,193 @@
# Framework 16Ps — Referência Completa
Estrutura os 16 elementos da estratégia de marca em 4 blocos. Para cada P, incluir as questões orientadoras ao preencher.
---
## Bloco A — Fundamentos estratégicos
### P1: Problema
> Qual o problema principal que a marca resolve?
- Problema de negócio que a estratégia precisa resolver
- Impacto desse problema no cliente (custo, tempo, risco, reputação)
- Urgência da solução: por que resolver agora?
- Consequências de não resolver
*Exemplo SFV:* "Facturas de electricidade crescentes que consomem margens das empresas e rendimento das famílias, sem solução acessível percebida."
### P2: Propósito
> Por que existe esta marca além do lucro?
- **Missão:** o que fazemos e para quem (hoje)
- **Visão:** onde queremos chegar (3-5 anos)
- **Valores:** 3-5 valores fundamentais com descrição de como se manifestam
- **Propósito:** impacto no mundo que justifica a existência da marca
*Estrutura valores:* [Nome do Valor] — [Como se manifesta na prática]
### P3: Proposta de Valor
> O que tornamos possível que os concorrentes não conseguem?
- Valor único que só esta marca entrega
- Diferenciais competitivos (lista)
- Benefícios principais (funcionais + emocionais)
- Formula: Para [segmento], que [dor/desejo], a [marca] oferece [solução] que [resultado único], ao contrário de [alternativa], porque [razão para acreditar]
### P4: Posicionamento
> Que lugar específico ocupa na mente do cliente?
- Posição actual no mercado (percepção real)
- Posição desejada (percepção target)
- Declaração de posicionamento (1-2 frases)
- Território da marca: categoria, concorrência directa, diferenciação
- Atributos únicos que definem esse território
*Declaração-tipo:* "Para [público], somos a única [categoria] que [benefício único] porque [prova]."
### P5: Performance
> Como medimos o sucesso?
- KPIs principais (5-7 métricas)
- Metas específicas a 3, 6 e 12 meses
- Indicadores de sucesso por área (brand awareness, conversão, satisfação)
- Frequência de monitorização e responsável
---
## Bloco B — Público e pesquisa
### P6: Público-alvo
> Quem são exactamente os nossos clientes?
- Segmento principal + segmentos secundários
- Critérios de segmentação (demográficos, comportamentais, psicográficos)
- Volume estimado de cada segmento
- Comportamento de compra: frequência, ticket médio, canal preferido
### P7: Pesquisa de mercado
> Que dados sustentam as nossas decisões?
- Dados de mercado: dimensão, crescimento, tendências
- Insights de comportamento do consumidor
- Oportunidades identificadas (não aproveitadas pela concorrência)
- Ameaças e riscos do mercado
### P8: Personas
> Quem é o nosso cliente ideal em detalhe?
Para cada persona:
- **Foto + nome fictício + idade + profissão**
- **Biografia resumida** (um dia típico)
- **Dores principais** (3-5)
- **Objectivos** (profissionais + pessoais)
- **Canais preferidos** (onde está, o que consome)
- **Citação representativa** ("Eu quero/preciso/temo...")
- **Frase de posicionamento** para esta persona
### P9: Perfil
> Quais as características quantificáveis de cada segmento?
Análise de 20 pontos por segmento (ver template completo em `template-documento.md`):
- Demográfico: idade, género, localização, rendimento, educação, sector, cargo, empresa
- Comportamental: rotina, hábitos, processo de decisão, critérios de escolha
- Psicográfico: valores, aspirações, mentalidade, atitude à inovação
- Jornada: awareness, consideração, decisão
### P10: Pain Points
> Quais as dores mais urgentes e dolorosas?
- Dores principais (urgentes, que precisam resolver já)
- Frustrações (já tentaram outras soluções sem resultado)
- Necessidades não atendidas (o mercado não resolve bem)
- Medos relacionados com a compra ou com não comprar
---
## Bloco C — Produto e serviço
### P11: Portfolio
> O que vendemos exactamente?
- Lista de produtos/serviços principais
- Características técnicas vs benefícios percebidos
- Arquitectura de oferta: entrada, core, premium
- Casos de uso reais (exemplos concretos de aplicação)
### P12: Preço e valor
> Como justificamos o que cobramos?
- Estratégia de preços (custo+margem, valor percebido, concorrência, freemium)
- Posicionamento de valor: acessível, médio-alto, premium, luxo
- Política comercial: descontos, bundles, condições de pagamento
- ROI estimado para o cliente (quanto ganha/poupa ao escolher-nos)
### P13: Processos críticos
> Que processos garantem a experiência prometida?
- Processo de entrega do serviço/produto (passo a passo)
- Pontos de controlo de qualidade
- Garantias e políticas de satisfação
- Gestão de reclamações
### P14: Parcerias estratégicas
> Com quem nos aliamos para ampliar valor?
- Parceiros principais (nome, tipo, contribuição)
- Tipos de parceria: distribuição, tecnologia, referência, co-marketing
- Benefícios mútuos de cada parceria
- Parcerias a desenvolver (gap de oportunidade)
### P15: Plataforma
> Onde operamos digitalmente?
- Canais digitais activos: website, redes sociais, marketplaces, apps
- Presença online actual vs ideal
- Infraestrutura tecnológica (CRM, email, analytics, automação)
- Prioridades de investimento digital
---
## Bloco D — Promoção e comunicação
### P16: Promoção
> Como chegamos ao público-alvo?
- Canais principais com objectivos específicos por canal
- Tácticas específicas (conteúdo, SEO, email, WhatsApp, eventos)
- Calendário promocional (frequência, momentos-chave)
- Budget orientativo por canal
### P17: Publicidade
> Como amplificamos com investimento pago?
- Estratégia de anúncios: plataformas, formato, objectivo
- Budget mensal e distribuição
- KPIs de publicidade (CPL, ROAS, CPA)
- Frequência e ciclo de renovação de criativos
### P18: PR e referências
> Como construímos credibilidade externa?
- Estratégia de relações públicas
- Parcerias com influenciadores (relevância > alcance)
- Imprensa e media especializada
- Programa de referências/embaixadores
### P19: Presença digital
> Qual a nossa estratégia de conteúdo?
- Estratégia de conteúdo por canal
- Frequência de publicação
- Pilares de conteúdo (3-5 temas centrais)
- Gestão de comunidade: resposta, engagement, moderação
### P20: Proximidade — narrativa e impacto
> Que história contamos que ressoa emocionalmente?
- **Declaração de Impacto:** frase que resume a essência e impacto da marca
- **Narrativa principal:** história de origem ou transformação
- **Pain + Gain por segmento:** o que perdiam antes → o que ganham agora
- **Mensagem central:** 1 frase que todos os colaboradores sabem de cor
*Nota: O "Bloco D" tem 5 Ps numerados de 16 a 20 — alguns documentos listam apenas 16 Ps no total (agrupando Promoção, Publicidade e PR num único P). Adaptar conforme o nível de detalhe necessário.*
@@ -0,0 +1,127 @@
# Metodologia ACIDA — Referência Completa
## 1. As 5 fases ACIDA
### A — Atrair atenção
O público está sobrecarregado de informação. A forma correcta de chamar a atenção não é destacar produtos — é conectar com o que emocionalmente mais interessa ao público: **as suas próprias dores e desejos**.
Acções práticas:
- Headlines que falam directamente da dor ou desejo do segmento
- Conteúdo que provoca reconhecimento imediato ("é exactamente o meu problema")
- Formatos visuais que param o scroll: vídeo curto, imagem disruptiva, estatística chocante
### C — Construir confiança
Após conquistar atenção, estabelecer relacionamentos autênticos através de:
- Transparência, honestidade e autenticidade na comunicação
- Demonstrar compreensão profunda das dores e desejos do cliente
- Partilhar conhecimento e experiência profissional abertamente
- Educar o público para decisões mais informadas
- Estabelecer autoridade que permite influenciar percepções
Formatos: artigos de blog, estudos de caso, testemunhos, webinars, guias gratuitos.
### I — Despertar interesse
Com confiança estabelecida, a comunicação torna-se altamente personalizada.
> "Não vendemos produtos nem serviços; oferecemos soluções específicas para os seus desafios."
Ferramentas:
- Rastreamento de interacções para identificar segmentos de clientes
- Conteúdo customizado baseado em comportamentos anteriores
- Resolução antecipada de objecções conhecidas
- Nutrição de relacionamentos via email, WhatsApp, SMS, redes sociais
### D — Estimular a decisão
A decisão será favorável se o **valor percebido > preço a pagar**.
Obstáculos a superar:
- O "muro invisível" criado por dúvidas do consumidor
- Medo do arrependimento pós-compra
- Necessidade de prova social e garantias sólidas
Ferramentas: comparações, garantias, testemunhos de clientes reais, demonstrações, ROI calculado.
### A — Incentivar a acção
Converter interesse em acção através de:
- Chamadas à acção (CTA) claras e convincentes
- Criação de sentido de urgência (real, não artificial)
- Cumprimento de promessas
- Superação de expectativas na experiência do cliente
---
## 2. Análise do público-alvo — 8 dimensões
Para cada segmento, investigar as 8 dimensões antes de escrever qualquer copy:
### Dimensão 1: Perfil demográfico e psicográfico
- Características mensuráveis: idade, género, localização, rendimento, educação, cargo
- Traços de personalidade: valores, crenças, atitudes, estilo de vida
- *Pergunta-chave: "Quem é esta pessoa na vida real?"*
### Dimensão 2: Dores, desejos e frustrações
- Dores activas: problemas que precisam resolver agora
- Desejos: o que querem alcançar/ter/ser
- Frustrações: o que já tentaram e não funcionou
- *Pergunta-chave: "O que os mantém acordados à noite? O que sonham?"*
### Dimensão 3: Preocupações e geração de emoção
- O que os preocupa a médio/longo prazo
- Como a nossa marca pode responder emocionalmente (não apenas racionalmente)
- *Pergunta-chave: "Que emoção queremos que sintam quando nos encontram?"*
### Dimensão 4: Medos, inimigos e mudanças
- Medos concretos (perder negócio, ser enganado, falhar)
- "Inimigos" percebidos (concorrentes, reguladores, tendências de mercado)
- Mudanças que temem ou resistem
- *Pergunta-chave: "O que os impede de agir?"*
### Dimensão 5: Anseios, interesses e linguagem
- O que aspiram a ser/ter/fazer
- Interesses e hobbies (pistas para onde comunicar)
- Linguagem que usam (jargão do sector, palavras que ressoam vs que afastam)
- *Pergunta-chave: "Como falam entre si? Que palavras usam?"*
### Dimensão 6: Pesquisa de informação e influenciadores
- Onde procuram informação (Google, YouTube, LinkedIn, feiras, colegas)
- A quem pedem conselho (influenciadores, peers, família)
- Fontes que consideram credíveis
- *Pergunta-chave: "Como encontraram a nossa categoria de produto/serviço?"*
### Dimensão 7: Dúvidas e perguntas
- Objecções previsíveis antes da compra
- Perguntas que fazem nas reuniões de vendas
- Informação que precisam para decidir
- *Pergunta-chave: "Quais as 5 objecções mais frequentes?"*
### Dimensão 8: Estilo de decisão e concorrentes
- Processo de decisão: individual vs colectivo, rápido vs lento
- Factores comparativos: preço, qualidade, confiança, referências
- Concorrentes directos que avaliam em paralelo
- *Pergunta-chave: "Com quem nos comparam? Por que nos escolhem ou não?"*
---
## 3. Pilares estratégicos ACIDA
- **Crença central:** o centro do marketing digital são os princípios fundamentais de marketing + website — não as redes sociais
- **Proposta de valor:** "Criamos Resultados" — problema → solução → resultados esperados
- **Website como hub central:** não repositório, mas centro operacional integrado com CRM
- **Ecossistema multi-canal:** email, SMS/WhatsApp, SEO, Google/Meta Ads, website, redes sociais (como parte, não como centro)
- **Melhoria contínua:** métricas objectivas → ciclo iterativo baseado em dados
---
## 4. ACIDA 2.0 — Fases operacionais
| Fase | Acções |
|------|--------|
| **1. Análise** | Segmentação público, posicionamento, estruturação oferta, montagem narrativa |
| **2. Criação** | Recursos, copywriting e design, website e plataformas, automação |
| **3. Implementação** | Conteúdos e canais, blog e email marketing, redes sociais, marketplaces |
| **4. Desenvolvimento** | Funil de vendas, tráfego e anúncios, conteúdos, newsletters |
| **5. Acompanhamento** | Gestão de resultados, métricas e KPIs, optimização contínua, suporte |
@@ -0,0 +1,154 @@
# Narrativas e Copywriting Estratégico
Templates e exemplos reais de narrativas Descomplicar®. Baseados nos projectos SFV, LJM, MCT e Espiral Senior.
---
## 1. Fórmula central: Dor → Solução → Resultado
Estrutura base para qualquer narrativa por segmento:
```
DOR: [Nome do segmento] enfrenta [problema específico e urgente].
Sem solução, [consequência negativa concreta].
SOLUÇÃO: [Nome da marca] resolve isto através de [mecanismo único].
[Diferencial que os concorrentes não têm].
RESULTADO: O resultado é [benefício tangível e mensurável].
[Prova social ou garantia que aumenta credibilidade].
```
**Exemplo SFV (segmento Empresas):**
> Dor: As PMEs enfrentam facturas de electricidade crescentes que consomem margens já apertadas.
> Solução: A SFV instala painéis solares personalizados com análise de consumo prévia — sem adiantamento para projectos qualificados.
> Resultado: Redução de 60-90% na factura eléctrica, com ROI em 4-7 anos e garantia de 25 anos nos painéis.
**Exemplo MCT (segmento Oficinas):**
> Dor: Mecânicos perdem tempo e dinheiro com ferramentas que chegam erradas, incompletas ou que avariam em obra.
> Solução: A Carritools fornece equipamento profissional com assessoria técnica presencial e substituição imediata em caso de avaria.
> Resultado: Menos tempo parado, mais trabalhos concluídos, clientes mais satisfeitos.
---
## 2. Declaração de Impacto
Uma frase poderosa que abre o documento e resume a essência da marca. Deve:
- Ser memorável (10-15 palavras máximo)
- Combinar emoção + resultado
- Não ser genérica ("líderes de mercado", "qualidade e inovação")
**Exemplos reais:**
| Cliente | Declaração de Impacto |
|---------|----------------------|
| SFV Solar | "Energia (quase) Grátis para Famílias e Empresas" |
| Espiral Senior | "Envelhecer em Dignidade, no Lugar que Mais Ama" |
| Descomplicar® | "Criamos Resultados!" |
**Fórmulas para gerar Declaração de Impacto:**
- `[Verbo de transformação] + [benefício desejado] + [para quem]`
- `[Adjectivo emocional] + [resultado concreto]`
- `[Benefício surpreendente] + [para quem] + [sem o custo habitual]`
---
## 3. Mensagens-chave por tipo de segmento
### Segmento decisor (CEO/Gerente)
Foco: ROI, risco reduzido, credibilidade, tempo poupado.
Template:
> "Mais de [N] empresas como a sua já [resultado]. A nossa abordagem garante [benefício financeiro] em [prazo], com [garantia específica]."
### Segmento utilizador final (técnico/operacional)
Foco: facilidade de uso, suporte, fiabilidade, não criar problemas.
Template:
> "Simples de implementar, sem interrupções ao seu trabalho. Em caso de dúvida, temos suporte [detalhe] para que nunca fique bloqueado."
### Segmento referenciador (parceiro/consultor)
Foco: credibilidade para recomendar, win-win, diferenciação para os seus clientes.
Template:
> "Ao recomendar [marca], está a oferecer aos seus clientes [resultado], o que reforça a sua autoridade como [cargo/papel]."
### Segmento influenciador (família/comunidade)
Foco: valores partilhados, impacto positivo, pertença.
Template:
> "Não é só [produto/serviço]. É uma escolha que [impacto maior]: [dimensão ambiental/social/familiar]."
---
## 4. Gestão de objecções — estrutura padrão
Para cada objecção, responder sempre com:
1. **Validar** — reconhecer que é uma preocupação legítima
2. **Reframeamento** — mudar o ângulo de análise
3. **Prova** — exemplo, dado ou testemunho que confirma
4. **CTA suave** — próximo passo de baixo compromisso
**Objecções universais e respostas tipo:**
| Objecção | Resposta base |
|----------|--------------|
| "É caro" | "Entendo a preocupação. O nosso preço reflecte [diferencial]. Clientes como [X] recuperaram o investimento em [prazo]. Posso mostrar-lhe o cálculo?" |
| "Preciso de pensar" | "Faz todo o sentido. O que precisa de esclarecer para se sentir confiante? Posso enviar [recurso específico] que costuma ajudar nesta fase." |
| "Já tentei algo parecido e não funcionou" | "Compreendo — essa experiência é frustrante. O que tipicamente falha é [causa]. A nossa abordagem resolve isto de forma diferente: [diferencial]." |
| "Não tenho tempo agora" | "Respeitamos o seu tempo. É por isso que o nosso processo começa com apenas [X horas], e tratamos nós de [trabalho pesado]." |
| "Preciso de aprovação interna" | "Claro. Posso preparar um resumo executivo de 1 página para facilitar a aprovação? Tenho feito isto para outros clientes com muito bom resultado." |
---
## 5. Tom de voz por personalidade de marca
### Marca especialista/técnica (ex: SFV, Carritools)
- Linguagem precisa, dados concretos, terminologia do sector
- Evitar: exageros sem prova, linguagem emocional excessiva
- Usar: casos reais, números, especificações, garantias técnicas
### Marca próxima/humana (ex: Espiral Senior, Loja da Maria)
- Linguagem calorosa, inclusiva, em 2ª pessoa
- Evitar: jargão técnico, distância corporativa
- Usar: histórias pessoais, empatia directa, linguagem do dia-a-dia
### Marca inovadora/disruptiva (ex: Descomplicar, SaaS)
- Linguagem energética, directa, com algum desafio ao status quo
- Evitar: clichés do sector, promessas vazias
- Usar: contraste antes/depois, resultados surpreendentes, "E se..."
---
## 6. Estrutura de testemunho ideal
Baseado nos testemunhos reais recolhidos nos projectos:
```
[Nome próprio + cargo + empresa] — [cidade, se relevante]
"[Frase de impacto espontânea que resume o resultado]"
Contexto: [Situação antes de contratar]
Resultado: [Mudança concreta e mensurável após]
Recomendação: [Indicação explícita para outros como ele]
```
**Exemplo real SFV:**
> "Ricardo Castelão, Director Financeiro, Empresa de Distribuição — Porto
> 'Reduzimos a nossa factura eléctrica em 73% no primeiro ano.'
> Contexto: Gastávamos 4.200 EUR/mês em electricidade, sem alternativa viável.
> Resultado: Passámos para 1.134 EUR/mês. O sistema pagou-se em 5,5 anos.
> Recomendação: Para qualquer empresa com consumo acima de 1.500 EUR/mês, é obrigatório analisar esta opção."
---
## 7. Headlines de alto impacto — padrões
Padrões que funcionam consistentemente nos projectos Descomplicar:
- **Resultado específico:** "Reduza a sua factura eléctrica em 70% sem investimento inicial"
- **Pergunta dor:** "Ainda a pagar [problema] quando existe solução comprovada?"
- **Autoridade + resultado:** "Como [N] empresas [resultado] com [solução]"
- **Contrafactual:** "E se a sua maior despesa se transformasse no seu maior activo?"
- **Urgência real:** "A [mudança de mercado/regulação] está a mudar tudo — [posição da marca]"
- **Social proof:** "Mais de [N] clientes em [região] já [resultado]"
@@ -0,0 +1,318 @@
# Análise de Nichos — Guia de Segmentação Sectorial
Para marcas com público PME, "PME" é demasiado vasto. Identificar os nichos sectoriais específicos permite mensagens certeiras, canais certos e ROI superior. Qualquer estratégia de marca deve analisar **pelo menos 5 nichos específicos** relevantes para o produto/serviço.
---
## Como usar este guia
1. Identificar os nichos onde o produto/serviço tem tracção real ou potencial
2. Para cada nicho seleccionado, preencher os 8 pontos de análise sectorial
3. Cruzar com os 20 pontos da análise de público (template-documento.md § 5) para o perfil completo
4. Priorizar os 3 nichos de maior potencial para messaging principal
---
## Os 8 pontos de análise por nicho
Para cada nicho, responder:
1. **Dimensão e contexto** — quantas empresas em PT/EU, crescimento do sector, maturidade digital
2. **Dores operacionais específicas** — o que os cansa no dia-a-dia (não genérico: específico do sector)
3. **Funcionalidades mais relevantes** — o que do produto resolve melhor o problema deste nicho
4. **Linguagem de venda** — palavras que usam, palavras que evitam, jargão do sector
5. **Canal de aquisição principal** — onde estão, como chegam ao produto
6. **Objecção principal** — o bloqueio mais frequente e como ultrapassar
7. **Trigger de compra** — o momento/evento que precipita a decisão
8. **Pricing sweet spot** — o que pagam por ferramentas similares, sensibilidade ao preço
---
## Os 10 nichos de PME mais relevantes (PT/EU)
### Nicho 1 — Saúde Privada
**Quem:** Clínicas dentárias, psicólogos, nutricionistas, fisioterapeutas, clínicas médicas privadas, terapeutas.
**Dimensão PT:** +12.000 clínicas e consultórios privados. Sector em crescimento pós-pandemia. Alta concentração em Lisboa, Porto e litoral.
**Dores operacionais:**
- Agenda manual ou em sistemas desactualizados (Doctoralia, papel)
- Falhas de consulta (no-shows) sem sistema de lembretes automatizado
- Secretaria sobrecarregada com marcações e confirmações por telefone
- Facturação em saúde com complexidade fiscal (isenção IVA, recibos verdes)
- RGPD em saúde: dados sensíveis com requisitos legais estritos
**Funcionalidades mais relevantes:** lembretes automáticos de consulta por WhatsApp/SMS, confirmação/cancelamento por WhatsApp, reagendamento automático, facturação PT com isenção IVA, base de conhecimento para FAQ de pacientes.
**Linguagem de venda:** "reduzir faltas à consulta", "libertar a secretária para o que importa", "pacientes confirmam pelo WhatsApp", "agenda sempre actualizada". Evitar: "automação", "IA", "bot".
**Canal de aquisição:** associações profissionais (OMD, Ordem dos Psicólogos), LinkedIn de gestores de clínica, referência entre profissionais de saúde, Google Ads ("software gestão clínica", "agenda online clínica").
**Objecção principal:** "Os meus pacientes são mais velhos e não usam WhatsApp." → Resposta: "O sistema funciona igualmente por SMS. E os cuidadores/filhos que marcam as consultas estão todos no WhatsApp."
**Trigger de compra:** crescimento de lista de espera que a secretária já não consegue gerir; terceira consulta cancelada sem aviso no mesmo mês.
**Pricing sweet spot:** €50-150/mês (referência: Doctoralia €80-200/mês).
---
### Nicho 2 — Imobiliárias e Mediação
**Quem:** Agências imobiliárias independentes, mediadores certificados (AMI), promotores imobiliários, gestoras de condomínios.
**Dimensão PT:** +5.000 agências com licença AMI activas. Mercado em alta, mas muito fragmentado. Alta dependência de WhatsApp para comunicação com compradores/vendedores.
**Dores operacionais:**
- Leads entram por portais (Imovirtual, Idealista, OLX) e ficam sem resposta rápida
- Gestão de visitas manual: telefonemas para confirmar, reagendar, cancelar
- Follow-up de compradores perdido no WhatsApp pessoal do agente
- Quando o agente sai, leva os contactos consigo
- Proposta/minuta demoram dias
**Funcionalidades mais relevantes:** resposta automática a leads de portais, qualificação de leads por WhatsApp, agendamento de visitas com confirmação automática, CRM com histórico centralizado (não no telemóvel do agente), geração de propostas.
**Linguagem de venda:** "nunca perde um lead do Idealista", "as visitas confirmam-se sozinhas", "quando o agente sai, o cliente fica na empresa", "responde ao lead em 2 minutos, a qualquer hora".
**Canal de aquisição:** associações (APEMIP, ASIP), LinkedIn de directores de agência, eventos do sector imobiliário, Google Ads ("CRM imobiliário Portugal", "software mediação imobiliária").
**Objecção principal:** "Já usamos o CRM do Idealista." → Resposta: "O CRM do portal gere os leads do portal. O AcidaOS centraliza todos os portais + WhatsApp + email num só sítio, com o histórico completo de cada cliente."
**Trigger de compra:** perda de uma venda grande por demora na resposta ao lead; saída de um agente que levou a carteira de clientes.
**Pricing sweet spot:** €80-200/mês (referência: Salesforce RE €150-300/mês, CRMs sectoriais €50-150/mês).
---
### Nicho 3 — Construção e Remodelação
**Quem:** Empreiteiros de construção civil, empresas de remodelação e acabamentos, serralheiros, carpinteiros, canalizadores com equipa, empresas de pintura.
**Dimensão PT:** sector fortíssimo — construção representa ~7% do PIB PT. Altamente fragmentado, maioria micro-empresas 1-20 pessoas. Baixa digitalização. Alta dependência de telefonema e referência.
**Dores operacionais:**
- Orçamentos demoram dias ou semanas a chegar ao cliente
- Clientes ligam 5 vezes para saber se o orçamento chegou
- Gestão de obras espalhada por papel, WhatsApp e memória do encarregado
- Facturação atrasada em relação ao trabalho realizado (meses de delay)
- Cobranças de pagamentos em atraso constrangem a relação com o cliente
**Funcionalidades mais relevantes:** geração de orçamentos, follow-up automático ("o seu orçamento foi enviado — alguma dúvida?"), facturação automática por fase de obra, lembretes de pagamento, agenda de obras com alertas de prazo.
**Linguagem de venda:** "orçamento pronto em horas, não dias", "o cliente sabe sempre o estado da obra", "recebe quando acaba, não quando se lembra". Evitar linguagem tech — falar em "tempo poupado" e "dinheiro recebido".
**Canal de aquisição:** referência entre empresários do sector, associações (AICCOPN, AECOPS), Facebook Groups de empreiteiros e remodelações, feiras de construção.
**Objecção principal:** "A minha secretária já faz isso." → Resposta: "E quando ela está de férias? O AcidaOS não vai de férias."
**Trigger de compra:** perda de um contrato por orçamento que chegou tarde; mês com 3 facturas por emitir de obras já concluídas.
**Pricing sweet spot:** €30-80/mês (sector muito sensível ao preço, mas disposto a pagar se ROI for claro e imediato).
---
### Nicho 4 — Agências Digitais e Criativas
**Quem:** Agências de marketing digital, design, comunicação, relações públicas, fotografia/vídeo, produção de conteúdo.
**Dimensão PT:** +3.500 agências activas. Sector muito competitivo, margens a comprimir. Muitas em transição de "serviços de execução" para "serviços de estratégia + produto".
**Dores operacionais:**
- Relatórios mensais para clientes consomem 2-3 dias de trabalho manual
- Gestão de aprovações de conteúdo por WhatsApp e email (versões perdidas)
- Timesheets manuais → facturação imprecisa → conflitos com clientes
- Escalabilidade travada: para crescer precisa de contratar
- Receita 100% baseada em horas → vulnerável a perdas de cliente
**Funcionalidades mais relevantes:** geração automática de relatórios mensais, portal do cliente com aprovação de conteúdos, registo automático de horas, facturação por projecto, upsell/cross-sell automatizado (ex: "o teu plano inclui X — quer adicionar Y?").
**Linguagem de venda:** "relatórios que se fazem sozinhos", "o cliente aprova no portal, não por email", "receita recorrente sem aumentar a equipa", "white-label para revender aos teus clientes".
**Canal de aquisição:** LinkedIn (muito activo neste nicho), eventos de marketing (RD Summit, Social Media Week), comunidades Slack de marketers, referência entre agências.
**Objecção principal:** "Já usamos Monday/Asana/Notion." → Resposta: "O AcidaOS integra com essas ferramentas. Mas adiciona a camada de IA que automatiza o que ainda fazem manualmente: relatórios, aprovações, facturação."
**Trigger de compra:** perda de 20% da margem num trimestre por horas não facturadas; cliente grande que pediu relatórios mais frequentes sem pagar mais.
**Pricing sweet spot:** €100-300/mês; alto potencial para plano Partner/white-label (€500-1.000/mês).
---
### Nicho 5 — Comércio B2B e Distribuição
**Quem:** Distribuidores, grossistas, representantes comerciais, importadores, empresas de venda a retalhistas.
**Dimensão PT:** sector fundamental da economia, muito diversificado. Ciclos de venda mais longos, pedidos recorrentes, relacionamento comercial crítico.
**Dores operacionais:**
- Pedidos chegam por WhatsApp, email e telefone — sem registo centralizado
- Catálogo de produtos actualizado só existe em Excel ou PDF
- Comerciais perdem tempo a dar preços e a verificar stock pelo telefone
- Dívidas de clientes descobertas tarde (só quando o contabilista avisa)
- Fidelização: o cliente vai ao concorrente se não for contactado regularmente
**Funcionalidades mais relevantes:** chatbot de catálogo e preços por WhatsApp, processamento de pedidos automático, alertas de pagamentos em atraso, follow-up automático de clientes inativos ("não nos pede há 30 dias — tudo bem?"), facturação automática por encomenda.
**Linguagem de venda:** "o cliente pede pelo WhatsApp e a factura sai automática", "nunca perde uma encomenda por estar em reunião", "sabe quem não lhe compra há um mês antes de o perder".
**Canal de aquisição:** associações sectoriais, feiras B2B, LinkedIn de directores comerciais, referência entre distribuidores.
**Objecção principal:** "Os meus clientes são empresas — preferem email formal." → Resposta: "O sistema funciona por email também. E o WhatsApp para os urgentes — que são 80% dos pedidos reais."
**Trigger de compra:** perda de cliente para concorrente por resposta mais rápida; mês com facturas em atraso acima de €10K.
**Pricing sweet spot:** €100-250/mês (dispostos a pagar pelo ROI directo em cobranças e pedidos capturados).
---
### Nicho 6 — Restauração e Hotelaria
**Quem:** Restaurantes, cafés, bares, hotéis boutique, alojamentos locais, serviços de catering, espaços de eventos.
**Dimensão PT:** +80.000 estabelecimentos de restauração. Sector de margens apertadas, alta rotatividade de staff, sazonalidade intensa.
**Dores operacionais:**
- Reservas por telefone interrompem o serviço → perdidas quando está cheio
- Grupos e eventos corporativos: orçamentação manual e demorada
- Gestão de feedback online (Google, Tripadvisor) sem resposta sistemática
- Campanhas de WhatsApp para promoções especiais feitas manualmente
- Alojamento local: check-in remoto, comunicação com hóspedes em múltiplas línguas
**Funcionalidades mais relevantes:** reservas e confirmações por WhatsApp, resposta automática a reviews Google, campanhas de promoções ("mesa disponível para amanhã?"), comunicação com hóspedes em PT/EN/ES automática, facturação de eventos.
**Linguagem de venda:** "mesa reservada e confirmada sem tirar o empregado do serviço", "campanhas de promoção para a base de clientes em 2 minutos", "hóspedes atendidos em qualquer língua, a qualquer hora".
**Canal de aquisição:** associações (AHRESP, ARESP), feiras do sector (Horexpo, BTL), Instagram/Facebook de restaurateurs, referência entre proprietários.
**Objecção principal:** "O meu cliente quer falar com uma pessoa." → Resposta: "O sistema trata das confirmações de rotina. Quando o cliente quer falar com alguém, o sistema escala — e o teu staff tem mais tempo para isso."
**Trigger de compra:** mesa dupla marcada no mesmo horário; alta temporada com reservas a escapar por não conseguir atender o telefone.
**Pricing sweet spot:** €30-80/mês (margens apertadas — proposta tem de ser de ROI imediato e muito claro).
---
### Nicho 7 — Contabilidade e Consultoria
**Quem:** Gabinetes de contabilidade, TOCs (Técnicos Oficiais de Contas), escritórios de advogados, consultores de gestão, solicitadores.
**Dimensão PT:** +8.000 gabinetes de contabilidade registados. Sector muito regulado, conservador, mas sob pressão de digitalização e de novas exigências da AT.
**Dores operacionais:**
- Clientes entregam documentação de forma caótica (papel, foto de WhatsApp, email)
- Prazos fiscais críticos (IRS, IRC, IVA, SS) gerem-se manualmente com risco de multa
- Comunicação de alertas a clientes por email → baixa taxa de abertura
- Facturação de honorários por horas não registadas sistematicamente
- Novos clientes: onboarding burocrático e demorado
**Funcionalidades mais relevantes:** portal de recolha de documentos do cliente, alertas de prazos fiscais automáticos por WhatsApp, registo automático de horas, facturação mensal, onboarding digital de clientes.
**Linguagem de venda:** "o cliente entrega os documentos pelo WhatsApp e chegam organizados", "o cliente recebe o alerta de IVA no dia certo, não quando já passou", "sem ligar 5 vezes para pedir o recibo". Evitar: "IA", "automação" — usar "sistema", "organização", "processo".
**Canal de aquisição:** Ordem dos Contabilistas Certificados, formações profissionais obrigatórias, referência entre TOCs, LinkedIn de gestores de gabinetes.
**Objecção principal:** "Os nossos clientes são conservadores e resistem a mudanças." → Resposta: "O cliente não vê nenhuma mudança — continua a mandar fotos para o WhatsApp. Só que chegam organizadas ao sistema em vez de à caixa de entrada da Ana."
**Trigger de compra:** multa de cliente por prazo fiscal falhado por comunicação deficiente; novo quadro legal que aumenta o volume de entregas obrigatórias.
**Pricing sweet spot:** €50-150/mês (sector conservador no pricing mas com ROI muito mensurável em tempo poupado).
---
### Nicho 8 — E-commerce e Retalho Online
**Quem:** Lojas online, marcas DTC (direct-to-consumer), revendedores em marketplace (Amazon PT, FNAC, Worten), lojas omnicanal (físico + online).
**Dimensão PT:** +25.000 lojas online activas. Crescimento acelerado mas altíssima competição e margens em queda.
**Dores operacionais:**
- Volume de mensagens de suporte pós-venda (estado da encomenda, devoluções) insustentável
- Carrinhos abandonados sem follow-up automático → receita perdida
- Campanhas de reactivação de clientes inativos feitas manualmente
- Devoluções: processo manual, email interminável, cliente frustrado
- Avaliações negativas sem resposta → impacto na conversão
**Funcionalidades mais relevantes:** suporte automático de "onde está a minha encomenda" por WhatsApp, follow-up de carrinho abandonado, campanha de reactivação de clientes inativos, gestão de devoluções automatizada, resposta a reviews.
**Linguagem de venda:** "responde a 80% das perguntas de suporte sem intervenção humana", "recupera 15% dos carrinhos abandonados com um WhatsApp certo", "o cliente fica satisfeito sem precisar de esperar por email".
**Canal de aquisição:** comunidades de e-commerce (Shopify PT Facebook Group, grupos LinkedIn de e-commerce), eventos (eCommerce Day, NOS Alive), agências de e-commerce como parceiros.
**Objecção principal:** "Já usamos o suporte do Shopify." → Resposta: "O suporte do Shopify trata do que está dentro da plataforma. O AcidaOS trata do WhatsApp, do email e das mensagens do Instagram — que é de onde vêm 70% das perguntas reais."
**Trigger de compra:** Black Friday com volume de suporte 5x superior ao habitual sem equipa para responder; mês com carrinho abandonado acima de 70% sem follow-up.
**Pricing sweet spot:** €69-149/mês (familiarizados com SaaS, comparam com Gorgias €10-150/mês, Tidio €29-100/mês).
---
### Nicho 9 — Educação e Formação
**Quem:** Centros de formação profissional, explicadores e centros de explicações, escolas de línguas, escolas de música/artes, coaches e mentores, plataformas de formação online.
**Dimensão PT:** sector em expansão acelerada. Formação profissional fortemente subsidiada (FSE/IEFP) com requisitos administrativos pesados.
**Dores operacionais:**
- Matrículas e inscrições por telefone e email — processo manual e demorado
- Comunicação com pais (no caso de menores) caótica e dispersa
- Cobranças de mensalidades em atraso constrangem a relação com o aluno/família
- Certificados e documentação de formação gerados manualmente
- Formação subsidiada: relatórios e documentação obrigatória para financiamento
**Funcionalidades mais relevantes:** inscrições online com confirmação automática, comunicação com pais por WhatsApp, cobranças automáticas com link de pagamento (MB Way), geração de certificados, relatórios de frequência.
**Linguagem de venda:** "os pais recebem updates do filho pelo WhatsApp, sem ligar para a recepção", "as inscrições chegam organizadas, não por telefone", "as mensalidades cobram-se sozinhas no dia certo".
**Canal de aquisição:** DGERT (entidade reguladora de formação), LinkedIn de directores pedagógicos, grupos Facebook de formadores, referência entre centros.
**Objecção principal:** "Temos sistema de gestão escolar." → Resposta: "O AcidaOS complementa — trata da comunicação e cobranças que o sistema escolar não faz."
**Trigger de compra:** período de matrículas com recepção sobrecarregada; mensalidade em atraso de mais de 3 meses por falta de follow-up.
**Pricing sweet spot:** €50-120/mês (sensíveis ao preço mas com ROI claro em cobranças recuperadas).
---
### Nicho 10 — Serviços Técnicos Especializados
**Quem:** Empresas de IT/informática, AVAC, electricistas com empresa, empresas de segurança e alarmes, canalizadores, empresas de manutenção de equipamentos.
**Dimensão PT:** dezenas de milhares de micro e pequenas empresas. Alta dependência de WhatsApp para comunicar com técnicos e clientes. Muito fragmentado.
**Dores operacionais:**
- Chamadas de avaria chegam fora de horas sem registo
- Orçamentos de intervenções demoram dias (técnico tem de ver primeiro)
- Scheduling de técnicos manual — conflitos de agenda e deslocações ineficientes
- Contrato de manutenção: clientes que deviam contactar para revisão e não contactam
- Relatório de intervenção escrito à mão ou por memória do técnico
**Funcionalidades mais relevantes:** triagem automática de avarias fora de horas (gravidade, urgência), agendamento de técnicos por disponibilidade, geração de relatório de intervenção por voz (técnico descreve verbalmente → relatório gerado), alertas de manutenção preventiva, facturação de serviço.
**Linguagem de venda:** "o técnico descreve o trabalho pelo WhatsApp e o relatório fica pronto", "as chamadas de avaria fora de horas ficam registadas e triadas", "o cliente de manutenção recebe o alerta de revisão no mês certo".
**Canal de aquisição:** associações sectoriais (ANEOP, ASIAM), LinkedIn de gestores de empresa técnica, grupos Facebook de técnicos, referência entre pares.
**Objecção principal:** "Os meus técnicos não usam computador." → Resposta: "Exactamente por isso — o AcidaOS funciona pelo WhatsApp que eles já usam. O relatório faz-se com uma nota de voz."
**Trigger de compra:** chamada de avaria urgente perdida fora de horas; técnico que sai e leva o registo das intervenções que fez.
**Pricing sweet spot:** €40-100/mês (dispostos a pagar pelo valor em tempo poupado e em trabalho não perdido).
---
## Tabela resumo — priorização por atractividade
| Nicho | Volume PT | Urgência da dor | Disposição a pagar | Canal de entrada | Score |
|-------|-----------|----------------|-------------------|-----------------|-------|
| Saúde Privada | Alta | Muito alta | Alta | Associações + Google | ⭐⭐⭐⭐⭐ |
| Imobiliárias | Média | Alta | Alta | LinkedIn + portais | ⭐⭐⭐⭐⭐ |
| Agências Digitais | Média | Alta | Muito alta | LinkedIn + eventos | ⭐⭐⭐⭐⭐ |
| E-commerce | Alta | Alta | Alta | Comunidades + parceiros | ⭐⭐⭐⭐ |
| Contabilidade | Alta | Média-alta | Média | Ordem OCC + formação | ⭐⭐⭐⭐ |
| Construção | Muito alta | Alta | Média | Referência + associações | ⭐⭐⭐⭐ |
| Comércio B2B | Alta | Alta | Média-alta | Feiras + LinkedIn | ⭐⭐⭐⭐ |
| Serviços Técnicos | Muito alta | Média | Média | Referência + grupos | ⭐⭐⭐ |
| Educação | Média | Média | Baixa-média | DGERT + referência | ⭐⭐⭐ |
| Restauração | Muito alta | Média | Baixa | AHRESP + Instagram | ⭐⭐⭐ |
**Top 3 para arranque:** Saúde Privada, Imobiliárias, Agências Digitais — dor alta, disposição a pagar alta, canais de entrada claros.
@@ -0,0 +1,113 @@
# Perguntas de Briefing — Entrevista Estratégica
Guia de entrevista estruturado para conduzir o briefing inicial com o cliente.
Adaptar ao sector e nível de maturidade da marca.
---
## Bloco 1 — O negócio
### Contexto actual
1. O que faz a sua empresa, em termos simples?
2. Há quantos anos está no mercado? Como surgiu?
3. Qual a dimensão actual: equipa, facturação, clientes?
4. Qual é o maior desafio que enfrenta hoje no negócio?
5. O que o distingue dos concorrentes? (resposta espontânea — não sugerir)
### Serviços e produtos
6. Quais são os seus produtos/serviços principais?
7. Qual gera mais receita? Qual tem mais potencial?
8. Existe algum produto que quer destacar mais? Porquê?
9. Que resultados concretos entregam aos clientes?
### Posicionamento actual
10. Se pedisse a um cliente para descrever a sua empresa em 3 palavras, o que diria?
11. Existe uma percepção de mercado que quer mudar?
12. Onde se posiciona em preço vs concorrência? (mais caro, igual, mais barato) Porquê?
---
## Bloco 2 — O cliente ideal
### Segmentação
13. Quem é o seu cliente ideal? Descreva-o em detalhe.
14. Tem mais do que um tipo de cliente? Como os diferencia?
15. Qual o cliente que mais valoriza o que fazem e paga melhor?
16. Existe algum cliente que não quer ter? Porquê?
### Comportamento de compra
17. Como é que os clientes chegam até si? (canal principal de aquisição)
18. Quanto tempo demora tipicamente desde o primeiro contacto até fechar negócio?
19. Quem toma a decisão de compra? É uma pessoa ou um grupo?
20. Que objecções ouve mais frequentemente antes de fechar?
### Relação com clientes
21. Qual foi o feedback mais positivo que recebeu de um cliente? (pedir citação exacta)
22. Qual foi a queixa mais comum? Como resolveram?
23. Tem clientes que recomendam espontaneamente? O que dizem?
---
## Bloco 3 — Mercado e concorrência
### Mercado
24. Em que mercado opera? Geográfico (local, nacional, internacional)?
25. O mercado está a crescer, estável ou a contrair?
26. Que tendência do mercado mais o preocupa? Qual mais o entusiasma?
27. Existe sazonalidade? Em que períodos?
### Concorrência
28. Quem são os 3 principais concorrentes?
29. Em que é que são melhores? Em que é que são piores?
30. Por que é que um cliente nos escolhe a nós vs ao concorrente X?
31. Existe algum concorrente que admira (mesmo que de outra área)?
---
## Bloco 4 — Visão e ambição
### Onde quer chegar
32. Qual é o objectivo da empresa a 3 anos?
33. O que precisa de mudar para chegar lá?
34. Existe um modelo de empresa que admira ou quer imitar? Porquê?
35. Se tivesse recursos ilimitados, o que faria primeiro?
### Marca e identidade
36. Que 3 adjectivos descrevem a personalidade ideal da marca?
37. Que marcas (de qualquer sector) admira pela comunicação? O que lhes agrada?
38. Existe uma história de origem da empresa que emociona? (fundador, momento de viragem)
39. Que valores são inegociáveis? O que nunca fariam por dinheiro?
### Tom de voz
40. A marca é mais formal ou informal? Mais técnica ou acessível?
41. Usa humor na comunicação? Em que contextos?
42. Existe linguagem/palavras que NÃO deve usar?
---
## Bloco 5 — Recursos e restrições
### Capacidade
43. Qual o budget mensal disponível para marketing?
44. Existe equipa interna de marketing ou será tudo externalizado?
45. Quem aprova conteúdos? Qual o processo de revisão?
### Prazo
46. Existe algum lançamento, evento ou data importante a curto prazo?
47. Quando precisa de ter a estratégia operacional?
### Material existente
48. Existe alguma estratégia anterior? O que funcionou? O que não funcionou?
49. Que activos existem: website, redes sociais, base de emails, testemunhos, cases?
50. Existem fotos/vídeos profissionais? Em que estado está a identidade visual?
---
## Notas de condução da entrevista
- Fazer max 15-20 perguntas numa sessão (60-90 min)
- Priorizar: Blocos 1, 2 e 4 na primeira sessão
- Blocos 3 e 5 podem ser preenchidos com pesquisa independente
- Pedir sempre exemplos concretos e citações textuais de clientes
- Quando a resposta é vaga, fazer "pode dar-me um exemplo específico?"
- Gravar a sessão (com autorização) para não perder citações úteis
@@ -0,0 +1,374 @@
# Template: Documento de Estratégia de Marca
Estrutura completa do documento entregável ao cliente. Baseado nos projectos SFV, LJM, MCT, Espiral Senior e Sintricare.
Adaptar secções ao sector e complexidade do cliente.
---
## Cabeçalho do documento
```
---
title: [Nome da Marca] — Estratégia de Marca
cliente: [Nome do cliente]
código: EST-MRK-010
versão: 1.0
data: [DD-MM-YYYY]
elaborado: Descomplicar® — Agência de Aceleração Digital
status: draft | aprovado
---
```
---
## DECLARAÇÃO DE IMPACTO
> **[Uma frase poderosa — 10-15 palavras máximo]**
> *A essência e o impacto da marca numa linha.*
---
## ÍNDICE
1. Apresentação e Fundamentos Estratégicos
2. Proposta de Valor Única
3. Missão, Visão, Valores e Objectivos
4. Apresentação Sumária da Empresa e Serviços
5. Segmentação e Análise Detalhada de Público
6. Pitch Canvas
7. Copywriting Estratégico
8. Estratégia de Comunicação e Canais
9. Investimentos Prioritários
10. Monitorização e KPIs
11. Inventário de Activos de Marketing
---
## 1. Apresentação e Fundamentos Estratégicos
### 1.1 Contexto actual
- **Mercado:** [Análise do mercado actual — dimensão, tendências, oportunidades]
- **Concorrência:** [Principais concorrentes e posições]
- **Desafios:** [Principais desafios enfrentados pela marca]
- **Oportunidades:** [Oportunidades identificadas]
### 1.2 Problema a resolver
[Identificação clara do problema de negócio que esta estratégia precisa resolver — qual é o problema central que impede o crescimento ou o impacto da marca?]
---
## 2. Proposta de Valor Única
### 2.1 O que nos torna únicos
[O que tornamos possível que os concorrentes não conseguem. Ser específico — evitar "qualidade e experiência".]
### 2.2 Diferenciais competitivos
1. [Diferencial 1 — explicar o mecanismo único que o cria]
2. [Diferencial 2]
3. [Diferencial 3]
### 2.3 Benefícios por camada
| Tipo | Benefícios |
|------|-----------|
| **Funcionais** | [O que o produto/serviço faz concretamente] |
| **Emocionais** | [Como o cliente se sente ao usar/contratar] |
| **Identitários** | [O que diz sobre o cliente escolher esta marca] |
---
## 3. Missão, Visão, Valores e Objectivos
### 3.1 Missão
> [O que fazemos, para quem e como — acção no presente. Max 2 frases.]
### 3.2 Visão
> [Onde queremos estar e que impacto queremos ter em 3-5 anos. Max 2 frases.]
### 3.3 Valores
- **[Valor 1]** — [Como se manifesta na prática, no dia-a-dia da empresa]
- **[Valor 2]** — [Como se manifesta]
- **[Valor 3]** — [Como se manifesta]
- **[Valor 4]** — [Como se manifesta] *(opcional)*
### 3.4 Objectivos estratégicos
- **Curto prazo (6m):** [2-3 objectivos mensuráveis]
- **Médio prazo (1 ano):** [2-3 objectivos]
- **Longo prazo (3 anos):** [Ambição de impacto]
---
## 4. Apresentação Sumária da Empresa e Serviços
### 4.1 Quem somos
[Parágrafo de apresentação — quem são, o que fazem, há quanto tempo, dimensão, missão em acção]
### 4.2 Serviços/Produtos principais
| Serviço/Produto | Descrição | Para quem | Resultado principal |
|----------------|-----------|-----------|-------------------|
| [Nome] | — | — | — |
| [Nome] | — | — | — |
### 4.3 Posicionamento
[Declaração de posicionamento — o lugar único que a marca ocupa na mente do cliente]
> "Para [público], somos a única [categoria] que [benefício único] porque [prova]."
---
## 5. Segmentação e Análise Detalhada de Público
*Repetir a estrutura completa dos 20 pontos para cada segmento identificado.*
---
### 5.X — [Nome do Segmento]
*[Breve descrição de quem é este segmento — 2 linhas]*
#### 1. Perfil Demográfico
[Idade, género, localização, rendimento, nível de educação, profissão, cargo, tipo/dimensão de empresa, estado civil, composição familiar — tudo o que é mensurável e verificável]
#### 2. Perfil Psicográfico
[Valores pessoais, crenças, atitude perante a vida, estilo de vida, motivações profundas, relação com a categoria de produto/serviço, identidade social — o que não se mede mas define quem são]
#### 3. Dores
[Problemas activos e urgentes que precisam resolver. O que os está a prejudicar agora. Dores específicas do dia-a-dia relacionadas com o que a marca resolve.]
#### 4. Anseios
[O que aspiram a ser, ter ou alcançar. Sonhos profissionais e pessoais. A versão ideal do futuro que imaginam.]
#### 5. Desejos
[O que querem concretamente — mais imediato e específico que os anseios. Desejos práticos relacionados com a nossa oferta.]
#### 6. Frustrações
[O que já tentaram fazer ou comprar sem resultado. Soluções que prometeram e não entregaram. O cansaço acumulado de não resolver o problema.]
#### 7. Preocupações
[O que os inquieta a médio/longo prazo. Cenários negativos que imaginam. Preocupações sistémicas relacionadas com a sua vida ou negócio.]
#### 8. Medos
[Medos concretos associados à compra ou à não-compra. Medo de errar, de ser enganado, de perder dinheiro, de ser julgado. O que os paralisa antes de decidir.]
#### 9. Inimigos
[Os "vilões" da história deste segmento — concorrentes que os desiludiram, sistemas que os prejudicam, tendências que os ameaçam, pessoas ou entidades a quem culpam o problema]
#### 10. Linguagem
[As palavras e expressões exactas que usam para descrever o problema, a solução e os resultados. Jargão do sector. O que dizem aos amigos. O que escrevem no Google. Evitar linguagem que usamos internamente mas eles não usam.]
#### 11. Como procuram ajuda, informação ou dicas?
[Onde vão quando têm o problema: Google (que pesquisas fazem?), YouTube, grupos Facebook, LinkedIn, amigos, consultores, feiras, etc. Que tipo de conteúdo consomem para se informar?]
#### 12. Canais digitais
[Em que plataformas estão activos: Facebook, Instagram, LinkedIn, TikTok, YouTube, email, WhatsApp, fóruns, etc. Com que frequência? Em que contexto (trabalho vs lazer)?]
#### 13. Estilo de Decisão
[Como tomam decisões de compra: rápido vs deliberado, emocional vs racional, individual vs colectivo, impulsivo vs comparativo. Que factores pesam mais? Precisam de aprovação de terceiros?]
#### 14. Mudanças
[Mudanças que sabem e sentem necessárias nas suas vidas ou negócio. Passos que sabem que precisam dar mas ainda não deram. A consciência que já têm do problema.]
#### 15. Resistência à Mudança
[De que maneira resistem à mudança? Que desculpas usam para adiar? Como os podemos ajudar a ultrapassar essa resistência? Que argumentos reduzem o atrito?]
#### 16. Objecções Típicas
[As objecções mais frequentes às ofertas comerciais desta categoria. Como as podemos antecipar e superar? Respostas específicas a cada objecção.]
| Objecção | Como ultrapassar |
|----------|----------------|
| — | — |
| — | — |
| — | — |
#### 17. Forma de Gerar Emoção
[Que tipo de conteúdo, história ou mensagem os move emocionalmente? O que os faz parar no scroll? O que os faz partilhar? Qual o gatilho emocional mais poderoso para este segmento?]
#### 18. Argumentos
[A que argumentos são mais sensíveis? Como os podemos persuadir a agir? Que tipo de prova precisam: dados, testemunhos, demonstrações, garantias? Qual a sequência de persuasão ideal?]
#### 19. Concorrentes
[Que outras entidades lhes oferecem o mesmo tipo de serviço ou solução alternativa? Como se comparam a nós em percepção de valor?]
#### 20. Propostas Recusadas
[Que propostas é que este segmento tem recusado e porquê? O que dizem explicitamente e o que dizem implicitamente? O que não querem mais ouvir?]
---
## 6. Pitch Canvas
### 6.1 O que é o Pitch Canvas?
O Pitch Canvas é uma ferramenta de comunicação estratégica que resume, numa única estrutura visual, o essencial da proposta de valor da empresa. É útil porque:
- Força clareza e síntese (não há espaço para vagueza)
- Alinha toda a equipa na mesma mensagem
- Serve de base para qualquer peça de comunicação
- Torna a proposta de valor testável e iterável
### 6.2 Utilidade específica para [Nome da Marca]
[Como o Pitch Canvas pode ajudar esta marca concretamente — que clareza traz, que conversas simplifica, onde pode ser usado]
### 6.3 Os 5 elementos do Pitch Canvas
**Para quem:**
> [Segmento principal — quem são e qual o problema específico]
**O problema:**
> [Dor principal, urgente e real — formulada na linguagem do cliente]
**A solução:**
> [O que oferecemos — mecanismo único de resolução]
**O resultado:**
> [Transformação concreta — antes vs depois, com métrica se possível]
**Por que nós:**
> [Razão para acreditar — o que nos torna credíveis e únicos]
### 6.4 Declaração de mudança no mundo
> **"[Nome da Marca] está a mudar [o quê] para [quem], através de [como], tornando possível [impacto maior]."**
---
## 7. Copywriting Estratégico
### 7.1 Questionamento estratégico
**Qual é o objectivo da comunicação?**
[Definir claramente o que queremos que o público faça, sinta ou pense após cada comunicação. Sem objectivo claro não há comunicação eficaz.]
**Que transformação prometemos?**
[A transformação específica que a marca entrega — não o produto, mas a mudança de estado do cliente]
### 7.2 Pain + Gain (Problema e Resultado)
> **Pain:** [O problema central na perspectiva do cliente — formulado com a dor, não com o produto]
> **Gain:** [O resultado desejado — formulado com o benefício, não com a funcionalidade]
*Revisão com questões específicas do sector:*
> **Pain refinado:** [Após aprofundar com o briefing — mais específico, com linguagem do cliente]
> **Gain refinado:** [Com métricas ou resultados concretos já entregues a outros clientes]
### 7.3 Narrativa por segmento
*Fórmula: Problema (dor do público) → Solução (serviços da empresa) → Resultado (benefícios concretos)*
**[Segmento A]:**
> **Problema:** [Dor específica e urgente deste segmento, na sua linguagem]
> **Solução:** [Como a marca resolve de forma única — mecanismo específico]
> **Resultado:** [Benefício tangível e mensurável + prova social ou garantia]
**[Segmento B]:**
> **Problema:** [...]
> **Solução:** [...]
> **Resultado:** [...]
*(Repetir para cada segmento)*
### 7.4 Mensagem central da marca
> **"[A frase que todos os colaboradores sabem de cor — resumo da proposta de valor em 10 palavras]"**
### 7.5 Headlines por segmento
| Segmento | Headline principal | Headline secundária |
|----------|------------------|-------------------|
| [Seg. A] | — | — |
| [Seg. B] | — | — |
---
## 8. Demonstração dos Serviços
### 8.1 Como demonstrar [serviço/produto principal]
**Preparação personalizada:**
[O que preparar antes da demonstração para cada segmento]
**Introdução interactiva:**
[Como começar — conectar com a dor antes de mostrar a solução]
**Demonstração ao vivo:**
[O que mostrar, em que ordem, com que foco]
**Casos de uso:**
[Exemplos reais de clientes similares — antes/depois]
**Q&A:**
[Perguntas frequentes na demonstração e respostas modelo]
**Follow-up:**
[Próximo passo após a demonstração — o que enviar, quando contactar]
---
## 9. Investimentos Prioritários
### 9.1 Prioridades imediatas (impacto/esforço)
| Prioridade | Investimento | Impacto esperado | Prazo | Custo estimado |
|-----------|-------------|-----------------|-------|---------------|
| 1 | [Ex: Website + SEO] | — | 30-60d | — |
| 2 | [Ex: Google Ads] | — | 30d | — |
| 3 | [Ex: Email marketing] | — | 60d | — |
### 9.2 Estratégia de canais
| Canal | Objectivo | Frequência | KPI | Budget mensal |
|-------|-----------|-----------|-----|--------------|
| Website | — | — | — | — |
| Google Ads | — | — | — | — |
| Meta Ads | — | — | — | — |
| LinkedIn | — | — | — | — |
| Email | — | — | — | — |
| WhatsApp | — | — | — | — |
### 9.3 Pilares de conteúdo
1. [Pilar 1 — tema + tipos de conteúdo + frequência]
2. [Pilar 2]
3. [Pilar 3]
---
## 10. Monitorização e KPIs
### 10.1 Dashboard de métricas
| Área | KPI | Baseline | Meta 3m | Meta 6m | Meta 12m |
|------|-----|---------|---------|---------|----------|
| Brand | Notoriedade espontânea | — | — | — | — |
| Tráfego | Visitas/mês | — | — | — | — |
| Leads | Leads qualificados/mês | — | — | — | — |
| Conversão | Taxa de fecho | — | — | — | — |
| Retenção | NPS | — | — | — | — |
### 10.2 Ciclo de optimização
- **Revisão mensal:** métricas de canal, ajuste de conteúdo
- **Revisão trimestral:** avaliação de ROI, ajuste de orçamento
- **Revisão anual:** actualização estratégica completa
---
## 11. Inventário de Activos de Marketing
| Activo | Localização | Estado actual | Prioridade |
|--------|------------|--------------|-----------|
| Website | [URL] | — | — |
| Blog/Artigos | — | — | — |
| Redes sociais | — | — | — |
| Base de emails | — | — | — |
| Testemunhos/Cases | — | — | — |
| Materiais impressos | — | — | — |
| Apresentações | — | — | — |
| Fotos/Vídeos profissionais | — | — | — |
---
## Notas de implementação
1. **Sessão de alinhamento:** Apresentar o documento à equipa antes de implementar
2. **Validação:** Partilhar narrativas com 2-3 clientes actuais antes de publicar
3. **Implementação faseada:** Começar pelos canais de maior impacto e menor esforço
4. **Suporte:** WhatsApp durante 1 mês para dúvidas de implementação (EST-MRK-010)
---
*Elaborado por Descomplicar® — Agência de Aceleração Digital*
*emanuel@descomplicar.pt | descomplicar.pt*
+43 -12
View File
@@ -1,6 +1,6 @@
--- ---
name: expense name: expense
description: Gestao de despesas Desk CRM com PDF obrigatorio. Registar, categorizar e analisar despesas com verificacao de duplicados, upload SFTP e arquivo mensal automatico. description: Gestao de despesas Desk CRM com PDF obrigatorio. Registar, categorizar e analisar despesas com verificacao de duplicados por reference_no, upload SFTP e arquivo mensal automatico.
--- ---
# /expense - Gestao de Despesas # /expense - Gestao de Despesas
@@ -55,18 +55,27 @@ Para mapeamento completo de fornecedores, emails e padroes PDF para categorias:
- Bypass valido apenas para: AT, Salarios, transferencias bancarias - Bypass valido apenas para: AT, Salarios, transferencias bancarias
2. LER O PDF: Extrair dados reais do documento 2. LER O PDF: Extrair dados reais do documento
- NUNCA copiar valor de um PDF para outro - NUNCA copiar valor de um PDF para outro
- EXTRAIR reference_no (numero factura) — OBRIGATORIO para dedup
3. OBRIGATORIO: get_expense_categories(with_stats=true) 3. OBRIGATORIO: get_expense_categories(with_stats=true)
4. Identificar categoria correcta na lista 4. Identificar categoria correcta na lista
5. VERIFICAR DUPLICADOS: 5. VERIFICAR DUPLICADOS (3 camadas — OBRIGATORIO):
Camada 0 — Referencia de factura (PRIMARIA):
- get_expenses(search: "<reference_no>")
- Se alguma despesa tem reference_no IGUAL → DUPLICADO → PARAR
Camada 1 — Fornecedor + Valor + Data:
- get_expenses(search: "<fornecedor>") - get_expenses(search: "<fornecedor>")
- Mesmo fornecedor + valor + data = duplicado - Mesmo fornecedor + valor (±0.05) + data (±3 dias) = duplicado
- Mesmo numero factura = duplicado Camada 2 — Expense name:
- get_expenses(search: "<fornecedor> - <reference_no>")
- Se match exacto → duplicado
Se QUALQUER camada detecta duplicado → NAO criar, informar utilizador
6. Recolher dados: 6. Recolher dados:
- category_id, amount, currency (EUR=3, USD=2), date (YYYY-MM-DD) - category_id, amount, currency (EUR=3, USD=2), date (YYYY-MM-DD)
- reference_no (numero factura — OBRIGATORIO)
- note (incluir numero factura), send_invoice_to_customer = 0 - note (incluir numero factura), send_invoice_to_customer = 0
- Opcionais: client_id, project_id, billable, tax - Opcionais: client_id, project_id, billable, tax
7. CONFIRMAR com utilizador (mostrar resumo) 7. CONFIRMAR com utilizador (mostrar resumo)
8. create_expense 8. create_expense (INCLUIR reference_no no payload)
9. UPLOAD PDF ao Desk via SFTP: 9. UPLOAD PDF ao Desk via SFTP:
a. mkdir -p no servidor: /home/ealmeida/desk.descomplicar.pt/uploads/expenses/<id> a. mkdir -p no servidor: /home/ealmeida/desk.descomplicar.pt/uploads/expenses/<id>
b. mcp__ssh-unified__sftp_upload(server:"desk", local_path, remote_path) b. mcp__ssh-unified__sftp_upload(server:"desk", local_path, remote_path)
@@ -104,7 +113,7 @@ Para mapeamento completo de fornecedores, emails e padroes PDF para categorias:
Para protocolo completo de processamento de tickets de contabilidade: ver `references/ticket-processing.md` Para protocolo completo de processamento de tickets de contabilidade: ver `references/ticket-processing.md`
**Resumo:** Obter ticket -> verificar anexos -> verificar duplicados -> extrair dados -> confirmar -> criar despesa -> upload PDF -> arquivo mensal. **Resumo:** Obter ticket -> verificar anexos -> verificar duplicados (3 camadas) -> extrair dados -> confirmar -> criar despesa -> upload PDF -> arquivo mensal.
--- ---
@@ -136,15 +145,16 @@ Para protocolo completo de processamento de tickets de contabilidade: ver `refer
**Despesas:** **Despesas:**
4. Criar despesa sem category_id 4. Criar despesa sem category_id
5. Nao validar data (formato YYYY-MM-DD) 5. Nao validar data (formato YYYY-MM-DD)
6. Criar despesa sem verificar duplicados primeiro 6. Criar despesa sem verificar duplicados primeiro (3 camadas obrigatorias)
7. Criar despesa sem reference_no (chave primaria de dedup)
**Valores de PDFs:** **Valores de PDFs:**
7. Assumir que ficheiros com nomes semelhantes tem o mesmo valor 8. Assumir que ficheiros com nomes semelhantes tem o mesmo valor
8. SEMPRE ler CADA PDF individualmente para extrair o valor real 9. SEMPRE ler CADA PDF individualmente para extrair o valor real
**Tickets:** **Tickets:**
9. Processar ticket sem verificar anexos PDF 10. Processar ticket sem verificar anexos PDF
10. Assumir que ticket com recibo = despesa nao lancada 11. Assumir que ticket com recibo = despesa nao lancada
--- ---
@@ -152,8 +162,11 @@ Para protocolo completo de processamento de tickets de contabilidade: ver `refer
- [ ] Listar categorias existentes - [ ] Listar categorias existentes
- [ ] Validar categoria correcta - [ ] Validar categoria correcta
- [ ] Extrair reference_no do PDF/factura
- [ ] Verificar duplicados (3 camadas)
- [ ] Confirmar dados com utilizador - [ ] Confirmar dados com utilizador
- [ ] Usar formato data YYYY-MM-DD - [ ] Usar formato data YYYY-MM-DD
- [ ] Incluir reference_no no create_expense
- [ ] Incluir nota descritiva - [ ] Incluir nota descritiva
--- ---
@@ -164,6 +177,24 @@ Para protocolo completo de processamento de tickets de contabilidade: ver `refer
- `references/ticket-processing.md` - Protocolo completo de processamento de tickets - `references/ticket-processing.md` - Protocolo completo de processamento de tickets
- `references/changelog.md` - Historico de alteracoes - `references/changelog.md` - Historico de alteracoes
--- ---
**Criado:** 2026-02-05 | **Actualizado:** 2026-02-12 ## Self-Healing
Antes de executar, ler `~/.claude-work/healing/expense.jsonl` (se existir). Cada linha é um padrão de erro conhecido:
```json
{"date":"YYYY-MM-DD","issue":"descrição do problema","fix":"como evitar","source":"user|auto"}
```
Se encontrares um padrão relevante ao contexto actual, aplica o fix preventivamente. Após cada erro ou correcção do utilizador nesta skill, **adicionar nova linha** ao healing log com o padrão aprendido.
---
**Criado:** 2026-02-05 | **Actualizado:** 2026-03-30 | Fix: dedup 3 camadas com reference_no (DES-137)
## Healing Log
<!-- Registo automático de erros e correcções nesta skill -->
+12
View File
@@ -253,3 +253,15 @@ Acções:
--- ---
*Skill v1.0.0 | 2026-02-05 | Descomplicar®* *Skill v1.0.0 | 2026-02-05 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+150
View File
@@ -0,0 +1,150 @@
---
name: orcamento
description: Criação de orçamentos Descomplicar baseados nos itens oficiais do Desk CRM. Versão light para heartbeats.
disable-model-invocation: true
---
# Orçamento — Referência Rápida
## Fonte de verdade: Desk CRM (`tblitems` + `tblitems_groups`)
651 itens em 14 grupos. Consultar SEMPRE o CRM para preços actualizados.
## Sintaxe
```
/orcamento [cliente] [tipo] [-MEN|-TRI]
```
| Código | Tipo | Grupo CRM |
|--------|------|-----------|
| `starter` | StarterWP | Websites |
| `corporate` | CorporateWP | Websites |
| `care` | CareWP | Websites |
| `ecom` | eCommerceWP | Websites |
| `mkt` | Marketing 360 | Marketing |
| `man` | Manutenção | Suporte |
| `deskcrm` | DeskCRM | DeskCRM |
| `chatbot` | Chatbot | Chatbots |
| `acceleratorx` | AcceleratorX | Tecnologia |
## Variantes de facturação
| Flag | Unit | Pesquisa CRM |
|------|------|-------------|
| (nenhum) | ano | Item base |
| `-MEN` | mensalidade | `WHERE description LIKE 'Mensalidade%...'` |
| `-TRI` | trimestral | `WHERE description LIKE 'Trimestral%...'` |
Preços das variantes são definidos no CRM (podem incluir markup). Nunca calcular por divisão simples.
## Protocolo
### 1. Identificar cliente
```
mcp__desk-crm-v3__search_customers query="[nome]" fields="company,vat"
```
### 2. Consultar preços
```bash
# Itens base (setup/pontuais)
mysql -u root ealmeida_desk24 -e "
SELECT description, rate, unit FROM tblitems
WHERE group_id = [GROUP_ID]
AND description LIKE '%[PACOTE]%'
AND unit NOT IN ('mensalidade','trimestral','anuidade')
ORDER BY description;"
# Itens recorrentes (com variante)
mysql -u root ealmeida_desk24 -e "
SELECT description, rate, unit FROM tblitems
WHERE group_id = [GROUP_ID]
AND description LIKE '[Mensalidade|Trimestral]%[PACOTE]%'
ORDER BY description;"
```
Ou via MCP:
```
mcp__desk-crm-v3__price_management action="get_pricing_insights" params={"group": "[GRUPO]"}
```
### 3. Criar estimate
```
mcp__desk-crm-v3__create_estimate
client_id=[id]
date=[hoje]
expiry_date=[hoje + 30 dias]
items=[{description, qty, rate, unit}]
terms="[termos]"
```
**Formato item:** `{"description": "...", "qty": 1, "rate": 700, "unit": "un"}`
**Unidades:** `un` (pontual), `mensalidade` (-MEN), `trimestral` (-TRI), `anuidade` (defeito)
### 4. Termos por variante
- **Sem flag:** "50% na adjudicação + 50% na entrega"
- **-MEN:** "Setup: 50%+50% | Recorrência: facturação mensal antecipada"
- **-TRI:** "Setup: 50%+50% | Recorrência: facturação trimestral antecipada"
## Preços de referência (consultar CRM para valores reais)
### Websites
| Produto | Setup | Anuidade |
|---------|-------|----------|
| StarterWP | 700 | 250 |
| CorporateWP | 900 | 299 |
| eCommerceWP | 1100 | 349 |
| CareWP | 1300 | 350 |
### DeskCRM
| Produto | Anuidade |
|---------|----------|
| Starter | 400 |
| Profissional | 800 |
| Avançado | 1500 |
| Enterprise | 3000 |
### AcceleratorX
| Produto | Setup |
|---------|-------|
| WP ProCMS | 650 |
| e-Commerce | 750 |
| Care | 750 |
| School Manager | 850 |
### Chatbots
| Produto | Setup |
|---------|-------|
| Básico | 350 |
| Avançado | 850 |
## Checklist
- [ ] Cliente identificado/criado no CRM
- [ ] Tipo seleccionado
- [ ] Preços consultados no CRM
- [ ] Valores calculados (subtotal + IVA 23%)
- [ ] Recorrência calculada
- [ ] Estimate criado (status: Draft)
- [ ] Resumo apresentado
## MCPs
```
mcp__desk-crm-v3__search_customers
mcp__desk-crm-v3__create_customer
mcp__desk-crm-v3__create_estimate
mcp__desk-crm-v3__price_management
```
---
**Versão**: 4.1.0-light | **Base**: 4.1.0
+12
View File
@@ -512,3 +512,15 @@ INSERT INTO tblskill_agent_metrics (
--- ---
**Versao**: 4.1.0 | **Data**: 2026-03-12 | **Fonte de Verdade**: Desk CRM (tblitems) **Versao**: 4.1.0 | **Data**: 2026-03-12 | **Fonte de Verdade**: Desk CRM (tblitems)
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+49
View File
@@ -365,3 +365,52 @@ mcp__mcp-time__current_time - Data/hora actual
--- ---
**Versao**: 1.0.0 | **Data**: 2026-03-06 | **Template**: descomplicar-proposal-template.pptx **Versao**: 1.0.0 | **Data**: 2026-03-06 | **Template**: descomplicar-proposal-template.pptx
---
## Media Bank (D7-MB-001)
**Quando consultar:** antes de gerar o deck da proposta — para hero da capa, backgrounds de slides de secção e imagens ilustrativas. Garante consistência visual e evita dependência de geração IA por cada proposta.
**Workflow tentativa-primeiro:**
1. Pesquisar via MCP `media-bank`:
```
mcp__media-bank__search_media(
query="<sector/serviço do cliente em EN>",
type="image",
tema="<um dos 9 temas alinhado com serviço>",
orientation="landscape",
min_quality=8, # exigência mais alta para propostas
min_width=1920,
exclude_used_in_last_days=60,
limit=5
)
```
2. Avaliar candidatos por `description_en` + `quality_score` + alinhamento com identidade visual Descomplicar.
3. Se ≥1 adequado → usar `path_local` directamente no PPTX (slide master / capa) ou compor no template.
4. Se nenhum → fallback para geração IA (Flux) ou biblioteca de stock interna.
5. Marcar uso: `mcp__media-bank__mark_used(asset_id, {type:"proposal-deck", ref:"<cliente>-<data>", date:"<YYYY-MM-DD>"})`.
**Fallback REST** (se MCP indisponível):
```bash
SK=$(grep SERVICE_KEY /media/ealmeida/Dados/Hub/05-Projectos/Banco-Imagens-Videos/scripts/.env | cut -d= -f2)
curl -s "https://mem.descomplicar.pt/rest/v1/media_bank_assets?type=eq.image&orientation=eq.landscape&quality_score=gte.8&deleted_at=is.null&order=quality_score.desc&limit=5" \
-H "apikey: $SK" -H "Authorization: Bearer $SK"
```
**Regra inviolável:** matéria-prima local. Usar como input no template PPTX — NUNCA servir o ficheiro raw ao cliente sem integração no deck (overlays, branding, layout).
Ver `Hub/06-Operacoes/Procedimentos/D7-Tecnologia/MCP/PROC-Media-Bank.md` (D7-MB-001) para detalhes.
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+386
View File
@@ -0,0 +1,386 @@
---
name: proposta-visual
description: Criação completa de propostas comerciais visuais — página web (propostas.descomplicar.pt) + PDF exportável + PPTX editável. Recolhe dados CRM, gera JSON, renderiza condicionalmente e faz deploy.
---
# Skill /proposta-visual — Propostas Comerciais Visuais
Cria propostas comerciais profissionais com 3 outputs: página web interactiva, PDF exportável e PPTX editável.
## Triggers
- `/proposta-visual`
- "proposta visual", "proposta web", "criar proposta", "nova proposta", "proposta para [cliente]"
## Quando usar
- Criar proposta comercial completa para um cliente
- Gerar página web + PDF + PPTX de uma proposta
- Actualizar proposta existente com novos dados
## Quando NÃO usar
- Apenas orçamento sem visual (usar `/orcamento`)
- Apenas PPTX sem página web (usar `/proposal-deck`)
- Análise de lead sem proposta (usar `/lead-approach`)
---
## Projecto base
| Campo | Valor |
|-------|-------|
| **Código fonte** | `/media/ealmeida/Dados/Dev/Propostas/` |
| **Stack** | React 18 + Vite + Tailwind + @react-pdf/renderer + Recharts + Framer Motion + Lucide React |
| **Live** | `propostas.descomplicar.pt/{slug}` |
| **Deploy** | Docker Swarm EasyPanel, serviço `descomplicar_propostas`, ficheiros `/opt/propostas/` |
| **DNS** | `propostas.descomplicar.pt` → 5.9.90.70 (Cloudflare proxied) |
| **Template PPTX** | `/media/ealmeida/Dados/Hub/90-Templates/Comercial/descomplicar-proposal-template.pptx` |
---
## REGRAS CRÍTICAS (ler antes de qualquer implementação)
### 1. PT-PT obrigatório — acentos em TODO o texto
Todos os textos no JSON, componentes web e componentes PDF DEVEM ter acentos PT-PT correctos:
- ✓ migração, tradução, integração, opções, condições, execução, acção
- ✗ migracao, traducao, integracao, opcoes, condicoes, execucao, accao
**Verificar no PDF:** labels hardcoded em `PDFWorkDone.jsx` e `PDFDocument.jsx` — já corrigidos mas confirmar sempre.
### 2. JSON data-driven — renderização condicional obrigatória
O `ProposalView.jsx` e o `PDFDocument.jsx` renderizam secções **condicionalmente** com base nos dados. Se um campo é `null`, `[]` ou não existe, a secção NÃO aparece.
**Regra:** NUNCA assumir que todos os campos existem. Cada proposta pode ter um subconjunto diferente de secções.
| Campo JSON | Secção web | Secção PDF | Condição |
|-----------|-----------|-----------|----------|
| `context.brandStrategy` | BrandStrategy | PageBrandStrategy | `!= null` |
| `salesData` | SalesChart | PageSales | `.length > 0` |
| `context.diagnosis` | Context | — | `.length > 0` |
| `context.scores` | ScoreGrid | PDFScores | `.length > 0` |
| `service360` | Service360 | PageService360 | `!= null` |
| `plans` | PricingCards | PDFPricing | `.length > 0` |
| `licenses` | LicensePack | PageLicenses | `!= null` |
| `workDone` | WorkDone | PDFWorkDone | `.length > 0` |
| `roadmap` | Roadmap | PDFWorkDone | `.length > 0` |
| `conditions` | Conditions | PDFWorkDone (pág. separada) | `.length > 0` |
### 3. Título dinâmico — campo `title` no JSON
O título da proposta (Hero web + capa PDF) vem do campo `title` no JSON:
- Proposta 360°: `"title": "Descomplicar 360°"`
- Migração técnica: `"title": "Migração Bookeo"`
- Website: `"title": "Website Profissional"`
- Fallback: `"Proposta Comercial"`
**NUNCA** hardcodar "Descomplicar 360°" — usar `data.title`.
### 4. Preços flexíveis — não assumir mensalidades
Os planos suportam dois formatos de preço:
**Mensalidade (avença):**
```json
{
"monthly": 459,
"hours": 8,
"originalPrice": 540,
"discount": 15
}
```
Mostra: "459 €/mês" + "8h/mês incluídas · contrato anual"
**Preço único (investimento):**
```json
{
"price": 750,
"priceLabel": "EUR + IVA",
"priceSubtitle": "Investimento único · prazo 1-2 semanas",
"monthly": null,
"hours": null
}
```
Mostra: "750 EUR + IVA" + "Investimento único · prazo 1-2 semanas"
**Campos usados:** `plan.price ?? plan.monthly` para o valor, `plan.priceLabel ?? "€/mês"` para a unidade, `plan.priceSubtitle` para a descrição abaixo.
### 5. react-pdf — bugs conhecidos e PROIBIÇÕES
| Proibição | Porquê | Alternativa |
|-----------|--------|-------------|
| `gap` + `flexWrap` juntos | Crasha silenciosamente | `marginRight` + `marginBottom` nos items |
| `borderColor` com `rgba()` | Renderiza verde | Cor sólida (ex: `#D4A020`, `#E8E8E8`) |
| Import de componentes SVG (`<Svg>`, `<Circle>`) | Crasha web worker do PDFDownloadLink | Implementar gráficos inline com `<View>` |
| `Font.register` com fontes locais/CDN em multi-página | Falha silenciosa | Usar Helvetica/Helvetica-Bold (built-in) |
| `href` vazio no PDFDownloadLink | PDF não gerou — verificar consola | Cache do browser — Ctrl+Shift+R |
### 6. Página 360° (service360) — contextualizar
A secção service360 no PDF usa o label "O QUE PROPOMOS" (genérico) e o título "As nossas soluções para o seu negócio". Os dados vêm do JSON `service360.areas[]`.
Para propostas que NÃO são 360°, adaptar os `areas` ao contexto:
- Migração técnica: features da migração
- Website: áreas do serviço web
- SEO: pilares do trabalho SEO
Se `service360` for `null`, a secção não aparece.
### 7. Condições comerciais — página separada no PDF
As condições estão numa página PDF separada (não na mesma que o roadmap) para evitar corte entre páginas. O componente `PDFWorkDone` retorna um Fragment com 2 Pages.
---
## Protocolo
### Sintaxe
```
/proposta-visual [cliente] [tipo-serviço]
```
### Fase 1: Análise do contexto
**ANTES de criar o JSON, responder a estas perguntas:**
1. **Que tipo de proposta é?** (360°, website, migração técnica, SEO, eCommerce, outro)
2. **O preço é mensal ou único?** → define `monthly` vs `price`/`priceLabel`/`priceSubtitle`
3. **Que secções se aplicam?** → define que campos preencher no JSON
4. **Há dados quantitativos?** (vendas, scores SEO, KPIs) → define `salesData`, `context.scores`
5. **Há trabalho já realizado?** → define `workDone`
6. **Quantas opções de preço?** → define `plans[]`
**Mapa de secções por tipo de proposta:**
| Secção | 360° | Website | Migração | SEO | eCommerce |
|--------|:----:|:-------:|:--------:|:---:|:---------:|
| `title` | Descomplicar 360° | Website Profissional | [contexto] | Optimização SEO | Loja Online |
| `brandStrategy` | ✓ | Opcional | — | — | Opcional |
| `salesData` | Se existir | — | — | — | Se existir |
| `scores` | ✓ (audit) | Opcional | — | ✓ (audit) | Opcional |
| `service360` | ✓ | ✓ | ✓ | ✓ | ✓ |
| `plans` | ✓ (3 opções) | ✓ | ✓ | ✓ | ✓ |
| `licenses` | Se aplicável | — | — | — | Se aplicável |
| `workDone` | Se existir | Se existir | ✓ | Se existir | Se existir |
| `roadmap` | ✓ | ✓ | ✓ | ✓ | ✓ |
| `conditions` | ✓ | ✓ | ✓ | ✓ | ✓ |
### Fase 2: Recolha de dados do CRM
```
mcp__desk-crm-v3__search_customers query="[nome]"
mcp__desk-crm-v3__get_customer customer_id=[id]
mcp__desk-crm-v3__get_estimates client_id=[id]
```
### Fase 3: Criar ficheiro JSON
**Localização:** `src/data/[slug].json`
**Gerar slug:** iniciais do cliente + tipo + hash curto. Ex: `ccv-bookeo-a3f7c1d2`
**Schema mínimo obrigatório:**
```json
{
"title": "Título da Proposta",
"client": {
"name": "Nome Legal Lda.",
"brand": "Nome Comercial",
"website": "exemplo.pt",
"contact": "Nome Contacto",
"email": "email@exemplo.pt",
"phone": "+351 900 000 000"
},
"company": {
"name": "Descomplicar, Lda.",
"brand": "Descomplicar",
"nif": "514 785 691",
"email": "info@descomplicar.pt",
"phone": "911 510 005",
"website": "descomplicar.pt"
},
"date": "2026-03-23",
"validDays": 30,
"context": {
"description": "Descrição da situação...",
"diagnosis": [],
"scores": [],
"brandStrategy": null
},
"service360": null,
"plans": [],
"licenses": null,
"workDone": [],
"roadmap": [],
"conditions": [],
"salesData": [],
"salesProjection": []
}
```
**Campos opcionais para planos com preço único:**
```json
{
"price": 750,
"priceLabel": "EUR + IVA",
"priceSubtitle": "Investimento único · prazo 1-2 semanas",
"monthly": null,
"hours": null
}
```
**Checklist PT-PT antes de guardar o JSON:**
- [ ] Todos os textos têm acentos correctos (ã, ç, ã, é, ê, í, ó, õ, ú)
- [ ] Zero brasileirismos
- [ ] Caractere → (seta) em vez de -> nos textos visíveis
- [ ] Monetário: "EUR" ou "€" (não "R$" nem "$")
### Fase 4: Registar no App.jsx
```jsx
import novaData from "./data/[slug].json"
const proposals = {
// existentes...
"[novo-slug]": novaData,
}
```
### Fase 5: Verificar antes do build
**Checklist pré-build:**
- [ ] JSON válido (sem trailing commas, sem campos undefined)
- [ ] Campos null/[] para secções que não se aplicam (NÃO omitir)
- [ ] `title` definido (não depender do fallback)
- [ ] `plans[].price` OU `plans[].monthly` definido (não ambos null)
- [ ] `plans[].priceLabel` definido se preço único
- [ ] Slug registado em App.jsx
- [ ] Nenhum `flexWrap` + `gap` nos componentes PDF
- [ ] Nenhum `borderColor` com `rgba()` nos componentes PDF
### Fase 6: Build e deploy
```bash
cd /media/ealmeida/Dados/Dev/Propostas
npm run build
# Limpar dist
cd dist
rm -rf assets/template-media assets/template-referencia.pptx assets/slide-referencia.svg
cd assets/brochura && ls *.{jpg,png} 2>/dev/null | grep -v image8.jpg | xargs rm -f 2>/dev/null
# Empacotar
cd /media/ealmeida/Dados/Dev/Propostas/dist
tar czf /tmp/propostas-dist.tar.gz .
# Upload + deploy
mcp__ssh-unified__sftp_upload server=easy localPath=/tmp/propostas-dist.tar.gz remotePath=/tmp/propostas-dist.tar.gz overwrite=true
mcp__ssh-unified__ssh_execute server=easy command="cd /opt/propostas && rm -rf assets/* index.html; tar xzf /tmp/propostas-dist.tar.gz && docker service update --force descomplicar_propostas && rm -f /tmp/propostas-dist.tar.gz"
# Verificar
curl -sI https://propostas.descomplicar.pt/[slug] | head -3
# Deve retornar HTTP/2 200
# Limpar
rm -f /tmp/propostas-dist.tar.gz
```
### Fase 7: Testar PDF
**OBRIGATÓRIO antes de entregar:**
1. Abrir `https://propostas.descomplicar.pt/[slug]` com Ctrl+Shift+R
2. Clicar "Exportar PDF"
3. Verificar que `href` do link não está vazio (PDF gerou)
4. Abrir PDF e verificar:
- [ ] Título correcto (não "Descomplicar 360°" hardcoded)
- [ ] Preços correctos (não "€/mês" se é preço único)
- [ ] Sem borders verdes (rgba renderiza verde no react-pdf)
- [ ] Sem secções que não se aplicam (360°, vendas, licenças, scores)
- [ ] Acentos PT-PT em todo o texto
- [ ] Condições comerciais numa página inteira (sem corte)
- [ ] Todas as 3 opções de preço com layout uniforme
**Se o PDF não gera (href vazio):**
1. Verificar consola do browser (F12)
2. Causa mais provável: import de componente SVG dos infographics
3. Verificar que PDFDocument não importa de `./infographics/`
4. Verificar que não há `gap` + `flexWrap` no PDF
5. Ctrl+Shift+R e tentar novamente (cache)
### Fase 8: Entrega e registo
1. Guardar em `Hub/03-Propostas/[Cliente]/`
2. Registar estimate no CRM (se não existe)
3. Comunicar URL ao utilizador
4. Comentar tarefa CRM
---
## Design system ACIDA 2.0
| Token | Valor |
|-------|-------|
| Dourado | #C88900 |
| Dourado claro | #EED59F |
| Dourado border PDF | #D4A020 (usar em vez de rgba no PDF) |
| Dark | #262626 |
| Background | #F8F8F8 |
| Fonte web | Inter (Google Fonts) |
| Fonte PDF | Helvetica / Helvetica-Bold |
| Logo escuro | `/assets/logo-descomplicar.png` |
| Logo claro | `/assets/logo-descomplicar-white.png` |
---
## Propostas existentes
| Slug | Cliente | Tipo | Data |
|------|---------|------|------|
| `ljm-360-61a8aecc` | A Loja da Maria | 360° (mensal) | 2026-03-20 |
| `ccv-bookeo-a3f7c1d2` | Carvoeiro Caves | Migração técnica (único) | 2026-03-23 |
---
## Skills relacionadas
- `/proposal-deck` — PPTX standalone (16 layouts, XML editing)
- `/orcamento` — Estimate no CRM (sem visual)
- `/lead-approach` — Estratégia de abordagem de lead
- `/crm` — Operações CRM genéricas
---
## Changelog
### v2.0.0 (2026-03-23)
- Regras críticas documentadas (7 regras)
- Renderização condicional obrigatória (ProposalView + PDFDocument)
- Título dinâmico via campo `title` no JSON
- Preços flexíveis (mensal vs único) com `price`/`priceLabel`/`priceSubtitle`
- Bugs react-pdf documentados com proibições explícitas
- Mapa de secções por tipo de proposta
- Checklist pré-build e teste PDF obrigatório
- Condições comerciais em página PDF separada
### v1.0.0 (2026-03-23)
- Versão inicial
---
**Versão:** 2.0.0 | **Data:** 2026-03-23
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -169,3 +169,15 @@ Subject contem:
--- ---
*Skill v1.0.0 | 04-03-2026 | Descomplicar®* *Skill v1.0.0 | 04-03-2026 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -284,3 +284,15 @@ No checkup diário, mostrar tickets:
--- ---
*Skill v1.0.0 | 2026-02-05 | Descomplicar®* *Skill v1.0.0 | 2026-02-05 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
@@ -316,3 +316,15 @@ Hashtags/links: #2b6cb0
**Versao**: 1.0.0 | **Data**: 2026-03-10 | **Autor**: Descomplicar® **Versao**: 1.0.0 | **Data**: 2026-03-10 | **Autor**: Descomplicar®
*Paletas detalhadas por contexto: `references/color-palettes.md`* *Paletas detalhadas por contexto: `references/color-palettes.md`*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+104
View File
@@ -0,0 +1,104 @@
---
name: cinematic-site
category: design-media
description: "Constroi websites cinematograficos a partir de um site existente. Pipeline 4 passos: brand analysis, scene generation, build HTML/CSS, preview. Usar quando 'cinematic', 'website premium', 'site cinematografico', 'redesign site', 'nanobanana'."
version: "1.0.0"
created: 2026-04-07
tools: [Bash, Read, Write, mcp__claude-in-chrome__read_page, mcp__claude-in-chrome__tabs_create_mcp, mcp__chrome-devtools__take_screenshot]
---
# Skill: /cinematic-site
Constroi websites cinematograficos responsivos a partir de um site existente. Inspirado no Nanobanana 2 (#366 Jay E / RoboNuggets).
---
## Pipeline de 4 passos
### Passo 1 — Brand Analysis
Receber URL do site existente do utilizador.
1. Abrir URL via `mcp__claude-in-chrome__tabs_create_mcp` + `mcp__claude-in-chrome__read_page`
2. Extrair:
- Paleta de cores (hex codes das cores dominantes)
- Logo (URL ou descricao)
- Fontes usadas (font-family do CSS)
- Tom de voz (formal, casual, tecnico)
- Tipo de negocio e sector
- Conteudo principal (hero text, servicos, about)
3. Guardar analise em `/tmp/cinematic-site/brand-analysis.json`:
```json
{
"url": "https://...",
"business": "restaurante italiano",
"colors": {"primary": "#2C3E50", "secondary": "#E74C3C", "accent": "#F39C12"},
"fonts": {"heading": "Playfair Display", "body": "Inter"},
"tone": "acolhedor e premium",
"logo_description": "...",
"hero_text": "...",
"sections": ["sobre", "menu", "reservas", "contacto"]
}
```
### Passo 2 — Scene Generation
Com base na analise, definir o design cinematografico:
1. **Hero section:** escolher tipo de animacao:
- Parallax com imagem de fundo
- Scroll-reveal progressivo
- Video background concept (descricao, nao video real)
- Cursor-follow effect
2. **3-5 seccoes adicionais** com animacoes scroll-based:
- Referenciar `Hub/04-Stack/02.03-IA/biblioteca-animacoes-scroll.md` para patterns disponiveis
3. **Responsive breakpoints:** mobile-first, 3 breakpoints (mobile, tablet, desktop)
4. Guardar plano em `/tmp/cinematic-site/scene-plan.md`
### Passo 3 — Build
Gerar ficheiros HTML/CSS/JS:
1. Criar `/tmp/cinematic-site/output/`:
- `index.html` — single-page com todas as seccoes
- `styles.css` — Tailwind ou CSS puro
- `animations.js` — scroll observers + animacoes
2. Regras de qualidade:
- Referenciar `design.json` Descomplicar para standards
- Mobile-first
- Core Web Vitals: LCP <2.5s, CLS <0.1
- Sem dependencias externas pesadas (max framer-motion ou CSS puro)
- Acessibilidade basica (alt text, contraste, focus states)
3. Incluir comentarios no HTML com seccoes claras
### Passo 4 — Preview
1. Abrir `index.html` no browser local: `xdg-open /tmp/cinematic-site/output/index.html`
2. Tirar screenshot via `mcp__chrome-devtools__take_screenshot`
3. Mostrar comparacao ao utilizador:
- Site original (URL)
- Novo site (screenshot)
4. Pedir aprovacao antes de qualquer proximo passo
5. Se aprovado, sugerir opcoes:
- Copiar para pasta de projecto
- Ajustar cores/seccoes
- Exportar para Vercel/Netlify (manual)
---
## Regras
- **Nunca deploy automatico** — apenas preview local
- **Nunca inventar conteudo** — usar texto real do site original
- **Sempre referenciar design.json** para standards visuais
- **Output em /tmp/cinematic-site/** — nunca em pastas de projecto sem aprovacao
- **README.md incluido** com instrucoes de deploy manual
---
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
+278
View File
@@ -0,0 +1,278 @@
---
name: clone-style
description: Clona o estilo visual de um site ou apresentação extraindo design tokens (cores, tipografia, espaçamento, raios, sombras) e gerando JSON compatível com Stitch, design-engine e pptx-generator. Usar quando "clonar estilo", "clone style", "extrair design", "copiar visual", "tokens design", "clone web", "clone slides", "design tokens".
---
# /clone-style — Extrair Design Tokens de Sites e Slides
## Princípio fundamental
**Não tentes recriar visualmente — extrai o sistema.** Captura os tokens (cores, fontes, espaçamentos, raios) e alimenta uma ferramenta generativa. A fidelidade vem do sistema, não da imitação pixel a pixel.
## Modos
| Comando | Fonte | Output |
|---|---|---|
| `/clone-style web <url>` | Site live (browser real, CSS computado) | `tokens.json` + screenshots componentes |
| `/clone-style slides <pptx_path>` | Ficheiro PPTX local | `tokens.json` (theme1.xml + slideMasters) |
| `/clone-style apply <tokens.json>` | Design tokens já extraídos | Aplicação no Stitch / design-engine / pptx-generator |
---
## Modo 1 — Web
### Workflow
1. **Abrir URL no Chrome real** via `mcp__claude-in-chrome__navigate` (preferido — captura sessões logged-in se necessário) ou `mcp__chrome-devtools__navigate_page`.
2. **Aguardar render completo** (`wait_for` "load" + 2s extra para JS).
3. **Injectar script de extracção** via `mcp__claude-in-chrome__javascript_tool` ou `mcp__chrome-devtools__evaluate_script`. O script está em `references/extract-web-tokens.js`. Cola-o dentro do tool call.
4. **O script devolve JSON estruturado** com:
- `colors`: paleta deduplicada + ranking por frequência (top 12)
- `fonts`: famílias únicas + tamanhos + pesos + line-heights
- `spacing`: gaps/paddings/margins agrupados (encontra grid base 4px/8px)
- `borderRadius`: pequeno/médio/grande/full (clusters)
- `shadows`: box-shadows únicas
- `componentes`: HTML+CSS de buttons, cards, nav, hero (capturados como referência)
5. **Capturar screenshots** dos componentes detectados via `mcp__chrome-devtools__take_screenshot` ou `mcp__claude-in-chrome__computer` (full + por componente).
6. **Mapear para Stitch** (ver secção "Mapeamento Stitch" abaixo) — cores → primary seed, fonte mais usada → enum match, raio dominante → ROUND_*.
7. **Guardar** em `~/.claude-work/clone-style/<dominio>-<timestamp>/tokens.json` + `screenshots/`.
### Comando exemplo
```
/clone-style web https://linear.app
```
Output esperado:
- `~/.claude-work/clone-style/linear-app-20260407/tokens.json`
- `~/.claude-work/clone-style/linear-app-20260407/screenshots/full.png`
- `~/.claude-work/clone-style/linear-app-20260407/screenshots/hero.png`
- `~/.claude-work/clone-style/linear-app-20260407/screenshots/buttons.png`
- Resumo no terminal: paleta + fontes + sugestão de aplicação
---
## Modo 2 — Slides (PPTX)
PPTX é um ZIP de XML. Toda a informação de tema está em `ppt/theme/theme1.xml` e `ppt/slideMasters/slideMaster1.xml`.
### Workflow
1. **Verificar input** existe e é PPTX válido (`unzip -l <file>` para listar entradas).
2. **Extrair em tmp**: `unzip -o <file> -d /tmp/clone-style-pptx-<ts>/`.
3. **Parsear `theme1.xml`** (Python ou xmllint):
```python
import xml.etree.ElementTree as ET
ns = {'a': 'http://schemas.openxmlformats.org/drawingml/2006/main'}
tree = ET.parse('ppt/theme/theme1.xml')
root = tree.getroot()
# Cores tema (accent1-6, dark1, dark2, light1, light2, hyperlink, followedHyperlink)
colors = {}
for child in root.iter('{http://schemas.openxmlformats.org/drawingml/2006/main}clrScheme'):
for color_node in child:
name = color_node.tag.split('}')[1]
srgb = color_node.find('a:srgbClr', ns)
sysclr = color_node.find('a:sysClr', ns)
if srgb is not None:
colors[name] = '#' + srgb.get('val')
elif sysclr is not None:
colors[name] = '#' + sysclr.get('lastClr', '000000')
# Fontes (major = headlines, minor = body)
fonts = {}
for fs in root.iter('{http://schemas.openxmlformats.org/drawingml/2006/main}fontScheme'):
major = fs.find('a:majorFont/a:latin', ns)
minor = fs.find('a:minorFont/a:latin', ns)
if major is not None: fonts['headline'] = major.get('typeface')
if minor is not None: fonts['body'] = minor.get('typeface')
```
4. **Parsear `slideMaster1.xml`** para layouts dominantes (background, posições, sizes default).
5. **Output `tokens.json`** no mesmo formato do Modo 1 (para que `apply` seja unificado).
### Comando exemplo
```
/clone-style slides /home/ealmeida/Downloads/template-cliente.pptx
```
---
## Modo 3 — Apply
Recebe `tokens.json` e aplica numa das 3 ferramentas:
### A) Stitch (web/UI)
**Limitação importante:** Stitch só aceita um conjunto restrito de tokens (ver schema `mcp__stitch__create_design_system`):
- 1 `customColor` (seed) + opcionais `overridePrimaryColor`/`overrideSecondaryColor`/`overrideTertiaryColor`/`overrideNeutralColor`
- `headlineFont` / `bodyFont` / `labelFont` de **enum fixo** (29 Google Fonts: INTER, ROBOTO, MANROPE, GEIST, etc.)
- `roundness`: ROUND_4 / ROUND_8 / ROUND_12 / ROUND_FULL
- `colorMode`: LIGHT / DARK
- `designMd`: markdown livre para tudo o que não cabe nos campos acima
**Mapeamento Stitch:**
```
tokens.colors.dominant → customColor (seed)
tokens.colors.top[1..3] → overridePrimary/Secondary/Tertiary
tokens.colors.neutral → overrideNeutralColor
tokens.fonts.headline.family
→ match com enum Stitch (fuzzy: "Helvetica" → INTER, "Söhne" → INTER, etc.)
→ headlineFont
tokens.fonts.body.family
→ match enum → bodyFont
tokens.borderRadius.dominant
→ 4px → ROUND_4
→ 8-10px → ROUND_8
→ 12-14px → ROUND_12
→ ≥16px ou full → ROUND_FULL
tokens.background.dark? → colorMode: DARK, else LIGHT
# Tudo o resto vai para designMd:
designMd: |
## Estilo extraído de <fonte>
### Tipografia adicional
- Display: <font> <size> <weight>
- Caption: <font> <size> <weight>
### Espaçamento
Grid base: <Npx>
Escala: 4, 8, 16, 24, 32, 48, 64
### Sombras
- sm: <box-shadow>
- md: <box-shadow>
- lg: <box-shadow>
### Tom visual
<descrição em prosa: minimalista, denso, colorido, monocromático, etc.>
```
Depois chama `mcp__stitch__create_design_system` com este payload.
### B) design-engine (brand pack)
Cria um JSON brand pack em `/media/ealmeida/Dados/Hub/04-Recursos/Design/brands/<nome>.json` com formato:
```json
{
"name": "<nome>",
"source": "cloned from <url|pptx>",
"extracted_at": "2026-04-07",
"colors": { "primary": "#...", "secondary": "#...", "neutral": "#...", "accent": "#..." },
"fonts": { "headline": "Inter", "body": "Inter" },
"borderRadius": "8px",
"tone": "minimalista, profissional, denso"
}
```
Depois `mcp__design-engine__brand_load(<nome>)` para usar em `generate_image`.
### C) pptx-generator (slides)
Aplica os tokens via XML manipulation no template Descomplicar (ver `/pptx-generator`). Substitui:
- Cores accent1-6 do `theme1.xml` pelos extraídos
- Fontes major/minor pelas extraídas
- Mantém layouts/positioning do template Descomplicar (não copia layouts da fonte original — só estilo)
---
## Mapeamento de fontes (fuzzy → Stitch enum)
Quando `tokens.fonts.headline.family` não está no enum Stitch, mapear:
| Família detectada | Stitch enum |
|---|---|
| Helvetica, Helvetica Neue, Arial, sans-serif genérico | INTER |
| Söhne, Inter, system-ui | INTER |
| Roboto, Roboto Flex | (não existe — usar INTER) |
| SF Pro, -apple-system | INTER |
| GT Walsheim, Geist, Mona Sans | GEIST |
| Manrope | MANROPE |
| Plus Jakarta, Jakarta | PLUS_JAKARTA_SANS |
| DM Sans | DM_SANS |
| IBM Plex Sans | IBM_PLEX_SANS |
| Sora | SORA |
| Times, serif genérico | NEWSREADER |
| Garamond, EB Garamond | EB_GARAMOND |
| Playfair, Domine | DOMINE |
Se nenhum match óbvio, **default INTER** (mais neutro). Adicionar nota em `designMd` com a fonte original detectada.
---
## Anti-patterns
| Não fazer | Razão |
|---|---|
| Tentar reproduzir layout pixel a pixel | Impossível e gera "AI slop" |
| Usar `cssstats.com` ou scrapers HTML estáticos | Falham em sites JS-rendered (Next.js, React, etc.) |
| Importar HTML inteiro como Stitch screen | Stitch não importa HTML; gera de prompt+tokens |
| Aplicar Stitch design-system sem `customColor` válido | Validation error — `customColor` é obrigatório |
| Esquecer de usar `designMd` para tokens fora do enum | Perde-se 50% da informação extraída |
---
## Validação (critérios para "OK")
Antes de declarar a clonagem completa:
1. ✅ `tokens.json` existe e tem `colors`, `fonts`, `borderRadius` no mínimo
2. ✅ Pelo menos 1 screenshot guardado
3. ✅ Mapeamento Stitch produz `customColor` válido (hex format)
4. ✅ Pelo menos 1 fonte mapeada para enum Stitch
5. ✅ `designMd` tem ≥3 secções (tipografia, espaçamento, tom)
6. ✅ Se modo `apply`: validação visual pelo utilizador antes de marcar "concluído"
---
## Exemplos práticos
### Clonar Linear
```
/clone-style web https://linear.app
```
Esperado: paleta dominante azul/roxo, fontes Inter ou similar, raios 6-8px, dark mode default.
### Clonar template cliente
```
/clone-style slides ~/Downloads/cliente-deck.pptx
```
Esperado: cores accent do tema PPTX, fontes major/minor, proposta de paleta unificada.
### Aplicar a novo projecto Stitch
```
/clone-style apply ~/.claude-work/clone-style/linear-app-20260407/tokens.json
```
Cria design system Stitch + brand pack design-engine.
---
## Referências internas
- `references/extract-web-tokens.js` — script JS de extracção CSS computado
- `references/extract-pptx-theme.py` — script Python para parsear theme1.xml
- `~/.claude-work/clone-style/` — cache de extracções (timestamped)
---
**Versão:** 1.0.0 | **Data:** 2026-04-07 | **Autor:** Descomplicar (sessão 5)
**Origem:** Necessidade real — clonagem de estilos em propostas comerciais. Substitui tentativas falhadas com Penpot, scrapers HTML, screenshots+AI, Figma import.
@@ -0,0 +1,133 @@
#!/usr/bin/env python3
"""
extract-pptx-theme.py — extrai design tokens de um ficheiro PPTX
Uso:
python3 extract-pptx-theme.py <caminho.pptx> [--output tokens.json]
Devolve JSON no mesmo formato do extract-web-tokens.js para que /clone-style apply
seja unificado entre os 2 modos.
"""
import sys
import json
import zipfile
import xml.etree.ElementTree as ET
from pathlib import Path
from datetime import datetime, timezone
NS = {'a': 'http://schemas.openxmlformats.org/drawingml/2006/main'}
def extract_theme(pptx_path: Path) -> dict:
if not pptx_path.exists():
raise FileNotFoundError(f"Não encontrado: {pptx_path}")
with zipfile.ZipFile(pptx_path) as z:
# Listar themes (pode haver múltiplos; usar o primeiro)
theme_files = sorted([n for n in z.namelist() if n.startswith('ppt/theme/theme') and n.endswith('.xml')])
if not theme_files:
raise ValueError("PPTX sem theme — formato inválido ou corrompido")
theme_xml = z.read(theme_files[0])
root = ET.fromstring(theme_xml)
# Extrair cores do clrScheme
colors = {}
for clr_scheme in root.iter('{http://schemas.openxmlformats.org/drawingml/2006/main}clrScheme'):
for color_node in clr_scheme:
name = color_node.tag.split('}')[1] # ex: 'accent1', 'dk1', 'lt1'
srgb = color_node.find('a:srgbClr', NS)
sysclr = color_node.find('a:sysClr', NS)
if srgb is not None:
colors[name] = '#' + srgb.get('val')
elif sysclr is not None:
# sysClr usa o lastClr como fallback (cor resolvida)
colors[name] = '#' + sysclr.get('lastClr', '000000')
# Extrair fontes do fontScheme
fonts = {'headline': None, 'body': None}
for fs in root.iter('{http://schemas.openxmlformats.org/drawingml/2006/main}fontScheme'):
major = fs.find('a:majorFont/a:latin', NS)
minor = fs.find('a:minorFont/a:latin', NS)
if major is not None:
fonts['headline'] = major.get('typeface')
if minor is not None:
fonts['body'] = minor.get('typeface')
# Mapear cores PPTX → estrutura unificada
accent_keys = ['accent1', 'accent2', 'accent3', 'accent4', 'accent5', 'accent6']
accents = [colors[k] for k in accent_keys if k in colors]
primary = colors.get('accent1') or accents[0] if accents else '#000000'
secondary = colors.get('accent2')
tertiary = colors.get('accent3')
neutral = colors.get('lt1') or colors.get('dk1') or '#ffffff'
background = colors.get('lt1') or colors.get('bg1') or '#ffffff'
is_dark = colors.get('lt1', '#ffffff').lstrip('#').upper() != 'FFFFFF'
return {
'url': str(pptx_path),
'title': pptx_path.stem,
'source': 'pptx',
'timestamp': datetime.now(timezone.utc).isoformat(),
'colors': {
'top': [{'value': v, 'count': 1} for v in accents],
'backgrounds': [{'value': background, 'count': 1}],
'dominant': primary,
'raw_scheme': colors,
},
'fonts': {
'families': [
{'value': fonts['headline'], 'count': 1, 'role': 'headline'},
{'value': fonts['body'], 'count': 1, 'role': 'body'},
],
'sizes': [],
'weights': [],
'lineHeights': [],
},
'borderRadius': [],
'shadows': [],
'spacing': {'gridBaseGuess': 8, 'top': []},
'components': {},
'meta': {
'colorMode': 'DARK' if is_dark else 'LIGHT',
'theme_file': theme_files[0],
'accent_count': len(accents),
},
'mapping_hint': {
'stitch_customColor': primary,
'stitch_overrideSecondary': secondary,
'stitch_overrideTertiary': tertiary,
'stitch_overrideNeutral': neutral,
'note': 'PPTX só fornece cores e fontes — borderRadius/shadows/spacing têm de ser definidos manualmente em designMd',
},
}
def main():
if len(sys.argv) < 2:
print(__doc__, file=sys.stderr)
sys.exit(1)
pptx = Path(sys.argv[1]).expanduser().resolve()
output_path = None
if '--output' in sys.argv:
idx = sys.argv.index('--output')
if idx + 1 < len(sys.argv):
output_path = Path(sys.argv[idx + 1]).expanduser().resolve()
tokens = extract_theme(pptx)
js = json.dumps(tokens, indent=2, ensure_ascii=False)
if output_path:
output_path.parent.mkdir(parents=True, exist_ok=True)
output_path.write_text(js, encoding='utf-8')
print(f"✅ Tokens guardados em {output_path}", file=sys.stderr)
else:
print(js)
if __name__ == '__main__':
main()
@@ -0,0 +1,122 @@
// extract-web-tokens.js
// Injectar via mcp__claude-in-chrome__javascript_tool ou mcp__chrome-devtools__evaluate_script
// Devolve JSON com cores, fontes, espaçamentos, raios, sombras e amostras de componentes.
// Funciona em qualquer site (incluindo JS-rendered) porque usa getComputedStyle().
(() => {
const all = document.querySelectorAll('*');
const colorCounts = {};
const fontFamilies = {};
const fontSizes = {};
const fontWeights = {};
const lineHeights = {};
const radii = {};
const shadows = {};
const spacings = {};
const bgColors = {};
const norm = (v) => (v || '').trim();
const inc = (obj, k) => { if (!k || k === 'none' || k === '0px') return; obj[k] = (obj[k] || 0) + 1; };
// Helper: rgb(a) → hex (ignora transparente)
const toHex = (rgb) => {
if (!rgb || rgb === 'transparent' || rgb === 'rgba(0, 0, 0, 0)') return null;
const m = rgb.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);
if (!m) return null;
const a = m[4] !== undefined ? parseFloat(m[4]) : 1;
if (a < 0.1) return null;
const h = (n) => parseInt(n).toString(16).padStart(2, '0');
return '#' + h(m[1]) + h(m[2]) + h(m[3]);
};
for (const el of all) {
if (!(el instanceof Element)) continue;
const cs = getComputedStyle(el);
// Cores
inc(colorCounts, toHex(cs.color));
const bg = toHex(cs.backgroundColor);
if (bg) {
inc(bgColors, bg);
inc(colorCounts, bg);
}
inc(colorCounts, toHex(cs.borderColor));
// Fontes
inc(fontFamilies, norm(cs.fontFamily));
inc(fontSizes, norm(cs.fontSize));
inc(fontWeights, norm(cs.fontWeight));
inc(lineHeights, norm(cs.lineHeight));
// Raios
inc(radii, norm(cs.borderRadius));
// Sombras
if (cs.boxShadow && cs.boxShadow !== 'none') inc(shadows, cs.boxShadow);
// Espaçamentos (paddings + margins + gap)
['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'gap', 'rowGap', 'columnGap'].forEach((p) => {
inc(spacings, norm(cs[p]));
});
}
// Top N por frequência
const topN = (obj, n) => Object.entries(obj).sort((a, b) => b[1] - a[1]).slice(0, n).map(([k, v]) => ({ value: k, count: v }));
// Detectar grid base (espaçamento mais comum)
const numericSpacings = Object.entries(spacings)
.map(([k, v]) => [parseFloat(k), v])
.filter(([n]) => !isNaN(n) && n > 0 && n < 200)
.sort((a, b) => b[1] - a[1]);
const gridBase = numericSpacings[0]?.[0] || 8;
// Capturar samples HTML de componentes-chave (pelo selector)
const sample = (sel) => {
const el = document.querySelector(sel);
if (!el) return null;
return {
html: el.outerHTML.substring(0, 800),
computed: {
bg: toHex(getComputedStyle(el).backgroundColor),
color: toHex(getComputedStyle(el).color),
radius: getComputedStyle(el).borderRadius,
padding: getComputedStyle(el).padding,
font: getComputedStyle(el).fontFamily,
}
};
};
return {
url: location.href,
title: document.title,
timestamp: new Date().toISOString(),
colors: {
top: topN(colorCounts, 12),
backgrounds: topN(bgColors, 6),
dominant: topN(colorCounts, 1)[0]?.value || null,
},
fonts: {
families: topN(fontFamilies, 5),
sizes: topN(fontSizes, 8),
weights: topN(fontWeights, 6),
lineHeights: topN(lineHeights, 6),
},
borderRadius: topN(radii, 6),
shadows: topN(shadows, 5),
spacing: {
gridBaseGuess: gridBase,
top: topN(spacings, 12),
},
components: {
button: sample('button, .btn, [class*="button" i]'),
card: sample('.card, [class*="card" i]'),
nav: sample('nav, header, [class*="nav" i]'),
hero: sample('main > section:first-child, .hero, [class*="hero" i]'),
},
meta: {
colorMode: getComputedStyle(document.body).backgroundColor.includes('255') ? 'LIGHT' : 'DARK',
lang: document.documentElement.lang || 'unknown',
viewport: document.querySelector('meta[name=viewport]')?.content || null,
}
};
})();
+66
View File
@@ -0,0 +1,66 @@
---
name: design-b2b
description: >
Design system para serviços B2B — agências, consultoria, SaaS, PMEs portuguesas.
Propostas visuais, landing pages, apresentações e materiais para decisores PT.
Usar quando: proposta comercial, landing page serviço B2B, apresentação cliente,
one-pager, ou qualquer material visual para audiência empresarial portuguesa.
---
# /design-b2b — Design System Serviços B2B
## Paleta
```css
--primary: #1e3a5f; /* Azul institucional — confiança, autoridade */
--accent: #f97316; /* Laranja acção — CTAs, destaques */
--neutral: #f8fafc; /* Fundo profissional */
--text: #1e293b; /* Texto principal */
--muted: #64748b; /* Texto secundário, legendas */
--border: #e2e8f0; /* Divisores subtis */
```
## Estrutura proposta comercial
### One-pager (1 A4 ou landing page equivalente)
1. **Header:** Logo cliente + logo Descomplicar + título proposta
2. **Problema:** 2-3 bullets do problema actual do cliente
3. **Solução:** O que entregamos (concreto, não vago)
4. **Resultados:** Métricas esperadas (%, EUR, tempo)
5. **Investimento:** Preço claro, sem asteriscos escondidos
6. **Próximo passo:** CTA único — "Agendar Reunião" ou "Aceitar Proposta"
### Landing page serviço B2B
1. Headline: benefício principal (não feature)
2. Sub-headline: para quem é + resultado esperado
3. Prova social: 3 logos de clientes ou 1 case study
4. Serviços: 3-5 cards com ícone + nome + 1 linha
5. Processo: 3-4 passos (simples e claro)
6. CTA: formulário simples (nome, email, empresa, mensagem)
## Tom e linguagem B2B PT
- **Usar:** "optimizar", "aumentar eficiência", "reduzir custos"
- **Evitar:** "disruptivo", "revolucionário", "próximo nível"
- **Tratamento:** "Você" (neutro) ou "A sua empresa" — nunca "tu" em contexto formal
- **Números:** sempre com fonte (ex: "30% redução de custos — caso Empresa X")
## Anti-slop checklist B2B
- [ ] Zero jargão sem explicação
- [ ] Preços ou "Solicitar orçamento" — nunca ambiguidade
- [ ] Casos reais, não hipotéticos
- [ ] Mobile: decisores usam telemóvel para primeiro contacto
- [ ] Social proof: logo real, não ilustração
## Referências visuais
Ver `~/.claude/design/referencias-visuais/servicos-b2b/`
---
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
@@ -0,0 +1,64 @@
---
name: design-ecommerce
description: >
Design system para e-commerce — lojas WooCommerce, páginas produto, checkout PT.
Optimização conversão, layouts loja, UX checkout e elementos de confiança.
Usar quando: criar ou optimizar loja WooCommerce, página produto, carrinho,
checkout, ou qualquer elemento visual de e-commerce para mercado português.
---
# /design-ecommerce — Design System E-commerce
## Paleta base (adaptar à marca do cliente)
```css
--cta: #dc2626; /* Vermelho urgência — "Comprar Agora" */
--trust: #16a34a; /* Verde confiança — "Pagamento Seguro" */
--price: #1e3a5f; /* Azul preço destacado */
--sale: #f59e0b; /* Âmbar promoção */
--neutral: #ffffff;
--text: #111827;
```
## Elementos conversão obrigatórios
### Página produto
1. Imagens: mínimo 4 ângulos, zoom, vídeo se possível
2. Preço: destacado, desconto visível, preço original riscado
3. Stock: urgência ("Últimas 3 unidades")
4. CTA: "Adicionar ao Carrinho" (vermelho, proeminente)
5. Confiança: selos Visa/MB/MBWay + devolução 30 dias
6. Avaliações: estrelas + número (social proof)
7. "Também pode gostar" + "Compraram juntos"
### Checkout PT
- Referência Multibanco visível
- MB Way como opção principal
- Campo NIF opcional (B2B)
- Morada: formato PT (Rua, nº, andar, código postal, localidade)
### Elementos de confiança PT
- Selos: MBWay, Visa, Mastercard, PayPal
- "Envio para Portugal Continental em 24-48h"
- "Devolução gratuita em 30 dias"
- "Suporte em português"
## Anti-slop checklist e-commerce
- [ ] Preços em EUR (não USD)
- [ ] CTAs em PT-PT: "Comprar" não "Buy", "Carrinho" não "Cart"
- [ ] Mobile: checkout testado em 375px (maioria compra no telemóvel)
- [ ] Tempo de carregamento: imagens optimizadas <100KB
- [ ] Trust badges visíveis acima do fold
## Referências visuais
Ver `~/.claude/design/referencias-visuais/ecommerce/`
---
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
+62
View File
@@ -0,0 +1,62 @@
---
name: design-saude
description: >
Design system para sector saúde — clínicas, KiviCare, consultórios médicos.
Paleta, tipografia, CTAs e layouts optimizados para contexto clínico PT.
Usar quando: criar landing page de clínica, página de serviços médicos,
agendamento online, ou qualquer material visual para clientes saúde.
---
# /design-saude — Design System Saúde
## Paleta
```css
--primary: #0ea5e9; /* Azul confiança médica */
--secondary: #10b981; /* Verde saúde/cura */
--neutral: #f8fafc; /* Fundo limpo e asséptico */
--text: #1e293b; /* Texto principal */
--accent: #f59e0b; /* CTA urgência (marcar consulta) */
--danger: #ef4444; /* Alertas, urgências */
```
## Tipografia
- **Títulos:** Inter SemiBold — transmite profissionalismo sem frieza
- **Corpo:** Inter Regular 16px, line-height 1.7 — legibilidade para público 40+
- **Evitar:** fontes decorativas, cursivas, serifas antiquadas
## Layouts obrigatórios
### Landing page clínica
1. Hero: foto médico real + headline "Cuidamos de si" + CTA "Marcar Consulta"
2. Serviços: cards com ícone + nome + preço (se disponível)
3. Equipa: fotos reais + credenciais
4. Depoimentos: com nome e tratamento (anonimizado se necessário)
5. Localização + horários + contacto
6. CTA final: WhatsApp ou formulário
### CTAs saúde
- Principal: "Marcar Consulta" (verde, proeminente)
- Secundário: "Saber Mais" ou "Ver Serviços"
- Urgência: "Consulta Hoje" (âmbar)
## Anti-slop checklist saúde
- [ ] Fotos de pessoas reais (não stock de médicos brancos genéricos)
- [ ] RGPD: sem dados de pacientes visíveis em mockups
- [ ] Cores acessíveis: contraste WCAG AA mínimo
- [ ] Mobile: formulário agendamento testado em 375px
- [ ] PT-PT: "consulta" não "appointment", "médico" não "doctor"
## Referências visuais
Ver `~/.claude/design/referencias-visuais/saude/`
---
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
+60
View File
@@ -0,0 +1,60 @@
---
name: design-solar
description: >
Design system para sector solar/fotovoltaico — SolarFV, instaladores, B2B energia.
Paleta, calculadoras, propostas visuais e layouts para sector energias renováveis PT.
Usar quando: landing page solar, proposta instalação FV, calculadora poupança,
ou material visual para clientes energia solar.
---
# /design-solar — Design System Solar/FV
## Paleta
```css
--primary: #f59e0b; /* Amarelo solar — energia, optimismo */
--secondary: #1e3a5f; /* Azul escuro — confiança, profissionalismo B2B */
--green: #16a34a; /* Verde sustentabilidade */
--neutral: #f9fafb; /* Fundo limpo */
--text: #111827; /* Texto principal */
```
## Elementos distintivos sector solar
### Calculadora de poupança (elemento central)
- Input: consumo mensal kWh + factura actual
- Output: poupança anual estimada + payback em anos
- Visual: comparação antes/depois com gráfico simples
### Proposta instalação
1. Sumário executivo (1 página): consumo actual → produção estimada → ROI
2. Especificações técnicas: painéis, inversor, capacidade
3. Financiamento: opções (compra, leasing, PPA)
4. Garantias e certificações
5. CTA: "Solicitar Visita Técnica"
## Tipografia
- **Títulos:** Poppins Bold — moderno, energético
- **Dados/métricas:** Inter Mono — leiturabilidade para números
- **Corpo:** Inter Regular
## Anti-slop checklist solar
- [ ] Números reais de produção (não inventar kWh)
- [ ] Certificações visíveis (DGEG, SCE)
- [ ] Mobile: calculadora funcional em 375px
- [ ] B2B: tom técnico e sóbrio (não "salve o planeta")
- [ ] PT: "fotovoltaico" não "fotovoltaica" (painel fotovoltaico)
## Referências visuais
Ver `~/.claude/design/referencias-visuais/solar/`
---
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
+30 -16
View File
@@ -44,11 +44,11 @@ Integrar insights do NotebookLM nas recomendações e decisões.
|---------|--------|-------| |---------|--------|-------|
| `/design [descricao]` | Routing automatico | Auto | | `/design [descricao]` | Routing automatico | Auto |
| `/design presentation [tema]` | Apresentacao PPTX/PDF | Presenton | | `/design presentation [tema]` | Apresentacao PPTX/PDF | Presenton |
| `/design infographic [tema]` | Infografico PNG/PDF | Penpot + AI | | `/design infographic [tema]` | Infografico PNG/PDF | design-engine (Fibo/Gemini) |
| `/design social [plataforma] [tema]` | Post redes sociais | Penpot | | `/design social [plataforma] [tema]` | Post redes sociais | design-engine |
| `/design web [descricao]` | Landing page / web component | Stitch | | `/design web [descricao]` | Landing page / web component | **Stitch (motor principal)** |
| `/design logo [nome]` | Logo SVG + variacoes | Penpot + Fibo | | `/design logo [nome]` | Logo SVG + variacoes | design-engine + Fibo |
| `/design brand [empresa]` | Identidade visual completa | Todos | | `/design brand [empresa]` | Identidade visual completa | Stitch + design-engine |
| `/design from-reference [url]` | Analisa e recria adaptado | Auto | | `/design from-reference [url]` | Analisa e recria adaptado | Auto |
## Parametros Opcionais ## Parametros Opcionais
@@ -66,11 +66,11 @@ Integrar insights do NotebookLM nas recomendações e decisões.
1. PARSE comando e parametros 1. PARSE comando e parametros
2. IDENTIFICAR tipo de output 2. IDENTIFICAR tipo de output
- "presentation" / "slides" / "proposta" -> Presenton - "presentation" / "slides" / "proposta" -> Presenton
- "infographic" / "poster" / "flyer" -> Penpot - "infographic" / "poster" / "flyer" -> design-engine (Fibo/Gemini)
- "social" / "instagram" / "linkedin" -> Penpot (dimensoes) - "social" / "instagram" / "linkedin" -> design-engine (com dimensões)
- "web" / "landing" / "page" / "ui" -> Stitch - "web" / "landing" / "page" / "ui" -> Stitch
- "logo" / "icone" / "marca" -> Penpot + Fibo - "logo" / "icone" / "marca" -> design-engine + Fibo
- "brand" / "identidade" -> Pipeline completo - "brand" / "identidade" -> Stitch (web) + design-engine (assets)
- "from-reference" -> Researcher primeiro - "from-reference" -> Researcher primeiro
3. SE --brand especificado: 3. SE --brand especificado:
- Carregar brand pack via design-engine MCP: brand_load(nome) - Carregar brand pack via design-engine MCP: brand_load(nome)
@@ -91,7 +91,7 @@ Resultado: PPTX profissional via Presenton com cores dourado/preto, logo Descomp
``` ```
/design social instagram "Promocao Black Friday -30%" /design social instagram "Promocao Black Friday -30%"
``` ```
Resultado: Imagem 1080x1080 composta no Penpot com texto, cores e layout profissional. Resultado: Imagem 1080x1080 gerada via design-engine (Fibo/Gemini) com texto, cores e layout profissional.
### Landing page ### Landing page
``` ```
@@ -103,7 +103,7 @@ Resultado: HTML/CSS via Stitch com Design DNA da marca.
``` ```
/design infographic "Top 10 tendencias AI 2026" /design infographic "Top 10 tendencias AI 2026"
``` ```
Resultado: PNG/PDF vertical composto no Penpot com icones, dados e hierarquia visual. Resultado: PNG/PDF vertical gerado via design-engine com icones, dados e hierarquia visual.
### Identidade visual completa ### Identidade visual completa
``` ```
@@ -117,16 +117,17 @@ Resultado: Logo + paleta + tipografia + templates social + template apresentacao
``` ```
Resultado: Analisa design Figma, extrai estilo, recria adaptado. Resultado: Analisa design Figma, extrai estilo, recria adaptado.
## 5 MCPs de Design ## MCPs de Design (4)
| MCP | Funcao | | MCP | Funcao |
|-----|--------| |-----|--------|
| **design-engine** | Imagens AI (Fibo/Gemini) + brand packs + rembg | | **design-engine** | Imagens AI (Fibo/Gemini) + brand packs + rembg + composição |
| **presenton** | Apresentacoes AI (slide.descomplicar.pt) | | **presenton** | Apresentacoes AI (slide.descomplicar.pt) |
| **penpot** | Compositor visual (pen.descomplicar.pt) | | **stitch** | Web design AI text→UI (Google Labs) — motor principal para web/ui/landing |
| **stitch** | Web design AI (Google) |
| **figma** | Analise referencias (read-only) | | **figma** | Analise referencias (read-only) |
> **Penpot suspenso 07-04-2026 sessão 5** — substituído por Stitch (text→UI generation). MCP penpot removido. Se Stitch for descontinuado, reavaliar.
## Brand Packs Disponiveis ## Brand Packs Disponiveis
Verificar com: `brand_list()` via design-engine MCP. Verificar com: `brand_list()` via design-engine MCP.
@@ -153,4 +154,17 @@ fidelidade, concisao visual, legibilidade, profissionalismo, brand compliance.
--- ---
**Versao**: 2.0.0 | **Data**: 2026-02-12 | **Autor**: Descomplicar **Versao**: 2.1.0 | **Data**: 2026-04-07 | **Autor**: Descomplicar
**v2.1.0:** Penpot removido como motor activo (substituído por Stitch para web/ui e design-engine para imagens/social/infográficos). Workflow simplificado.
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+124
View File
@@ -0,0 +1,124 @@
---
name: benchmark
description: >
Mede Core Web Vitals e performance antes/depois de alterações. Detecta regressões.
Usar antes e depois de qualquer alteração a WP, WooCommerce, Next.js ou infra.
Baseado no gstack /benchmark. Eixo 2B.
---
# /benchmark — Performance Antes/Depois
Medir o impacto real de alterações. Nunca fazer deploy sem benchmark.
---
## Quando Usar
- Antes de qualquer optimização de performance
- Antes de deploy de plugins/temas WordPress
- Antes de alterações ao servidor ou cache
- Antes de implementar nova feature em produção
- Como baseline mensal de cada site
---
## Métricas Alvo (Core Web Vitals 2024)
| Métrica | Bom | Precisa Melhorar | Mau |
|---------|-----|-----------------|-----|
| LCP (Largest Contentful Paint) | ≤2.5s | 2.5-4.0s | >4.0s |
| FID / INP (Interaction to Next Paint) | ≤200ms | 200-500ms | >500ms |
| CLS (Cumulative Layout Shift) | ≤0.1 | 0.1-0.25 | >0.25 |
| TTFB (Time to First Byte) | ≤800ms | 800-1800ms | >1800ms |
| FCP (First Contentful Paint) | ≤1.8s | 1.8-3.0s | >3.0s |
---
## Protocolo
### Passo 1 — Baseline (ANTES)
```bash
# Via MCP Lighthouse (se disponível)
mcp__lighthouse__get_core_web_vitals({ url: "<URL>" })
mcp__lighthouse__run_audit({ url: "<URL>", categories: ["performance"] })
# Ou via Lighthouse CLI no servidor
ssh server "lighthouse <URL> --output=json --output-path=/tmp/before.json --chrome-flags='--headless'"
# Ou via PageSpeed Insights API
curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=<URL>&strategy=mobile" | jq '.lighthouseResult.categories.performance.score'
```
**Guardar baseline:**
```bash
BEFORE_LCP=<valor>
BEFORE_CLS=<valor>
BEFORE_FCP=<valor>
BEFORE_SCORE=<valor>
```
### Passo 2 — Executar Alteração
Fazer a alteração (deploy, optimização, plugin, etc.)
### Passo 3 — Depois
```bash
# Repetir as mesmas medições
mcp__lighthouse__get_core_web_vitals({ url: "<URL>" })
AFTER_LCP=<valor>
AFTER_CLS=<valor>
AFTER_FCP=<valor>
AFTER_SCORE=<valor>
```
### Passo 4 — Comparação
```markdown
## Benchmark — [Site] — [Data]
| Métrica | Antes | Depois | Delta | Estado |
|---------|-------|--------|-------|--------|
| LCP | Xs | Ys | ±Zs | ✅/⚠️/❌ |
| CLS | X | Y | ±Z | ✅/⚠️/❌ |
| FCP | Xs | Ys | ±Zs | ✅/⚠️/❌ |
| Score | X% | Y% | ±Z% | ✅/⚠️/❌ |
**Veredicto:** MELHOROU / NEUTRO / REGREDIU
**Acção:** Manter deploy / Reverter / Investigar
```
---
## Regras de Decisão
```
SE qualquer métrica piorou >10% → REVERTER imediatamente
SE Score global piorou >5 pontos → investigar antes de continuar
SE CLS aumentou >0.05 → bloquear — UX crítica
SE LCP piorou >500ms em mobile → reverter
```
---
## Sites Descomplicar a Monitorizar
| Site | URL | Frequência |
|------|-----|-----------|
| Descomplicar main | descomplicar.pt | Mensal |
| Clip | clip.descomplicar.pt | Após cada deploy |
| Outros clientes | variável | Após alterações WP |
---
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
---
*Skill /benchmark v1.0 | 06-04-2026 | Eixo 2B — gstack pattern*
+155
View File
@@ -0,0 +1,155 @@
---
name: canary
description: >
Monitorização pós-deploy — detecta regressões em produção. Verifica que o deploy
não quebrou nada crítico nos 15min seguintes. Baseado no gstack /canary. Eixo 2B.
Usar após qualquer deploy em produção.
---
# /canary — Monitorização Pós-Deploy
Os primeiros 15 minutos após um deploy são os mais críticos. Esta skill verifica que tudo está OK.
---
## Quando Usar (SEMPRE após deploy produção)
- Após deploy de código em produção
- Após actualização de WordPress (core, plugins, temas)
- Após alterações de servidor (PHP, Nginx, MySQL)
- Após mudanças de DNS ou SSL
- Após activação de nova funcionalidade
---
## Protocolo (15 minutos)
### Minuto 0-2 — Status Checks
```bash
# 1. Site responde?
curl -s -o /dev/null -w "%{http_code}" <URL>/
# Esperado: 200
# 2. Admin WP responde?
curl -s -o /dev/null -w "%{http_code}" <URL>/wp-admin/
# Esperado: 200 ou 302
# 3. SSL válido?
curl -vI <URL> 2>&1 | grep "SSL certificate verify"
# Esperado: SSL certificate verify ok
# 4. Tempo de resposta aceitável?
curl -s -o /dev/null -w "%{time_total}\n" <URL>/
# Esperado: < 3.0 segundos
```
### Minuto 2-5 — Funcionalidades Críticas
**Para WordPress:**
```bash
# Página principal carrega sem erros
curl -s <URL>/ | grep -c "wp-content"
# Esperado: > 0
# Sem erro crítico PHP
curl -s <URL>/ | grep -i "fatal error\|parse error\|warning"
# Esperado: sem output
# WP-CLI status
wp --path=/var/www/html core verify-checksums 2>&1 | tail -1
# Esperado: "WordPress installation verifies against checksums."
```
**Para aplicações:**
```bash
# Health endpoint
curl -s <URL>/api/health | jq '.status'
# Esperado: "ok"
# Database conecta?
curl -s <URL>/api/health | jq '.database'
# Esperado: "connected"
```
### Minuto 5-10 — Métricas de Performance
```javascript
// Via Lighthouse MCP
mcp__lighthouse__get_performance_score({ url: "<URL>" })
// Esperado: >= baseline (ver /benchmark)
mcp__lighthouse__get_core_web_vitals({ url: "<URL>" })
// Comparar com baseline guardado
```
### Minuto 10-15 — Logs e Erros
```bash
# Erros PHP nas últimas 15 min
ssh server "tail -100 /var/log/php/error.log | grep '$(date -d '15 minutes ago' +%H:%M)'"
# Erros Nginx/Apache
ssh server "tail -50 /var/log/nginx/error.log"
# WooCommerce (se aplicável)
wp --path=/var/www/html wc log list 2>&1 | head -20
```
---
## Output — Relatório Canary
```markdown
## Canary Check — [Site] — [Data] [Hora]
**Deploy:** [O que foi alterado]
| Check | Estado | Detalhe |
|-------|--------|---------|
| HTTP 200 | ✅/❌ | |
| SSL | ✅/❌ | |
| Tempo resposta | ✅/❌ | Xs |
| Sem erros PHP | ✅/❌ | |
| Performance score | ✅/❌ | X% (base: Y%) |
| Logs limpos | ✅/❌ | |
**Resultado:** ✅ DEPLOY ESTÁVEL | ⚠️ INVESTIGAR | ❌ REVERTER
```
---
## Critérios de Reversão Imediata
```
❌ HTTP response != 200 → REVERTER
❌ SSL falha → REVERTER
❌ "Fatal error" em qualquer página → REVERTER
❌ Tempo resposta > 10s → INVESTIGAR
❌ Performance score caiu >15 pontos → INVESTIGAR
❌ Logs com erros críticos → INVESTIGAR
```
---
## Escalada Automática
Se algum check falha:
```
1. NOTIFICAR: criar issue no Desk CRM com urgência P1
2. REVERTER: se erro crítico, reverter imediatamente
3. DOCUMENTAR: o que falhou e quando
4. ANALISAR: root cause antes de re-deploy
```
---
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
---
*Skill /canary v1.0 | 06-04-2026 | Eixo 2B — gstack pattern*
+12
View File
@@ -301,3 +301,15 @@ Activar Chrome por defeito **aumenta consumo de context window** porque as ferra
1. Desactivar default: `/chrome` -> desactivar 1. Desactivar default: `/chrome` -> desactivar
2. Usar `claude --chrome` apenas quando necessario 2. Usar `claude --chrome` apenas quando necessario
3. Preferir WebFetch para leituras simples de paginas publicas 3. Preferir WebFetch para leituras simples de paginas publicas
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -241,3 +241,15 @@ Output: [resultado esperado]
Input: [caso complexo] Input: [caso complexo]
Output: [resultado detalhado] Output: [resultado detalhado]
``` ```
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -461,3 +461,15 @@ git commit
**Skill v1.1** | 12-03-2026 | Descomplicar® | Renomeado de /security-check para /dep-audit **Skill v1.1** | 12-03-2026 | Descomplicar® | Renomeado de /security-check para /dep-audit
**Security First** - Zero vulnerabilities ou documentadas **Security First** - Zero vulnerabilities ou documentadas
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+267
View File
@@ -0,0 +1,267 @@
---
name: diagrama
category: dev-tools
description: "Gera diagramas de arquitectura, fluxo, ER e sequência em três formatos: draw.io (.drawio), Excalidraw e Mermaid. Usar quando 'diagrama', 'arquitectura', 'draw.io', 'fluxo', 'ER', 'sequência', 'infra', 'componentes'."
version: "1.0.0"
created: 2026-04-04
tools: [mcp__claude_ai_Excalidraw__export_to_excalidraw, mcp__mcp-mermaid__generate, Write, Bash]
---
# Skill: /diagrama
Gera diagramas técnicos em três formatos consoante o caso de uso. Suporta arquitectura de sistemas, fluxogramas, diagramas ER, sequência, infra-estrutura e redes.
---
## Quando usar cada formato
| Formato | Quando usar | Output |
|---------|------------|--------|
| **draw.io** | Diagramas formais para documentação, propostas, clientes | `.drawio` (editável) |
| **Excalidraw** | Esboços rápidos, brainstorming visual, estilo whiteboard | `.excalidraw` / MCP |
| **Mermaid** | Diagramas como código, versionáveis em Git, embeds Markdown | `.svg` / `.png` |
---
## Processo de execução
### 1. Identificar pedido
Quando o utilizador pede um diagrama, detectar:
- **Tipo:** arquitectura | fluxo | ER | sequência | rede | organograma | classe
- **Formato pretendido:** draw.io (default para doc. formal) | excalidraw | mermaid
- **Contexto:** sistemas envolvidos, entidades, actores
Se não especificado, perguntar apenas: "draw.io (formal) ou Excalidraw (esboço)?"
### 2. Gerar conteúdo
---
## Geração draw.io (.drawio)
O formato draw.io é mxGraph XML. Gerar o XML e guardar como `.drawio`.
### Estrutura base
```xml
<mxfile host="Claude Code" modified="YYYY-MM-DDTHH:MM:SS" agent="Claude" version="21.0">
<diagram name="Diagrama" id="diagram-1">
<mxGraphModel dx="1422" dy="762" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<!-- elementos aqui -->
</root>
</mxGraphModel>
</diagram>
</mxfile>
```
### Templates de elementos mxGraph
**Rectângulo (componente/serviço):**
```xml
<mxCell id="2" value="Nome" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="160" y="160" width="120" height="60" as="geometry"/>
</mxCell>
```
**Seta/ligação:**
```xml
<mxCell id="10" edge="1" source="2" target="3" parent="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
```
**Cilindro (base de dados):**
```xml
<mxCell id="5" value="PostgreSQL" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
<mxGeometry x="320" y="160" width="80" height="80" as="geometry"/>
</mxCell>
```
**Cloud (serviço externo):**
```xml
<mxCell id="6" value="Cloudflare" style="shape=mxgraph.cisco.sites.generic_building;sketch=0;html=1;pointerEvents=1;dashed=0;fillColor=#036897;strokeColor=#ffffff;strokeWidth=2;verticalLabelPosition=bottom;verticalAlign=top;align=center;outlineConnect=0;" vertex="1" parent="1">
<mxGeometry x="480" y="160" width="60" height="60" as="geometry"/>
</mxCell>
```
**Actor (pessoa/utilizador):**
```xml
<mxCell id="7" value="Utilizador" style="shape=mxgraph.flowchart.start_2;fillColor=#00BEF2;strokeColor=#006EAF;fontColor=#ffffff;fontStyle=1;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="40" y="170" width="60" height="40" as="geometry"/>
</mxCell>
```
**Swimlane (grupo/camada):**
```xml
<mxCell id="8" value="Camada Frontend" style="swimlane;startSize=20;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;" vertex="1" parent="1">
<mxGeometry x="0" y="0" width="400" height="200" as="geometry"/>
</mxCell>
```
### Paleta de cores Descomplicar
| Componente | fillColor | strokeColor |
|-----------|-----------|-------------|
| Serviço/App | `#dae8fc` | `#6c8ebf` |
| Base de dados | `#f8cecc` | `#b85450` |
| Fila/Queue | `#d5e8d4` | `#82b366` |
| Externo/Cloud | `#fff2cc` | `#d6b656` |
| Infra/Servidor | `#e1d5e7` | `#9673a6` |
| Claude/IA | `#f0f4ff` | `#4a6cf7` |
### Guardar ficheiro
Guardar em `/media/ealmeida/Dados/Hub/tmp/diagramas/` com nome descritivo:
```
YYYY-MM-DD-nome-diagrama.drawio
```
Abrir com:
```bash
drawio "/media/ealmeida/Dados/Hub/tmp/diagramas/NOME.drawio" &
```
(ou abrir manualmente com draw.io desktop / draw.io no browser)
---
## Geração Excalidraw
Usar o MCP `mcp__claude_ai_Excalidraw__export_to_excalidraw` para diagramas no estilo whiteboard.
### Fluxo
1. Chamar `mcp__claude_ai_Excalidraw__create_view` para iniciar sessão
2. Chamar `mcp__claude_ai_Excalidraw__export_to_excalidraw` com o conteúdo estruturado
3. Informar o utilizador do link/path gerado
### Casos de uso preferidos
- Brainstorming e exploração rápida
- Diagramas de fluxo com estilo manual
- Esboços para reuniões
- Arquitecturas de alto nível para comunicação interna
---
## Geração Mermaid
Usar o MCP `mcp__mcp-mermaid__generate` para diagramas como código.
### Tipos suportados
**Fluxograma:**
```
flowchart TD
A[Início] --> B{Condição}
B -->|Sim| C[Acção]
B -->|Não| D[Fim]
```
**Sequência:**
```
sequenceDiagram
participant U as Utilizador
participant A as Claude Code
participant N as n8n
U->>A: Pedido
A->>N: Trigger workflow
N-->>A: Resultado
A-->>U: Resposta
```
**ER:**
```
erDiagram
CLIENTE ||--o{ PROJECTO : tem
PROJECTO ||--o{ TAREFA : contém
TAREFA {
int id
string nome
string estado
}
```
**Arquitectura de componentes (C4):**
```
C4Context
title Stack Descomplicar
Person(eal, "Emanuel", "Utilizador principal")
System(cc, "Claude Code", "Interface interactiva")
System(clip, "Paperclip", "Agentes autónomos")
System(n8n, "n8n", "Automação determinística")
Rel(eal, cc, "usa directamente")
Rel(cc, clip, "delega tarefas complexas")
Rel(cc, n8n, "activa workflows")
```
### Guardar output
Guardar o código Mermaid em `/media/ealmeida/Dados/Hub/tmp/diagramas/NOME.mmd` e renderizar para SVG/PNG via MCP.
---
## Templates prontos por contexto
### Arquitectura StackDescomplicar
Gerar diagrama com as três camadas do stack:
- **Camada 1:** Claude Code (trabalho interactivo)
- **Camada 2:** n8n (automação determinística)
- **Camada 3:** Paperclip (raciocínio autónomo)
### Proposta comercial
Diagrama da solução para o cliente com:
- Infra-estrutura actual (antes)
- Solução proposta (depois)
- Componentes e integrações
### Pipeline de dados
Diagrama de fluxo com:
- Fonte → Processamento → Destino
- Triggers, transformações, outputs
### Diagrama ER Desk CRM
Entidades principais: Lead → Customer → Estimate → Invoice → Payment
---
## Boas práticas
- **Máx. 10-15 elementos** por diagrama (mais → dividir em sub-diagramas)
- **Labels curtos:** 2-4 palavras por elemento
- **Setas com label** quando o fluxo não é óbvio
- **Cor consistente** por tipo de componente (seguir paleta Descomplicar)
- **Nome descritivo** no ficheiro (não "diagrama1.drawio")
- **Guardar em Hub/tmp/diagramas/** para fácil acesso
---
## Instalar draw.io MCP (opcional, para funcionalidades avançadas)
O vídeo #210 do Stack_Pesquisa_Videos.md demonstra um MCP draw.io com geração automática a partir de análise de código. Para instalar:
```bash
# Verificar se há MCP draw.io disponível no gateway
# Ver: Hub/04-Stack/claude-code-context-hygiene.md → secção MCPs
```
Alternativa: usar draw.io via browser em https://app.diagrams.net (gratuito, sem instalação) e importar o `.drawio` gerado.
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+159
View File
@@ -0,0 +1,159 @@
---
name: docx
description: "Criação, edição e análise de documentos Word (.docx). Versão light para heartbeats."
---
# DOCX — Referência Rápida
## Referência rápida
| Tarefa | Abordagem |
|--------|-----------|
| Ler conteúdo | `pandoc` ou descompactar XML |
| Criar novo | `docx-js` (npm install -g docx) |
| Editar existente | Descompactar → editar XML → recompactar |
| Converter .doc | `python scripts/office/soffice.py --headless --convert-to docx doc.doc` |
## Criar novos documentos (docx-js)
### Setup básico
```javascript
const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, ImageRun,
Header, Footer, AlignmentType, PageOrientation, LevelFormat, HeadingLevel,
BorderStyle, WidthType, ShadingType, PageNumber, PageBreak } = require('docx');
const doc = new Document({ sections: [{ children: [/* conteúdo */] }] });
Packer.toBuffer(doc).then(buffer => fs.writeFileSync("doc.docx", buffer));
```
### Tamanho de página (A4)
```javascript
sections: [{
properties: {
page: {
size: { width: 11906, height: 16838 }, // A4 em DXA
margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 }
}
},
children: [/* conteúdo */]
}]
```
Largura de conteúdo A4 com margens 1": `11906 - 2880 = 9026 DXA`
**Paisagem:** Passar dimensões retrato + `orientation: PageOrientation.LANDSCAPE` (docx-js troca internamente).
### Listas
```javascript
numbering: { config: [
{ reference: "bullets", levels: [{ level: 0, format: LevelFormat.BULLET, text: "\u2022",
alignment: AlignmentType.LEFT, style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] }
] }
// Usar: new Paragraph({ numbering: { reference: "bullets", level: 0 }, children: [...] })
```
### Tabelas
```javascript
// Largura tabela = soma columnWidths. Usar SEMPRE WidthType.DXA (nunca PERCENTAGE).
new Table({
width: { size: 9026, type: WidthType.DXA },
columnWidths: [4513, 4513],
rows: [new TableRow({ children: [
new TableCell({
borders: { top: b, bottom: b, left: b, right: b },
width: { size: 4513, type: WidthType.DXA },
shading: { fill: "D5E8F0", type: ShadingType.CLEAR }, // CLEAR, nunca SOLID
margins: { top: 80, bottom: 80, left: 120, right: 120 },
children: [new Paragraph({ children: [new TextRun("Célula")] })]
})
] })]
})
```
### Imagens
```javascript
new ImageRun({
type: "png", // Obrigatório
data: fs.readFileSync("image.png"),
transformation: { width: 200, height: 150 },
altText: { title: "T", description: "D", name: "N" } // Três obrigatórios
})
```
### Cabeçalhos/rodapés
```javascript
headers: { default: new Header({ children: [new Paragraph({ children: [new TextRun("Cabeçalho")] })] }) },
footers: { default: new Footer({ children: [new Paragraph({
children: [new TextRun("Página "), new TextRun({ children: [PageNumber.CURRENT] })]
})] }) }
```
### Regras críticas docx-js
- Nunca usar `\n` — usar Paragraphs separados
- Nunca usar bullets unicode — usar `LevelFormat.BULLET`
- PageBreak dentro de Paragraph: `new Paragraph({ children: [new PageBreak()] })`
- ImageRun requer `type`
- Tabelas: `columnWidths` E `width` na célula, ambos devem corresponder
- Usar `ShadingType.CLEAR`, nunca SOLID
- TOC requer `HeadingLevel` apenas, sem estilos custom
- Override estilos: IDs exactos "Heading1", "Heading2" + `outlineLevel`
## Editar documentos existentes
### Passo 1: Descompactar
```bash
python scripts/office/unpack.py document.docx unpacked/
```
### Passo 2: Editar XML
Editar ficheiros em `unpacked/word/`. Usar ferramenta Edit directamente (não scripts Python).
**Tracked changes:**
```xml
<!-- Inserção -->
<w:ins w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z">
<w:r><w:t>texto inserido</w:t></w:r>
</w:ins>
<!-- Eliminação -->
<w:del w:id="2" w:author="Claude" w:date="2025-01-01T00:00:00Z">
<w:r><w:delText>texto eliminado</w:delText></w:r>
</w:del>
```
**Comentários:**
```bash
python scripts/comment.py unpacked/ 0 "Texto do comentário"
python scripts/comment.py unpacked/ 1 "Resposta" --parent 0
```
**Smart quotes:** `&#x2018;` `&#x2019;` `&#x201C;` `&#x201D;`
### Passo 3: Recompactar
```bash
python scripts/office/pack.py unpacked/ output.docx --original document.docx
```
Validação: `python scripts/office/validate.py doc.docx`
## Convenções Descomplicar
- Data: DD-MM-YYYY
- Monetário: 1.234,56 EUR
- Fonte: Arial 12pt
- Página: A4 (11906 x 16838 DXA)
- Autor tracked changes: "Claude"
- Idioma: PT-PT
---
**Versão**: 1.0.0-light | **Base**: 1.0.0
+12
View File
@@ -510,3 +510,15 @@ Apos executar `comment.py` (ver Passo 2), adicionar marcadores ao document.xml.
--- ---
**Versao**: 1.0.0 | **Autor**: Descomplicar® **Versao**: 1.0.0 | **Autor**: Descomplicar®
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -218,3 +218,15 @@ CMD ["npm", "start"]
--- ---
*Versão 1.0.0 | Descomplicar®* *Versão 1.0.0 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+160
View File
@@ -0,0 +1,160 @@
---
name: pdf
description: Processamento de ficheiros PDF — leitura, extracção, merge, split, OCR, formulários. Versão light para heartbeats.
---
# PDF — Referência Rápida
## Bibliotecas Python
### pypdf — operações básicas
```python
from pypdf import PdfReader, PdfWriter
# Ler e extrair texto
reader = PdfReader("documento.pdf")
for page in reader.pages:
text = page.extract_text()
# Merge
writer = PdfWriter()
for pdf in ["doc1.pdf", "doc2.pdf"]:
for page in PdfReader(pdf).pages:
writer.add_page(page)
with open("merged.pdf", "wb") as f:
writer.write(f)
# Split (uma página por ficheiro)
for i, page in enumerate(reader.pages):
w = PdfWriter()
w.add_page(page)
with open(f"page_{i+1}.pdf", "wb") as f:
w.write(f)
# Rotate
page = reader.pages[0]
page.rotate(90)
# Password
writer.encrypt("userpass", "ownerpass")
```
### pdfplumber — tabelas e texto com layout
```python
import pdfplumber
with pdfplumber.open("doc.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
tables = page.extract_tables()
```
### reportlab — criação de PDFs
```python
from reportlab.platypus import SimpleDocTemplate, Paragraph, Table, TableStyle, PageBreak
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib import colors
doc = SimpleDocTemplate("report.pdf")
styles = getSampleStyleSheet()
elements = [Paragraph("Título", styles['Title'])]
doc.build(elements)
```
**Subscripts/superscripts:** Nunca usar caracteres Unicode. Usar tags XML: `<sub>2</sub>`, `<super>2</super>`.
## CLI
```bash
# Extrair texto (poppler-utils)
pdftotext input.pdf output.txt
pdftotext -layout input.pdf output.txt
# Merge/split (qpdf)
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
# Encriptar
qpdf --encrypt user_pass owner_pass 256 -- input.pdf encrypted.pdf
# Reparar
qpdf --check input.pdf
# Extrair imagens
pdfimages -j input.pdf output_prefix
# Render para PNG
pdftoppm -png -r 300 document.pdf output_prefix
```
## OCR (PDFs digitalizados)
```python
import pytesseract
from pdf2image import convert_from_path
images = convert_from_path('scanned.pdf')
text = ""
for image in images:
text += pytesseract.image_to_string(image)
```
## Formulários
### Verificar campos preenchíveis
```bash
python scripts/check_fillable_fields.py <file.pdf>
```
### Campos preenchíveis (nativos)
1. `python scripts/extract_form_field_info.py <input.pdf> <field_info.json>`
2. `python scripts/convert_pdf_to_images.py <file.pdf> <output_dir>`
3. Criar `field_values.json` com `field_id`, `page`, `value`
4. `python scripts/fill_fillable_fields.py <input.pdf> <field_values.json> <output.pdf>`
### Campos não preenchíveis (anotações)
1. `python scripts/extract_form_structure.py <input.pdf> form_structure.json`
2. **Abordagem A (estrutura):** Analisar JSON, criar `fields.json` com `pdf_width`/`pdf_height` e bounding boxes
3. **Abordagem B (visual):** Converter para imagens, identificar campos, refinar com crop
4. `python scripts/check_bounding_boxes.py fields.json`
5. `python scripts/fill_pdf_form_with_annotations.py <input.pdf> fields.json <output.pdf>`
6. `python scripts/create_validation_image.py <page> <fields.json> <input_img> <output_img>`
## Referência rápida
| Tarefa | Ferramenta | Comando |
|--------|-----------|---------|
| Merge | pypdf/qpdf | `writer.add_page()` / `qpdf --pages` |
| Split | pypdf/qpdf | Uma página por ficheiro |
| Texto | pdfplumber | `page.extract_text()` |
| Tabelas | pdfplumber | `page.extract_tables()` |
| Criar | reportlab | Canvas ou Platypus |
| OCR | pytesseract | Converter para imagem primeiro |
| Formulários | pypdf/scripts | Ver secção acima |
## Caminhos Descomplicar
| Local | Caminho |
|-------|---------|
| Documentos empresa | `/media/ealmeida/Dados/GDrive/Cloud/Descomplicar/` |
| Propostas | `/media/ealmeida/Dados/Hub/03-Propostas/` |
| Arquivo clientes | `/media/ealmeida/Dados/GDrive/Arquivo_de_Clientes/` |
| Knowledge Base | `/media/ealmeida/Dados/Hub/06-Operacoes/Knowledge-Base/PDFs/` |
| Temporários | `~/.claude-work/` (limpar ao concluir) |
## Workflow
1. Localizar PDF (filesystem ou Google Drive)
2. Descarregar para `~/.claude-work/` se necessário
3. Processar
4. Guardar no destino final
5. Limpar temporários
---
**Versão**: 1.0.0-light | **Base**: 1.0.0
+12
View File
@@ -794,3 +794,15 @@ def extract_text_with_ocr(pdf_path):
--- ---
**Versao**: 1.0.0 | **Autor**: Descomplicar® **Versao**: 1.0.0 | **Autor**: Descomplicar®
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -392,3 +392,15 @@ mcp__dify-kb__dify_kb_retrieve_segments({
--- ---
**Versão**: 1.0.0 | **Autor**: Descomplicar® **Versão**: 1.0.0 | **Autor**: Descomplicar®
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -130,3 +130,15 @@ Tabela com: ID, Nome, Segmento, Volume Anual (EUR), Projectos Activos, Última I
--- ---
**Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: dev-tools **Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: dev-tools
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -189,3 +189,15 @@ hooks/
- `references/composition-patterns.md` - Compound components, providers, dependency injection (Vercel Engineering) - `references/composition-patterns.md` - Compound components, providers, dependency injection (Vercel Engineering)
- `references/custom-hooks.md` - useDebounce, useLocalStorage, useFetch com codigo completo - `references/custom-hooks.md` - useDebounce, useLocalStorage, useFetch com codigo completo
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -186,3 +186,15 @@ description: >
Ver `references/anthropic-patterns.md` para exemplos detalhados de progressive disclosure. Ver `references/anthropic-patterns.md` para exemplos detalhados de progressive disclosure.
Ver `references/descomplicar-standards.md` para exemplos de skills Descomplicar bem estruturadas. Ver `references/descomplicar-standards.md` para exemplos de skills Descomplicar bem estruturadas.
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -144,3 +144,15 @@ No servidor dev, Playwright ja esta disponivel em `/root/Dev`.
--- ---
**Versao**: 1.0.0 | **Autor**: Descomplicar® **Versao**: 1.0.0 | **Autor**: Descomplicar®
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -372,3 +372,15 @@ O ficheiro de referencia de precos esta em:
--- ---
**Versao**: 1.0.0 | **Autor**: Descomplicar® **Versao**: 1.0.0 | **Autor**: Descomplicar®
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+154
View File
@@ -0,0 +1,154 @@
---
name: youtube-extract
category: dev-tools
description: "Extrai transcrições e metadados de vídeos, playlists e canais YouTube para o ficheiro de pesquisa Stack_Pesquisa_Videos.md. Usar quando 'youtube', 'vídeo', 'playlist', 'canal', 'transcrição', 'extrair vídeo', 'pesquisa vídeos'."
version: "1.0.0"
created: 2026-04-04
tools: [Bash]
---
# Skill: /youtube-extract
Extrai transcrições e metadados de vídeos, playlists e canais YouTube usando o script `youtube-pesquisa-videos.py`. Adiciona automaticamente ao ficheiro de pesquisa do StackDescomplicar.
---
## Ficheiros relevantes
| Ficheiro | Caminho |
|----------|---------|
| **Script** | `/media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py` |
| **Destino padrão** | `/media/ealmeida/Dados/Hub/04-Stack/Stack_Pesquisa_Videos.md` |
---
## Processo de execução
### 1. Identificar o pedido
Detectar na mensagem do utilizador:
- **URLs** — vídeos individuais, playlists (`?list=`), canais (`@canal`, `/c/`, `/channel/`)
- **Limite** — "primeiros 10", "máx 5", etc. → usar `--max N`
- **Destino** — ficheiro alternativo? → usar `--output caminho`
- **Modo** — adicionar ao ficheiro (`--append`) vs mostrar no terminal (sem flag)
### 2. Construir o comando
```bash
python3 /media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py \
URL1 URL2 ... \
[--max N] \
[--append] \
[--output /caminho/alternativo.md] \
[--file lista.txt]
```
### 3. Exemplos por tipo de URL
**Vídeo individual:**
```bash
python3 /media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py \
"https://youtu.be/dQw4w9WgXcQ" --append
```
**Playlist completa:**
```bash
python3 /media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py \
"https://youtube.com/playlist?list=PLxxx" --append
```
**Playlist com limite:**
```bash
python3 /media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py \
"https://youtube.com/playlist?list=PLxxx" --max 10 --append
```
**Canal completo (máx. 20):**
```bash
python3 /media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py \
"https://youtube.com/@NomeCanal" --max 20 --append
```
**Mix de URLs:**
```bash
python3 /media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py \
"https://youtu.be/ID1" \
"https://youtube.com/playlist?list=PLxxx" \
--max 5 --append
```
**Ficheiro de lista:**
```bash
python3 /media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py \
--file /caminho/lista.txt --append
```
**Pré-visualizar sem gravar:**
```bash
python3 /media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py \
"https://youtu.be/ID1"
```
---
## Comportamento padrão
| Situação | Acção |
|----------|-------|
| URL única de vídeo | Extrair e perguntar se adiciona ao ficheiro |
| Múltiplos vídeos | Extrair todos e adicionar com `--append` |
| Playlist/canal sem limite | Alertar o utilizador — perguntar limite antes de executar |
| Ficheiro de destino não especificado | Usar `Stack_Pesquisa_Videos.md` |
> **Aviso obrigatório para playlists/canais sem `--max`:** Informar o utilizador do número de vídeos antes de processar — canais podem ter centenas.
---
## Após a extracção
1. Informar quantos vídeos foram adicionados e os números `#N` atribuídos
2. Sugerir ao utilizador que complete os campos `*(a completar)*` no ficheiro
3. Se houver erros (transcrição indisponível), mencionar quais os vídeos afectados
4. Opcional: abrir o ficheiro no editor — `xdg-open "Stack_Pesquisa_Videos.md"`
---
## Pré-requisitos
- `yt-dlp` instalado: `pip install yt-dlp` ou `brew install yt-dlp`
- Python 3.8+
- Acesso à internet
Verificar disponibilidade:
```bash
yt-dlp --version && python3 --version
```
---
## Casos especiais
**ID curto do YouTube (11 chars):**
```bash
python3 /media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py dQw4w9WgXcQ --append
```
**Destino alternativo (outro projecto):**
```bash
python3 /media/ealmeida/Dados/Dev/ClaudeDev/youtube-pesquisa-videos.py \
"https://youtu.be/ID1" \
--output "/media/ealmeida/Dados/Hub/05-Projectos/MeuProjecto/videos.md" \
--append
```
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "gestao", "name": "gestao",
"description": "Project management, time tracking, daily checkups, worklogs, reflections, knowledge management, archiving and compliance auditing. Backed by NotebookLM notebooks.", "description": "Project management, time tracking, daily checkups, worklogs, reflections, knowledge management, archiving and compliance auditing. Backed by NotebookLM notebooks.",
"version": "1.3.0", "version": "1.4.0",
"author": { "author": {
"name": "Descomplicar - Crescimento Digital", "name": "Descomplicar - Crescimento Digital",
"url": "https://descomplicar.pt" "url": "https://descomplicar.pt"
+30
View File
@@ -0,0 +1,30 @@
# Changelog — Plugin gestao
Todas as alterações relevantes a este plugin. Segue [Semantic Versioning](https://semver.org/).
---
## [1.4.0] — 2026-04-07
### Adicionado
- **Nova skill `/clip-instructions`** — gerir AGENTS.md de agentes Paperclip por nome: ver, editar, criar, rever histórico de versões e rollback via API config revisions
### Corrigido
- **`/clip-health`** — check 1 reescrito: `systemctl` substituído por `ps aux` (Paperclip não usa systemd); check 6 reescrito: `npx paperclipai doctor` substituído por `curl http://localhost:3100/health`; adicionado check de memória partilhada POSIX (`/dev/shm/PostgreSQL.*`) — causa raiz do bug pós-reboot; score actualizado 21→22; 2 entradas no Healing Log
- **`/clip-agent`** — curl de atribuição de skills corrigido: adicionado `-H "Authorization: Bearer $PAPERCLIP_API_KEY"` (sem header dava 401); documentadas notas sobre agentes analyst (`process` adapter, `claude-sonnet-4-6`, heartbeat desactivado); checklist "Criar agente novo" actualizada com `instructionsBundleMode: "external"`, `instructionsRootPath`, `instructionsEntryFile`; 3 entradas no Healing Log
- **`/clip-issue`** — `author_user_id` corrigido: `'board'``'v1N5OccPn9DGq6iog7qW9nEvnXYFT3iO'` (ID real de Emanuel); adicionado modo checkout/release com endpoints API e fallback SQL; entrada no Healing Log
- **`/clip-skill`** — modelo mental corrigido: "ephemeral/symlinks" → "injecção de contexto em runtime a cada heartbeat"; adicionado `-H "Authorization: Bearer $PAPERCLIP_API_KEY"` aos dois curls de API (`/skills/import` e `/skills/sync`); nota sobre adapter `process` para agentes analyst; entrada no Healing Log
### Notas técnicas
- Todas as correcções baseadas em aprendizagens dos vídeos Paperclip (sessão 07-04-2026)
- Chave de autenticação Paperclip: `Authorization: Bearer $PAPERCLIP_API_KEY` obrigatória em todos os endpoints da API local
- Agentes criados via SQL directamente (fora do fluxo OpenClaw) **não** recebem `company_memberships` automaticamente — inserção manual obrigatória
---
## [1.3.0] — anterior
- Versão base (sem changelog registado)
+1 -1
View File
@@ -4,7 +4,7 @@ description: Auto-reflexão e melhoria contínua do sistema. Analisa sessões, i
padrões, sugere optimizações. Auto-trigger >20 tool calls. padrões, sugere optimizações. Auto-trigger >20 tool calls.
role: Auto-reflexão e melhoria contínua do sistema role: Auto-reflexão e melhoria contínua do sistema
domain: Dev domain: Dev
model: sonnet model: haiku
tools: Read, Write, Edit, Glob, ToolSearch tools: Read, Write, Edit, Glob, ToolSearch
# Dependencies # Dependencies
+12
View File
@@ -132,3 +132,15 @@ exit $EXIT_CODE
--- ---
*Skill v1.0.0 | 04-03-2026 | Descomplicar®* *Skill v1.0.0 | 04-03-2026 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -221,3 +221,15 @@ Output: [resultado esperado]
Input: [caso complexo] Input: [caso complexo]
Output: [resultado detalhado] Output: [resultado detalhado]
``` ```
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -175,3 +175,15 @@ mcp__google_workspace__create_event({
- **Workflows detalhados:** `references/workflows-detalhados.md` - **Workflows detalhados:** `references/workflows-detalhados.md`
- **MCP tools e constantes:** `references/mcp-tools-referencia.md` - **MCP tools e constantes:** `references/mcp-tools-referencia.md`
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12 -1
View File
@@ -1,7 +1,6 @@
--- ---
name: cleanup-downloads name: cleanup-downloads
description: Limpeza e triagem da pasta Transferências (Downloads). Verifica cada ficheiro individualmente, apaga descartáveis, classifica o restante por categoria. Usar quando "transferências", "downloads", "limpar downloads", "cleanup", "limpeza pasta". description: Limpeza e triagem da pasta Transferências (Downloads). Verifica cada ficheiro individualmente, apaga descartáveis, classifica o restante por categoria. Usar quando "transferências", "downloads", "limpar downloads", "cleanup", "limpeza pasta".
disable-model-invocation: true
--- ---
# Cleanup Downloads # Cleanup Downloads
@@ -105,3 +104,15 @@ Após mover documentos financeiros (regra 3), lançar despesas via `/expense`:
## Integração /today ## Integração /today
Incluir contagem de ficheiros na pasta quando >10 ficheiros. Incluir contagem de ficheiros na pasta quando >10 ficheiros.
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+1 -1
View File
@@ -168,7 +168,7 @@ echo "Tunnel: $TUNNEL_PORT | Servidor: $ACTUAL_PORT"
### Check 11: Agentes sem permissoes bash ### Check 11: Agentes sem permissoes bash
Invocar tool MCP: `mcp__paperclip__diag_agents_missing_permissions` Invocar tool MCP: `mcp__paperclip__diag_agents_without_skip_permissions`
- 0 = OK - 0 = OK
- 1+ = CRITICO (agentes vao ficar bloqueados ao executar bash — corrigir com `/clip-agent`) - 1+ = CRITICO (agentes vao ficar bloqueados ao executar bash — corrigir com `/clip-agent`)
+13 -1
View File
@@ -1,6 +1,6 @@
--- ---
name: daily-digest name: daily-digest
description: Resumo diário do estado operacional - timer activo, tickets abertos, facturas vencidas, leads novos, propostas pendentes e agenda do dia. Usar quando "resumo", "digest", "estado do dia", "dashboard", "métricas dia". description: Sub-rotina chamada por /today para snapshot CRM (timer activo, tickets, facturas vencidas, leads, propostas, agenda). Pode ser invocada isoladamente quando só precisas dos números CRM sem o checkup completo. Usar quando "resumo", "digest", "estado do dia", "métricas dia". Para dashboard diário completo usar /today.
context: fork context: fork
--- ---
@@ -122,3 +122,15 @@ Gerar alertas se:
--- ---
*Skill v1.0.0 | 04-03-2026 | Descomplicar®* *Skill v1.0.0 | 04-03-2026 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+124
View File
@@ -0,0 +1,124 @@
---
name: deep-research
description: >
Pesquisa profunda em 3 layers: Hub Obsidian (Layer 1) + NotebookLM análise (Layer 2) +
Web externo (Layer 3). Para questões complexas que requerem síntese de múltiplas fontes.
Usar quando: análise competitiva profunda, pesquisa mercado, due diligence, relatório estratégico.
---
# /deep-research — Pesquisa Profunda com RAG Trinity
Pesquisa em 3 camadas com síntese final. Mais profundo que `/research`, mais estruturado que `/hub-search`.
---
## Quando Usar
| Situação | Skill Correcta |
|---------|----------------|
| "Onde está X no Hub?" | `/hub-search` |
| "Analisa este documento" | `/research` |
| "Pesquisa profunda + síntese de múltiplas fontes" | `/deep-research` ← este |
| "Análise competitiva completa" | `/deep-research` + `/research competitive` |
---
## Protocolo (3 Layers)
### Layer 1 — Hub Obsidian (conhecimento interno)
```bash
# 1a. Busca full-text no Hub
obsidian search query="<TERMO>" format=json limit=10
# 1b. Se Obsidian não responde (offline), fallback via Grep
grep -r "<TERMO>" /media/ealmeida/Dados/Hub/ --include="*.md" -l | head -20
```
**Critério de suficiência Layer 1:** Encontrou 3+ documentos relevantes com contexto concreto.
- SE suficiente para questão simples → responder + registar fonte
- SE questão requer análise profunda → continuar para Layer 2
### Layer 2 — NotebookLM (análise profunda)
Seleccionar notebook relevante com base no domínio:
| Domínio | Notebook ID |
|---------|-------------|
| Estratégia e Empreendedorismo | 79d43410-0e29-4be1-881d-84db6bdc239a |
| Stack Tecnológico | [consultar mcp__notebooklm__ lista] |
| Marketing e Vendas | [consultar mcp__notebooklm__ lista] |
```javascript
// Consultar notebook relevante
mcp__notebooklm__notebook_query({
notebook_id: "<ID>",
query: "<QUESTÃO ESPECÍFICA — mais precisa que a geral>"
})
```
**Critério de suficiência Layer 2:** NotebookLM retornou análise com citações específicas.
- SE suficiente → sintetizar com Layer 1 + responder
- SE requer dados externos → continuar para Layer 3
### Layer 3 — Web (conhecimento externo)
```javascript
// Web search para dados actuais
mcp__web-search__search({
query: "<QUESTÃO> site:scholar.google.com OR filetype:pdf",
num_results: 10
})
```
---
## Síntese Final
Após recolher de 2+ layers, sintetizar:
```markdown
## Síntese — [Tópico]
**Fontes consultadas:** Layer 1 (Hub), Layer 2 (NotebookLM [Notebook X]), Layer 3 (Web)
### O que sabemos (interno)
[Resumo Layer 1 — conhecimento já documentado]
### Análise profunda
[Resumo Layer 2 — análise NotebookLM com citações]
### Contexto externo
[Resumo Layer 3 — se consultado]
### Síntese e Recomendação
[Cruzamento das layers — resposta directa à questão]
### Próximos Passos
- [ ] Acção 1 derivada da pesquisa
- [ ] Acção 2
```
---
## Self-Improving Loop
Após cada execução, registar preferências para melhorar futuras pesquisas:
```bash
# Guardar aprendizagem em Hub
echo "$(date '+%Y-%m-%d') — deep-research — [TÓPICO] — [O QUE FUNCIONOU/NÃO FUNCIONOU]" \
>> /media/ealmeida/Dados/Hub/00-Inbox/research-preferences.md
```
---
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
---
*Skill /deep-research v1.1.0 | 13-04-2026 | LightRAG removido — Layer 3 passa a Web apenas*
+12
View File
@@ -339,3 +339,15 @@ Output: [resultado esperado]
Input: [caso complexo] Input: [caso complexo]
Output: [resultado detalhado] Output: [resultado detalhado]
``` ```
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -440,3 +440,15 @@ Após concluir o documento:
--- ---
**Versão**: 1.0.0 | **Data**: 2026-03-06 | **Autor**: Descomplicar® **Versão**: 1.0.0 | **Data**: 2026-03-06 | **Autor**: Descomplicar®
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+137
View File
@@ -0,0 +1,137 @@
---
name: hub-search
description: >
Pesquisa no vault Hub Obsidian com relevance scoring e backlinks.
Layer 1 da arquitectura de pesquisa (CLI → NotebookLM).
Usar quando: (1) pesquisar conteúdo no Hub por termo ou conceito,
(2) encontrar notas relacionadas via backlinks, (3) localizar PROCs/QR/docs
antes de executar tarefas, (4) verificar se existe documentação antes de criar.
---
# /hub-search — Pesquisa no Hub (Layer 1 RAG)
Pesquisa rápida no vault Hub via Obsidian CLI. Requer Obsidian aberto.
Fallback automático para Grep se Obsidian não estiver a correr.
---
## Uso
```
/hub-search "termo"
/hub-search "LightRAG configuração" --backlinks
/hub-search "PROC-MCP" --files
```
---
## Workflow
### Passo 1 — Tentar via Obsidian CLI
```bash
# Pesquisa básica
obsidian search query="TERMO" format=json
# Com backlinks (recomendado para conceitos)
obsidian search query="TERMO" format=json
obsidian backlinks file="NOTA"
# Limitar resultados
obsidian search query="TERMO" limit=10 format=json
```
**Indicador de sucesso:** saída JSON com `results` array.
**Indicador de falha:** mensagem `unable to find Obsidian` → ir para fallback.
### Passo 2 — Fallback: Grep no Hub
Se CLI falhar (Obsidian fechado):
```
Grep "TERMO" /media/ealmeida/Dados/Hub/ --type md
```
Adicionar contexto ao utilizador: "Obsidian não está a correr — usando busca directa nos ficheiros."
### Passo 3 — Apresentar resultados
**Formato de output:**
```markdown
## Resultados: "[termo]"
**Fonte:** Obsidian CLI v1.12.7 | **Backlinks:** Sim/Não
### Encontrado em N notas
| Nota | Path | Relevância |
|------|------|-----------|
| [título] | `path/relativo.md` | Alta/Média/Baixa |
### Notas com backlinks para este termo
- `nota-a.md` → referencia `nota-b.md`
### Relacionados sugeridos
- [links relevantes encontrados nos resultados]
```
---
## Regras
1. **Sempre tentar CLI primeiro** — é mais preciso (scoring semântico)
2. **--include-backlinks por defeito** quando o termo é um conceito (não um comando)
3. **Fallback silencioso** — não perguntar, só mencionar que usou Grep
4. **Max 10 resultados** — se mais, mostrar top 10 por relevância
5. **Paths relativos** na apresentação (ex: `04-Stack/02.03-IA/` não path absoluto)
---
## Integração com outras skills
```
/hub-search "termo" → Layer 1: Obsidian CLI (este skill)
/knowledge "termo" → Layer 2: NotebookLM (65 notebooks)
```
**Quando escalar para Layer 2:**
- Resultado CLI score < 50% ou 0 resultados → sugerir `/knowledge`
- Conteúdo conceptual/externo → sugerir `/knowledge` directamente
---
## Referência CLI
```bash
# Sintaxe correcta: parâmetros com = (não flags com --)
obsidian search query="TERMO" format=json
obsidian search query="TERMO" limit=10 format=json
obsidian backlinks file="NOTA"
obsidian tags sort=count counts
obsidian tasks daily todo
obsidian version
obsidian help # lista todos os comandos disponíveis
```
**Nota:** A skill oficial kepano (`obsidian-cli`) tem referência completa de todos os comandos.
**Requer:** Obsidian aberto + CLI activado em Settings → General → Advanced
**Wrapper:** `~/.local/bin/obsidian` (define XDG_RUNTIME_DIR Flatpak)
**Docs:** `04-Stack/02.03-IA/Obsidian-CLI.md`
---
*Skill v1.0.0 | 06-04-2026 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -234,3 +234,15 @@ Quando invocado directamente (sem /today):
--- ---
*Skill v1.0.0 | 04-03-2026 | Descomplicar®* *Skill v1.0.0 | 04-03-2026 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -391,3 +391,15 @@ Checklist automática:
--- ---
*Skill v1.0.0 | 2026-02-13 | Plugin gestao | Descomplicar®* *Skill v1.0.0 | 2026-02-13 | Plugin gestao | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+179 -198
View File
@@ -1,44 +1,84 @@
--- ---
name: knowledge name: knowledge
description: Gestao unificada de conhecimento com routing por tema para 58 notebooks NotebookLM, Supabase, Context7 e documentacao local. Detecta lacunas e sugere criacao de conteudo. v2.0.0 description: Router de conhecimento Família A/B. Família A (operacional interna) consultada em paralelo para qualquer pergunta sobre processos, projectos, decisões, histórico. Família B (NotebookLM externa) só para conhecimento conceptual/teórico. v2.2.0
--- ---
# /knowledge - Gestao Unificada de Conhecimento v2.0.0 # /knowledge — Router Família A/B v2.2.0
Pesquisa inteligente com routing automatico entre todas as fontes de conhecimento. > **Correcção arquitectural 08-04-2026:** a v2.0.0 tratava NotebookLM como fonte primária. Isso estava errado — NotebookLM não vê operações, não vê estado real, só tem ebooks e transcripts. Em `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/feedback_knowledge-router-arquitectura.md` está o racional completo.
NotebookLM e a fonte primaria (substituiu Dify KB em 06-03-2026). > **v2.2.0 (13-04-2026):** LightRAG removido da Família A — serviço com 0 documentos desactivado. Família A passa a 4 fontes: Supabase, CC memory, Hub, Desk CRM.
## Arquitectura ## Princípio de routing
**Não é fallback linear.** É router por tipo de pergunta:
- **Operacional / processual / histórico / decisões / projectos / código interno****Família A em paralelo**, consolidar com citação de origem.
- **Conceptual / teórico / externo / research / mercado / ebooks****Família B (NotebookLM)** com routing por tema (tabela em baixo).
- **Ambíguo** → perguntar ao utilizador qual o tipo.
## Família A — Operacional interna (paralelo, complementares)
| Fonte | Tool | Conteúdo |
|-------|------|----------|
| **memory-supabase** | `mcp__memory-supabase__search_memories(query, threshold=0.7, limit=10)` | Memórias persistentes cross-sessão com embeddings. Decisões, contexto, lacunas anteriores. |
| **Memória CC cross-projecto** | `Grep` recursivo em `~/.claude/projects/*/memory/*.md` | **110 ficheiros em 34 projectos.** Harness só carrega automaticamente a memória do `cwd` — este grep é **obrigatório** para não perder contexto de outros projectos. |
| **Obsidian / Hub** | `Grep` em `/media/ealmeida/Dados/Hub/**/*.md` | PROCs, QRs, INDEX, frontmatter, procedimentos, histórico. |
| **Desk CRM** | `mcp__desk-crm-v3__*` (tasks, projects, tickets, customers) | Fonte de verdade operacional: tarefas, projectos, clientes, tickets, horas. |
### Workflow Família A
``` ```
Pergunta -> Classificar Tema -> Seleccionar Notebooks -> Query NotebookLM -> Enriquecer (Supabase/Context7/Local) -> Resultado 1. Classificar pergunta como operacional (default para queries internas)
| 2. Disparar em PARALELO (mesma mensagem, vários tool calls):
Detecta Lacunas -> Sugere Criacao - mcp__memory-supabase__search_memories(query, threshold=0.65, limit=8) [graceful se MCP indisponível]
- Grep ~/.claude/projects/*/memory/*.md
- Grep Hub/**/*.md (limitar a pastas relevantes quando possível)
- Desk CRM search (se query menciona cliente/projecto/tarefa)
3. Consolidar resposta citando origem de cada fragmento
4. Se Família A insuficiente → perguntar ao utilizador ou escalar para Família B
``` ```
| Fonte | MCP | Tipo de Conhecimento | **Nota sobre graceful fallback:** as tools `mcp__*` podem estar indisponíveis em sessões específicas por razões de auto-discovery do harness. Se a chamada falhar com "No such tool available", continuar o paralelismo com as outras fontes e reportar a lacuna no output final.
|-------|-----|---------------------|
| **NotebookLM** | notebooklm | RAG Gemini 2.5, 58 notebooks tematicos (primario) | ### Formato de resposta Família A
| **Supabase** | memory-supabase | Memoria sessoes, decisoes, contexto |
| **Context7** | context7 | Docs bibliotecas externas | ```markdown
| **Docs Locais** | filesystem | Ficheiros Hub, GDrive, Dev | ## [pergunta]
**memory-supabase:** [excerto] _(id N, tags)_
**memory/<projecto>:** [excerto] _(ficheiro)_
**Hub:** [excerto] _(caminho:linha)_
**Desk CRM:** [excerto] _(task #N, projecto #M)_
**Síntese:** [consolidação em 2-3 frases citando as fontes mais fortes]
```
**Regra:** nunca responder sem citar fonte. Se 0 fontes, dizer "sem hits em Família A" explicitamente.
--- ---
## Comandos ## Família B — Conhecimento externo (NotebookLM)
| Comando | Uso | **Quando usar:** só para perguntas **conceptuais, teóricas, de research externo ou mercado**. Nunca para operacional.
|---------|-----|
| `/knowledge [termo]` | Pesquisa inteligente com routing |
| `/kb [termo]` | Alias curto |
| `/kb-save [tema]` | Guardar conhecimento na fonte adequada |
| `/kb-gaps` | Listar lacunas identificadas |
--- Exemplos de queries Família B:
- "Quais são as melhores práticas de Core Web Vitals em 2025?"
- "Como funciona o algoritmo de ranking do YouTube Shorts?"
- "Arquétipos de Jung aplicados a branding"
- "Stoicismo na gestão de equipas"
## Routing por Tema -> Notebooks NotebookLM **Workflow Família B:**
### WordPress e Web 1. Classificar tema → tabela de routing
2. Consultar **max 3 notebooks** (performance)
3. `mcp__notebooklm-mcp__notebook_query({ notebook_id, query })`
4. Se score <70 → fallback a Context7 (docs bibliotecas)
### Routing por tema (65 notebooks)
> Inventário completo: `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/notebooklm-inventory.md`
**WordPress/Web**
| Keywords | Notebook | ID | | Keywords | Notebook | ID |
|----------|----------|----| |----------|----------|----|
@@ -48,9 +88,7 @@ Pergunta -> Classificar Tema -> Seleccionar Notebooks -> Query NotebookLM -> Enr
| kivicare, ehr, clinica | KiviCare EHR WP | `78621405-a5bc-433f-856f-296260a80bd9` | | kivicare, ehr, clinica | KiviCare EHR WP | `78621405-a5bc-433f-856f-296260a80bd9` |
| seguranca wp, malware, hardening | Ciberseguranca WordPress | `5f60adfd-2435-4725-8c12-9c11c5f51d75` | | seguranca wp, malware, hardening | Ciberseguranca WordPress | `5f60adfd-2435-4725-8c12-9c11c5f51d75` |
**Fallback:** Context7 (docs oficiais plugins) -> Docs Locais (`/Dev/*/wp-content/`) **Marketing e Conteúdo**
### Marketing e Conteudo
| Keywords | Notebook | ID | | Keywords | Notebook | ID |
|----------|----------|----| |----------|----------|----|
@@ -65,226 +103,169 @@ Pergunta -> Classificar Tema -> Seleccionar Notebooks -> Query NotebookLM -> Enr
| ecommerce, loja online | E-commerce Pratico | `226e384e-d4bc-48f4-bb82-7927360436cc` | | ecommerce, loja online | E-commerce Pratico | `226e384e-d4bc-48f4-bb82-7927360436cc` |
| ecommerce portugal, marketplace | E-Commerce Portugal | `8a430cf2-ed99-413d-b4bf-a1400deaf49e` | | ecommerce portugal, marketplace | E-Commerce Portugal | `8a430cf2-ed99-413d-b4bf-a1400deaf49e` |
**Fallback:** Supabase (decisoes marketing) -> Docs Locais (Hub/) **Desenvolvimento / Código (externo)**
### Desenvolvimento e Codigo
| Keywords | Notebook | ID | | Keywords | Notebook | ID |
|----------|----------|----| |----------|----------|----|
| programacao, codigo, api, php, react, node | Programacao | `24947ffa-0019-448a-a340-2f4a275d2eb1` | | programacao externa, padroes, api design | Programacao | `24947ffa-0019-448a-a340-2f4a275d2eb1` |
| claude code, claude, mcp dev | Claude Code | `2876d1fe-5cea-4d98-8140-b0e1a81c6bc4` | | claude code, mcp dev externo | Claude Code | `2876d1fe-5cea-4d98-8140-b0e1a81c6bc4` |
| claude code mini, snippets | Claude Code (mini) | `0be6f45b-8fd5-4a5e-8f80-e36a6f516ded` | | mcp protocolo | Desenvolvimento de MCPs | `73102308-70ef-403e-9be9-eae0cfc62d55` |
| mcp, mcp server, protocolo | Desenvolvimento de MCPs | `73102308-70ef-403e-9be9-eae0cfc62d55` |
| ai editor, cursor, copilot | AI Code Editors | `57d9c6c9-48ba-4d83-8f71-cc890f348a53` | | ai editor, cursor, copilot | AI Code Editors | `57d9c6c9-48ba-4d83-8f71-cc890f348a53` |
| github, trends, repos | GitHub Trends | `922b7532-ddf3-4dba-9d3c-6d5f83b89378` | | github trends | GitHub Trends | `922b7532-ddf3-4dba-9d3c-6d5f83b89378` |
| open source, foss, self-hosted | Open Source Software and Platforms | `cabf9821-c1ff-44cb-9bfd-59bda3599792` | | open source, foss | Open Source Software and Platforms | `cabf9821-c1ff-44cb-9bfd-59bda3599792` |
| open webui, ollama | Open WebUI | `be6f72ac-f8ba-4337-912d-abd5dd448519` | | n8n, workflow automacao | n8n | `f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1` |
| perfex dev, hooks externos | Dev PerfexCRM | `80606de8-2783-4d36-b08d-5825e6f9a8da` |
| remotion, video code | Remotion | `f2b75baa-1ab1-48d3-8f7c-a6a9e516934c` | | remotion, video code | Remotion | `f2b75baa-1ab1-48d3-8f7c-a6a9e516934c` |
| perfex, perfexcrm, modulos | Perfex CRM: Gestao de Clientes e Projetos | `df4688bb-c2c0-4aba-98c1-38c3b50a353c` |
| perfex dev, hooks perfex | Dev PerfexCRM | `80606de8-2783-4d36-b08d-5825e6f9a8da` |
| erxes, xos | Erxes XOS | `10ea7de8-5777-4f18-bd2c-f58952b6047c` |
| n8n, automacao, workflow | n8n | `f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1` |
**Fallback:** Context7 (docs bibliotecas) -> Docs Locais (`/Dev/`) > **Nota:** código do projecto (`/Dev/*`, plugins locais, MCPs desenvolvidos internamente) é **Família A** (grep Hub + filesystem), não Família B.
### Infraestrutura e Servidores **Infraestrutura**
| Keywords | Notebook | ID | | Keywords | Notebook | ID |
|----------|----------|----| |----------|----------|----|
| cwp, centos, servidor web | CWP | `0ded7bd6-69b3-4c76-b327-452396bf7ea7` | | cwp externo | CWP | `0ded7bd6-69b3-4c76-b327-452396bf7ea7` |
| cloud, infraestrutura, devops | Cloud e Infraestrutura TI | `f9a79b5a-649f-4443-afaf-7ff562b6c2e7` | | cloud, devops patterns | Cloud e Infraestrutura TI | `f9a79b5a-649f-4443-afaf-7ff562b6c2e7` |
| proxmox, virtualizacao, vm | Proxmox | `276ccdde-6b95-42a3-ad96-4e64d64c8d52` | | proxmox | Proxmox | `276ccdde-6b95-42a3-ad96-4e64d64c8d52` |
**Fallback:** Supabase (configs anteriores) -> Docs Locais (Hub/06-Operacoes/) **Design/UX**
### Design e UX
| Keywords | Notebook | ID | | Keywords | Notebook | ID |
|----------|----------|----| |----------|----------|----|
| design, branding visual, ai design | Design Profissional AItomatizado | `b568b13b-0eed-48c9-b513-5c5b7ec0b102` | | design, branding externo | Design Profissional AItomatizado | `b568b13b-0eed-48c9-b513-5c5b7ec0b102` |
| ui, ux, interface, usabilidade | UI/UX Design | `081ca512-8279-4850-b2b9-dff090267482` | | ui, ux, wcag | UI/UX Design | `081ca512-8279-4850-b2b9-dff090267482` |
| tipografia, cores, web design | Tipografia e Cor para Web | `f97a0d2b-a5b3-4640-b941-3cbb184b1b81` | | tipografia, cores | Tipografia e Cor para Web | `f97a0d2b-a5b3-4640-b941-3cbb184b1b81` |
### Gestao e Estrategia **Gestão e Estratégia**
| Keywords | Notebook | ID | | Keywords | Notebook | ID |
|----------|----------|----| |----------|----------|----|
| gestao projectos, agile, scrum | Gestao de Projectos e Agile | `0c9c079c-a426-486c-99eb-1564d42d37ad` | | gestao projectos, agile, scrum | Gestao de Projectos e Agile | `0c9c079c-a426-486c-99eb-1564d42d37ad` |
| operacoes, processos, kpi | Gestao de Operacoes | `f9dc59c2-718b-4b12-bd06-095d4bfa3e34` | | operacoes externas, kpi | Gestao de Operacoes | `f9dc59c2-718b-4b12-bd06-095d4bfa3e34` |
| estrategia, empreendedorismo, negocio | Estrategia e Empreendedorismo | `79d43410-0e29-4be1-881d-84db6bdc239a` | | estrategia, empreendedorismo | Estrategia e Empreendedorismo | `79d43410-0e29-4be1-881d-84db6bdc239a` |
| transformacao digital, ia negocio | Transformacao Digital e IA | `ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8` | | transformacao digital, ia negocio | Transformacao Digital e IA | `ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8` |
| ai automation, stack ai | AI Automation Stack | `929ef67b-c131-4f01-abd0-8b078491a6b7` | | ai automation stack | AI Automation Stack | `929ef67b-c131-4f01-abd0-8b078491a6b7` |
| ai agents, curso ai | AI Agents Intensive Course | `f4be0e3f-4d9e-4c5c-a743-9f14427f2e43` | | ai agents curso | AI Agents Intensive Course | `f4be0e3f-4d9e-4c5c-a743-9f14427f2e43` |
**Fallback:** Supabase (decisoes) -> Docs Locais (Hub/01-Planeamento/) **Produtos externos / Mercado**
### Produtos e Clientes
| Keywords | Notebook | ID | | Keywords | Notebook | ID |
|----------|----------|----| |----------|----------|----|
| zaia, chatbot, whatsapp bot | Zaia | `087d76f1-e929-49da-9e3c-4edc22b42b3f` | | zaia, chatbot | Zaia | `087d76f1-e929-49da-9e3c-4edc22b42b3f` |
| zender, sms, whatsapp api | Zender 3 | `7095e5fa-1465-4496-b1a3-48f2e6e07f79` | | zender, whatsapp api | Zender 3 | `7095e5fa-1465-4496-b1a3-48f2e6e07f79` |
| reonic, solar crm | Reonic | `b7e61158-0717-4582-8ef2-0301be3c73ae` | | solar, fotovoltaico | Solar FV Engenharia | `03d54e00-aefa-45dc-ba01-f3864a7c3112` |
| carstuff, automovel | CarStuff | `90f0bc77-b5e4-4ddd-a07c-013a1a30b247` | | opensolar | OpenSolar | `0082bcaf-1e17-4b84-87cc-2256b1719b55` |
| solar, fotovoltaico, engenharia | Solar FV Engenharia | `03d54e00-aefa-45dc-ba01-f3864a7c3112` |
| opensolar, dimensionamento | OpenSolar | `0082bcaf-1e17-4b84-87cc-2256b1719b55` |
| produtos, servicos, tabela precos | Produtos e Servicos: BD | `c451d7b4-79fd-4a67-9149-1da38d28345e` |
| descomplicar marketing | Descomplicar: Marketing Digital | `f29c8457-f16d-4fb3-979d-6e5901de1b20` |
### Sistema e Produtividade **Pessoal / SelfRescueProtocol** (só se explicitamente pessoal)
| Keywords | Notebook | ID | | Keywords | Notebook | ID |
|----------|----------|----| |----------|----------|----|
| obsidian, vault, notas | Obsidian + Claude | `ebee9fe1-78fd-4f85-8938-f19f3ea32131` | | jung, arquetipos | Jung | `d5c67d7f-7fe8-4542-9e5c-22403f3193ee` |
| viral, filosofia, youtube channel | Building Viral AI Philosophy Channels | `7bb570b3-9dc4-4e6f-817c-aca68df59e6d` | | taoismo, wu wei | Taoism | `aea85baf-9ddf-4d79-bf07-81391a275b09` |
| adhd, phda | ADHD | `a4ff3fd7-fb7c-49a1-94ff-0433193e2338` |
### Pessoal / SelfRescueProtocol (9) | autismo | Autismo | `66eff78e-318f-4a8b-a3c7-039a4124b1ad` |
| heroi, jornada | Essencia de Heroi | `6dcd08e8-79d9-4ae0-b6bf-b2ee96717bf2` |
| Keywords | Notebook | ID | | kintsugi | Auto Kintsugi | `82a95c2f-be56-4c4a-a96f-96f6677a6991` |
|----------|----------|----| | somatica, trauma | Psicologia Somatica | `3410893b-16a3-4178-9091-42650a41086f` |
| jung, arquetipos, sombra | Jung | `d5c67d7f-7fe8-4542-9e5c-22403f3193ee` | | estoicismo | Marcus Aurelius / Stoic | `4b986ad4-49da-4604-a423-4fcdf20dd9da` |
| emanuel, pessoal, perfil | Emanuel Almeida | `8c6c8257-bda2-433c-bf55-f40d98bfde8f` |
| taoismo, tao, wu wei | Taoism | `aea85baf-9ddf-4d79-bf07-81391a275b09` |
| adhd, phda, atencao | ADHD | `a4ff3fd7-fb7c-49a1-94ff-0433193e2338` |
| autismo, neurodivergencia | Autismo | `66eff78e-318f-4a8b-a3c7-039a4124b1ad` |
| heroi, jornada, mito | Essencia de Heroi | `6dcd08e8-79d9-4ae0-b6bf-b2ee96717bf2` |
| kintsugi, resiliencia | Auto Kintsugi | `82a95c2f-be56-4c4a-a96f-96f6677a6991` |
| somatica, corpo, trauma | Psicologia Somatica | `3410893b-16a3-4178-9091-42650a41086f` |
| estoicismo, marco aurelio, stoic | Marcus Aurelius / Stoic | `4b986ad4-49da-4604-a423-4fcdf20dd9da` |
--- ---
## Workflow ## Classificador de pergunta (heurística)
### Passo 1: Classificar Tema Usar estes sinais para decidir Família A vs B:
| Sinal na pergunta | Família |
|---|---|
| Nome de cliente, projecto, tarefa #N, ticket #N | **A** |
| "quando", "histórico", "última vez", "decisão", "porque fizemos" | **A** |
| Nome de ficheiro, path, skill, plugin, MCP interno | **A** |
| "como funciona (abstracto)", "melhores práticas", "teoria de" | **B** |
| Nome de biblioteca externa + versão | **B** (+ Context7) |
| Pessoal explícito (jung, adhd, estoicismo, …) | **B** pessoal |
| Ambíguo | **perguntar** |
---
## Comandos
| Comando | Uso |
|---------|-----|
| `/knowledge [pergunta]` | Router automático A/B com paralelismo |
| `/kb [pergunta]` | Alias curto |
| `/kb-save [conteúdo]` | Guardar na fonte adequada (Supabase se decisão/solução, Hub se processual, NotebookLM source_add se externo) |
| `/kb-gaps` | Listar lacunas detectadas em `memory-supabase` |
---
## Gravar conhecimento (/kb-save)
Router inverso por tipo:
| Tipo | Destino | Tool |
|---|---|---|
| Decisão / contexto / solução técnica | memory-supabase | `mcp__memory-supabase__save_memory` com tags |
| Procedimento operacional | Hub/06-Operacoes/Procedimentos/ | `Write` PROC-*.md |
| Conhecimento externo | NotebookLM notebook adequado | `mcp__notebooklm-mcp__source_add` |
---
## Detecção e reporte de lacunas
Quando query retorna 0 hits úteis em Família A (o caso relevante) ou <30% score em Família B:
```javascript ```javascript
// Input: "/knowledge como configurar crocoblock filters" mcp__memory-supabase__save_memory({
// 1. Extrair keywords: ["crocoblock", "filters", "configurar"] content: `LACUNA: "${query}" — Família A 0 hits, classificada como ${classificacao}.`,
// 2. Match routing: wordpress (crocoblock) tags: ["lacuna-kb", classificacao],
// 3. Notebooks primarios: WordPress Config CLI, WordPress e Elementor metadata: { query, timestamp, source_families: ["A","B"] }
// 4. Notebooks secundarios: Ciberseguranca WordPress (se relevante) });
``` ```
### Passo 2: Query NotebookLM (Primario) Depois sugerir acção: criar PROC, guardar no Supabase, adicionar fonte ao notebook NotebookLM adequado.
```javascript ---
// Consultar 1-3 notebooks relevantes (max 3 para performance)
mcp__notebooklm__notebook_query({
notebook_id: "fb2f26bd-8cb0-4d4c-bafc-4f1ebb51c51d", // WordPress Config CLI
query: "crocoblock filters configuracao"
})
// Se score < 70, consultar notebook secundario ## Regras operacionais
mcp__notebooklm__notebook_query({
notebook_id: "5be0d1a6-00f2-4cd9-b835-978cb7721601", // WordPress e Elementor
query: "crocoblock filters"
})
```
### Passo 3: Enriquecer (Opcional) 1. **Família A é default.** Só escalar para B quando classificador sinalizar externo.
2. **Paralelismo obrigatório em Família A.** Todas as tools na mesma mensagem (regra global #1: "NEVER run independent tool calls sequentially").
3. **Grep cross-projecto obrigatório** em `~/.claude/projects/*/memory/*.md` — o harness só carrega a memória do `cwd`, este grep compensa esse gap.
4. **Nunca responder sem citar fonte.** Se 0 hits, dizer explicitamente.
5. **Max 3 notebooks** por query Família B.
6. **PT-PT sempre** na consolidação.
7. **Se a pergunta é sobre estado presente** (tarefas abertas, tickets, horas, facturas), ir **directo ao Desk CRM**, não a NotebookLM.
```javascript ---
// Supabase - contexto/decisoes anteriores
mcp__memory-supabase__search_memories({ query, tags: ["wordpress", "crocoblock"] })
// Context7 - docs bibliotecas externas ## Anti-patterns
mcp__plugin_context7_context7__resolve-library-id({ libraryName: "crocoblock" })
// Filesystem - codigo local - ❌ Começar por NotebookLM para perguntas operacionais (era o erro da v2.0.0)
// Grep/Glob em /media/ealmeida/Dados/Dev/ e /media/ealmeida/Dados/Hub/ - ❌ Só consultar o `cwd` e ignorar memory cross-projecto
``` - ❌ Responder sem citar fonte
- ❌ Chamar Família A em série — tem de ser paralelo
- ❌ Classificar "como funciona o nosso router /knowledge?" como Família B (é Família A — é sobre infra interna)
- ❌ Fallback linear A→B quando a pergunta é claramente externa (vai directo a B)
### Passo 4: Resposta Estruturada ---
```markdown ## Referências
## Resultado: [termo]
### Encontrado em [Notebook] - `references/routing-guide.md` — mapeamento detalhado de routing (pendente v2.1 — actualizar)
[Conteudo encontrado] - `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/feedback_knowledge-router-arquitectura.md` — decisão arquitectural
- `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/notebooklm-inventory.md` — inventário completo 65 notebooks
### Relacionado ---
- [Links relevantes]
### Qualidade ## Healing log
- Score: XX/100
- Fonte: NotebookLM ([notebook])
- Enriquecido: [Supabase/Context7/Local] (se aplicavel)
```
### Passo 5: Detectar e Reportar Lacunas ```jsonl
{"date":"2026-04-08","issue":"v2.0.0 tratava NotebookLM como fonte primaria para tudo","fix":"v2.1.0 router Familia A/B — NotebookLM so para externo","source":"user"}
```javascript {"date":"2026-04-08","issue":"v2.1.0 assumia FastMCP file-based (11 tools lightrag_*) apos migracao temporaria da outra sessao","fix":"v2.1.1 restaurado para LightRAG-HKU completo com 17 tools originais (query_document, insert_document, get_pipeline_status, etc), UI em rag.descomplicar.pt, PG storage 331 docs","source":"user"}
if (resultado.score < 50 || !resultado.encontrado) { {"date":"2026-04-13","issue":"LightRAG com 0 documentos — servico sem utilidade a consumir recursos","fix":"v2.2.0 removido LightRAG da Familia A — 4 fontes restantes: Supabase, CC memory, Hub, Desk CRM","source":"user"}
await mcp__memory-supabase__save_memory({ {"date":"2026-04-08","issue":"memoria Claude Code fragmentada em ~/.claude/projects/*/memory/ (101 ficheiros, 34 projectos)","fix":"grep cross-projecto obrigatorio no router Familia A","source":"user"}
content: `LACUNA: Query "${query}" sem informacao adequada.`, {"date":"2026-04-08","issue":"mcp__memory-supabase__search_memories pode estar indisponivel no harness","fix":"graceful fallback no router — continuar paralelismo com outras fontes e reportar lacuna","source":"auto"}
metadata: { type: 'lacuna-kb', categoria, query, score: resultado.score }
});
}
``` ```
--- ---
## Regras de Routing **v2.2.0** | 13-04-2026 | LightRAG removido (0 docs, serviço desactivado). Família A: 4 fontes — Supabase, CC memory, Hub, Desk CRM
1. **Max 3 notebooks** por query (performance)
2. **Notebooks especificos primeiro** (ex: KiviCare antes de WordPress generico)
3. **Fallback hierarquico:** NotebookLM -> Supabase -> Context7 -> Docs Locais
4. **Multi-tema:** Se query cruza temas, consultar 1 notebook de cada tema
5. **Pessoal:** So consultar notebooks pessoais se query explicitamente pessoal
---
## Guardar Conhecimento (/kb-save)
```
1. Analisar tipo de conhecimento
2. Determinar destino:
- Decisao/Contexto -> Supabase (memory-supabase)
- Conhecimento tematico -> NotebookLM (via source_add ao notebook adequado)
- Procedimento -> Hub/06-Operacoes/Procedimentos/ (PROC-*.md)
3. Formatar conteudo
4. Guardar com metadata adequada
```
---
## Deteccao de Lacunas
```markdown
> [!warning] Lacuna Detectada
> Tema "[X]" nao tem documentacao adequada.
>
> Sugestao:
> - [ ] Adicionar fontes ao notebook NotebookLM: [notebook]
> - [ ] Guardar em Supabase: [se for decisao/contexto]
> - [ ] Criar PROC: [se for procedimento]
```
---
## Gaps Conhecidos (P1)
| Gap | Notebook alvo | Prompt |
|-----|---------------|--------|
| Next.js App Router/RSC | Programacao (24947ffa) | DR-nextjs-app-router.md |
| PHP 8+ / Laravel 11-12 | Programacao (24947ffa) | DR-php-laravel-moderno.md |
| Core Web Vitals / GA4 | Marketing Digital PT (4c595973) | DR-core-web-vitals-ga4.md |
| WCAG 2.2 / ARIA | UI/UX Design (081ca512) | DR-wcag-acessibilidade.md |
---
## Checklist de Pesquisa
- [ ] Tema correctamente classificado
- [ ] Notebooks prioritarios consultados (max 3)
- [ ] Score de relevancia >70 (ou >30 agregado)
- [ ] Lacunas detectadas e reportadas
- [ ] Resultados formatados correctamente
---
## Referencias
- `references/routing-guide.md` - Mapeamento detalhado com codigo de routing
- Inventario completo: `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/notebooklm-inventory.md`
+12
View File
@@ -150,3 +150,15 @@ Ou abrir a app e usar File > Open para navegar ate ao ficheiro.
- **Texto curto:** 2-5 palavras por node (mindmap, nao documento) - **Texto curto:** 2-5 palavras por node (mindmap, nao documento)
- **Template adequado:** Fish-bone para causa/efeito, structure para hierarquias, right para processos - **Template adequado:** Fish-bone para causa/efeito, structure para hierarquias, right para processos
- **Nome descritivo:** Usar nome do topico no ficheiro (nao "mindmap1.km") - **Nome descritivo:** Usar nome do topico no ficheiro (nao "mindmap1.km")
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -392,3 +392,15 @@ Auth guardada em: `~/.notebooklm-mcp-cli/profiles/<name>/auth.json`
--- ---
**Versão**: 1.0.0 | **Data**: 24-02-2026 | **Autor**: Descomplicar® **Versão**: 1.0.0 | **Data**: 24-02-2026 | **Autor**: Descomplicar®
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+116
View File
@@ -0,0 +1,116 @@
---
name: office-hours
description: >
Persona YC que reframe problemas antes de escrever código. Desafia pressupostos,
faz as perguntas difíceis que um investidor faria. Usar ANTES de qualquer implementação
significativa. Baseado no gstack /office-hours. Eixo 2B.
---
# /office-hours — Consulta YC antes de Codar
Persona: sócio de uma YC top-tier que passou 20 anos a ver startups falharem por resolver o problema errado.
Objetivo: garantir que o que vais construir é o que deve ser construído.
---
## Quando Usar (OBRIGATÓRIO)
- Antes de implementar uma feature nova
- Antes de refactoring significativo
- Quando a solução parece óbvia demais
- Quando o problema está mal definido
- Quando o utilizador pediu X mas pode precisar de Y
**Anti-pattern:** Saltar para o código sem office-hours = construir a coisa certa de forma errada, ou a coisa errada certo.
---
## Protocolo
### Passo 1 — Escutar sem julgar
"O que estás a tentar resolver? Conta-me como se eu não soubesse nada do teu negócio."
Deixar o utilizador descrever o problema completamente. Não interromper. Tomar notas mentais dos seguintes sinais:
- Soluções disfarçadas de problemas ("preciso de um botão que...")
- Pressupostos não verificados ("os utilizadores querem...")
- Scope excessivo ("e depois também...")
- Urgência artificial ("precisa de estar pronto até...")
### Passo 2 — As 5 Perguntas
```
1. "Por que é que este problema existe agora? O que mudou?"
→ Detecta se é problema real ou hipotético
2. "Quem perde o emprego se este problema não for resolvido?"
→ Identifica o owner real e urgência verdadeira
3. "O que acontece se não fizermos nada?"
→ Valida se é crítico ou nice-to-have
4. "Já tentaste resolver isto de forma mais simples? O que aconteceu?"
→ Evita over-engineering, descobre tentativas anteriores
5. "Se tivesses de demonstrar que isto funciona em 24h, o que farias?"
→ Força a pensar em MVP mínimo viável
```
### Passo 3 — Reframe (se necessário)
SE o problema apresentado é uma solução disfarçada:
```
"Percebo que queres [solução X]. Mas o problema que describes é [problema Y].
Podemos resolver [Y] de forma mais simples: [alternativa Z].
Queres explorar Z antes de construir X?"
```
### Passo 4 — Aprovação ou Alternativa
```
APROVADO se:
- Problema claramente definido
- Solução proposta é a mais simples
- ROI claro (tempo poupado, receita gerada, risco eliminado)
- Utilizador entende o trade-off
ALTERNATIVA se:
- Há solução mais simples não considerada
- O problema não está suficientemente validado
- Scope excessivo para o valor gerado
```
### Passo 5 — Output
```markdown
## Office Hours — [Data]
**Problema original:** [o que o utilizador apresentou]
**Problema real:** [reframe se necessário]
**Decisão:** AVANÇAR | REFRAMED | ADIAR
**Justificação:** [1-2 frases]
**Próximo passo:** [acção concreta]
```
---
## Exemplos de Reframe
| Pedido original | Reframe YC |
|----------------|-----------|
| "Preciso de um dashboard de métricas" | "O que decides diferente com o dashboard? Se nada, não precisas dele." |
| "Quero migrar para microserviços" | "Qual é o problema do monolito actual? Quantos utilizadores tens?" |
| "Refactoring completo do código" | "O que não consegues fazer agora por causa do código? Isso é o problema." |
| "Automatizar este processo" | "Quanto tempo demora? Quantas vezes por semana? Vale a automação?" |
---
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
---
*Skill /office-hours v1.0 | 06-04-2026 | Eixo 2B — gstack pattern*
+111
View File
@@ -0,0 +1,111 @@
---
name: onboarding
category: gestao
description: "Checklist e automacao de onboarding de novo colaborador. Criacao de contas, documentacao, equipamento. Usar quando 'onboarding', 'novo colaborador', 'contratar', 'integrar pessoa', 'RH novo'."
version: "1.0.0"
created: 2026-04-07
tools: [mcp__desk-crm-v3__create_task, mcp__desk-crm-v3__add_task_checklist_item, mcp__google-workspace__gmail_send_email]
---
# Skill: /onboarding
Checklist e automacao de onboarding de novo colaborador. Baseado em PROC-Onboarding.md (RH-001).
---
## Referencia
Procedimento completo em: `Hub/06-Operacoes/Procedimentos/D4-RH/PROC-Onboarding.md`
Esta skill executa os passos — o PROC define as regras.
---
## Processo
### 1. Recolher dados do novo colaborador
Perguntar ao utilizador:
- **Nome completo**
- **Email pessoal**
- **Funcao/cargo**
- **Data de inicio**
- **Tipo:** colaborador / freelancer / estagiario
- **Departamento:** D1-D7
### 2. Criar tarefa no Desk CRM
```
mcp__desk-crm-v3__create_task({
name: "Onboarding — [Nome]",
project_id: 65,
startdate: [data inicio],
duedate: [data inicio + 5 dias uteis],
priority: 2,
description: "Onboarding de [Nome] como [Funcao] no departamento [Dept]"
})
```
### 3. Adicionar checklist de onboarding
Items obrigatorios (adicionar via `add_task_checklist_item`):
**Contas e acessos:**
- [ ] Email @descomplicar.pt criado
- [ ] Conta Desk CRM criada (staff)
- [ ] Acesso Gitea (se tecnico)
- [ ] Acesso Google Workspace
- [ ] Password manager configurado
**Documentacao:**
- [ ] Contrato assinado
- [ ] NIF e dados fiscais recolhidos
- [ ] Ficha de colaborador preenchida
- [ ] RGPD — consentimento assinado
**Equipamento:**
- [ ] PC/portatil atribuido
- [ ] Acessos VPN/SSH (se aplicavel)
- [ ] Ferramentas de trabalho instaladas
**Integracao:**
- [ ] Reuniao de boas-vindas agendada
- [ ] Apresentacao a equipa
- [ ] Acesso a documentacao interna (Hub)
- [ ] Mentor atribuido (primeiras 2 semanas)
### 4. Enviar email de boas-vindas (opcional)
Se o utilizador aprovar, enviar email via Google Workspace:
```
Assunto: Bem-vindo(a) a Descomplicar — [Nome]
Corpo: Template de boas-vindas com:
- Data de inicio
- Links uteis (Desk, email, Git)
- Contacto do mentor
- Primeiros passos
```
### 5. Resumo
Apresentar ao utilizador:
- Tarefa Desk criada (ID + link)
- Checklist com N items
- Proximos passos manuais (contrato, equipamento)
---
## Regras
- **Nunca criar contas automaticamente** — apenas checklist para lembrar
- **Contrato e dados fiscais sao responsabilidade do Emanuel** — skill so lembra
- **Email de boas-vindas requer aprovacao** antes de enviar
- **Tipo freelancer** tem checklist reduzida (sem equipamento, sem VPN)
---
## Healing Log
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
+12
View File
@@ -364,3 +364,15 @@ Checklist automática:
--- ---
*Skill v1.0.0 | 2026-02-13 | Plugin gestao | Descomplicar®* *Skill v1.0.0 | 2026-02-13 | Plugin gestao | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -183,3 +183,15 @@ Gera revisao mensal completa e publica como comentario na tarefa Desk do cliente
--- ---
*Skill v1.0.0 | 2026-03-10 | Descomplicar®* *Skill v1.0.0 | 2026-03-10 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -214,3 +214,15 @@ Relatórios podem ser guardados em:
--- ---
*Skill v1.0.0 | 2026-02-05 | Descomplicar®* *Skill v1.0.0 | 2026-02-05 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+135
View File
@@ -0,0 +1,135 @@
---
name: research-pipeline
description: >
Pipeline de pesquisa em 2 camadas: Layer 1 (Obsidian CLI Hub), Layer 2 (NotebookLM).
Orquestra as camadas em sequência para pesquisas profundas. Usar quando /hub-search
ou /knowledge isolados não são suficientes, quando o tema cruza conteúdo
interno+externo, ou para research antes de executar tarefas complexas.
---
# /research-pipeline — Pipeline de Pesquisa em 2 Camadas
Orquestra as camadas RAG em sequência para obter contexto completo antes de executar tarefas.
```
Layer 1: Obsidian CLI → conteúdo Hub (notas, PROCs, docs internas)
Layer 2: NotebookLM → análise profunda (65 notebooks temáticos)
```
---
## Uso
```
/research-pipeline "tema ou pergunta"
/research-pipeline "PROC-MCP" --quick (só Layer 1)
/research-pipeline "n8n webhook setup" --deep (L1 + L2)
```
---
## Workflow
### Passo 1 — Layer 1: Hub via Obsidian CLI
```bash
obsidian search "TERMO" --include-backlinks --format json
```
**Se CLI offline:** fallback para Grep no Hub.
Registar: `L1_results`, `L1_score` (0-100, baseado em nº resultados).
### Passo 2 — Avaliar se Layer 2 é necessária
```
SE L1_score >= 80 E query é operacional (PROC, QR, path):
→ PARAR — resultado suficiente, retornar L1
SE L1_score < 80 OU query é conceptual/analítica:
→ Avançar para Layer 2
```
### Passo 3 — Layer 2: NotebookLM (análise profunda)
Usar routing da skill `/knowledge` para seleccionar notebooks relevantes.
```javascript
// Max 2 notebooks para performance
mcp__notebooklm__notebook_query({ notebook_id, query })
```
Registar: `L2_results`, `L2_confidence`.
### Passo 4 — Avaliar se Layer 2 é suficiente
```
SE L2_confidence >= 70:
→ PARAR — retornar L1+L2 combinados
SE L2_confidence < 70:
→ Reportar lacuna e sugerir pesquisa Web manual
```
### Passo 5 — Síntese e output
```markdown
## Research: "[termo]"
### Hub (Layer 1) — [N notas encontradas]
[Resultados mais relevantes com paths]
### NotebookLM (Layer 2) — [notebook usado]
[Insights e contexto analítico]
### Síntese
[Resposta integrada das 2 camadas]
### Qualidade
- L1: [N resultados]
- L2: [confidence%] via [notebook]
- Tempo: ~[X]s
```
---
## Modos rápidos
| Flag | Layers activas | Uso |
|------|---------------|-----|
| `--quick` | L1 apenas | PROCs, paths, comandos |
| (default) | L1 + L2 | Maioria das queries |
| `--deep` | L1 + L2 (exaustivo) | Investigação completa |
---
## Integração com outras skills
```
Antes de /wp-dev → /research-pipeline --quick "PROC-WordPress"
Antes de /cwp-* → /research-pipeline --quick "PROC-CWP"
Antes de design → /research-pipeline "design guidelines descomplicar"
Para /deep-research → /research-pipeline --deep (base de contexto)
```
---
## Regras
1. **Layer 1 sempre primeiro** — mais rápido e frequentemente suficiente
2. **Max 2 notebooks NotebookLM** por query (performance)
3. **Citar fonte** de cada resultado no output
---
*Skill v1.1.0 | 13-04-2026 | Descomplicar® — LightRAG removido (0 docs, serviço desactivado)*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+131
View File
@@ -0,0 +1,131 @@
---
name: review-corrections
description: >
Analisa correcções feitas pelo utilizador nas últimas sessões e gera sugestões
de regras para CLAUDE.md. Lê ~/.claude-work/corrections.jsonl, agrupa por padrão,
e propõe melhorias concretas. Usar semanalmente (via /schedule) ou quando há >5
correcções acumuladas. Faz parte do loop de auto-melhoria (Eixo 3, Stack Q2 2026).
---
# /review-corrections — Análise de Correcções e Auto-melhoria
Analisa padrões de correcção do utilizador para melhorar o CLAUDE.md autonomamente.
---
## Workflow
### Passo 1 — Ler ficheiro de correcções
```bash
cat ~/.claude-work/corrections.jsonl
```
Cada linha é um JSON:
```json
{"ts":"2026-04-06T14:30:00","type":"correction","prompt":"não assim, usa grep","session":"abc","cwd":"/Hub/"}
```
### Passo 2 — Agrupar por padrão
Categorias de correcção:
| Padrão | Keywords | Acção sugerida |
|--------|---------|----------------|
| **Ferramenta errada** | "usa grep", "não uses bash", "usa read" | Regra de preferência de ferramenta |
| **Língua/formato** | "em português", "sem emojis", "com acentos" | Regra de output |
| **Abordagem** | "não assim", "de outra forma", "mais simples" | Regra de heurística |
| **Scope** | "não faças isso", "não toques em", "só X" | Regra de limites |
| **Verificação** | "verifica primeiro", "não inventar", "confirma" | Regra anti-alucinação |
### Passo 3 — Gerar sugestões de regras
Para cada padrão com ≥2 ocorrências, propor regra no formato:
```markdown
**Regra candidata:**
> [Padrão detectado N vezes] → Sugestão: "Nunca [X], sempre [Y]"
**Evidência:**
- "prompt1" (data)
- "prompt2" (data)
**Proposta CLAUDE.md:**
| NN | [Texto da regra concisa] |
```
### Passo 4 — Apresentar ao utilizador
```markdown
## Revisão de Correcções — [data]
**Total analisado:** N correcções em M sessões
**Padrões encontrados:** P
### Regras candidatas (aprovação necessária)
[lista de propostas]
### Limpar ficheiro?
[ ] Sim — arquivar em ~/.claude-work/corrections-archive-YYYY-MM.jsonl
[ ] Não — manter para próxima revisão
```
### Passo 5 — Aplicar regras aprovadas
Se o utilizador aprovar uma regra:
1. Abrir `~/.claude/CLAUDE.md`
2. Adicionar na tabela de REGRAS CORE com número sequencial
3. Confirmar: "Regra #NN adicionada."
Se o utilizador recusar:
- Arquivar correcção com tag `rejected`
- Não propor de novo
---
## Quando usar
- **Semanal** (via `/schedule` às segundas-feiras com `/today`)
- **Manual** quando corrections.jsonl tem >5 entradas
- **Após incidente** (mesmo erro 2+ vezes consecutivos)
---
## Integração auto-trigger
O hook `capture-corrections.sh` regista automaticamente em `~/.claude-work/corrections.jsonl`.
Esta skill consome esse ficheiro e fecha o loop de auto-melhoria.
**Loop completo:**
```
Correcção utilizador
→ capture-corrections.sh (regista)
→ /review-corrections (analisa)
→ CLAUDE.md (actualiza)
→ Comportamento melhora
```
---
## Anti-patterns
- Nunca aplicar regras sem aprovação explícita do utilizador
- Nunca propor regras com <2 ocorrências (pode ser caso isolado)
- Nunca eliminar regras existentes — apenas adicionar ou reformular
---
*Skill v1.0.0 | 06-04-2026 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -338,3 +338,15 @@ mcp__desk-crm-v3__create_task ou update_task:
--- ---
*Skill v1.0.0 | 2026-03-10 | Plugin gestao | Descomplicar®* *Skill v1.0.0 | 2026-03-10 | Plugin gestao | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+124
View File
@@ -0,0 +1,124 @@
---
name: task-state
description: Gestão de estado persistente de tarefas entre sessões. Cria, actualiza e lê .task-state.md para tarefas complexas. Usar quando tarefa tem >2 sessões, múltiplos ficheiros, ou risco de perder contexto por compaction.
context: fork
---
# /task-state — Gestão de Estado de Tarefa
Persiste decisões, ficheiros e checkpoints entre sessões. Sobrevive a context compaction.
---
## Quando usar
**Usar quando:**
- Tarefa com >1 sessão de trabalho
- Múltiplos ficheiros a modificar (>3)
- Risco de context compaction apagar contexto crítico
- Tarefas que requerem aprovação por checkpoint
**Não usar quando:**
- Tarefas de <30 minutos
- Edições simples de 1-2 ficheiros
- Respostas a perguntas
---
## Comandos
### /task-state init
Cria `.task-state.md` no directório actual baseado no template.
```bash
# Verificar se já existe
[ -f ".task-state.md" ] && echo "AVISO: já existe — usar /task-state update" && exit 1
# Copiar template
cp ~/.claude-work/task-state-template.md .task-state.md
echo "Criado: .task-state.md"
```
Após criar, preencher os campos de Identificação manualmente.
### /task-state read
Lê e apresenta o estado actual — útil ao retomar uma tarefa interrompida:
```bash
cat .task-state.md
```
Ao retomar: ler "Próximo passo imediato" e "Bloqueantes actuais" primeiro.
### /task-state checkpoint N
Marca checkpoint N como concluído:
```bash
# Exemplo: marcar checkpoint 2 como feito
sed -i "s/- \[ \] Sub-issue 2:/- [x] Sub-issue 2:/" .task-state.md
```
### /task-state update
Actualizar campos específicos ao longo do trabalho:
- Adicionar ficheiros modificados à lista
- Registar decisões tomadas
- Actualizar "Próximo passo imediato"
- Adicionar bloqueantes encontrados
---
## Padrão Vertical Plans
Diferença para planos monolíticos:
| Monolítico | Vertical Plans |
|------------|----------------|
| Lê o plano completo | Divide em sub-issues com checkpoint |
| Implementa tudo | Implementa 1 sub-issue |
| Verifica no final | Testa + valida antes de avançar |
| Falha tarde | Falha cedo e barato |
**Regra:** Nunca avançar para sub-issue N+1 sem N estar testado e marcado.
---
## Integração com writing-plans
1. `/writing-plans` → cria plano com sub-issues e critérios de sucesso
2. `/task-state init <nome>` → cria ficheiro de estado
3. A cada sub-issue: implementar → testar → `/task-state checkpoint N` → commit
4. Se sessão interromper: ler `.task-state.md` → continuar no "Próximo passo imediato"
---
## Template
O template está em `~/.claude-work/task-state-template.md`.
Actualizar o template para reflectir necessidades do projecto actual.
---
## Contexto crítico — o que documentar
Documentar TUDO que está só na cabeça do Emanuel e que o agente precisa:
- "Este servidor é produção — não tocar sem aprovação"
- "O cliente X é sensível a preços — nunca mencionar concorrentes"
- "A BD usa UTF-8 mas tem registos ISO-8859 antigos — cuidado com migrações"
**Fonte:** Regra #361 — agente apagou BD de produção porque "é live" estava só na cabeça do humano.
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -108,3 +108,15 @@ Apos listar tarefas, sugerir ate 6 accoes concretas:
--- ---
*Skill v1.0.0 | 04-03-2026 | Descomplicar®* *Skill v1.0.0 | 04-03-2026 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*
+12
View File
@@ -250,3 +250,15 @@ const ALERT_HOURS = 4; // Alertar após 4h
--- ---
*Skill v2.0.0 | 2026-02-05 | Descomplicar®* *Skill v2.0.0 | 2026-02-05 | Descomplicar®*
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*

Some files were not shown because too many files have changed in this diff Show More