--- 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__notebooklm__notebook_query, 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] ```