Files
claude-plugins/gestao/skills/calendar-manager/SKILL.md
Emanuel Almeida 9404af7ac9 feat: sync all plugins, skills, agents updates
New plugins: core-tools
New skills: auto-expense, ticket-triage, design, security-check,
  aiktop-tasks, daily-digest, imap-triage, index-update, mindmap,
  notebooklm, proc-creator, tasks-overview, validate-component,
  perfex-module, report, calendar-manager
New agents: design-critic, design-generator, design-lead,
  design-prompt-architect, design-researcher, compliance-auditor,
  metabase-analyst, gitea-integration-specialist
Updated: all plugin configs, knowledge datasets, existing skills

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:16:32 +00:00

13 KiB
Raw Blame History

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

  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

// 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__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]