# Instrucciones para el agente: Emulate: prueba integraciones contra servicios locales con estado

Pega este texto a tu agente (Claude Code, Codex, OpenCode, Hermes o el que uses) y dile «ayúdame a montarlo». Son los pasos para ponerlo en marcha; el porqué de cada pieza está en la guía completa.

- Dificultad: intermedio
- Proyecto: https://github.com/vercel-labs/emulate (licencia Apache-2.0)
- Guía completa: https://lab.wisd.ai/hub/emulate-local-api-sandbox

---

## Para el agente: cómo acompañar al usuario

1. Pregunta primero para qué lo quiere. Si su objetivo no necesita algún paso, sáltalo.
2. Antes de instalar, comprueba lo que ya tiene (versiones, claves, sistema operativo).
3. Avanza un paso cada vez: explica en una frase qué vas a hacer y deja que el usuario lo ejecute o lo apruebe.
4. Tras cada paso, comprueba que funcionó antes de seguir. Si falla, para y explica el error.
5. No inventes comandos ni opciones: si la documentación del proyecto contradice estos pasos, manda la documentación.
6. Al terminar, haz una prueba real con el objetivo del usuario y dile dónde profundizar.

---

## Pasos de configuración

### Paso 1: consulta los servicios

Comprueba que tienes Node.js ≥24 y npm/npx disponibles.

```bash
npx emulate list
```

### Paso 2: inicia una selección

```bash
npx emulate --service vercel,github
```

### Paso 3: dirige tu prueba

Configura tu aplicación con las URLs locales que imprime la CLI y los datos de prueba del servicio. Para una prueba completa independiente de tu aplicación, crea una carpeta de ensayo, ejecuta `npm install emulate` y guarda como `prueba.mjs` este ejemplo, adaptado de [Custom Emulators](https://github.com/vercel-labs/emulate#custom-emulators) para imprimir el estado antes y después:

```javascript
import { defineEmulator, createEmulator } from 'emulate';

const acme = defineEmulator({
  name: 'acme',
  state: () => ({ anvils: 100 }),
  setup({ app, state }) {
    app.get('/inventory', (c) => c.json(state));
    app.post('/orders', (c) => {
      if (!state.anvils) return c.json({ error: 'sold_out' }, 409);
      state.anvils -= 1;
      return c.json({ shipped: 'anvil', to: 'coyote' }, 201);
    });
  },
});
const api = await createEmulator({ service: acme, listen: false });
try {
  console.log(await (await api.request("/inventory")).json());
  await api.request("/orders", { method: "POST" });
  console.log(await (await api.request("/inventory")).json());
  const checkpoint = api.snapshot();
  await api.reset();
  await api.restore(checkpoint);
} finally {
  await api.close();
}
```

Ese ejemplo define las rutas `/inventory` y `/orders` y comienza con 100 unidades. Ejecuta `node prueba.mjs`: las lecturas deben mostrar 100 y 99. El modo `listen: false` prueba las rutas en memoria; la CLI anterior sirve para conectar una aplicación por HTTP.

## Comprobación

Comprueba que la aplicación usa los endpoints locales y que una mutación aparece en el estado del emulador. Repite tras reiniciar el escenario.

## Si algo falla

Si un endpoint falla, confirma que forma parte de la cobertura del servicio. Si no puedes instalar sin red, prepara el paquete previamente. No sustituyas datos de prueba por credenciales reales.
