## 概要 [[GitHub Copilot CLI]]で[[AI]]レビューをしている。 - レビュー対象は[[Git]]の[[ワークツリー]]で作成 - ホストマシンで[[カスタムエージェント (GitHub Copilot CLI)|カスタムエージェント]]と[[スキル (GitHub Copilot)|スキル]]を使ってレビュー - [[サブエージェント (GitHub Copilot CLI)|サブエージェント]]は未使用 (不安定なので) - [[cmux]]で[[ワークスペース (cmux)|ワークスペース]]を立ち上げて実行 ただ、以下の課題がある。 - コマンドの承認が面倒 - とはいえ [[--allow-all-tools]] は恐い - 隔離環境として[[コンテナ (Docker)|コンテナ]]を使うしかない... というわけで[[Docker]]を使った環境構築についてチャレンジしてみる。 ## 対象リポジトリ - [[🦉GitHub Copilot CLI Sandbox]] ## やること - [ ] [[Docker]]を使って[[GitHub Copilot CLI]]を実行してみる - [x] 認証が通るか? - [ ] [[cmux]]での見え方はどうなるか? - [ ] ... # Ph1: まずやってみる ## [[Docker]]を使って[[GitHub Copilot CLI]]を実行してみる `Dockerfile` ```docker FROM node:24-bookworm-slim # 必要最低限のツール RUN apt-get update && apt-get install -y --no-install-recommends \ git \ bash \ ca-certificates \ ripgrep \ fd-find \ less \ procps \ && rm -rf /var/lib/apt/lists/* # Copilot CLI RUN npm install -g @github/copilot # 任意: fd コマンド名を揃える RUN ln -s /usr/bin/fdfind /usr/local/bin/fd || true # Copilot の設定場所 ENV COPILOT_HOME=/root/.copilot WORKDIR /work CMD ["copilot"] ``` ビルドする。 ```console docker build -t safe-copilot-cli . ``` 実行する。 ```console docker run --rm -it \ -v "$HOME/.copilot:/root/.copilot" \ -v "$PWD:/work" \ -w /work \ safe-copilot-cli ``` トークン指定がないと通らない。 ## トークンの作成と設定 [[COPILOT_GITHUB_TOKEN]]に[[Personal Access Token (GitHub)|Personal Access Token]]を設定する必要があるため作成する。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" /> <span class="link-card-v2-site-name">GitHub</span> </div> <div class="link-card-v2-title"> Build software better, together </div> <div class="link-card-v2-content"> GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute ... </div> <img class="link-card-v2-image" src="https://github.githubassets.com/assets/github-logo-55c5b9a1fe52.png" /> <a href="https://github.com/settings/personal-access-tokens"></a> </div> ![[2026-04-01-20-57-28.avif]] 以下を実行したところ、認証状態が反映された。 ```console docker run --rm -it \ -e COPILOT_GITHUB_TOKEN="$COPILOT_GITHUB_TOKEN" \ -v "$HOME/.copilot:/root/.copilot" \ -v "$PWD:/work" \ -w /work \ safe-copilot-cli ``` ## 権限を緩くする せっかくのsandbox環境なのでツールの許可設定を緩める。コマンドもあらかじめ入力しておく。 ```console docker run --rm -it \ -e COPILOT_GITHUB_TOKEN="$COPILOT_GITHUB_TOKEN" \ -v "$HOME/.copilot:/root/.copilot:ro" \ -v "$PWD:/work" \ -w /work \ safe-copilot-cli \ copilot --yolo -i "/review" ``` > [!danger] > [[--allow-all|--yolo]] は [[--allow-all-tools]] に加えて、すべてのpath, urlに対する実行を許可するため非常に危険。乗っ取られても問題ない隔離環境でのみ実行すること。 ## ホストの設定を同期する `~/.copilot` の設定を同期する。自分の環境ではシンボリックリンクを多用しているため、気合でマウントする必要があるが、`docker run` コマンドで制御できるので大きな問題ではない。 ```console docker run --rm -it \ -e COPILOT_GITHUB_TOKEN="$COPILOT_GITHUB_TOKEN" \ -v "$HOME/.copilot:/root/.copilot:ro" \ -v "$HOME/.copilot/copilot-instructions.md:/root/.copilot/copilot-instructions.md:ro" \ -v "$HOME/.claude/skills:/root/.claude/skills:ro" \ -v "$PWD:/work" \ -w /work \ safe-copilot-cli \ copilot --yolo -i "/task レビュー" ``` ## [[macOS]]専用コマンドが実行できない たとえば、[[GitHub Copilot CLI]]の中で[[cmux]]の操作や[[Obsidian]]を変更するコマンドは実行できない。[[Jenkins]]などのCIでも当然同じなので、この要件は諦めたほうがいい。 言い方を変えると、これらのジョブ(と呼ぶ)の実行状態は気にせず、終わったら[[Slack]]通知などの手段で伝える方がいい。 # Ph2: 設定やコマンドの見直し ## Dockerfileの設定しなおし 不要設定削除とrootユーザーの利用をやめる。 `Dockerfile` ```docker FROM node:24-bookworm-slim # less: ページャー用, procps: ps等のプロセス確認用 RUN apt-get update && apt-get install -y --no-install-recommends \ git \ bash \ ca-certificates \ ripgrep \ fd-find \ less \ procps \ && rm -rf /var/lib/apt/lists/* RUN npm install -g --no-fund @github/[email protected] RUN [ ! -e /usr/local/bin/fd ] && ln -s /usr/bin/fdfind /usr/local/bin/fd # node ユーザーが /work を読み書きできるよう権限付与 RUN mkdir -p /work && chown node:node /work USER node WORKDIR /work CMD ["copilot"] ``` ## コマンドの見直し [[#macOS 専用コマンドが実行できない]] で見つめ直した結果、設定なども独立した環境の方が良さそうなので、コマンドをシンプルにする。 ``` docker run --rm -it \ -e COPILOT_GITHUB_TOKEN="$COPILOT_GITHUB_TOKEN" \ -v "$PWD:/work" \ -w /work \ safe-copilot-cli \ copilot --no-auto-update --yolo -p "このリポジトリは何をやっている?" ```