# Build de l'AppImage IdeA (Linux)

Procédure canonique pour reconstruire l'AppImage Linux d'IdeA et les bundles frontend associés.

À utiliser à chaque fois qu'un correctif doit être visible dans l'app desktop. Rappel produit : **le binaire qui tourne = l'AppImage installée, pas les sources**. Un correctif source n'est actif dans l'app desktop qu'après rebuild, remplacement de l'AppImage utilisée, puis relance d'IdeA.

## Commande principale

Depuis le project root `/home/anthony/Documents/Projects/IdeA` :

```bash
cd crates/app-tauri
APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=true ../../frontend/node_modules/.bin/tauri build --bundles appimage
```

Cette commande déclenche `build.beforeBuildCommand`, donc elle reconstruit automatiquement les deux bundles frontend :

- `frontend/dist` : bundle desktop, transport `tauri`.
- `frontend/dist-web` : bundle web, transport `http`.

Ne pas revenir à l'ancienne procédure `npm --prefix frontend run build` seule : elle ne reconstruit pas le bundle web séparé.

## Vérification des bundles web/desktop

Après le build, lancer :

```bash
npm --prefix frontend run test:bundle-transport
```

Sortie attendue :

```text
dist: __IDEA_TRANSPORT__="tauri" (1 marker)
dist-web: __IDEA_TRANSPORT__="http" (1 marker)
```

## Artefact attendu

```text
target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage
```

Vérifier rapidement :

```bash
ls -lh target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage
APPIMAGE_EXTRACT_AND_RUN=1 target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage --appimage-help | head
```

## Pourquoi ces variables sont obligatoires

- `--bundles appimage` : cible uniquement l'AppImage Linux et évite les bundles inutiles/cassants comme NSIS.
- `NO_STRIP=true` : évite l'échec linuxdeploy/strip sur les bibliothèques système modernes contenant `.relr.dyn`.
- `APPIMAGE_EXTRACT_AND_RUN=1` : évite l'échec FUSE quand linuxdeploy ou appimagetool ne peuvent pas monter une AppImage dans l'environnement courant.

## Fallback si Tauri échoue à `failed to run linuxdeploy`

Symptôme : la commande Tauri reconstruit `frontend/dist`, `frontend/dist-web`, compile `target/release/app-tauri`, crée `target/release/bundle/appimage/IdeA.AppDir`, puis échoue seulement à l'étape finale :

```text
failed to bundle project `failed to run linuxdeploy`
```

Ne pas réanalyser tout le build. Faire ce diagnostic court :

```bash
APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=true LDAI_OUTPUT=/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage \
  /home/anthony/.cache/tauri/linuxdeploy-x86_64.AppImage \
  --appdir /home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA.AppDir \
  --output appimage
```

Si `appimagetool` échoue avec téléchargement runtime impossible :

```text
Failed to download runtime file
```

utiliser le runtime local déjà en cache et l'`appimagetool` extrait. Chercher le dossier extrait récent :

```bash
find /tmp -path '*/appimagetool-prefix/usr/bin/appimagetool' -type f -printf '%p\n' | tail -1
```

Puis lancer en remplaçant `<EXTRACTED>` par le préfixe trouvé, par exemple `/tmp/appimage_extracted_xxx` :

```bash
PATH=<EXTRACTED>/appimagetool-prefix/usr/bin:$PATH \
ARCH=x86_64 \
<EXTRACTED>/appimagetool-prefix/usr/bin/appimagetool \
  --runtime-file /home/anthony/.cache/tauri/runtime-x86_64 \
  /home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA.AppDir \
  /home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage
```

Le `PATH` est nécessaire parce que `mksquashfs` est fourni dans `appimagetool-prefix/usr/bin` et peut être absent du PATH système.

## Relance de l'application

Ne pas relancer IdeA automatiquement depuis une session active : cela tue l'orchestrateur courant et les ponts MCP. Une fois l'AppImage reconstruite, l'utilisateur décide quand remplacer/lancer l'artefact final.

## Piège d'environnement AppImage

Une session shell lancée depuis l'AppImage peut hériter de variables comme `APPDIR`, `LD_LIBRARY_PATH`, `PYTHONHOME` pointant vers `/tmp/.mount_IdeA_*`. Symptômes possibles : `python3` casse avec `No module named 'encodings'`, ou un binaire Tauri local se lance dans un environnement pollué.

Pour des commandes sensibles, préférer un environnement propre ou éviter Python :

```bash
env -i PATH=/usr/bin:/bin HOME=$HOME XDG_RUNTIME_DIR=/run/user/1000 <commande>
```