---
name: shopify-auditoria-cuentas-equipo
description: "Solo lectura: revisa las cuentas del equipo para encontrar accesos sin usar, cuentas inactivas y roles con demasiados permisos, y así detectar problemas de seguridad y de orden en los accesos. Úsala cuando quieras hacer una revisión periódica de quién tiene acceso a tu tienda."
---

## Propósito
Revisa todas las cuentas del equipo de la tienda para mostrar riesgos de seguridad y de orden en los accesos. Marca las cuentas que no han iniciado sesión en más de `stale_days` días, las cuentas inactivas que siguen habilitadas y las cuentas con permisos completos o equivalentes a los del propietario de la tienda. Solo lectura: no hace cambios. Entrega la base de datos para una revisión de accesos posterior o para un proceso de dar de baja cuentas.

## Requisitos
- Sesión autenticada de Shopify CLI: `shopify store auth --store <tu-tienda>.myshopify.com --scopes read_users`
- Las consultas se ejecutan con `shopify store execute`.
- Permisos (scopes) de API: `read_users`
- Quien la ejecute debe ser el propietario de la tienda o tener permisos de gestión del equipo para consultar los datos del personal

## Parámetros

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|-------------|----------------|-------------|
| store | string | sí | — | Dominio de la tienda (p. ej., mitienda.myshopify.com) |
| stale_days | integer | no | 90 | Marca las cuentas sin inicio de sesión en esta cantidad de días |
| include_inactive | bool | no | true | Incluye en la auditoría las cuentas con `active: false` |
| include_owner | bool | no | false | Incluye la fila del propietario de la tienda en el conteo de cuentas marcadas |
| format | string | no | human | Formato de salida: `human` o `json` |

## Seguridad

> ℹ️ Skill de solo lectura: no ejecuta mutaciones. Puedes correrla en cualquier momento sin riesgo. Esta skill no desactiva ni modifica ninguna cuenta del equipo.

## Pasos

1. **OPERACIÓN:** `staffMembers` — consulta
   **Entradas:** `first: 250`, selecciona `id`, `name`, `email`, `active`, `isShopOwner`, `accountType`, `locale`, `lastSeen` y el cursor de paginación
   **Resultado esperado:** Todos los miembros del equipo con su estado y su último inicio de sesión; pagina hasta que `hasNextPage: false`

2. Calcula `days_since_last_seen` para cada miembro. Marca como **sin uso** a cualquier miembro con `days_since_last_seen > stale_days`.

3. Marca a cualquier miembro con `active: false` (o `accountType: SUSPENDED`) como **inactivo pero habilitado**.

4. Marca a cualquier miembro con `isShopOwner: true`, o con `accountType: COLLABORATOR` y permisos completos, como **privilegio alto** para revisarlo.

5. Cruza los resultados: arma un registro por cuenta con todas sus marcas juntas (`stale`, `inactive`, `high_privilege`).

## Operaciones GraphQL

```graphql
# staffMembers:query — validada con api_version 2025-01
query StaffAccountAudit($after: String) {
  staffMembers(first: 250, after: $after) {
    edges {
      node {
        id
        name
        email
        active
        isShopOwner
        accountType
        locale
        exists
        phone
        avatar {
          url
        }
        privateData {
          accountSettingsUrl
          createdAt
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

## Seguimiento de la sesión

**Claude DEBE mostrar lo siguiente en cada etapa. Es obligatorio.**

**Al iniciar**, muestra:
```
╔══════════════════════════════════════════════╗
║  SKILL: shopify-auditoria-cuentas-equipo     ║
║  Tienda: <dominio de la tienda>              ║
║  Inicio: <AAAA-MM-DD HH:MM UTC>              ║
╚══════════════════════════════════════════════╝
```

**Después de cada paso**, muestra:
```
[N/TOTAL] <CONSULTA|MUTACIÓN>  <OperationName>
          → Parámetros: <resumen breve de las entradas clave>
          → Resultado: <cantidad o desenlace>
```

**Al terminar**, muestra:

Para `format: human` (predeterminado):
```
══════════════════════════════════════════════
AUDITORÍA DE CUENTAS DEL EQUIPO  (límite sin uso: <stale_days> días)
  Total de cuentas del equipo:    <n>
  Activas:                        <n>
  Inactivas (habilitadas):        <n>
  Sin inicio de sesión (>N d):    <n>  (<pct>%)
  Roles con privilegio alto:      <n>

  Cuentas marcadas (de mayor a menor riesgo):
    "<nombre>" <email>  último acceso: <hace N d>  marcas: <stale,high_priv>
  Archivo: staff_audit_<fecha>.csv
══════════════════════════════════════════════
```

Para `format: json`, muestra:
```json
{
  "skill": "shopify-auditoria-cuentas-equipo",
  "store": "<dominio>",
  "stale_days_threshold": 90,
  "total_accounts": 0,
  "active_accounts": 0,
  "inactive_accounts": 0,
  "stale_accounts": 0,
  "high_privilege_accounts": 0,
  "output_file": "staff_audit_<fecha>.csv"
}
```

## Formato de salida
Archivo CSV `staff_audit_<AAAA-MM-DD>.csv` con las columnas:
`staff_id`, `name`, `email`, `account_type`, `is_shop_owner`, `active`, `last_seen`, `days_since_last_seen`, `is_stale`, `is_inactive`, `is_high_privilege`, `flags`

## Manejo de errores
| Error | Causa | Solución |
|-------|-------|----------|
| `THROTTLED` | Se superó el límite de solicitudes de la API | Espera 2 segundos y reintenta hasta 3 veces |
| `ACCESS_DENIED` en `staffMembers` | Quien ejecuta no tiene `read_users` ni permisos de gestión del equipo | Vuelve a autenticarte como propietario de la tienda o administrador del equipo |
| `lastSeen: null` en un miembro del equipo | La cuenta nunca ha iniciado sesión | Usa `days_since_last_seen = days_since_account_created`; márcala como sin uso |
| Lista del equipo vacía | Tienda manejada por una sola persona (solo el propietario) | Termina con 1 fila (el propietario); la skill sigue siendo útil para llevar el registro |

## Buenas prácticas
- Ejecútala cada trimestre (cada 90 días) como parte de la revisión rutinaria de accesos. Úsala junto con la lista de pasos para la salida de empleados: a toda persona que ya no trabaja contigo hay que revocarle el acceso, no solo desactivarlo.
- Usa `stale_days: 30` en tiendas de alto riesgo (mucho volumen, equipo grande) y `stale_days: 180` en equipos muy pequeños, donde es normal tener accesos por temporada.
- Ordena el CSV por `days_since_last_seen` de mayor a menor para revisar primero las cuentas que llevan más tiempo sin uso.
- Las cuentas con privilegio alto (propietario de la tienda, colaboradores con permisos completos) deben tener contraseñas únicas y seguras y verificación en dos pasos: trata cualquier cuenta de privilegio alto sin uso como un tema de revisión urgente.
- Pasa el CSV a tu registro de revisión de accesos; no desactives cuentas a ciegas: confírmalo primero con el jefe de la persona dueña de la cuenta.
- Antes de dar de baja una cuenta marcada como sin uso, cruza la información con los eventos recientes del registro de actividad asociados a ese `staffMember` para asegurarte de que no tenga trabajo en curso.
