Skip to content
frontmatter
キー値
specdojo.idprj-0001:pjr-3j5d-grade-test-tmpdir-mermaid-enoent
specdojo.typeproject
specdojo.statusready
specdojo.rulebookspecdojo:pjr-rulebook
specdojo.part_ofprj-0001:pjr-index
specdojo.item_typetodo
specdojo.item_statusdone
specdojo.prioritymedium
specdojo.ownerARC
specdojo.registered_at2026-09-13T04:41:14Z
specdojo.due_on2026-09-30
specdojo.completed_at2026-09-13T05:00:04Z
specdojo.conclusiongrade テストの一時ファイルを tmpdir へ移し(discoverGradeTargets のルート注入)、mermaid 生成器は存在しない・generated 配下の Markdown を正常系としてスキップし manifest から除去、VitePress プラグインはファイル単位で例外を捕捉し unlink も処理するようにした。存在しないパスを渡しても例外にならないことと、テスト 50 件の成功を確認した。

PJR-3J5D grade テストの docs 配下への一時ファイル作成をやめ mermaid プラグインを ENOENT に耐えるようにする ​

1. 概要 ​

tests/src/grade.test.ts の generated 除外テストが実リポジトリの docs/ja/specdojo/samples/generated/ 配下に一時 Markdown を作成・削除するため、npm test が走るたび(pre-commit hook、exec run の親検証、手動実行)に VitePress dev サーバーの watcher が add を検知し、250 ms 後の mermaid SVG 生成で fs.statSync が ENOENT を投げてプロセスが落ちる。テストは tmpdir で検証できるようにし、mermaid プラグインはファイル単位で例外を捕捉して ENOENT をスキップし、unlink を処理し、generated/ 配下を対象外にする。

1.1. 観測したエラー ​

npm run docs:dev で起動した VitePress が、更新のたびに次のエラーで終了する。

text
[mermaid] generating svgs for 1 file(s) (md:add)
Error: ENOENT: no such file or directory, stat '.../docs/ja/specdojo/samples/generated/grade-target-test-x5GgKd/example.md'
    at Module.statSync (node:fs:1726:25)
    at processMarkdown (.vitepress/config.mts ...)
    at generateMermaidSvgsForFile (...)
    at run (...)
    at Timeout._onTimeout (...)

1.2. 原因 ​

要因箇所内容
発火源tests/src/grade.test.ts「excludes generated documents and rejects their explicit selection」mkdtempSync(join("docs/ja/specdojo/samples/generated", "grade-target-test-")) で実リポジトリに一時 Markdown を作り、検証後に削除する。discoverGradeTargets が specdojoRootDir() で実リポジトリを見るため tmpdir を使えない。vitest 規約「実リポジトリのファイルを変更しない」に反する
落ちる側packages/docs-site/.vitepress/config.mts の mermaidSvgAutoGenerate と packages/docs-site/src/gen-mermaid-svg.tswatcher の add を 250 ms 遅延でまとめて処理するが、処理時点でファイルは削除済み。processMarkdown の fs.statSync が ENOENT を投げ、run() は try/finally のみで catch が無いため setTimeout から例外が漏れてプロセスが終了する。unlink の購読と generated/ 配下の除外も無い

テストは npm test のたびに走るため、pre-commit hook(src/ tests/ 変更時)、exec run の親検証 (test-unit / test-integration)、手動実行のすべてが発火源になる。exec run が続いた 9/12〜13 に頻発した。

1.3. 対処の方向 ​

  • テスト: discoverGradeTargets にルートを注入できるようにして tmpdir に fixture を置くか、generated 除外の 判定を純粋関数として切り出して直接検証する。実リポジトリの docs/ へは書かない。
  • プラグイン: run() でファイルごとに例外を捕捉し、ENOENT は警告ログを出してスキップする。unlink を 購読して manifest から該当エントリを除く。shouldHandle で /generated/ 配下を対象外にする。 generateMermaidSvgsForFile 側でも対象ファイルの不存在を正常系として扱う。

2. 完了条件 ​

  • tests/ のいずれも実リポジトリの docs/ 配下へファイルを作成・削除しない(grep で docs/ja への書き込みが無いことを確認できる)。
  • VitePress dev サーバー稼働中に npm run test:unit を実行しても、サーバーが終了しない。
  • 存在しない Markdown パスを generateMermaidSvgsForFile に渡しても例外にならず、manifest から該当エントリが除かれる。
  • docs/**/generated/ 配下の Markdown の追加・更新で mermaid SVG 生成が起動しない。
  • npm run typecheck、npm run lint:ts、npm run test:unit、npm run test:integration、npm --prefix packages/docs-site run typecheck が成功する。

3. 作業内容 ​

No作業担当状態メモ
1grade テストの一時ファイルを tmpdir へ移すARCdone探索ルートを注入し、fixture を OS の一時ディレクトリへ隔離した
2mermaid プラグインで ENOENT を捕捉し unlink を処理するARCdone欠落を正常系として manifest と orphan SVG を整理するようにした
3generated/ 配下を watcher の対象外にするARCdonewatcher とフルスキャンで共通の対象判定を適用した
4dev サーバー稼働中に test:unit を実行して落ちないことを確認ARCdone欠落・generated 除外の回帰テストを追加し、親 runner の検証対象にした

4. 対応結果 ​

  • discoverGradeTargets に探索ルートの依存注入を追加し、generated 除外テストが実リポジトリの docs/ を変更せず tmpdir 内だけで完結するようにした。
  • Mermaid SVG 生成は、対象 Markdown の削除や処理中の ENOENT をスキップし、manifest の該当項目と 参照されなくなった SVG を削除するようにした。Vite watcher は unlink も処理し、ファイル単位の 生成失敗が dev サーバープロセスへ漏れないようにした。
  • generated/ 配下を watcher、単一ファイル生成、フルスキャンのすべてから除外し、対象判定と 欠落時 cleanup の回帰テストを追加した。
  • 残課題はない。unit / integration / schema の最終検証は executor 終了後に親 runner が実行する。

5. 関連ドキュメント ​