0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Codex exec 入門 & JS7 連携ガイド

0
Posted at

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つ。

  1. 無人で止まらない … 確認プロンプトが出ないようにする(approval: never 相当の設定/必要なら隔離前提のバイパス)
  2. 認証が見える … 重要なのは「JS7 エージェントの実行ユーザが Codex の認証を見られること」。codex login 済みのユーザと同じユーザでジョブが動くなら、追加設定は不要(OPENAI_API_KEY の export も不要)。別のサービスユーザで動く場合のみ、CODEX_HOME をそのユーザから見える認証フォルダに向ける(または API キー方式に切り替える)。
  3. PATH が通るnode / npx / codex がエージェント環境から見える。ここが JS7 連携で最頻出のつまずき(→ 第5章のプリアンブルで解決)
  4. 結果と成否を返す-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 foundreturnCode=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 でエージェント環境を確認。対象ファイルは -Ccd で指定
対象ファイルが見つからない 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 固有の変数名・記法はお使いのバージョンに合わせて調整してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?