BioErrorLog Tech Blog

試行錯誤の記録

AIコーディング用に複数ファイル情報を連結するシェルコマンド

LLMのプロンプトに貼り付ける用に、指定した複数ファイル内容をディレクトリ構造情報を添えて連結するシェルコマンドを用意します。

はじめに

AIコーディングツールを使わずにChatGPTのような素朴なチャット形式のLLMでコーディングする場合、複数ファイルの内容をパッとプロンプトに貼り付けたくなることがしばしばあります。 しかし、わざわざ複数ファイルを一つずつコピペしていては面倒です。

このような用途に特化したツールも探せばもちろん沢山あると思いますが、最低限やりたいことを実現するだけなら数行のシェルコマンドを用意するだけで済みます。

私のやり方をまとめます。

The English translation of this post is here.

LLM用に複数ファイル情報を連結するシェルコマンド

やりたいこと

  • 以下の内容を連結し、テキストとしてクリップボードにコピーする
    • プロジェクトのディレクトリ構造
    • 指定したファイルのパスとファイル内容
    • ファイル指定は複数可
  • 環境はmacOS

これをコマンドとして実行できれば、AIとペアプロする際に必要な情報をパッとプロンプトに貼り付けることができて便利ですね。

コマンド実装

ごく簡単なシェルコマンドで、先述のやりたいことが実現可能です。

catr() {
  (
    tree
    for f in "$@"; do
      printf "\n── %s ──\n" "$f"
      cat "$f"
    done
  ) | pbcopy
}

これを~/.bashrc~/.zshrcに追記しておけば、catrコマンドとして実行可能です(もちろんcatrという名前は任意に設定可能)。

このコマンドがやっていること:

  1. treeコマンドでディレクトリ構造を出力
  2. 引数で渡したファイルパスを出力
  3. 引数で渡したファイルパスのファイル内容をcatコマンドで出力
  4. 引数で渡したファイルパスの数だけ2. - 3.を繰り返す
  5. 出力結果をpbcopyにパイプで流し、クリップボードにコピー

より機能を増やしたくなった場合も、元がたかが数行のコードなのでカスタマイズは容易です。

では、このコマンドの具体的な実行例を見ていきます。

実行例

uvで作成したPythonプロジェクトの初期状態を例に、上記のシェルコマンドcatrを実行します。

複数ファイルを指定して実行する例:

catr main.py pyproject.toml 

# クリップボードにコピーされたテキスト:
.
├── README.md
├── main.py
└── pyproject.toml

1 directory, 3 files

── main.py ──
def main():
    print("Hello from testproject!")


if __name__ == "__main__":
    main()

── pyproject.toml ──
[project]
name = "testproject"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.11"
dependencies = []


レポジトリでgit管理されている全ファイルを指定:

catr $(git ls-files)

# クリップボードにコピーされたテキスト:
.
├── README.md
├── main.py
└── pyproject.toml

1 directory, 3 files

── .gitignore ──
# Python-generated files
__pycache__/
*.py[oc]
build/
dist/
wheels/
*.egg-info

# Virtual environments
.venv

── .python-version ──
3.11

── README.md ──

── main.py ──
def main():
    print("Hello from testproject!")


if __name__ == "__main__":
    main()

── pyproject.toml ──
[project]
name = "testproject"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.11"
dependencies = []


このコマンドに渡すファイルパスは、findコマンド等でも任意のロジックで抽出できます。 出力するディレクトリ構造情報も、コマンド内のtreeコマンドのオプションを設定すれば適宜調整可能です。

クリップボードに貼り付けるだけでなく、内容をstdoutにも流したり、特定ファイルに出力させておいても便利かもしれません。 コマンド引数で振る舞いを調整できるようにしても良いですね。

おわりに

以上、AIコーディング用に複数ファイル情報を連結する簡単なシェルコマンドをまとめました。

外部ツールを使わずとも、簡単なシェルで実現できるのは良いですね。

どなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

参考