gitlab-discussion について
`glab api` を使って GitLab のマージリクエストやイシューのスレッドを管理するスキルです。読み書き、行単位のコメント、解決操作、権限要件を説明します。
主な機能
- 01ディスカッションの一覧と取得
- 02イシューや MR のスレッド作成
- 03差分行へのコメント追加
- 04スレッドへの返信、編集、解決
- 05トークンスコープと権限の説明
活用シーン
- 01MR のディスカッション状況の確認
- 02変更行へのコメント投稿
- 03レビューのスレッドへの返信や解決
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ grandcamel/ gitlab-assistant-skills --skill gitlab-discussionインストール後、Claude Code で/gitlab-discussionを入力して読み込まれたか確認します。
詳細
ディスカッションスキル
glab api の生エンドポイント呼び出しを使用した、GitLab のスレッド形式のディスカッション管理です。
クイックリファレンス
| 操作 | コマンドパターン | リスク |
|---|---|---|
| MR のディスカッションを一覧表示 | glab api projects/:id/merge_requests/:iid/discussions | - |
| イシューのディスカッションを一覧表示 | glab api projects/:id/issues/:iid/discussions | - |
| ディスカッションを取得 | glab api projects/:id/merge_requests/:iid/discussions/:id | - |
| ディスカッションを作成 | glab api projects/:id/merge_requests/:iid/discussions -X POST -f ... | ⚠️ |
| ディスカッションに返信 | glab api projects/:id/.../discussions/:id/notes -X POST -f ... | ⚠️ |
| ディスカッションを解決 | glab api projects/:id/.../discussions/:id -X PUT -f resolved=true | ⚠️ |
| ノートを削除 | glab api projects/:id/.../discussions/:id/notes/:nid -X DELETE | ⚠️⚠️ |
リスクの凡例:- 安全 | ⚠️ 注意 | ⚠️⚠️ 警告 | ⚠️⚠️⚠️ 危険
このスキルを使用する場面
必ず使用する場合:
- ユーザーが「discussion」「thread」「conversation」に言及した場合
- ユーザーがコードレビューのコメントを追加したい場合
- ユーザーがディスカッションの「resolve」「unresolve」に言及した場合
- ユーザーが既存のコメントやスレッドに返信したい場合
- ユーザーが MR の特定行にコメントしたい場合
使用しない場合:
- ユーザーが単純なノートやコメントを追加したい場合(
glab mr noteまたはglab issue noteを使用) - ユーザーが MR の変更をレビューしたい場合(gitlab-mr を使用)
- ユーザーがコメントを検索したい場合(
notesスコープを指定して gitlab-search を使用)
API の前提条件
必須トークンスコープ: api
権限:
- ディスカッションの読み取り:Reporter 以上(非公開リポジトリの場合)
- ディスカッションの作成:Reporter 以上
- ディスカッションの解決:Developer 以上(または MR の作成者)
使用可能なコマンド
MR のディスカッションを一覧表示
# List all discussions on MR
glab api projects/123/merge_requests/1/discussions --method GET
# With pagination
glab api projects/123/merge_requests/1/discussions --paginate
# Using project path
glab api "projects/$(echo 'mygroup/myproject' | jq -Rr @uri)/merge_requests/1/discussions"
イシューのディスカッションを一覧表示
# List all discussions on issue
glab api projects/123/issues/42/discussions --method GET
# With pagination
glab api projects/123/issues/42/discussions --paginate
特定のディスカッションを取得
# Get MR discussion by ID
glab api projects/123/merge_requests/1/discussions/abc123 --method GET
# Get issue discussion by ID
glab api projects/123/issues/42/discussions/def456 --method GET
MR にディスカッションを作成
# Create general discussion
glab api projects/123/merge_requests/1/discussions --method POST \
-f body="This looks good overall, but I have some suggestions."
# Create discussion on specific line (diff note)
glab api projects/123/merge_requests/1/discussions --method POST \
-f body="This could be simplified using a helper function." \
-f position[base_sha]="abc123" \
-f position[head_sha]="def456" \
-f position[start_sha]="abc123" \
-f position[position_type]="text" \
-f position[new_path]="src/app.py" \
-f position[new_line]=42
# Create discussion on old line (removed code)
glab api projects/123/merge_requests/1/discussions --method POST \
-f body="Why was this removed?" \
-f position[base_sha]="abc123" \
-f position[head_sha]="def456" \
-f position[start_sha]="abc123" \
-f position[position_type]="text" \
-f position[old_path]="src/old.py" \
-f position[old_line]=15
# Create suggestion
glab api projects/123/merge_requests/1/discussions --method POST \
-f body='```suggestion
def improved_function():
return "better implementation"
```'
イシューにディスカッションを作成
# Create discussion
glab api projects/123/issues/42/discussions --method POST \
-f body="I think we should reconsider this approach."
ディスカッションに返信
# Reply to MR discussion
glab api projects/123/merge_requests/1/discussions/abc123/notes --method POST \
-f body="Good point, I'll fix this."
# Reply to issue discussion
glab api projects/123/issues/42/discussions/def456/notes --method POST \
-f body="I agree with the above."
ディスカッションを解決/未解決にする
# Resolve MR discussion
glab api projects/123/merge_requests/1/discussions/abc123 --method PUT \
-f resolved=true
# Unresolve MR discussion
glab api projects/123/merge_requests/1/discussions/abc123 --method PUT \
-f resolved=false
ノートを更新
# Update note in discussion
glab api projects/123/merge_requests/1/discussions/abc123/notes/789 --method PUT \
-f body="Updated comment text"
ノートを削除
# Delete note from discussion
glab api projects/123/merge_requests/1/discussions/abc123/notes/789 --method DELETE
差分ノート用の Position オブジェクト
MR の特定行にコメントするには、position 情報を指定する必要があります。
| フィールド | 必須 | 説明 |
|---|---|---|
base_sha | はい | base commit(ターゲットブランチ)の SHA |
head_sha | はい | head commit(ソースブランチ)の SHA |
start_sha | はい | start commit の SHA |
position_type | はい | コードの場合は text、画像の場合は image |
new_path | 新規/変更の場合 | 新しいバージョンのパス |
new_line | 新規/変更の場合 | 新しいバージョンの行番号 |
old_path | 削除の場合 | 古いバージョンのパス |
old_line | 削除の場合 | 古いバージョンの行番号 |
Position 用の SHA を取得
# Get MR details to find SHAs
mr_info=$(glab api projects/123/merge_requests/1)
base_sha=$(echo "$mr_info" | jq -r '.diff_refs.base_sha')
head_sha=$(echo "$mr_info" | jq -r '.diff_refs.head_sha')
start_sha=$(echo "$mr_info" | jq -r '.diff_refs.start_sha')
echo "Base: $base_sha"
echo "Head: $head_sha"
echo "Start: $start_sha"
よくあるワークフロー
ワークフロー 1:コメントを付けて MR をレビュー
project_id=123
mr_iid=1
# Get diff refs
mr_info=$(glab api projects/$project_id/merge_requests/$mr_iid)
base_sha=$(echo "$mr_info" | jq -r '.diff_refs.base_sha')
head_sha=$(echo "$mr_info" | jq -r '.diff_refs.head_sha')
start_sha=$(echo "$mr_info" | jq -r '.diff_refs.start_sha')
# Add comment on line 42 of new file
glab api projects/$project_id/merge_requests/$mr_iid/discussions --method POST \
-f body="Consider adding error handling here." \
-f position[base_sha]="$base_sha" \
-f position[head_sha]="$head_sha" \
-f position[start_sha]="$start_sha" \
-f position[position_type]="text" \
-f position[new_path]="src/handler.py" \
-f position[new_line]=42
ワークフロー 2:すべてのディスカッションを解決
# Get all unresolved discussions
glab api projects/123/merge_requests/1/discussions --paginate | \
jq -r '.[] | select(.notes[0].resolvable == true and .notes[0].resolved == false) | .id' | \
while read discussion_id; do
echo "Resolving: $discussion_id"
glab api projects/123/merge_requests/1/discussions/$discussion_id --method PUT \
-f resolved=true
done
ワークフロー 3:未解決のディスカッションを一覧表示
# Show unresolved discussions with content
glab api projects/123/merge_requests/1/discussions --paginate | \
jq -r '.[] | select(.notes[0].resolvable == true and .notes[0].resolved == false) | "[\(.id)] \(.notes[0].author.username): \(.notes[0].body | split("\n")[0])"'
ワークフロー 4:提案を追加
project_id=123
mr_iid=1
mr_info=$(glab api projects/$project_id/merge_requests/$mr_iid)
base_sha=$(echo "$mr_info" | jq -r '.diff_refs.base_sha')
head_sha=$(echo "$mr_info" | jq -r '.diff_refs.head_sha')
start_sha=$(echo "$mr_info" | jq -r '.diff_refs.start_sha')
# Create suggestion (multi-line needs proper escaping)
glab api projects/$project_id/merge_requests/$mr_iid/discussions --method POST \
-f body='```suggestion
const result = await fetchData();
return result.data;
```' \
-f position[base_sha]="$base_sha" \
-f position[head_sha]="$head_sha" \
-f position[start_sha]="$start_sha" \
-f position[position_type]="text" \
-f position[new_path]="src/api.js" \
-f position[new_line]=25
ワークフロー 5:ディスカッションのアクティビティを要約
# Count discussions by state
glab api projects/123/merge_requests/1/discussions --paginate | \
jq '{
total: length,
resolved: [.[] | select(.notes[0].resolved == true)] | length,
unresolved: [.[] | select(.notes[0].resolvable == true and .notes[0].resolved == false)] | length
}'
トラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
| 400 Bad Request | position フィールドが不足しています | 必須の position フィールドをすべて含めてください |
| 404 Discussion not found | ディスカッション ID が無効です | ディスカッションが存在することを確認してください |
| 解決できない | 解決可能ではない、または権限がありません | ノートの種類と権限を確認してください |
| Position が無効 | SHA または行番号が間違っています | MR から最新の diff_refs を取得してください |
| ノートが空 | Body が設定されていません | -f body=... パラメーターを確認してください |
ディスカッションとノートの違い
- ディスカッション:複数のノートや返信を含められるスレッドです
- ノート:ディスカッション内の単一のコメントです
- 解決可能:MR の差分上のディスカッションは解決/未解決にできます
- システムノート:自動生成されるノート(コミット、ステータス変更など)で、編集できません
関連ドキュメント
コメント
Markdown 対応