【ITニュース解説】Building My Own CLI Tool: A Better Way to Share Code with LLMs
2025年09月20日に「Dev.to」が公開したITニュース「Building My Own CLI Tool: A Better Way to Share Code with LLMs」について初心者にもわかりやすく解説しています。
ITニュース概要
LLMへ複数ファイルを共有する際、プロジェクト構造が失われAIが理解しにくい問題を解決するため、PythonでCLIツールが開発された。これは、リポジトリ全体を一つのテキストにまとめ、ディレクトリ構造やGit情報、構文ハイライトを付加。AIがコードを正確に理解し、開発者の手間を減らす。
ITニュース解説
このニュース記事は、大規模言語モデル(LLM)であるChatGPTのようなAIとコードを共有する際の一般的な課題を解決するために、自身でコマンドラインツール(CLIツール)を開発した経験について述べている。システムエンジニアを目指す初心者の皆さんにも、この開発過程を通じて、具体的な問題解決のアプローチやプログラミングの基礎的な考え方を理解してもらえるだろう。
開発者が直面した問題は、LLMにプロジェクトのコードについて質問する際、複数のファイルをコピー&ペーストすると、ファイル間の関連性やプロジェクト全体の構造が失われてしまうことだ。例えば、「main.js」が「utils/helper.js」とどのように連携しているのかがAIにはわからなくなり、的確なアドバイスを得にくくなる。この問題を解決するため、開発者はリポジトリ全体のコンテキスト(つまり、プロジェクトの全てのコードと構造の情報)を一つのきれいなテキストファイルにまとめて出力するツールを作成した。
このツールの開発言語として選ばれたのはPythonである。開発者はコンピュータプログラミングと分析を学ぶ学生であり、機械学習(ML)もPythonで学んでいるため、この言語に精通していたことが大きな理由だ。Pythonは、ファイルシステムの操作を行うための「os」モジュールや、コマンドラインの引数を解析するための「argparse」モジュールなど、便利な組み込みライブラリが豊富に用意されている。これにより、外部の依存関係に悩まされることなく、素早く開発を始めることができたという。これは、新しいツール開発を始める上で非常に重要な点だ。
ツールの主要な機能はいくつかある。
まず、「CLI引数」の処理だ。これは、ユーザーがコマンドラインからツールに指示を与えるための部分で、argparseライブラリが大いに役立った。例えば、ツールのバージョンを表示する--versionや、ツールの使い方を表示する--helpといった標準的なフラグを設定し、さらに、処理対象となるファイルパスを受け取るようにした。argparseはユーザーが入力した値が正しい形式であるかどうかの検証も自動的に行ってくれるため、開発の手間を大幅に削減できた。
次に「ファイル検出」の機能がある。これは、プロジェクト内のどのファイルを収集するかを決定する中核的なロジックだ。os.walk()というPythonの関数を使って、指定されたディレクトリの中を再帰的に探索し、全てのファイルを取得する仕組みを実装した。この際、余計な情報を含めないよう、隠しファイルや、Pythonの仮想環境が作られるvenvのような一般的な開発用フォルダは無視する簡単なルールを追加した。これにより、出力されるコンテキストは本当に必要なコードだけに絞られ、よりクリーンになる。
「Git連携」も面白い機能の一つだ。これは、開発中のプロジェクトがGitというバージョン管理システムで管理されている場合、そのGitの情報をツールに取り込む部分だ。Pythonのsubprocessモジュールを使うことで、git rev-parse HEADのような実際のGitコマンドをプログラムの中から実行できるようにした。これにより、最新のコミットハッシュ(変更履歴の識別子)、現在のブランチ名、コードの作者、そしてコミット日時といった情報を取得し、出力に含めることが可能になった。もしツールがGitリポジトリではないフォルダで実行された場合でも、プログラムがクラッシュしないように、try...exceptブロックというエラー処理の仕組みで保護されており、「Gitリポジトリではありません」と優しくメッセージを表示するようになっている。これは、ユーザーがどんな状況でツールを使っても安定して動作するようにするための配慮であり、堅牢なツールを作る上で不可欠な考え方だ。
そして、「出力フォーマット」には特にこだわりが見られる。生成されるテキストが、人間にとってもAIにとっても可能な限り読みやすいように工夫された。例えば、ディレクトリの階層構造を視覚的に表現するために、├──や└──といった記号を使ったきれいなツリー構造で表示するようにした。これは、プロジェクト全体のファイル構成を一目で理解するのに非常に役立つ。さらに、コード自体の表示についても、pygmentsというライブラリを利用して、各ファイルのプログラミング言語(例えばPython、JavaScriptなど)を推測し、Markdown形式のコードブロックにシンタックスハイライト(構文強調表示)のヒントを追加した。これにより、AIがコードの内容をより正確に解釈できるようになり、人間が見ても各コードの役割やキーワードが分かりやすくなる。
これらの主要機能に加えて、開発者が個人的に役立つと考えた二つの「オプション機能」も追加された。
一つ目は「ファイル出力」機能だ。デフォルトでは、生成されたコンテキストはコンソール(画面)に直接表示されるが、-oまたは--outputフラグを使うことで、その内容をファイルに保存できるようになった。これにより、生成したコンテキストを後で再利用したり、他のツールと連携させたりする際の柔軟性が大幅に向上する。
二つ目は「トークンカウント」機能だ。LLMには一度に処理できる情報の量(これを「コンテキストウィンドウ」と呼ぶ)に上限がある。開発者は機械学習に関心があるため、この制限を常に意識しており、生成されるコンテキストのおおよそのトークン数(単語や記号の単位)を--tokensフラグで表示できるようにした。これにより、LLMに貼り付ける前に、自分のコンテキストが制限内に収まるかどうかを事前に確認でき、無駄な試行錯誤を減らせる。
このプロジェクト全体を通して、開発者は「小さな詳細がいかに重要か」ということを強く実感したという。単にコードが動作するだけでなく、ユーザーにとって予測可能で、実際に役立つ方法で動作するようにすることの重要性を強調している。自身が日々直面する「面倒な問題」を解決するシンプルなツールであることに、大きな誇りを感じているようだ。この開発経験は、システムエンジニアを目指す初心者にとって、問題を発見し、それを技術で解決する喜びと、ユーザー視点での開発の重要性を教えてくれる良い事例と言えるだろう。