🐑

GitHub Copilot for CLI は日本語クエリーの夢を見るか?

2023/03/29に公開

GitHub Copilot for CLI のウェイトリストに登録しておいたら順番がきたので少し試してみました。

まだ数日しか利用していませんが、git の操作をラフな日本語で指示できたりと良い感じです。

$ git? package.json と package-lock.json をHEADに戻す

ということで、今回は GitHub Copilot for CLI を主に日本語で使ってみた内容についてなど(以降 Copilot for CLI と表記します)。

Copilot for CLI とは?

Copilot X を構成する AI サービスの 1 つで、ターミナルでの操作をサポートしてくれるツールです。

詳細は GitHub の記事などを見ていただくのが速いのですが、簡単に書くと「いくつか質問するだけで AI がコマンドラインを組み立てる」「その場で実行も指示できる」といったツールです。

現在(2023-03-29)、Copilot for CLI を利用するにはウェイトリストへ登録する必要があります。

インストールとセットアップ

順番待ちが解除されたときのメールには NPM のパッケージをインストールするようにありました。Node.js の環境があれば一般的な手順でインストールできます。

図 2-1 npm コマンドでグローバルへインストール

$ npm install -g @githubnext/github-copilot-cli

ただし、利用には Copilot へ接続するための認証が必要です。認証コマンドを実行するとコードとアドレスが表示されるので、それに従うとホームディレクトリに資格情報が保存され Copilot for CLI を利用できるようになります。

図 2-2 認証用のコマンドを実行

$ github-copilot-cli auth
Copy this code: ****-****

Then go to https://github.com/login/device, paste the code in and approve the access.
⠧ It will take up to 5 seconds after approval for the token to be retrieved

あとは、必須ではないのですが、デモ動画のように ?? でクエリーを入力する場合は、下記のようにエイリアスを設定することになります。 (永続化する場合は ~/.bashrc などへ追加しておくとよいかと思います)

リスト 2-1 ?? などのエイリアス追加

eval "$(github-copilot-cli alias -- "$0")"

基本的な利用方法

セットアップが完了したので簡単なクエリーを入力してみます。単純な場合は ?? に続けて「list json files」のよう入力します。

図 3-1 デモ動画と同じようなクエリー

$ ?? list json files

 ──────────────────── Command ────────────────────

find . -name "*.json"

 ────────────────── Explanation ──────────────────

○ find is used to list files.
  ◆ . specifies that we search in the current directory.
  ◆ -name "*.json" stipulates that we search for files ending in .json.

  ✅ Run this command
  📝 Revise query
❯ ❌ Cancel

ここで Run this command を選択するとそのまま実行されます。

クエリーを続けたい場合は Revice query を利用すると追加できます。

図 3-2 追加で「count lines」を入力

$ ?? list json files

 ──────────────────── Command ────────────────────

find . -name "*.json"

 ────────────────── Explanation ──────────────────

○ find is used to list files.
  ◆ . specifies that we search in the current directory.
  ◆ -name "*.json" stipulates that we search for files ending in .json.

 ──────────────────── Revision ────────────────────

Enter your revision: count lines

?? の他に git の操作に特化した git? や GitHub CLI 用の gh? なども使えます。

図 3-3 git? の利用例

$ git? show merge commits history

 ──────────────────── Command ────────────────────

git log --merges

 ────────────────── Explanation ──────────────────

○ git log is used to list commits.
  ◆ --merges specifies that we only want to list merge commits.

  ✅ Run this command
  📝 Revise query
❯ ❌ Cancel

ただし、実際の状況を考慮した生成は行われないようです。たとえば、クエリーによってはインストールされていないコマンドが利用されることもありました。

英語以外のクエリー

試しにクエリーを日本語で「json ファイルの一覧」にしても上記と同じコマンドが生成されます。ただし、若干の注意点もあります。

  • コマンド実行時の (y/N) 選択などで IME をオフにする手間が増える
  • Revise query で追加のクエリーを入力するときに入力中の文字(プレエディット)は表示されない
  • 説明は英語のまま固定と思われる

図 4-1 日本語によるクエリー指定

$ ?? json ファイルの一覧

 ──────────────────── Command ────────────────────

find . -name "*.json"

 ────────────────── Explanation ──────────────────

○ find is used to list files.
  ◆ . specifies that we search in the current directory.
  ◆ -name "*.json" stipulates that we search for files ending in .json.

  ✅ Run this command
  📝 Revise query
❯ ❌ Cancel

日本語の他にはドイツ語(正しいドイツ語かは不明)の「liste der json」でも同じようになりました。

図 4-2 ドイツ語によるクエリー指定

$ ?? liste der json

 ──────────────────── Command ────────────────────

find . -name "*.json"

 ────────────────── Explanation ──────────────────

○ find is used to list files.
  ◆ . specifies that we search in the current directory.
  ◆ -name "*.json" stipulates that we search for files ending in .json.

  ✅ Run this command
  📝 Revise query
❯ ❌ Cancel

また、Revise query への入力は「空白区切り」「sum」のような単語の入力でも概ね通るようです(もちろん、詳しく入力する方がより意図に沿ったコマンドが生成されやすいです)。

試してみる前は「英語で文章入力は厳しい」と思っていたのですが、日本語や単語ぶつ切りで入力してもわりと大丈夫そうな感じです。

少し実際的な場合の例

コーディングしている環境へ Copilot for CLI をインストールしておいて利用した例です。

コーディングしていると jest のオプションを調べたくなることはわりとあります。

$ ?? jest で page を含むテスト名のみ実行

 ──────────────────── Command ────────────────────

jest --testNamePattern page

 ────────────────── Explanation ──────────────────

○ jest is the test runner for JavaScript.
  ◆ --testNamePattern page specifies that we want to run tests whose name contains the string page.

❯ ✅ Run this command
  📝 Revise query
  ❌ Cancel

これだけでも --help を参照したりググる手間が省けるのでうれしいのですが、jest は NPM スクリプトから実行していることが多くでそのままでは使えません。

ここでオプションを手動でコピーしてもよいのですが、Copilot for CLI ではクエリーに「npm run test 経由で実行」を入れることで対応してくれます。個人的には npm run test の後に -- を付けるのを忘れて「なんでエラーになるんだ?」で悩むことが多く、オプションを調べた後にそのまま npm で実行できるのは結構うれしい感じです。

図 5-1 jest のオプションを調べてそのまま実行

$ ?? jest で page を含むテスト名のみ実行

 ───────────────────── Query ─────────────────────

1) jest で page を含むテスト名のみ実行 2) npm run test 経由で実行

 ──────────────────── Command ────────────────────

npm run test -- --testNamePattern page

 ────────────────── Explanation ──────────────────

○ npm run test runs the test script defined in package.json.
  ◆ -- is used to separate the arguments to npm from the arguments to the script.
  ◆ --testNamePattern page is passed to the script as an argument.

🕛  Hold on, executing commmand...

また、 git の操作で「resetcheckout のどちらか?」で迷ったときも「package.json と package-lock.json をHEADに戻す」のように指示できました。

図 5-2 git に日本語で指示

$ git status
On branch topic/rollup-config-js-as-esm
Your branch is up to date with 'origin/topic/rollup-config-js-as-esm'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   package-lock.json
        modified:   package.json
        modified:   rollup.config.js

no changes added to commit (use "git add" and/or "git commit -a")

$ git? package.json と package-lock.json をHEADに戻す

 ──────────────────── Command ────────────────────

git checkout HEAD -- package.json package-lock.json

 ────────────────── Explanation ──────────────────

○ git checkout is used to restore files from a previous commit.
  ◆ HEAD specifies that we want to restore the files from the current commit.
  ◆ -- package.json package-lock.json specifies the files we want to restore.

🕙  Hold on, executing commmand...

$ git status
On branch topic/rollup-config-js-as-esm
Your branch is up to date with 'origin/topic/rollup-config-js-as-esm'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   rollup.config.js

no changes added to commit (use "git add" and/or "git commit -a")

Copilot for CLI を試し始めて数日ですが、この辺がサポートされるだけでも「Copilot はお試し期間終わっても使おうかな」とちょっとグラグラきています。

よろしくないコマンドが混ざることもある

ここまでは良い感じですが、やはり AI 生成の場合はどうしてもよろしくないコマンドが混ざってきます。

たとえば、現行(2023-03-29 時点)の Copilot for CLI では findxargs の組み合わせがあまりよろしくないようです。Copilot for CLI が生成するコマンドでは「ファイル名に特殊な意味を持つ文字が含まれている」とエラーになります。

図 6-1 入力によってはエラーになることも

$ ?? .jsonファイルの一覧

 ───────────────────── Query ─────────────────────

1) .jsonファイルの一覧 2) 各ファイルの行数を数える

 ──────────────────── Command ────────────────────

find . -name "*.json" | xargs wc -l

 ────────────────── Explanation ──────────────────

○ find is used to list files.
  ◆ -name "*.json" stipulates that we search for files ending in .json.
○ | xargs passes the list of files to the xargs command.
  ◆ wc -l counts the number of lines in each file.

🕔  Hold on, executing commmand...
wc: ./123: そのようなファイルやディレクトリはありません
wc: 456.json: そのようなファイルやディレクトリはありません
1 ./789.json
1 合計

パっと見で「これは意図した通りに実行されない」とわかる場合は良いのですが、「普段は動くけど少し変わった入力では不具合が出る」というときに少し困りそうです。

この辺は仕方のない部分ですが[1]shellcheck では検出できるので「自動でチェックさせる方法があればうれしい」といった感じです。

2023-04-01 追記: やっぱりスッキリしなかったので Bash 用にヘルパー関数を作りました。

対応されているコマンド

Copilot for CLI で対応されているコマンドの一覧などは見当たらなかったのですが、試してみた感じでは思っていたよりも各種コマンド(環境)に対応しているようでした。

たとえば、Hyper-V や BitLocker に関連するようなコマンドも(ある程度誘導する必要はありますが)生成されました。

図 7-1 Hyper-V(PowerShell) 用のコマンドも生成

$ ?? list virtual machines in hyper-v

 ───────────────────── Query ─────────────────────

1) list virtual machines in hyper-v 2) show id

 ──────────────────── Command ────────────────────

Get-VM | select id

 ────────────────── Explanation ──────────────────

○ Get-VM is a PowerShell command that lists all virtual machines.
  ◆ | select id selects the id field from the output of Get-VM.

  ✅ Run this command
  📝 Revise query
❯ ❌ Cancel

しかし、その反面で同じカテゴリーのコマンドが複数ある場合、どれを利用するのかは都度クエリーで指定するようです。

たとえば「list virtual machines」だけで指定すると VirtualBox 用に生成されますが、これを Hyper-V 用に切り替える方法は不明でした。

おわりに

Copilot for CLI について試してみました。

クエリーの入力などは日本語や単語のみでも通りやすいので、思っていたよりも気軽に使えそうな感じです。ただし、安定度合いはもう少しといった感じなので、繰り返し利用したり外部からの入力を扱うコマンドの生成には向かない印象です。

そのような感じなので「単発利用のコマンドをラフな指示で実行したい」というときに使うと良いのかなと思います。

脚注
  1. デモ動画で生成されている find の例も同じような問題を含んでいるので、「そういうものなのかな」とちょっとあきらめモードです。 ↩︎

GitHubで編集を提案

Discussion