PJR-X8Y9 src の機能の間の依存の向きの規則を入れる
1. 概要
移動の後に、shared/ が他の機能を import しないことなど、機能の間の依存の向きを ESLint の no-restricted-imports などで検査する。 PJR-V23P の決定に基づく
2. 完了条件
prj-0001:pjr-v23p-src-subdirectory-layout の決定の 6 に基づく。src の移動の後(2026-10-17)にディレクトリの間の import を数えた結果を見て、利用者が 2 段階で進めることを承認した。本件は 1 段目として、いま違反がほぼない規則を error で入れる。機能どうしの循環(6 組)は本件では規則にせず、組ごとに別の項目で扱う。
2026-10-17 時点の違反:
src/shared/→ ほかの機能:src/shared/specdojo-config.tsが../exec/types.js(AgentStageRole・SchedulerStrategy・TaskModeの型)と../exec/provider-scaffold.js(runProviderScaffold・specdojoPackageRootDir)を import している。src/commands/とsrc/specdojo.tsを import する機能: なし。
条件:
src/shared/specdojo-config.tsのsrc/exec/への依存をなくす。型はsrc/shared/へ移すか、src/shared/で定義してsrc/exec/から再 export する。runProviderScaffold・specdojoPackageRootDirを使う処理は、呼び出す側(src/commands/など)へ移すか、src/shared/へ移す。どう直したかと理由を result に書く。動作は変えない。eslint.config.jsに、次の規則をerrorで入れる。ESLint のno-restricted-imports(patterns)など、追加の依存なしで書ける方法を使う。src/shared/**/*.tsは、src/shared/の外のsrc/のモジュールを import しない。src/の機能のモジュール(src/specdojo.tsとsrc/commands/を除く)は、src/commands/とsrc/specdojo.tsを import しない。
- 規則に違反する import を一時的に書くと
npm run lint:tsが失敗することを、手元で確かめて result に書く(その import は残さない)。 - 規則と、機能どうしの循環を別の項目で扱うことを、TypeScript の実装ルール(
.github/instructions/typescript.instructions.md)の「モジュールと import」の章に書く。 - 移す前と後で、
specdojo --helpに出る全コマンドとそのサブコマンドの--helpの出力が一致する。 - 作業を終える前に、
npm run typecheck・npm run lint:ts・npm run test:unitを実行して通す。 - 親の検証(lint-ts・lint-fm・lint-md・typecheck・test-unit・test-integration・validate-schema)が通る。
3. 作業内容
| No | 作業 | 担当 | 状態 | メモ |
|---|---|---|---|---|
| 1 | src/shared/specdojo-config.ts の src/exec/ への依存をなくす | DEV | done | 動作は変えない |
| 2 | ESLint に依存の向きの規則を error で入れる | DEV | done | 追加の依存なし |
| 3 | 違反を書くと lint が失敗することを確かめる | DEV | done | - |
| 4 | TypeScript の実装ルールに規則を書く | DEV | done | - |
4. 対応結果
AgentStageRole・SchedulerStrategy・TaskModeの定義をsrc/shared/agent-types.tsへ移し、既存の import との互換性を保つためsrc/exec/types.tsから再 export した。- provider の雛形配置は config・commands・exec から共用する処理なので、
src/exec/provider-scaffold.tsをsrc/shared/provider-scaffold.tsへ移した。exec のisRecordへの依存は同じ小さい型ガードをモジュール内に置いて解消した。対応するテストもtests/src/shared/へ移した。 eslint.config.jsに、src/shared/からほかの機能やsrc/specdojo.tsへの import と、機能からsrc/commands/・src/specdojo.tsへの import を禁止するno-restricted-importsを error で追加した。追加依存はない。- 2 種類の違反 import を一時的に作り、それぞれを対象に ESLint を実行して
no-restricted-importsの error になることを確認した。一時ファイルは削除済みである。 .github/instructions/typescript.instructions.mdに依存方向の規則を追記し、機能どうしの循環は組ごとの登録簿項目で解消してから規則を追加する方針を明記した。- 変更前の Git HEAD と変更後のソースから、
specdojo --helpに表示される全コマンドとサブコマンド 123 件の--helpを取得して比較し、差分がないことを確認した。 - 残課題はない。executor の後に実行する typecheck・lint・test などの親検証は runner に委ねる。