PowerShellでCopilotを使用する

Windowsのコマンドは、昔ながらの伝統的なMS-DOS互換なので、体がコマンドを覚えている上に、コマンドが短い。なんたって、おらはMS-DOS2.11からのユーザーだ。

コマンドの短さならunixも引けを取らないし、WSLにUbuntuを入れてあるので、shellを使うのもありなのだが、なんとなくWindowsでshを使うのが好きではない。

やはりPowerShellの時代なのか。

でもでもでもでも、PowerShellはコマンド名が長くて好かぬ。
いや、覚えきれぬ。

年寄は記憶力が乏しいのじゃ！

ふと思った。PowerShellでCopilotが使えれば、いいんじゃね？

## AIに聞いてみた。

:::note
***PowerShellでCopilotを使うための手順は以下の通りです。***

1.GitHub Copilot CLIをインストールする
```powershell:powershell
npm install -g @githubnext/github-copilot-cli
```
2.GitHub アカウントでログインする
3.PowerShellにCopilotのエイリアスを設定する
4.上記コマンドで$PROFILEファイル(PowerShellの設定ファイル)が開くので、次の行を追加する。
5.ファイルを保存し、PowerShellを再起動する。
6.PowerShellからCopilotを使う
:::

## やってみた

>npm : 用語 'npm' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
>名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。

いきなり、つまづいた。
なにこれ？AIに聞いてみる。

:::note warn
**この問題が発生する主な理由は、PowerShellがNode.jsのインストール場所を環境変数PATHに追加していないためです。この問題を解決するには、以下の手順を試してみてください。**

1. **Node.jsのインストール場所を確認する**
Node.jsのインストール場所は通常 C:\Program Files\nodejs ですが、カスタムインストールした場合は異なる可能性があります。エクスプローラーで実際のインストール場所を確認してください。
2. **PowerShellで環境変数PATHを永続的に設定する**
PowerShellを管理者として開き、次のコマンドを実行します。
```powershell:powershell
$env:Path += ";C:\Program Files\nodejs"
[Environment]::SetEnvironmentVariable("Path", $env:Path, "Machine")
```
C:\Program Files\nodejs の部分を、手順1で確認したNode.jsの実際のインストール場所に置き換えてください。
3. **新しいPowerShellウィンドウを開く**
環境変数の変更を反映させるため、PowerShellを再起動する必要があります。
4. **npmコマンドを実行してみる**
新しいPowerShell ウィンドウで npm --version と入力し、npmのバージョンが表示されれば成功です。

この手順で問題が解決しない場合は、Node.jsのアンインストールと再インストールを試してみるとよいでしょう。

環境変数PATHの設定は、PowerShellだけでなく、コマンドプロンプト(cmd.exe)でもnpmを使用する際に必要になります。この手順を行えば、WindowsでNode.js開発環境を適切に構築できるはずです。

:::

やってみたが、うまく行かない。
そもそも"C:\Program Files\nodejs "なるフォルダが見当たらない。

と言うか、そんなもん、インストールした記憶がない。

### PowerShellにNode.jsをインストールする

<a href="https://nodejs.org/en/download/package-manager">Node.jsの公式サイト</a>からWindows版インストーラーをダウンロードし、インストールします。インストールの際には、ライセンス契約に同意し、必要な設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792051/4e65b250-3b68-697f-5948-71ae070bb263.png)
#### fnmってなに？
:::note
インストール時に使用するfnmとは、Fast Node Managerの略で、Node.jsのバージョン管理ツールです。fnmは、Node.jsのバージョンを簡単に管理することができ、プロジェクトごとに異なるバージョンを使用することができます。fnmは、Windows、Mac、Linuxで利用可能であり、マルチプラットフォーム間で操作が変わらないという利点があります。
:::
よくよく見れば、コマンドをPowerSHellにコピペしたら行けそうな気がする。Copy to clipboardで内容をコピペして、PowerShellに貼りつける。

```
PS C:\Users\Windows3_1> # installs fnm (Fast Node Manager)
PS C:\Users\Windows3_1> winget install Schniz.fnm
'msstore' ソースでは、使用する前に次の契約を表示する必要があります。
Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
ソースが正常に機能するには、現在のマシンの 2 文字の地理的リージョンをバックエンド サービスに送信する必要があります (例: "US")。

すべてのソース契約条件に同意しますか?
[Y] はい  [N] いいえ:
[Y] はい  [N] いいえ: # download and install Node.js
[Y] はい  [N] いいえ: fnm use --install-if-missing 20
[Y] はい  [N] いいえ:
[Y] はい  [N] いいえ: # verifies the right Node.js version is in the environment
[Y] はい  [N] いいえ: node -v # should print `v20.14.0`
[Y] はい  [N] いいえ:
[Y] はい  [N] いいえ: # verifies the right NPM version is in the environment
[Y] はい  [N] いいえ: npm -v # should print `10.7.0`
[Y] はい  [N] いいえ: y
見つかりました Fast Node Manager [Schniz.fnm] バージョン 1.37.0
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
ダウンロード中 https://github.com/Schniz/fnm/releases/download/v1.37.0/fnm-windows.zip
  ██████████████████████████████  2.94 MB / 2.94 MB
インストーラーハッシュが正常に検証されました
アーカイブを展開しています...
アーカイブが正常に展開されました
パッケージのインストールを開始しています...
パス環境変数が変更されました; 新しい値を使用するにはシェルを再起動してください。
コマンド ライン エイリアスが追加されました: "fnm"
インストールが完了しました
PS C:\Users\Windows3_1>
```
途中でyと入力したが、なんだかうまく行ったらしい。
### node.jsは起動するのか？
:::note
1. PowerShellを起動します。PowerShellがインストールされていない場合は、公式サイトからインストールします。
1. Node.jsのバージョン確認:
3. PowerShellで以下のコマンドを実行して、Node.jsのバージョンを確認します。
```powershell:powershell
node --version
```
:::
やってみた。
```
PS C:\Users\Windows3_1> node --version
node : 用語 'node' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている
場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ node --version
+ ~~~~
    + CategoryInfo          : ObjectNotFound: (node:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\Windows3_1>
```
ああ、無情…きちんと1行ずつ実行しないとダメだな。
### まじめに確かめてみる

PowerShellを再起動して、1行ずつ実行する。
```
PS C:\Users\Windows3_1> winget install Schniz.fnm
既存のパッケージが既にインストールされています。インストールされているパッケージ...をアップグレードしようとしています
利用可能なアップグレードが見つかりませんでした。
構成されたソースから入手できる新しいパッケージ バージョンはありません。
PS C:\Users\Windows3_1> fnm use --install-if-missing 20
error: We can't find the necessary environment variables to replace the Node version.
You should setup your shell profile to evaluate `fnm env`, see https://github.com/Schniz/fnm#shell-setup on how to do this
Check out our documentation for more information: https://fnm.vercel.app
PS C:\Users\Windows3_1> 
```

エラーメッセージをAIに投げた。

:::note warn
fnmを使ってNode.jsのバージョン20をインストールしようとしていますが、fnmがシェル環境で正しく設定されていないようですね。
この問題を解決するには、シェルプロファイルで```fnm env```を評価するように設定する必要があります。以下の手順を実行してください：

1. シェルプロファイルファイルを開きます：
2. PowerShellの場合は、Microsoft.PowerShell_profile.ps1ファイルを開きます。```$PROFILE```をPowerShellで実行すると、ファイルの場所を確認できます。
コマンドプロンプト（cmd.exe）の場合は、ホームディレクトリにあるautoexec.batファイルを開きます。
3. プロファイルファイルに以下の行を追加します：
```Copy codefnm env --use-on-cd | Out-String | Invoke-Express```
この行により、新しいシェルを開くたびにfnmが適切に初期化され、必要な環境変数が設定されます。
4. プロファイルファイルを保存します。
変更を反映するために、シェル（PowerShellまたはコマンドプロンプト）を閉じて再度開きます。

以上の手順を完了すれば、環境変数のエラーなくfnmコマンドを使用できるようになるはずです。
:::

さっそく実行してみる。
```
PS C:\Users\Windows3_1> $PROFILE
D:\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PS C:\Users\Windows3_1> notepad $PROFILE
```
ノートパッドが開いたので、行を追加して保存する。
```
$env:Path = "C:\Program Files\Git\cmd;" + $env:Path
fnm env --use-on-cd | Out-String | Invoke-Expression
```

PowerShellを閉じて、新しく開く。そしてコマンドの続きから実行する。

```
PS C:\Users\Windows3_1> fnm use --install-if-missing 20
Installing Node v20.14.0 (x64)
00:00:02 ████████████████ 28.09 MiB/28.09 MiB (9.79 MiB/s, 0s)Using Node v20.14.0
PS C:\Users\Windows3_1> node -v # should print `v20.14.0`
v20.14.0
PS C:\Users\Windows3_1> npm -v # should print `10.7.0`
10.7.0
PS C:\Users\Windows3_1>
```

やった！！！！

## Copilotをインストールする
冒頭のコマンドを実行する。
```
PS C:\Users\Windows3_1> npm install -g @githubnext/github-copilot-cli
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
npm warn deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported

added 246 packages in 29s
npm notice
npm notice New minor version of npm available! 10.7.0 -> 10.8.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.8.1
npm notice To update run: npm install -g npm@10.8.1
npm notice
PS C:\Users\Windows3_1> gh copilot-cli auth
gh : 用語 'gh' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合
はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ gh copilot-cli auth
+ ~~
    + CategoryInfo          : ObjectNotFound: (gh:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\Windows3_1>
```

```gh```がない…

## GitHub CLIのインストール
教えてAI。

:::note warn
エラーメッセージから、ghコマンドがPowerShellで認識されていないことがわかります。これは、GitHub CLI（gh）がインストールされていないか、システムのPATHに追加されていないことが原因です。
GitHub CLIをインストールしてPATHに追加するには、以下の手順を実行してください：

1. <a href="https://cli.github.com/">GitHub CLIのダウンロードページ</a>にアクセスします。
お使いのWindowsバージョンに適したインストーラー（例：Windows 64-bit）をダウンロードします。
2. ダウンロードしたインストーラーを実行し、インストール手順に従います。
3. インストールが完了したら、PowerShellを管理者権限で開きます。
4. 以下のコマンドを実行して、GitHub CLIのパスをシステムのPATHに追加します：
```
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\GitHub CLI", [System.EnvironmentVariableTarget]::Machine)
```
※GitHub CLIのインストール先がデフォルトの場合。インストール先が異なる場合は、パスを適宜変更してください。
5. PowerShellを閉じて、新しいPowerShellウィンドウを開きます。以下のコマンドを実行して、GitHub CLIが正しくインストールされたことを確認します。バージョン情報が表示されれば、インストールは成功です。
```
gh --version
```

これで、gh copilot-cli authコマンドが正常に動作するはずです。GitHub Copilotの認証を進めることができます。
:::

早速ダウンロードしてインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792051/e2f095fc-1137-888e-c0c0-64fabd19a283.png)

特に設定することもなく、デフォルトでインストール完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792051/f2a19766-4b81-0df1-548c-a38a8f38396c.png)

管理者権限でPowerShellを起動し、コマンドを実行。問題なし。
```
PS C:\WINDOWS\system32> [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\GitHub CLI", [System.EnvironmentVariableTarget]::Machine)
PS C:\WINDOWS\system32>
```
PowerShellを起動してコマンド実行。バージョンが表示された！
```
PS C:\Users\Windows3_1> gh --version
gh version 2.50.0 (2024-05-29)
https://github.com/cli/cli/releases/tag/v2.50.0
PS C:\Users\Windows3_1>
```
ようやく冒頭の2つ目に進める…え？
```
PS C:\Users\Windows3_1> gh copilot-cli auth
unknown command "copilot-cli" for "gh"
```
まだダメなの？？

## GitHub Copilot CLI のインストール

:::note warn
エラーメッセージから、`gh` コマンドは認識されていますが、`copilot-cli` サブコマンドが不明であることがわかります。これは、GitHub Copilot CLI がインストールされていないか、`gh` のバージョンが古いことが原因です。

GitHub Copilot CLI をインストールして `gh` を最新バージョンに更新するには、以下の手順を実行してください：

1. PowerShell を管理者権限で開きます。

3. 以下のコマンドを実行して、GitHub Copilot CLI の最新バージョンをインストールします：
   ```
   gh extension install github/gh-copilot
   ```

4. インストールが完了したら、以下のコマンドを実行して、GitHub Copilot CLI が正しくインストールされたことを確認します：
   ```
   gh copilot --version
   ```
   バージョン情報が表示されれば、インストールは成功です。

これで、`gh copilot-cli auth` コマンドが正常に動作するはずです。GitHub Copilot の認証を進めることができます。
:::

```
PS C:\WINDOWS\system32> gh extension install copilot-cli
To get started with GitHub CLI, please run:  gh auth login
Alternatively, populate the GH_TOKEN environment variable with a GitHub API authentication token.
```

え？また、エラー？？？

## Github認証の設定
:::note 
エラーメッセージから、GitHub CLI (`gh`) を使用するために認証が必要であることがわかります。

GitHub CLI を認証するには、以下の手順を実行してください：

1. PowerShell を開きます（管理者権限は不要です）。

2. 以下のコマンドを実行して、GitHub にログインします：
   ```
   gh auth login
   ```

3. 以下のプロンプトが表示されたら、認証方式を選択します：
   ```
   ? What account do you want to log into?
   ❯ GitHub.com
     GitHub Enterprise Server
   ```

4. 以下のプロンプトが表示されたら、認証プロトコルを選択します：
   ```
   ? How would you like to authenticate?
   ❯ Login with a web browser
     Paste an authentication token
   ```

5. デフォルトのブラウザが開き、GitHub のログイン画面が表示されます。GitHub アカウントでログインし、必要な権限を付与します。

6. 認証が成功すると、PowerShell に以下のようなメッセージが表示されます：
   ```
   ✓ Authentication complete. Press Enter to continue...
   ```
   Enter キーを押して続行します。

これで、GitHub CLI が認証され、`gh extension install copilot-cli` コマンドを実行して GitHub Copilot CLI をインストールできるはずです。

インストールが完了したら、`gh copilot-cli auth` コマンドを実行して GitHub Copilot の認証を進めることができます。
:::

ブラウザを開き、事前にGitHubにログインしておく。そして、コマンドを実行。

```
PS C:\Users\Mining-Base> gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations on this host? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? How would you like to authenticate GitHub CLI? Login with a web browser

! First copy your one-time code: XXXX-XXXX
Press Enter to open github.com in your browser...
```
Enterキーを押して認証に移る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792051/fff60025-df30-6b71-ea3f-b65776732ce7.png)

"Authorize Gihub"をクリックするとPowerShellも更新された。

```
Press Enter to open github.com in your browser...
✓ Authentication complete.
- gh config set -h github.com git_protocol https
✓ Configured git protocol
✓ Logged in as hogehoge
```

GitHub Copilot CLI のインストールを再開

```
PS C:\WINDOWS\system32> gh extension install github/gh-copilot
✓ Installed extension github/gh-copilot
PS C:\WINDOWS\system32> gh copilot --version
version 1.0.3 (2024-05-08)
```

ようやくできた…疲れた。

## PowerShellにCopilotのエイリアスを設定する

- PowerShellを実行し、プロファイルを開いて編集する。
```
PS C:\Users\Windows3_1> notepad $PROFILE
```
- プロファイルの最下行に追加して保存
```
function Invoke-Copilot {
    gh copilot $args
}
Set-Alias -Name copilot -Value Invoke-Copilot
```
- PowerShellを閉じて、新しく開き、バージョンを確認。

```
PS C:\Users\Windows3_1> gh copilot --version
version 1.0.3 (2024-05-08)
PS C:\Users\Windows3_1> copilot --version
version 1.0.3 (2024-05-08)
```

# PowerShellでCopilotを使用する
やっと本題！
```
PS C:\Users\Windows3_1> copilot suggest 'ファイル名に任意の文字列を含むファイルを探すコマンド'

Welcome to GitHub Copilot in the CLI!
version 1.0.3 (2024-05-08)

I'm powered by AI, so surprises and mistakes are possible. Make sure to verify any generated code or suggestions, and share feedback so that we can learn and improve. For more information, see https://gh.io/gh-copilot-transparency

? What kind of command can I help you with?
> generic shell command

Suggestion:

  find . -name "*任意の文字列*"

? Select an option
> Explain command

Explanation:

  • find is used to list files.
    • . specifies the starting directory for the search (current directory in this case).
    • -name "*任意の文字列*" specifies the pattern to search for.
      • "*任意の文字列*" is a wildcard pattern that matches any characters surrounded by any other characters.
      • This will search for files or directories that have the specified string anywhere in their names.



? Select an option
> Exit
PS C:\Users\Windows3_1>
```

やっと動いた！長かった…（涙）

コマンドがエラーになるときは、GitHub認証をしてから、再度コマンドを実行する。
```
gh auth login
```