# Sunfish — AGENTS.md

Servidor web y de ficheros ligero y portable. Publica carpetas a la vez por web (HTML4 apto para
navegadores de los 90), FTP y WebDAV, para mover ficheros entre equipos modernos y máquinas muy
antiguas en redes de confianza. La versión 3 es una reescritura completa de la 2.0.

## Decisiones tomadas
- **C# / .NET 10.** Toda la lógica en `src/Sunfish.Core` (compatible con AOT); aplicaciones
  finas encima. Ver `DOC/ARQUITECTURA.md`.
- **Dos ejecutables:**
  - `Sunfish.exe` (WinForms, Windows): un solo `.exe` (`PublishSingleFile`), porque WinForms no
    admite AOT.
  - `sunfish-cli` (TUI/consola, Windows/Linux/macOS): Native AOT.
  - Más adelante, interfaces GTK y macOS sobre el mismo Core.
- **Motor HTTP propio sobre `Socket`** (ni `HttpListener` ni Kestrel): sin administrador,
  tolerante con clientes antiguos, permite AOT.
  - En este proyecto se publica con AOT aunque sea un servidor web: la excepción general para
    servidores web no aplica porque no se usa ASP.NET.
- **Un share = carpeta + location**, servida a la vez por web, FTP y WebDAV.
  - Gana la *location* más específica (por segmentos, como las *locations* de prefijo de nginx).
  - Si hay índice se sirve; si no, navegador de directorios. `?$list` fuerza el navegador
    aunque haya índice. Ver `DOC/SHARES-Y-RUTAS.md`.
- **Web en modo clásico** (HTML 3.2/4.01, sin JS, ISO-8859-1 con entidades, GIF, fuente sin
  serifa) y **modo moderno** como mejora progresiva. Subidas por formulario multipart. Ver
  `DOC/WEB.md`.
- **Clientes de destino:** DOS, Windows 3.1, 9x, Mac clásico y modernos. Adaptación
  **automática** por perfil de cliente (User-Agent, o sufijo `+dos`/`+mac` en el usuario FTP):
  alias 8.3 estables, MacBinary, juegos de caracteres. Ver `DOC/CLIENTES.md`.
- **FTP** activo/pasivo con juegos de caracteres antiguos; **WebDAV** clase 1 + LOCK simulado,
  activo por defecto. Ver `DOC/FTP-Y-WEBDAV.md`.
- **Mac clásico transparente:** MacBinary/BinHex se decodifican al subir (detección por CRC) y
  los forks se guardan como AppleDouble (`._`). `Mac = false` lo desactiva en un share. Ver
  `DOC/MAC-CLASICO.md`.
- **De Sunfish a Sunfish:** por WebDAV (cliente en Core) con descubrimiento DNS-SD; sin
  protocolo propio.
- **TUI** con el icono del pez luna en medios bloques cuando el terminal es lo bastante grande.
- **Panel de administración web** con contraseña, desactivado por defecto.
- **Sin TLS a propósito.** Se eliminan la ejecución en el servidor, compartir pantalla, los
  plugins y el requisito de administrador. Ver `DOC/SEGURIDAD.md` y `DOC/LEGACY-2.0.md`.
- **Configuración** en INI (`sunfish.conf`, claves en inglés), con importación de la 2.0.
  Textos en español e inglés (`SUNFISH_LANG`).

## Estado
- **Fases 1 a 7 hechas (todas las previstas):** `Sunfish.Core` (configuración INI con recarga
  en caliente, shares/locations, validación de rutas, motor HTTP propio, web con perfiles de
  cliente, subidas, carpetas, renombrar, borrar, anti-CSRF, HTTP Basic, ZIP en flujo, servidor
  FTP, WebDAV, cliente WebDAV, DNS-SD, Mac clásico con MacBinary/BinHex/AppleDouble, alias 8.3,
  panel de administración web, importación de la 2.0, QR), `sunfish-cli` (TUI con pestaña
  Explorar y QR, `serve`, modo rápido, `share`, `user`, `admin`, `import-v2`) y `Sunfish.exe`
  (WinForms, con ventanas Explorar, QR y panel web). Scripts `build.*` y `run.*`.
  `dotnet test` pasa (252 pruebas). Lo que falta en `DOC/COMPILACION-Y-PRUEBAS.md`.
- El panel web (`Web/WebAdmin.cs`) usa el `SunfishHost` que recibe `WebApp`; no cambia el HTTP
  (reiniciarlo cortaría la propia petición).
- `SunfishHost` arranca y para HTTP y FTP por separado (`Server.Http` / `Server.Ftp`) y les da el
  mismo `Authenticator` (bloqueo por intentos compartido).
- Las aplicaciones editan una copia (`SunfishConfig.Clone`) y la aplican con
  `SunfishHost.SaveAndApplyAsync`; las validaciones compartidas están en `Config/ShareSettings.cs`.
- Operaciones de disco comunes (para web, FTP y WebDAV) en `Shares/FileOperations.cs`.
- El código de la 2.0 se retiró del árbol; queda en la etiqueta `2.0`. El arte original está en
  `art/`.
- **Remoto** actual privado, rama `master`. El README ya apunta a GitHub (rama `main`) para
  cuando se publique allí.
- **Decisiones pendientes** listadas en `DOC/README.md`.

## Compilar
`dotnet build`, `dotnet test`, `run.cmd` (GUI), `run-cli.cmd` / `run.sh` (consola).
`build.ps1` compila `Sunfish.exe` (autocontenido; `SUNFISH_LIGHT=1` para el ligero) y
`sunfish-cli.exe` en Windows; `build.sh`, `sunfish-cli` en Linux/macOS. Ver
`DOC/COMPILACION-Y-PRUEBAS.md`.
