Skip to content
frontmatter
キー値
specdojo.idprj-0001:pjr-rpsx-scaffold-orchestrator-npm-scripts
specdojo.typeproject
specdojo.statusready
specdojo.rulebookspecdojo:pjr-rulebook
specdojo.part_ofprj-0001:pjr-index
specdojo.item_typetodo
specdojo.item_statusdone
specdojo.prioritymedium
specdojo.ownerDEV
specdojo.registered_at2026-09-26T13:33:13Z
specdojo.completed_at2026-09-26T14:23:51Z

PJR-RPSX config scaffold で provider に応じたオーケストレーター起動スクリプトを package.json へ加える ​

1. 概要 ​

オーケストレーターの起動は provider ごとにコマンドが長い(codex "$(cat .specdojo/codex/orchestrator.md)" など)。このリポジトリの package.json には orch:opus などの起動スクリプトがあるが、SpecDojo を導入した人の package.json には何も加わらない。config scaffold --provider のときに、provider に応じた起動スクリプトを加える。

2. 事実 ​

2.1. 現在の scaffold は package.json を変えない ​

src/exec-provider-scaffold.ts は provider ごとの設定ファイルを配置するが、package.json には触れない。

2.2. このリポジトリには起動スクリプトがある ​

json
"orch:opus": "claude --agent specdojo-orchestrator --model opus",
"orch:sonnet": "claude --agent specdojo-orchestrator --model sonnet",
"orch:agy": "agy --add-dir \"$(pwd)\" --model gemini-3.1-pro-high -i \"$(cat .agents/specdojo-orchestrator.agent.md)\"",

ただしこれは開発用で、規範の本文を .agents/specdojo-orchestrator.agent.md から読む。導入した人の環境では .specdojo/<provider>/orchestrator.md に配置されるため、同じコマンドはそのまま使えない。

3. 追加するスクリプト ​

providerスクリプト起動
claudeorch:opus、orch:sonnetclaude --agent specdojo-orchestrator --model <model>
codexorch:codexcodex "$(cat .specdojo/codex/orchestrator.md)"
antigravityorch:agyagy --add-dir "$(pwd)" -i "$(cat .specdojo/antigravity/orchestrator.md)"
opencodeorch:opencodeopencode --agent specdojo-orchestrator
copilotorch:copilot要確認。templates/copilot/ にオーケストレーターの定義がない

config init ではなく config scaffold --provider で加える。init の時点ではどの provider を使うかが分からないためである。

4. 決まりごと ​

決まりごと内容
既存のキーは上書きしない同じ名前のスクリプトがあれば飛ばし、その旨を表示する
起動パスは配置先に合わせるcodex / antigravity は .specdojo/<provider>/orchestrator.md を読む
--dry-run で確認できる追加予定のスクリプトを表示するだけにできる
整形を保つpackage.json のインデントと既存の並びを崩さない

5. 完了条件 ​

  • config scaffold --provider <p> のあと、npm run orch:<name> でオーケストレーターを起動できる。
  • 既存の同名スクリプトを上書きしない。飛ばしたことが表示される。
  • package.json がない場合の扱いが決まっている(作らずに案内するか、エラーにするか)。
  • --dry-run で追加予定が確認でき、ファイルは変わらない。
  • copilot の扱いが決まっている。オーケストレーターの定義を配置しないなら、スクリプトも加えない。
  • README の「オーケストレーターを配置する」に、npm run orch:<name> で起動できることが書かれている。
  • 単体テストがある。
  • npm run check が通過している。

6. 作業内容 ​

No作業担当状態メモ
1copilot のオーケストレーター配置の有無を確かめるDEVdone
2scaffold へスクリプトの追加を実装するDEVdone上書きしない
3テストを追加するDEVdone
4README へ起動方法を記載するDEVdonePJR-34MQ の README 改訂と調整する

7. 対応結果 ​

  • copilot にはオーケストレーターの配置がないため、スクリプトも加えないこととした。
  • src/exec-provider-scaffold.ts にて、package.json が存在する場合に config scaffold 時に provider 別の起動スクリプトを追加する処理を実装した。
  • 既存のスクリプトの上書き防止および --dry-run 時の出力の処理も実装し、テストを tests/src/exec-provider-scaffold.test.ts に追加した。
  • README.md の起動方法の説明を npm run orch:<name> による方法に更新した。

7.1. 評価(2026-09-26 夜間) ​

agy-expert-executor で実装され、統合まで成功した。個票と規約に合わない点が 3 つあったため、夜間の決まりごとに沿って私が直した。直したあとは完了条件をすべて満たす。

完了条件判定
scaffold のあと npm run orch:<name> で起動できる満たす
既存の同名スクリプトを上書きしない手直しで満たす(--force でも上書きしない)
package.json がない場合の扱い満たす。作らずに「not found」と表示して続ける
--dry-run で確認できファイルが変わらない満たす
copilot の扱い満たす。定義を配置しないのでスクリプトも加えない
README に起動方法を記載満たす
単体テスト満たす(13 件)
npm run check 相当満たす(test:unit 1572 件、test:integration 111 件)

7.2. 私が直した点 ​

点直す前直したあと
--force での上書き既存のスクリプトを上書きした--force でも上書きしない
JSON.parse の扱いany のまま扱ったunknown で受け、オブジェクトであることを確かめる
更新の失敗表示だけで終了コード 0終了コードを 1 にする
字下げ常に 2 桁へ書き直した既存の字下げを保つ
テストの出力の差し止めprocess.stdout.write の差し替えと as anyvi.spyOn

--force は配置するテンプレートのファイルを上書きするための指定であり、利用者が書き換えた起動スクリプトまで壊す理由にならない。

8. 関連ドキュメント ​