mcpField
C
commit-push-pr

commit-push-pr

github.com/llama-farm開発83687 回インストール21 週間前に更新
リポジトリ

commit-push-pr について

変更のコミット、GitHub へのプッシュ、PR の作成や更新をエージェント向けに案内するスキルです。Conventional Commits、ユーザー確認、コミットフックの実行を重視します。

主な機能

  1. 01Git の状態とブランチを確認
  2. 02Conventional Commits 形式のメッセージ作成
  3. 03ステージ済み変更の問題を確認
  4. 04ブランチをプッシュして PR を処理

活用シーン

  1. 01ローカル変更をコミットして PR を作成
  2. 02未プッシュのコミットを既存 PR に反映

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/llama-farm/llamafarm --skill commit-push-pr

インストール後、Claude Code で/commit-push-prを入力して読み込まれたか確認します。

詳細

コミット、プッシュ、PR スキル

エッジケースを適切に処理しながら、変更のコミット、GitHub へのプッシュ、PR の作成を自動化します。

必読事項

実行する前に、以下の Git ワークフロー標準を把握してください。 @.claude/rules/git_workflow.md

主なルール:

  • Conventional Commits 形式を使用します:type(scope): description
  • コミットや PR で Claude に功績を帰属させないでください(共同作成者としての記載や言及を含む)
  • プリコミットフックをスキップしないでください(--no-verify は使用しないでください)

実行ワークフロー

ステップ 1:Git の状態を確認する

次のコマンドを実行して、現在の状態を確認します。

# Detect the default branch (main, master, etc.)
DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@')
# Fallback if symbolic-ref fails (e.g., shallow clone or missing HEAD)
if [ -z "$DEFAULT_BRANCH" ]; then
  DEFAULT_BRANCH=$(git remote show origin 2>/dev/null | grep 'HEAD branch' | awk '{print $NF}')
fi
# Final fallback to 'main' if detection fails
DEFAULT_BRANCH=${DEFAULT_BRANCH:-main}

# Get current branch
BRANCH=$(git branch --show-current)

# Check for uncommitted changes
git status --porcelain

# Check for unpushed commits (if branch has upstream)
git log origin/$DEFAULT_BRANCH..HEAD --oneline 2>/dev/null || echo "No upstream or no commits ahead"

# Check if branch has upstream tracking
git rev-parse --abbrev-ref @{upstream} 2>/dev/null || echo "No upstream"

状態を判定します:

  • HAS_CHANGES:コミットされていない変更(ステージ済み、未ステージ、または未追跡の変更)はありますか?
  • HAS_UNPUSHED:origin/$DEFAULT_BRANCH より先行しているコミットはありますか?
  • ON_DEFAULT_BRANCH:現在のブランチはデフォルトブランチ($DEFAULT_BRANCH)ですか?
  • HAS_UPSTREAM:ブランチはリモートを追跡していますか?
ステップ 2:「実行することがない」場合の処理

!HAS_CHANGES && !HAS_UNPUSHED の場合:

Inform user: "No changes to commit and no unpushed commits. Nothing to do."
Exit gracefully.
ステップ 3:「変更はないが、未プッシュのコミットがある」場合の処理

!HAS_CHANGES && HAS_UNPUSHED の場合:

  1. 既存の PR があるか確認します:
gh pr list --head "$(git branch --show-current)" --json number,url,title
  1. PR がある場合:

    • 既存の PR に更新をプッシュするか、ユーザーに確認します
    • PR の URL を報告します
  2. PR がない場合:

    • プッシュして新しい PR を作成するか、ユーザーに確認します
    • ステップ 7 に進みます
ステップ 4:ブランチ管理(HAS_CHANGES の場合)

デフォルトブランチ($DEFAULT_BRANCH)にいる場合:

  1. 変更をフィーチャーブランチに入れる必要があることをユーザーに伝えます
  2. 変更を分析するため、先にステージします:
git add -A
git diff --staged --stat
  1. 変更に基づいて Conventional Commits 形式のコミットメッセージを作成します(ステップ 5 を参照)

  2. コミットメッセージからブランチ名を作成します:

    • feat(cli): add project list → feat-cli-add-project-list
    • fix: resolve memory leak → fix-resolve-memory-leak
    • ルール:小文字を使用し、スペースや特殊文字をハイフンに置き換え、最大 50 文字にします
  3. 新しいブランチを作成してチェックアウトします:

git checkout -b <branch-name>

すでにフィーチャーブランチにいる場合:

  • 現在のブランチをそのまま使用します
  • 状況を把握するため、PR があるか確認します
ステップ 5:変更をステージしてコミットメッセージを作成する
  1. すべての変更をステージします:
git add -A
  1. ステージ済みの変更を分析します:
git diff --staged --stat
git diff --staged
  1. 次の内容に基づいて、Conventional Commits 形式のコミットメッセージを作成します:

    • 変更されたファイル(ディレクトリからスコープを推定)
    • 変更の種類(feat/fix/refactor/docs/test/chore)
    • 「何を」だけでなく「なぜ」を要約
  2. コミットメッセージをユーザーに提示します。書式の例:

Proposed commit message:

  feat(cli): add project listing command

  Adds a new 'lf project list' command that displays all projects
  in the current workspace with their status.

Do you want to use this message, modify it, or provide your own?
ステップ 5.5:品質チェック

スキップする条件:--quick フラグが指定された場合。

コミットする前に、ステージ済みの変更に対して品質チェックを実行します。

1. 軽微な問題を自動修正する(確認不要)

デバッグ用の記述を検索して削除します:

# Find files with debug statements
git diff --staged --name-only | xargs grep -l -E "(console\.(log|debug|info)|debugger|print\()" 2>/dev/null

見つかったファイルごとに:

  • console.log(...)、console.debug(...)、console.info(...) の文を削除します
  • debugger; の文を削除します
  • print(...) の文(Python)を削除します
  • 修正後、ファイルを再度ステージします

報告:「自動修正:M 個のファイルから N 個のデバッグ用記述を削除しました」

2. 対応が必要な問題を確認する

ステージ済みの差分をスキャンし、次の項目を確認します:

問題深刻度対応
ハードコードされたシークレット(API キー、パスワード)BLOCK自動修正不可。ユーザーが削除する必要があります
コマンドインジェクション(shell=True、os.system)BLOCK自動修正不可。ユーザーがリファクタリングする必要があります
空の catch/except ブロックPROPOSEエラーログの追加を提案します
重複したコードパターンPROPOSE抽出を提案します
未使用のインポートPROPOSE削除を提案します
TODO/FIXME コメントWARN報告しますが、続行できます
3. ブロック対象の問題を処理する

BLOCK の問題が見つかった場合:

  • 各問題をファイル名と行番号とともに列挙します
  • ワークフローを停止します
  • ユーザーが手動で修正し、再実行する必要があります
4. 提案可能な修正を処理する

PROPOSE の問題ごとに:

  • ファイル、行番号、問題、推奨する修正を表示します
  • 「この修正を適用しますか?(y/n/all/skip)」と確認します
  • 承認された場合:編集を適用し、再度ステージします
  • スキップされた場合:修正せずに続行します
5. 警告を処理する

WARN の問題について:

  • 概要を表示します
  • ブロックせずに続行します

Step 6: コミットを作成する

承認されたメッセージでコミットを作成します。

git commit -m "$(cat <<'EOF'
type(scope): short description

Optional longer description explaining the change.
EOF
)"

重要:

  • 複数行のメッセージには HEREDOC を使用します
  • co-author や Claude のクレジットを追加しないでください
  • pre-commit フックを実行させます(--no-verify は絶対に使用しないでください)

pre-commit フックが原因でコミットに失敗した場合:

  • 失敗したことをユーザーに報告します
  • フックの出力を表示します
  • --no-verify を使って再試行しないでください
  • 修正するか中止するか、ユーザーに確認します
Step 7: リモートにプッシュする
  1. ブランチにアップストリームが設定されているか確認します。
git rev-parse --abbrev-ref @{upstream} 2>/dev/null
  1. アップストリームがない場合は、-u を付けてプッシュします。
git push -u origin $(git branch --show-current)
  1. アップストリームがある場合は、通常のプッシュを行います。
git push

競合が原因でプッシュに失敗した場合:

  • 競合についてユーザーに伝えます
  • 次のコマンドを提案します:git pull --rebase origin $DEFAULT_BRANCH または git merge origin/$DEFAULT_BRANCH
  • 強制プッシュはしないでください
Step 8: PR を作成または報告する
  1. 既存の PR があるか確認します。
gh pr list --head "$(git branch --show-current)" --json number,url,title
  1. PR がある場合:

    • 「既存の PR に変更をプッシュしました:」と報告します
    • PR のタイトルと番号を表示します
  2. PR がない場合:

    • コミットメッセージの最初の行から PR のタイトルを作成します
    • 変更の概要を含む PR 本文を作成します
    • PR を作成します。
gh pr create --title "type(scope): description" --body "$(cat <<'EOF'
## Summary

- Brief description of changes

## Changes

- List of key changes made

## Test Plan

- How to verify these changes work
EOF
)"
  1. 新しい PR の URL をユーザーに報告します

ブランチ名の生成

コミットメッセージを有効なブランチ名に変換します。

入力出力
feat(cli): add project list commandfeat-cli-add-project-list-command
fix: resolve memory leak in cachefix-resolve-memory-leak-in-cache
refactor(server): simplify auth flowrefactor-server-simplify-auth-flow

アルゴリズム:

  1. コミットメッセージの最初の行だけを使用します
  2. すべて小文字にします
  3. 種別/スコープの後のコロンを削除します
  4. ( と ) を - に置き換えます
  5. スペースと特殊文字を - に置き換えます
  6. 連続するハイフンを 1 つのハイフンにまとめます
  7. 単語の境界で最大 50 文字に切り詰めます
  8. 末尾のハイフンを削除します

エラー処理

エラー対応
pre-commit フックが失敗する出力を表示し、修正するようユーザーに依頼します。回避しないでください
プッシュが拒否される(競合)リベース/マージを提案します。強制プッシュはしないでください
PR の作成に失敗するエラーを表示し、手動での作成を提案します
git リポジトリではないユーザーに知らせて終了します
gh CLI がインストールされていないインストール方法をユーザーに知らせます
GitHub に認証されていないgh auth login を提案します

出力形式

成功した場合、次のように報告します。

Committed: feat(cli): add project list command
Branch: feat-cli-add-project-list-command
Pushed to: origin/feat-cli-add-project-list-command
PR: https://github.com/owner/repo/pull/123

エージェント向けの注意事項

  1. Claude については絶対に言及しない — co-author の行や、PR の説明に「Claude によって生成」と記載しないでください
  2. フックを尊重する — pre-commit フックには理由があります。絶対にスキップしないでください
  3. 状況を伝える — 各ステップで何をしているかユーザーに伝えます
  4. エラーに適切に対処する — リポジトリを壊れた状態のままにしないでください
  5. 不明な点は確認する — コミットメッセージが不明瞭な場合は、ユーザーに確認します
  6. シンプルに保つ — 1 回の実行につき 1 つのコミットとし、明確で直線的なワークフローにします

コメント