2日間の演習に共通する環境、ブランチの付け方、記録の書き方、用語をまとめたページです。Day1 の最初に一度目を通し、あとは迷ったときに戻ってきてください。
演習環境の全体像
2日間の演習は、Claude Desktop、VSCode、GitLab の演習リポジトリ、GitLab CI の4か所を行き来します。指示を出すのが Claude Desktop、書かれたものを読んで直すのが VSCode、変更を出して機械に判定させるのが GitLab と CI です。
資料に出てくる D2 は貴社の PowerShell 版ハーネス、smart3pm は貴社の bash 版ハーネスの呼び名です。
| 登場人物 | やること | 出てくる場面 |
|---|---|---|
| 受講者 | Issue の粒度を決め、指摘を採るか採らないかを決め、マージを承認します。2日間で人に残すのはこの3つです | 全演習 |
| Claude Desktop | プロジェクトを開いて指示を受け、コードと設定ファイルを書きます。統合ターミナルと worktree の操作も中にあります | 全演習 |
| VSCode | 書かれたものを読み、手で直し、ソース管理ペインでコミットと同期を行います | 全演習 |
| GitLab | ブランチ、MR、差分、パイプラインの結果を Web 画面で見せます | ハンズオン1 から3 |
| GitLab CI | lint / test / review / gate を全員の変更に同じ基準で当てます | ハンズオン1 から3 |
図に出てくる語のうち、3つだけ先に押さえてください。MR(Merge Request)は、自分のブランチを main に合流させる申請です。ai_review は MR の差分を AI に読ませ、指摘をコメントとして置くジョブです。ai_gate は、その指摘に重大なものがあればパイプラインを落とすジョブです。残りの語は末尾の用語集にあります。
- 手元で書いた変更は、ブランチと MR を経由してしか main に入らない
- 自動で走る CI は lint / test / review / gate の4段6本。5段目の implement は手動で、ハンズオン3まで押さない
- 指摘を出す ai_review と、落とす ai_gate は別のジョブになっている
- 夜間ループが自動で進めるのは MR を作るところまでで、マージは人が押す
findings-*.json は手元に残ります。下の配布物 ZIP は研修後に自社へ持ち帰るもので、リポジトリには入りません。測った数字と自分の判断が ZIP 側にあるのは、研修環境から切り離しても読める形にしておくためです。手元のフックと CI に同じ検査を置く理由
手元のフックと CI は、同じことを別の速さでやっています。フックは書いたその瞬間に止めるので気づくのが速く、CI は全員の変更に同じ基準で当たるので取りこぼしません。片方だけにすると、速いが人によって基準が違う状態か、正確だが直すのが翌日になる状態のどちらかになります。
同じコミットに2本のパイプラインが並ぶ仕組み
50_環境別のフック設計/環境別のフック設計.md に、環境が違うときのフックの組み方をまとめています。プチ演習3 とプチ演習6 で該当箇所に触れます。各演習の読み方
プチ演習8本とハンズオン3本は、同じ6つの見出しで書いてあります。先に「目的」と「達成状態」を読んで、何ができれば終わりかを決めてから手順に入ってください。
| 見出し | 書いてあること |
|---|---|
| 目的 | この演習で何ができるようになるか。作業の説明ではなく、身に付くことが書いてあります |
| 準備 | 始める前にそろっている状態。開いておく画面、いるファイル、前の演習の成果物です |
| 手順 | 番号付きの操作。1項目1操作で、画面の名前とボタンの名前が入ります |
| 達成状態 | できたと自分で判定できる形。講師に聞かずに終わりを決められます |
| 解説と補足 | なぜこうするか、背景、別のやり方。折りたたみの中にあります |
| 影響範囲 | この変更が何に効くか。壊れるとしたら何が壊れるか。自社に写すときの置き場所です |
手順の文には、どこで操作するかを書いています。書き方と画面の対応は次のとおりです。
| 手順の書き方 | 操作する場所 |
|---|---|
| 「Claude Desktop に」「次を送る」 | Claude Desktop の入力欄。文章をそのまま貼り付けて送ります |
「/rewind」のようにスラッシュで始まるもの | Claude Desktop の入力欄 |
| 「ターミナルで」 | Claude Desktop の統合ターミナル。右上の >_ アイコン、または Ctrl+バッククォートで開きます。WSL セッションで作業している方は統合ターミナルが使えないので、Windows Terminal で WSL を開き、リポジトリのルートへ移動してから同じコマンドを打ちます。その場合、フックのテストランナーは bash 版(run_cases.sh)です |
| 「VSCode で開く」 | 左のエクスプローラーでファイルをクリックします。見えないときは 表示 > エクスプローラー です |
| 「ソース管理ペインで」 | VSCode の左サイドバーにある枝分かれのアイコン。コミットと同期はここです。SourceTree などの Git クライアントやコマンドで進める方は、下の対応表で読み替えてください |
| 「ブラウザで」 | GitLab の画面。事前セットアップでログインした https://gitlab-09291006aidev.give-app.net です |
Git の操作は VSCode のソース管理ペインで書いています。普段 SourceTree などの Git クライアントを使っている方、コマンドで進めたい方は、次の対応で読み替えてください。手順に出てくる操作はこの6種類だけです。
| 手順の操作 | VSCode のソース管理ペイン | コマンド | SourceTree |
|---|---|---|---|
| 変更されたファイルを見る | 変更の一覧 | git status | 左の「作業コピー」の一覧 |
| ファイルをステージする | ファイル名の横の + | git add <ファイル> | ファイルにチェックを付ける |
| 行を選んでステージする | 差分で行を選び「選択範囲をステージ」 | git add -p <ファイル> | 差分で行を選び「選択した行をステージ」 |
| コミットする | メッセージを書いて「コミット」 | git commit -m "メッセージ" | メッセージを書いて「コミット」 |
| push する | 「変更の同期」または「ブランチの発行」 | git push -u origin <ブランチ> | 「プッシュ」 |
| main を最新にする | 「…」メニューの「プル」 | git pull | 「プル」 |
| ブランチを作る | 左下のブランチ名から「新しいブランチの作成」 | git switch -c <ブランチ> | 「ブランチ」 |
確認が出ないモード
Mac をお使いの方の読み替え
Claude Desktop と VSCode の操作は Windows と同じです。ターミナルで打つコマンドだけ、PowerShell をターミナル(zsh)に読み替えてください。.ps1 で終わるスクリプトは同じ名前の .sh、パスの \ は / になります。git のコマンドはどちらも同じです。フックの登録は、"command": "powershell.exe" と args の組を "command": "bash" と "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/<名前>.sh"] に差し替えます。bash 版のフックは jq を使います。
手順の中に Mac 向けとして書いた bash ... の行は、Windows では打たないでください。既定の設定で入れた Git for Windows では、PowerShell から bash が見つからないか、WSL の bash が起動して別の環境で走ります。Windows の方は、並べて書いてある PowerShell 版の行だけを使います。
共通の進め方
11本の演習は、この5つの操作の上に乗ります。プチ演習1から6で使うのは STEP 1 から STEP 3 までで、手元の設定を足してコミットするところまでです。プチ演習7と8はコミットもしないので、この5つの操作は出てきません。MR とパイプラインが出てくるのはハンズオンです。各カードの [Nmin] は当日の目安です。
yamada としています。ご自身の演習では、社用メールアドレスの「@ より前」をそのまま使ってください。ブランチ名に使うのは同じ文字列です。
Claude Desktop の基本動作
[4min]
研修では Claude Desktop を使います。演習の手順で「Claude Desktop に送る」と書いてあるところは、すべてこの4つの動作の組み合わせです。各演習ではこの節を前提にして、送る文章と見るところだけを書きます。
- 1プロジェクトフォルダを選びます。新しいセッションを始めると、入力欄の上の行で環境、プロジェクトフォルダ、ブランチを選べます。プロジェクトフォルダに演習リポジトリ
dl-training-appのフォルダを指定します。 - 2パーミッションモードを 手動 にします。入力欄の下の行の左にあるモード名を押して選びます。新しいセッションを開いたときは、送る前にここを一度見てください。
- 3指示を出します。入力欄に日本語の文章を貼り付けて送ります。ファイル名は文章の中にそのまま書いて構いません。
- 4結果を見ます。書き換えたファイルの名前と差分が返信の中に並びます。実行前に確認が出たら、その1回を許可する側の選択肢を選びます。書かれた中身は VSCode で開いて自分の目で確かめてください。
パーミッションモードは画面の表示で 自動 / 手動 / 編集を受け入れる / プラン の4つです。自動 では確認が出ないため、プチ演習2 と3 の「止まる」ことを見る演習が成立しません。2日間は 手動 のまま進めてください。プチ演習2 の手順4 だけ、確認の出方を見るために一時的に 編集を受け入れる に切り替えます。
.claude/settings.json とフックはセッションの開始時に読まれます。書き換えたあとは、セッションを開き直して初めて新しい設定で動きます。プチ演習1 から3 は、この開き直しを毎回はさみます。同じ設定ファイルは Claude Desktop と CLI の両方が読むので、どちらで書いても効きます。
- プロジェクトフォルダが
dl-training-appになっている - パーミッションモードが 手動 になっている
CLI の位置づけ
研修では Claude Desktop を使います。同じことは CLI でもできるので、すでにターミナルで使っている方はそちらで進めていただいて構いません。設定ファイルは両方が同じものを読むため、.claude/settings.json の権限もフックも CLAUDE.md も、どちらで書いても効きます。演習の達成状態はどちらでも同じです。
腰を据えて使い込む段階に入ると、CLI のほうが自動化に載せやすくなります。差は1つで、対話画面を開かずに1回だけ走らせる形(claude -p)が CLI にしかありません。この形が取れると、出力をそのままファイルに残して CI のジョブや夜間のスケジュール実行に組み込めます。ハンズオン3 の夜間ループが、その実物です。
ブランチ名の形
[3min]
演習で作るブランチは ex/<演習番号>-<ユーザー名> です。演習番号は、プチ演習が p1 から p4、ハンズオンが h2 と h3 です。プチ演習5 は ex/p4- のブランチのまま、プチ演習6 はハンズオン2 の ex/h2- のブランチのまま進めます。プチ演習3なら ex/p3-yamada、ハンズオン2なら ex/h2-yamada になります。切り替えの操作は STEP 3 のソース管理ペインで行います。
ハンズオン1だけは例外です。Claude Desktop の入力欄の上の行で、ブランチ名の右にある ワークツリー にチェックを入れて開始すると、そのセッションだけが隔離した作業ツリーで動きます。名前の入力欄は無く、ブランチ名は worktree- で始まる名前が自動で付きます。入力欄の上に出たブランチ名を控え、以降この資料の worktree-issue-1 は控えた名前に読み替えてください。作業ツリーは .claude/worktrees/ の下に1つできます。
配布した .claude/settings.json には worktree.baseRef = head が入っているので、ワークツリーは開始したときに乗っていたブランチの HEAD から切られます。ハンズオン1 では ex/p3- の最後のコミットが分岐元です。コミットしていない変更は入りません。
| 演習 | ブランチ | 切る元 | そこで足すもの |
|---|---|---|---|
| プチ演習1 | ex/p1-<ユーザー名> | main | model と effort の設定、レビュアー定義2本 |
| プチ演習2 | ex/p2-<ユーザー名> | ex/p1- | deny 10本と ask 3本 |
| プチ演習3 | ex/p3-<ユーザー名> | ex/p2- | 読み取りの deny 3本、PreToolUse フック |
| ハンズオン1 | worktree- で始まる自動の名前 | ex/p3- の HEAD | Issue #1 の改修 |
| プチ演習4・5 | ex/p4-<ユーザー名> | ex/p3- | PostToolUse フック、JSON ゲート |
| ハンズオン2 | ex/h2-<ユーザー名> | ex/p4- | REVIEW.md、観点別レビュアー、CI ゲート |
| プチ演習6 | ex/h2-<ユーザー名> のまま | 切らない | Stop フック |
| ハンズオン3 | ex/h3-<ユーザー名> | ex/h2- | SessionStart フック、夜間ジョブ |
main に戻らない理由
.claude/settings.json に足す設定は、2日間を通して積み上がっていきます。演習中は誰の MR もマージしないので main は動かず、毎回 main から切り直すと前の演習で足した設定が消えて次の演習が成り立ちません。main から切るのはプチ演習1 だけで、それ以降は上の表の「切る元」に切り替えてから新しいブランチを作ってください。Day2 の最初は、Day1 の ex/p3- に切り替えてから ex/p4- を作ります。
ex/ は人が手で始めた演習、worktree- は Claude Desktop のワークツリー、ai/ は /implement-issue が作ったもの、nightly/ は CI の夜間ジョブが作ったものです。MR の一覧を見たときに、誰が始めた変更かが名前だけで分かります。VSCode のソース管理ペイン
[6min]
変更の確認、コミット、同期、ブランチの切り替えは、すべて VSCode の画面でできます。左サイドバーの枝分かれのアイコンがソース管理ペインです。アイコンの右上の数字が、いま変わっているファイルの数です。
- 1ブランチを切り替えます。ウィンドウ左下にいまのブランチ名が出ています。そこをクリックして、一覧から選ぶか 新しいブランチの作成 で新規に作ります。
- 2差分を見ます。変更 の一覧でファイル名をクリックすると、左に変更前、右に変更後が並びます。AI が書いたものは必ずここで読んでください。
- 3ステージに上げます。ファイル名の右の + を押します。変更したファイルだけを選んで押してください。フックが作った作業ファイルまで巻き込まないためです。
- 4メッセージを書いてコミットします。入力欄に日本語の1行を書き、コミット を押します。
- 5同期します。変更の同期 を押すと、手元のコミットが GitLab へ送られ、GitLab 側の更新が手元に入ります。
コミットは1つの変更意図につき1つです。10個の変更を1コミットにまとめると、そのうち1つを取り消したいときに手作業で切り分けることになります。メッセージは「見積一覧の顧客名検索をプレースホルダに置き換える」のように、何をどうしたかを書きます。ファイル名を並べたメッセージは、あとで履歴を読むときに何も足しません。
/rewind で戻せるのは AI がファイルの編集として行った変更だけです。コマンドで動かした分、サブエージェントの変更、手で直した分は戻りません。全部まとめて効く保険は、作業の前後のコミットだけです。
切り替えで止まったときの見方
ブランチを切り替えようとして拒まれたときは、前の演習の変更がコミットされていません。ソース管理ペインの 変更 に残っているものをコミットしてから、もう一度切り替えてください。同期でユーザー名とパスワードを聞かれたら、事前セットアップで変更した GitLab のパスワードを入れます。
- 左下のブランチ表示が
ex/で始まる名前になっている(ハンズオン1 だけは控えたworktree-で始まる名前) - ソース管理ペインの 変更 に、前の演習の変更が残っていない
GitLab の Web 画面
[8min]
MR の作成、差分の確認、パイプラインの確認、マージの判断はブラウザで行います。main はブランチ保護がかかっており、合流の経路は MR だけです。
- 1MR を作ります。同期したあとにプロジェクトの画面を開くと、上部に Create merge request の帯が出ます。出ていないときは左メニューの Code > Merge requests から New merge request を押します。
- 2合流先が
main、元が自分のブランチになっていることを確かめます。 - 3説明欄には、リポジトリの既定のテンプレート(
.gitlab/merge_request_templates/Default.md)が最初から入っています。変更概要 と 影響範囲 を先に埋め、AI レビュー結果 の表は演習の途中で埋めます。 - 4差分は Changes タブで読みます。行の左に出るアイコンから、その行に直接コメントを付けられます。
- 5パイプラインは Pipelines タブで見ます。落ちたジョブの名前をクリックするとログが開きます。
- 6Merge は押しません。演習中は誰の MR もマージせず、開いたまま残してください。MR の一覧が2日間の記録になります。
Pipelines タブには、パイプラインが2本ずつ並びます。1本目は変更を出すたびに走るブランチ用で lint と test の2段4ジョブ、2本目は MR に対して走る MR 用で review と gate の2段2ジョブです。どちらも前の段が落ちると後ろの段は動きません。ブランチ用のいちばん右の implement にある nightly_implement は再生ボタンが付いた手動ジョブで、ハンズオン3まで押しません。
落ちたジョブのログの読み方
落ちた理由は、ログのいちばん下ではなく赤い行の直前にあります。ai_gate が止めたときは、止めた指摘がそのままログに並びます。
しきい値 P1 以上、確信度 0.0 以上の指摘を数えます。 confidence の無い指摘は 1.0、P0〜P3 以外の severity は P0 として数えます。 P1: 1 件 / P2: 3 件 / P3: 2 件 ゲートで止めた指摘 1 件 [P1] app/controllers/estimate_ctl.php:48 顧客名がSQL文字列へ連結されており、検索欄から任意のSQLを実行できます。db_select の第2引数にプレースホルダで渡してください。 直すか、直さない理由をMRのコメントに書いてから再実行してください。
どの指摘で止まったかが分かれば正しく読めています。
$ で始まる行が実行した命令で、最後に Job succeeded で終わっています。右側の Duration が計測表の所要に写す値です。findings.json は同じ右側の Job artifacts から取得します。
# の数字がパイプライン番号、右の Stages の丸が段ごとの結果です。マージを自分で押さない理由
書いた本人がマージまで通してしまうと、指摘を採るか採らないかの判断が自分だけで閉じます。人が残る仕事を「Issue の粒度決め」「マージ承認」「指摘の採否」の3つに絞る、という2日間の立場を運用の形にしたのがこの約束です。CI が緑になったら、MR の説明欄の 人が判断した採否 の表を埋めてください。直さなかった指摘には理由を書きます。理由が残っていないと、次の改修で同じ指摘が出て同じ時間を使います。
Closes #1 を説明欄に残すと、マージしたときに Issue が閉じます。演習中は閉じないので、書き換えずにそのまま残してください。ai_gate は初期状態で allow_failure: true です。落ちてもパイプライン全体は赤になりません。ハンズオン2でこの1行を外し、本当に合流を止めるゲートにします。test-phpunit だけ他より2分ほど長くかかりますが、止まっているように見えても待ってください。AI レビューのノートの読み方
[4min]
ai_review は MR にコメントを1本置きます。1件の指摘は severity、confidence、file、line、message、category の6つを持ちます。ノートは列挙するだけで、直すかどうかは決めません。
読む順番を決めておくと速くなります。severity で P0 と P1 だけを先に読み、次に confidence が 0.5 以下のものを「実物を確かめてから判断する」側に寄せ、最後に今回の変更の外を指している指摘を外します。この3手で、6件のノートが2件の判断に減ります。
ai_review_bot のコメントとして届きます。1行目にモデル名、深さ、差分の行数、その下に P0 から P3 の件数、続いて指摘の箇条書きです。ノートの本文の例
AIレビュー(モデル: claude-sonnet-5 / 深さ: quick / 差分 42 行) 見積一覧の検索条件とテストの差分を読み、6件を報告します。 P0 0 件 / P1 1 件 / P2 3 件 / P3 2 件 - [P1] app/controllers/estimate_ctl.php:48 (sql-injection / 確信度 0.9) 顧客名がSQL文字列へ連結されており、検索欄から任意のSQLを実行できます。db_select の第2引数にプレースホルダで渡してください。 - [P2] app/controllers/estimate_ctl.php:61 (spec-mismatch / 確信度 0.6) 期間の上限が指定日の 00:00 で切れるため、指定日当日の見積が一覧に出ません。 判定は ai_gate ジョブが行います(現在のしきい値 P1)。採否の理由はこのMRのコメントに書いてください。
ノートの見出し行に、使われたモデルと差分の行数が出ます。
P0 から P3 の線引き
P0 は動かないか壊すもの、P1 は実環境で落ちるか外部入力が素通しになるもの、P2 は指示との不一致と波及漏れ、P3 はそれ以外です。ai_gate の既定のしきい値 P1 は「P0 と P1 を止める」という意味です。この線引きは .claude/review.schema.json に書かれており、演習では変えません。自社版を作るのはハンズオン2です。
ai_review を加えると4行目になります。
統合ターミナルとコマンド
画面から実行できないものは、Claude Desktop の統合ターミナルから打ちます。右上の >_ アイコン、または Ctrl+バッククォートで開きます。セッションの作業ディレクトリで開き、Claude と同じ環境を共有するので、パスを移動する操作はいりません。2本目のタブが要るときは、ターミナルペーンの + で増やします。演習の手順で「ターミナルで」と書いてあるのは、すべてこのターミナルです。コマンドを打つ場面は2日間で十数か所あり、どれも統合ターミナルにそのまま貼れる形で書いてあります。
| やること | コマンド | 使う演習 |
|---|---|---|
| AI に読ませる差分をファイルに出す | git diff main --output=review-input.diff | プチ演習1、ハンズオン1 |
| 非対話で1回だけ走らせる | claude -p "指示" | ハンズオン3 |
| 消えたコミットを探す | git reflog | プチ演習2 |
> で書き出さずに --output= を使うのは、PowerShell 5.1 の > が UTF-16 のファイルを作り、日本語が読めなくなるためです。記録台帳と計測表
演習の成果物は、ファイルそのものより「どこに置くと決めたか」の記録のほうが後で効きます。台帳と計測表の2つを、演習のたびに1行ずつ書き足してください。書き足すのは演習の最後ではなく、生成物ができた直後です。
持ち帰り台帳.md
2日間で足す機能を1行ずつ記録します。演習中に決めるのは置き場所と担当で、ここが空欄のまま研修が終わると、持ち帰ったファイルは端末の中に残ったままになります。最後の列は「未 / 書いた / 置き場所まで決めた」の3つから選びます。
台帳の書き方の例
| 演習 | 足したもの | D2 での置き場所 | smart3pm での置き場所 | 担当 | 状態 | |---|---|---|---|---|---| | プチ演習1 | review-light.md / review-full.md | agents/ 配下(当日確定) | agents 相当の場所(当日確定) | 山田 | 置き場所まで決めた | | プチ演習2 | deny 5本 + CLAUDE.md の戻し方 | settings.json | settings 相当(当日確定) | 山田 | 未 |
1行目を Day1 の冒頭で書きます。
計測表
指摘の総数、うち P0 と P1、所要時間の3つを演習ごとに取り、採否を決めたら採用・見送りの件数を足します。Day2 の最後に、これが効果測定の初回の実測値になります。数字を取らないと、品質が上がったかどうかを言葉でしか言えません。
| 列 | 取り方 | 取るタイミング |
|---|---|---|
| 指摘の総数 | ノートの合計件数、または findings.json の findings の長さ | レビューを1回回すたび |
| うち P0 と P1 | P0 と P1 の合計。ノートの見出し行にそのまま出ます | 同上 |
| 所要時間 | レビューを頼んでから結果が返るまでの分数。CI はジョブ画面の Duration | 同上 |
| 採用・見送り | 「即修正」に仕分けた件数と、「将来課題」「意図した設計」に仕分けた件数を「1・3」の形で並べる | 採否を決めた直後 |
計測表の書き方の例
| 読ませ方 | 指摘の総数 | うち P0 と P1 | 採用・見送り | 所要時間(分) | |---|---|---|---|---| | 1 実装したセッションでそのまま依頼 | 4 | 1 | 1・3 | 2 | | 2 review-other サブエージェント | 6 | 2 | 2・4 | 3 | | 3 履歴を切った新しい会話 | 3 | 2 | 1・2 | 6 | | 4 CI の ai_review | 6 | 1 | 1・5 | 1 |
4行の並びは MR 説明の「AI レビュー結果」欄と同じにしてください。数字は例で、当日はご自身の結果を入れます。
- 持ち帰り台帳.md に、演習ごとの置き場所と担当が入っている
- 計測表に、ハンズオン1の3通りと CI の ai_review の4行がそろっている
| ファイル | D2 での置き場所 | smart3pm での置き場所 |
|---|---|---|
持ち帰り台帳.md | ハーネスの文書置き場(当日確定) | ハーネスの文書置き場(当日確定) |
計測表_Day1_Day2.md | 同上。効果測定の初回値として残します | 同上 |
置き場所の具体名は、ご自身の端末で開いたハーネスの構成に合わせて決めてください。この2つは公開できる内容なので、社内で共有する側に置いても差し支えありません。
用語集
2日間の資料と演習で、説明なしに出てくる語をまとめています。手が止まったらここに戻ってください。
| 語 | 意味 | 出てくる場所 |
|---|---|---|
| Claude Desktop | 研修で使うデスクトップアプリです。セッションの開始時にプロジェクトフォルダを選ぶと、そのフォルダのファイルを読み書きします。統合ターミナルと worktree の操作も中にあります。設定ファイルは CLI と共通です。 | 全演習 |
| ソース管理ペイン | VSCode 左サイドバーの枝分かれアイコンで開く画面です。変更の一覧、差分、ステージ、コミット、同期、ブランチの切り替えがここにまとまっています。演習の git 操作はこの画面で行います。 | 全演習 |
CLAUDE.md |
リポジトリ直下に置く指示書です。セッションの開始時に読み込まれ、AI はこの文章を参考にして動きます。文章なので「守るとは限らない」のが前提で、演習では「文脈であって設定ではない」と呼びます。 | プチ演習2、プチ演習4 |
settings.json |
.claude/settings.json。モデル、権限(permissions)、フック(hooks)をここに書きます。JSON が1文字でも壊れていると、ファイル全体が読まれずに既定値で動きます。セッションの開始時に読まれるため、書き換えたら Ctrl+N で新しいセッションを開きます。登録の確認は、このファイルを VSCode で開いて見ます。Claude Desktop の入力欄では /permissions と /hooks は使えません。 |
プチ演習1 から3 |
| フック(hook) | 決まった場面(ツールの実行前、実行後、応答の終了時など)で自動的に呼び出されるスクリプトです。settings.json の hooks に登録します。スクリプトは標準入力で JSON を受け取り、終了コードで結果を返します。演習のフックは PowerShell 版(.ps1)と bash 版(.sh)が .claude/hooks/ にあります。フックの単体テストは配布時点で22件あり、プチ演習3 とプチ演習4 で1件ずつ足します。 |
プチ演習3、プチ演習4、プチ演習6 |
| 環境別のフック設計 | 配布物の 50_環境別のフック設計/環境別のフック設計.md です。AI ツールが動く場所、コードの置き場所、ランタイムの版が研修環境と違うプロジェクトで、フックをどう組むかをまとめています。 |
プチ演習3、プチ演習6 |
exit 2 / $LASTEXITCODE |
スクリプトが終わるときに返す数字が終了コードです。フックでは 0 が「通す」、2 が「止める」の合図です。2 の効き方はイベントで違い、PreToolUse はツールの呼び出しを止めて標準エラーの文章を AI に返し、Stop は応答を終わらせずに作業を続けさせます。PostToolUse は実行済みなので止められず、標準エラーの文章を AI に渡すだけです。SessionStart はセッションを止めず、標準エラーの文章は利用者の画面に出るだけで AI には届きません。1 など 2 以外の数字は止める合図にならず、処理はそのまま進みます。直前に動かしたスクリプトの終了コードは、PowerShell では $LASTEXITCODE、bash では $? と打つと表示されます。 |
プチ演習3、プチ演習4、ハンズオン3 |
| サブエージェント | 別の会話として起こす、役割つきの AI です。定義は .claude/agents/<名前>.md に置き、使えるツールとモデルを絞れます。入力欄で @ を打つと一覧に <名前> (agent) として出るので、そこから選んで依頼文を続けます。 |
プチ演習1、ハンズオン1 |
| frontmatter | Markdown ファイルの先頭に --- で囲って書く設定の部分です。サブエージェントの定義では name / description / tools / model / effort がここに入ります。閉じの --- を消すと本文として読まれ、設定が効きません。 |
プチ演習1 |
/rewind |
巻き戻し機能です。入力欄に /rewind と打つと、これまでのメッセージの一覧が開きます。地点を選ぶと、復元の範囲を コードと会話 / 会話のみ / コードのみ から選ぶ確認画面に進みます。Esc を2回押す開き方は Claude Desktop では効きません。戻せるのはファイルの編集として行われた変更だけです。 |
プチ演習2 |
| パイプライン / ジョブ / ランナー | GitLab CI の用語です。変更や MR をきっかけに自動で走る一連の処理がパイプライン、その中の1つ1つ(lint-phpver、ai_review など)がジョブ、ジョブを実際に実行するサーバがランナーです。結果は MR の Pipelines タブに並びます。 |
ハンズオン1 から3 |
permission mode |
権限の効き方を決めるモード。Claude Desktop の画面に出るのは 手動 / 編集を受け入れる / プラン / 自動 の4つで、設定値ではそれぞれ default / acceptEdits / plan / auto です。設定値にはほかに dontAsk と bypassPermissions があり、bypassPermissions は Claude Desktop の設定で 権限をバイパス として出せます。dontAsk は画面に出ません。acceptEdits は作業ディレクトリ内の rm まで自動承認します。auto と bypassPermissions はプロジェクトの .claude/settings.json からは指定できません。 |
Day1 の権限の話、ハンズオン3 |
deny |
permissions.deny に書く拒否の規則。どのパーミッションモードでも効き、allow で例外を作れません。Bash(...) の規則は PowerShell ツールの呼び出しに当たらないので、Windows 向けには PowerShell(...) と対で書きます。コマンド文字列の照合なので、/bin/rm や bash -c "..." の形はすり抜けます。塞ぐのは PreToolUse フックの役目です。 |
プチ演習2、プチ演習3 |
PreToolUse |
ツールを実行する直前に走るフック。deny と同じくどのパーミッションモードでも走り、exit 2 で呼び出しを止めます。matcher が Bash だけだと PowerShell ツールの呼び出しでは走らないので、演習では Bash|PowerShell で登録します。演習では block-destructive がこれです。 |
プチ演習3 |
PostToolUse |
ツールの実行後に走るフック。ファイルの編集の後に check-phpver を走らせ、このプロジェクトの対象バージョン(PHP 7.4)で動かない構文を exit 2 で差し戻します。 |
プチ演習4 |
Stop hook |
応答を終えようとしたときに走るフック。{"decision":"block","reason":"..."} を標準出力すると、作業を続けさせます。演習では stop-gate がテストの通過を見ます。 |
プチ演習6、ハンズオン3 |
stop_hook_active |
Stop hook の入力 JSON に入る真偽値。継続で再び呼ばれたときに true になります。これを見ずに block を返し続けると、Claude Code が8回連続の block で打ち切るまで継続が繰り返され、そのぶんトークンを使います。 |
プチ演習6 |
effort |
考える深さ。low / medium / high / xhigh / max の5段です。settings.json の effortLevel、skill と agent の frontmatter、環境変数 CLAUDE_CODE_EFFORT_LEVEL で決まります。CLAUDE.md には書けません。 |
プチ演習1 |
worktree |
同じリポジトリの別の作業ツリー。Claude Desktop の入力欄の上の行で、ブランチ名の右にある ワークツリー にチェックを入れて開始すると作られます。名前の入力欄は無く、ブランチ名は自動で付きます。作業ツリーは <プロジェクトルート>/.claude/worktrees/ の下にできます。分岐元は settings.json の worktree.baseRef で決まり、配布した設定の head は開始時のブランチの HEAD から切ります。終了したらサイドバーのアーカイブのアイコンで削除します。gitignore されたファイルを持ち込むときは、プロジェクトルートに .worktreeinclude を置きます。 |
ハンズオン1 |
| 非対話実行 | 対話画面を開かずに1回だけ走らせる使い方です。claude -p "指示" の形で、Claude Desktop の統合ターミナルか CLI から呼びます。Claude Desktop の画面操作としては用意されていないのがこれです。確認が要る操作はその場で拒否されて先へ進むため、--permission-mode、--allowedTools、--max-turns で何を許すかと回数の上限を決めて初めて無人で動かせます。夜間ループはこの形です。 |
ハンズオン3 |
--bare |
CLAUDE.md もフックも読まずに起動します。制約が効かなくなるので実装側には使いません。履歴と文脈を切って読ませたいレビュー側にだけ使います。ログイン情報も読まないため、環境変数 ANTHROPIC_API_KEY が無い端末では起動しません。 |
ハンズオン1 の発展課題 |
--json-schema |
出力を JSON Schema の形に固定します。.claude/review.schema.json を渡すと findings の形で返り、そのまま判定スクリプトに流せます。 |
ハンズオン1 の補足 |
findings |
レビュー結果の配列。1件が severity / confidence / file / line / message / category を持ちます。CI では findings.json として artifacts に残ります。 |
プチ演習5、ハンズオン2 |
P0 〜 P3 |
指摘の重大度。P0 は動かないか壊すもの、P1 は実環境で落ちるか外部入力が素通しになるもの、P2 は指示との不一致と波及漏れ、P3 はそれ以外です。 | 全演習 |
confidence |
0 から 1 の数値。実物を読んで確認できた度合いです。経路の一部が読めていない指摘は 0.5 以下になります。件数を絞るときの2番目の手がかりです。 | プチ演習5、ハンズオン2 |
GATE_LEVEL |
ai_gate が落とす重大度の下限。既定は P1 で、P0 と P1 を止める意味です。.gitlab-ci.yml の variables か CI/CD Variables で変えられます。 |
ハンズオン2 |
allow_failure |
ジョブが落ちてもパイプライン全体を赤にしない設定。ai_gate は初期状態で true です。ハンズオン2でこの1行を外します。 |
ハンズオン2 |
artifacts |
ジョブが残すファイル。ジョブ画面の右側から取得できます。findings.json と PHPUnit のレポートがここに入ります。 |
ハンズオン2、ハンズオン3 |
pipeline schedule |
GitLab が決まった時刻にパイプラインを起動する仕組み。Build > Pipeline schedules から作ります。夜間ループの起動側です。 | ハンズオン3 |
| プロジェクトアクセストークン | プロジェクト単位で発行するトークン。演習ではロール Developer、スコープ api と write_repository で発行しています。CI_JOB_TOKEN では MR を作れないため、夜間ジョブはこちらを使います。 |
ハンズオン3 |
| masked variable | CI/CD Variables のマスク指定。ジョブのログで値が伏せ字になります。API キーとトークンは必ずこの指定を付けて登録します。 | Day1 の秘密情報の話、ハンズオン3 |
| MR | Merge Request。ブランチを main に合流させる申請です。演習では main が保護されており、合流の経路は MR だけです。 |
全演習 |
| Issue | 演習の題材。#1 から #5 まであり、本文は 背景 / 現状 / 期待する振る舞い / 受入条件 / 対象ファイル / 範囲外 の6節で書かれています。/implement-issue はこの6節の見出しをそのまま読みます。 |
ハンズオン1 から3 |
PHPCompatibility |
phpcs の規格。--standard=PHPCompatibility --runtime-set testVersion 7.4 で対象バージョンに無い構文を検出します。php -l は文法として正しければ通してしまうため、match 式や ?-> はこちらでないと捕まりません。 |
プチ演習4 |
exit 2」の補足です。上段が4イベントの位置で、起動時が SessionStart、ツール呼び出しの直前が PreToolUse、実行の直後が PostToolUse、応答を終える直前が Stop です。下段が終了コードの違いで、exit 0 は通し、exit 2 は止めて標準エラーの理由をモデルへ返します。この止め方が効くのは PreToolUse で、PostToolUse は理由を渡すだけ、SessionStart は利用者の画面に出すだけです。Stop は exit 2 と decision: block のどちらでも作業を続けさせられます。


