Codex exec 入門 & JS7 連携ガイド
npx @openai/codex exec --helpまで確認してみると、非対話型実行でも--json、--output-schema、--ephemeral、--skip-git-repo-check、--output-last-messageのように自動化に適したオプションが用意されていた。
npx @openai/codex exec を、ログイン確認 → 基本操作 → 結果のファイル出力 → JS7 JobScheduler との連携、までを一本でまとめた実用ハンドブックです。コマンドは実機(Linux / ヘテムル等のサーバ・小型機)での無人実行を前提にしています。
- 対象バージョン例: OpenAI Codex v0.141.0(
codex --versionで確認) - このガイドの想定: 非対話(ワンショット)実行=
codex exec - 最終ゴール: JS7 のシェルジョブから Codex を安全に呼び出して自動化する
0. 全体像(3行で)
codex exec は「シェルから1回叩いて、答えと終了コードを返す」普通のCLIです。 だから cron でも JS7 でも、シェルジョブの中身にすれば自動化に組み込めます。 ポイントは「PATH(JS7で最頻出)」「認証」「信頼ディレクトリ」「サンドボックス権限」「結果の取り出し方」。
1. 準備 — インストールとログイン確認
1-1. 実行できるか確認
codex --version # 例: codex-cli 0.141.0
# 都度ダウンロードで使う場合は
npx @openai/codex --version
本番(JS7 など)では
npxの都度ダウンロードを避け、バージョン固定でグローバル導入しておくのが安定です。npm install -g @openai/codex@0.141.0
1-2. ログイン状態を確認
codex login status
-
Logged in using ChatGPT→ ChatGPT アカウントでログイン済み。そのまま使えます。 - 何も出ない / 未ログイン → 下の「認証」へ。
1-3. 認証の2方式
| 方式 | コマンド | 向いている場面 |
|---|---|---|
| ChatGPT ログイン | codex login |
手元のPC(ブラウザが開ける環境) |
| API キー |
codex login --api-key "sk-..." または環境変数 OPENAI_API_KEY
|
サーバ・ヘッドレス・JS7 などの無人実行 |
# API キー方式(サーバ向き)
export OPENAI_API_KEY="sk-..."
# もしくは保存しておく
codex login --api-key "sk-..."
401 Unauthorized が出たら認証エラー です。コマンドの書き方ではなく、ログイン or APIキー未設定が原因。
codex login statusを確認してください。 JS7 のエージェントは別ユーザ・別環境で動くため、手元でexportしたキーは引き継がれません(→ 第5章)。
2. 基本の使い方
2-1. 最小形(質問して答えをもらう)
codex exec "CSVの欠損値をチェックするbashワンライナーを教えて"
2-2. --skip-git-repo-check(信頼ディレクトリ問題)
Codex はデフォルトで「Git リポジトリ=信頼済みディレクトリ」の中で動こうとします。 /home/user のような非リポジトリで実行すると、こう止まります。
Not inside a trusted directory and --skip-git-repo-check was not specified.
回避は2通り。
# A) その都度スキップする(手軽)
codex exec --skip-git-repo-check "こんにちは"
# B) 作業用ディレクトリを Git 管理下にしておく(おすすめ)
mkdir -p ~/codex-work && cd ~/codex-work && git init
codex exec "こんにちは" # 以降はこのフォルダ内ならフラグ不要
作業ファイル(CSV など)も ~/codex-work に置くと、読ませる・書かせるの管理が楽になります。
2-3. -o で結果(最終回答だけ)をファイルに出力
ヘッダーやトークン情報を混ぜず、エージェントの最終回答だけを取り出せます。自動化で最も使う形 です。
codex exec --skip-git-repo-check -o /tmp/out.md "こんにちは"
cat /tmp/out.md
# => こんにちは。どうしました?
2-4. 標準入力(パイプ)で渡す
既存ファイルの中身や長い指示を流し込めます。末尾の - で「stdin を読む」を明示。
cat ~/data/parts.csv | codex exec --skip-git-repo-check -s read-only \
"このCSVの欠損行を、行番号と列名つきで一覧にして" -
2-5. サンドボックス権限 -s(安全の要)
| モード | できること | 使いどころ |
|---|---|---|
read-only |
読むだけ。ファイル変更不可 | 調査・分析・チェック(まずはこれ) |
workspace-write |
作業ディレクトリ+ /tmp などに書き込み可 |
ファイル生成・修正 |
danger-full-access |
制限なし | 原則避ける。隔離環境のみ |
cd ~/data
# 読み取り専用で挙動を確認
codex exec --skip-git-repo-check -s read-only "parts.csv の欠損行を一覧にして"
# 信頼できたら書き込みに上げる
codex exec --skip-git-repo-check -s workspace-write "parts.csv の欠損を補完した parts_fixed.csv を作って"
進め方の原則: read-only で確認 → 必要なものだけ workspace-write に上げる。
2-6. よく使うオプション早見
| オプション | 意味 |
|---|---|
-m, --model <MODEL> |
使うモデルを指定(例 -m gpt-5.5) |
-C, --cd <DIR> |
作業ルートを指定(移動せず対象を変える) |
--add-dir <DIR> |
書き込み可能ディレクトリを追加 |
-o, --output-last-message <FILE> |
最終回答をファイルに出力 |
--json |
イベントを JSONL で標準出力(ログ解析・監視向き) |
--output-schema <FILE> |
最終回答の JSON 構造を固定(機械処理向き) |
--ephemeral |
セッションを保存しない |
-s, --sandbox <MODE> |
サンドボックス権限(2-5参照) |
--skip-git-repo-check |
Git リポジトリ外でも実行 |
--dangerously-bypass-approvals-and-sandbox |
確認もサンドボックスも全スキップ(隔離環境専用) |
-i, --image <FILE> |
画像を添付して質問 |
サブコマンド: codex exec resume --last(直近セッションの続き)、codex exec review(リポジトリのコードレビュー)。
3. 動作確認の手順(このガイドの実証ステップ)
実際に通った順番。困ったらここを上からなぞれば切り分けられます。
# 1) ログイン確認
codex login status # => Logged in using ChatGPT
# 2) 最小実行(信頼ディレクトリ回避)
codex exec --skip-git-repo-check "CSVの欠損値をチェックするbashワンライナーを教えて"
# 3) あいさつで疎通確認
codex exec --skip-git-repo-check "こんにちは"
# 4) 結果をファイル出力
codex exec --skip-git-repo-check -o /tmp/out.md "こんにちは"
cat /tmp/out.md
ここまで動けば、JS7 連携に必要な部品(無人実行・結果のファイル出力・終了コード)が揃っています。
4. JS7 連携の考え方
JS7 JobScheduler はエージェント上で ワークフロー内のシェルジョブ を実行します。 そのシェルジョブの中身を codex exec にするだけで、Codex をジョブ化できます。
連携の鍵は4つ。
-
無人で止まらない … 確認プロンプトが出ないようにする(
approval: never相当の設定/必要なら隔離前提のバイパス) -
認証が見える … 重要なのは「JS7 エージェントの実行ユーザが Codex の認証を見られること」。
codex login済みのユーザと同じユーザでジョブが動くなら、追加設定は不要(OPENAI_API_KEYの export も不要)。別のサービスユーザで動く場合のみ、CODEX_HOMEをそのユーザから見える認証フォルダに向ける(または API キー方式に切り替える)。 -
PATH が通る …
node/npx/codexがエージェント環境から見える。ここが JS7 連携で最頻出のつまずき(→ 第5章のプリアンブルで解決) -
結果と成否を返す …
-oで結果ファイル、終了コードで成功(0)/失敗(非0)
判定の目安:
codex loginした OS ユーザ = JS7 のジョブ実行ユーザ → 認証行は不要。違うユーザ →CODEX_HOMEを合わせるか API キーを注入。
⚠️ 最重要: codex: command not found(returnCode=127)
JS7 エージェントのシェルは ログインプロファイル(.bashrc / .profile / nvm など)を読み込まない非ログインシェル です。そのため、手元のターミナルでは動く codex も、JS7 ジョブ内では PATH に無く、こう失敗します。
[STDERR] script-xxxx.sh: line 12: codex: command not found
[End] [Error] returnCode=127, errorState=failed
codex は npm のグローバル/ユーザ配下(例 /home/user/.npm-global/bin/codex)や nvm 配下(~/.nvm/versions/node/*/bin)に入っていることが多く、その場所が JS7 のシェルから見えていないだけです。解決は「ジョブ冒頭で PATH を明示的に組み立て、codex を解決する」こと。第5章のプリアンブルをそのまま貼れば回避できます(実機 MiniPC50 / Agent で動作確認済み)。
5. JS7 シェルジョブ — 雛形
5-0. 共通プリアンブル(PATH 解決・必ず先頭に置く)
JS7 のジョブは非ログインシェルで動くため、まず codex を確実に見つける 定型処理を冒頭に置きます。以降の雛形はすべてこのプリアンブルを前提にしています。これは実機(MiniPC50 / JS7 Agent)で command not found を解消し、returnCode=0 で完走することを確認済みの形です。
#!/usr/bin/env bash
set -euo pipefail
# --- PATH 解決:JS7 はログインプロファイルを読まないので明示的に組み立てる ---
export PATH="/usr/local/bin:/usr/bin:/bin:$HOME/.local/bin:$HOME/.npm-global/bin:/usr/local/lib/node_modules/.bin:$PATH"
# nvm 配下に node/codex がある場合に備えて読み込む(無ければ無視)
[ -s "$HOME/.nvm/nvm.sh" ] && export NVM_DIR="$HOME/.nvm" && . "$HOME/.nvm/nvm.sh" >/dev/null 2>&1 || true
# nvm の node bin を PATH へ追加(存在する場合のみ)
for d in "$HOME"/.nvm/versions/node/*/bin; do [ -d "$d" ] && PATH="$d:$PATH"; done; export PATH
# codex を解決。無ければ npx @openai/codex にフォールバック
CODEX="$(command -v codex || true)"
[ -z "$CODEX" ] && command -v npx >/dev/null 2>&1 && CODEX="npx @openai/codex"
[ -z "$CODEX" ] && { echo "ERROR: codex/npx が PATH に見つかりません。PATH=$PATH" >&2; exit 127; }
echo "[INFO] using codex: $CODEX"
# 認証: codex login 済みのユーザで JS7 ジョブが動くなら追加設定は不要。
# 別ユーザで動く場合のみ CODEX_HOME を合わせる(または API キーを注入)。
ポイント:
- 以降は
codex exec ...ではなく$CODEX exec ...と書く(解決したパス/フォールバックを使う)。 -
command not found(returnCode=127)はこのプリアンブルでほぼ解消します。[INFO] using codex: /home/user/.npm-global/bin/codexのように、実際に使われたパスがログに出ます。 - もし環境が固定で分かっているなら、
export PATH=の一行に実パス(例/home/user/.npm-global/bin)を足すだけでも十分です。プリアンブルは「どこに入っていても拾う」保険版です。 - さらに堅くするなら、
npm install -g @openai/codex@0.141.0で場所を固定し、JS7 ジョブの環境変数設定で PATH をプロファイルに登録する手もあります。
5-1. 最小形
# (5-0 のプリアンブルを先頭に貼る)
RESULT="/tmp/codex-result-$$.md"
$CODEX exec --skip-git-repo-check -s read-only \
-o "$RESULT" \
"parts.csv の欠損行を行番号と列名つきで一覧にして"
# 結果を JS7 ログに残す(後続ジョブで読ませてもよい)
cat "$RESULT"
-
set -euo pipefail… 失敗時に確実に非0で終了 → JS7 のエラー分岐/通知に乗る -
認証 …
codex login済みのユーザ=ジョブ実行ユーザなら export 不要。別ユーザのときだけexport CODEX_HOME=/codex-login済みユーザの/.codexか API キーを注入 - 結果ファイル名
$$(PID)は簡易例。実運用では JS7 の実行インスタンス変数に置き換え(バージョンにより変数名が異なるため要確認) -
注意(workdir) … JS7 から起動すると作業ディレクトリは Agent 配下(例
/var/sos-berlin.com/js7/agent)になります。対象ファイルを確実に読ませるには-C /path/to/dataで作業ルートを明示するか、ジョブ内でcdしてください。
5-2. パラメータ(JS7 のオーダー変数)を差し込む
実行のたびに対象を変えたい場合、JS7 のジョブ引数を環境変数として受け取り、プロンプトに埋め込みます。
# (5-0 のプリアンブルを先頭に貼る)
# JS7 から渡される引数(例: TARGET_FILE, TARGET_CAR)
TARGET_FILE="${TARGET_FILE:-parts.csv}"
TARGET_CAR="${TARGET_CAR:-全車種}"
RESULT="/tmp/codex-${TARGET_CAR}.md"
cd /var/www/data # 対象ファイルのある場所へ
$CODEX exec --skip-git-repo-check -s read-only -o "$RESULT" \
"${TARGET_FILE} のうち ${TARGET_CAR} の適合データについて、欠損行と型番の不整合をチェックして一覧にして"
cat "$RESULT"
JS7 ではジョブ引数 / オーダー変数を環境変数として参照できます。正確な渡し方・変数名はお使いの JS7 バージョン(JOC/Agent)の仕様に合わせてください。
5-3. 成否でフローを分岐させる
#!/usr/bin/env bash
set -uo pipefail # ※ -e は付けず、終了コードを自分で扱う
# --- 5-0 と同じ PATH 解決ブロックをここに貼る(codex 解決まで) ---
export PATH="/usr/local/bin:/usr/bin:/bin:$HOME/.local/bin:$HOME/.npm-global/bin:/usr/local/lib/node_modules/.bin:$PATH"
[ -s "$HOME/.nvm/nvm.sh" ] && export NVM_DIR="$HOME/.nvm" && . "$HOME/.nvm/nvm.sh" >/dev/null 2>&1 || true
for d in "$HOME"/.nvm/versions/node/*/bin; do [ -d "$d" ] && PATH="$d:$PATH"; done; export PATH
CODEX="$(command -v codex || true)"
[ -z "$CODEX" ] && command -v npx >/dev/null 2>&1 && CODEX="npx @openai/codex"
[ -z "$CODEX" ] && { echo "ERROR: codex/npx が見つかりません。PATH=$PATH" >&2; exit 127; }
RESULT="/tmp/codex-result-$$.md"
if $CODEX exec --skip-git-repo-check -s read-only -o "$RESULT" \
"parts.csv の欠損行を一覧にして"; then
echo "OK: 結果は $RESULT"
exit 0
else
echo "Codex 実行に失敗しました" >&2
exit 1 # JS7 側でエラー扱い → 通知ジョブへ分岐
fi
JS7 ワークフロー側で、後続に「成功時=結果をメール/Slack 通知」「失敗時=管理者通知」のジョブをつなげば運用になります。
5-4. 定期実行
JS7 のカレンダー/スケジュールでこのワークフローを割り当てるだけです。例:
- 毎朝 7:00 … 商品 CSV の欠損・型番不整合チェック → 結果を担当へ通知
- 毎週月曜 … 新着記事の下書きを生成してドラフト保存
JS7 はエージェントが稼働していれば、PC のログイン状態に関係なくスケジュール実行できます。
6. 実用ユースケース例(EC / 車部品向け)
| やりたいこと | サンドボックス | プロンプト例 |
|---|---|---|
| 商品CSVの欠損・型番不整合チェック | read-only |
「parts.csv の欠損行と、型番フォーマットが不正な行を一覧にして」 |
| 適合車種データの正規化案 | read-only |
「fitment.csv のメーカー表記ゆれを検出して、統一案の対応表を作って」 |
| 修正済みCSVの生成 | workspace-write |
「上記の欠損を補完した parts_fixed.csv を作成して」 |
| 商品説明文の下書き生成 | read-only |
「products.csv の各行から、SEO向け商品説明文(200字)を生成して」 |
| 構造化データ(JSON-LD)の雛形 | read-only |
「この商品データから Product の JSON-LD を生成して」 |
生成物を本番に反映する前に、必ず人の目でレビューしてください。特に書き込み系(
workspace-write)は対象ディレクトリを限定し、まず複製で試すのが安全です。
7. トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
401 Unauthorized / failed to connect to websocket
|
認証なし・無効 |
codex login status 確認。サーバは OPENAI_API_KEY を設定 |
Not inside a trusted directory ... |
非 Git ディレクトリで実行 |
--skip-git-repo-check を付ける or git init 済みフォルダで実行 |
codex: command not found / returnCode=127
|
JS7 が非ログインシェルで PATH に codex が無い(最頻出) |
第5章 5-0 の共通プリアンブルをジョブ先頭に貼る。ログに [INFO] using codex: ... が出れば解決 |
| JS7 では失敗するが手元では成功 | 実行ユーザ・環境の違い(PATH/認証/作業ディレクトリ) | プリアンブルで PATH 解決。env でエージェント環境を確認。対象ファイルは -C か cd で指定 |
| 対象ファイルが見つからない | workdir が Agent 配下(例 /var/sos-berlin.com/js7/agent) |
-C /path/to/data で作業ルート指定、またはジョブ内で cd
|
| 確認待ちで固まる | 対話モードになっている |
codex exec(非対話)を使う。無人前提の設定にする |
| 403 / 404(モデル関連) | モデルアクセス権なし・モデル名誤り |
-m のモデルをプラン対応のものに |
8. セキュリティ注意
- API キーをスクリプトに直書きしない。 JS7 のクレデンシャルストア/Secret から環境変数で注入する。
-
権限は最小に。 まず
read-only。書き込みが必要なジョブだけworkspace-write+対象ディレクトリ限定。 -
--dangerously-bypass-approvals-and-sandboxは隔離環境のみ。 本番サーバで安易に使わない。 - 生成物は人がレビュー。 商品データ・公開文章は自動反映前に必ず確認。
-
ログに機密を残さない。
--jsonや結果ファイルの保存先・保持期間に注意。
付録 A: コマンド早見
# 確認
codex --version
codex login status
# 基本
codex exec --skip-git-repo-check "質問"
codex exec --skip-git-repo-check -o /tmp/out.md "質問" # 結果をファイルへ
cat file.csv | codex exec --skip-git-repo-check -s read-only "指示" - # stdin
# 分析(読むだけ)/生成(書き込み)
codex exec --skip-git-repo-check -s read-only "data.csv を分析して"
codex exec --skip-git-repo-check -s workspace-write "fixed.csv を作って"
# 続き・レビュー
codex exec resume --last "さっきの続きで…"
codex exec review
付録 B: JS7 ジョブ完全テンプレ(コピペ用・動作確認済み)
そのまま JS7 のシェルジョブに貼れる完成形です。PATH 解決プリアンブル込み。"ここに指示を書く" と cd 先だけ書き換えてください。
#!/usr/bin/env bash
set -euo pipefail
# --- PATH 解決:JS7 はログインプロファイルを読まないので明示的に組み立てる ---
export PATH="/usr/local/bin:/usr/bin:/bin:$HOME/.local/bin:$HOME/.npm-global/bin:/usr/local/lib/node_modules/.bin:$PATH"
[ -s "$HOME/.nvm/nvm.sh" ] && export NVM_DIR="$HOME/.nvm" && . "$HOME/.nvm/nvm.sh" >/dev/null 2>&1 || true
for d in "$HOME"/.nvm/versions/node/*/bin; do [ -d "$d" ] && PATH="$d:$PATH"; done; export PATH
# --- codex を解決(無ければ npx にフォールバック) ---
CODEX="$(command -v codex || true)"
[ -z "$CODEX" ] && command -v npx >/dev/null 2>&1 && CODEX="npx @openai/codex"
[ -z "$CODEX" ] && { echo "ERROR: codex/npx が見つかりません。PATH=$PATH" >&2; exit 127; }
echo "[INFO] using codex: $CODEX"
# 認証: codex login 済みユーザでジョブが動くなら不要(別ユーザ時のみ CODEX_HOME/APIキー)
# --- 実行 ---
RESULT="/tmp/codex-result-$$.md"
cd /path/to/workdir # 対象ファイルのある場所(または下行で -C 指定)
$CODEX exec --skip-git-repo-check -s read-only -o "$RESULT" \
"ここに指示を書く"
cat "$RESULT"
動作確認ログの例(MiniPC50 / JS7 Agent):
[STDOUT] [INFO] using codex: /home/user/.npm-global/bin/codex [STDERR] OpenAI Codex v0.141.0 ... sandbox: read-only ... [MAIN] [End] [Success] returnCode=0
作成日: 2026-06-21(PATH 解決の実証知見を反映して改訂)/ 対象: OpenAI Codex v0.141.x、JS7 Agent。JS7 固有の変数名・記法はお使いのバージョンに合わせて調整してください。