
# CLI

```bash
vendor/bin/storh stats <root> [collection] [doc|log|queue]
vendor/bin/storh verify <root> [collection] [doc|log|queue]
vendor/bin/storh compact <root> [collection] [doc|log]
vendor/bin/storh reindex <root> [collection]
```

`<root>` es la raíz de almacenamiento con la que se abrieron los motores, que corresponde a la ruta que devuelve `StorageRoot::resolve()`: el directorio base más el espacio de nombres. Un almacén abierto en `StorageRoot::resolve(__DIR__ . '/var/storh', 'app')` se encuentra en `var/storh/app`:

```bash
vendor/bin/storh stats var/storh/app pages doc
vendor/bin/storh verify var/storh/app events log
vendor/bin/storh compact var/storh/app events log
vendor/bin/storh reindex var/storh/app pages
```

Si solo se pasa el directorio base (`var/storh`), los comandos apuntan a una colección que aún no existe y, en lugar de fallar, indican que está vacía.

`vendor/bin/storh` requiere storh 0.5.2 o posterior cuando storh está instalada como dependencia. Las versiones anteriores solo buscaban el cargador automático de Composer en el directorio `vendor/` del paquete y fallaban con un error de `require`.

CLI imprime JSON estables para que pueda usarse en trabajos de cron y comprobaciones del estado de despliegue. La colección predeterminada es `default`; el motor predeterminado es `doc` para `stats`, `verify` y `reindex`, y `log` para `compact`.

## Métodos de mantenimiento que usan los comandos

Todos los motores exponen los métodos de mantenimiento que utiliza CLI:

```php
$store->stats();
$store->health();
$store->verify();
$store->repair();
```

DocStore añade:

```php
$docs->reindex();
$docs->compact(); // no-op report for API symmetry
```

SegmentedLog añade:

```php
$log->compact();
$log->recover();
$log->state_index();
```

Para DocStore, `verify()` comprueba que los registros se analicen correctamente y que los índices de igualdad, rango y compuestos coincidan con un recorrido completo de los registros. `repair()` pone en cuarentena los archivos de registros dañados en `.storh/corrupt/` y reconstruye los índices a partir de los registros válidos.

Para SegmentedLog, `verify()` decodifica las líneas de los segmentos y compara el índice de estado derivado actual con una reproducción reciente de los segmentos. `repair()` reconstruye el estado derivado y trunca las líneas finales incompletas.

Para Queue, `verify()` decodifica todos los eventos persistentes y compara los estados de pendientes, en proceso, completados, carga útil y orden de reclamación con una reproducción reciente de `queue.log`. `repair()` reconstruye el estado de la cola a partir del registro y vuelve a poner en cola los trabajos en proceso cuya espera haya vencido.
