# Changelog

Toutes les modifications notables de ce projet sont documentées ici.

Le format s'appuie sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/),
et ce projet suit le [Semantic Versioning](https://semver.org/lang/fr/).

## [Unreleased]

## [1.0.0] - 2026-09-14

Première version stable — sortie de release candidate après un audit complet du CLI (déploiement,
sécurité, distribution) menant aux correctifs ci-dessous, en plus du support react/static et de la
distribution Windows déjà en préparation.

### Added
- Déploiement des projets `react` et `static` (jusqu'ici explicitement refusés au `deploy` malgré une détection automatique dans `init`, qui laissait l'utilisateur terminer tout le wizard — service, domaine, clé SSH, Deploy Key GitHub — avant de découvrir le blocage). Aucun clone/pull git côté serveur pour ces types : le build local (`react`, dossier configurable, défaut `dist`) ou le dossier tel quel (`static`, défaut `.`) est uploadé directement dans le docroot via `StaticDeployer`, en réutilisant le transport gzip+tar sur SSH déjà utilisé par l'upload d'assets Laravel. `deploy` et `deploy setup` sont équivalents pour ces types (pas de notion de clone initial). `init` n'affiche plus l'étape "Version PHP" ni la génération de Deploy Key GitHub pour ces projets (sans objet, aucun code ni clone côté serveur).
- `install.ps1` : installation native Windows en une commande (`irm https://cli.kennhosting.com/install.ps1 | iex`), même contrat que `install.sh` (vérification SHA256, échec fermé).
- Section téléchargements directs (macOS, Linux, Windows) sur `cli.kennhosting.com`, avec lien vers `SHA256SUMS` pour vérification manuelle.

### Fixed
- Rollback complet de `deploy setup` (premier déploiement) : le squelette cPanel du docroot est sauvegardé avant le clone et restauré automatiquement si une étape échoue (composer install, migration...) — auparavant, aucun nettoyage n'avait lieu et le compte restait dans un état indéfini.
- Révocation de clé SSH (`DELETE /ssh-keys/{fingerprint}`) : la clé est maintenant réellement désautorisée sur chaque compte cPanel synchronisé, pas seulement supprimée de la base de données côté serveur.
- Reconstruction automatique de la configuration nginx (EA-Nginx) après un changement de docroot — un cron de réconciliation côté serveur WHM comble un angle mort où `changedocroot` réussissait sans que le site public serve réellement le nouveau contenu.
- Retry réseau automatique désormais limité aux requêtes GET/HEAD — évitait un risque de doublon (ex. ligne d'historique de déploiement) sur une micro-coupure réseau juste après qu'une requête d'écriture (POST) ait été traitée avec succès côté serveur.
- Message d'erreur réel capturé et transmis à l'historique de déploiement serveur en cas d'échec (`error_message`), pour que le support puisse diagnostiquer sans dépendre de `storage/logs` côté client.
- Le prompt d'écrasement d'un environnement existant dans `kennhosting init` affiche maintenant le domaine actuellement configuré, pour éviter un remplacement silencieux (ex. `.kennhosting.yml` réutilisé par erreur entre deux sous-domaines).
- `install.sh` détecte maintenant Git Bash/MSYS sous Windows et oriente vers `install.ps1` au lieu d'un message générique "système non supporté".

## [1.0.0-rc.3] - 2026-08-11

### Added
- `kennhosting update` : met à jour le CLI vers la dernière version publiée (macOS/Linux — compare `releases/latest/VERSION` à la version installée, réutilise `install.sh` pour le téléchargement/vérification SHA256). Sur les autres plateformes, indique où télécharger manuellement.

### Fixed
- `deploy setup` : le clone git ciblait directement le docroot, que cPanel provisionne toujours avec un squelette par défaut (cgi-bin, .htaccess, php.ini, .well-known) dès la création du sous-domaine — le dossier n'était donc jamais vide et `git clone` échouait systématiquement au tout premier déploiement d'un sous-domaine neuf (constaté en prod le 11/08/2026). Le clone passe maintenant par un dossier temporaire jetable, fusionné ensuite dans le docroot (`cp -a`) — préserve les fichiers cPanel absents du dépôt (ex. `.well-known`, requis par AutoSSL).

## [1.0.0-rc.2] - 2026-08-11

### Changed
- `deploy` et `deploy setup` n'utilisent plus l'écran TUI interactif (`tui.RunDeployScreen`) : même avec `QuietRunner`, l'alt-screen Bubble Tea restait corrompu dès que composer/artisan écrivait sur le terminal. Retour à une sortie texte pure (`ui.Step`) pour ces deux commandes — le tableau de bord TUI (`kennhosting` sans sous-commande) n'est pas affecté. `internal/tui/deploy_screen.go` (devenu du code mort, plus aucun appelant) et son test sont supprimés.
- Landing page et script d'installation servis directement depuis `cli.kennhosting.com` (dossier `site/`) plutôt que depuis les GitHub Releases — `install.sh` et `README.md` mis à jour en conséquence ; nouvelles cibles `make deploy-site` / `make publish-release` et étape de déploiement CI (`.github/workflows/release.yml`).

### Fixed
- Alignement du document root cPanel sur `apps/{sub}/public` : sous-domaines créés avec le bon document root Laravel dès `init`, `setup-docroot` appelé à l'init et à chaque `deploy`, `root_domain` transmis au backend.
- Upload des assets Vite après `git pull` (plus de front vide quand `public/build` est gitignoré)
- `QuietRunner` branché systématiquement (deploy/deploy setup) — plus de corruption d'écran pendant composer/artisan
- Hooks `post_deploy` et échecs `LogDeploy` ne sont plus avalés silencieusement
- Timeout HTTP API 30s + header `User-Agent: kennhosting-cli/<version>`
- Chemins SSH quotés (shell-safe)
- Dashboard : Entrée déclenche un deploy si le service matche `.kennhosting.yml`
- Historique TUI paginé (`n` / `p`)

## [1.0.0-rc.1] - 2026-07-13

Première version stable candidate — refonte complète en vue d'une v1 publique.

### Added
- Tableau de bord TUI interactif (`kennhosting` sans sous-commande) : liste des services, historique des déploiements (touche `h`), navigable au clavier
- Écran de déploiement interactif : spinner par étape + historique de logs défilant
- Endpoint et commande d'historique des déploiements (`GET /api/v1/cli/deploys` côté backend, `api.Client.ListDeploys`)
- Flag `--plain` pour forcer le mode texte même en terminal interactif
- Flag `--yes`/`-y` sur `deploy`, `deploy setup` et `logout` pour le scripting/CI
- Détection automatique du contexte non-interactif (TTY, variable `CI`) — la TUI ne se lance jamais en pipeline
- Script d'installation (`install.sh`) et cibles de cross-compilation (`make cross-build`, `make release-archives`)
- Clé de déploiement SSH dédiée par service pour cloner les dépôts GitHub privés (`init` détecte le remote GitHub, génère/affiche la clé à ajouter comme Deploy Key, `deploy setup` clone en SSH plutôt qu'en HTTPS)

### Changed
- `init` fusionne désormais un nouvel environnement dans `.kennhosting.yml` existant au lieu d'écraser le fichier (perte silencieuse des autres environnements auparavant)
- Politique de confirmation unifiée : `deploy`, `deploy setup` et `logout` demandent tous confirmation par défaut (`deploy` n'en demandait aucune auparavant)
- Erreurs d'authentification reformulées de façon cohérente entre `login` et `whoami`
- Message d'erreur SSH désormais actionnable selon la cause (authentification refusée, timeout, connexion refusée) au lieu du jargon Go brut
- Saisie du token API masquée à l'écran (au lieu d'un affichage en clair)
- Hooks `pre_deploy`/`post_deploy` exécutés via un vrai shell (`sh -c`/`cmd /C`) au lieu d'un découpage naïf par espaces — supporte désormais pipes, guillemets, `&&`

### Fixed
- Version du binaire (`--version`) figée à `0.1.0` quel que soit le build — le linker `-ldflags -X` ne peut pas modifier une `const` Go
- Échec du rollback de déploiement (`artisan up`) totalement silencieux — signalé désormais explicitement avec un code de sortie dédié (`2`)
- Aucun retry sur les erreurs réseau transitoires (timeout, DNS) — 2 tentatives supplémentaires avec backoff, jamais sur une erreur 4xx
- Config JSON locale corrompue renvoyait une erreur brute au lieu d'un message invitant à relancer `login`
- Backend : les comptes cPanel provisionnés via le flow revendeur avaient l'accès shell/SSH désactivé au niveau du package WHM (`hasshell => 'n'`), rendant toute authentification par clé publique impossible même correctement configurée — cause racine du symptôme `unable to authenticate, attempted methods [none publickey]`
- Backend : la synchronisation de clé SSH ne ciblait que les services `Active` (les `Suspended` étaient silencieusement ignorés) et retournait un succès HTTP même en cas d'échec total de synchro — un nouveau champ `status` (`ok`/`partial`/`failed`) est désormais exposé et lu par le CLI
- Backend : version PHP codée en dur (`8.4`) dans `deploy-info`, ignorant la configuration MultiPHP réelle du domaine
- Backend : la synchronisation de clé SSH échouait systématiquement en production — ni `authkeys_add` ni `authkeys` ne sont des fonctions API2 cPanel valides sur les versions récentes (le module API2 "SSH" a disparu, seules les fonctions historiques `api2_*` de `Cpanel/SSH.pm` restent dispatchables) ; la vraie fonction est `authkey` (singulier), avec un piège supplémentaire où `event.result: 1` ne garantit pas le succès réel de l'opération
- Clonage SSH d'un dépôt privé échouait avec « Permission denied (publickey) » même Deploy Key correctement ajoutée — la clé générée (`kh-git-deploy`) ne porte pas un nom de fichier SSH standard, jamais essayée automatiquement par le client SSH ; `githubHTTPSToSSH()` construit désormais l'URL via l'alias dédié `kh-deploy-github.com` configuré côté serveur
- `deploy setup` échouait avec une erreur bas niveau (« No such file or directory ») sur un clone frais sans lien évident avec la vraie cause : `artisan key:generate` nécessite un `.env` déjà présent ; prépare désormais le `.env` avant l'étape, et utilise le script `composer run setup` du projet quand il existe plutôt qu'une séquence artisan générique

## [0.1.0] - 2026-06-30

Scaffold initial : `login`, `logout`, `whoami`, `init`, `deploy` (+ `deploy setup`).
