Ehundu 0.12.0
Un sitio grande se compila y se sube en varias llamadas. Un proceso web tiene un límite de tiempo, y compilar de golpe un sitio de mil páginas no cabe. La interfaz nueva CompiladorPorLotes (con CompiladorPorLotesEnProceso y Lote como resultado) hace una parte del trabajo por llamada, con un presupuesto de segundos que da quien llama: iniciar($proyecto) empieza, avanzar($proyecto, 20.0) hace tareas hasta agotar el presupuesto, y siempre al menos una, y cuando completo() el informe() es el de una compilación entera y salida/ queda igual que si se hubiera compilado de una vez. Por dónde va se guarda en .ehundu/lote.json, dentro del proyecto, con su propio .gitignore para que no ensucie un repositorio; si el proyecto cambia a mitad, el lote empieza de nuevo y lo dice. La subida también se reparte: Desplegador::desplegar() acepta un presupuesto ($segundos) y una compilación ya hecha ($compilado), y InformeDeDespliegue dice si terminó ($completo) y cuántos ficheros quedan ($pendientes). Cada página se escribe al hacerla, así que salida/ mezcla páginas nuevas y viejas hasta el último lote. La orden ehundu no cambia (docs/formato.md (se abre en una pestaña nueva), §10.4 y decisiones 124 y 125; docs/compilacion.md (se abre en una pestaña nueva)).
Un proyecto declara para qué versión del formato está escrito: formato: 1. En sitio.yml (§2), y "formato": 1 en el esquema.json de un editor (§11). Sin la clave, el formato es el 1 y no se avisa, así que ningún proyecto de la 0.11 tiene que cambiar; un valor que no es un entero mayor que cero se avisa y se toma como 1; y uno mayor que el que entiende el motor detiene el build con un error claro, en lugar de compilar a ciegas un formato que no conoce. Es solo la versión mayor, porque dentro de una el formato únicamente crece (decisión 122; clase Ehundu\Formato).
Y por fin está escrito qué promete la biblioteca. docs/biblioteca.md (se abre en una pestaña nueva) lista la orden de consola y las clases PHP que se mantendrán estables dentro de una versión mayor: compilar, leer un proyecto, los avisos y los errores, Slug y el despliegue. Las demás clases llevan @internal y pueden cambiar en cualquier versión menor. Lo que va a dejar de valer avisa durante, al menos, una versión menor antes de quitarse (decisión 123). La 1.0 congelará el formato, la orden y esa lista.
Los sitios de la 0.11 compilan igual: no cambia nada que no use formato ni los lotes. Compilados desde cero con la 0.11.1 y con esta, los veintitrés sitios de prueba (PDF incluidos) dan los mismos ficheros, uno a uno, y compilados por lotes dan los mismos que de golpe.
Esta versión en GitHub (se abre en una pestaña nueva), con el ehundu.phar.