---
name: dry-check
description: "新規・変更した関数について、同等ロジックを手書きしている箇所を grep で検索し DRY 違反をフラグする。関数の新規定義・変更時に使用。"
argument-hint: "[関数名と主要操作, 例: 'show_main_and_emit: show() + set_focus() + emit(window-shown)']"
allowed-tools:
  - Read
  - Grep
  - Glob
---

$ARGUMENTS に関連する DRY 違反を検査する。

## 背景

関数を作ることと、既存コード全体にその関数を適用することは別の作業。関数より前に手書きされた重複コードは、関数が内包する振る舞い（例: `emit()` 呼び出し）を欠いたまま残りやすい。

## Step 1 — 関数の分析

$ARGUMENTS から以下を抽出する:
- 関数名
- 関数が行う主要操作（grep 可能なパターンのリスト）

例:
```
関数: show_main_and_emit
主要操作:
  - .show()
  - .set_focus()
  - emit("window-shown")
```

$ARGUMENTS に操作が明示されていない場合は、先に関数本体を読む。

## Step 2 — 各主要操作を grep

コードベース全体で各操作を個別に検索する。
関数自身の内部のマッチは除外する。

## Step 3 — 手書き重複の特定

以下の条件を満たす呼び出し箇所を候補とする:
- 主要操作のうち2つ以上を手動で実行している、かつ
- 当該関数を呼び出していない

各候補について十分なコンテキストを読んで理解する。

## Step 4 — 各候補の評価

```
候補: <file>:<line> — <説明>
  現状: <手動で行っている処理>
  欠落: <関数が追加する処理のうち手動版にないもの>
  判定: [置換] <関数呼び出し> に置き換える
        [維持] 理由: <置換が不適切な理由>
```

## 出力

全候補を判定と根拠付きで列挙する。
違反が見つからなかった場合: 「手書き重複は見つかりませんでした。」
