Skip to content
frontmatter
キー値
specdojo.idprj-0001:pjr-hg98-config-init-gitignore-generated
specdojo.typeproject
specdojo.statusready
specdojo.rulebookspecdojo:pjr-rulebook
specdojo.part_ofprj-0001:pjr-index
specdojo.item_typetodo
specdojo.item_statusdone
specdojo.priorityhigh
specdojo.ownerDEV
specdojo.registered_at2026-09-26T23:06:44Z
specdojo.completed_at2026-09-27T04:37:40Z
specdojo.block_reasonrate limit reached
specdojo.conclusionconfig init が設定から導いた生成物の除外パターンを .gitignore へ冪等に追記し、管理済み生成物を外す手順を案内する。並行実行の統合テストは config init を使う形にした。README と参照文書へ記載

PJR-HG98 config init で生成物を除外する .gitignore を作り register の並行実行の衝突を防ぐ ​

1. 概要 ​

config init は利用者のリポジトリに、生成物を git の管理から外す .gitignore を作らない。README の手順どおりに始めると登録簿の生成物(generated/pjr-index.md など)が git で管理され、register を並行実行すると、統合の段で生成物が add/add で衝突する。 config init で .gitignore を用意する。

2. 事実 ​

2.1. 衝突を確認した経緯 ​

prj-0001:pjr-k332-per-item-executor-assignment で加えた並行実行の E2E テストが、テスト用リポジトリの generated/pjr-index.md の add/add の衝突で失敗した。並行に走った 2 項目が、どちらも登録簿の生成物を作り直したためである。

2.2. このリポジトリは除外している ​

gitignore
# specdojo doc-index は root/worktree で都度再生成される生成物。
.specdojo/doc-index.json

# specdojo build の生成物(generated/ 配下)。
docs/**/generated/*
!docs/**/generated/.gitkeep

config init(src/specdojo-config.ts)も config scaffold も、これに当たる設定を利用者のリポジトリへ作らない。

3. 完了条件 ​

  • config init が、生成物(docs/**/generated/*、.specdojo/doc-index.json)を除外する .gitignore の記述を用意する。
  • 既存の .gitignore がある場合は、足りない行だけを追記する。既存の行を消したり並べ替えたりしない。
  • 同じ行がすでにあれば追記しない。何度実行しても同じ結果になる。
  • --dry-run があれば、追記する予定の行を表示するだけにする。
  • 追記した行、飛ばした行が表示される。
  • 生成物の配置(base_path など)を変えた場合も除外が効く。パターンが配置に依存するなら、設定から導く。
  • すでに生成物を git で管理しているリポジトリへの案内がある(git rm -r --cached が必要なこと)。
  • register を 2 項目並行で実行しても統合で衝突しないことを、統合テストで確かめる。
  • README の「npm で導入する」に、.gitignore が作られることが書かれている。
  • npm run check が通過している。

4. 作業内容 ​

No作業担当状態メモ
1除外するパターンを決めるDEVdonedocs/ 外の配置は base_path か各パス設定から導く
2config init へ .gitignore の追記を実装するDEVdone既存の行は変えず、足りない行だけを末尾へ追記する
3統合テストで並行実行の衝突がないことを確かめるDEVdone並行 E2E テストの手書き .gitignore を config init に置換
4README と案内を更新するDEVdoneREADME と command-reference・specdojo-config-reference

5. 対応結果 ​

  • src/specdojo-gitignore.ts を追加し、生成物を除外するパターンの導出(gitignorePatternsForLayouts。配置は specdojo-config.ts の projectLayout で解決して渡す)と、既存の .gitignore への追記(mergeGitignore / ensureGitignore)を実装した。
  • 既定のパターンは .specdojo/doc-index.json、docs/**/generated/*、!docs/**/generated/.gitkeep、docs/**/execution/exec/.locks/ とした。base_path が docs/ の外にある場合は <base_path>/**/generated/* などを、base_path が無い場合は各パス設定(catalog・schedule・execution・timeline・登録簿・routines・jobs)から導いた <path>/**/generated/* などを追加する。実行ロックは execution の配置から <execution_path>/exec/.locks/ を導く。リポジトリ外を指すパスは除外対象にしない。
  • config init は、設定を作成したときも、設定がすでにあるときも .gitignore を確認し、足りない行だけを末尾へ追記する。既存の行は変えず、CRLF の改行も維持する。追記した行と飛ばした行を表示し、追記があった場合は管理済みの生成物を git rm -r --cached で外す手順(git ls-files -ci --exclude-standard -z | xargs -0 -r git rm -r --cached --quiet)を案内する。--dry-run では設定も .gitignore も書き込まない。
  • tests/src/specdojo-gitignore.test.ts を追加し、配置からのパターン導出、追記の冪等性、CRLF の維持を確かめた。tests/src/specdojo-config-command.test.ts に、新規作成・既存への追記と再実行・--dry-run のテストを追加した。
  • tests/src/exec-register-pipeline-e2e.integration.test.ts の 2 項目並行実行テストで、手書きしていた .gitignore を config init の実行に置き換え、案内どおり git ls-files -ci --exclude-standard で見つかる管理済みの生成物を git rm -r --cached で外してから実行するようにした。
  • README の「npm で導入する」、command-reference.md、specdojo-config-reference.md に .gitignore の追記を記載した。

6. 関連ドキュメント ​