# 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]

### 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.

### 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
- `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).
- 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>`
- Refus explicite des types `react` / `static` au deploy
- Chemins SSH quotés (shell-safe)
- Dashboard : Entrée déclenche un deploy si le service matche `.kennhosting.yml`
- Historique TUI paginé (`n` / `p`)
- `Makefile` VERSION alignée sur `1.0.0-rc.2`

## [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`).
