Pythonでツールを作る場合、環境構築から実装、テスト、ドキュメント作成まで幅広い作業が必要になり、非常に面倒です。
今回、初めてCodexとuvを本格的に組み合わせてPythonのCLIツールを作ってみたところ、コーディングせずに実用的なものが完成しました。
生成AIを使った開発はどこまで効率化できるのかを試したいと思い、実際に体験して分かった点を記事で紹介します。
この記事は2025年11月に確認した内容です。

この記事で分かること

  • GitHubとuvでの準備
  • 仕様書を作成してCodexに実装を依頼する方法
  • Codexにテストコードの生成を依頼して実行する方法
  • CodexにREADMEを生成させる方法
  • 今回作成したツールの使い方

今回使った環境

今回、GitHubにある下記のサンプル用リポジトリを使用します。
https://github.com/ojichiku/public-python-samples
リポジトリ内のsamples配下に、下記のようなディレクトリ構成でツールを作成します。
作成するツールは「ファイル名一括リネーマー」です。

public-python-samples/   # リポジトリのトップディレクトリ
  samples/
    file-renamer-cli/    # 今回作成するツールのディレクトリ
      src/
      tests/
      README.md
      pyproject.toml

今回使った環境は次の通りです。

  • Windows11
  • WSL
  • Python 3.14(uv管理)
  • uv
  • Codex(npm版+VSCode拡張)
  • VSCode
  • pytest

WSLにCodexの環境を構築していない場合、次の記事を参考にしてください。

ブランチの作成

VSCodeでWSLを起動した後、WSLのターミナル上でリポジトリをクローンするディレクトリに移動します。
移動した後、次のコマンドを実行するとGitHubリポジトリがクローンできます。
(username、yourrepositoryは使用しているユーザー、リポジトリ名に置き換えてください。)

git clone git@github.com:username/yourrepository.git

VSCodeでクローンしたリポジトリのディレクトリを開くと、次のようにGitHubリポジトリを操作できるようになります。

ターミナル上で次のコマンドを実行して、ブランチを作成します。
GitHubリポジトリで開発する場合、ブランチを作成して開発することが一般的です。
(ブランチ名は好きな名前を付けることができます。)

git switch -c feature/file-renamer-cli

uvでプロジェクトの初期化

ブランチを作成した後、Pythonのプログラムを実装するため、Pythonプロジェクトを作成します。
uvコマンドを使うとPythonプロジェクトのひな型が簡単に作成できます
今回、samples配下にツール用プロジェクトを作成するため、ターミナル上で次のコマンドを実行します。

cd samples
uv init file-renamer-cli

このコマンドを実行すると、「file-renamer-cli」ディレクトリ配下に次のようなファイルが生成されます。
生成されるmain.pyは使わないため、削除します。

Codexにプログラムの作成を指示する

プロジェクトの作成が終わったら、Codexに次のように指示してプログラムを実装させます。

STEP1
ChatGPTにプログラム仕様書を依頼する

プログラム仕様書を書くのは大変なため、ChatGPTに仕様書の作成を依頼します。
仕様書にはコメントも書くように依頼したほうが良いです。
コメントがあるとプログラムが理解しやすくなります。

STEP2
仕様書をプロジェクトに格納する

作成された仕様書はPythonプロジェクト内に格納します。
プロジェクト内に保存することにより、Codexで読めるようになります。
今回、使用した仕様書は次の通りです。
spec_file_renamer.md

STEP3
Codexにプログラムの作成を指示する

仕様書を格納した後、Codexに次のようにプログラムの作成を指示します。

samples/file-renamer-cli/spec_file_renamer.md の内容に従って、
src/file_renamer.py を実装してください。

Codexへの指示は次のようにCodexの拡張機能を使っています。

指示した後、Codexが実行されて少し待ちと次のようにプログラムが生成されます。
ここまでプログラムは1文字も書いていません。

Codexでテストを指示する

Codexで生成されたプログラムが実際に動くのかわからないため、Codexにテストを実行するように指示します。
Codexにテストを実行する手順は次の通りです。

STEP1
pytestのインストール

Codexでテストを実行するため、次のコマンドでpytestをプロジェクトに追加します。

cd samples/file-renamer-cli
uv add pytest

実行すると、次のように.venvを作り、pytestがインストールされます。

Using CPython 3.14.0
Creating virtual environment at: .venv
Resolved 7 packages in 83ms
Installed 5 packages in 10ms
 + iniconfig==2.3.0
 + packaging==25.0
 + pluggy==1.6.0
 + pygments==2.19.2
 + pytest==9.0.1
STEP2
ディレクトリの作成

テストコードを格納するディレクトリを作成しておきます。

mkdir tests

これまでの手順を実行すると次のようなディレクトリが作成されます。

STEP3
ChatGPTにテスト仕様書の作成を依頼する

ChatGPTにプログラムを読み込んでテストコードを書くように仕様書を依頼します。
この手順はプログラムを作成する場合と一緒です。

STEP4
仕様書をプロジェクトに格納する

プログラムと同じように、Pythonプロジェクト内に仕様書を格納します。
実際に使用した仕様書は次の通りです。
spec_test_file_renamer.md

STEP5
テストコードの生成・実行を指示する

仕様書を格納した後、Codexに次のようにテストコードの生成・実行を指示します。

spec_test_file_renamer.mdを読んで、テストコードの生成、テストを実行してください。

実際に次のように指示しています。

少し時間がたつと、生成したテストコードの実行有無が次のように聞かれます。
私は「Approve this session」を選択してテストコードを実行しました。

テストコードの実行が完了すると次のようにテスト結果が表示されます。
今回のテストはすべて正常に完了しています。

テストを手動で実行する

テストコードが正常に実行できるのか手動で確認することをおすすめします。
手動で実行する場合、ターミナル上で次のコマンドで実行します。
テストコード内で呼び出す「file_renamer.py」はsrc配下にあるため、PYTHONPATH=srcをつけないとエラーが発生します。

# samples/file-renamer-cliに移動する
cd samples/file-renamer-cli
PYTHONPATH=src uv run pytest -v

正常に実行されると次のように表示されます。

============================================= test session starts =============================================
platform linux -- Python 3.14.0, pytest-9.0.1, pluggy-1.6.0 -- /home/xxxx/project/public-python-samples/samples/file-renamer-cli/.venv/bin/python
cachedir: .pytest_cache
rootdir: /home/xxxx/project/public-python-samples/samples/file-renamer-cli
configfile: pyproject.toml
collected 5 items                                                                                             

tests/test_file_renamer.py::test_rename_files_generates_sequential_names PASSED                         [ 20%]
tests/test_file_renamer.py::test_rename_files_expands_digit_width PASSED                                [ 40%]
tests/test_file_renamer.py::test_replace_in_filenames_updates_matching_files PASSED                     [ 60%]
tests/test_file_renamer.py::test_replace_in_filenames_raises_for_empty_find PASSED                      [ 80%]
tests/test_file_renamer.py::test_rename_files_rejects_invalid_digits PASSED                             [100%]

============================================== 5 passed in 0.01s ==============================================

Codex、コマンドでテストコードは実行できますが、VSCodeでテストコードを開くと次のようにインポートが見つからないエラーが発生します。

VSCodeがsrc配下の「file_renamer.py」を見つけられないため、次の手順を実行して設定を追加します。

VSCodeでプロジェクトディレクトリを開いている場合、プロジェクト直下に.vscode/settings.jsonを作成して次の設定を追加します。

{
    // このサンプルプロジェクトのPython解析用パス
    "python.analysis.extraPaths": [
        "${workspaceFolder}/samples/file-renamer-cli/src"
    ],
}

または、今回作成したツールのディレクトリ「samples/file-renamer-cli」をVSCodeで開いている場合、samples/file-renamer-cli/.vscode/settings.jsonを作成して次の設定を追加します。

{
    // このサンプルプロジェクトのPython解析用パス
    "python.analysis.extraPaths": [
        "${workspaceFolder}/samples/file-renamer-cli/src"
    ],
}

この設定を加えることで、VSCode上でfile_renamerのインポートエラーが解決します。

CodexでREADMEを自動生成する

プログラム・テストと同じように、READMEもChatGPT、Codexを使って次のようにREADMEを作成します。

  1. ChatGPTに指示してREADMEの仕様書を作成する。
  2. 仕様書をプロジェクトに格納する
  3. Codexに「この仕様書とsrc/file_renamer.pyを読み、README.mdを作る」と指示する

実際に使用したREADMEの仕様書は次を見てください。
readme_spec_file_renamer.md

サンプルツール「ファイル名一括リネーマー」の使い方

今回作成したサンプルツールは、ファイル名の連番リネームと文字列置換を行うシンプルなものです。
簡単に使い方を紹介します。

連番リネームの実行例

# samples/file-renamer-cliに移動する
cd samples/file-renamer-cli
PYTHONPATH=src python -m file_renamer rename --dir ./samples --prefix blog_ --digits 3

文字列置換リネームの実行例

# samples/file-renamer-cliに移動する
cd samples/file-renamer-cli
PYTHONPATH=src python -m file_renamer replace --dir ./samples --find draft_ --replace final_

GitHubへの登録

最後に、次の手順を実行してGitHubに作成したファイルを登録します。
VSCode上のGit操作は画面を使った方が簡単です。

STEP1
変更したファイルのコミット

次のように変更内容をステージングしてコミットメッセージを書きます。
そのあと、コミットボタンをクリックしてコミットします。
(私の環境は英語表記ですが、日本語表記でも同じ操作でできます。)

STEP2
ブランチのPush

コミットはローカルだけの更新のため、GitHubリポジトリを更新するため、次のように「Publish Branch」簿ボタン(日本語表記の場合、「ブランチを公開」)をクリックします。
クリック後、GitHubリポジトリにファイルの更新内容が送信されます。

STEP3
GitHubでプルリクエスト・マージ

今回のツールはブランチを作成して作っていますので、mainブランチに変更内容を反映させる必要があります。
mainブランチへの反映は次のように画面操作で行います。

GitHubを開くと次のように「pull request」ボタンを表示されるので、クリックします。

次のようにプルリクエスト作成画面が開くので、「Create pull request」ボタンをクリックします。
(チームで開発する場合はdescriptionを入力しますが、個人開発のため、未入力にしています。)

プルリクエストのマージ確認画面が開くので、「Merge pull request」ボタンをクリックします。

マージ実行確認画面が開くので、「Confirm merge」ボタンをクリックします。
クリックするとmainブランチに変更内容が反映されます。

次のように実際に変更内容が反映されたことを確認できます。

まとめ

今回、私は実際にCodexを使って、Pythonツールをコーディングせずに作れました。
仕様書、実装、テスト、READMEをCodexに任せて、私は動作確認と修正指示を行う形で進められました。
初めての実践でしたが、想像以上にスムーズにツールが完成しました。

ChatGPTとCodexを組み合わせると、初めてでも実用的なプログラムが作れます。
コーディングなしで作れると、開発のハードルが下がり、モチベーションも維持しやすいと感じました。

今後は、Codexを使ってより複雑なツール開発にも挑戦したり、Agent.mdを使った本格的な開発プロセスも試したりする予定です。
実際に試した結果は今後、このブログで紹介していきます。