feat(gestao): adiciona plugin gestao (agents, skills, knowledge e metadados do projeto)

This commit is contained in:
2026-10-28 16:08:53 +00:00
parent 7b2162ff29
commit de2d6f2fb5
91 changed files with 13525 additions and 0 deletions
+161
View File
@@ -0,0 +1,161 @@
---
name: calendar-manager
description: Gestao do Google Calendar e automacao de agendamento. Cria eventos, gere disponibilidade e sincroniza calendarios.
layer: wiki
---
# Calendar Manager
Gestao centralizada de multiplos calendarios Google com classificacao automatica de eventos.
## Calendarios Disponiveis
| Calendario | ID | Tipo | Uso |
|------------|----|----|-----|
| **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 autenticacao em todos os calendarios)
## Classificacao Automatica de Eventos
### 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`
- Planeamento, sprint, retrospectiva, standup
- Desenvolvimento, deploy, release
- Interno, equipa, staff
- Nomes de projectos (Stack Workflow, WiP, etc.)
- Review, code review, merge
- Formacao, workshop interno
### Eventos com CLIENTES -> `info@descomplicar.pt`
- Cliente, call, reuniao externa
- Nomes de empresas/clientes conhecidos
- Proposta, orcamento, apresentacao
- Kickoff, entrega, demo
## Clientes Conhecidos
| Cliente | Keywords |
|---------|----------|
| Carstuff | carstuff, cars |
| FamilyClinic | familyclinic, clinic, clinica |
| KCG | kcg, karate, gaia |
| Espiral Senior | esp, espiral, senior |
| Solar FV | solar, fotovoltaico |
| Water Control | water, agua |
| Ignition Vortex | ignition, vortex |
## Comandos e Interpretacao
### Criar Eventos
```
Input: "Agenda Dra Susana 14:30"
-> Calendario: Pessoal (Dra = medico)
-> Evento: Dra Susana, 14:30-15:30
Input: "Reuniao Carstuff 16h ate 19h"
-> Calendario: Clientes (Carstuff = cliente conhecido)
-> Evento: Carstuff, 16:00-19:00
Input: "Planeamento segunda 9h 4 horas"
-> Calendario: Profissional (planeamento = interno)
-> Evento: Planeamento, 09:00-13:00
```
### Listar Eventos
```
"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 as 15h?" -> verificar todos os calendarios
"Proximo slot livre de 2h" -> encontrar disponibilidade
```
## Workflow
O workflow completo de criacao e listagem de eventos esta detalhado em `references/workflows-detalhados.md`.
### Resumo do fluxo CRIAR
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
### Resumo do fluxo LISTAR
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:
```
[titulo]
[data] -- [hora inicio] - [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. **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 - Referencia Rapida
Referencia completa com constantes e exemplos em `references/mcp-tools-referencia.md`.
```javascript
// Listar calendarios
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: 'ALL',
time_min: '2026-02-04T00:00:00',
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'
@@ -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