codex: command not found — 7 решений для npm install -g @openai/codex

codex: command not found — 7 решений для npm install -g @openai/codex

“codex: command not found” прямо сейчас? Диагностика за 30 секунд

Выполните три команды по порядку. Первая, что вернёт неожиданный результат, укажет на нужное решение.

node --version          # ожидается v16.x или выше (рекомендуется LTS)
which codex             # ожидается реальный путь, например /Users/you/.npm-global/bin/codex
npm prefix -g           # ожидается префикс, в /bin которого должен лежать codex
РезультатЧто это значитКуда идти
node не найденNode.js вообще не установлен или NVM не загрузилсяFix 2 (NVM) или Fix 6 (версия Node)
node < v16Codex CLI 0.137.0 не установится — engines.node: ">=16"Fix 6
which codex пустоБинарь есть, но не в PATHFix 1 (PATH)
npm prefix -g возвращает чужой путьnpm пишет в каталог, принадлежащий sudoFix 5 (sudo / EACCES)
Все три выглядят корректно, а codex всё равно падаетЗапуск идёт из Codex Desktop, Volta или не-интерактивной оболочкиFix 4 (Volta), Fix 7 (Codex Desktop)

Самая частая причина — Fix 1: в PATH отсутствует глобальная директория bin от npm. Остальные шесть закрывают длинный хвост случаев. Все проверены на Codex CLI 0.137.0 (релиз от 2026-06-04) под macOS 14, Ubuntu 24.04 и Windows 11 + WSL2.

Про саму установку — выбор между npm, Homebrew и бинарным релизом, а также подключение Codex к OpenAI-совместимому провайдеру — см. Codex CLI: настройка API и подключение провайдеров (2026). Эта статья предполагает, что установка прошла без ошибок и вы застряли на следующем шаге — command not found.

Почему это происходит: поверхность установки Codex CLI

Codex CLI поставляется как Rust-бинарь, обёрнутый в npm-пакет. Обёртка при установке делает три вещи:

  1. Скачивает подходящий под платформу бинарь в node_modules/@openai/codex/
  2. Создаёт тонкий шим в <npm-prefix>/bin/codex, который запускает бинарь
  3. Проверяет engines.node >= 16 и отказывается ставиться иначе (по полю engines опубликованного пакета на npm registry)

Любой из этих трёх шагов может пройти успешно, а codex всё равно не найдётся из оболочки:

  • Шаг 2 удался, но PATH неверныйcommand not found, хотя шим лежит на диске
  • Менеджеры версий вроде NVM привязывают <npm-prefix> к версии Node → шим codex существует только под той версией Node, в которой шла установка
  • Встроенная оболочка Codex Desktop не интерактивна → она не подгружает ~/.zshrc, значит NVM не инициализируется, значит префикс неправильный, значит PATH неправильный (issue #13566, #14016)
  • sudo npm install -g создаёт файлы с владельцем root → последующие установки без sudo падают с EACCES, а частичные состояния оставляют старый шим Codex эпохи Node.js, указывающий на устаревший путь

Решения ниже закрывают каждый маршрут через этот лабиринт.

Fix 1: в PATH нет глобальной директории bin от npm

Самая частая причина. Диагностика — две команды:

npm prefix -g
echo $PATH | tr ':' '\n' | grep "$(npm prefix -g)/bin" || echo "NOT ON PATH"

Если вторая команда напечатала NOT ON PATH — это и есть баг. Шим лежит в <prefix>/bin/codex, но оболочка туда не смотрит.

Сначала получите префикс один раз — не вставляйте $(npm prefix -g) в экспорт PATH. Эта подоболочка запускается при каждом открытии терминала и добавляет 60–200 мс к старту без всякой пользы. Скопируйте путь сейчас как литеральную строку и впишите этот литерал в rc-файл.

PREFIX=$(npm prefix -g)
echo "$PREFIX"   # скопируйте литеральный путь — он понадобится ниже

Решение для zsh (дефолт macOS со времён Catalina)

# Замените /Users/you/.npm-global на литеральный путь, который только что напечатали
echo 'export PATH="/Users/you/.npm-global/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
which codex      # теперь должен вернуть реальный путь
codex --version  # проверка

Решение для bash (большинство дистрибутивов Linux)

echo 'export PATH="/home/you/.npm-global/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
which codex

Решение для fish

fish_add_path /Users/you/.npm-global/bin
which codex

Почему npm bin -g больше не работает

Если скопировали ответ со Stack Overflow 2023 года, там скорее всего советовали export PATH=$PATH:$(npm bin -g). Эту команду убрали в npm 9, и сейчас она бесполезна. npm prefix -g возвращает родительский каталог; /bin дописывайте сами.

Что должно получиться после исправления

$ which codex
/Users/you/.npm-global/bin/codex
$ codex --version
codex-cli 0.137.0

Если which codex отрабатывает, а запуск codex всё равно падает с command not found — у вас старая сессия оболочки, откройте новый терминал. Изменения PATH не распространяются на уже открытые оболочки.

Fix 2: NVM установил Codex под не той версией Node

NVM привязывает глобальный префикс npm к каждой установленной версии Node. Поставили @openai/codex под Node 20, переключились на Node 18 для другого проекта — и codex исчез.

Проверка привязки:

nvm current                      # на каком Node сейчас?
ls "$(npm prefix -g)/bin/codex"  # существует под текущим Node?
nvm use 22 && which codex        # работает здесь?
nvm use 20 && which codex        # падает здесь?

Если последние две строки подтвердили привязку, исправьте раз и навсегда:

# Зафиксировать дефолтную версию Node (рекомендуется LTS)
nvm alias default 20

# Переустановить Codex под этой версией
nvm use default
npm install -g @openai/codex

Если приходится постоянно переключать версии Node, добавьте nvm use default в начало ~/.zshrc, чтобы каждая новая оболочка стартовала на дефолтном Node:

# В начало ~/.zshrc, после загрузки nvm.sh
nvm use default --silent

Менее очевидная ловушка: nvm install-latest-npm

Запуск nvm install-latest-npm после установки Codex способен сломать шим — новый npm переписывает глобальный префикс и оставляет существующие шимы сиротами. Переустанавливайте Codex после каждого обновления npm.

Fix 3: задайте префикс npm с владельцем-пользователем, чтобы избежать EACCES и плавающего PATH

Самая чистая схема на macOS и Linux — направить npm в директорию, принадлежащую пользователю. Это убирает sudo, убирает жалобы на права PATH и даёт один стабильный префикс, который не меняется вместе с версиями Node (когда не используется NVM).

mkdir -p ~/.npm-global
npm config set prefix ~/.npm-global
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

# Переустановка (на этот раз без sudo, в новый префикс)
npm install -g @openai/codex

which codex      # /Users/you/.npm-global/bin/codex

Чем это лучше, чем sudo npm install -g

sudo пишет в /usr/local/lib/node_modules с владельцем root. Отсюда два сценария поломки:

  1. Будущий npm install -g без sudo упадёт с EACCES: permission denied, mkdir '/usr/local/lib/node_modules/@openai'
  2. Обновление Codex создаёт частично root-овые файлы, которые мешаются с пользовательскими, и codex начинает указывать на наполовину записанный бинарь

Подход с пользовательским префиксом пропускает оба сценария. Официальная документация npm рекомендует эту схему с 2019 года.

Миграция с пакетов, поставленных через sudo

Если уже есть глобальные пакеты под sudo, перед переключением приберитесь:

sudo npm uninstall -g @openai/codex          # удалить root-овую версию
npm config set prefix ~/.npm-global          # перенацелить
npm install -g @openai/codex                 # переустановить без sudo

Fix 4: Volta или asdf перехватили шим codex

Volta и asdf — альтернативные менеджеры версий, которые перехватывают команду codex и пропускают её через собственный слой шимов. Когда этот слой рассинхронизирован — например, Volta не зафиксировала версию Node для текущего проекта — codex возвращает command not found, хотя бинарь лежит в node_modules.

Volta

volta which node                 # какой Node выбирает Volta здесь?
volta install node@20            # зафиксировать Node 20 LTS глобально
volta install @openai/codex      # пусть Volta управляет шимом
which codex                      # должен резолвиться под ~/.volta/bin

volta install <package> (а не npm install -g) — канонический способ добавлять глобальные инструменты, когда Volta активна. Если смешать npm install -g и volta install, поведение становится непредсказуемым; выберите один путь на машину.

asdf

asdf требует asdf reshim nodejs после установки нового глобального npm-пакета. Без reshim codex отсутствует в PATH, хотя установка прошла:

asdf install nodejs 22.12.0
asdf global nodejs 22.12.0
npm install -g @openai/codex
asdf reshim nodejs               # шаг, который большинство забывает
which codex

Fix 5: macOS EACCES — починить права npm без sudo

Если в ошибке установки попадаются строки:

npm ERR! Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/@openai'
npm ERR! errno EACCES
operation rejected by your operating system

…значит, ловушка с sudo сработала. Правильное решение — не повторять с sudo. Правильное решение — перейти на схему с пользовательским префиксом из Fix 3 либо, если префикс обязан остаться в /usr/local, передать владение текущему пользователю:

sudo chown -R $(whoami) $(npm prefix -g)/lib/node_modules
sudo chown -R $(whoami) $(npm prefix -g)/bin
sudo chown -R $(whoami) $(npm prefix -g)/share

Этот разовый chown позволит npm install -g без sudo проходить и дальше под текущим пользователем. Перезапустите установку:

npm install -g @openai/codex
which codex

Gatekeeper macOS блокирует бинарь

Отдельный сценарий на macOS 14+: Gatekeeper блокирует неподписанный бинарь Codex при первом запуске, и появляется общий диалог “cannot be opened because it is from an unidentified developer” вместо command not found. Разрешите запуск через System Settings → Privacy & Security → “Open Anyway”, после чего codex --version отработает.

Fix 6: версия Node.js ниже планки engines

Опубликованное значение engines.node для Codex CLI 0.137.0 — ">=16" (проверено по npm registry). Это формальная нижняя граница: Node 14 и старше отклоняются на этапе установки. Сам Node 16 достиг end-of-life в апстриме в сентябре 2023, поэтому практическая рекомендация — Node 20 LTS или новее; Node 22 LTS подходит, но не обязателен.

$ node --version
v14.21.3
$ npm install -g @openai/codex
npm warn EBADENGINE Unsupported engine {
  package: '@openai/[email protected]',
  required: { node: '>=16' },
  current: { node: 'v14.21.3', npm: '6.14.18' }
}
# установка "проходит" с --force, но шим может запускаться некорректно

Обновить Node по-человечески

Правильный путь зависит от того, как Node ставился. Рекомендации ориентированы на Node 20 LTS как практический дефолт; подставьте node@22 или любую LTS-линейку >=16 на свой вкус.

  • macOS (Homebrew): установите нужную версию явно перед линковкой — brew link node@20 падает с No such keg, если этот keg никогда не ставился. Запустите brew install node@20 && brew link --overwrite --force node@20.
  • macOS (официальный установщик): скачайте Node 20 LTS (или 22 LTS) с nodejs.org, запустите .pkg, перезапустите терминал.
  • Linux (NodeSource): curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash - && sudo apt install -y nodejs
  • NVM (любая ОС): nvm install 20 && nvm alias default 20 && nvm use default
  • Windows: скачайте официальный .msi с nodejs.org и переустановите

После обновления переустановите Codex CLI под новой версией Node — шим привязан к версии, старый мёртв:

npm install -g @openai/codex
codex --version

Fix 7: баг не-интерактивной оболочки в Codex Desktop (issues #13566, #14016)

Этот случай задевает тех, у кого Codex CLI отлично работает в обычном терминале, но падает внутри приложения Codex Desktop или расширения Codex для VS Code. Точная ошибка во встроенной оболочке:

zsh: command not found: node
zsh: command not found: codex

…хотя те же команды работают в обычном окне терминала.

Корневая причина

Codex Desktop запускает команды через не-login, не-интерактивную оболочку. Такие оболочки не подгружают ~/.zshrc и ~/.bashrc. NVM, fnm и Volta полагаются на код инициализации, который живёт именно в этих файлах, поэтому PATH остаётся пустым.

Обе issue открыты на момент 2026-06-04:

Обход A: поставить Node через официальный установщик вместо менеджера версий (рекомендуется)

Самое чистое решение на машине, где запускается Codex Desktop, — полностью обойти менеджеры версий. Поставьте Node 20 LTS (или 22 LTS) с nodejs.org, он пишет в /usr/local/bin (macOS/Linux) или C:\Program Files\nodejs (Windows). Эти пути есть в системном PATH для любой оболочки — login или нет, интерактивной или нет. Переустановите Codex под официальным Node — и Codex Desktop его сразу находит.

Именно этот обход сейчас рекомендуют мейнтейнеры OpenAI пользователям, столкнувшимся с #13566 и #14016.

Обход B: оставить NVM, но настроить так, как задумано в NVM

В README проекта NVM перечислены ровно четыре файла, где поддерживается его бутстрап: ~/.zshrc, ~/.bashrc, ~/.bash_profile, ~/.profile. Не переносите загрузчик NVM в ~/.zshenv — даже если это “починит” Codex Desktop, ~/.zshenv подгружается каждым процессом Zsh, включая cron-задачи, git-хуки, скрипты, запускаемые другими приложениями, и индексаторы Spotlight. Загрузка NVM во всём этом добавляет 60–200 мс на каждый запуск и способна тонко ломать скрипты, которые ждут системный Node, а получают шим NVM.

Если без NVM никак, безопаснее запускать сам Codex Desktop из login-оболочки — например, через лаунчер, который выполняет zsh -l -c "open -a 'Codex'" вместо клика по иконке. Login-оболочка подгрузит ~/.zprofile (который может цепляться к ~/.zshrc и поднимать NVM), а дочерние процессы унаследуют заполненный PATH.

Обход C: нативная оболочка WSL

На Windows + WSL переключите настройку терминала Codex Desktop на прямой запуск wsl.exe -d Ubuntu вместо Windows-оболочки Codex. Bash в WSL наследует PATH из собственного ~/.bashrc, который загружает NVM.

Типичные сценарии падений из недавних issue Codex

Срез повторяющихся обращений класса command not found в openai/codex за последние 60 дней:

IssueСимптомКорневая причинаРешение
#13566zsh: command not found: node в Codex Desktop, в терминале всё окНе-интерактивная оболочка не подгружает .zshrc → NVM не инициализируетсяFix 7, обход A (официальный установщик Node)
#14016npm isn't available in this shell path на Windows + fnmШимы fnm отсутствуют в системном PATHFix 7, обход A (официальный установщик Node)
#10342npm install -g @openai/codex → “operation rejected by your operating system”Конфликт прав sudo на macOSFix 5 (префикс под пользователем)
#1480 (закрыта)EACCESS permission issue при глобальной установкеГлобальный префикс npm принадлежит rootFix 3 + Fix 5
#9356 (закрыта)Сам codex предлагает npm install -g codex (неверное имя)Закэширована старая документация; корректное имя — @openai/codexПроверить имя пакета; переустановить под scoped-именем
#18485Глобальная установка падает на свежих системахNode < 16 (планка engines) либо Node вовсе не установленFix 6
#20206failed to start codex app-server (os error 3) на WindowsDesktop-приложение не может найти бинарь CLI по пути WindowsAppsПереустановить через официальный установщик; удалить версию из Microsoft Store

Если симптом совпадает с одной из issue, переходите прямо к указанному выше решению.

Когда ни одно решение не сработало: альтернативы, которые работают сейчас

Если все семь решений отработаны, а codex всё равно не находится, три запасных выхода позволят продолжать работу прямо сегодня.

Запустить Codex из бинарного релиза GitHub (Node не требуется)

Репозиторий Codex публикует бинари для платформ по адресу github.com/openai/codex/releases. Скачать, распаковать и положить в директорию, уже находящуюся в PATH:

# Пример для macOS arm64
curl -L -o codex.tar.gz https://github.com/openai/codex/releases/latest/download/codex-aarch64-apple-darwin.tar.gz
tar -xzf codex.tar.gz
sudo mv codex /usr/local/bin/codex
chmod +x /usr/local/bin/codex
codex --version

Это полностью обходит npm. Если command not found блокирует демо клиенту, это пятиминутный аварийный выход.

Запускать Codex через npx, пока не дойдут руки до PATH

npx -y @openai/codex --version
npx -y @openai/codex

npx резолвит пакет напрямую из node_modules и никогда не полагается на PATH. Это медленнее (каждый запуск перепроверяет пакет), зато подтверждает корректность самой установки и изолирует проблему до PATH.

Направить Codex через OpenAI-совместимого провайдера, чтобы можно было менять клиента

Если идёт сравнение Codex с другими терминальными coding-агентами, направьте всех на один OpenAI-совместимый эндпоинт и сравнивайте. OfoxAI предоставляет единый base URL https://api.ofox.ai/v1, который принимают Codex CLI, Cursor, Cline и OpenClaw; если установка Codex упорно падает, можно работать через Claude Code или OpenClaw с теми же моделями по тому же ключу, пока идёт отладка.

⚠️ Codex 0.137.0 принимает только wire_api = "responses". Старое значение wire_api = "chat" убрано; передача его сейчас вызывает CHAT_WIRE_API_REMOVED_ERROR ещё на этапе загрузки конфига, до первого запроса. Это делает выбор шлюза принципиальным: шлюз, реализующий только /v1/chat/completions, не заработает с актуальным Codex, как бы ни выглядел конфиг. Проверьте, что выбранный шлюз публично документирует поддержку Responses API — в документации OfoxAI есть ссылки на протокол OpenAI Responses — и подтвердите реальным ключом до того, как опираться на него в продакшене.

# ~/.codex/config.toml — когда Codex наконец запустится
# Заметка: имя секции ниже ("ofoxai-codex") — это локальная метка для *этой*
# установки Codex, а не название продукта OfoxAI. Можно выбрать любое имя,
# главное чтобы `model_provider` совпадал с заголовком [model_providers.<метка>].

model_provider = "ofoxai-codex"

[model_providers.ofoxai-codex]
name = "Ofox AI"
base_url = "https://api.ofox.ai/v1"
env_key = "OFOXAI_API_KEY"
wire_api = "responses"   # единственное значение, которое принимает Codex 0.137.0

Полная конфигурация после того, как бинарь окажется в PATH, разобрана в гайде по кастомным провайдерам Codex CLI.

Нативный Windows (не WSL): особые случаи

Codex CLI работает на нативной Windows, но поверхность установки там грязнее, чем на macOS или Linux. На три специфичных для Windows сценария приходится большинство обращений с command not found.

%APPDATA%\npm отсутствует в User PATH

На Windows npm install -g пишет шим в %APPDATA%\npm\codex.cmd (.cmd-шим плюс соседний shell-скрипт). PowerShell и cmd.exe находят его, только если %APPDATA%\npm есть в переменной окружения User PATH, а не только в PATH текущей сессии.

# Проверить, есть ли путь npm в User PATH
[Environment]::GetEnvironmentVariable("Path", "User") -split ';' | Where-Object { $_ -like '*\npm*' }

# Если пусто — добавить:
$current = [Environment]::GetEnvironmentVariable("Path", "User")
[Environment]::SetEnvironmentVariable("Path", "$current;$env:APPDATA\npm", "User")

После этого закройте все терминалы — изменения PATH применяются только к новым процессам.

Node.js из Microsoft Store против официального установщика

Если Node поставлен из Microsoft Store, глобальный префикс npm живёт под %LOCALAPPDATA%\Packages\<store-id>\ вместо %APPDATA%\npm. Этот упакованный путь read-only для большинства процессов и по умолчанию отсутствует в PATH. Симптом: npm install -g @openai/codex отрабатывает, а where.exe codex ничего не возвращает.

Решение: удалить Store-версию, поставить официальный .msi с nodejs.org и переустановить Codex. Store-версия Node к тому же ломает разрешение app-server у Codex Desktop (issue #20206).

Смешанные Node из WSL и Windows

Параллельная работа node в WSL и node.exe в Windows приводит к коллизиям PATH, когда одна из оболочек подхватывает не тот Codex. Выберите одну сторону на проект. Если проект лежит в /home/<you>/projects/ (файловая система WSL), ставьте Codex в WSL. Если в C:\Users\<you>\projects\ — ставьте Codex в Windows. Кросс-файловые запуски — это медленный путь, который поверх неоднозначности PATH ещё и теряет события файловых watcher’ов.

Командная / мультиразработческая настройка

Соло-разработчик может разово поправить PATH и забыть про command not found. Команды так не могут — каждый новый участник упирается в ту же стену, а CI-раннеры — на каждой свежей сборке контейнера. Масштабируются два паттерна.

Паттерн 1: зафиксировать Codex в dev-контейнере

Закодифицируйте установку в Dockerfile, который команда коммитит в репозиторий. Каждый контрибьютор и каждая CI-задача стартуют с одного образа:

FROM node:22-bookworm

# Зафиксировать Codex CLI на известной рабочей версии
RUN npm install -g @openai/[email protected]

# Health-check на этапе сборки образа — падать громко, если установка не дала бинаря
RUN codex --version

# Дефолтная рабочая директория для команды
WORKDIR /workspace

В связке с .devcontainer/devcontainer.json это даёт каждому участнику команды рабочий codex без раскопок в PATH на каждой машине.

Паттерн 2: общий bootstrap-скрипт

Для команд, которые сопротивляются контейнерам, один bootstrap-codex.sh в репозитории заменяет семь тредов в Slack:

#!/usr/bin/env bash
set -euo pipefail

# Проверить Node 16+ (нижняя граница Codex 0.137.0; командный стандарт — 20 LTS)
if ! node -e "process.exit(process.versions.node.split('.')[0] >= 16 ? 0 : 1)"; then
  echo "ERROR: Codex CLI requires Node 16+. Install via nvm: nvm install 20"
  exit 1
fi

# Проверить, что префикс npm принадлежит пользователю (без sudo)
PREFIX=$(npm prefix -g)
if [[ ! -w "$PREFIX/bin" ]]; then
  echo "ERROR: npm prefix $PREFIX is not writable. Run: npm config set prefix ~/.npm-global"
  exit 1
fi

# Проверить, что префикс есть в PATH
if ! echo "$PATH" | tr ':' '\n' | grep -q "^$PREFIX/bin$"; then
  echo "WARN: $PREFIX/bin is not on PATH. Add: export PATH=\"$PREFIX/bin:\$PATH\""
fi

npm install -g @openai/[email protected]
codex --version

Скрипт подсвечивает каждый сценарий падения до установки, а не после.

Когда стало только хуже: чистка

Несколько попыток установки с замесом sudo / nvm / Volta могут оставить машину в состоянии, где ничего не работает, потому что шимы и node_modules расходятся. Сбросить начисто:

# Удалить все варианты установки Codex
npm uninstall -g @openai/codex 2>/dev/null || true
sudo npm uninstall -g @openai/codex 2>/dev/null || true
volta uninstall @openai/codex 2>/dev/null || true

# Снести устаревшие шимы (подставьте свои префиксы)
rm -f "$(npm prefix -g)/bin/codex" 2>/dev/null || true
rm -f /usr/local/bin/codex 2>/dev/null || true
rm -f ~/.npm-global/bin/codex 2>/dev/null || true

# Снести конфиг Codex (это сбросит login-состояние; сделайте бэкап, если нужно)
mv ~/.codex ~/.codex.bak 2>/dev/null || true

# Переустановить с нуля
npm install -g @openai/[email protected]
codex --version

После чистки пройдитесь по Fix 1 — Fix 7 по порядку. Состояние свежей установки делает каждую диагностическую команду тем, что она и должна показывать.

Как мониторить установку Codex (и оставаться в актуальной версии)

Codex выпускает новую версию примерно раз в неделю — 0.137.0 вышла 2026-06-04. Несколько привычек удержат command not found от возвращения.

Зафиксировать версию в Brewfile или Dockerfile

Для командных схем фиксируйте установку, а не оставляйте npm install -g дрейфовать:

# Фрагмент Dockerfile для dev-контейнера
FROM node:22-bookworm
RUN npm install -g @openai/[email protected]
ENV PATH="/usr/local/bin:${PATH}"
CMD ["codex"]

Закреплённая версия в контейнере — это один и тот же Codex у каждого разработчика без раскопок PATH на каждой машине.

Следить за changelog

В официальном changelog перечислены все релизы. Исправления установки приземляются в строки install.sh / install.ps1 — свежий пример: в 0.136.0 добавили CODEX_NON_INTERACTIVE=1 для headless-установок.

Health-check скрипт

Сохраните как ~/bin/codex-health.sh и запускайте, когда PATH вызывает подозрения:

#!/usr/bin/env bash
set -e
echo "Node:        $(node --version 2>/dev/null || echo MISSING)"
echo "npm:         $(npm --version 2>/dev/null || echo MISSING)"
echo "npm prefix:  $(npm prefix -g 2>/dev/null || echo MISSING)"
echo "codex on \$PATH? $(which codex 2>/dev/null || echo NO)"
echo "codex version:  $(codex --version 2>/dev/null || echo NOT RUNNING)"

Три падающих строки точно укажут, какое из решений выше применять.

FAQ

Блок faq во frontmatter держит канонические ответы; вопросы там повторяют Google’s People Also Ask по codex command not found и смежным запросам. Просмотрите их — там разобраны вопрос про префикс npm, вопрос про sudo, вопрос про привязку NVM, баг Codex Desktop, требования к версии Node, вопрос про Homebrew, вопрос про %APPDATA%\npm на Windows и различие между npx и бинарём.

Источники, проверенные при подготовке материала