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>
13 KiB
13 KiB
name, description, author, version, quality_score, user_invocable, desk_task
| name | description | author | version | quality_score | user_invocable | desk_task |
|---|---|---|---|---|---|---|
| calendar-manager | 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". | Descomplicar® Crescimento Digital | 1.0.0 | 75 | true | 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
// 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
// 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
// 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
// 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
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
// 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
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
// 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
// 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
// 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
- Timezone: Sempre
Europe/Lisbon - Duração default: 1 hora
- Ambiguidade: Se não for claro, perguntar ao utilizador
- Conflitos: Avisar se houver sobreposição
- Feriados: Avisar se o evento calhar num feriado
MCP Tools
Referência Rápida
// 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
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
// 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]