PJR-Q88A register系コマンド全体のエラー出力をstdoutからstderrへ統一する
1. 概要
registerサブコマンド(add/start/wait/review/close/reject/defer/reopen/update/renumber等)はほぼ全てprintCommandError慣例でエラーをstdoutへ出す。PJR-NWPCでregister whereのみstderrへ分離したが、他のサブコマンドはstdoutのまま残っている。内部呼び出し元(spawnSelf/spawnRegisterTransition等)はstdio inherit+終了コードのみで成否判定しておりstdout内容を解析していないため、stderrへ変更しても既存の内部呼び出しへの影響はない。printCommandErrorを呼ぶ全箇所をstderrへ揃え、既存テストのstdout検証も合わせて更新する。catalog.ts/schedule.tsにも同種のstdout一本化が見られるが、対象はregister系に限定し、他コマンドへの拡張は別途判断する。
prj-0001:pjr-nwpc-register-where-stderrではregister whereのみエラー出力をstderrへ分離したが、add/start/wait/review/close/reject/defer/reopen/update/renumber等の他サブコマンドはprintCommandError慣例のままstdoutへエラーを出している。内部呼び出し元(spawnSelf/spawnRegisterTransition等)はstdio: inherit+終了コードのみで成否判定しており、stdout内容を解析する箇所は無いため、stderrへの変更は安全である。Unix/CLIの一般的な慣習(正常出力はstdout、エラーはstderr)に揃える。
2. 完了条件
printCommandErrorを呼ぶ全てのregisterサブコマンドで、エラーメッセージがstderrへ書かれる。- 成功時の通常出力(更新内容の表示等)は引き続きstdoutのまま変更しない。
- 既存の内部呼び出し元(
spawnSelf/spawnRegisterTransition等)が終了コードのみで成否判定しており、stdout/stderr変更の影響を受けないことを確認する。 - 既存テストのうち、register系コマンドのエラー出力先(stdout)を前提にしているものをstderr前提へ更新する。
- コマンドリファレンスに、register系コマンドのエラー出力先(stderr)が明記されている。
- 対象は
register系コマンドに限定し、catalog/schedule等の同種パターンへの拡張は本項目のスコープ外であることが明記されている。
3. 作業内容
| No | 作業 | 担当 | 状態 | メモ |
|---|---|---|---|---|
| 1 | printCommandErrorをstderr出力へ変更する(register where専用のprintWhereErrorとの統合可否も検討する) | ARC | done | src/register.ts |
| 2 | 内部呼び出し元がstdout内容に依存していないことを確認する | ARC | done | spawnSelf/spawnRegisterTransition等 |
| 3 | 既存テストのstdout前提箇所をstderr前提へ更新する | ARC | done | - |
| 4 | コマンドリファレンスへ反映する | ARC | done | - |
4. 対応結果
src/register.tsのprintCommandErrorをprocess.stdout.writeからprocess.stderr.writeへ変更した。これによりregister配下の全サブコマンド(scaffold/add/build/update/start/wait/review/close/reject/defer/reopen/renumber/where)のエラーがstderrへ揃う。- 両者が完全に同一動作になったため、
register where専用のprintWhereErrorをprintCommandErrorへ統合した。whereのcatch節もprintCommandErrorを呼ぶよう変更し、統合後のprintCommandErrorをexport化した。where固有の理由(コマンド置換でgit -C引数へエラー文字列が混入する問題)はコメントに残した。 - 成功時の通常出力(更新内容・生成パス・
Would ...のdry-runプレビュー・Warning: ...)はstdoutのまま変更していない。 - 内部呼び出し元(
src/exec-run.tsのspawnSelf/spawnRegisterTransition、src/routine.tsのspawnSelf)はspawnSync(..., { stdio: "inherit" })でresult.status === 0のみを見て成否判定しており、stdout内容を解析していない。よってエラー出力先の変更による影響はない。 - テスト
tests/src/register-reserve.test.tsのprintWhereError前提をprintCommandError前提へ更新した(import・describe名・呼び出し)。エラーがstderrへ書かれstdoutを汚さないことを引き続き検証する。 - コマンドリファレンス(SpecDojoコマンドリファレンス)へ、
register系全コマンドがエラーをstderrへ分離すること、および本方針がregister系限定でcatalog/schedule等はスコープ外であることを明記した。