mcpField
G
gitlab-discussion

gitlab-discussion

github.com/grandcamel開発492 回インストール41 週間前に更新
リポジトリ

gitlab-discussion について

`glab api` を使って GitLab のマージリクエストやイシューのスレッドを管理するスキルです。読み書き、行単位のコメント、解決操作、権限要件を説明します。

主な機能

  1. 01ディスカッションの一覧と取得
  2. 02イシューや MR のスレッド作成
  3. 03差分行へのコメント追加
  4. 04スレッドへの返信、編集、解決
  5. 05トークンスコープと権限の説明

活用シーン

  1. 01MR のディスカッション状況の確認
  2. 02変更行へのコメント投稿
  3. 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 Requestposition フィールドが不足しています必須の position フィールドをすべて含めてください
404 Discussion not foundディスカッション ID が無効ですディスカッションが存在することを確認してください
解決できない解決可能ではない、または権限がありませんノートの種類と権限を確認してください
Position が無効SHA または行番号が間違っていますMR から最新の diff_refs を取得してください
ノートが空Body が設定されていません-f body=... パラメーターを確認してください

ディスカッションとノートの違い

  • ディスカッション:複数のノートや返信を含められるスレッドです
  • ノート:ディスカッション内の単一のコメントです
  • 解決可能:MR の差分上のディスカッションは解決/未解決にできます
  • システムノート:自動生成されるノート(コミット、ステータス変更など)で、編集できません

関連ドキュメント

コメント