basyura's blog

あしたになったらほんきだす。

最近の AI (codex) を使った開発

※ このエントリーは AI を使用していません (って書くのが流行りそう)

近況

wezterm で画面分割して左に codex、右に vim を開いている。terminal に引きこもろうかと思ってたけど、慣れなのかどうしても gvim の方が使い勝手がよく感じてしまうので引きこもりはやめた。

SNS のタイムラインを見ていると Claude の評判が良いように感じるので Claude Pro を再契約。が、codex の方が賢く感じるので Claude はまた辞める予定 (Opus でぶん回し続けられると違う??)。

Claude を久しぶりに触っていて良いなと思ったのが Plan モード。Plan のマークダウンファイルを生成する場所がどうなのはあるけど、やろうとしてることを事前に把握できるので良い。以前は直接編集が始まって diff 見せられて ok するだけになっていて修正に納得感があまりなかった。今は Plan を作って読んで、気になるところを指摘したり、編集を始めてる際にも気になる場合は Plan に反映させて見直したりといったことをしている。今の仕事もこんな感じなので、進め方が馴染んでるのかも。

codex でもまずは計画を立てるように AGENTS.md に記載している。

- 修正を始める前に計画をマークダウンファイルで .plans フォルダ配下に生成してください。
- 計画のファイル名は連番とし、1つ目を 001 始まりとして修正にあった適切なファイル名としてください。
- 計画のフォーマットは `001-windows-makefile-conditional.md` を参照すること。
- 具体的なファイル編集をする前に、修正案を提示すること。

フォーマットはいい感じにできたなと思うものに随時書き換えているけど、なにか良いフォーマットがないかなぁとは思う。Mac で codex で動かしてた場合は具体的なコードについても出力されていたのだけど、Windows + GitBash + codex の場合はかなり簡易的な内容になってるのも気になる。いい感じのフォーマットを見つけていきたい。

プロンプトは直したいことを書き、最後に 計画を立ててください を加えて送信する。 .plans フォルダ配下にファイルが生成されるので、それを見ながら自分の理解を深める。

仕事でプロダクトのコードを書くことがほぼなくなり、仕事に関する補助的なツールを作ったり、個人的な便利ツールを作ったりで息抜きをしている。Plan をまず作成する運用をしている中でちょっとした改善ものを以下に記載する。

分割 Pane の同期

プロジェクトを複数行き来していることが多いので、ターミナルを分割して表示している Vim の Pane がシェルで移動した結果のディレクトリが一致しなくなることが多い。Vim から辿るのは苦でないけどひと手間かかるのを改善。

sync-cwd() {
  local cwd vpath
  cwd=$(pwd)

  # Vim の "..." 文字列向けにエスケープ
  vpath=${cwd//\\/\\\\}   # \ -> \\
  vpath=${vpath//\"/\\\"} # " -> \"

  wezterm cli list --format json \
  | jq -r '.[] | "\(.pane_id)\t\(.title // "")"' \
  | while IFS=$'\t' read -r pane_id title; do
      if [[ "$title" == Vim* || "$title" == *vim* || "$title" == *nvim* ]]; then
        printf '\x03\x1b\x1b:execute "edit " . fnameescape("%s")\r' "$vpath" \
        | wezterm cli send-text --no-paste --pane-id "$pane_id"
      else
        printf 'cd %q\r' "$cwd" \
        | wezterm cli send-text --no-paste --pane-id "$pane_id"
      fi
    done
}

シェルで移動後に sync-cwd を実行することで、他の Pane のカレントディレクトリを変更する。Vim を開いていた場合は、該当ディレクトリのファイルリストを表示する。僕は vimfiler を使っているので、vimfiler でファイルのリストが表示される。

vim-right

wezterm の画面分割で左にシェルを右に vim をなので、そんな名前 (適当)。

function vim-right() {
  local target="$1"
  [[ -z "$target" ]] && return 1

  local abspath
  abspath="$(realpath "$target")" || return 1

  local pane_id
  pane_id="$(
    wezterm cli list --format json \
    | jq -r '
      (map(select(.is_active))[0].tab_id) as $tid
      | map(select(.tab_id==$tid and (.title|test("vi|vim|nvim"; "i"))))
      | .[0].pane_id // empty
    '
  )"
  [[ -z "$pane_id" ]] && return 1

  # ESC x2 で Normal に戻す → :e を実行(改行込み)。paste 制御を付けない
  wezterm cli send-text --pane-id "$pane_id" --no-paste $'\x1b\x1b:e '"${abspath}"$'\n'

  wezterm cli activate-pane --pane-id "$pane_id"
}

Plan ファイルを Vim ですぐ開けるように、シェル側から vim-right {paht} を実行していたりしたけど、codex を開始すると連携がイマイチなので (できないことはないけど) 、たまにしか使ってない。sync-cwd でディレクトリを合わせてから codex を開始すればいいのでファイルを開くまでの手間は許容範囲。

※ codex コマンドを実行する前に sync-cwd が実行されるようにしておけば、さらに便利じゃないかと今思ったので後で試す。

Shiba.app

vim でマークダウンを見るのもいいけど、html でレンダリングした結果の方が読みやすい。いい感じのマークダウンビューアがないかと探した結果、久々に見に行った Shiba が条件にぴったりだった。typora は編集できる点もよかったけど vim ライクなキーバインドができないのであきらめ。

条件

  • アウトラインが表示される
  • vim ライクなキーバインドが使える
  • できるだけ軽量

とはいえ、気になるところがちょろちょろあるので fork して追加実装してみた。codex で Plan ファイルを作る運用で。

追加機能

  • j/k/C-d/C-u のスクロール量を可変にできる
  • ファイルパスを指定してアプリ起動、再読み込みできる
  • ファイルが切り替わった場合はスクロール位置を先頭にする

合わせて Vim でマークダウンファイルを開いている際に :Shiba を実行すると、Shiba.app で見れるようにコマンドを定義した。

command! Shiba call s:open_with_shiba()

function! s:open_with_shiba() abort
  let file = expand('%:p')
  if empty(file)
    echoerr 'no file'
    return
  endif

  if has('mac')
    silent execute '!open -a "Shiba.app" ' . shellescape(file)
  else
    let shiba = 'shiba.exe'
    call job_start([shiba, file])
    return
  endif

  redraw!
endfunction

まとめ

けっこう、満足している。