Skip to content
frontmatter
キー値
specdojo.idprj-0001:pjr-v23p-src-subdirectory-layout
specdojo.typeproject
specdojo.statusready
specdojo.rulebookspecdojo:pjr-rulebook
specdojo.part_ofprj-0001:pjr-index
specdojo.item_typedecision
specdojo.item_statusdecided
specdojo.prioritymedium
specdojo.ownerARC
specdojo.registered_at2026-10-15T22:07:48Z
specdojo.completed_at2026-10-15T22:12:59Z
specdojo.conclusionsrc を機能ごとのサブディレクトリ(exec・register・grade・catalog・schedule・dashboard・job・routine・kata・deliverable・devcontainer・review・docs と共通の shared)へ移し、ディレクトリと重なる接頭辞を外す。移動は codemod で 1 件ずつ行い、依存の向きの規則は移した後に入れる

PJR-V23P src を機能ごとのサブディレクトリに分ける ​

1. 背景 ​

リファクタリング(prj-0001:pjr-y8p9-large-source-files-split など)で大きなファイルを分けた結果、src/ の直下のファイルは 167 になった(2026-10-16)。ファイル名の接頭辞が実質的にディレクトリの代わりになっている。

接頭辞ファイル数
exec-73
register-16
grade-13
catalog-11
schedule-8
dashboard-5
その他41

利用者から、src/<func>/ のように機能ごとのサブディレクトリにまとめる提案があった(2026-10-16)。

確かめた影響:

  • ほぼすべての相対 import と、tests/src/ の 125 のテストの import が変わる。
  • Vitest の規約(.github/instructions/vitest.instructions.md)により、tests/ は src/ と同じ構成にする。
  • package.json の bin は dist/specdojo.js で、exports はない。dist/ のパスは src/spawn-self.ts・src/dist-freshness.ts・tests/helpers/schema.ts・lefthook.yml・.claude/settings.json などが参照している。
  • 設計書とガイドの 13 文書に src/... のパスが 52 か所ある。個票・plan・result などの履歴のファイルは書き換えない。

2. 検討した選択肢 ​

選択肢内容利点欠点
A現状のまま(直下に置き、接頭辞で区別する)変更が要らない167 ファイルが 1 か所に並び、機能の境界が一覧で分からない。依存の向きを機械的に確かめにくい
B機能ごとのサブディレクトリへ移し、ファイル名は変えない(src/exec/exec-run.ts)ファイル名の変更がなく、検索しやすいディレクトリと接頭辞が重なって冗長になる
C機能ごとのサブディレクトリへ移し、ディレクトリと重なる接頭辞を外す(src/exec/run.ts)冗長さがなくなる変更の量が増える。同じ名前のファイル(src/register/core.ts と src/grade/core.ts など)が増え、エディタのタブで区別しにくい

3. 決定内容 ​

推奨のとおり、次のように決める。

  1. 選択肢 C を採る。CLI の入口 src/specdojo.ts は直下に残す。
  2. 機能ごとのディレクトリは、exec/・register/・grade/・catalog/・schedule/・dashboard/(timeline を含む)・job/・routine/・kata/・deliverable/・devcontainer/・docs/(文書の索引・YAML のページ・frontmatter・テンプレートの解決)・review/ とする。
  3. 複数の機能から使う共通の処理(yaml・yaml-schema-modeline・git-environment・specdojo-config・specdojo-gitignore・package-paths・spawn-self・dist-freshness・build-if-stale・watch・agent・agent-response・role-types など)は src/shared/ に置く。
  4. 1 階層だけとし、exec/ の下をさらに分けることは移した後の実態を見て決める。
  5. 移動と import の書き換えは、スクリプト(codemod)で機械的に行い、git mv で履歴を辿れるようにする。agent に手で書き換えさせない。
  6. 依存の向きの規則(例: shared/ は他の機能を import しない、register/ は exec/ を import しない)は、移した後に別の todo で ESLint の no-restricted-imports などで入れる。移動と同時には行わない。
  7. 小さい機能から 1 件ずつ移し(dashboard から始めて exec を最後にする)、各件で typecheck・全テスト・--help の一致を確かめる。runner のコードを含む件では exec run を 1 回流す。
  8. prj-0001:pjr-zm1k-agent-members-model-alias の実装より先に行う。

3.1. 追加の決定(2026-10-16) ​

決定の時点で行き先を決めていなかったファイルについて、利用者が次のとおり承認した。

ファイル行き先
build-command・init-command・orchestrator・watch・agent(src/specdojo.ts だけが使うコマンドの実装)src/commands/(新設)
practice-id(catalog・exec・kata から使う)src/shared/
role-types(exec だけが使う)src/exec/

src/commands/ と src/shared/ への移動は prj-0001:pjr-mhhp-src-move-shared で、role-types は prj-0001:pjr-xp0j-src-move-exec で行う。

4. 採択理由 ​

  • 機能の境界がディレクトリで一覧でき、依存の向きを機械的に確かめる土台になる。
  • 接頭辞を外すことで、ディレクトリと名前の重複がなくなる。
  • 移動と import の書き換えを codemod で機械的に行えば、量が多くても誤りが入りにくく、git mv で履歴も辿れる。
  • 1 件ずつ移して検証することで、問題が出たときの範囲を小さくできる。

5. 承認 ​

項目内容
決定者利用者(PO)
決定日2026-10-16
承認方式orchestrator との会話で、推奨の 8 点を「推奨でお願いします」として承認
証跡orchestrator との会話(2026-10-16)
  • 承認方式は commit または PR を記載する。PR の場合は証跡に PR URL と merge SHA を本文テキストで記載する。
  • 不可逆・高リスク・framework schema 破壊的変更に該当する決定は PR 方式で承認する。

6. 影響範囲とフォローアップ ​

項目内容
影響範囲src/ の全ファイル、tests/src/、dist/ のパスを参照する処理と設定、設計書とガイドの src/... のパス
必要な対応決定後に、移動の codemod と機能ごとの移動、依存の向きの規則の todo を起票する
追跡先PJR-G5S2(codemod)、PJR-W9RK(dashboard)、PJR-KECW(小さい機能)、PJR-SMK5(schedule・catalog)、PJR-YH9Q(grade・register)、PJR-MHHP(shared)、PJR-XP0J(exec)、PJR-X8Y9(依存の向きの規則)

7. 関連ドキュメント ​