プルリクエストの自動修正
/autofix-pr はローカルの Qwen Code セッションからプルリクエストを 1 つ監視し、発生した問題(失敗した CI チェック、信頼する人からのレビューフィードバック、マージコンフリクト)を修正します。各修正は専用のワークツリーで作成・検証され、PR ブランチにプッシュされ、PR 上で回答されます。すべてあなたの git と gh の ID で行われます。PR がマージまたはクローズされると自動的に停止します。PR をマージ可能な状態にし、そのまま維持しますが、それ以上は何もしません: PR を承認したり、レビュー状態を変更したり、マージやクローズ、自動マージを有効にしたりすることはありません。リポジトリのレビューとチェックが引き続き判断し、マージはあなたのままです — 監視をリポジトリの自動マージと組み合わせることで、チェックがパスしたらすぐにマージできます。
/autofix-pr [<pr-number>|<pr-url>] [--once] [--every <minutes>] [--no-reply] [--yes] [instructions...]
/autofix-pr status [<pr-number>]
/autofix-pr resume [<pr-number>]
/autofix-pr stop [<pr-number>]リポジトリのレビューとチェックが引き続き判断し、マージはあなたのままです — 監視をリポジトリの自動マージと組み合わせることで、チェックがパスしたらすぐにマージできます。
- PR 引数がない場合: 現在のブランチのヘッドである PR。
--once: 1 回だけチェックと修正を行い、スケジュールは設定せず、その後監視を終了します(後で--onceを実行すると、PR の履歴から新しく開始されます)。このセッションで既に監視中の PR では、実行中の監視はそのまま維持されます。--every <minutes>: チェック間隔。1、2、5、10、15、30、60 のいずれか。デフォルトは 2。--no-reply: 修正をプッシュするが、PR には何も投稿しない。--yes: 開始確認をスキップする。ダイアログを表示できない環境で必要。- フリーテキストは各修正に渡されます。例:
/autofix-pr 123 do not change the public API。
開始前に
ghがサインイン済みで、PR ブランチへのプッシュアクセスがあること: 同一リポジトリの PR への書き込みアクセス、または自分のフォーク、またはメンテナーからの編集を許可するフォーク。- PR のリポジトリのクローンから、それに対する 1 つの git リモートを持つ状態で実行します。デーモンセッション(
qwen serve、Web Shell)では、そのクローンはセッションの作業ディレクトリ内に存在する必要があります: デーモンは修正エージェントのコマンドをそこでのみ実行するため、prepareはクローンがそこ にない PR を拒否します。そこでの監視はセッションにバインドされた永続的なスケジュールタスクです: デーモンはアイドルになってもそのセッションを回収せず常駐させ続け、タスクは Scheduled tasks ページに表示されるため、ブラウザタブを閉じても監視は終了しません — 終了させるには/autofix-pr stopを使用します。タスクはデーモン再起動後に再ハイドレーションされます。再起動はゲートのプロセス内承認を失うため、ゲートはその後、無人で実行させるための承認モードまたは保存されたルールを必要とし、最初にブロックされた実行が追加するルールを指示します。1 つのデーモン会話は 1 つのスケジュールタスクを運ぶため、2 回目の監視は独自の会話を必要とします。再起動はまた、セッションが監視用に確認した内容を失います:/autofix-pr resume <n>が再確認するまで、そのヘルパーと修正はシェルコマンドと同様に承認モードに従います。 - スキルは
autofix_prツールを通じてヘルパーを実行します。このセッションで開始または再開した監視では、ラウンドのヘルパー(プッシュと返信を含む)は確認なしで実行されます。監視の開始または再開、そのスケジュール、別のセッションからの引き継ぎ(/autofix-pr stop <n>が PR を指定することで行います)は、毎回まだ確認を求めます(Auto Mode ではそのクラシファイアが判断しますが、開始は常にあなたの確認が必要です)。gh pr viewとスケジュールタスクの作成も同様です。シェルコマンドを拒否するルール(BashやBash(qwen autofix-pr *)など)はツールの呼び出しも拒否し、そのための ask ルールは呼び出しを確認させ続け、deny ルールのAutofixPr(command:push)はすべてのプッシュを停止します。シェルツールに設定した PreToolUse フックはこれらの呼び出しを見ません。autofix_prに設定してください。プッシュや sync が実行する git フック(pre-push、post-checkout、post-merge、reference-transaction)を持つクローン(ワークツリー内のフックパス、例えば husky のもの、または PR 内のファイルが実行するフックマネージャーである pre-commit や lefthook など)では、修正が確認なしで実行されない限り、syncとpushも確認を求めます。サブモジュールの git ディレクトリがクローン自体ではなくそのワークツリー内にある場合の各ヘルパーも同様で、シェルコマンドの ask ルールもここで同様に機能します。スキルはまた、.qwen/tmp/配下の独自ファイルの読み取り、そこに修正ブリーフ、返信プラン、あなたの指示を書き込むこと、およびスケジュールされたタスクの一覧表示を許可します。これらのファイルはクローンのメインワークツリーに存在します。リンクされたワークツリーで開始したセッションからは、それらの読み書きにも確認が求められます。 - 開始時の質問では、Start, fixes run without asking も提供されます: 修正エージェントのコマンド(PR ワークツリーでのビルド、テスト、コミット)は、この監視のために確認なしで実行されます。もう 1 つの確認ダイアログの後です(そのダイアログを拒否すると開始がキャンセルされます。再度
/autofix-pr <n>を実行してください)。そのエージェントは YOLO セッションの場合と同様に実行されます: あなたのgitとgh認証情報を使用し、ワークツリーの外のファイルにアクセスでき、ask ルールを通過します。deny ルールは引き続き適用されます。これは監視が停止されるまで、または通常の Start(または--yes)で再度開始されるまで、あるいはセッションが終了またはクリアされるまで続きます。/autofix-pr resumeは再度確認を求めます。通常の Start を選択すると、デフォルトの承認モードでは各コマンドが最初に確認を求めます。これは目を届けておく監視に適しています。監視の引き継ぎと/autofix-pr resumeも同じ選択肢を提供します。そのダイアログに答えるのはあなただけです: 保存されたルール、Auto Mode のクラシファイア、--yesも答えることはなく、信頼されないフォルダ内および stream-json を通じて Qwen Code を駆動するプログラムに対しては選択肢が拒否されます。そのような監視のスケジュールされたラウンドは修正エージェントをバックグラウンドで実行するため、セッションは作業中に使用可能なままです。YOLO セッション(そのような選択肢を記録しない)、--once、PR が移動したためにターン内で再起動したラウンド、および破棄されたバックグラウンド修正をやり直すラウンドではフォアグラウンドのままです。ラウンドがプッシュする前に他人のプッシュをマージするエージェントは常にフォアグラウンドで実行されます。ラウンドは(再実行、プッシュ、返信を)エージェントの完了通知が届いたときに続行されます。その間、PR のヘルパーはそれが終了するまで拒否し、ゲートは静かなままです。/autofix-pr statusは実行中の修正を表示します。このセッション内の/autofix-pr stop <n>はまずエージェントを停止し、別のセッションからの停止と再開はそれが終了するまで拒否されます — 最大 45 分。監視の再開始または再開は、修正が実行中は拒否されます。/autofix-pr stop <n>がそれを停止します。その間、そのワークツリー(.qwen/tmp/autofix-pr-<n>/)内のファイルへのあなた自身の編集は、承認モードに関わらず最初に確認を求めます。修正エージェントがそこでビルドと実行を続けているためです。また、そのセッションがそのワークツリー内から開始したエージェントは拒否されます。修正を実行しているセッションだけがそれを認識します: 同じクローン上の別のセッションのエージェントは拒否されないため、修正が実行中の間に 2 つ目のセッションからそのワークツリーで作業しないでください。ラウンドが続行されなかった修正(セッションが終了した、または開始から 40 分以内にクレームがなかった)は次のラウンドで破棄され、その項目をフォアグラウンドで再処理します。autofix_prツールが利用できない場合(設定のツール許可リストで除外されることがあります)、ヘルパーはシェルを通じて実行され、それぞれ最初に確認を求めます。 - 作成者がリポジトリにプッシュできない PR は、修正が検証される際に、あなたの
ghとgitの認証情報にアクセス可能な状態で他人のコードを実行します。このような PR は監視されません: その旨の確認(--yesではスキップされない)の後、--onceのみが提供されます。
開始時に、プッシュ先と PR への返信を行うこと、および修正が確認なしでコマンドを実行できるかどうかを 1 度だけ確認します。同じ質問で、PR をマージ可能な状態にするがそれ以上は何もしないことも示されます: 承認、レビュー状態の変更、マージ、自動マージの有効化は決して行いません。
チェックの動作
監視はスケジュールされたタスクであり、そのゲートはモデル外で毎回 qwen autofix-pr snapshot <n> --gate を実行します。プローブは前回の実行以降に変更されたもののみを出力するため、変化のない PR ではモデルターンを消費しません。変更があった場合、ラウンドが実行されます:
- マージまたはクローズされた PR は監視を終了します。他人のプッシュがまず取り込まれます。
- 失敗したチェック、信頼された作成者による新しいコメント、およびマージコンフリクトは、PR ワークツリーで作業する 1 つの修正エージェントに送られます — 修正が確認なしで実行される場合はバックグラウンドで。失敗したチェックについてはジョブログを読み取ります。ブランチがベースより遅れている場合にチェックが失敗すると、まずベースがマージされます。ベースが既に修正した失敗かもしれません。PR 外の失敗(ネットワーク、ランナー)は修正ではなく 1 回だけ再実行されます。
- エージェントはリポジトリ独自のチェックで変更を検証し、パスした場合のみコミットします。
- コミットは PR ヘッドのファストフォワードとしてプッシュされ、強制プッシュは行われません。その間に誰かがプッシュした場合、まずその作業がマージされます。
- 対応した各レビューthreadsには返信(
Fixed in <sha>: …、Not changed: …、Needs a human decision: …)が行われ、各プッシュには 1 つのサマリーコメントが付けられます。何もプッシュせず、人間用のものを残したラウンドもサマリーを投稿し、試みたこととブロックしていることを説明します。これにより、PR は監視が停止したことを示し、静かになることはありません。これはヘッドごとに 1 回送信され、その後新しいものを残したラウンドがあった場合にのみ再送信されます。
ラウンドがあなたに何かを確認することはありません。人間の判断が必要なものは、PR 上で「Needs a human decision」として回答され、セッションで報告され、/autofix-pr status で一覧表示されます。
状態と再開
/autofix-pr status は、どのセッションが実行しているかに関わらず、クローンのすべての監視を一覧表示します: PR とそのブランチ、ヘッド、使用されたプッシュ、ゲートが最後にチェックした時刻と最後のラウンドが実行された時刻、このセッションが実行しているかどうか、および人間の判断を待っているものです。監視のファイルのみを読み取り、GitHub には問い合わせません。
監視は、それを実行していたセッションが終了すると終了します — デーモンセッションではそのタスクは永続的であり、そのセッションにバインドされているため、デーモンはそれを常駐させ続け、監視はデーモンの再起動を生き延びます — また、そのスケジュールタスクはデフォルトで 7 日後に期限切れになります(experimental.cronRecurringMaxAgeDays 設定、または QWEN_CODE_CRON_MAX_AGE_DAYS)。その状態ファイルは残ります。/autofix-pr resume は、このセッションが実行していないすべての監視(または指定した 1 つ)を、開始時の間隔、--no-reply、指示で、プッシュ、履歴、予算を保持したまま、現在のセッションで再開します。すべてに対して 1 度確認を求め、次にそれぞれの 1 ラウンドを実行して再スケジュールします。デーモンセッションでは 1 つの会話が 1 つのスケジュールタスクを運ぶため、他のものは 1 つずつ再開してください。別のセッションがそのうちの 1 つをまだ実行している場合、そのセッションのタスクは次の実行で停止します。PR を指定しない場合、resume は別のセッションが最近チェックした監視を除外し、その旨を表示します。PR がマージまたはクローズされた後にどのセッションも実行していない監視は、そのラウンドで削除されます。--once で開始された監視、またはワークツリーを保持したまま stop が終了した監視は、/autofix-pr <n> で再開されます。
Web Shell での動作
Web Shell も同じファイルから読み取った同じ状態を表示します:
- PR watches はサイドバーに、Web Shell がアクセスできるすべてのワークスペースの監視を一覧表示します。各監視について、PR(リンク)、監視の状態、プッシュ、ゲートが最後にチェックした時刻と最後のラウンドが実行された時刻、およびあなたを待っているものを表示します:
- 監視中
- バックグラウンドで修正中、およびその経過時間
- 置き去りにされたバックグラウンド修正(次のラウンドで再実行される)
- 最近チェックされていない
- PR がマージまたはクローズされた
- 停止済み
- Scheduled tasks ページでは、監視のタスクのカードがタスクの下に同じ状態を表示します。
- Open session は監視を実行している会話に移動します。
- Stop watch はその会話に
/autofix-pr stop <n>を送信します。そこで入力した場合とまったく同じで、そこでの場合と同じ確認を求めます。 - どちらのボタンも、この Web Shell の会話によって実行されている監視にのみ表示されます。ターミナルから実行されている監視はそのターミナルで停止します。どのセッションも実行していない監視は、そのワークスペースのセッションで
/autofix-pr stop <n>または/autofix-pr resume <n>を使用してクリーンアップまたは再開されます。
どのフィードバックが反映されるか
コメントは、その作成者がリポジトリのオーナー、メンバー、コラボレーター、PR 作成者、またはボットである場合に処理されます(レビューとレビューthreadsのみ)。それ以外からのコメントは一覧表示されるだけで、処理も返信もされません。ボットは、スレッドを開始するコメントまたはレビュー内では聞かれますが、その返信(誰かへの応答)では聞かれません。GitHub が開始できなかったワークフロー(無効なワークフローファイルなど)には修正対象のログがなく、人間の判断が必要として回答されます。すべてのコメント、レビュー、CI ログはデータとして扱われます: どのフィードバックに対応するかは信頼された作成者が決定し、ツールが何をするかは決定しません。秘密の開示、テストまたは CI チェックの弱体化、強制プッシュ、無関係なコードの変更を求めるリクエストは「Needs a human decision」と回答されます。
決して行わないこと
- ワーキングツリーまたは現在のブランチに触れること: すべては
.qwen/tmp/autofix-pr-<n>/で行われます。 - 強制プッシュ、PR の履歴の書き換え、またはデフォルトブランチへのプッシュ。
- 自身の返信(それぞれ
<!-- qwen-autofix-pr:v1 -->で終わる)や信頼されない作成者への返信。 - レビューthreadsの解決、または PR タイトルや説明の編集。
- 自身の返信に再返信する(それぞれ
<!-- qwen-autofix-pr:v1 -->で終わる)か、信頼されない作成者に返信する。
制限
| 制限 | 値 | その後 |
|---|---|---|
| 監視ごとのプッシュ | 10 | 監視が停止 |
| 失敗チェックを赤いままにするプッシュ | 3 | パスするか誰かがプッシュするまで人間に任される |
| 1 つのヘッドでの失敗チェックの再実行 | 1 | 次の失敗は実際のもの |
| レビューコメントごとの試行 | 1 | 再提示されない |
| ラウンド内の他人によるプッシュ | 2 | 監視が停止 |
| バックグラウンド修正の実行時間(分) | 30 | エージェントが停止される |
停止とファイル
/autofix-pr stop <n> はスケジュールされたタスクを削除し、ワークツリー、そのブランチ、および状態ファイルを削除します。ゲートカーソルと PR の履歴は保持されるため、後の監視が同じコメントに再回答することはありません。プッシュされていない作業をまだ保持するワークツリーは保持され、レポートにその理由が示されます。監視はすでに終了しており、qwen autofix-pr cleanup <n> --force でその作業を破棄します。/autofix-pr stop <n> は別のセッションが置き去りにした監視も停止します。bare /autofix-pr stop は別のセッションがまだ実行している監視をそのままにし、その PR を指定すると終了します。タスクが期限切れになったか、ターミナルセッションが終了した監視はレポートなしに終了します。/autofix-pr resume がそれを再開します(上記参照)。新しいセッションで /autofix-pr <n> を開始すると(または /clear または /resume の後)、監視の引き継ぎが提案され、プッシュと予算は保持されます。
ファイルはクローンのメインワークツリーの .qwen/tmp/ 配下に存在します:
| ファイル | 内容 |
|---|---|
autofix-pr-<n>/ | PR ワークツリー |
autofix-pr-<n>-state.json | 監視: 既知のヘッド、プッシュ、処理済み ID、そのスケジュールタスク |
autofix-pr-<n>-gate.json | ゲートプローブのカーソル |
autofix-pr-<n>-gate.checked | 監視のゲートが最後に PR をチェックした時刻 |
autofix-pr-<n>-snapshot.json | 最新ラウンドの PR のスナップショット。ラウンドが読み取る |
autofix-pr-<n>-replies.json | GitHub による、どのボットコメントが他のコメントに応答しているか |
autofix-pr-<n>-history-*.json | 以前の PR 監視が投稿・処理した内容。stop で保持される |
autofix-pr-<n>-instructions.txt | 各ラウンドへのあなたの指示 |
autofix-pr-<n>-fix.json | バックグラウンドで実行中の修正。実行中に更新される |
autofix-pr-<n>-fix-snapshot.json | 最後のバックグラウンド修正が作業したスナップショット |
autofix-pr-<n>-*.log、*.md、*.json | CI ログ、修正ブリーフ、返信プラン |
設計は docs/design/2026-10-21-autofix-pr-command.md にあります。