事象
markdown-lint reusable workflow を caller として呼び出すと,textlint ステップが空の textlint-report.xml を出力し,後続の reviewdog が `reviewdog: parse error: EOF` で exit 1 する.
実観測したリポジトリ:tomio2480/blog-private#1(Private のため URL のみ参考).
切り分け結果
1. 中央テンプレート `templates/.textlintrc.json` と textlint v15 の非互換
中央テンプレートは preset を shorthand で参照している:
```json
{
"rules": {
"preset-ja-technical-writing": {...},
"preset-ja-spacing": {...}
}
}
```
textlint v15.6.0 ではこの shorthand では preset が解決されず, `textlint --print-config` で `"rule": []` (空配列)になる.完全モジュール名( `textlint-rule-preset-ja-technical-writing` 等)に書き換えると解決される.
2. 中央テンプレートの `filters.comments` と install 内容の不整合
中央テンプレートには `filters.comments: true` が含まれる:
```json
{
"filters": {
"comments": true
}
}
```
しかし `Setup textlint runtime` ステップの `npm install` 対象は以下のみで, `textlint-filter-rule-comments` を含まない.
- textlint
- textlint-rule-preset-ja-technical-writing
- textlint-rule-preset-ja-spacing
- textlint-rule-prh
filter モジュールが見つからない場合, textlint は config 全体を silently reject し `"rule": []` になる.
3. self-detection が caller リポジトリを中央として誤認
`Detect self repository` ステップのログ:
```
Detected self repo: tomio2480/blog-private
Using ref: refs/pull/1/merge
```
caller リポジトリ自身を中央リポジトリとして actions/checkout してしまうため, `.central-workflows/templates/.textlintrc.json` のフォールバック解決が必ず失敗する(caller には `templates/` ディレクトリがないため).
影響
- 中央テンプレートをそのまま per-repo override として配置しても CI が落ちる
- ローカルで preset を完全モジュール名に書き換え, filters ブロックを削除した上でも CI 上では textlint が空出力になる事象が継続観測されており,さらに別の不整合の可能性がある(再現環境の再調査が必要)
提案する修正
- `templates/.textlintrc.json` の preset 参照を完全モジュール名に書き換える
- `textlint-filter-rule-comments` を install 対象に追加する(または `filters.comments` を中央テンプレートから外す)
- self-detection ロジックを修正し, reusable workflow の所属リポジトリを正しく検出する
- (任意)caller 側で `textlint-report.xml` が空でも reviewdog を skip する分岐を入れる. EOF parse error を握りつぶす形でフェイルセーフ化.
参照
事象
markdown-lint reusable workflow を caller として呼び出すと,textlint ステップが空の
textlint-report.xmlを出力し,後続の reviewdog が `reviewdog: parse error: EOF` で exit 1 する.実観測したリポジトリ:tomio2480/blog-private#1(Private のため URL のみ参考).
切り分け結果
1. 中央テンプレート `templates/.textlintrc.json` と textlint v15 の非互換
中央テンプレートは preset を shorthand で参照している:
```json
{
"rules": {
"preset-ja-technical-writing": {...},
"preset-ja-spacing": {...}
}
}
```
textlint v15.6.0 ではこの shorthand では preset が解決されず, `textlint --print-config` で `"rule": []` (空配列)になる.完全モジュール名( `textlint-rule-preset-ja-technical-writing` 等)に書き換えると解決される.
2. 中央テンプレートの `filters.comments` と install 内容の不整合
中央テンプレートには `filters.comments: true` が含まれる:
```json
{
"filters": {
"comments": true
}
}
```
しかし `Setup textlint runtime` ステップの `npm install` 対象は以下のみで, `textlint-filter-rule-comments` を含まない.
filter モジュールが見つからない場合, textlint は config 全体を silently reject し `"rule": []` になる.
3. self-detection が caller リポジトリを中央として誤認
`Detect self repository` ステップのログ:
```
Detected self repo: tomio2480/blog-private
Using ref: refs/pull/1/merge
```
caller リポジトリ自身を中央リポジトリとして actions/checkout してしまうため, `.central-workflows/templates/.textlintrc.json` のフォールバック解決が必ず失敗する(caller には `templates/` ディレクトリがないため).
影響
提案する修正
参照