Configuración de un MacBook para AI Engineering: herramientas y flujo de trabajo en macOS
Traducción automática Este artículo se tradujo automáticamente a partir de la versión original en inglés.
Esta es la configuración que aplico a un MacBook recién estrenado antes de trabajar en AI engineering. Incluye las herramientas de línea de comandos que macOS no incorpora, Homebrew, Python con uv, el shell, las opciones de terminal y editor, Docker y las herramientas de AI locales.
La distinción útil está entre los fundamentos necesarios y las preferencias personales. Xcode Command Line Tools, Homebrew, Git y un flujo de trabajo con Python son fundamentos. Warp, iTerm2, Powerlevel10k, Cursor y los ejecutores de modelos locales son elecciones. Los comandos siguientes instalan los fundamentos; las secciones posteriores documentan las elecciones que hago sobre ellos. Esta es una secuencia de configuración documentada, no una imagen de máquina reproducible bit a bit.
Instalar los fundamentos de macOS
Empieza por las herramientas de línea de comandos de Apple:
xcode-select --install
macOS abrirá un diálogo que te guiará durante la instalación.
Homebrew es el gestor de paquetes que utilizo para el resto de esta configuración:
Descarga el instalador en una revisión revisada, verifica su digest, inspecciónalo y ejecuta después la copia local:
(
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"
)
La guía de instalación de Homebrew explica los cambios y los prefijos predeterminados. En Apple Silicon, Homebrew utiliza /opt/homebrew. Ejecuta el comando brew shellenv que se muestra al final para que brew esté disponible en el shell actual. El instalador también puede configurar el prefijo de Homebrew para futuros shells de login. El commit fijado y el SHA-256 cubren el archivo de bootstrap; actualízalos conjuntamente después de revisarlos. Homebrew es un gestor de paquetes rolling, por lo que los comandos brew install posteriores seguirán resolviendo las versiones de las fórmulas disponibles en ese momento.
Instala las herramientas de línea de comandos que utilizo habitualmente:
brew install openssl readline sqlite3 xz zlib uv htop gitmoji pandoc ncdu tmux
Los paquetes se dividen en tres grupos:
- openssl, readline, sqlite3, xz y zlib proporcionan librerías para cargas de trabajo habituales de Python y de línea de comandos.
- uv gestiona versiones de Python, entornos, dependencias, comandos y lockfiles.
- htop, tmux, ncdu, gitmoji y pandoc cubren la monitorización de procesos, las sesiones de terminal, la inspección del disco, el formato de commits y la conversión de documentos.
Usar uv para el trabajo diario con Python
Antes de adoptar uv, utilizaba pyenv para gestionar los entornos de Python. Ahora uv cubre mi flujo de trabajo diario. Instala la versión más reciente de Python gestionada por uv:
uv python install
Esto instala la versión más reciente disponible para uv en el momento de la configuración. Para una versión específica del proyecto, utiliza el flujo de trabajo de pinning de mi guía rápida para gestionar Python en macOS con uv.
Instala pyenv por separado solo cuando necesites su método de compilación desde código fuente:
brew install pyenv
Utilizo pyenv cuando necesito un intérprete compilado desde código fuente o unas opciones de compilación de CPython personalizadas que las distribuciones precompiladas de uv no ofrecen. Elimina pyenv de la lista de plugins de shell que aparece más abajo si omites esta instalación opcional.
Elegir un terminal
El Terminal predeterminado de macOS es suficiente. Durante años utilicé iTerm2, pero recientemente me he pasado a Warp, un terminal basado en Rust con funciones de AI integradas. Esta elección no afecta a la configuración posterior.
Si sigues utilizando iTerm2, estos son los dos ajustes que cambio:
Activar la edición de texto natural
- Abre Preferences → Profiles → Keys → Key Mappings.
- Abre el desplegable Presets…
- Selecciona “Natural Text Editing”.
Elegir un tema de color
- Consulta los temas en iTerm2-Color-Schemes.
- Abre Preferences → Profiles → Colors → Color Presets…
- Selecciona Import y elige el tema descargado.
Configurar Zsh
macOS utiliza Zsh como shell de login predeterminado. Utilizo el /bin/zsh incluido; instala el Zsh de Homebrew solo cuando necesites una versión upstream más reciente concreta.
Comprueba el Zsh instalado y el shell de login actual:
echo "$SHELL"
command -v zsh
zsh --version
Si Zsh está instalado, pero no está seleccionado como shell de login, cambia a la copia incluida:
chsh -s /bin/zsh
Abre un terminal nuevo después de cambiar el shell de login.
Oh My Zsh añade los valores predeterminados y el sistema de plugins que utilizo. Su instalador estándar sigue una rama que cambia con el tiempo. Para una configuración fijada, clona sin hacer checkout de esa rama, selecciona el commit revisado y copia después la plantilla:
(
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"
)
El bloque se detiene antes de reemplazar .zshrc si falla el clonado o la verificación del commit. Rechaza symlinks y archivos que no sean regulares, hace una copia de seguridad del archivo existente con un nombre .zshrc.pre-oh-my-zsh.* único y lo reemplaza por una copia temporal verificada mediante un único rename. Compara la copia de seguridad mostrada con la plantilla y restaura tus ajustes locales antes de abrir un shell nuevo. El checkout está fijado al commit 4b65740; actualiza el hash solo después de revisar una revisión más reciente.
Ejecuta los fragmentos de configuración del shell desde un único shell de configuración, sin que ningún otro proceso edite .zshrc ni los destinos de plugins y temas. Rechazan destinos existentes o enlazados mediante symlinks, pero no son un gestor de paquetes multiproceso.
Añadir plugins
Instala zsh-autosuggestions y zsh-syntax-highlighting en el directorio de plugins personalizado de 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"
El commit de zsh-autosuggestions y el commit de zsh-syntax-highlighting fijados corresponden a las versiones publicadas v0.7.1 y 0.8.0. Actualiza los hashes solo después de revisar una versión más reciente.
Edita ~/.zshrc para cargarlos junto con los plugins que utilizo:
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
)
Mantén zsh-syntax-highlighting en último lugar dentro del array. La wiki de plugins de Oh My Zsh describe los plugins incluidos. Los dos plugins externos sugieren comandos del historial y resaltan los comandos mientras los escribes; sigue las instrucciones de instalación de cada repositorio.
Añadir Powerlevel10k y su fuente
Powerlevel10k es el tema de Zsh que utilizo. Muestra el directorio de trabajo, el estado de Git y el entorno de Python activo en el prompt, y ofrece un asistente de configuración interactivo. Instálalo para Oh My Zsh y selecciona después el tema en ~/.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
)
El commit de Powerlevel10k fijado aparece referenciado por la versión v1.20.0.
Los identificadores de objetos de Git anteriores evitan cambios de versión silenciosos después de obtenerlos; por sí solos no autentican al mantenedor. Estos comandos confían en el endpoint HTTPS de GitHub y en las cuentas que mantienen los repositorios. Para un modelo de confianza más sólido, verifica un tag o commit firmado con una clave del mantenedor obtenida por separado antes de mover el checkout preparado a su ubicación definitiva.
ZSH_THEME="powerlevel10k/powerlevel10k"
Abre un shell nuevo y ejecuta p10k configure.
Si utilizas el terminal integrado de VS Code, instala la fuente recomendada antes de configurar la fuente del terminal para que los iconos de Powerlevel10k se rendericen correctamente. p10k configure puede instalar la fuente automáticamente en iTerm2. Para otros terminales, descarga e instala los cuatro archivos TTF de la guía de fuentes de Powerlevel10k.
En VS Code, configura la fuente del terminal como MesloLGS NF:
- Abre los ajustes de tu editor.
- Busca
terminal.integrated.fontFamily. - Establécelo en
MesloLGS NF.
Elegir editores y asistentes de AI
Mantengo un IDE abierto y uno o dos AI tools al lado.
IDEs
- Cursor es un fork de VS Code con AI pair programming integrado.
- VS Code tiene un catálogo de extensiones más amplio.
Asistentes de AI
- OpenAI Codex es el coding agent de OpenAI.
- Claude es el asistente de Anthropic, al que recurro para tareas más complejas.
Actualmente utilizo Cursor con Codex y Claude Code ejecutándose en paralelo.
Elegir contenedores y herramientas de modelos locales
Las herramientas restantes dependen del trabajo que tenga previsto realizar en la máquina:
- GitHub Desktop, cuando no quiero recurrir a la CLI.
- Docker Desktop, el runtime de contenedores que utilizo.
- Podman Desktop, una alternativa a Docker Desktop.
- Ollama o LM Studio, para ejecutar LLMs localmente en el Mac.
Docker Desktop y los ejecutores de modelos locales son elecciones independientes. Instálalos cuando tus proyectos necesiten contenedores o inferencia local; la configuración del shell y de Python no depende de ninguno de los dos.
Documentar los límites de la configuración
Esta es una configuración personal, no una base mínima ni universal de macOS. Elimina lo que no utilices. Documenta revisiones de bootstrap y versiones de plugins revisadas, pero las fórmulas de Homebrew y las aplicaciones GUI siguen cambiando. Lo que mantengo constante son estos límites:
- Utiliza el
/bin/zshincluido, salvo que un proyecto necesite un Zsh más reciente específico. - Utiliza uv para la instalación diaria de Python y los entornos de proyecto; conserva pyenv para intérpretes de CPython compilados desde código fuente o personalizados.
- Mantén documentados los comandos de instalación, los dotfiles sin secretos, las extensiones del editor y las ubicaciones de los modelos para que la siguiente configuración sea mecánica.