Configuration d’un MacBook pour l’ingénierie AI : outils et workflow macOS
Traduction automatique Cet article a été traduit automatiquement depuis la version originale en anglais.
Voici la configuration que j’applique à un MacBook fraîchement installé avant d’y effectuer des travaux d’ingénierie AI. Elle couvre les outils en ligne de commande absents de macOS, Homebrew, Python avec uv, le shell, le choix du terminal et de l’éditeur, Docker, ainsi que les outils AI locaux.
La distinction utile se situe entre les fondations nécessaires et les préférences personnelles. Les Xcode Command Line Tools, Homebrew, Git et un workflow Python sont des fondations. Warp, iTerm2, Powerlevel10k, Cursor et les exécuteurs de modèles locaux sont des choix. Les commandes ci-dessous installent les fondations ; les sections suivantes consignent les choix que je fais par-dessus. Il s’agit d’une séquence de configuration documentée, et non d’une image machine reproductible bit par bit.
Installer les fondations de macOS
Commencez par les outils en ligne de commande d’Apple :
xcode-select --install
macOS ouvre une boîte de dialogue qui guide l’installation.
Homebrew est le gestionnaire de paquets que j’utilise pour le reste de cette configuration :
Téléchargez l’installateur depuis une révision vérifiée, vérifiez son digest, inspectez-le, puis exécutez la copie locale :
(
set -e
homebrew_installer="$(mktemp)"
trap 'rm -f "$homebrew_installer"' EXIT
curl --proto '=https' --tlsv1.2 --fail --location --show-error https://raw.githubusercontent.com/Homebrew/install/150c69df1e54b0b74c9fcca5a201410a2300816a/install.sh -o "$homebrew_installer"
printf '%s %s\n' 12479a24be3f5307eecac7cde670fad7118640f031229e964f544b1367b52a41 "$homebrew_installer" | shasum -a 256 --check
less "$homebrew_installer"
/bin/bash "$homebrew_installer"
)
Le guide d’installation de Homebrew explique les modifications et les préfixes par défaut. Sur Apple Silicon, Homebrew utilise /opt/homebrew.
Exécutez la commande brew shellenv affichée à la fin afin que brew soit disponible dans le shell courant. L’installateur peut également configurer le préfixe Homebrew pour les futurs shells de connexion. Le commit et le SHA-256 couvrent le fichier d’amorçage ; mettez-les à jour ensemble après vérification. Homebrew reste un gestionnaire de paquets rolling release : les commandes brew install ultérieures résoudront donc les versions de formule disponibles à ce moment-là.
Installez les outils en ligne de commande que j’utilise régulièrement :
brew install openssl readline sqlite3 xz zlib uv htop gitmoji pandoc ncdu tmux
Les paquets se répartissent en trois groupes :
- openssl, readline, sqlite3, xz et zlib fournissent des bibliothèques pour les workloads Python et en ligne de commande courants.
- uv gère les versions de Python, les environnements, les dépendances, les commandes et les lockfiles.
- htop, tmux, ncdu, gitmoji et pandoc couvrent respectivement la supervision des processus, les sessions de terminal, l’inspection des disques, le formatage des commits et la conversion de documents.
Utiliser uv pour le travail quotidien en Python
Avant d’adopter uv, j’utilisais pyenv pour gérer les environnements Python. uv couvre désormais mon workflow quotidien. Installez la dernière version de Python gérée par uv :
uv python install
Cette commande installe la dernière version disponible dans uv au moment de la configuration. Pour une version propre à un projet, utilisez le workflow de pinning décrit dans mon guide rapide de gestion de Python sur macOS avec uv.
Installez pyenv séparément uniquement si vous avez besoin de son mode de compilation depuis les sources :
brew install pyenv
J’utilise pyenv lorsque j’ai besoin d’un interpréteur compilé depuis les sources ou d’options de compilation CPython personnalisées que les distributions précompilées d’uv ne fournissent pas. Supprimez pyenv de la liste des plugins ci-dessous si vous ignorez cette installation facultative.
Choisir un terminal
Le Terminal macOS par défaut convient parfaitement. J’ai utilisé iTerm2 pendant des années et je suis récemment passé à Warp, un terminal basé sur Rust avec des fonctionnalités AI intégrées. Ce choix n’a aucune incidence sur la suite de la configuration.
Si vous restez sur iTerm2, voici les deux paramètres que je modifie :
Activer l’édition naturelle du texte
- Ouvrez Preferences → Profiles → Keys → Key Mappings.
- Ouvrez la liste déroulante Presets…
- Sélectionnez « Natural Text Editing ».
Choisir un thème de couleurs
- Parcourez les thèmes sur iTerm2-Color-Schemes.
- Ouvrez Preferences → Profiles → Colors → Color Presets…
- Sélectionnez Import, puis choisissez le thème téléchargé.
Configurer Zsh
macOS utilise Zsh comme shell de connexion par défaut.
J’utilise le /bin/zsh fourni avec le système ; installez
le Zsh de Homebrew uniquement si vous avez besoin d’une version upstream plus récente précise.
Vérifiez la version de Zsh installée et le shell de connexion courant :
echo "$SHELL"
command -v zsh
zsh --version
Si Zsh est installé mais n’est pas sélectionné comme shell de connexion, basculez vers la copie fournie avec le système :
chsh -s /bin/zsh
Ouvrez un nouveau terminal après avoir modifié le shell de connexion.
Oh My Zsh ajoute les valeurs par défaut et le système de plugins que j’utilise. Son installateur standard suit une branche mouvante. Pour une configuration épinglée, clonez le dépôt sans extraire cette branche, sélectionnez le commit vérifié, puis copiez seulement le template :
(
set -e
omz_dir="$HOME/.oh-my-zsh"
if [ -L "$HOME/.zshrc" ]; then
printf 'Refusing to replace symlink: %s\n' "$HOME/.zshrc" >&2
exit 1
fi
if [ -e "$HOME/.zshrc" ] && [ ! -f "$HOME/.zshrc" ]; then
printf 'Refusing to replace non-regular file: %s\n' "$HOME/.zshrc" >&2
exit 1
fi
if [ -e "$HOME/.zshrc" ]; then
omz_backup="$(mktemp "$HOME/.zshrc.pre-oh-my-zsh.XXXXXX")"
cp "$HOME/.zshrc" "$omz_backup"
printf 'Existing .zshrc backed up to %s\n' "$omz_backup"
fi
git clone --filter=blob:none --no-checkout https://github.com/ohmyzsh/ohmyzsh "$omz_dir"
git -C "$omz_dir" checkout --detach 4b657407c98bbc8830ae66c2ac7ff3d737c55a83
test "$(git -C "$omz_dir" rev-parse HEAD)" = 4b657407c98bbc8830ae66c2ac7ff3d737c55a83
new_zshrc="$(mktemp "$HOME/.zshrc.new.XXXXXX")"
trap 'rm -f "$new_zshrc"' EXIT
cp "$omz_dir/templates/zshrc.zsh-template" "$new_zshrc"
test -s "$new_zshrc"
test ! -d "$HOME/.zshrc"
mv -f "$new_zshrc" "$HOME/.zshrc"
)
Le bloc s’arrête avant de remplacer .zshrc si le clone ou la vérification du commit échoue. Il refuse les liens symboliques et les fichiers non réguliers, sauvegarde un fichier existant sous un nom .zshrc.pre-oh-my-zsh.* unique, puis le remplace par une copie temporaire vérifiée au moyen d’un seul renommage. Comparez la sauvegarde affichée avec le template et restaurez vos paramètres locaux avant d’ouvrir un nouveau shell. Le checkout est épinglé sur le commit 4b65740 ; ne mettez à jour le hash qu’après avoir vérifié une révision plus récente.
Exécutez les snippets de configuration du shell depuis un seul shell de configuration, sans qu’aucun autre processus ne modifie .zshrc ni les destinations des plugins et du thème. Ils refusent les destinations existantes ou symboliques, mais ne constituent pas un gestionnaire de paquets multi-processus.
Ajouter des plugins
Installez zsh-autosuggestions et zsh-syntax-highlighting dans le répertoire de plugins personnalisés d’Oh My Zsh :
install_pinned_zsh_repo() (
set -e
repo_url="$1"
commit="$2"
destination="$3"
if [ -L "$destination" ]; then
printf 'Refusing symlink destination: %s\n' "$destination" >&2
return 1
fi
if [ -d "$destination/.git" ] && [ "$(git -C "$destination" rev-parse HEAD)" = "$commit" ]; then
return 0
fi
destination_parent="$(dirname "$destination")"
mkdir -p "$destination_parent"
stage="$(mktemp -d "$destination_parent/.pinned-zsh.XXXXXX")"
cleanup_stage() { rm -rf "$stage"; }
trap cleanup_stage EXIT
git clone --filter=blob:none --no-checkout "$repo_url" "$stage/repo"
git -C "$stage/repo" checkout --detach "$commit"
test "$(git -C "$stage/repo" rev-parse HEAD)" = "$commit"
test ! -e "$destination"
test ! -L "$destination"
mv -h -n "$stage/repo" "$destination"
test ! -e "$stage/repo"
test "$(git -C "$destination" rev-parse HEAD)" = "$commit"
)
install_pinned_zsh_repo https://github.com/zsh-users/zsh-autosuggestions e52ee8ca55bcc56a17c828767a3f98f22a68d4eb "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions"
install_pinned_zsh_repo https://github.com/zsh-users/zsh-syntax-highlighting.git db085e4661f6aafd24e5acb5b2e17e4dd5dddf3e "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting"
Le commit épinglé de zsh-autosuggestions et le commit épinglé de zsh-syntax-highlighting correspondent aux releases publiées v0.7.1 et 0.8.0. Ne mettez les hash à jour qu’après avoir vérifié une release plus récente.
Modifiez ~/.zshrc pour les charger avec les plugins que j’utilise :
plugins=(
aws bgnotify brew docker docker-compose
emoji forklift gcloud git history iterm2
keychain kubectl macos pre-commit
pyenv pylint python screen themes
tmux virtualenv vscode
zsh-autosuggestions zsh-syntax-highlighting
)
Conservez zsh-syntax-highlighting en dernier dans le tableau. Le wiki des plugins Oh My Zsh décrit les plugins inclus. Les deux plugins externes suggèrent des commandes issues de l’historique et mettent en évidence les commandes pendant leur saisie ; suivez les instructions d’installation de chaque dépôt.
Ajouter Powerlevel10k et sa police
Powerlevel10k est le thème Zsh que j’utilise.
Il affiche le répertoire de travail, l’état Git et l’environnement Python actif dans le
prompt, et fournit un assistant de configuration interactif. Installez-le pour Oh My
Zsh, puis sélectionnez le thème dans ~/.zshrc :
(
set -e
p10k_dir="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
if [ -L "$p10k_dir" ]; then
printf 'Refusing symlink destination: %s\n' "$p10k_dir" >&2
exit 1
fi
if [ -d "$p10k_dir/.git" ] && [ "$(git -C "$p10k_dir" rev-parse HEAD)" = 35833ea15f14b71dbcebc7e54c104d8d56ca5268 ]; then
exit 0
fi
test ! -e "$p10k_dir"
p10k_parent="$(dirname "$p10k_dir")"
mkdir -p "$p10k_parent"
stage="$(mktemp -d "$p10k_parent/.pinned-p10k.XXXXXX")"
cleanup_stage() { rm -rf "$stage"; }
trap cleanup_stage EXIT
git clone --filter=blob:none --no-checkout https://github.com/romkatv/powerlevel10k.git "$stage/repo"
git -C "$stage/repo" checkout --detach 35833ea15f14b71dbcebc7e54c104d8d56ca5268
test "$(git -C "$stage/repo" rev-parse HEAD)" = 35833ea15f14b71dbcebc7e54c104d8d56ca5268
test ! -L "$p10k_dir"
mv -h -n "$stage/repo" "$p10k_dir"
test ! -e "$stage/repo"
test "$(git -C "$p10k_dir" rev-parse HEAD)" = 35833ea15f14b71dbcebc7e54c104d8d56ca5268
)
Le commit Powerlevel10k épinglé est référencé par la release v1.20.0.
Les identifiants d’objet Git ci-dessus empêchent toute dérive silencieuse de version après leur obtention ; ils n’authentifient pas à eux seuls le mainteneur. Ces commandes font confiance au endpoint HTTPS de GitHub et aux comptes associés aux dépôts. Pour un modèle de confiance plus robuste, vérifiez un tag ou un commit signé avec une clé de mainteneur obtenue séparément avant de mettre le checkout préparé en place.
ZSH_THEME="powerlevel10k/powerlevel10k"
Ouvrez un nouveau shell et exécutez p10k configure.
Si vous utilisez le terminal intégré de VS Code, installez la police recommandée avant de définir la police du terminal, afin que les icônes Powerlevel10k s’affichent correctement. p10k configure peut installer automatiquement la police dans iTerm2. Pour les autres terminaux, téléchargez et installez les quatre fichiers TTF du guide des polices Powerlevel10k.
Dans VS Code, définissez la police du terminal sur MesloLGS NF :
- Ouvrez les paramètres de votre éditeur.
- Recherchez
terminal.integrated.fontFamily. - Définissez sa valeur sur
MesloLGS NF.
Choisir les éditeurs et les assistants AI
Je garde un IDE ouvert et un ou deux outils AI à côté.
IDE
- Cursor est un fork de VS Code qui intègre le pair programming avec AI.
- VS Code dispose d’un catalogue d’extensions plus vaste.
Assistants AI
- OpenAI Codex est l’agent de code d’OpenAI.
- Claude est l’assistant d’Anthropic, vers lequel je me tourne pour les tâches plus difficiles.
Aujourd’hui, j’utilise Cursor avec Codex et Claude Code exécutés en parallèle.
Choisir les conteneurs et les outils de modèles locaux
Les outils restants dépendent du travail que je prévois d’effectuer sur la machine :
- GitHub Desktop, lorsque je ne veux pas passer par la CLI.
- Docker Desktop, le runtime de conteneurs que j’utilise.
- Podman Desktop, une alternative à Docker Desktop.
- Ollama ou LM Studio, pour exécuter des LLMs localement sur le Mac.
Docker Desktop et les exécuteurs de modèles locaux sont des choix indépendants. Installez-les lorsque vos projets nécessitent des conteneurs ou de l’inférence locale ; la configuration du shell et de Python ne dépend ni de l’un ni de l’autre.
Documenter les limites de la configuration
Il s’agit d’une configuration personnelle, et non d’une base macOS minimale ou universelle. Supprimez ce que vous n’utilisez pas. Elle consigne les révisions d’amorçage et les releases de plugins vérifiées, mais les formules Homebrew et les applications GUI continuent d’évoluer. Les principes que je conserve sont les suivants :
- Utiliser le
/bin/zshfourni avec le système, sauf si un projet nécessite une version précise plus récente de Zsh. - Utiliser uv pour l’installation quotidienne de Python et les environnements de projet ; conserver pyenv pour les interpréteurs CPython compilés depuis les sources ou personnalisés.
- Documenter les commandes d’installation, les dotfiles sans secrets, les extensions de l’éditeur et les emplacements des modèles afin que la prochaine configuration soit mécanique.