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

ターミナル上で次のコマンドを実行して、ブランチを作成します。
GitHubリポジトリで開発する場合、ブランチを作成して開発することが一般的です。
(ブランチ名は好きな名前を付けることができます。)
git switch -c feature/file-renamer-cliuvでプロジェクトの初期化
ブランチを作成した後、Pythonのプログラムを実装するため、Pythonプロジェクトを作成します。
uvコマンドを使うとPythonプロジェクトのひな型が簡単に作成できます
今回、samples配下にツール用プロジェクトを作成するため、ターミナル上で次のコマンドを実行します。
cd samples
uv init file-renamer-cliこのコマンドを実行すると、「file-renamer-cli」ディレクトリ配下に次のようなファイルが生成されます。
生成されるmain.pyは使わないため、削除します。

Codexにプログラムの作成を指示する
プロジェクトの作成が終わったら、Codexに次のように指示してプログラムを実装させます。
プログラム仕様書を書くのは大変なため、ChatGPTに仕様書の作成を依頼します。
仕様書にはコメントも書くように依頼したほうが良いです。
コメントがあるとプログラムが理解しやすくなります。
作成された仕様書はPythonプロジェクト内に格納します。
プロジェクト内に保存することにより、Codexで読めるようになります。
今回、使用した仕様書は次の通りです。
spec_file_renamer.md
仕様書を格納した後、Codexに次のようにプログラムの作成を指示します。
samples/file-renamer-cli/spec_file_renamer.md の内容に従って、
src/file_renamer.py を実装してください。Codexへの指示は次のようにCodexの拡張機能を使っています。

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

Codexでテストを指示する
Codexで生成されたプログラムが実際に動くのかわからないため、Codexにテストを実行するように指示します。
Codexにテストを実行する手順は次の通りです。
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テストコードを格納するディレクトリを作成しておきます。
mkdir testsこれまでの手順を実行すると次のようなディレクトリが作成されます。

ChatGPTにプログラムを読み込んでテストコードを書くように仕様書を依頼します。
この手順はプログラムを作成する場合と一緒です。
プログラムと同じように、Pythonプロジェクト内に仕様書を格納します。
実際に使用した仕様書は次の通りです。
spec_test_file_renamer.md
仕様書を格納した後、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を作成します。
- ChatGPTに指示してREADMEの仕様書を作成する。
- 仕様書をプロジェクトに格納する
- 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操作は画面を使った方が簡単です。
次のように変更内容をステージングしてコミットメッセージを書きます。
そのあと、コミットボタンをクリックしてコミットします。
(私の環境は英語表記ですが、日本語表記でも同じ操作でできます。)

コミットはローカルだけの更新のため、GitHubリポジトリを更新するため、次のように「Publish Branch」簿ボタン(日本語表記の場合、「ブランチを公開」)をクリックします。
クリック後、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を使った本格的な開発プロセスも試したりする予定です。
実際に試した結果は今後、このブログで紹介していきます。