Appearance
jscpd(重複コード検知)
jscpd で core_src のコピー&ペーストを検知する。導入は Phase 1-B(Issue #1301)、CI ブロックは Phase 2-B(Issue #1303)。
設定
正本はリポジトリルートの .jscpd.json。
| 項目 | 値 | 理由 |
|---|---|---|
path | core_src | アプリ本体のみ |
minLines | 12 | 先頭の declare / namespace など短い一致の偽陽性を抑える(PR #3278) |
minTokens | 70 | 同上 |
threshold | 5.4 | 重複行率(%)の上限。超過で非 0 終了 |
ignore
標準除外のみ(vendor / node_modules / build)。Template/daily_article_template の一時除外は Issue #3577 で未使用 assets/ を削除し解消済み。
現状と段階引き下げ
計測日: 2026-10-06(CI Quality Gate の npm run duplicates:check、jscpd 5.3.3)。
| 項目 | 値 |
|---|---|
| 合計重複行率 | 約 5.31%(789 clones) |
CI ゲート(threshold) | 5.4% |
| 最終目標 | 3% |
#3799 / #3800 前後で 5% をわずかに超え、ゲートを 5.5% に上げた(Issue #3801)。Issue #3802 でランキング modal / logout confirm / マスタ Admin 表示層 / AI chat ヘルパーを共通化し、約 5.32% → 約 5.10% まで下げたうえでゲートを 5.2% に引き下げた。PR #3850(jscpd 5.3.1 → 5.3.3)で重複行の数え方が変わり約 5.31% になったため、.jscpd.json の threshold を 5.4 に上げた。ただし package.json の duplicates:check に --threshold 5.2 が残っていて CI では 5.2 で判定され続けたため、Issue #3996 で --threshold を外して閾値を .jscpd.json に一本化した。
ゲートは現状より少し高めにして、新規の大きな重複混入を止める。3% までの残ギャップは別クローン群の共通化が必要。閾値は .jscpd.json の threshold が正本。core_src を対象にするスクリプト(duplicates / duplicates:check)に --threshold を書かない(コマンドラインの値が設定ファイルより優先されるため)。
コマンド
| 用途 | コマンド |
|---|---|
レポート(HTML は reports/jscpd/。.gitignore の reports/) | npm run duplicates |
| CI ゲート相当(閾値超過で失敗) | npm run duplicates:check |
tests/Unit の重複(コンソール表示のみ。失敗しない) | npm run duplicates:tests |
duplicates と duplicates:check の中身はどちらも jscpd で同じ。どちらも .jscpd.json の threshold を超えると非 0 で終了する。CI ゲートからは duplicates:check を呼ぶ。
Quality Gate のローカル一括(composer quality-check:full)にも duplicates:check が含まれる。
tests/Unit の計測(duplicates:tests)
テストの重複は CI ゲートの対象外で、ローカルで傾向を見るためだけに使う(Issue #4007)。コマンドラインで渡したパスが .jscpd.json の path より優先され、minLines / minTokens / ignore は .jscpd.json の値(上の「設定」)を引き継ぐ。.jscpd.json には format が無く全形式が対象になるため、このスクリプトは --format php で PHPUnit のテストだけに絞る(tests/Unit には .ts も数件あり、混ぜると Issue #4007 の計測と条件が変わって率を比べられなくなる)。threshold は指定しないと core_src 用の閾値(.jscpd.json の 5.4%)で判定され、tests の 11% 台では毎回失敗するため、このスクリプトだけ --threshold 100 を指定している。--reporters console で HTML レポート(reports/jscpd/)は上書きしない。
2026-10-07 時点(npm ci 後の jscpd 5.3.3): 628 ファイル・142,765 行のうち重複 11.62%(875 clones)。重複行の約 76% は同じテストファイルの中の繰り返し。jscpd 5.3.1 では同じ条件で約 11.00% と出るため、比べるときは版を揃える(率の差が重複の増減とは限らない)。
CI
- マージ判定: CI Quality Gate 内の
npm run duplicates:check。必須チェック名はCI Quality Gate / Quality Gateのまま(Merge Queue は使わない) - HTML 成果物: ワークフロー
Duplicate Code Reportは 手動(workflow_dispatch)のみ。PR では起動しない(Plan B: 追加のnpm ciを避ける)