feat: adiciona 12 plugins Descomplicar ao marketplace

Plugins: automacao, crm-ops, design-media, dev-tools, gestao,
infraestrutura, marketing, negocio, perfex-dev, project-manager,
wordpress + hello-plugin (existente).

Totais: 83 skills, 44 agents, 12 datasets.json

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-07 21:41:24 +00:00
parent bcce928beb
commit 2cb3210962
209 changed files with 50869 additions and 0 deletions

View File

@@ -0,0 +1,230 @@
---
name: archive
description: Intelligent archiving of completed projects and notes. Moves finished
items to archive with proper organization. Use when user mentions "archive", "arquivar",
"mover para arquivo", "cleanup", "organizar concluídos".
author: Descomplicar® Crescimento Digital
version: 1.0.0
quality_score: 75
user_invocable: true
desk_task: 1462
allowed-tools: Bash, Glob, Read
---
# /archive - Arquivamento Automatico
Skill para mover ficheiros concluidos para pastas de arquivo, mantendo o vault organizado.
---
## Comandos
| Comando | Descricao |
|---------|-----------|
| `/archive` | Arquiva ficheiros com `status: done` ou `status: concluido` |
| `/archive logs` | Arquiva logs >7 dias para 99-Arquivo |
| `/archive tests` | Arquiva testes concluidos em z_tests/arquivo/ |
| `/archive dry` | Mostra o que seria arquivado (sem mover) |
---
## Logica de Arquivamento
### Por Frontmatter Status
```javascript
// Detectar ficheiros com status concluido
const patterns = [
"status: done",
"status: concluido",
"status: completed",
"status: archived"
];
// Pastas locais Obsidian a verificar
const pastas_origem = [
"z_logs/", // Logs de trabalho
"z_reflect/" // Reflexões
];
for (pasta of pastas_origem) {
const ficheiros = await Glob({ pattern: pasta });
for (ficheiro of ficheiros) {
const conteudo = await Read({ file_path: ficheiro });
if (matchesAnyPattern(conteudo, patterns)) {
// Determinar pasta arquivo
const arquivo_path = getArchivePath(ficheiro);
// Mover
await Bash({
command: `mv "${ficheiro}" "${arquivo_path}"`
});
// Registar
arquivados.push(ficheiro);
}
}
}
```
### Por Idade (Logs)
```javascript
// /archive logs - ficheiros >7 dias na pasta z_logs/
const limite = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
// Listar ficheiros na pasta z_logs/
const logs = await Glob({ pattern: "z_logs/*.md" });
for (log of logs) {
const data_ficheiro = extractDateFromFilename(log); // YYYY-MM-DD
if (data_ficheiro < limite) {
// Mover para pasta z_arquivo/
await Bash({
command: `mv "${log}" "z_arquivo/"`
});
}
}
```
---
## Estrutura de Pastas (Obsidian Vault)
```
Planeamento/
├── z_logs/ # Logs de trabalho
│ ├── 2026-01-27-worklog.md # Activo (<7 dias)
│ └── 2026-01-19-worklog.md # Mover para z_arquivo (>7 dias)
├── z_reflect/ # Reflexões
│ ├── 2026-01-27-review.md # Activo
│ └── 2026-W04-weekly.md # Mover para z_arquivo
└── z_arquivo/ # Destino arquivamento
├── 2026-01-19-worklog.md
└── 2026-W04-weekly.md
```
---
## Regras de Arquivamento
| Tipo | Criterio | Destino |
|------|----------|---------|
| Logs | >7 dias | z_arquivo/ |
| Reflexoes | >14 dias OU weekly | z_arquivo/ |
| Projectos | status: done | z_arquivo/ |
---
## Output
### /archive (normal)
```markdown
## Arquivamento - 2026-01-27
### Movidos (5 ficheiros)
| Ficheiro | Origem | Destino |
|----------|--------|---------|
| 2026-01-19-worklog.md | z_logs/ | z_arquivo/ |
| TEST-Skills.md | z_tests/ | z_tests/arquivo/ |
| ... | ... | ... |
### Ignorados (status activo)
- 2026-01-27-worklog.md (activo)
- TEST-Current.md (status: active)
---
*Arquivamento concluido via `/archive`*
```
### /archive dry
```markdown
## Dry Run - 2026-01-27
### Seria arquivado (5 ficheiros)
| Ficheiro | Motivo |
|----------|--------|
| 2026-01-19-worklog.md | >7 dias |
| TEST-Done.md | status: concluido |
> [!info] Nenhum ficheiro foi movido
> Executar `/archive` para arquivar
```
---
## Integracao
### Com /today (segunda-feira)
O `/today` chama automaticamente `/archive logs` as segundas antes da analise semanal.
### Com /reflect
Apos gerar weekly review, ficheiros de reflexao da semana anterior podem ser arquivados.
---
## Seguranca
- **NUNCA arquiva** ficheiros sem pasta arquivo/ existente
- **NUNCA arquiva** ficheiros em edicao (modificados <1h)
- **Cria ficheiro** com lista de movidos em z_logs/: `archive-log-YYYY-MM-DD.md`
---
## Changelog
### v1.0.0 (2026-01-27)
- Versao inicial
- Arquivamento por frontmatter status
- Arquivamento por idade (logs >7 dias)
- Modo dry run
- Integracao com /today
---
*Skill v1.0 | Descomplicar®*
---
## Quando NÃO Usar
- Para tarefas fora do domínio de especialização desta skill
- Quando outra skill mais específica está disponível
- Para operações que requerem confirmação manual do utilizador
## Protocolo
1. Analisar requisitos da tarefa
2. Verificar disponibilidade de ferramentas necessárias
3. Executar operações de forma incremental
4. Validar resultados antes de concluir
5. Reportar status e próximos passos
## Exemplos
### Exemplo 1: Uso Básico
```
Input: [descrição da tarefa]
Output: [resultado esperado]
```
### Exemplo 2: Uso Avançado
```
Input: [caso complexo]
Output: [resultado detalhado]
```

View File

@@ -0,0 +1,527 @@
---
name: calendar-manager
description: Google Calendar management and scheduling automation. Creates events,
manages availability, and syncs schedules. Use when user mentions "calendar", "agenda",
"schedule meeting", "google calendar", "event creation".
author: Descomplicar® Crescimento Digital
version: 1.0.0
quality_score: 75
user_invocable: true
desk_task: 1465
---
# Calendar Manager
Gestão centralizada de múltiplos calendários Google com classificação automática de eventos.
## Calendários Disponíveis
| Calendário | ID | Tipo | Uso |
|------------|----|----|-----|
| **Emanuel Almeida - Pessoal** | `emanuelalmeidaa@gmail.com` | Pessoal | Compromissos pessoais, família, saúde, lazer |
| **Emanuel Almeida - Descomplicar** | `emanuel@descomplicar.pt` | Profissional | Trabalho, reuniões internas, planeamento |
| **Info Descomplicar** | `info@descomplicar.pt` | Profissional | Reuniões com clientes, calls externos |
| **Feriados em Portugal** | `pt-pt.portuguese#holiday@group.v.calendar.google.com` | Referência | Feriados nacionais |
**Conta Google**: `emanuelalmeidaa@gmail.com` (usada para autenticação em todos os calendários)
## Classificação Automática de Eventos
### Eventos PESSOAIS → `emanuelalmeidaa@gmail.com`
Palavras-chave que indicam compromisso pessoal:
- Nomes próprios sem contexto empresarial (Tomás, Susana, Maria, Dra., Dr.)
- Médico, consulta, saúde, dentista, fisioterapia, psicólogo
- Família, filhos, escola, CNG, colégio
- Ginásio, treino, corrida, desporto
- Almoço/jantar pessoal, aniversário, festa
- Casa, obras, condomínio
- Banco, finanças pessoais, seguro
### Eventos PROFISSIONAIS → `emanuel@descomplicar.pt`
Palavras-chave que indicam trabalho interno:
- Planeamento, sprint, retrospectiva, standup
- Desenvolvimento, deploy, release
- Interno, equipa, staff
- Nomes de projectos (Stack Workflow, WiP, etc.)
- Review, code review, merge
- Formação, workshop interno
### Eventos com CLIENTES → `info@descomplicar.pt`
Palavras-chave que indicam reunião externa:
- Cliente, call, reunião externa
- Nomes de empresas/clientes conhecidos (ver lista abaixo)
- Proposta, orçamento, apresentação
- Kickoff, entrega, demo
## Clientes Conhecidos
| Cliente | Keywords |
|---------|----------|
| Carstuff | carstuff, cars |
| FamilyClinic | familyclinic, clinic, clínica |
| KCG | kcg, karate, gaia |
| Espiral Senior | esp, espiral, senior |
| Solar FV | solar, fotovoltaico |
| Water Control | water, água |
| Ignition Vortex | ignition, vortex |
## Comandos e Interpretação
### Criar Eventos
```
Input: "Agenda Dra Susana 14:30"
→ Calendário: Pessoal (Dra = médico)
→ Evento: Dra Susana, 14:30-15:30
Input: "Reunião Carstuff 16h até 19h"
→ Calendário: Clientes (Carstuff = cliente conhecido)
→ Evento: Carstuff, 16:00-19:00
Input: "Planeamento segunda 9h 4 horas"
→ Calendário: Profissional (planeamento = interno)
→ Evento: Planeamento, 09:00-13:00
```
### Listar Eventos
```
"Agenda de hoje" → todos os calendários, hoje
"O que tenho amanhã?" → todos os calendários, amanhã
"Agenda de trabalho" → só profissional + clientes
"Compromissos pessoais" → só pessoal
```
### Verificar Disponibilidade
```
"Estou livre às 15h?" → verificar todos os calendários
"Próximo slot livre de 2h" → encontrar disponibilidade
```
## Execução
### Workflow CRIAR Eventos
#### Passo 1: Analisar Pedido
```javascript
// Input: "Agenda Dra Susana amanhã 14:30"
const analise = {
texto: "Agenda Dra Susana amanhã 14:30",
palavras_chave: ["dra", "susana"],
data_mencionada: "amanhã",
hora_mencionada: "14:30",
duracao_mencionada: null // default 1h
};
```
#### Passo 2: Classificar Tipo
```javascript
// Detectar palavras-chave e determinar calendário
function classificarEvento(texto) {
const keywords_pessoal = /dra?|dentista|médico|família|ginásio|consulta/i;
const keywords_cliente = /carstuff|familyclinic|kcg|espiral|solar|reunião|call/i;
const keywords_profissional = /planeamento|sprint|deploy|interno|equipa/i;
if (keywords_pessoal.test(texto)) {
return {
tipo: 'pessoal',
calendar_id: 'emanuelalmeidaa@gmail.com',
emoji: '🔵'
};
}
if (keywords_cliente.test(texto)) {
return {
tipo: 'clientes',
calendar_id: 'info@descomplicar.pt',
emoji: '🟢'
};
}
if (keywords_profissional.test(texto)) {
return {
tipo: 'profissional',
calendar_id: 'emanuel@descomplicar.pt',
emoji: '🟠'
};
}
// Se ambíguo, perguntar
return { tipo: 'ambiguo' };
}
```
#### Passo 3: Extrair Data e Hora
```javascript
// Obter data actual via mcp-time
const now = await mcp__mcp-time__current_time();
// Interpretar data mencionada
function interpretarData(mencao, hoje) {
const mapa = {
'hoje': hoje,
'amanhã': addDays(hoje, 1),
'segunda': nextWeekday(hoje, 1), // 1 = segunda
'terça': nextWeekday(hoje, 2),
// etc.
};
return mapa[mencao.toLowerCase()] || parseDate(mencao);
}
// Criar timestamps ISO 8601
const data = interpretarData('amanhã', now);
const start_time = `${data}T14:30:00`;
const end_time = `${data}T15:30:00`; // +1h default
```
#### Passo 4: Verificar Conflitos
```javascript
// Buscar eventos existentes no horário
const eventos_conflito = await mcp__google-workspace__get_events({
user_google_email: 'emanuelalmeidaa@gmail.com',
calendar_id: 'ALL', // Verificar todos os calendários
time_min: start_time,
time_max: end_time
});
if (eventos_conflito.length > 0) {
// Avisar utilizador
await AskUserQuestion({
question: `⚠️ Conflito detectado: ${eventos_conflito[0].summary} às ${start_time}. Criar mesmo assim?`,
options: ['Sim', 'Não', 'Ajustar hora']
});
}
```
#### Passo 5: Criar Evento
```javascript
const evento = await mcp__google-workspace__create_event({
user_google_email: 'emanuelalmeidaa@gmail.com',
calendar_id: classificacao.calendar_id,
summary: 'Dra Susana',
start_time: start_time,
end_time: end_time,
timezone: 'Europe/Lisbon',
description: 'Criado via Claude Code /calendar-manager'
});
```
#### Passo 6: Confirmar
```
✅ Dra Susana
📅 Amanhã (2026-02-04) · 14:30 - 15:30
📍 PESSOAL 🔵
🔗 [Ver no calendário](link_do_evento)
```
---
### Workflow LISTAR Eventos
#### Passo 1: Interpretar Pedido
```javascript
// Input: "Agenda de amanhã"
const pedido = {
periodo: 'amanhã', // hoje, amanhã, semana, mes, data específica
ambito: 'todos', // todos, pessoal, profissional, clientes
};
```
#### Passo 2: Determinar Intervalo
```javascript
const now = await mcp__mcp-time__current_time();
function calcularIntervalo(periodo, hoje) {
const intervalos = {
'hoje': {
time_min: `${hoje}T00:00:00`,
time_max: `${hoje}T23:59:59`
},
'amanhã': {
time_min: `${addDays(hoje, 1)}T00:00:00`,
time_max: `${addDays(hoje, 1)}T23:59:59`
},
'semana': {
time_min: `${startOfWeek(hoje)}T00:00:00`,
time_max: `${endOfWeek(hoje)}T23:59:59`
}
};
return intervalos[periodo];
}
```
#### Passo 3: Consultar Calendários
```javascript
// Determinar calendários a consultar baseado no âmbito
const calendarios = pedido.ambito === 'todos'
? ['emanuelalmeidaa@gmail.com', 'emanuel@descomplicar.pt', 'info@descomplicar.pt']
: [mapearAmbito(pedido.ambito)];
// Buscar eventos em paralelo
const resultados = await Promise.all(
calendarios.map(cal_id =>
mcp__google-workspace__get_events({
user_google_email: 'emanuelalmeidaa@gmail.com',
calendar_id: cal_id,
time_min: intervalo.time_min,
time_max: intervalo.time_max
})
)
);
```
#### Passo 4: Agrupar e Formatar
```javascript
// Agrupar por tipo e ordenar por hora
const eventos_agrupados = {
pessoal: resultados[0].sort(byTime),
profissional: resultados[1].sort(byTime),
clientes: resultados[2].sort(byTime)
};
// Formatar resposta
const output = `
📅 Agenda Amanhã (2026-02-04)
🔵 PESSOAL
· 14:30 Dra Susana (1h)
🟠 PROFISSIONAL
· 09:00 Planeamento Semanal (4h)
🟢 CLIENTES
· 16:00 Carstuff (3h)
⏱️ Total: 8h ocupadas | 8h livres
`;
```
#### Passo 5: Sugestões Inteligentes
```javascript
// Se há muitas reuniões seguidas
if (detectarSobrecarga(eventos)) {
output += '\n⚠ Dia muito preenchido. Considerar bloquear tempo para deep work.';
}
// Se não há breaks
if (detectarSemPausas(eventos)) {
output += '\n💡 Sugestão: Agendar 15min de pausa entre reuniões.';
}
```
## Formato de Resposta
### Criar:
```
✅ [TÍTULO]
📅 [DATA] · [HORA INÍCIO] - [HORA FIM]
📍 [TIPO: Pessoal/Profissional/Clientes]
```
### Listar:
```
📅 Agenda [DATA]
🔵 PESSOAL
· 14:30 Dra Susana (1h)
🟠 PROFISSIONAL
· 09:00 Planeamento Semanal (4h)
🟢 CLIENTES
· 16:00 Carstuff (3h)
```
## Regras
1. **Timezone**: Sempre `Europe/Lisbon`
2. **Duração default**: 1 hora
3. **Ambiguidade**: Se não for claro, perguntar ao utilizador
4. **Conflitos**: Avisar se houver sobreposição
5. **Feriados**: Avisar se o evento calhar num feriado
## MCP Tools
### Referência Rápida
```javascript
// Listar calendários disponíveis
mcp__google-workspace__list_calendars({
user_google_email: 'emanuelalmeidaa@gmail.com'
});
// Obter eventos
mcp__google-workspace__get_events({
user_google_email: 'emanuelalmeidaa@gmail.com',
calendar_id: 'emanuelalmeidaa@gmail.com', // ou 'ALL' para todos
time_min: '2026-02-04T00:00:00', // ISO 8601
time_max: '2026-02-04T23:59:59'
});
// Criar evento
mcp__google-workspace__create_event({
user_google_email: 'emanuelalmeidaa@gmail.com',
calendar_id: 'emanuelalmeidaa@gmail.com',
summary: 'Título do evento',
start_time: '2026-02-04T14:30:00',
end_time: '2026-02-04T15:30:00',
timezone: 'Europe/Lisbon',
description: 'Descrição opcional',
location: 'Local opcional'
});
// Modificar evento
mcp__google-workspace__modify_event({
user_google_email: 'emanuelalmeidaa@gmail.com',
calendar_id: 'emanuelalmeidaa@gmail.com',
event_id: 'id_do_evento',
summary: 'Novo título', // campos a actualizar
start_time: 'nova_data'
});
// Eliminar evento
mcp__google-workspace__delete_event({
user_google_email: 'emanuelalmeidaa@gmail.com',
calendar_id: 'emanuelalmeidaa@gmail.com',
event_id: 'id_do_evento'
});
```
### Constantes Úteis
```javascript
const CALENDARIOS = {
PESSOAL: 'emanuelalmeidaa@gmail.com',
PROFISSIONAL: 'emanuel@descomplicar.pt',
CLIENTES: 'info@descomplicar.pt',
FERIADOS: 'pt-pt.portuguese#holiday@group.v.calendar.google.com'
};
const TIMEZONE = 'Europe/Lisbon';
const USER_EMAIL = 'emanuelalmeidaa@gmail.com';
const DURACAO_DEFAULT = 60; // minutos
```
---
## Checklist de Criação
Antes de criar evento, verificar:
- [ ] Calendário correcto identificado (pessoal/profissional/clientes)
- [ ] Data válida (não no passado, salvo excepções)
- [ ] Hora válida (formato HH:MM ou HH:MM-HH:MM)
- [ ] Duração razoável (<12h, excepto dias completos)
- [ ] Sem conflitos (ou utilizador confirmou)
- [ ] Timezone correcto (Europe/Lisbon)
- [ ] Título descritivo
---
## Datasets Dify (Consulta Obrigatória)
Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes datasets via MCP:
| Dataset | ID | Prioridade |
|---------|----|-----------:|
| **Produtividade** | `8ce4429f-8cf6-43b5-869d-75c8e1b461e8` | 1 |
| **Gestão de Projetos** | `e2b1cd92-aa72-4404-8bf3-9f5bf16b044a` | 2 |
### Como Consultar
```javascript
// Pesquisar técnicas de gestão de tempo
mcp__dify-kb__dify_kb_retrieve_segments({
dataset_id: "8ce4429f-8cf6-43b5-869d-75c8e1b461e8",
query: "blocos de foco time blocking"
})
// Pesquisar planeamento de reuniões
mcp__dify-kb__dify_kb_retrieve_segments({
dataset_id: "e2b1cd92-aa72-4404-8bf3-9f5bf16b044a",
query: "reunioes eficazes agenda"
})
```
### Quando Consultar
- Para sugestões de organização de agenda
- Técnicas de time blocking ou deep work
- Boas práticas de agendamento de reuniões
- Gestão de conflitos de horários
---
## Changelog
### v1.1.0 (2026-02-03)
- **Workflows detalhados** - CRIAR e LISTAR com passos concretos
- **Detecção de conflitos** - Verifica sobreposições antes de criar
- **Sugestões inteligentes** - Avisos de sobrecarga e falta de pausas
- **Código pronto a usar** - Exemplos JavaScript completos
- **Checklist** - Validações antes de criar eventos
- **Constantes** - Variáveis reutilizáveis (calendários, timezone)
### v1.0.0 (2026-01-27)
- Versão inicial
- Classificação automática pessoal/profissional/clientes
- Integração Google Workspace MCP
- Datasets Dify para consulta
---
**Versão**: 1.1.0 | **Autor**: Descomplicar®
---
## Quando NÃO Usar
- Para tarefas fora do domínio de especialização desta skill
- Quando outra skill mais específica está disponível
- Para operações que requerem aprovação manual obrigatória
- Quando os requisitos não estão claramente definidos
## Exemplos de Uso
### Exemplo 1: Caso Básico
```
User: [requisição simples relacionada com calendar-manager]
Skill: [execução directa com validação]
Output: [resultado conciso e accionável]
```
### Exemplo 2: Caso Complexo
```
User: [requisição multi-passo ou complexa]
Skill:
1. Análise dos requisitos
2. Planeamento da abordagem
3. Execução faseada
4. Validação contínua
Output: [resultado detalhado com próximos passos]
```
### Exemplo 3: Caso com Dependências
```
User: [requisição que depende de outros sistemas]
Skill:
1. Verificar dependências disponíveis
2. Coordenar com skills/MCPs necessários
3. Executar workflow integrado
Output: [resultado completo com referências]
```

View File

@@ -0,0 +1,106 @@
---
name: cleanup-downloads
description: Limpeza e triagem da pasta Transferências (Downloads). Verifica cada ficheiro individualmente, apaga descartáveis, classifica o restante por categoria. Use when "transferências", "downloads", "limpar downloads", "cleanup", "limpeza pasta", or as part of daily/weekly routines via /today.
---
# Cleanup Downloads
Triagem manual de `/home/ealmeida/Transferências/`. Verificar cada ficheiro individualmente antes de agir.
**Regra de ouro:** NUNCA assumir que ficheiros com nomes semelhantes têm o mesmo conteúdo ou valor. Ler CADA ficheiro individualmente (ex: `emiteDoc.pdf` a `emiteDoc (12).pdf` tinham valores de 25,80€ a 100,53€).
## Procedimento
1. Listar conteúdo com `ls -la /home/ealmeida/Transferências/`
2. **Ler CADA ficheiro PDF individualmente** com `pdftotext` - extrair tipo, valor, data, fornecedor
3. Apresentar lista classificada com acção proposta (incluindo valores reais)
4. Executar apagamentos automáticos (regra 1)
5. Mover ficheiros com destino definido (regras 2-4)
6. Perguntar sobre ficheiros sem regra clara
7. Lançar despesas no CRM via `/expense` (regra 7)
8. Mostrar resumo final (apagados, movidos, mantidos, despesas criadas)
## Regra 1: Apagar sem perguntar
| Padrão | Motivo |
|--------|--------|
| `screencapture-*` | Screenshots browser temporários |
| `test*.docx`, `test*.txt` | Documentos de teste |
| `testando-*`, `teste-*` | Ficheiros de teste |
| `temp_*`, `*.tmp` | Temporários |
| `DIAGNÓSTICO_*.md` | Diagnósticos sessão anterior |
| Pastas só com ficheiros 0 bytes | Attachments vazios |
## Regra 2: Duplicados - verificar um por um
Ficheiros com nomes semelhantes (`ficheiro.pdf` vs `ficheiro (1).pdf`):
- Executar `cmp -s` para comparar
- **Cópia exacta** → apagar o duplicado sem perguntar
- **Ficheiros diferentes** → manter ambos, perguntar destino
Atenção: documentos transferidos com o mesmo nome podem ter conteúdo diferente.
## Regra 3: Documentos financeiros → mover por tipo
**Verificar conteúdo de CADA ficheiro** (ler primeira página com `pdftotext`) para:
1. Classificar correctamente (factura vs recibo vs comprovativo)
2. Extrair o valor real de cada documento
3. NUNCA copiar o valor de um ficheiro para os restantes - cada um tem o seu valor próprio
### 3a: Comprovativos de pagamento a fornecedores
Destino: `/media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/PagamentosFornecedores/`
Padrões típicos:
- `*SEPA*`, `*Compras*` (comprovativos bancários)
- `documento*.pdf` (comprovativos de transferência)
- `emiteDoc*` (AT execução fiscal)
- `FT *`, `inv*` (facturas fornecedores)
- PDFs com data no nome formato `YYYYMMDD*`
### 3b: Recibos de vencimento
Destino: `/media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/Recibos de Vencimento/`
Padrões típicos:
- Recibos de vencimento (TOConline/metta)
- Comprovativos de transferência de salário
## Regra 4: Design, templates e exports → z_Verificar
Destino: `/home/ealmeida/Transferências/z_Verificar/`
Criar pasta `z_Verificar` se não existir. Mover para lá:
- `*.penpot` (ficheiros de design)
- `*.pptx` (templates/apresentações)
- `*.zip` (exports e backups)
- `*.sketch`, `*.fig` (design)
## Regra 5: Pastas antigas - apagar se migrado
Pastas com `.obsidian/` ou `.git/` dentro:
- Verificar se conteúdo já existe no Hub (`/media/ealmeida/Dados/Hub/`)
- **Se migrado** → apagar pasta e zip associado
- **Se não migrado** → perguntar
## Regra 6: Restante - perguntar
Tudo que não encaixar nas regras acima:
- **Facturas** (`emiteDoc*`, `FT *`, `inv*`) → perguntar destino
- **Imagens** (`*.png`, `*.jpg`) → perguntar
- **Dados** (`*.csv`, `*.xlsx`) → perguntar
- **PDFs desconhecidos** → ler primeira página para classificar
## Regra 7: Lançar despesas no CRM
Após mover documentos financeiros (regra 3), lançar despesas via `/expense`:
1. Verificar duplicados no CRM antes de criar
2. **Ler CADA PDF** para extrair valor real - NUNCA copiar valor de um ficheiro para outro
3. Criar despesas com: category_id, amount, date, note, reference, tax=1, currency=2
4. Actualizar `expense_name` via SQL com nome do fornecedor
5. Apresentar resumo com totais
**Anti-pattern:** Assumir que ficheiros com nomes semelhantes (ex: `emiteDoc`, `emiteDoc (1)`, ...) têm o mesmo valor. Cada documento tem valor próprio e deve ser verificado individualmente.
## Integração /today
Incluir contagem de ficheiros na pasta quando >10 ficheiros.

View File

@@ -0,0 +1,349 @@
---
name: delegate
description: Intelligent task delegation to specialized sub-agents. Analyzes task
requirements and routes to appropriate agent with context. Use when user mentions
"delegate", "subagent", "specialized help", "expert needed", or requests multi-domain
complex analysis.
author: Descomplicar® Crescimento Digital
version: 3.0.0
quality_score: 75
user_invocable: true
desk_task: 1470
---
# /delegate - Delegação com Testes e KB Integrados
Delega tarefas de desenvolvimento para outros chats com workflow completo: timer, **auto-consulta Dify KB**, implementação, **testes automáticos**, e report unificado.
## Novidade v3.0: Auto-Consulta Dify KB
Antes de delegar, a skill consulta automaticamente a knowledge base para enriquecer o contexto do agente delegado.
```
/delegate #1429 /path "Implementar feature"
┌─────────────────────────────────────────────────────────┐
│ PRÉ-DELEGAÇÃO (automático) │
├─────────────────────────────────────────────────────────┤
│ 1. Detectar tipo de trabalho (WP, PHP, MCP, etc.) │
│ 2. Carregar agent-knowledge-config.json │
│ 3. Verificar consultation_protocol do agente │
│ 4. Consultar Dify KB com query_template + {task} │
│ 5. Verificar cache (evitar consultas repetidas) │
│ 6. Enriquecer template com conhecimento relevante │
└─────────────────────────────────────────────────────────┘
DELEGAÇÃO ENRIQUECIDA
```
## Workflow v2.0
```
/delegate #1429 /path "Implementar feature"
┌─────────────────────────────────────────────────────────┐
│ CHAT DELEGADO (executa tudo automaticamente) │
├─────────────────────────────────────────────────────────┤
│ 1. start_timer (AikTop) │
│ 2. IMPLEMENTAR │
│ - Desenvolver funcionalidade │
│ - Actualizar CHANGELOG.md │
│ - Commits por etapa │
│ 3. TESTAR ←── NOVO: integrado no fluxo │
│ - Executar testes funcionais │
│ - Verificar edge cases │
│ - Testar regressões │
│ - Se falhar → corrigir → testar novamente │
│ 4. FINALIZAR │
│ - Commit final + push │
│ - Status → "Em Testes" (3) │
│ - Comentário com report unificado │
│ - stop_timer │
└─────────────────────────────────────────────────────────┘
@Emanuel recebe notificação
```
---
## Protocolo de Auto-Consulta Dify KB
### 1. Mapeamento Agente → Datasets
Ficheiro: `~/.claude/agents/agent-knowledge-config.json`
| Tipo de Trabalho | Agente | Datasets Prioritários |
|------------------|--------|----------------------|
| WordPress | `wordpress-plugin-developer` | Wordpress, Elementor, Crocoblock |
| PHP/APIs | `php-fullstack-engineer` | APIs, MCP, Backend |
| MCP | `mcp-protocol-developer` | MCP Servers, Claude Code |
| Marketing | `marketing-planning-expert` | Marketing Digital, SEO |
| CRM | `crm-admin-specialist` | Perfex CRM |
### 2. Fluxo de Consulta
```javascript
// 1. Detectar agente baseado no path/contexto
const agent = detectAgent(path, task); // e.g., "wordpress-plugin-developer"
// 2. Carregar configuração
const config = require('~/.claude/agents/agent-knowledge-config.json');
const protocol = config.agents[agent]?.consultation_protocol;
// 3. Se tem protocolo de consulta
if (protocol?.auto_consult) {
// 4. Construir query
const query = protocol.query_template.replace('{task}', task);
// 5. Verificar cache primeiro
const cacheKey = generateHash(query, protocol.priority_datasets);
const cached = checkCache(cacheKey);
if (cached) {
// Cache hit - usar resultado
return cached.result;
}
// 6. Consultar Dify KB (paralelo)
const results = await Promise.all(
protocol.priority_datasets.map(id =>
mcp__dify-kb__dify_kb_retrieve_segments({
dataset_id: id,
query: query,
top_k: protocol.top_k || 3
})
)
);
// 7. Gravar em cache
saveToCache(cacheKey, results);
// 8. Retornar conhecimento agregado
return aggregateResults(results);
}
```
### 3. Enriquecimento do Template
O conhecimento recuperado é adicionado ao template de delegação:
```markdown
### Contexto da Knowledge Base (Auto-Consultado)
**Query:** {query_used}
**Datasets consultados:** {dataset_names}
**Cache:** HIT/MISS
#### Conhecimento Relevante:
{kb_results_formatted}
---
```
### 4. Métricas Automáticas
Cada delegação com consulta KB grava:
```sql
INSERT INTO tblskill_agent_metrics (
type, name, duration_ms, status, staff_id,
kb_consulted, kb_cache_hit, tool_calls
) VALUES (
'skill', '/delegate', {ms}, 'completed', 25,
1, {0_ou_1}, {n}
);
```
---
## Uso
```bash
/delegate <task_id> <path> [instruções]
```
**Exemplos:**
```bash
/delegate #1429 /home/ealmeida/mcp-servers/mcp-desk-crm-sql-v3
/delegate #1447 /home/ealmeida/mcp-servers/mcp-moloni "Implementar endpoints facturação"
```
---
## Template de Delegação
```markdown
---
## Tarefa Delegada: #[ID] - [NOME]
**Desk:** https://desk.descomplicar.pt/admin/tasks/view/[ID]
**Projecto:** [NOME_PROJECTO]
**Path:** [PATH]
---
### WORKFLOW OBRIGATÓRIO
#### 1. INICIAR (primeiro passo)
```
start_timer(task_id=[ID], staff_id=25, note="[CONTEXTO]")
```
#### 2. IMPLEMENTAR
- Desenvolver funcionalidade conforme descrição
- Manter CHANGELOG.md actualizado
- Commits ao terminar cada etapa:
```bash
git commit -m "feat/fix: descrição (#[ID])"
```
#### 3. TESTAR (obrigatório antes de concluir)
Executar testes e registar resultados:
| Tipo | O Que Testar |
|------|--------------|
| **Funcional** | A feature funciona como esperado? |
| **Edge cases** | Inputs inválidos, limites, erros? |
| **Regressão** | Funcionalidades existentes continuam OK? |
**Se teste falhar:**
1. Corrigir o problema
2. Commit da correcção
3. Testar novamente
4. Repetir até passar
#### 4. FINALIZAR
**4.1 Commit final + push:**
```bash
git add -A && git commit -m "feat: [descrição] (#[ID])" && git push
```
**4.2 Status "Em Testes":**
```
update_task(task_id=[ID], status=3)
```
**4.3 Report unificado:**
```
add_task_comment(task_id=[ID], content="
## Report de Execução
**Trabalho Realizado:**
- [item 1]
- [item 2]
**Testes Executados:**
| Teste | Status |
|-------|--------|
| [Funcional: descrição] | ✅/❌ |
| [Edge case: descrição] | ✅/❌ |
| [Regressão: descrição] | ✅/❌ |
**Taxa de Sucesso:** X/Y (Z%)
**Ficheiros Modificados:**
- [ficheiro]
**Commits:**
- [hash] - descrição
**Bugs/Notas:**
- [se houver]
@Emanuel Almeida
")
```
**4.4 Parar timer:**
```
stop_timer(task_id=[ID], staff_id=25, note="Concluído: [resumo]")
```
---
### Contexto
[INSTRUÇÕES ESPECÍFICAS]
---
*Delegado via /delegate v2.0 - [DATA]*
```
---
## Referência Rápida
### Staff IDs
| ID | Nome | Uso |
|----|------|-----|
| 1 | Emanuel Almeida | Trabalho directo |
| 25 | AikTop | Trabalho delegado IA |
### Status
| ID | Nome |
|----|------|
| 1 | Não iniciado |
| 4 | Em Curso |
| 3 | Em Testes |
| 5 | Terminado |
### Auto-Stop Timer
- Inactividade >15 min → timer pára automaticamente
- Implementado via hooks
---
## Changelog
### v3.0.0 (2026-02-03)
- **NEW:** Auto-consulta Dify KB antes de delegação
- Detecta agente baseado em path/contexto
- Carrega consultation_protocol de agent-knowledge-config.json
- Consulta paralela de datasets prioritários
- Cache layer (24h TTL) evita consultas repetidas
- Template enriquecido com conhecimento relevante
- Métricas automáticas de KB consulted/cache hit
### v2.0.0 (2026-01-27)
- **BREAKING:** Testes integrados no workflow (não separados)
- Report unificado inclui resultados de testes
- Ciclo corrigir→testar até passar
- Eliminada dependência de /test-plan
### v1.0.0 (2026-01-27)
- Versão inicial
- Template estruturado
- Timer AikTop
- Status "Em Testes"
---
**Versão:** 3.0.0 | **Autor:** Descomplicar® | **Data:** 2026-02-03
---
## Quando NÃO Usar
- Para tarefas fora do domínio de especialização desta skill
- Quando outra skill mais específica está disponível
- Para operações que requerem confirmação manual do utilizador
## Exemplos
### Exemplo 1: Uso Básico
```
Input: [descrição da tarefa]
Output: [resultado esperado]
```
### Exemplo 2: Uso Avançado
```
Input: [caso complexo]
Output: [resultado detalhado]
```

View File

@@ -0,0 +1,600 @@
---
name: knowledge
description: >
Unified knowledge management with intelligent routing across Dify KB, WikiJS, Supabase, Context7 and local docs. Detects gaps and suggests content creation.
Use when searching documentation, looking for best practices, researching solutions, or when user mentions
"how to", "documentation", "knowledge base", "search docs", "find information", "best practices", "procedures", "guides".
author: Descomplicar® Crescimento Digital
version: 1.1.0
user_invocable: true
tags: [knowledge, kb, dify, wikijs, supabase, context7, search, documentation]
desk_task: 1474
allowed-tools: Read, Grep, mcp__dify-kb__dify_kb_retrieve_segments, mcp__wikijs__search_pages, mcp__memory-supabase__search_memories, mcp__context7__get-library-docs
category: productivity
quality_score: 85
updated: "2026-02-04T18:00:00Z"
---
# /knowledge - Gestão Unificada de Conhecimento
Pesquisa inteligente com routing automático entre todas as fontes de conhecimento.
## Arquitectura
```
Pergunta → Router → Fonte Adequada → Resultado Agregado
Detecta Lacunas → Sugere Criação
```
| Fonte | MCP | Tipo de Conhecimento |
|-------|-----|---------------------|
| **Dify KB** | dify-kb | RAG, 74 datasets temáticos |
| **WikiJS** | wikijs | Documentação estruturada, procedimentos |
| **Supabase** | memory-supabase | Memória sessões, decisões, contexto |
| **Context7** | context7 | Docs bibliotecas externas |
| **Docs Locais** | filesystem | Ficheiros GDrive, Obsidian |
---
## Comandos
| Comando | Uso |
|---------|-----|
| `/knowledge [termo]` | Pesquisa inteligente com routing |
| `/kb [termo]` | Alias curto |
| `/kb-sync` | Sincronizar índice com Dify KB (actualiza IDs e docs) |
| `/kb-save [tema]` | Guardar conhecimento na fonte adequada |
| `/kb-gaps` | Listar lacunas identificadas |
| `/kb-new [tema]` | Criar novo dataset Dify |
---
## Routing por Tema
### Marketing e Conteúdo
```
Tema: marketing, SEO, copywriting, redes sociais
1ª Fonte: Dify (Marketing Digital, SEO, Neil Patel, Copywriting)
2ª Fonte: WikiJS (estratégias)
3ª Fonte: Supabase (decisões passadas)
```
### WordPress e Web
```
Tema: WordPress, Elementor, WooCommerce, plugins
1ª Fonte: Dify (WordPress, Elementor, Crocoblock)
2ª Fonte: Context7 (docs oficiais)
3ª Fonte: Docs Locais (código)
```
### CRM e Clientes
```
Tema: clientes, Perfex, projectos, facturação
1ª Fonte: Supabase (contexto recente)
2ª Fonte: Dify (PerfexCRM)
3ª Fonte: WikiJS (procedimentos)
```
### Desenvolvimento
```
Tema: código, API, PHP, React, Node
1ª Fonte: Context7 (docs bibliotecas)
2ª Fonte: Dify (TI, Dev Software)
3ª Fonte: Docs Locais (projectos)
```
### Infraestrutura
```
Tema: servidor, CWP, Linux, deploy
1ª Fonte: WikiJS (procedimentos)
2ª Fonte: Dify (TI, CWP, Linux)
3ª Fonte: Supabase (configurações)
```
### Estratégia e Gestão
```
Tema: estratégia, projectos, processos
1ª Fonte: Dify (Estratégia, Gestão Projetos)
2ª Fonte: WikiJS (planos)
3ª Fonte: Supabase (decisões)
```
### Decisões e Contexto
```
Tema: decisão, porque, contexto, histórico
1ª Fonte: Supabase (memória longo prazo)
2ª Fonte: Obsidian (notas)
3ª Fonte: Dify (Data Lake)
```
---
## Workflow Completo
### Passo 1: Análise do Termo
```javascript
// Input: "/knowledge como configurar crocoblock filters"
function analisarQuery(query) {
const keywords = {
tecnico: /código|api|php|react|node|servidor|linux|deploy|git/i,
wordpress: /wordpress|elementor|crocoblock|woocommerce|plugin/i,
marketing: /seo|marketing|copywriting|redes sociais|instagram/i,
crm: /cliente|perfex|crm|facturação|orçamento/i,
estrategia: /estratégia|plano|decisão|porque|contexto/i,
procedimento: /como|tutorial|guia|passo a passo|procedimento/i
};
for (const [categoria, pattern] of Object.entries(keywords)) {
if (pattern.test(query)) {
return categoria;
}
}
return 'geral'; // Default se não detectar categoria
}
const categoria = analisarQuery(query); // 'wordpress'
```
### Passo 2: Determinar Fontes Prioritárias
```javascript
const routing = {
wordpress: [
{ fonte: 'dify', datasets: ['crocoblock-kb', 'elementor', 'wordpress'] },
{ fonte: 'context7', libraries: ['elementor', 'woocommerce'] },
{ fonte: 'docs-locais', paths: ['/Projectos/*/wp-content/'] }
],
marketing: [
{ fonte: 'dify', datasets: ['marketing-digital', 'seo', 'copywriting'] },
{ fonte: 'wikijs', tags: ['marketing', 'estrategia'] },
{ fonte: 'supabase', tags: ['decisao', 'marketing'] }
],
crm: [
{ fonte: 'supabase', tags: ['cliente', 'crm'] },
{ fonte: 'dify', datasets: ['perfexcrm'] },
{ fonte: 'wikijs', tags: ['procedimento', 'crm'] }
],
tecnico: [
{ fonte: 'context7', libraries: ['auto-detect'] },
{ fonte: 'dify', datasets: ['ti', 'desenvolvimento-software'] },
{ fonte: 'docs-locais', paths: ['/Dev/'] }
],
estrategia: [
{ fonte: 'supabase', tags: ['decisao', 'contexto'] },
{ fonte: 'obsidian', folders: ['01-Projectos/', '02-Areas/'] },
{ fonte: 'dify', datasets: ['data-lake-descomplicar'] }
],
procedimento: [
{ fonte: 'wikijs', all: true },
{ fonte: 'dify', datasets: ['procedimentos'] },
{ fonte: 'obsidian', folders: ['03-Recursos/Procedimentos/'] }
]
};
const fontes_prioritarias = routing[categoria];
```
### Passo 3: Pesquisa Sequencial
```javascript
async function pesquisar(query, categoria) {
const fontes = routing[categoria];
let resultados = [];
for (const fonte of fontes) {
let resultado;
switch (fonte.fonte) {
case 'dify':
// Pesquisar em paralelo nos datasets
const promessas = fonte.datasets.map(ds_id =>
mcp__dify-kb__dify_kb_retrieve_segments({
dataset_id: resolverDatasetID(ds_id),
query: query,
top_k: 3
})
);
resultado = await Promise.all(promessas);
break;
case 'wikijs':
resultado = await mcp__wikijs__search_pages({ query });
break;
case 'supabase':
resultado = await mcp__memory-supabase__search_memories({
query,
tags: fonte.tags
});
break;
case 'context7':
// Detectar bibliotecas mencionadas no query
const libs = detectarBibliotecas(query);
resultado = await Promise.all(
libs.map(lib => mcp__context7__get-library-docs({ library: lib }))
);
break;
case 'docs-locais':
// Grep nos paths
resultado = await Grep({
pattern: extrairKeywords(query).join('|'),
path: fonte.paths[0],
output_mode: 'content'
});
break;
case 'obsidian':
// Pesquisa nos folders
resultado = await Promise.all(
fonte.folders.map(folder =>
Grep({
pattern: extrairKeywords(query).join('|'),
path: `/media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/${folder}`,
output_mode: 'content'
})
)
);
break;
}
// Avaliar relevância
const relevante = avaliarRelevancia(resultado, query);
if (relevante.score > 70) {
// Resultado suficiente, parar pesquisa
return { resultados: relevante.data, fonte: fonte.fonte };
} else if (relevante.score > 30) {
// Adicionar mas continuar pesquisando
resultados.push({ ...relevante, fonte: fonte.fonte });
}
}
// Retornar agregado se nenhuma fonte teve score >70
return {
resultados: agregrarResultados(resultados),
fonte: 'multiplas',
lacuna: resultados.length === 0
};
}
```
### Passo 4: Resposta Estruturada
```markdown
## Resultado: como configurar crocoblock filters
### Encontrado em Dify KB (Crocoblock)
**Configuração Filters JetEngine:**
1. Criar Query Builder no JetEngine
2. Definir filtros (taxonomy, meta fields, search)
3. Criar Filter Widget no Elementor
4. Conectar filtro ao Listing Grid
5. Configurar AJAX para loading dinâmico
**Documentação oficial:** [link]
### Relacionado
- [[JetEngine-Query-Builder|Guia Query Builder]]
- Dify KB: Elementor > Filtros Dinâmicos
- WikiJS: Procedimentos > Crocoblock Setup
### Qualidade da Resposta
✅ Completo (score: 85/100)
📊 3 segments de Dify KB
🔗 2 links relacionados
⏱️ Tempo de pesquisa: 1.2s
```
### Passo 5: Detectar e Reportar Lacunas
```javascript
if (resultado.lacuna || resultado.score < 50) {
// Registar lacuna
await mcp__memory-supabase__save_memory({
content: `LACUNA: Query "${query}" não encontrou informação adequada.`,
metadata: {
type: 'lacuna-kb',
categoria: categoria,
query: query,
score: resultado.score,
date: new Date().toISOString()
}
});
// Sugerir criação de conteúdo
console.log(`
> [!warning] Lacuna Detectada
> Tema "${query}" tem informação insuficiente (score: ${resultado.score}).
>
> **Sugestões:**
> - [ ] Criar dataset Dify: "${categoria}-${extrairTema(query)}"
> - [ ] Criar página WikiJS: "Procedimentos/${extrairTema(query)}"
> - [ ] Guardar em Supabase se for decisão importante
`);
}
```
---
## MCPs Disponíveis
### Dify KB
```
mcp__dify-kb__dify_kb_list_datasets # Listar datasets
mcp__dify-kb__dify_kb_retrieve_segments # Pesquisar (dataset_id, query)
mcp__dify-kb__dify_kb_create_dataset # Criar dataset
mcp__dify-kb__dify_kb_create_document_text # Adicionar documento
```
### WikiJS
```
mcp__wikijs__search_pages # Pesquisar (query)
mcp__wikijs__get_page_by_id # Obter página
mcp__wikijs__get_all_pages # Listar todas
```
### Supabase Memory
```
mcp__memory-supabase__search_memories # Pesquisar (query)
mcp__memory-supabase__save_memory # Guardar (content, metadata)
mcp__memory-supabase__get_all_memories # Listar todas
```
### Context7
```
mcp__context7__resolve-library-id # Resolver biblioteca
mcp__context7__get-library-docs # Obter docs
```
### Filesystem (Docs Locais)
```
Grep/Glob em:
- /media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/ (Obsidian vault)
- /media/ealmeida/Dados/GDrive/Projectos/
```
---
## Datasets Dify Principais
### Por Categoria
| Categoria | Datasets | Total Docs |
|-----------|----------|------------|
| Marketing | Marketing Digital, SEO, Copywriting, Neil Patel | 200+ |
| WordPress | WordPress, Elementor, Crocoblock | 470+ |
| Gestão | Gestão Projetos, Estratégia, Produtividade | 50+ |
| Técnico | TI, Dev Software, Linux, AWS | 130+ |
| Clientes | ESP, SNT, Espiral Senior | 140+ |
### IDs Frequentes
Ver mapeamento completo em: `config/sources.json`
---
## Detecção de Lacunas
### Quando Detectar
- Pesquisa retorna 0 resultados
- Resultados irrelevantes para o contexto
- Tema recorrente sem documentação
- Decisão importante não registada
### Acção Sugerida
```markdown
> [!warning] Lacuna Detectada
> Tema "[X]" não tem documentação adequada.
>
> Sugestão:
> - [ ] Criar dataset Dify: [nome sugerido]
> - [ ] Criar página WikiJS: [path sugerido]
> - [ ] Guardar em Supabase: [se for decisão/contexto]
```
---
## Lacunas Conhecidas
### Datasets Dify em Falta
- [ ] Claude Code (boas práticas, skills, hooks)
- [ ] MCP Servers (configuração, troubleshooting)
- [ ] Obsidian (workflows, plugins, templates)
- [ ] Git/Gitea (workflows, CI/CD)
- [ ] EasyPanel (deploy, containers)
### Páginas WikiJS em Falta
- [ ] Arquitectura do Sistema (Stack completo)
- [ ] Guia MCPs Disponíveis
- [ ] Procedimentos de Backup
- [ ] Onboarding Novos Projectos
---
## Sincronização (/kb-sync)
O comando `/kb-sync` actualiza automaticamente o índice de datasets Dify.
### O que faz
1. Lista todos os datasets via `mcp__dify-kb__dify_kb_list_datasets`
2. Compara com `config/sources.json`
3. Actualiza IDs, nomes e contagem de documentos
4. Detecta datasets novos (não mapeados)
5. Detecta datasets removidos
6. Actualiza timestamp `last_sync`
### Quando usar
- Após criar/remover datasets no Dify
- Periodicamente (semanal recomendado)
- Quando pesquisas falham por ID inválido
### Output esperado
```markdown
## Sync Concluído
**Datasets:** 73 (anterior: 74)
**Actualizados:** 5
**Novos:** 0
**Removidos:** 1 (Demo Teste Agosto 2025)
### Alterações
| Dataset | Mudança |
|---------|---------|
| marketing-digital | docs: 81 → 85 |
| crocoblock-kb | docs: 403 → 410 |
```
### Estrutura do sources.json
```json
{
"version": "1.1.0",
"updated": "2026-01-25T15:30:00Z",
"last_sync": "2026-01-25T15:30:00Z",
"total_datasets": 73,
"dify_datasets": {
"nome-slug": {
"id": "uuid-do-dify",
"name": "Nome Original",
"docs": 123
}
}
}
```
---
## Workflow Guardar Conhecimento
### /kb-save [tema]
```
1. Analisar tipo de conhecimento
2. Determinar destino:
- Decisão/Contexto → Supabase
- Procedimento → WikiJS
- Conhecimento temático → Dify KB
3. Formatar conteúdo
4. Guardar com metadata adequada
5. Confirmar gravação
```
---
## Exemplos de Uso
### Pesquisa Técnica
```
/kb como configurar crocoblock filters
→ Dify (Crocoblock) → Context7 (docs) → resultado agregado
```
### Pesquisa Contexto
```
/kb porque escolhemos easypanel
→ Supabase (decisões) → Obsidian (notas) → resultado
```
### Pesquisa Procedimento
```
/kb como fazer backup wordpress
→ WikiJS (procedimentos) → Dify (WordPress) → resultado
```
### Guardar Decisão
```
/kb-save decisão
"Escolhemos Remotion para vídeos porque..."
→ Supabase com tags: [decisão, video, remotion]
```
---
## Referências
- [[03-Recursos/Indice-Conhecimento]] - Inventário completo de fontes
- [[StackUpdate]] - Roadmap do sistema
---
---
## Datasets Dify (Consulta Obrigatória)
Esta skill já faz routing automático para datasets Dify, mas em caso de dúvidas técnicas sobre a própria gestão de conhecimento:
| Dataset | ID | Prioridade |
|---------|----|-----------:|
| **Data Lake Descomplicar** | `b4e233d6-0d78-42f6-aef4-a56280600fe8` | 1 |
| **Dify** | `44d1517b-65b8-4d81-8253-5683ff0b8830` | 2 |
| **Obsidian + Claude Code** | `e38a510f-ca93-4407-8b44-c4c66efe01f8` | 2 |
### Como Consultar
```javascript
// Pesquisar no Data Lake geral
mcp__dify-kb__dify_kb_retrieve_segments({
dataset_id: "b4e233d6-0d78-42f6-aef4-a56280600fe8",
query: "[termo de pesquisa]"
})
// Configuração e uso do Dify
mcp__dify-kb__dify_kb_retrieve_segments({
dataset_id: "44d1517b-65b8-4d81-8253-5683ff0b8830",
query: "dataset segment retrieval"
})
// Integração Obsidian + Claude
mcp__dify-kb__dify_kb_retrieve_segments({
dataset_id: "e38a510f-ca93-4407-8b44-c4c66efe01f8",
query: "vault workflow dataview"
})
```
### Quando Consultar
- Configurar novo dataset Dify
- Optimizar estratégia de retrieval
- Integrar Obsidian com Claude Code
- Criar workflows de gestão de conhecimento
---
## Checklist de Pesquisa
Antes de responder ao utilizador:
- [ ] Categoria correctamente identificada
- [ ] Fontes prioritárias consultadas
- [ ] Score de relevância >70 (ou >30 agregado)
- [ ] Lacunas detectadas e reportadas
- [ ] Resultados formatados correctamente
- [ ] Links relacionados incluídos
---
## Changelog
### v1.1.0 (2026-02-03)
- **Workflow completo** - 5 passos detalhados com código
- **Routing inteligente** - Mapeamento categoria → fontes
- **Pesquisa paralela** - Múltiplos datasets Dify simultâneos
- **Score de relevância** - Avaliação automática (0-100)
- **Detecção de lacunas** - Auto-report e sugestões
- **Checklist** - Validação antes de responder
### v1.0.0 (2026-01-25)
- Versão inicial
- Routing manual por tema
- Datasets Dify mapeados
- Integração com 5 fontes
---
**Versão**: 1.1.0 | **Data**: 2026-02-03 | **Autor**: Descomplicar®

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,239 @@
# Workflow de Sincronização - /kb-sync
Documentação do processo de sincronização automática do índice de conhecimento.
---
## Visão Geral
```
┌─────────────────┐
│ /kb-sync │
└────────┬────────┘
┌─────────────────┐
│ Listar Dify │ ← mcp__dify-kb__dify_kb_list_datasets
│ Datasets │
└────────┬────────┘
┌─────────────────┐
│ Ler sources │ ← config/sources.json
│ .json │
└────────┬────────┘
┌─────────────────┐
│ Comparar e │
│ Detectar │
│ Alterações │
└────────┬────────┘
┌─────────────────┐
│ Actualizar │
│ sources.json │
└────────┬────────┘
┌─────────────────┐
│ Reportar │
│ Alterações │
└─────────────────┘
```
---
## Processo Detalhado
### 1. Obter Datasets Actuais
```
MCP: mcp__dify-kb__dify_kb_list_datasets
Params:
- limit: 100
- page: 1 (iterar se has_more)
```
**Resposta esperada:**
```json
{
"success": true,
"datasets": [
{
"id": "uuid",
"name": "Nome do Dataset",
"description": "...",
"document_count": 123,
"word_count": 456789,
"created_at": "2025-01-25T..."
}
],
"pagination": {
"total": 73,
"has_more": false
}
}
```
### 2. Ler Índice Actual
Ler `config/sources.json` e extrair:
- `dify_datasets` - mapeamento actual
- `last_sync` - última sincronização
- `total_datasets` - contagem anterior
### 3. Comparar e Detectar
#### Datasets Novos
```python
novos = []
for dataset in dify_response:
slug = slugify(dataset.name)
if slug not in sources.dify_datasets:
novos.append({
"slug": slug,
"id": dataset.id,
"name": dataset.name,
"docs": dataset.document_count
})
```
#### Datasets Removidos
```python
removidos = []
dify_ids = [d.id for d in dify_response]
for slug, info in sources.dify_datasets.items():
if info.id not in dify_ids:
removidos.append(slug)
```
#### Datasets Alterados
```python
alterados = []
for dataset in dify_response:
slug = slugify(dataset.name)
if slug in sources.dify_datasets:
old = sources.dify_datasets[slug]
if old.docs != dataset.document_count:
alterados.append({
"slug": slug,
"old_docs": old.docs,
"new_docs": dataset.document_count
})
```
### 4. Actualizar sources.json
```python
# Actualizar metadados
sources.version = increment_minor(sources.version)
sources.updated = now()
sources.last_sync = now()
sources.total_datasets = len(dify_response)
# Remover datasets eliminados
for slug in removidos:
del sources.dify_datasets[slug]
# Actualizar existentes e adicionar novos
for dataset in dify_response:
slug = slugify(dataset.name)
sources.dify_datasets[slug] = {
"id": dataset.id,
"name": dataset.name,
"docs": dataset.document_count
}
# Escrever ficheiro
write_json("config/sources.json", sources)
```
### 5. Gerar Relatório
```markdown
## Sync Concluído - 2026-01-25 15:30
| Métrica | Valor |
|---------|-------|
| **Total Datasets** | 73 |
| **Anterior** | 74 |
| **Novos** | 0 |
| **Removidos** | 1 |
| **Actualizados** | 5 |
### Datasets Removidos
- Demo Teste Agosto 2025
### Datasets Actualizados
| Dataset | Docs Antes | Docs Depois |
|---------|------------|-------------|
| marketing-digital | 81 | 85 |
| crocoblock-kb | 403 | 410 |
### Datasets Novos
(nenhum)
```
---
## Slugify
Função para converter nome do dataset em slug consistente:
```javascript
function slugify(name) {
return name
.toLowerCase()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '') // Remove acentos
.replace(/[^a-z0-9]+/g, '-') // Substitui não-alfanum
.replace(/^-+|-+$/g, ''); // Remove hífens início/fim
}
```
**Exemplos:**
- "Marketing Digital" → "marketing-digital"
- "SEO (Search Engine Optimization)" → "seo-search-engine-optimization"
- "TI (Tecnologia da Informação)" → "ti-tecnologia-da-informacao"
---
## Frequência Recomendada
| Cenário | Frequência |
|---------|------------|
| Uso normal | Semanal |
| Após criar datasets | Imediato |
| Após remover datasets | Imediato |
| Debugging | Conforme necessário |
---
## Erros Comuns
| Erro | Causa | Solução |
|------|-------|---------|
| MCP timeout | Muitos datasets | Paginar requests |
| JSON inválido | Corrupção | Restaurar de backup |
| ID não encontrado | Dataset removido | Executar /kb-sync |
| Duplicados | Nomes similares | Verificar slugs manualmente |
---
## Backup Automático
Antes de cada sync, criar backup:
```
config/sources.json.bak
```
Restaurar se necessário:
```bash
cp config/sources.json.bak config/sources.json
```
---
*Workflow v1.0 | 2026-01-25*

View File

@@ -0,0 +1,266 @@
# Workflow de Pesquisa - /knowledge
Documentação detalhada do processo de pesquisa e routing.
---
## Fluxo Principal
```
┌─────────────┐
│ Pergunta │
└──────┬──────┘
┌─────────────┐
│ Analisar │ ← Extrair keywords, identificar tema
│ Termo │
└──────┬──────┘
┌─────────────┐
│ Routing │ ← Consultar config/sources.json
│ Tema │
└──────┬──────┘
┌─────────────┐
│ Pesquisar │ ← Fonte primária
│ Fonte 1 │
└──────┬──────┘
┌─────────────┐ ┌─────────────┐
│ Resultados │ NO │ Pesquisar │
│ Suficientes?├────►│ Fonte 2 │
└──────┬──────┘ └──────┬──────┘
│ YES │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Agregar │◄────┤ Fonte 3 │
│ Resultados │ │ (se neces.) │
└──────┬──────┘ └─────────────┘
┌─────────────┐
│ Detectar │ ← Se resultados insuficientes
│ Lacunas │
└──────┬──────┘
┌─────────────┐
│ Resposta │
│ Estruturada │
└─────────────┘
```
---
## Fase 1: Análise do Termo
### Extracção de Keywords
```
Input: "como configurar crocoblock filters no elementor"
Keywords: [crocoblock, filters, elementor, configurar]
Tema detectado: wordpress
```
### Regras de Detecção
1. Corresponder keywords com `routing[tema].keywords`
2. Se múltiplos temas, usar o mais específico
3. Se nenhum tema, usar pesquisa genérica (todas as fontes)
---
## Fase 2: Routing
### Consulta ao Mapeamento
```javascript
// Pseudocódigo
tema = detectarTema(keywords)
sources = routing[tema].sources
// Ordenar por prioridade
fonte1 = sources[0] // Primária
fonte2 = sources[1] // Secundária
fonte3 = sources[2] // Terciária
```
### Prioridades por Tipo
| Tipo de Pergunta | Fonte Primária | Porque |
|------------------|----------------|--------|
| Técnico/Como fazer | Context7 | Docs actualizados |
| Negócio/Clientes | Supabase | Contexto recente |
| Procedimento | WikiJS | Documentação interna |
| Conhecimento geral | Dify KB | RAG temático |
| Histórico/Decisão | Supabase | Memória longo prazo |
---
## Fase 3: Pesquisa
### Dify KB
```
MCP: mcp__dify-kb__dify_kb_retrieve_segments
Params:
- dataset_id: [obtido de sources.json]
- query: [termo original]
- top_k: 5
```
### WikiJS
```
MCP: mcp__wikijs__search_pages
Params:
- query: [termo]
Filtrar por paths relevantes do routing
```
### Supabase
```
MCP: mcp__memory-supabase__search_memories
Params:
- query: [termo]
Filtrar por tags do routing
```
### Context7
```
MCP: mcp__context7__resolve-library-id
MCP: mcp__context7__get-library-docs
Params:
- libraryName: [biblioteca detectada]
- topic: [termo específico]
```
### Filesystem
```
Grep em paths do routing:
- /media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/ (Obsidian vault)
- /media/ealmeida/Dados/GDrive/Projectos/
```
---
## Fase 4: Agregação
### Critérios de Suficiência
- **Suficiente**: ≥1 resultado relevante com conteúdo útil
- **Parcial**: Resultados tangenciais, precisa complemento
- **Insuficiente**: 0 resultados ou irrelevantes
### Formatação de Resposta
```markdown
## Resultado: [termo pesquisado]
### Fonte: [Nome da Fonte]
[Conteúdo encontrado, formatado e resumido]
### Fonte: [Segunda Fonte] (se aplicável)
[Conteúdo complementar]
### Relacionado
- [[Link interno 1]]
- [[Link interno 2]]
### Acções Sugeridas (se aplicável)
- [ ] Criar documentação sobre X
- [ ] Actualizar Y com esta informação
```
---
## Fase 5: Detecção de Lacunas
### Triggers
1. **Zero resultados** em todas as fontes
2. **Tema recorrente** (3+ pesquisas similares sem resultado)
3. **Resultado desactualizado** (>6 meses)
4. **Decisão importante** sem registo
### Acção Automática
```markdown
> [!warning] Lacuna Detectada
> O tema "[X]" não tem documentação adequada.
>
> **Sugestão:**
> - Criar dataset Dify: `[nome-sugerido]`
> - Ou página WikiJS: `[path-sugerido]`
> - Ou guardar em Supabase (se decisão/contexto)
```
### Registo de Lacunas
Adicionar a `config/sources.json``gaps`:
```json
{
"gaps": {
"dify_missing": ["novo-tema"],
"wikijs_missing": ["novo-path"],
"detected_at": "2026-01-25"
}
}
```
---
## Comandos Especiais
### /kb-save [tema]
```
1. Receber conteúdo a guardar
2. Analisar tipo:
- Decisão → Supabase (tag: decisao)
- Procedimento → WikiJS
- Conhecimento → Dify KB
3. Formatar com metadata
4. Guardar na fonte adequada
5. Confirmar com referência
```
### /kb-gaps
```
1. Ler config/sources.json → gaps
2. Listar lacunas conhecidas
3. Sugerir prioridades baseado em:
- Frequência de pesquisa
- Impacto no trabalho
- Esforço de criação
```
### /kb-new [tema]
```
1. Criar dataset no Dify KB
2. Adicionar estrutura base
3. Actualizar sources.json com novo ID
4. Remover de gaps.dify_missing
```
---
## Métricas de Qualidade
### Pesquisa Bem Sucedida
- [ ] Resultado relevante encontrado
- [ ] Fonte adequada usada
- [ ] Resposta formatada correctamente
- [ ] Links internos incluídos
### Detecção de Lacunas
- [ ] Lacuna identificada quando apropriado
- [ ] Sugestão de acção clara
- [ ] Lacuna registada para futuro
---
## Troubleshooting
| Problema | Causa | Solução |
|----------|-------|---------|
| MCP timeout | Servidor lento | Retry com delay |
| Dataset não encontrado | ID inválido | Actualizar sources.json |
| Resultados irrelevantes | Keywords mal detectadas | Refinar routing |
| Muitas lacunas | Tema novo | Criar conteúdo base |
---
*Workflow v1.0 | 2026-01-25*

View File

@@ -0,0 +1,49 @@
---
name: reflect
description: >
Alias de /worklog v4.0. Auto-reflexão e registo de trabalho unificado.
/reflect = /worklog (mesmo resultado). /reflect deep = análise profunda com histórico.
/reflect week = revisão semanal (segundas via /today).
Use when "reflect", "reflexão", "análise", "melhoria", "insight", auto-triggered after >10 tool calls.
author: Descomplicar® Crescimento Digital
version: 4.0.0
quality_score: 95
user_invocable: true
category: productivity
tags: [reflexao, auto-melhoria, meta, optimizacao, sistema, pdca, alerts, metrics]
desk_task: 1555
desk_project: 65
allowed-tools: Read, Write, Bash, mcp__desk-crm-v3, mcp__ssh-unified, mcp__memory-supabase, mcp__mcp-time
mcps: desk-crm-v3, ssh-unified, memory-supabase, mcp-time
auto_trigger:
enabled: true
threshold_tool_calls: 15
background: true
---
# /reflect - Alias de /worklog
**`/reflect` = `/worklog`** - Produzem o mesmo resultado.
Desde v4.0, worklog e reflect estao unificados. Toda a logica, formatos e workflows estao em `/worklog`.
## Comandos
| Comando | Equivalente | Descrição |
|---------|-------------|-----------|
| `/reflect` | `/worklog` | Registo + reflexão da sessão → Discussão #31 |
| `/reflect deep` | (exclusivo) | Análise profunda com histórico → Discussão #32 |
| `/reflect week` | (exclusivo) | Revisão semanal → Discussão #32 |
## Instrução
Ao receber `/reflect` (sem argumentos):
1. Executar exactamente o protocolo de `/worklog`
2. Ver skill `/worklog` (SKILL.md) para formato, workflow e storage
Ao receber `/reflect deep` ou `/reflect week`:
1. Ver secções específicas na skill `/worklog`
---
*Skill v4.0.0 | 2026-02-06 | Descomplicar(R)*

View File

@@ -0,0 +1,226 @@
---
name: report
description: >
Relatórios agregados v1.0 - Semanal, mensal, projecto. Compila dados de múltiplas skills.
Use when "report", "relatório", "semanal", "mensal", "resumo período".
author: Descomplicar® Crescimento Digital
version: 1.0.0
quality_score: 75
user_invocable: true
category: business
tags: [report, relatório, semanal, mensal, analytics, desk, crm]
desk_project: 65
allowed-tools: Read, mcp__desk-crm-v3, mcp__mcp-time
mcps: desk-crm-v3, mcp-time
---
# /report v1.0 - Relatórios Agregados
Relatórios de período compilando dados de múltiplas fontes.
---
## Comandos
| Comando | Função |
|---------|--------|
| `/report` | Relatório semanal (default) |
| `/report weekly` | Relatório semanal detalhado |
| `/report monthly` | Relatório mensal |
| `/report project <id>` | Relatório de projecto |
---
## Protocolo
### /report weekly (Semanal)
```
1. mcp__mcp-time__current_time → Calcular Seg-Dom da semana
2. Recolher dados:
a. Timesheets da semana
b. Tarefas concluídas
c. Tickets fechados
d. Facturas emitidas/pagas
3. Calcular métricas
4. Gerar relatório
```
**Output:**
```markdown
## 📊 Relatório Semanal - W06 (03-09 Fev 2026)
### ⏱️ Tempo
| Dia | Horas | Billable |
|-----|-------|----------|
| Seg | 6h 30m | 5h |
| Ter | 7h 15m | 6h |
| Qua | 4h 45m | 4h |
| Qui | 8h 00m | 7h |
| Sex | 5h 30m | 5h |
| **Total** | **32h** | **27h (84%)** |
### ✅ Tarefas Concluídas (12)
| ID | Tarefa | Projecto |
|----|--------|----------|
| #1446 | Documentação | Stack |
| #1448 | Testes | Stack |
### 🎫 Tickets (8)
- Fechados: 6
- Em aberto: 2
- Tempo médio resolução: 4h
### 💰 Facturação
| Métrica | Valor |
|---------|-------|
| Emitido | €5.500 |
| Recebido | €3.200 |
| Pendente | €7.800 |
### 📈 Highlights
- Projecto SFV-360: 15h (47%)
- Projecto Stack: 10h (31%)
- Interno: 7h (22%)
```
---
### /report monthly (Mensal)
```
1. Calcular primeiro e último dia do mês
2. Recolher dados agregados
3. Comparar com mês anterior
4. Gerar relatório
```
**Output:**
```markdown
## 📊 Relatório Mensal - Janeiro 2026
### Resumo Executivo
- Horas trabalhadas: 142h
- Billable: 118h (83%)
- Facturado: €12.500
- Recebido: €9.800
### Comparação
| Métrica | Jan | Dez | Δ |
|---------|-----|-----|---|
| Horas | 142h | 128h | +11% |
| Facturado | €12.5k | €10.2k | +23% |
| Tickets | 32 | 28 | +14% |
### Projectos Activos (5)
| Projecto | Horas | Valor |
|----------|-------|-------|
| SFV-360 | 45h | €4.500 |
| Stack | 38h | Interno |
### Clientes
| Cliente | Facturado | Pago | Saldo |
|---------|-----------|------|-------|
| TechCorp | €5.000 | €5.000 | €0 |
| StartupX | €3.500 | €2.000 | €1.500 |
```
---
### /report project <id>
```
1. mcp__desk-crm-v3__get_project({ project_id })
2. mcp__desk-crm-v3__get_tasks({ project_id })
3. mcp__desk-crm-v3__get_project_time_tracking({ project_id })
4. mcp__desk-crm-v3__get_invoices({ project_id })
5. Gerar relatório
```
**Output:**
```markdown
## 📁 Relatório Projecto: SFV-360 (#80)
### Status
- **Progresso:** 65%
- **Início:** 2026-01-15
- **Deadline:** 2026-03-31
### Tarefas
| Status | Qtd |
|--------|-----|
| Concluídas | 12 |
| Em curso | 5 |
| Pendentes | 8 |
### Tempo
- Total: 45h
- Estimado: 80h
- Burn rate: 56%
### Financeiro
| Factura | Valor | Status |
|---------|-------|--------|
| INV-045 | €2.500 | Pendente |
| INV-040 | €2.000 | Pago |
### Timeline
- 15/Jan: Kickoff
- 25/Jan: Fase 1 concluída
- 05/Fev: Entrega parcial
```
---
## Métricas Calculadas
| Métrica | Fórmula |
|---------|---------|
| Billable % | Horas billable / Total horas |
| Burn rate | Horas gastas / Horas estimadas |
| Ticket SLA | Tickets dentro SLA / Total |
| DSO | Dias médios para pagamento |
---
## Integração Skills
| Dados | Fonte |
|-------|-------|
| Tempo | /time (timesheets) |
| Tarefas | /crm (tasks) |
| Tickets | /ticket |
| Facturas | /invoice |
---
## Storage
Relatórios podem ser guardados em:
- **Discussão #31** (Logs) - Relatórios semanais
- **memory-supabase** - Backup para análise histórica
---
## Anti-Patterns
- **NUNCA** gerar relatório sem período definido
- **NUNCA** incluir dados estimados como factos
- **NUNCA** mostrar valores financeiros a staff não autorizado
---
## Changelog
### v1.0.0 (2026-02-05)
- Versão inicial
- Relatórios weekly, monthly, project
- Integração com skills Desk
- Métricas calculadas
---
*Skill v1.0.0 | 2026-02-05 | Descomplicar®*

242
gestao/skills/time/SKILL.md Normal file
View File

@@ -0,0 +1,242 @@
---
name: time
description: >
Time tracking integrado com Desk CRM v2.0. Alertas >4h, total semanal, integração worklog.
Use when "time", "timer", "horas", "timesheet", "start", "stop", "tempo".
author: Descomplicar® Crescimento Digital
version: 2.0.0
quality_score: 80
user_invocable: true
category: productivity
tags: [time, timer, desk, crm, timesheet, productivity]
desk_task: 1485
desk_project: 65
allowed-tools: Read, Write, mcp__desk-crm-v3, mcp__mcp-time, mcp__filesystem
mcps: desk-crm-v3, mcp-time, filesystem
---
# /time v2.0 - Gestão de Tempo
Timer integrado com Desk CRM. Alertas inteligentes, resumo semanal.
---
## Novidades v2.0
- **Alerta >4h:** Perguntar se timer ainda activo
- **Total semana:** Mostrar horas Seg-Dom no status
- **Link worklog:** Oferecer criar worklog ao parar
- **Verificação:** Comparar estado local vs Desk
---
## Comandos
| Comando | Função |
|---------|--------|
| `/time` | Ver status (timer + semana) |
| `/time start <task_id>` | Iniciar timer |
| `/time stop` | Parar timer actual |
| `/time switch <task_id>` | Trocar para outra tarefa |
| `/time log <hours> <task_id>` | Entrada manual |
---
## Protocolo
### /time (Status)
```
1. Obter hora actual via mcp__mcp-time__current_time
2. Ler ~/.claude-work/active-timer.json
3. Se timer activo:
a. Calcular duração
b. SE >4h: Mostrar alerta "Timer activo há Xh. Ainda a trabalhar?"
4. Obter timesheets da semana:
mcp__desk-crm-v3__get_timesheets_advanced({
staff_id: 1,
start_date: segunda_da_semana,
end_date: domingo_da_semana
})
5. Mostrar resumo
```
**Output:**
```markdown
## ⏱️ Timer Activo
🟢 #1446 - Documentação Skills
Projecto: Stack Workflow (#65)
Iniciado: 14:30 (há 2h 15m)
## 📊 Esta Semana (03-09 Fev)
| Dia | Horas |
|-----|-------|
| Seg | 6h 30m |
| Ter | 7h 15m |
| Qua | 4h 45m ← Hoje |
| **Total** | **18h 30m** |
```
**Se timer >4h:**
```markdown
⚠️ Timer activo há **5h 30m**
Ainda a trabalhar em #1446?
- [Sim, continuar]
- [Parar timer]
- [Ajustar tempo]
```
---
### /time start <task_id>
```
1. Verificar se já existe timer activo
- Se sim: "Já tens timer em #X. Parar primeiro?"
2. Obter detalhes da tarefa:
mcp__desk-crm-v3__get_task({ task_id })
3. Iniciar timer no Desk:
mcp__desk-crm-v3__start_timer({
task_id: task_id,
staff_id: 1,
note: "Iniciado via Claude Code"
})
4. Guardar estado local:
~/.claude-work/active-timer.json
5. Confirmar
```
**Ficheiro estado:**
```json
{
"task_id": 1446,
"task_name": "Documentação Skills",
"project_id": 65,
"project_name": "Stack Workflow",
"started_at": "2026-02-05T14:30:00Z",
"staff_id": 1
}
```
---
### /time stop
```
1. Ler estado local
2. SE vazio: "Sem timer activo"
3. Calcular duração
4. Parar timer no Desk:
mcp__desk-crm-v3__stop_timer({
task_id: task_id,
staff_id: 1
})
5. Limpar estado local
6. Perguntar: "Criar worklog? [Sim/Não]"
- Se sim: Invocar /worklog com contexto
7. Confirmar
```
**Output:**
```markdown
⏹️ Timer parado!
📋 Tarefa: #1446 - Documentação Skills
⏱️ Duração: 2h 15m
📁 Projecto: Stack Workflow
Criar worklog? [Sim] [Não]
```
---
### /time switch <task_id>
```
1. Parar timer actual (silencioso, nota: "Switched")
2. Iniciar novo timer na tarefa indicada
3. Confirmar troca
```
---
### /time log <hours> <task_id>
```
1. Validar formato horas (ex: "2h", "2.5", "2h30m")
2. Converter para decimal
3. Registar entrada manual:
mcp__desk-crm-v3__add_timesheet_entry({
task_id: task_id,
staff_id: 1,
hours: hours_decimal,
note: "Entrada manual via Claude Code"
})
4. Confirmar
```
---
## Integração /today
O `/today` deve mostrar timer activo:
```markdown
## ⏱️ Timer Activo
🟢 #1446 - Documentação (2h 15m)
```
---
## Integração /worklog
Ao parar timer, oferecer criar worklog com contexto:
- Tarefa trabalhada
- Duração
- Projecto
---
## Constantes
```javascript
const STAFF_ID = 1; // Emanuel
const AIKTOP_ID = 25; // Para comentários automáticos
const TIMER_STATE = "/home/ealmeida/.claude-work/active-timer.json";
const ALERT_HOURS = 4; // Alertar após 4h
```
---
## Anti-Patterns
- **NUNCA** deixar timer overnight sem perguntar
- **NUNCA** iniciar timer sem tarefa associada
- **NUNCA** criar tarefa só para ter timer (usar tarefas existentes)
---
## Changelog
### v2.0.0 (2026-02-05)
- Alerta se timer >4h
- Mostrar total horas da semana no status
- Integração com /worklog ao parar
- Verificar estado Desk vs local
- Semana: Seg-Dom
### v1.1.0 (2026-02-03)
- Workflows organizados
- MCP Tools corrigidos
### v1.0.0 (2026-01-27)
- Versão inicial
---
*Skill v2.0.0 | 2026-02-05 | Descomplicar®*

View File

@@ -0,0 +1,185 @@
---
title: Setup MCPs para /today
date: 2025-01-21
status: activo
---
# Setup MCPs para /today
## Estado Actual
| MCP | Estado | Notas |
|-----|--------|-------|
| desk-crm-v3 | ✅ Activo | Tickets, projectos, tarefas |
| filesystem | ✅ Activo | Notas Obsidian |
| memory-supabase | ✅ Activo | Persistência |
| imap | ✅ Activo | 12 contas email |
| google-workspace | ⏸️ Opcional | Calendar (se necessário) |
---
## MCP IMAP (Principal)
### Contas Configuradas (12)
```
emanuel@descomplicar.pt
it@descomplicar.pt
help@descomplicar.pt
suporte@descomplicar.pt
contabilidade@descomplicar.pt
financeiro@descomplicar.pt
info@descomplicar.pt
rh@descomplicar.pt
mkt@descomplicar.pt
design@descomplicar.pt
news@descomplicar.pt
aiktop@descomplicar.pt
```
### Ferramentas Disponíveis
| Ferramenta | Função |
|------------|--------|
| `imap_list_accounts` | Listar contas disponíveis |
| `imap_list_folders` | Listar pastas de uma conta |
| `imap_list_emails` | Listar emails de uma pasta |
| `imap_read_email` | Ler email por UID |
| `imap_search_emails` | Pesquisar emails |
| `imap_move_email` | Mover email entre pastas |
| `imap_delete_email` | Eliminar email |
### Acções Automáticas Diárias
1. **SPAM**`imap_delete_email`
2. **Promocionais**`imap_move_email` para "Promotions"
3. **Facturas pagas** → Reencaminhar para contabilidade@descomplicar.pt
4. **Prioritários** → Listar no relatório
### Regras de Triagem
Ver: `config/email-triage-rules.md`
---
## Google Workspace MCP (Opcional)
### Localização
```
~/mcp-servers/google_workspace_mcp/
```
### Capacidades
- **Gmail**: Pesquisa, envio, gestão de emails
- **Calendar**: Eventos, reuniões, agenda
- **Drive**: Ficheiros (opcional)
- **Docs/Sheets**: Documentos (opcional)
### Requisitos para Activar
1. **Google Cloud Console**
- Criar projecto ou usar existente
- Activar Gmail API
- Activar Calendar API
- Criar credenciais OAuth (Desktop App)
2. **Credenciais necessárias**
```
GOOGLE_OAUTH_CLIENT_ID=xxx
GOOGLE_OAUTH_CLIENT_SECRET=xxx
USER_GOOGLE_EMAIL=emanuel@descomplicar.pt
```
3. **Ficheiros existentes**
- `client_secret.json` ✅ Existe
- `token.json` ✅ Existe
- `.env` ✅ Existe
### Verificar Estado
```bash
cd ~/mcp-servers/google_workspace_mcp
cat .env
# Verificar se credenciais estão preenchidas
```
### Adicionar ao Claude settings.json
```json
{
"mcpServers": {
"google-workspace": {
"command": "python",
"args": ["-m", "workspace_mcp"],
"cwd": "/home/ealmeida/mcp-servers/google_workspace_mcp",
"env": {
"GOOGLE_OAUTH_CLIENT_ID": "...",
"GOOGLE_OAUTH_CLIENT_SECRET": "...",
"USER_GOOGLE_EMAIL": "emanuel@descomplicar.pt"
}
}
}
}
```
---
## Passos para Completar Setup
### 1. Verificar credenciais Google
```bash
cd ~/mcp-servers/google_workspace_mcp
cat .env
cat client_secret.json
```
### 2. Testar MCP localmente
```bash
cd ~/mcp-servers/google_workspace_mcp
source venv/bin/activate
python -m workspace_mcp --test
```
### 3. Adicionar ao Claude
Editar `~/.claude/settings.json` com configuração acima.
### 4. Reiniciar Claude Code
```bash
claude --version
# Fechar e reabrir
```
### 5. Testar no /today
```bash
# Executar /today e verificar se Gmail/Calendar funcionam
```
---
## Funcionalidades Quando Activo
### Gmail
- `list_emails` - Listar emails
- `search_emails` - Pesquisar emails
- `get_email` - Ver email específico
- `send_email` - Enviar email
- `create_draft` - Criar rascunho
### Calendar
- `list_events` - Listar eventos
- `get_event` - Ver evento
- `create_event` - Criar evento
- `update_event` - Actualizar evento
- `delete_event` - Eliminar evento
---
## Alternativa: MCP Gmail Dedicado
Se preferir usar apenas Gmail (mais leve):
```
~/mcp-servers/mcp-gmail.tar.gz
```
Extrair e configurar separadamente.
---
**Última actualização**: 2025-01-21

View File

@@ -0,0 +1,466 @@
---
name: today
description: >
Checkup diário v7.5 - IMAP triaging, auto-despesas, Obsidian note, Supabase.
Triagem emails 12 contas IMAP + tickets CRM + despesas auto + nota diaria.
Use when "checkup", "hoje", "today", "rotina", início de dia.
author: Descomplicar® Crescimento Digital
version: 7.5.0
quality_score: 92
user_invocable: true
category: productivity
tags: [rotina, checkup, dashboard, crm, tickets, invoices, timer, monday, saturday, imap, email]
desk_task: 1416
desk_project: 65
allowed-tools: Read, Write, mcp__desk-crm-v3, mcp__mcp-time, mcp__google-workspace, mcp__imap, mcp__memory-supabase
mcps: desk-crm-v3, mcp-time, google-workspace, imap, memory-supabase
dependencies:
skills: [ticket, invoice, time, crm, wp-update, cleanup-downloads]
---
# /today v7.5 - Checkup Diário
Hub central que orquestra skills Desk + IMAP para visao completa do dia.
---
## Protocolo Principal
> **REGRA FUNDAMENTAL:** Fases 1-2 sao SILENCIOSAS e OBRIGATORIAS.
> Executar TUDO antes de mostrar qualquer output ao utilizador.
> O utilizador so ve o resumo final com as accoes ja tomadas.
```
FASE 1 - SILENCIOSA (executar tudo, sem output)
1. mcp__mcp-time__current_time → Verificar dia da semana
2. Verificar ultima execucao (memory-supabase: "today checkup YYYY-MM-DD")
3. AUTO-PROCESSAR despesas de tickets (ver seccao Auto-Process)
4. AUTO-FECHAR Tickets SPAM
5. IMAP Triagem - 12 contas (ver seccao IMAP abaixo)
6. Limpeza Downloads (via /cleanup-downloads) → SE >10 ficheiros
FASE 2 - RECOLHA (queries em paralelo, sem output)
7. Timer Activo
8. Tickets abertos (status 1,2,3)
9. Facturas Vencidas
10. Tarefas Prioritarias (urgentes + alta + vencidas)
11. Leads Novos (status 7, 14)
12. Propostas pendentes (status 4)
13. Agenda do Dia (Google Calendar)
FASE 3 - OUTPUT + PERSISTENCIA
14. Resumo do auto-processamento (despesas, SPAM, emails)
15. Notificacoes de sistema que requerem revisao manual
16. Dashboard (timer, tickets, facturas, tarefas, leads, agenda)
17. 3 Prioridades do dia
18. SE SEGUNDA → Planeamento semanal + /wp-update
19. SE SEXTA → Sugerir manutencao WordPress
20. SE SABADO → Consolidacao memorias
21. Criar nota Obsidian (Passo 9)
22. Guardar em Supabase (Passo 10)
```
---
## Secções do Checkup
### 1. Timer Activo
```
Verificar ~/.claude-work/active-timer.json
Se activo:
🟢 Timer: #1446 - Documentação (2h 15m)
⚠️ Se >4h: "Timer activo há muito tempo!"
```
### 2. Tickets Abertos
```
mcp__desk-crm-v3__get_tickets({ status: [1,2,3] })
## 🎫 Tickets (4)
🔴 #234 - Erro login (TechCorp) - 2h
🟠 #232 - Bug funcionalidade (StartupX) - 1d
🟢 #230 - Dúvida (ClienteY) - 2d
```
### 3. Facturas Vencidas
```
mcp__desk-crm-v3__overdue_invoices_report()
## 💰 Facturas Vencidas (2)
| # | Cliente | Valor | Dias |
|---|---------|-------|------|
| INV-040 | OldClient | €950 | 15 |
| INV-038 | SlowPay | €2.100 | 22 |
**Total:** €3.050
```
### 4. Tarefas Prioritárias
```
mcp__desk-crm-v3__get_tasks({ status: [1,4], priority: [3,4] })
## 📋 Tarefas Prioritárias (5)
🔴 Urgentes
| # | Tarefa | Projecto | Deadline |
|---|--------|----------|----------|
| #1450 | Implementar API | SFV-360 | Hoje |
🟠 Alta
| # | Tarefa | Projecto | Deadline |
|---|--------|----------|----------|
| #1448 | Documentação | Stack | Amanhã |
```
### 5. Agenda do Dia
```
mcp__google-workspace__get_events({
user_google_email: "emanuelalmeidaa@gmail.com",
time_min: "hoje 00:00",
time_max: "hoje 23:59"
})
## 📅 Agenda Hoje
- 10:00 - Reunião Cliente X
- 14:30 - Call Equipa
```
---
## IMAP Triagem (FASE 1 - Passo 5)
> **OBRIGATORIO:** Processar 12 contas IMAP silenciosamente.
> Ver regras detalhadas em `config/email-triage-rules.md`
### Contas IMAP (12)
```
emanuel, it, help, suporte, contabilidade, financeiro,
info, rh, mkt, design, news, aiktop
```
### Para cada conta: imap_list_emails(account, folder="INBOX", limit=50)
```
Classificar cada email por ordem de prioridade:
1. SPAM → imap_delete_email(account, uid)
- Subject: lottery, winner, urgent money, bitcoin investment
- Remetente: *.ru, *.cn (excepto conhecidos)
- Subject todo em MAIUSCULAS
2. PROMOCIONAL → imap_move_email(account, uid, "Promotions")
- Subject: newsletter, promo, desconto, oferta
- Remetente: *@marketing.*, *@news.*, *@promo.*
3. FACTURA/RECIBO → Registar para contabilidade
- Subject: factura, invoice, recibo, receipt, pagamento, paid
- Remetente de servico conhecido (ver mapeamento abaixo)
- Registar para reencaminhar para contabilidade@descomplicar.pt
4. PRIORITARIO → Incluir no relatorio
- Remetente: cliente conhecido (verificar DeskCRM)
- Subject: urgente, problema, erro, critical, down
- Threads activas (RE:, FW:)
```
### Resumo IMAP no output
```
📧 Emails Processados
- X spam eliminados
- Y promocionais arquivados
- Z facturas para contabilidade
- W emails prioritarios pendentes
```
### Excepcoes (NUNCA processar automaticamente)
```
- *@descomplicar.pt (internos)
- *@gov.pt, *@at.gov.pt, *@seg-social.pt (governo)
- *@tribunais.org.pt (tribunais)
```
---
## Rotinas Semanais
### Segunda-feira
```
1. Checkup normal (acima)
2. Planeamento semanal:
- Todas as tarefas com deadline esta semana
- Capacidade vs carga
- Distribuicao por dia
- Verificar estimativas de tempo (set_task_estimated_time se em falta)
3. Invocar /wp-update
```
### Sexta-feira
```
1. Checkup normal (acima)
2. Sugerir manutencao WordPress:
- Listar os 10 sites da rede
- Oferecer checkup de seguranca
```
### Sabado
```
1. Checkup normal (acima)
2. Consolidacao de memorias:
- Listar ~/.claude/projects/*/memory/MEMORY.md
- Extrair "Padroes Descobertos" e "Solucoes"
- Comentario na discussao #46 (Memorias)
- Backup em memory-supabase
```
---
## Persistencia (FASE 3 - Passos 21-22)
### Passo 21: Nota Obsidian
```
Path: /media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/00-Inbox/
Filename: YYYY-MM-DD-checkup.md
---
title: Checkup YYYY-MM-DD
date: YYYY-MM-DD
type: checkup
status: active
---
## Checkup Diario - YYYY-MM-DD
[Conteudo do relatorio com links CRM]
```
### Passo 22: Supabase
```
mcp__memory-supabase__save_memory:
- content: "Checkup diario - X tickets, Y tarefas, Z urgentes, W emails"
- tags: ["today", "checkup", "YYYY-MM-DD"]
- metadata: { tickets, tasks, urgent, emails_processed, is_monday }
```
---
## Output Final
```markdown
## Checkup Diario - 2026-02-06 (Quinta)
### Timer
#1446 - Documentacao (2h 15m)
### Emails (IMAP)
- Spam eliminado: 5
- Promocional arquivado: 3
- Facturas contabilidade: 2
- Prioritarios: 1
### Tickets
- Abertos: 4 (1 urgente)
### Facturas
- Vencidas: 3.050EUR
### Tarefas
- Urgentes: 1
- Alta prioridade: 4
### Leads + Propostas
- Leads novos: 2
- Propostas pendentes: 1
### Agenda
- 10:00 - Reuniao Cliente X
- 14:30 - Call Equipa
---
### 3 Prioridades Hoje
1. [ ] #1450 - Implementar API (Urgente)
2. [ ] Contactar OldClient (factura 15 dias)
3. [ ] #1448 - Documentacao Stack
```
---
## Auto-Process Tickets (FASE 1 - OBRIGATÓRIO)
> **EXECUTAR SILENCIOSAMENTE ANTES DE QUALQUER OUTPUT.**
> Nao perguntar, nao mostrar preview. Processar e reportar no resumo final.
### Passo 1: Recolher tickets abertos (status 1) de TODOS os departamentos
```
get_tickets({ status: 1, limit: 50 })
```
### Passo 2: Classificar cada ticket
Para cada ticket aberto, aplicar por ordem de prioridade:
```
1. NOTIFICAÇÃO SISTEMA? (verificar PRIMEIRO)
→ Subject contem padrao protegido E remetente conhecido
→ NAO fechar. Guardar para "Requer Accao" no resumo.
2. DESPESA? (verificar SEGUNDO)
→ Email do remetente contem padrao de fornecedor conhecido (ver mapeamento)
→ Processar como despesa (ver passos abaixo)
3. SPAM? (verificar TERCEIRO)
→ Subject contem padrao SPAM
→ Fechar (status 5) com motivo
4. NEWSLETTER/INFORMATIVO?
→ Newsletters, updates de produtos, notificacoes genericas
→ Fechar (status 5) com motivo
5. NENHUM MATCH → Manter aberto para revisao
```
### Passo 3: Processar Despesas
> **DADOS ESTAO NO HTML.** A maioria dos fornecedores (Anthropic, Canva, Elastic Email)
> envia os dados no corpo do email, NAO como PDF anexo.
> Extrair valor, referencia e data do HTML do ticket.
```
Para cada ticket identificado como despesa:
1. get_ticket(ticket_id) → ler HTML completo
2. Extrair do HTML: valor, invoice/reference number, data, descricao
3. Mapear email → categoria (tabela abaixo)
4. create_expense(category_id, amount, date, note, reference, currency=2, tax)
5. Fechar ticket (status 5) com "Despesa #ID criada"
6. SE existe ticket duplicado (mesmo subject) → fechar duplicado tambem
```
### Padroes SPAM (Fechar status 5)
```
Guest Post, SEO services, backlinks, partnership,
Purchase Order, WeTransfer, Prestige Awards
```
### Notificacoes de Sistema (NUNCA auto-fechar)
**Padroes protegidos (subject - case insensitive):**
```
Legal Update, Legal Notice, Policy Change, Policy Update,
Deprecation, End of Life, EOL, Breaking Change,
Migration Required, Action Required, Action Needed,
Security Alert, Security Advisory, Security Notice,
API Change, API Update, Terms Update, Terms Change,
Service Disruption, Maintenance Required,
Compliance, GDPR, Data Processing, Data Processor,
Infrastructure Change, Platform Update, Product Update
```
### Mapeamento Fornecedor → Categoria
> Verificar pelo **dominio do email** do remetente, nao pelo departamento.
> Tickets de fornecedores conhecidos podem estar em QUALQUER departamento.
| Padrao no Email | Categoria | ID | Tax |
|-----------------|-----------|-----|-----|
| anthropic | Servicos IA e APIs | 38 | 0 |
| openai | Servicos IA e APIs | 38 | 0 |
| hetzner | Alojamento de Servidores | 10 | 0 |
| meo, meoempresas | Telecomunicacoes | 1 | 1 |
| centos-webpanel, cwp | Licencas Software | 28 | 0 |
| elasticemail | E-mail MKT | 5 | 0 |
| freepik, envato, canva | Plugins e Recursos de Design | 9 | 0 |
| moloni | Software Facturacao | 11 | 1 |
| everhour | Softwares Gestao | 12 | 0 |
| ptisp, namecheap | Registo de Dominios | 13 | 0 |
| vimeo | Plataformas Armazenamento | 19 | 0 |
| payproglobal | Servicos IA e APIs (CapSolver) | 38 | 0 |
| bdthemes | Plugins e Recursos de Design | 9 | 0 |
| staples, multipapel | Material Escritorio | 15 | 1 |
### Tickets a Saltar (NAO criar despesa)
| Tipo | Indicador | Accao |
|------|-----------|-------|
| Payment Confirmation | "Payment Confirmation" de CWP/centos-webpanel | Fechar (confirmacao pagamento, nao fatura) |
| Payment Receipt | "Payment Was Successfully Processed" de elasticemail | Fechar (recibo pagamento recorrente sem dados de fatura) |
| Notificacao bancaria | "Notificação de transferência" de bancobpi | Fechar (notificacao, nao fatura) |
| Duplicado | reference_no ja existe no CRM | Fechar (ja processado) |
| Ticket duplicado | Mesmo subject que outro ticket ja processado | Fechar como duplicado |
> **NOTA:** Receipts de Anthropic e Canva contem invoice number e valor → SAO despesas.
> "Receipt" so e motivo para saltar quando e apenas confirmacao de pagamento sem dados de fatura.
### Campos Criticos
```
currency = 2 (EUR) → SEMPRE
tax = 1 → Fornecedores PT (MEO, Moloni, Staples)
tax = 0 → Fornecedores estrangeiros (Anthropic, Canva, Hetzner, etc.)
```
---
## Referência de Skills
| Secção | Skill | Comando |
|--------|-------|---------|
| Timer | /time | `/time` |
| Tickets | /ticket | `/ticket` |
| Facturas | /invoice | `/invoice overdue` |
| Tarefas/Leads | /crm | `/crm` |
| Downloads | /cleanup-downloads | SE >10 ficheiros |
| WordPress | /wp-update | Segundas |
---
## Anti-Patterns
- **NUNCA** executar checkup sem verificar data/hora
- **NUNCA** duplicar logica de outras skills
- **NUNCA** mostrar mais de 3 prioridades (PHDA)
- **NUNCA** mostrar resumo ANTES de processar despesas e SPAM
- **NUNCA** perguntar ao utilizador se deve processar despesas (e automatico)
- **NUNCA** assumir que so dept 3 tem tickets de contabilidade (verificar email do remetente)
- **NUNCA** saltar receipt que contem invoice number e valor (e despesa)
---
## Changelog
### v7.5.0 (2026-02-06)
- **IMAP TRIAGEM:** Protocolo completo para 12 contas IMAP (spam, promo, facturas, prioritarios)
- **NOTA OBSIDIAN:** Criar nota diaria em /media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/00-Inbox/
- **SUPABASE SAVE:** Guardar resumo checkup em memory-supabase com metricas
- **LEADS + PROPOSTAS:** Adicionar verificacao de leads novos e propostas pendentes na Fase 2
- **SEXTA-FEIRA:** Rotina de manutencao WordPress sugerida as sextas
- **VERIFICAR EXECUCAO:** Passo 2 verifica ultima execucao via memory-supabase
- **EXCEPCOES IMAP:** Dominos gov.pt, at.gov.pt, tribunais nunca processados automaticamente
- **BUG FIX:** Corrigido MCP IMAP (seq.fetch→fetch para operacoes UID-based)
### v7.4.0 (2026-02-06)
- Protocolo 3 fases, scan todos departamentos, HTML fonte dados, mapeamento expandido
### v7.3.0 (2026-02-05)
- Notificacoes de sistema protegidas
### v7.2.0 (2026-02-05)
- Auto-despesas contabilidade (dept 3)
### v7.1.0 (2026-02-05)
- Integracao com skills Desk
---
*Skill v7.5.0 | 2026-02-06 | Descomplicar®*

View File

@@ -0,0 +1,448 @@
# Regras de Triagem de Emails
## Contas IMAP (12)
```yaml
accounts:
- emanuel@descomplicar.pt
- it@descomplicar.pt
- help@descomplicar.pt
- suporte@descomplicar.pt
- contabilidade@descomplicar.pt
- financeiro@descomplicar.pt
- info@descomplicar.pt
- rh@descomplicar.pt
- mkt@descomplicar.pt
- design@descomplicar.pt
- news@descomplicar.pt
- aiktop@descomplicar.pt
```
---
## Regra 1: SPAM (Eliminar)
**Acção**: `imap_delete_email`
### Padrões Subject (case insensitive)
```
- lottery
- winner
- million dollars
- urgent money
- bitcoin investment
- crypto opportunity
- claim your prize
- act now
- limited time offer
- you have been selected
- dear beneficiary
- inheritance
- nigerian prince
```
### Padrões Remetente
```
- *@*.ru (excepto conhecidos)
- *@*.cn (excepto conhecidos)
- no-reply@spam*
- noreply@bulk*
```
### Indicadores técnicos
```
- SPF fail
- DKIM fail
- Muitos caracteres especiais no subject
- Subject todo em MAIÚSCULAS
```
---
## Regra 2: PROMOCIONAIS (Arquivar)
**Acção**: `imap_move_email` → pasta "Promotions"
### Padrões Subject
```
- newsletter
- promo
- promoção
- desconto
- oferta especial
- black friday
- cyber monday
- novidades
- new arrivals
- sale
- % off
- grátis
- free shipping
```
### Padrões Remetente
```
- *@marketing.*
- *@news.*
- *@promo.*
- *@newsletter.*
- *@campaigns.*
- *@mailchimp.com
- *@sendgrid.net
- *@mailgun.org
```
### Headers
```
- List-Unsubscribe presente
- Precedence: bulk
- X-Campaign-*
```
---
## Regra 3: FACTURAS PAGAS (Reencaminhar)
**Acção**: Registar para reencaminhar para `contabilidade@descomplicar.pt`
### Padrões Subject
```
- factura
- fatura
- invoice
- recibo
- receipt
- pagamento confirmado
- payment confirmed
- pago
- paid
- comprovativo
- ordem de pagamento
```
### Padrões Remetente (serviços conhecidos)
```
- *@hetzner.com
- *@ovh.com
- *@cloudflare.com
- *@github.com
- *@google.com
- *@microsoft.com
- *@adobe.com
- *@figma.com
- *@notion.so
- *@stripe.com
- *@paypal.com
- *@wise.com
- *@revolut.com
- *@n26.com
- *facturacao@*
- *billing@*
- *invoices@*
```
### Anexos
```
- *.pdf com "factura" no nome
- *.pdf com "invoice" no nome
- *.pdf com "recibo" no nome
```
---
## Regra 4: PRIORITÁRIOS (Listar)
**Acção**: Incluir no relatório diário para revisão manual
### Padrões Subject
```
- urgente
- urgent
- importante
- important
- problema
- problem
- erro
- error
- falha
- failure
- down
- offline
- crítico
- critical
```
### Remetentes prioritários
```
# Clientes activos (verificar DeskCRM)
# Parceiros importantes
# Serviços críticos:
- *@cloudflare.com (security alerts)
- *@hetzner.com (server alerts)
- *@github.com (security)
- *@google.com (security)
```
### Indicadores
```
- RE: ou FW: (threads activas)
- Múltiplos destinatários da empresa
- Marcado como importante pelo remetente
```
---
## Excepções (Nunca processar automaticamente)
```yaml
whitelist_senders:
- *@descomplicar.pt # Internos
- *@cliente-importante.pt # Clientes VIP
whitelist_domains:
- gov.pt # Governo
- tribunais.org.pt # Tribunais
- at.gov.pt # Autoridade Tributária
- seg-social.pt # Segurança Social
```
---
## Pastas IMAP Standard
| Pasta | Uso |
|-------|-----|
| INBOX | Emails por processar |
| Promotions | Emails promocionais arquivados |
| Processed | Emails processados pelo /today |
| Important | Emails marcados como prioritários |
| Trash | Eliminados |
---
## Métricas Diárias
Registar em cada execução:
```yaml
metrics:
date: YYYY-MM-DD
accounts_processed: 12
total_emails: X
spam_deleted: Y
promotions_archived: Z
invoices_forwarded: W
priority_flagged: V
processing_time: Xs
```
---
---
## Regras de Tickets (DeskCRM)
### Notificações de Sistema → NUNCA auto-fechar
> **REGRA PRIORITÁRIA:** Verificar ANTES dos padrões SPAM. Se um ticket corresponder a esta regra, não pode ser fechado automaticamente.
**Padrões protegidos (subject - case insensitive):**
```regex
Legal Update|Legal Notice|Policy Change|Policy Update|
Deprecation|End of Life|EOL|Breaking Change|
Migration Required|Action Required|Action Needed|
Security Alert|Security Advisory|Security Notice|
API Change|API Update|Terms Update|Terms Change|
Service Disruption|Maintenance Required|
Compliance|GDPR|Data Processing|Data Processor|
Infrastructure Change|Platform Update|transitions to
```
**Condição:** Remetente deve ser fornecedor conhecido (ver lista de remetentes conhecidos abaixo).
**Acção:**
```
→ NÃO fechar
→ Listar no relatório como: "⚠️ REQUER ACÇÃO: #{ID} - {Assunto}"
→ Manter aberto para análise e decisão manual
```
---
### Tickets SPAM → Fechar AUTOMATICAMENTE
> **IMPORTANTE:** Verificar PRIMEIRO se o ticket corresponde à regra de "Notificações de Sistema" acima. Se sim, NÃO fechar.
**Padrões de detecção (subject):**
```regex
Guest Post|SEO services|backlinks|partnership|
link building|dofollow|collaboration opportunity|
Boas Festas|Season's Greetings
```
> **NOTA:** "Action Required", "Termos de Serviço" e notificações legais foram removidos dos padrões SPAM. Podem indicar mudanças reais em serviços que usamos. São tratados pela regra de "Notificações de Sistema" acima.
**⚡ Acção AUTOMÁTICA - Executar SEM intervenção manual:**
```
close_ticket(ticket_id, message="Fechado automaticamente - SPAM detectado")
# Registar: "🗑️ SPAM fechado: #{ID} - {Assunto}"
```
> [!important] SPAM = FECHAR IMEDIATAMENTE
> Não perder tempo a analisar. Fechar automaticamente e seguir em frente.
---
### Tickets de PAGAMENTOS → Contabilidade + Fechar
**Departamentos DeskCRM:**
| ID | Nome | Email |
|----|------|-------|
| 1 | Comercial | info@descomplicar.pt |
| 2 | Suporte | suporte@descomplicar.pt |
| 3 | **Contabilidade** | contabilidade@descomplicar.pt |
| 4 | RH | rh@descomplicar.pt |
| 5 | Design | design@descomplicar.pt |
| 6 | Marketing | mkt@descomplicar.pt |
| 7 | Tecnologia | it@descomplicar.pt |
**Padrões de detecção (subject):**
```regex
payment|pagamento|pago|paid|
invoice|factura|fatura|recibo|
successfully.*(processed|completed)|
subscription.*(renewed|confirmed)|
order.*confirmed|receipt|
account.*funded|has been funded|
Envio de Fatura Eletrónica|
Invoice Payment Confirmation|
Customer Invoice
```
**Remetentes conhecidos (processar SEMPRE):**
```yaml
services:
# Hosting & Infra
- "*@elasticemail.com" # Elastic Email
- "*@hetzner.com" # Hetzner
- "*@hetzner.de"
- "*@centos-webpanel.com" # CWP
- "*@control-webpanel.com"
# Design & Tools
- "*@canva.com" # Canva
# Telecom PT
- "*@meo.pt" # MEO
- "*@altice.pt"
- "*@nos.pt" # NOS (futuro)
- "*@vodafone.pt" # Vodafone (futuro)
# Cloud & SaaS
- "*@cloudflare.com"
- "*@github.com"
- "*@google.com"
- "*@microsoft.com"
- "*@adobe.com"
- "*@figma.com"
- "*@notion.so"
- "*@openai.com"
- "*@email.openai.com"
- "*@anthropic.com"
- "*@openrouter.zendesk.com" # OpenRouter
# Pagamentos
- "*@stripe.com"
- "*@paypal.com"
- "*@wise.com"
- "*@revolut.com"
```
**Lógica de processamento:**
```
IF assunto contém padrão de pagamento/factura:
IF remetente IN remetentes_conhecidos:
→ Contabilidade + Fechar (AUTOMÁTICO)
ELSE:
→ Avaliar indicadores de spam/phishing
→ LISTAR para revisão manual com recomendação
```
**⚡ Acção AUTOMÁTICA para remetentes CONHECIDOS:**
```
# Executar AMBAS as acções automaticamente, SEM intervenção manual:
1. update_ticket(ticket_id, department=3) # Mover para Contabilidade
2. close_ticket(ticket_id, message="Fatura processada automaticamente - Contabilidade")
# Registar: "💰 Contabilidade + Fechado: #{ID} - {Assunto}"
```
**Acção para remetentes DESCONHECIDOS:**
```
1. Avaliar indicadores de spam (ver abaixo)
2. LISTAR no relatório com recomendação:
- [SPAM?] se indicadores presentes
- [NOVO?] se parece legítimo (possível novo serviço)
3. Aguardar decisão manual
```
### Indicadores de SPAM/PHISHING
**Alta probabilidade de SPAM:**
- Remetente pessoal (gmail, hotmail, yahoo) a enviar "facturas empresariais"
- Domínio suspeito (muitos números, hífens, extensões estranhas)
- Erros ortográficos no assunto ("facktura", "pagamanto")
- Assunto todo em MAIÚSCULAS
- Urgência exagerada ("ÚLTIMO AVISO", "URGENTE", "CONTA SUSPENSA")
- Sem número de factura/referência específico
- Remetente não corresponde à empresa alegada no assunto
**Provavelmente LEGÍTIMO (novo serviço):**
- Domínio empresarial consistente com o assunto
- Formato profissional (número de factura, data, referência)
- Sem urgência exagerada
- Padrão consistente com facturas reais
> [!info] NUNCA eliminar automaticamente remetentes desconhecidos
> Podem ser novos serviços subscritos. Sempre listar para revisão manual.
### Tickets para ELIMINAR (sem valor contabilístico)
**Padrões de assunto:**
```yaml
delete_patterns:
# Elastic Email - recargas
- "Your Elastic Email Account was successfully re-charged"
- "Account re-charged"
- "Auto-recharge successful"
- "Credit added to your account"
# FULL Services - activações
- "[BOT] Ativação realizada com sucesso"
- "[BOT] Activation successful"
```
**Acção:**
```
delete_ticket(ticket_id, confirm=true, reason="Notificação automática sem valor")
```
> Estas são notificações de recarga automática, não facturas. Não têm valor para contabilidade.
**Exemplos de assuntos detectados:**
- "Your Elastic Email Payment Was Successfully Processed"
- "Canva - Your invoice is ready"
- "Hetzner - Invoice for January 2025"
- "CentOS WebPanel Pro License Invoice"
- "MEO - Factura disponível"
- "Invoice #12345 - Payment Confirmed"
- "Pagamento confirmado - Factura #123"
- "Your OpenAI API account has been funded"
- "Your OpenRouter, Inc receipt [#1234-5678]"
- "Your receipt from OpenRouter, Inc #1234-5678"
- "Envio de Fatura Eletrónica: FT A/123456789"
- "Invoice Payment Confirmation"
- "Customer Invoice"
---
**Versão**: 1.1.0
**Última actualização**: 2025-01-21

View File

@@ -0,0 +1,405 @@
# /today - Checkup Diário
Executa o checkup diário completo seguindo estes passos:
## Passo 1: Verificar Última Execução
```
Usar mcp__memory-supabase__search_memories com query "today checkup YYYY-MM-DD"
Se já existe entrada de hoje → perguntar se quer executar novamente
```
## Passo 2: Recolher Dados do DeskCRM
### 2.1 Tickets
```
mcp__desk-crm-v3__get_tickets:
- date_from: ontem (YYYY-MM-DD)
- status: 1 (Aberto) ou 2 (Em Progresso)
- limit: 50
Identificar:
- Tickets urgentes (priority: 3 ou 4)
- Tickets de clientes importantes
```
### 2.2 Tickets SPAM → FECHAR AUTOMATICAMENTE
```
⚡ ACÇÃO AUTOMÁTICA - Fechar SEM intervenção manual
Padrões de SPAM:
- "Guest Post", "SEO services", "backlinks", "partnership"
- "link building", "dofollow", "collaboration opportunity"
- "Boas Festas", "Season's Greetings", "Termos de Serviço"
- Remetentes: noreply@*, no-reply@* (se não for serviço conhecido)
Se SPAM detectado → FECHAR IMEDIATAMENTE:
mcp__desk-crm-v3__close_ticket:
- ticket_id: {ID}
- message: "Fechado automaticamente - SPAM"
Registar no relatório: "🗑️ SPAM fechado: #{ID} - {Assunto}"
```
### 2.3 Tickets para ELIMINAR (notificações sem valor)
```
Verificar se assunto contém:
- "Your Elastic Email Account was successfully re-charged"
- "Account re-charged"
- "Auto-recharge successful"
- "Credit added to your account"
- "[BOT] Ativação realizada com sucesso"
- "[BOT] Activation successful"
Se SIM → Eliminar:
mcp__desk-crm-v3__delete_ticket:
- ticket_id: {ID}
- confirm: true
- reason: "Notificação automática sem valor contabilístico"
```
### 2.3 Processamento Automático: Tickets de PAGAMENTOS
```
Para cada ticket aberto, verificar se assunto contém:
- "payment", "pagamento", "pago", "paid"
- "invoice", "factura", "fatura", "recibo"
- "successfully processed", "confirmado"
- "subscription", "renewed", "renewal"
- "account funded", "has been funded"
- "Envio de Fatura Eletrónica"
Se SIM → Verificar remetente:
A) Remetente CONHECIDO (lista abaixo):
⚡ ACÇÃO AUTOMÁTICA - Executar SEM intervenção manual:
1. Mover para Contabilidade:
mcp__desk-crm-v3__update_ticket({ ticket_id: ID, department_id: 3 })
2. FECHAR o ticket:
mcp__desk-crm-v3__close_ticket({ ticket_id: ID, message: "Fatura processada - Contabilidade" })
3. Registar: "💰 Contabilidade + Fechado: #{ID} - {Assunto}"
B) Remetente DESCONHECIDO:
→ Avaliar indicadores de spam/phishing
→ LISTAR no relatório para revisão manual
Indicadores de SPAM:
- Remetente pessoal (gmail/hotmail) + factura empresarial
- Erros ortográficos, MAIÚSCULAS, urgência exagerada
- Domínio suspeito (muitos números, extensões estranhas)
- Sem número de factura/referência
Output no relatório:
- [SPAM?] #ID - Assunto - remetente@suspeito.com
- [NOVO?] #ID - Assunto - remetente@empresa.com (possível novo serviço)
```
> [!warning] NUNCA eliminar automaticamente remetentes desconhecidos
> Podem ser novos serviços. Sempre pedir confirmação manual.
**Remetentes CONHECIDOS (whitelist):**
```
Domínios confiáveis:
- @elasticemail.com
- @hetzner.com, @hetzner.de
- @centos-webpanel.com, @control-webpanel.com
- @canva.com
- @meo.pt, @altice.pt, @documentos.meoempresas.pt
- @cloudflare.com
- @github.com
- @google.com
- @microsoft.com
- @adobe.com
- @figma.com
- @notion.so
- @openai.com, @email.openai.com
- @anthropic.com
- @openrouter.zendesk.com
- @stripe.com
- @paypal.com
- @wise.com
- @revolut.com
- @bancobpi.pt
```
Ver lista completa de remetentes e indicadores: `config/email-triage-rules.md`
### 2.2 Projectos com Deadline
```
mcp__desk-crm-v3__get_projects:
- status: 2 (Em Progresso)
- Filtrar: deadline esta semana
```
### 2.3 Tarefas Pendentes (OBRIGATÓRIO - sempre incluir)
```
# Buscar TODAS as tarefas pendentes
mcp__desk-crm-v3__get_tasks({ status: 1, limit: 50 }) # Não iniciadas
mcp__desk-crm-v3__get_tasks({ status: 4, limit: 50 }) # Em curso
mcp__desk-crm-v3__get_tasks({ status: 2, limit: 50 }) # Aguarda feedback
mcp__desk-crm-v3__get_tasks({ overdue_only: true }) # Vencidas
# Organizar por:
# 1. Prioridade (4=Urgente, 3=Alta, 2=Normal, 1=Baixa)
# 2. Deadline (vencidas primeiro)
# 3. Projecto (agrupar)
# Formato output:
### 🔴 URGENTES (Prioridade 4)
| ID | Tarefa | Projecto | Deadline | Tempo Est. |
|----|--------|----------|----------|------------|
### 🟠 ALTA (Prioridade 3)
...
```
### 2.4 Verificar Estimativas de Tempo
```
Para cada tarefa importante, verificar se tem estimativa:
mcp__desk-crm-v3__get_task_time_estimates({ task_id: X })
Se não tem → sugerir definir:
mcp__desk-crm-v3__set_task_estimated_time({
task_id: X,
estimated_hours: Y,
estimated_minutes: Z,
notes: "Estimativa"
})
```
## Passo 3: Gestão de Emails (MCP IMAP)
### 3.1 Listar contas disponíveis
```
imap_list_accounts
# Verificar que todas as 12 contas estão acessíveis
```
### 3.2 Para CADA conta, processar emails
```
Contas: emanuel, it, help, suporte, contabilidade, financeiro,
info, rh, mkt, design, news, aiktop
Para cada conta:
1. imap_list_emails(account, folder="INBOX", limit=50)
2. Classificar cada email:
SPAM (eliminar):
- Subject contém: "lottery", "winner", "urgent money"
- Remetente em blacklist conhecida
- Caracteres estranhos no subject
→ imap_delete_email(account, uid)
PROMOCIONAL (arquivar):
- Subject contém: "newsletter", "promo", "desconto", "oferta"
- Remetente: *@marketing.*, *@news.*, *@promo.*
- Headers: List-Unsubscribe presente
→ imap_move_email(account, uid, "Promotions")
FACTURA PAGA (reencaminhar):
- Subject contém: "factura", "invoice", "recibo", "pagamento"
- Subject contém: "pago", "paid", "confirmado"
- Anexos PDF com padrão de factura
→ Registar para reencaminhar para contabilidade@descomplicar.pt
PRIORITÁRIO (listar):
- Remetente: cliente conhecido (verificar DeskCRM)
- Subject contém: "urgente", "urgent", "problema", "erro"
- Resposta a thread existente
→ Incluir no relatório diário
```
### 3.3 Resumo de acções
```
Contabilizar:
- X emails eliminados (spam)
- Y emails arquivados (promocionais)
- Z facturas para contabilidade
- W emails prioritários pendentes
```
## Passo 4: Calendário (opcional)
```
# Se MCP Google Calendar disponível:
# google_calendar_list_events(date=today)
# Por agora: Verificar agenda manualmente
```
## Passo 5: Gerar Relatório
Formatar output seguindo template:
```markdown
## 📅 Checkup Diário - YYYY-MM-DD (Dia da Semana)
### 🎫 Tickets (X abertos, Y urgentes)
[Lista de tickets urgentes com [!]]
[Lista de tickets abertos]
### 📧 Emails Prioritários
[Quando disponível]
### 📆 Agenda de Hoje
[Quando disponível]
### 🎯 Prioridades Sugeridas
1. [Baseado em urgência e deadlines]
2. [...]
3. [...]
### ⏰ Deadlines Esta Semana
[Lista de projectos/tarefas com deadline]
```
## Passo 6: SEGUNDA-FEIRA - Planeamento Semanal
```
Verificar dia da semana
Se SEGUNDA-FEIRA:
1. RECOLHER TAREFAS DA SEMANA INTEIRA
- Todas as tarefas pendentes (status 1, 2, 4)
- Todas as tarefas vencidas
- Filtrar: deadline até domingo
- Incluir estimativas de tempo
2. RECOLHER CALENDÁRIO DA SEMANA
mcp__google-workspace__get_events({
user_google_email: "emanuelalmeidaa@gmail.com",
time_min: "YYYY-MM-DD" (hoje),
time_max: "YYYY-MM-DD" (domingo),
max_results: 50
})
3. VERIFICAR ESTIMATIVAS DE TEMPO
Para tarefas sem estimativa:
- Sugerir tempo baseado no tipo
- PERGUNTAR ao utilizador se correcto
- Definir via set_task_estimated_time
4. PEDIR INDICAÇÕES AO UTILIZADOR
Usar AskUserQuestion:
- Disponibilidade semanal (horas)
- Horários preferidos para foco
- Prioridades especiais
- Compromissos pessoais
- Tarefas para delegar
5. DISTRIBUIR TAREFAS PELA AGENDA
- Calcular capacidade vs carga
- Distribuir por dia/horário
- Criar eventos no calendário (opcional)
- Alertar se capacidade excedida
6. OUTPUT: Planeamento Semanal
- Tabela por dia com tarefas
- Total horas por dia
- Alertas de capacidade
- Lista de delegações
```
## Passo 7: Manutenção WordPress (se Sexta-feira)
```
Verificar dia da semana
Se sexta-feira:
- Listar os 10 sites da rede
- Sugerir executar manutenção
- Oferecer checkup de segurança
```
## Passo 8: Resumo de Pendentes (do CRM)
```
📊 RESUMO - Mostrar no relatório
Os pendentes são obtidos directamente do Desk CRM (já recolhidos no Passo 2).
NÃO há documento PENDENTES separado - os dados ficam no relatório diário.
### CATEGORIZAÇÃO
Com base nos dados já recolhidos:
- 🔴 Urgentes: priority = 4
- 🟠 Alta Prioridade: priority = 3
- 🟡 Vencidas: overdue_only = true
- 🟢 Esta Semana: deadline dentro de 7 dias
- 🎫 Tickets: status 1, 2
- 👤 Leads: status 7, 14 (Novos)
- 📝 Propostas: status 4 (Para Fazer)
### FORMATO NO RELATÓRIO
| Categoria | Qtd |
|----|----:|
| 🔴 Urgentes | X |
| 🟠 Alta Prioridade | X |
| 🟡 Vencidas | X |
| 🎫 Tickets Abertos | X |
| 👤 Leads Novos | X |
### LINKS CRM
| Tipo | Formato Link |
|------|--------------|
| Tarefa | [#ID](https://desk.descomplicar.pt/admin/tasks/view/ID) |
| Ticket | [#ID](https://desk.descomplicar.pt/admin/tickets/ticket/ID) |
| Lead | [LID](https://desk.descomplicar.pt/admin/leads/index/ID) |
```
## Passo 9: Criar Nota Diária no Obsidian
```
Criar ficheiro no vault Planeamento:
- Path: /media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/00-Inbox/
- Filename: YYYY-MM-DD-checkup.md
- Content: Relatório com dados recolhidos
Template:
---
title: Checkup YYYY-MM-DD
date: YYYY-MM-DD
type: checkup
status: active
---
## Checkup Diário - YYYY-MM-DD
[Conteúdo do relatório]
⚡ LINKS CRM: Todas as tarefas com link directo
- Formato: [#ID](https://desk.descomplicar.pt/admin/tasks/view/ID)
Se segunda-feira:
- Incluir secção "Planeamento Semanal"
- Tabela com distribuição de tarefas por dia
```
## Passo 10: Guardar em Supabase
```
mcp__memory-supabase__save_memory:
- content: "Checkup diário executado - X tickets, Y tarefas, Z urgentes"
- tags: ["today", "checkup", "YYYY-MM-DD"]
- summary: "Checkup diário YYYY-MM-DD"
- metadata: {
tickets_count: X,
tasks_count: Y,
urgent_count: Z,
is_monday: true/false,
weekly_hours_planned: H
}
```
## Passo 11: Resumo Final
Apresentar:
- Métricas do dia
- Top 3 prioridades recomendadas
- Alertas importantes
- Próximos passos sugeridos
Se segunda-feira, adicionar:
- Resumo do planeamento semanal
- Capacidade vs carga
- Tarefas delegadas
- Alertas de sobrecarga

View File

@@ -0,0 +1,139 @@
---
title: "Checkup Diário - {{DATE}}"
date: {{DATE}}
type: daily
tags: [diario, checkup, {{WEEKDAY}}]
aliases: ["{{DATE}}"]
---
# 📅 {{DATE}} - {{WEEKDAY}}
## 🎫 Tickets
### Eliminados (notificações sem valor)
{{#DELETED_TICKETS}}
- 🗑️ #{{ID}} - {{SUBJECT}}
{{/DELETED_TICKETS}}
{{^DELETED_TICKETS}}
- Nenhum ticket eliminado
{{/DELETED_TICKETS}}
### Processados Automaticamente (Pagamentos → Contabilidade)
{{#PAYMENT_TICKETS}}
- [x] [[Ticket-{{ID}}|#{{ID}}]] - {{SUBJECT}} → **Fechado**
{{/PAYMENT_TICKETS}}
{{^PAYMENT_TICKETS}}
- Nenhum ticket de pagamento processado
{{/PAYMENT_TICKETS}}
### Urgentes
{{#URGENT_TICKETS}}
- [!] [[Ticket-{{ID}}|#{{ID}}]] - {{CLIENT}} - {{SUBJECT}}
{{/URGENT_TICKETS}}
{{^URGENT_TICKETS}}
- Nenhum ticket urgente
{{/URGENT_TICKETS}}
### Abertos (revisão manual)
{{#OPEN_TICKETS}}
- [ ] [[Ticket-{{ID}}|#{{ID}}]] - {{CLIENT}} - {{SUBJECT}}
{{/OPEN_TICKETS}}
{{^OPEN_TICKETS}}
- Nenhum ticket aberto
{{/OPEN_TICKETS}}
**Resumo**: {{TICKETS_COUNT}} tickets | {{PAYMENT_COUNT}} pagamentos fechados | {{URGENT_COUNT}} urgentes
---
## 📧 Emails (12 contas)
### Triagem Automática
| Acção | Quantidade |
|-------|------------|
| Spam eliminado | {{SPAM_DELETED}} |
| Promocionais arquivados | {{PROMOS_ARCHIVED}} |
| Facturas → Contabilidade | {{INVOICES_FORWARDED}} |
### Prioritários (revisão manual)
{{#PRIORITY_EMAILS}}
- [ ] **{{ACCOUNT}}**: {{SUBJECT}} - {{FROM}}
{{/PRIORITY_EMAILS}}
{{^PRIORITY_EMAILS}}
- Nenhum email prioritário pendente
{{/PRIORITY_EMAILS}}
### Contas verificadas
{{#ACCOUNTS_STATUS}}
- {{ACCOUNT}}: {{UNREAD}} não lidos
{{/ACCOUNTS_STATUS}}
---
## 📆 Agenda
{{#CALENDAR_EVENTS}}
- {{TIME}} - {{TITLE}}
{{/CALENDAR_EVENTS}}
{{^CALENDAR_EVENTS}}
- Sem compromissos agendados
{{/CALENDAR_EVENTS}}
---
## 🎯 Prioridades do Dia
> [!important] Top 3
> 1. {{PRIORITY_1}}
> 2. {{PRIORITY_2}}
> 3. {{PRIORITY_3}}
### Blocos de Foco Sugeridos
- [ ] 09:00-11:00 - Trabalho profundo
- [ ] 14:00-16:00 - Tarefas administrativas
- [ ] 16:00-17:00 - Comunicação/emails
---
## ⏰ Deadlines Esta Semana
{{#DEADLINES}}
- **{{DATE}}**: {{PROJECT}} - {{DESCRIPTION}}
{{/DEADLINES}}
{{^DEADLINES}}
- Sem deadlines esta semana
{{/DEADLINES}}
---
## 🔧 Manutenção (se Sexta-feira)
{{#IS_FRIDAY}}
### WordPress - Rede de Sites
- [ ] Verificar actualizações
- [ ] Executar actualizações
- [ ] Checkup segurança
- [ ] Testar funcionamento
**Sites**: descomplicar.pt, emanuelalmeida.pt, carstuff.pt, familyclinic.pt, espiralsenior.pt, ignitionvortex.pt, karateclubedegaia.com, solarfvengenharia.com, watercontrol.pt, hub.descomplicar.pt
{{/IS_FRIDAY}}
---
## 📝 Notas do Dia
> [!note] Observações
> (espaço para notas durante o dia)
---
## ✅ Revisão Final
- [ ] Tickets urgentes tratados
- [ ] Emails respondidos
- [ ] Prioridades concluídas
- [ ] Próximo dia planeado
---
*Gerado automaticamente por `/today` - {{TIMESTAMP}}*

View File

@@ -0,0 +1,338 @@
---
name: worklog
description: >
Registo de trabalho + reflexão unificado v4.0. Analisa sessão, regista trabalho, identifica padrões, sugere acções.
/reflect é alias (mesmo resultado). Variantes: /reflect deep (análise profunda), /reflect week (revisão semanal).
Auto-trigger >10 tool calls. Auto-alerts degradação >15%, error rate >10%.
Use when "worklog", "reflect", "reflexão", "registar trabalho", "log", "análise", "melhoria", "insight", ao parar timer.
author: Descomplicar® Crescimento Digital
version: 4.0.0
quality_score: 95
user_invocable: true
category: productivity
tags: [log, trabalho, reflexao, auto-melhoria, produtividade, time-tracking, memory, pdca, alerts]
desk_task: 1554
desk_project: 65
desk_discussion_logs: 31
desk_discussion_reflexoes: 32
desk_discussion_accoes: 33
allowed-tools: Read, Write, Bash, mcp__desk-crm-v3, mcp__mcp-time, mcp__memory-supabase, mcp__ssh-unified
mcps: desk-crm-v3, mcp-time, memory-supabase, ssh-unified
dependencies:
skills: [sdk, metrics]
mcps: [desk-crm-v3, memory-supabase]
auto_trigger:
enabled: true
threshold_tool_calls: 10
background: true
alerts:
- performance_degradation: 15
- error_rate: 10
- kb_offline: 3
---
# /worklog v4.0 - Registo de Trabalho + Reflexão
Skill unificada: regista trabalho, analisa sessão, sugere acções, guarda memória.
**`/reflect` = alias de `/worklog`** (mesmo resultado).
---
## Comandos
| Comando | Função |
|---------|--------|
| `/worklog` | Registo + reflexão da sessão |
| `/reflect` | Alias de `/worklog` |
| `/worklog view` | Ver últimos registos |
| `/reflect deep` | Análise profunda com histórico |
| `/reflect week` | Revisão semanal (segundas via /today) |
---
## Storage
| Tipo | Discussão | ID |
|------|-----------|-----|
| **Logs + Reflexões** | Logs | 31 |
| **Reflexões Profundas** | Reflexões | 32 |
| **Acções** | Acções de Melhoria | 33 |
**Projecto:** #65 (DES Stack Workflow) | **Staff:** 25 (AikTop)
---
## Protocolo Principal (/worklog e /reflect)
```
1. Obter hora via mcp__mcp-time__current_time
2. Verificar timer activo em ~/.claude-work/active-timer.json
3. ANALISAR sessão:
- Ficheiros modificados (Edit/Write calls)
- MCPs usados
- Erros e soluções
- Padrões detectados
- Eficiência (tool calls vs resultado)
4. VERIFICAR se há algo novo a documentar
- Se sessão vazia/sem dados → NÃO gerar
5. Gerar comentário HTML (ver formato abaixo)
6. mcp__desk-crm-v3__add_discussion_comment({
discussion_id: 31,
content: html,
staff_id: 25
})
7. SE acções sugeridas:
mcp__desk-crm-v3__add_discussion_comment({
discussion_id: 33,
content: accoes_html,
staff_id: 25
})
8. SE insight valioso → save_memory Supabase
9. Confirmar
```
**Output:**
```markdown
Worklog registado!
Tarefa: #1446 - Documentação Skills
Duração: 2h 15m
Discussão: #31 (Logs)
Acções: 2 sugeridas (#33)
Memória: Guardada / N/A
```
---
## Formato Comentário HTML (Discussão #31)
```html
<h4>YYYY-MM-DD HH:MM - Título da Sessão</h4>
<p><strong>Projecto:</strong> Nome</p>
<p><strong>Tarefa:</strong> #ID - Nome</p>
<p><strong>Duração:</strong> ~XXh YYm</p>
<p><strong>Resultado:</strong> Concluído | Parcial | Bloqueado</p>
<h4>Trabalho Realizado</h4>
<ul>
<li>Acção 1</li>
<li>Acção 2</li>
</ul>
<h4>Ficheiros Modificados</h4>
<ul>
<li><code>path/file.ext</code> - descrição</li>
</ul>
<h4>Problemas / Soluções</h4>
<ul>
<li><strong>Problema:</strong> Descrição
<br><strong>Solução:</strong> Como foi resolvido</li>
</ul>
<h4>Padrões Detectados</h4>
<ul>
<li>Padrão identificado e impacto</li>
</ul>
<h4>Acções Sugeridas</h4>
<p><em>Detalhes na discussão #33</em></p>
<ul>
<li>[Tipo] Descrição breve</li>
</ul>
<h4>Próximos Passos</h4>
<ol>
<li>Tarefa pendente 1</li>
</ol>
```
---
## Formato Acções (Discussão #33)
Cada acção num comentário separado:
```html
<p>- [ ] [Tipo] Descrição da acção</p>
<p><strong>Origem:</strong> Worklog YYYY-MM-DD HH:MM</p>
<p><strong>Prioridade:</strong> P1/P2/P3</p>
<p><strong>Contexto:</strong> Breve explicação</p>
```
**Tipos:** `[CLAUDE.md]`, `[Skill]`, `[MCP]`, `[Workflow]`, `[Bug]`, `[Feature]`
---
## /worklog view
```
1. mcp__desk-crm-v3__get_project_discussions({ project_id: 65 })
2. Filtrar discussão #31
3. Mostrar últimos 5 comentários
```
---
## /reflect deep (Análise Profunda)
Análise mais detalhada que o worklog normal. Publica em discussão **#32** (Reflexões).
```
1. Ler comentários recentes de #31 (worklogs) e #32 (reflexões)
2. Analisar padrões repetidos
3. Comparar eficiência com sessões anteriores
4. Verificar TaskForces utilizadas (ver Integração TaskForce)
5. Gerar comentário detalhado em #32
6. Acções em #33
7. Memória Supabase
```
---
## /reflect week (Revisão Semanal)
Chamado automaticamente pelo `/today` às segundas-feiras. Publica em **#32**.
```
1. Ler comentários de #31 e #32 da semana
2. Agregar padrões e métricas
3. Gerar resumo semanal
4. Identificar melhorias prioritárias
```
**Formato:**
```html
<h4>Semana YYYY-WNN - Revisão</h4>
<h4>Métricas</h4>
<table>
<tr><td>Sessões registadas</td><td>N</td></tr>
<tr><td>Reflexões geradas</td><td>M</td></tr>
<tr><td>Padrões detectados</td><td>P</td></tr>
</table>
<h4>Padrões Frequentes</h4>
<ol><li>Padrão A - Nx detectado</li></ol>
<h4>Melhorias Prioritárias</h4>
<ul>
<li>[ ] [P1] Descrição</li>
<li>[ ] [P2] Descrição</li>
</ul>
<h4>Plano Esta Semana</h4>
<ul>
<li>Implementar: X</li>
<li>Monitorar: Y</li>
</ul>
```
---
## Integração /time
Quando `/time stop` é executado:
```
1. Timer parado
2. Mostrar resumo (tarefa, duração)
3. Perguntar: "Criar worklog? [Sim/Não]"
4. Se sim → Gerar worklog com contexto do timer
```
---
## Auto-Save Memória
| Tipo | Exemplo | Guardar? |
|------|---------|----------|
| Solução técnica nova | Fix para erro MCP | Sim |
| Configuração sistema | Novo MCP configurado | Sim |
| Workaround descoberto | Bypass para bug | Sim |
| Padrão novo | "X funciona melhor que Y" | Sim |
| Decisão arquitectural | Escolha de abordagem | Sim |
| Trabalho rotineiro | Updates, limpeza | Não |
---
## Checklist de Reflexão
Perguntas ao analisar sessão:
- O sistema respondeu bem aos pedidos?
- Houve confusão ou mal-entendidos?
- Alguma tarefa repetitiva deveria ser skill?
- Faltou informação que deveria estar em memória?
- Alguma regra CLAUDE.md foi violada?
- Os MCPs funcionaram correctamente?
- Algum TaskForce foi utilizado? Registar métricas.
---
## Auto-Alerts Data-Driven
| Alerta | Threshold | Acção |
|--------|-----------|-------|
| Degradação performance | >15% vs baseline (7d) | Investigar causa |
| Error rate alto | >10% (30d) | Analisar erros |
| KB offline | 3 timeouts | Verificar MCP |
**Formato alerta:** Inclui componente, tipo, threshold, valor actual, investigação e acções sugeridas.
---
## Integração TaskForce (para /reflect deep)
```
1. LER ~/.claude/sdks/_registry.json
2. COMPARAR com skills/agents usados na sessão
3. SE match: adicionar secção "SDKs Utilizados" com tempo e baseline
```
---
## Auto-Trigger
| Trigger | Acção |
|---------|-------|
| >10 tool calls | Gerar worklog background |
| Parar timer | Oferecer criar worklog |
| Mudança de projecto | Fechar sessão anterior |
| Mesmo erro 2+ vezes | Analisar causa |
| Segunda-feira via /today | Revisão semanal |
---
## Anti-Patterns
- **NUNCA** criar worklog sem dados de sessão
- **NUNCA** usar Markdown em comentários (usar HTML)
- **NUNCA** guardar memória para trabalho rotineiro
- **NUNCA** duplicar reflexão e worklog (são o mesmo)
---
## Changelog
### v4.0.0 (2026-02-06)
- Fusão de /worklog e /reflect numa skill unificada
- /reflect torna-se alias de /worklog
- Discussão #31 recebe tudo (worklog + reflexão)
- Discussão #32 reservada para /reflect deep e /reflect week
- Checklist de reflexão integrado
- Auto-alerts data-driven integrados
- Integração TaskForce mantida para /reflect deep
### v3.0.0 (2026-02-05)
- Integração completa com /time
- Auto-trigger ao parar timer
- Formato HTML alinhado com Regra #27
---
*Skill v4.0.0 | 2026-02-06 | Descomplicar(R)*

View File

@@ -0,0 +1,41 @@
# Worklog Background Agent Prompt
Prompt optimizado para contexto mínimo (funciona com sonnet em background).
---
## Prompt Padrão (CURTO)
```
Gera worklog no Desk CRM (discussão Logs do projecto).
1. Identifica projecto via .desk-project ou usa #65 (Stack)
2. Usa mcp__desk-crm-v3__add_discussion_comment
3. Resume trabalho em 3-5 bullets
Formato: ## HH:MM - [Titulo] + bullets + ficheiros
```
---
## Invocação via Task Tool
```javascript
Task({
subagent_type: "general-purpose",
model: "sonnet", // IMPORTANTE: não usar haiku (limite contexto)
description: "Generate worklog entry",
run_in_background: true,
prompt: "Gera worklog no Desk CRM. Identifica projecto via .desk-project ou usa #65. Adiciona comentário na discussão Logs via mcp__desk-crm-v3__add_discussion_comment."
})
```
---
## Notas de Optimização
- **Usar sonnet** (não haiku) - haiku falha com "prompt too long" em sessões longas
- **Desk CRM** - adicionar comentário via mcp__desk-crm-v3__add_discussion_comment
- **Projecto default:** #65 (Stack Descomplicar)
- **Background** - sempre run_in_background=true
```