Files
nixos/modules/home-mac/winnie/scripts.nix
T
Hermes Agent 7498ea4971 feat(macos): setup nix-darwin pour builder l'app Winnie
L'app se build sur le Mac en trois commandes, le toolchain restant dans le
devShell du flake winnie (jamais installé sur le Mac) :
  cd ~/git/nixos && just mac   # déploie ce setup
  winnie-sync                  # attrape ~/git/winnie depuis tower (rsync ssh)
  winnie-ios                   # simulateur ; npm ci + tauri ios init au besoin

- modules/home-mac/winnie : winnie-doctor [--fix], winnie-sync [--delete],
  winnie-shell, winnie-front, winnie-macos, winnie-build-macos, winnie-ios,
  winnie-build-ios, winnie-verify. Scripts en writeShellApplication (shellcheck
  au build) ; scripts.nix est séparé du module pour être constructible depuis
  tower avec les pkgs linux et testable sans Mac.
- profiles/macos : flakes + trusted-users dans nix.conf, et
  system.activationScripts.winnie-xcode (xcode-select -s, licence Xcode,
  -runFirstLaunch) pour que seule l'installation App Store reste manuelle.
- Embarque aussi le setup SSH entrant du Mac (sshd, clé hermes@tower, tunnel
  inverse autossh) qui était déjà dans l'arbre de travail.

Vérifié depuis tower : nix eval du darwinConfigurations.macos (toplevel et
home-manager-generation) + build des scripts en x86_64-linux (shellcheck) et
rsync de bout en bout depuis le dépôt de tower.
2026-10-24 14:33:35 -04:00

94 lines
3.3 KiB
Nix

# Commandes de build Winnie pour macOS, en dérivations writeShellApplication :
# shellcheck tourne au build et chaque commande est versionnée avec la config.
#
# Séparé du module home-manager exprès : ce fichier s'importe tel quel depuis
# tower avec les pkgs x86_64-linux pour construire et tester les mêmes scripts
# sans Mac (le Mac les reconstruit avec ses pkgs darwin).
{
pkgs,
lib,
cfg, # { repoRel, towerRepo, towerHosts, apiUrl }
}:
let
subst = text:
lib.replaceStrings
["@REPO_REL@" "@TOWER_REPO@" "@TOWER_HOSTS@" "@API_URL@" "@WINNIE_SYNC@"]
[
cfg.repoRel
cfg.towerRepo
(lib.concatMapStrings (h: "'${h}' ") cfg.towerHosts)
cfg.apiUrl
(lib.getExe sync)
]
text;
# Scripts exécutés DANS le devShell du flake winnie : leurs outils (npm, cargo,
# tauri, xcrun, simctl) viennent de ce shell, d'où runtimeInputs vide.
inner = name: file: pkgs.writeShellApplication {
name = "winnie-${name}-inner";
text = subst (builtins.readFile file);
};
# Commandes exposées : cd dans le dépôt puis ré-exécution de l'inner dans
# `nix develop`, pour que rien ne dépende du PATH du Mac.
dev = name: innerScript: pkgs.writeShellApplication {
name = "winnie-${name}";
runtimeInputs = [pkgs.nix];
text = ''
repo="$HOME/${cfg.repoRel}"
if [ ! -f "$repo/flake.nix" ]; then
echo "winnie-${name} : dépôt absent ($repo). Lance winnie-sync." >&2
exit 1
fi
cd "$repo"
exec nix --extra-experimental-features 'nix-command flakes' develop -c ${lib.getExe innerScript} "$@"
'';
};
# Rafraîchit le dépôt depuis tower : rsync du dépôt local de tower (le dépôt
# n'a pas de remote git, tower est le seul original).
sync = pkgs.writeShellApplication {
name = "winnie-sync";
runtimeInputs = [pkgs.rsync pkgs.openssh];
text = subst (builtins.readFile ./scripts/sync.sh);
};
# État du poste : Xcode, SDK iOS, runtime du simulateur, node_modules, API.
# Xcode n'est pas dans le store Nix (App Store), donc ce diagnostic est la
# seule source de vérité, et --fix automatise tout sauf l'installation d'Xcode.
doctor = pkgs.writeShellApplication {
name = "winnie-doctor";
runtimeInputs = [pkgs.nix pkgs.curl pkgs.coreutils];
text = subst (builtins.readFile ./scripts/doctor.sh);
};
# DevShell interactif du projet, sans deviner le chemin du dépôt.
shell = pkgs.writeShellApplication {
name = "winnie-shell";
runtimeInputs = [pkgs.nix];
text = ''
repo="$HOME/${cfg.repoRel}"
if [ ! -f "$repo/flake.nix" ]; then
echo "winnie-shell : dépôt absent ($repo). Lance winnie-sync." >&2
exit 1
fi
cd "$repo"
exec nix --extra-experimental-features 'nix-command flakes' develop "$@"
'';
};
in {
inherit doctor shell sync;
# Serveur Vite (HMR) du front Svelte.
front = dev "front" (inner "front" ./scripts/front.sh);
# App Tauri : macOS (CLT suffisent) et iOS (Xcode requis).
macos = dev "macos" (inner "macos" ./scripts/macos-dev.sh);
macos-build = dev "build-macos" (inner "build-macos" ./scripts/macos-build.sh);
ios = dev "ios" (inner "ios" ./scripts/ios-dev.sh);
ios-build = dev "build-ios" (inner "build-ios" ./scripts/ios-build.sh);
# Contrôles avant commit (front + svelte-check + cargo check).
verify = dev "verify" (inner "verify" ./scripts/verify.sh);
}