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/.gitkeepconfig 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 | 除外するパターンを決める | DEV | done | docs/ 外の配置は base_path か各パス設定から導く |
| 2 | config init へ .gitignore の追記を実装する | DEV | done | 既存の行は変えず、足りない行だけを末尾へ追記する |
| 3 | 統合テストで並行実行の衝突がないことを確かめる | DEV | done | 並行 E2E テストの手書き .gitignore を config init に置換 |
| 4 | README と案内を更新する | DEV | done | README と 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. 関連ドキュメント
- prj-0001:pjr-k332-per-item-executor-assignment
- prj-0001:pjr-4hbg-exec-run
src/specdojo-config.tsREADME.md