feat: refactor 30+ skills to Anthropic progressive disclosure pattern
- All SKILL.md files now <500 lines (avg reduction 69%) - Detailed content extracted to references/ subdirectories - Frontmatter standardised: only name + description (Anthropic standard) - New skills: brand-guidelines, spec-coauthor, report-templates, skill-creator - Design skills: anti-slop guidelines, premium-proposals reference - Removed non-standard frontmatter fields (triggers, version, author, category) Plugins affected: infraestrutura, marketing, dev-tools, crm-ops, gestao, core-tools, negocio, perfex-dev, wordpress, design-media Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,56 +1,46 @@
|
||||
---
|
||||
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
|
||||
description: Gestao do Google Calendar e automacao de agendamento. Cria eventos, gere disponibilidade e sincroniza calendarios.
|
||||
---
|
||||
|
||||
# Calendar Manager
|
||||
|
||||
Gestão centralizada de múltiplos calendários Google com classificação automática de eventos.
|
||||
Gestao centralizada de multiplos calendarios Google com classificacao automatica de eventos.
|
||||
|
||||
## Calendários Disponíveis
|
||||
## Calendarios Disponiveis
|
||||
|
||||
| Calendário | ID | Tipo | Uso |
|
||||
| Calendario | 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 |
|
||||
| **Emanuel Almeida - Pessoal** | `emanuelalmeidaa@gmail.com` | Pessoal | Compromissos pessoais, familia, saude, lazer |
|
||||
| **Emanuel Almeida - Descomplicar** | `emanuel@descomplicar.pt` | Profissional | Trabalho, reunioes internas, planeamento |
|
||||
| **Info Descomplicar** | `info@descomplicar.pt` | Profissional | Reunioes com clientes, calls externos |
|
||||
| **Feriados em Portugal** | `pt-pt.portuguese#holiday@group.v.calendar.google.com` | Referencia | Feriados nacionais |
|
||||
|
||||
**Conta Google**: `emanuelalmeidaa@gmail.com` (usada para autenticação em todos os calendários)
|
||||
**Conta Google**: `emanuelalmeidaa@gmail.com` (usada para autenticacao em todos os calendarios)
|
||||
|
||||
## Classificação Automática de Eventos
|
||||
## Classificacao Automatica 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 PESSOAIS -> `emanuelalmeidaa@gmail.com`
|
||||
- Nomes proprios sem contexto empresarial (Tomas, Susana, Maria, Dra., Dr.)
|
||||
- Medico, consulta, saude, dentista, fisioterapia, psicologo
|
||||
- Familia, filhos, escola, CNG, colegio
|
||||
- Ginasio, treino, corrida, desporto
|
||||
- Almoco/jantar pessoal, aniversario, festa
|
||||
- Casa, obras, condominio
|
||||
- Banco, financas pessoais, seguro
|
||||
|
||||
### Eventos PROFISSIONAIS → `emanuel@descomplicar.pt`
|
||||
Palavras-chave que indicam trabalho interno:
|
||||
### Eventos PROFISSIONAIS -> `emanuel@descomplicar.pt`
|
||||
- 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
|
||||
- Formacao, 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
|
||||
### Eventos com CLIENTES -> `info@descomplicar.pt`
|
||||
- Cliente, call, reuniao externa
|
||||
- Nomes de empresas/clientes conhecidos
|
||||
- Proposta, orcamento, apresentacao
|
||||
- Kickoff, entrega, demo
|
||||
|
||||
## Clientes Conhecidos
|
||||
@@ -58,470 +48,130 @@ Palavras-chave que indicam reunião externa:
|
||||
| Cliente | Keywords |
|
||||
|---------|----------|
|
||||
| Carstuff | carstuff, cars |
|
||||
| FamilyClinic | familyclinic, clinic, clínica |
|
||||
| FamilyClinic | familyclinic, clinic, clinica |
|
||||
| KCG | kcg, karate, gaia |
|
||||
| Espiral Senior | esp, espiral, senior |
|
||||
| Solar FV | solar, fotovoltaico |
|
||||
| Water Control | water, água |
|
||||
| Water Control | water, agua |
|
||||
| Ignition Vortex | ignition, vortex |
|
||||
|
||||
## Comandos e Interpretação
|
||||
## Comandos e Interpretacao
|
||||
|
||||
### Criar Eventos
|
||||
```
|
||||
Input: "Agenda Dra Susana 14:30"
|
||||
→ Calendário: Pessoal (Dra = médico)
|
||||
→ Evento: Dra Susana, 14:30-15:30
|
||||
-> Calendario: Pessoal (Dra = medico)
|
||||
-> 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: "Reuniao Carstuff 16h ate 19h"
|
||||
-> Calendario: 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
|
||||
-> Calendario: 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
|
||||
"Agenda de hoje" -> todos os calendarios, hoje
|
||||
"O que tenho amanha?" -> todos os calendarios, amanha
|
||||
"Agenda de trabalho" -> so profissional + clientes
|
||||
"Compromissos pessoais" -> so pessoal
|
||||
```
|
||||
|
||||
### Verificar Disponibilidade
|
||||
```
|
||||
"Estou livre às 15h?" → verificar todos os calendários
|
||||
"Próximo slot livre de 2h" → encontrar disponibilidade
|
||||
"Estou livre as 15h?" -> verificar todos os calendarios
|
||||
"Proximo slot livre de 2h" -> encontrar disponibilidade
|
||||
```
|
||||
|
||||
## Execução
|
||||
## Workflow
|
||||
|
||||
### Workflow CRIAR Eventos
|
||||
O workflow completo de criacao e listagem de eventos esta detalhado em `references/workflows-detalhados.md`.
|
||||
|
||||
#### Passo 1: Analisar Pedido
|
||||
### Resumo do fluxo CRIAR
|
||||
|
||||
```javascript
|
||||
// Input: "Agenda Dra Susana amanhã 14:30"
|
||||
1. **Analisar pedido** - extrair titulo, data, hora, duracao
|
||||
2. **Classificar tipo** - pessoal/profissional/clientes (baseado em keywords)
|
||||
3. **Extrair data/hora** - obter data actual via `mcp__mcp_time__current_time`, interpretar mencoes relativas
|
||||
4. **Verificar conflitos** - consultar todos os calendarios no horario pretendido
|
||||
5. **Criar evento** - via `mcp__google_workspace__create_event`
|
||||
6. **Confirmar** - mostrar resumo ao utilizador
|
||||
|
||||
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
|
||||
};
|
||||
```
|
||||
### Resumo do fluxo LISTAR
|
||||
|
||||
#### 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.';
|
||||
}
|
||||
```
|
||||
1. **Interpretar pedido** - periodo (hoje/amanha/semana) + ambito (todos/pessoal/profissional/clientes)
|
||||
2. **Determinar intervalo** - calcular time_min e time_max
|
||||
3. **Consultar calendarios** - buscar eventos em paralelo
|
||||
4. **Agrupar e formatar** - ordenar por hora, agrupar por tipo
|
||||
5. **Sugestoes** - avisar sobrecarga ou falta de pausas
|
||||
|
||||
## Formato de Resposta
|
||||
|
||||
### Criar:
|
||||
```
|
||||
✅ [TÍTULO]
|
||||
📅 [DATA] · [HORA INÍCIO] - [HORA FIM]
|
||||
📍 [TIPO: Pessoal/Profissional/Clientes]
|
||||
[titulo]
|
||||
[data] -- [hora inicio] - [hora fim]
|
||||
[tipo: Pessoal/Profissional/Clientes]
|
||||
```
|
||||
|
||||
### Listar:
|
||||
```
|
||||
📅 Agenda [DATA]
|
||||
Agenda [data]
|
||||
|
||||
🔵 PESSOAL
|
||||
· 14:30 Dra Susana (1h)
|
||||
PESSOAL
|
||||
-- 14:30 Dra Susana (1h)
|
||||
|
||||
🟠 PROFISSIONAL
|
||||
· 09:00 Planeamento Semanal (4h)
|
||||
PROFISSIONAL
|
||||
-- 09:00 Planeamento Semanal (4h)
|
||||
|
||||
🟢 CLIENTES
|
||||
· 16:00 Carstuff (3h)
|
||||
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
|
||||
2. **Duracao default**: 1 hora
|
||||
3. **Ambiguidade**: Se nao for claro, perguntar ao utilizador
|
||||
4. **Conflitos**: Avisar se houver sobreposicao
|
||||
5. **Feriados**: Avisar se o evento calhar num feriado
|
||||
|
||||
## MCP Tools
|
||||
## MCP Tools - Referencia Rapida
|
||||
|
||||
### Referência Rápida
|
||||
Referencia completa com constantes e exemplos em `references/mcp-tools-referencia.md`.
|
||||
|
||||
```javascript
|
||||
// Listar calendários disponíveis
|
||||
mcp__google-workspace__list_calendars({
|
||||
user_google_email: 'emanuelalmeidaa@gmail.com'
|
||||
});
|
||||
// Listar calendarios
|
||||
mcp__google_workspace__list_calendars({ user_google_email: 'emanuelalmeidaa@gmail.com' });
|
||||
|
||||
// Obter eventos
|
||||
mcp__google-workspace__get_events({
|
||||
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
|
||||
calendar_id: 'ALL',
|
||||
time_min: '2026-02-04T00:00:00',
|
||||
time_max: '2026-02-04T23:59:59'
|
||||
});
|
||||
|
||||
// Criar evento
|
||||
mcp__google-workspace__create_event({
|
||||
mcp__google_workspace__create_event({
|
||||
user_google_email: 'emanuelalmeidaa@gmail.com',
|
||||
calendar_id: 'emanuelalmeidaa@gmail.com',
|
||||
summary: 'Título do evento',
|
||||
summary: 'Titulo',
|
||||
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'
|
||||
timezone: 'Europe/Lisbon'
|
||||
});
|
||||
```
|
||||
|
||||
### Constantes Úteis
|
||||
## Quando NAO Usar
|
||||
|
||||
```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'
|
||||
};
|
||||
- Para tarefas fora do dominio de calendario/agendamento
|
||||
- Quando outra skill mais especifica esta disponivel
|
||||
- Para operacoes que requerem aprovacao manual obrigatoria
|
||||
|
||||
const TIMEZONE = 'Europe/Lisbon';
|
||||
const USER_EMAIL = 'emanuelalmeidaa@gmail.com';
|
||||
const DURACAO_DEFAULT = 60; // minutos
|
||||
```
|
||||
## References
|
||||
|
||||
---
|
||||
|
||||
## 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]
|
||||
```
|
||||
- **Workflows detalhados:** `references/workflows-detalhados.md`
|
||||
- **MCP tools e constantes:** `references/mcp-tools-referencia.md`
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
# Calendar Manager - Referencia MCP Tools
|
||||
|
||||
## Constantes
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
## Google Workspace MCP - Referencia Completa
|
||||
|
||||
### Listar calendarios disponiveis
|
||||
```javascript
|
||||
mcp__google_workspace__list_calendars({
|
||||
user_google_email: 'emanuelalmeidaa@gmail.com'
|
||||
});
|
||||
```
|
||||
|
||||
### Obter eventos
|
||||
```javascript
|
||||
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
|
||||
```javascript
|
||||
mcp__google_workspace__create_event({
|
||||
user_google_email: 'emanuelalmeidaa@gmail.com',
|
||||
calendar_id: 'emanuelalmeidaa@gmail.com',
|
||||
summary: 'Titulo do evento',
|
||||
start_time: '2026-02-04T14:30:00',
|
||||
end_time: '2026-02-04T15:30:00',
|
||||
timezone: 'Europe/Lisbon',
|
||||
description: 'Descricao opcional',
|
||||
location: 'Local opcional'
|
||||
});
|
||||
```
|
||||
|
||||
### Modificar evento
|
||||
```javascript
|
||||
mcp__google_workspace__modify_event({
|
||||
user_google_email: 'emanuelalmeidaa@gmail.com',
|
||||
calendar_id: 'emanuelalmeidaa@gmail.com',
|
||||
event_id: 'id_do_evento',
|
||||
summary: 'Novo titulo',
|
||||
start_time: 'nova_data'
|
||||
});
|
||||
```
|
||||
|
||||
### Eliminar evento
|
||||
```javascript
|
||||
mcp__google_workspace__delete_event({
|
||||
user_google_email: 'emanuelalmeidaa@gmail.com',
|
||||
calendar_id: 'emanuelalmeidaa@gmail.com',
|
||||
event_id: 'id_do_evento'
|
||||
});
|
||||
```
|
||||
|
||||
## Checklist de Criacao
|
||||
|
||||
Antes de criar evento, verificar:
|
||||
|
||||
- Calendario correcto identificado (pessoal/profissional/clientes)
|
||||
- Data valida (nao no passado, salvo excepcoes)
|
||||
- Hora valida (formato HH:MM ou HH:MM-HH:MM)
|
||||
- Duracao razoavel (<12h, excepto dias completos)
|
||||
- Sem conflitos (ou utilizador confirmou)
|
||||
- Timezone correcto (Europe/Lisbon)
|
||||
- Titulo descritivo
|
||||
@@ -0,0 +1,181 @@
|
||||
# Calendar Manager - Workflows Detalhados
|
||||
|
||||
## Workflow CRIAR Eventos
|
||||
|
||||
### Passo 1: Analisar Pedido
|
||||
|
||||
```javascript
|
||||
// Input: "Agenda Dra Susana amanha 14:30"
|
||||
|
||||
const analise = {
|
||||
texto: "Agenda Dra Susana amanha 14:30",
|
||||
palavras_chave: ["dra", "susana"],
|
||||
data_mencionada: "amanha",
|
||||
hora_mencionada: "14:30",
|
||||
duracao_mencionada: null // default 1h
|
||||
};
|
||||
```
|
||||
|
||||
### Passo 2: Classificar Tipo
|
||||
|
||||
```javascript
|
||||
// Detectar palavras-chave e determinar calendario
|
||||
function classificarEvento(texto) {
|
||||
const keywords_pessoal = /dra?|dentista|medico|familia|ginasio|consulta/i;
|
||||
const keywords_cliente = /carstuff|familyclinic|kcg|espiral|solar|reuniao|call/i;
|
||||
const keywords_profissional = /planeamento|sprint|deploy|interno|equipa/i;
|
||||
|
||||
if (keywords_pessoal.test(texto)) {
|
||||
return {
|
||||
tipo: 'pessoal',
|
||||
calendar_id: 'emanuelalmeidaa@gmail.com'
|
||||
};
|
||||
}
|
||||
|
||||
if (keywords_cliente.test(texto)) {
|
||||
return {
|
||||
tipo: 'clientes',
|
||||
calendar_id: 'info@descomplicar.pt'
|
||||
};
|
||||
}
|
||||
|
||||
if (keywords_profissional.test(texto)) {
|
||||
return {
|
||||
tipo: 'profissional',
|
||||
calendar_id: 'emanuel@descomplicar.pt'
|
||||
};
|
||||
}
|
||||
|
||||
// Se ambiguo, 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,
|
||||
'amanha': addDays(hoje, 1),
|
||||
'segunda': nextWeekday(hoje, 1),
|
||||
'terca': nextWeekday(hoje, 2),
|
||||
// etc.
|
||||
};
|
||||
|
||||
return mapa[mencao.toLowerCase()] || parseDate(mencao);
|
||||
}
|
||||
|
||||
// Criar timestamps ISO 8601
|
||||
const data = interpretarData('amanha', 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 horario
|
||||
const eventos_conflito = await mcp__google_workspace__get_events({
|
||||
user_google_email: 'emanuelalmeidaa@gmail.com',
|
||||
calendar_id: 'ALL',
|
||||
time_min: start_time,
|
||||
time_max: end_time
|
||||
});
|
||||
|
||||
if (eventos_conflito.length > 0) {
|
||||
// Avisar utilizador sobre conflito
|
||||
}
|
||||
```
|
||||
|
||||
### 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'
|
||||
});
|
||||
```
|
||||
|
||||
## Workflow LISTAR Eventos
|
||||
|
||||
### Passo 1: Interpretar Pedido
|
||||
|
||||
```javascript
|
||||
// Input: "Agenda de amanha"
|
||||
const pedido = {
|
||||
periodo: 'amanha', // hoje, amanha, semana, mes, data especifica
|
||||
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`
|
||||
},
|
||||
'amanha': {
|
||||
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 Calendarios
|
||||
|
||||
```javascript
|
||||
// Determinar calendarios a consultar baseado no ambito
|
||||
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)
|
||||
};
|
||||
```
|
||||
|
||||
### Passo 5: Sugestoes Inteligentes
|
||||
|
||||
- Se ha muitas reunioes seguidas: avisar sobrecarga
|
||||
- Se nao ha breaks: sugerir pausas de 15min entre reunioes
|
||||
Reference in New Issue
Block a user