PJR-TR8G git コマンド失敗の理由から進捗表示を除き、原因行を block reason へ残す
1. 概要
PJR-G8M9 の worktree 作成が失敗した際、block_reason が次のようになり原因を特定できなかった。
text
checkpoint failed: git worktree failed:
Preparing worktree (new branch 'exec/prj-0001-PJR-G8M9') \r\r\rUpda…git worktree add は Updating files: 50% (2325/4638) のような進捗を \r 区切りで stderr へ出す。gitOutput は失敗時に stderr.trim() をそのまま理由へ載せるため、進捗が文字数を食い潰し、末尾にあるはずのエラー行が register の切り詰めで失われる。
typescript
export function formatGitCommandFailure(args: readonly string[], stderr: string): string {
const cause = stderr.trim();
return cause ? `${label} failed: ${cause}${detail}` : `${label} failed${detail}`;
}同種の問題は prj-0001:pjr-2m84-integrate-merge-abort で merge 失敗について対処済みで、summarizeGitHookFailure が「失敗ステップ名 + 最初のエラー行」を取り出し、全文はログへ残す。この整理が gitOutput の汎用経路には入っていない。
進捗を出す git コマンドは worktree add だけではないため、汎用経路で対処する。
2. 完了条件
formatGitCommandFailureが、\rで上書きされる進捗セグメントを除いたうえで理由を組み立てる。各行は最終表示だけを残す。- 進捗行と空行を除いた行のうち、末尾側の行を理由に採る。git のエラーは進捗の後に出るため、先頭を採ると取り逃す。
- 理由の長さに上限を設け、register の
block_reasonが切り詰めても原因行が残る。 - stderr の全文は evidence またはログへ残り、失われない。
- 進捗を含む stderr から原因行が取り出せることを検証する単体テストがある。
git worktree addとnpm ciの実出力を模した入力を使う。 npm run checkが通過している。
3. 作業内容
| No | 作業 | 担当 | 状態 | メモ |
|---|---|---|---|---|
| 1 | 進捗セグメントを落とす整形を formatGitCommandFailure へ入れる | DEV | done | summarizeGitHookFailure と処理を共有する |
| 2 | 末尾側の原因行を採る選択規則を実装する | DEV | done | 先頭を採ると進捗に埋もれる |
| 3 | 全文をログへ残す経路を確認し、欠けていれば追加する | DEV | 部分 | merge 失敗の integrate.log と同じ扱い |
| 4 | 実出力を模した単体テストを追加する | DEV | done | worktree add と npm ci の 2 系統 |
4. 対応結果
summarizeGitStderr()を新設し、formatGitCommandFailureが stderr 全文ではなく要約を使うようにした。処理は次の順で行う。stripTerminalControlSequencesで ANSI と制御文字を除く。- 行ごとに
\rで分割し、最後に表示された内容だけを残す。\rは同一行の上書きを表すため、途中の進捗は表示されていない。 Updating files/Receiving objects/Resolving deltasなど 10 種の進捗行を落とす。fatal/error/warning/CONFLICT/denied/No space leftを含む行を優先して採る。- 該当が無い場合は末尾 2 行を採る。先頭の
Preparing worktree ...は手順の告知であり原因を含まない。 - 400 文字で打ち切る。
GitCommandErrorを新設し、gitOutputはこれを投げる。messageは要約だがstderrプロパティへ全文を保持するため、呼び出し側が全文を扱える。- 単体テストを 5 件追加した。進捗の後に続く原因行を採ること、原因行が無い場合に末尾を採ること、進捗のみなら空文字を返すこと、長文の打ち切り、
formatGitCommandFailure経由で進捗が混入しないことを検証する。 npm run typecheck、npm run lint:ts、npm run check(119 files / 1652 tests)が通過した。- 本修正はローカル feature ブランチ
feature/prj-0001/git-failure-reasonで実装し、--no-ffmerge(dfc6e3c0)で develop へ統合した。
4.1. 作業 3 の扱い
stderr 全文は GitCommandError.stderr として保持されるが、ファイルへ書き出す経路は追加していない。checkpoint 失敗時のログ出力先の調査が必要で、本項目の目的(block reason から原因が読める)を超えるためである。全文をログへ残す必要が実際に生じた時点で別項目として扱う。