# Changelog
## [1.0.0] — 2026-05-28
### Seguridad
- Migrados ~70 shell commands de `Arrea.Command.execute(string)` a `System.cmd(cmd, args_list)` (0 vectores de shell injection)
- `String.to_atom/1` reemplazado por `String.to_existing_atom/1` en toda la codebase
- Argumentos en Pkg, Docker, K8s migrados de strings concatenados a listas
- `shell_quote/1`, `escape_for_shell/1`, `cmd_with_stdin/4` eliminados
- SSH key path sanitizado con quoting
### Calidad
- `mix credo --strict`: 0 issues
- `mix compile --warnings-as-errors`: 0 warnings
- Código duplicado eliminado: `build_*_body` extraído a `Apero.Llm.RequestBuilder`
- `safe_telemetry/3` unificado en `Apero.Helpers`
- Lógica muerta eliminada: `connections/1` (tcp_only), `traceroute/2` (macos branch), `config_git/0`
- `detect_type/1` refactorizado de 15 `cond` a lookup en mapa
- `run_cmd/2` en Net ahora retorna `{:ok, out} | {:error, err}` consistentemente
### Cache
- Cache adapter dinámico: `start_link/2` registra el adapter, `adapter/1` lo consulta (soporta Redis/Memcached)
- 26 tests nuevos para Cache facade
### Tests
- 408 tests total (398 unit + 10 doctests), 0 failures
- Tests expandidos en Git (12 → 54), Crypto (17 → 46), Proc (+9), Conf (+6), Ssh (+2)
- Nuevos tests: CircuitBreaker (17), Cache (26)
- Tests de red taggeados con `@tag :network` para exclusión en CI
### Arquitectura
- `Apero.Cache.ETS` como adapter por defecto, extensible vía módulo
- Server startup timeout en LLM Engine (30s)
- `stash_if_needed/1` retorna `{:ok, ...}` consistentemente
## [0.1.0] — 2026-05-20
### Added
- Release inicial de Apero utility library
- OTP Application con Supervisor + 2 Registries
- Módulos: VFS, Compress, Git, Net, Proc, K8s, Docker, Ssh, Pkg, OS, Env, Conf, Crypto, Http, Cache, CircuitBreaker, Retry, Doctor, Llm