Compare commits
13 Commits
6285be6c2e
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| d3f9c950cd | |||
| b6690a75fd | |||
| b3cb108ca7 | |||
| dada9ef7db | |||
| 82063391dd | |||
| 940c3903aa | |||
| c534051774 | |||
| 1d0b2b5441 | |||
| 3115ff24a5 | |||
| a33c5e1b05 | |||
| 37f62eb733 | |||
| 2ec16674c2 | |||
| faef9b47dc |
@@ -0,0 +1 @@
|
|||||||
|
design-media/skills/*/references/__pycache__/
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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®*
|
|
||||||
@@ -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®*
|
|
||||||
@@ -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®*
|
|
||||||
@@ -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®*
|
|
||||||
@@ -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®*
|
|
||||||
@@ -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®*
|
|
||||||
@@ -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"}
|
||||||
|
```
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
@@ -283,3 +283,14 @@ Component Generator:
|
|||||||
- 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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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 -->
|
||||||
|
|||||||
@@ -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 -->
|
||||||
|
|||||||
@@ -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.800–4.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*
|
||||||
@@ -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 -->
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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"}
|
||||||
|
```
|
||||||
@@ -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,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
@@ -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"}
|
||||||
|
```
|
||||||
@@ -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"}
|
||||||
|
```
|
||||||
@@ -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"}
|
||||||
|
```
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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*
|
||||||
@@ -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*
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
@@ -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:** `‘` `’` `“` `”`
|
||||||
|
|
||||||
|
### 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
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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,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"
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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`)
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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*
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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
@@ -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`
|
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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*
|
||||||
@@ -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"}
|
||||||
|
```
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
@@ -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.*
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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.*
|
||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user