---
name: clientes-weekly
description: Agente de Weeklys de Clientes Binetz -- ejecuta automaticamente previa (antes de la reunion) y resumen post (despues de la reunion) para todos los clientes con weekly semanal, detectando inteligentemente que modo aplicar segun si la reunion ya paso o es futura
license: MIT
compatibility: opencode
metadata:
  audience: lucas-altube
  workflow: weekly-meetings
---

# Skill: Clientes Weekly — Binetz

## Para qué sirve

Automatiza los dos momentos clave de cada weekly de cliente:

- **Previa** (antes de la reunión): agenda sugerida + accionables pendientes de la semana anterior, marcando los ya cumplidos
- **Post** (después de la reunión): resumen de horas cargadas en OP, estado de tickets y accionables nuevos extraídos de la transcripción

Ambos mensajes se envían automáticamente al **chat de la reunión en Teams** del cliente.

## Modo inteligente: "ejecutar semana"

Cuando el usuario pide ejecutar las weeklys de la semana (sin especificar cliente ni modo), el agente:

1. Consulta el calendario M365 de la semana actual (lunes a domingo)
2. Por cada evento que matchee un `weekly_event_subject` configurado:
   - Si la reunión **ya pasó** → ejecuta modo **post** (`weekly.py config_X`)
   - Si la reunión **aún no ocurrió** → ejecuta modo **previa** (`weekly.py config_X --previa --yes`)
3. Reporta el resultado de cada ejecución

**REGLA OBLIGATORIA**: Al inicio de cada sesión, el agente debe revisar SIEMPRE el calendario de la semana en curso (lunes-domingo) y listar TODAS las weeklys de clientes detectadas, verificando cuáles tienen post/summary generado y cuáles no. No asumir que ya se procesaron — verificar cada una.

## Comando principal

```python
# El agente debe correr este script para detectar y ejecutar automáticamente
python3 "/Users/lucas/Documents/Master IA/Binetz General/Clientes Weekly/weekly_runner.py"
```

El script `weekly_runner.py`:
- Lee el calendario M365 de la semana actual
- Cruza los eventos con el mapa de clientes configurados
- Ejecuta `weekly.py` en el modo correcto para cada cliente
- Siempre usa `--yes` (no requiere TTY interactivo)

## Ejecución manual por cliente

```bash
PROJECT_DIR="/Users/lucas/Documents/Master IA/Binetz General/Clientes Weekly"

# Previa (antes de la weekly)
python3 "$PROJECT_DIR/weekly.py" config_<alias> --previa --yes

# Post (después de la weekly)
python3 "$PROJECT_DIR/weekly.py" config_<alias>

# O via run.sh
"$PROJECT_DIR/run.sh" <alias> --previa --yes
"$PROJECT_DIR/run.sh" <alias>
```

## Clientes configurados

| Alias  | Config                | Día       | Evento en Teams          | OP Parent ID |
|--------|-----------------------|-----------|--------------------------|--------------|
| ib     | config_interbarge.py  | Lunes     | IB - Weekly Interna      | 12           |
| cot    | config_coty.py        | Lunes     | COT - Weekly Interna     | 180          |
| jan    | config_janssen.py     | Lunes     | JAN - Weekly Interna     | 13           |
| jdt    | config_jdt.py         | Martes    | JDT - Weekly Interna     | 136          |
| cab    | config_cabral.py      | Martes    | CAB - Weekly Intena      | — (pendiente)|
| fra    | config_fra.py         | Miércoles | FRA - Weekly Interna     | —            |
| voy    | config_voy.py         | Miércoles | VOY - Weekly Interna     | 107          |
| rip    | config_rip.py         | Miércoles | RIP - Weekly Interna     | 124          |
| binid  | config_binid.py       | Miércoles | BIN - Weekly I+D         | —            |
| gf     | config_globalfarm.py  | Jueves    | GF - Weekly Interna      | 11           |

## Requisito crítico de permisos

El usuario que ejecuta el skill **debe estar invitado como participante en el evento de Teams de cada weekly**.

Graph API accede al chat de la reunión via el `joinUrl` del evento de calendario del usuario autenticado. Si el usuario no está en el evento, el evento no aparece en su calendario y el chat no es accesible → el script falla en pasos 3 y 7.

**Solución**: Lucas Altube (usuario del token M365) debe estar como attendee en todos los eventos de weekly de clientes.

## Prerequisitos

### Token Microsoft 365
```bash
# Verificar si el token está vigente
python3 -c "import json,time; t=json.load(open('/Users/lucas/.config/opencode/microsoft365_token.json')); print('OK' if t['expires_at']>time.time()+300 else 'VENCIDO')"

# Renovar si es necesario
bash ~/.config/opencode/skill/microsoft365/auth.sh --refresh
cp ~/Library/Application\ Support/opencode/microsoft365_token.json ~/.config/opencode/microsoft365_token.json
```

### Credenciales en Passbolt
- OpenProject API key: `24a94e26-dacc-46b4-bec7-8391d5bf8303`
- OpenAI API key: `b6e6e922-6713-45bb-a668-6ba4d52a08ba`

### Python
```bash
pip install requests
```

## Agregar un nuevo cliente

Cuando aparezca un evento de weekly nuevo en el calendario:

1. **Identificar** el prefijo del cliente (ej: `VOY`, `RIP`, `CAB`)
2. **Buscar en OP** los proyectos activos del cliente y el ID del proyecto raíz
3. **Buscar en Teams** el ID del team interno del cliente (`GET /me/joinedTeams`)
4. **Crear** `config_<alias>.py` copiando `config_globalfarm.py` y ajustando:
   - `name`, `prefix`
   - `op_parent_project_id` (o `None` si aún no hay proyectos en OP)
   - `op_subprojects` (solo los activos)
   - `teams_internal_team_id`
   - `weekly_event_subject` (subject exacto del evento en el calendario)
   - `weekly_attendees` (extraer del evento de calendario via Graph API)
5. **Agregar** el alias en `run.sh` (arrays `CONFIGS` y `ALL_ORDER`)
6. **Probar**: `python3 weekly.py config_<alias> --previa --yes`

## Troubleshooting

| Síntoma | Causa | Solución |
|---------|-------|----------|
| `[ERROR] No se pudo consultar el calendario: 401` | Token M365 vencido | Renovar token (ver arriba) |
| `[WARN] No se encontro el evento de la weekly` | Usuario no está en el evento / subject no matchea | Verificar asistencia al evento y `weekly_event_subject` en el config |
| `[WARN] No se pudo acceder al chat de la reunion: 403` | Sin permisos al chat | El usuario debe estar en el evento de Teams |
| `[ERROR] No se pudo obtener API key de OP` | Passbolt no disponible o sesión cerrada | Abrir Passbolt desktop y reautenticar |
| `[WARN] No se pudo consultar proyecto XXX: 400` | Proyecto archivado en OP | Moverlo a `op_archived_subprojects` en el config |
| `op_parent_project_id: None` | Cliente sin proyectos en OP aún | Dar de alta el proyecto en OP y actualizar el config |
