---
name: shopify-acceso-rastreadores-ia
description: "Edita el robots.txt.liquid del tema para permitir de forma explícita a los rastreadores de IA (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, OAI-SearchBot, Amazonbot) y que los asistentes puedan leer tu catálogo. Úsala cuando quieras que la IA encuentre tu tienda."
---

## Propósito
Si tu `robots.txt` no menciona por nombre a los rastreadores de IA, o peor, los bloquea, asistentes como ChatGPT, Claude y Perplexity quizás nunca lean tu tienda: para los compradores que usan IA, sencillamente no existes. Shopify genera el `robots.txt` a partir de una plantilla del tema (`templates/robots.txt.liquid`). Esta skill lee esa plantilla y le agrega reglas explícitas de permiso para los principales agentes de usuario de IA (dentro de un bloque gestionado, claro e idempotente), de modo que los modelos fundacionales y los buscadores con IA tengan permiso para rastrear tus páginas. Corrige el problema de un `robots.txt` sin reglas para los rastreadores de IA.

## Requisitos
- Sesión autenticada de Shopify CLI: `shopify store auth --store <tu-tienda>.myshopify.com --scopes read_themes,write_themes`
- Las consultas se ejecutan con `shopify store execute`.
- Permisos (scopes) de API necesarios: `read_themes`, `write_themes`

## Parámetros
Todas las skills aceptan estos parámetros generales:

| Parámetro | Tipo   | Obligatorio | Predeterminado | Descripción |
|-----------|--------|-------------|----------------|-------------|
| store     | string | sí          | —              | Dominio de la tienda (p. ej., mitienda.myshopify.com) |
| format    | string | no          | human          | Formato de salida: `human` (predeterminado) o `json` |
| dry_run   | bool   | no          | true           | Muestra el nuevo robots.txt.liquid sin escribirlo (activado por defecto, porque edita el tema publicado) |

Parámetros propios de esta skill:

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|-------------|----------------|-------------|
| theme_id | string | no | — | GID del tema que se edita (por defecto, el tema MAIN publicado) |
| agents | string | no | GPTBot,OAI-SearchBot,ChatGPT-User,ClaudeBot,Claude-Web,PerplexityBot,Perplexity-User,Google-Extended,Amazonbot,Applebot-Extended | Lista separada por comas de los agentes de usuario de IA que se permiten |
| mode | string | no | allow | `allow` (agrega reglas Allow) o `audit` (solo reporta el estado actual, sin escribir) |

## Seguridad

> ⚠️ El paso 3 (`themeFilesUpsert`) modifica un archivo del tema PUBLICADO. Un `robots.txt.liquid` mal formado puede sacar la tienda del índice de TODOS los buscadores. Esta skill solo escribe dentro de un bloque gestionado claramente delimitado, `# BEGIN acceso-rastreadores-ia … # END` (al volver a ejecutarla reemplaza solo ese bloque y nunca toca tus otras reglas), usa `dry_run: true` por defecto y recomienda duplicar el tema antes. Revisa el archivo propuesto completo antes de poner `dry_run: false`.

## Pasos

1. **OPERACIÓN:** `themes` — consulta
   **Entradas:** `roles: [MAIN]` (a menos que se indique `theme_id`), luego `theme.files(filenames: ["templates/robots.txt.liquid"])`
   **Resultado esperado:** El contenido actual de `robots.txt.liquid` (o su ausencia: si la plantilla no existe, Shopify usa una predeterminada).

2. **CÁLCULO (sin API):** arma la nueva plantilla. Si no hay una plantilla personalizada, parte de la predeterminada de Shopify (`{{ robots.default_groups }}`) y agrega el bloque gestionado con las líneas `User-agent:`/`Allow: /` para cada agente de `agents`. Si ya existe un bloque gestionado, reemplaza solo ese bloque. Muestra el diff completo del archivo propuesto.

3. **OPERACIÓN:** `themeFilesUpsert` — mutación
   **Entradas:** `themeId`, `files: [{ filename: "templates/robots.txt.liquid", body: { type: TEXT, value: <nuevo contenido> } }]` (se omite con `dry_run` o con `mode: audit`).
   **Resultado esperado:** Archivo del tema creado o actualizado; recoge los `userErrors`.

## Operaciones GraphQL

```graphql
# themes:query — validada con api_version 2025-01
query CrawlerThemeFile {
  themes(first: 1, roles: [MAIN]) {
    nodes {
      id
      name
      files(filenames: ["templates/robots.txt.liquid"]) {
        nodes {
          filename
          body { ... on OnlineStoreThemeFileBodyText { content } }
        }
      }
    }
  }
}
```

```graphql
# themeFilesUpsert:mutation — validada con api_version 2025-01
mutation CrawlerAllowUpsert($themeId: ID!, $files: [OnlineStoreThemeFilesUpsertFileInput!]!) {
  themeFilesUpsert(themeId: $themeId, files: $files) {
    upsertedThemeFiles { filename }
    userErrors { filename code message }
  }
}
```

Bloque gestionado que se escribe en `templates/robots.txt.liquid` (después de `{{ robots.default_groups }}`):

```liquid
# BEGIN acceso-rastreadores-ia (gestionado por shopify-acceso-rastreadores-ia)
User-agent: GPTBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Google-Extended
Allow: /
# ... una entrada por cada agente de `agents`
# END acceso-rastreadores-ia
```

## Seguimiento de la sesión

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

**Al iniciar**, muestra:
```
╔══════════════════════════════════════════════╗
║  SKILL: <nombre de la skill>                 ║
║  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>
```

Si `dry_run: true`, antepón `[SIMULACIÓN]` a cada paso de mutación y no lo ejecutes.

**Al terminar**, muestra:

Para `format: human` (predeterminado):
```
══════════════════════════════════════════════
RESUMEN DEL RESULTADO
  <Métrica>:        <valor>
  Errores:          0
  Archivo:          <nombre del archivo o "ninguno">
══════════════════════════════════════════════
```

Para `format: json`, muestra:
```json
{
  "skill": "<slug-de-la-skill>",
  "store": "<dominio>",
  "started_at": "<ISO8601>",
  "completed_at": "<ISO8601>",
  "dry_run": false,
  "steps": [
    {
      "step": 1,
      "operation": "<OperationName>",
      "type": "query",
      "params_summary": "<texto>",
      "result_summary": "<texto>",
      "skipped": false
    }
  ],
  "outcome": {
    "metric_key": 0,
    "errors": 0,
    "output_file": null
  }
}
```

## Formato de salida
`human`: el `robots.txt.liquid` antes y después, y la lista de agentes que ahora tienen permiso. `json`: `{ theme_id, agents_allowed:[...], wrote: true|false, errors }`.

## Manejo de errores
| Error | Causa | Solución |
|-------|-------|----------|
| `THROTTLED` | Límite de solicitudes de la API | Espera 2 s y reintenta hasta 3 veces |
| `ACCESS_DENIED` | Falta el permiso `write_themes` | Detente con un mensaje claro sobre el permiso; no escribas nada a medias |
| `userErrors` al guardar | Contenido de plantilla inválido | No escribas; muestra el error de Liquid para revisarlo |

## Buenas prácticas
- **Duplica el tema publicado antes de escribir** (Tienda online → Temas → Duplicar) para poder revertir al instante.
- Mantén `dry_run: true` hasta leer el archivo propuesto completo: un `robots.txt.liquid` dañado puede sacar toda la tienda del índice.
- Usa los marcadores del bloque gestionado y nunca combines a mano: así, al volver a ejecutar la skill, se actualiza limpiamente solo su propio bloque.
- Permitir los rastreadores de IA no es regalar tu contenido: es darles permiso para leer las páginas públicas, igual que hace Googlebot. Combínala con `shopify-llms-txt` para que los rastreadores también reciban un resumen guiado.
