Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AIが増やしたコードをAIに探させない ~ jscpdとknipの違いと使い分け ~

Avatar for hidao hidao
September 18, 2026

AIが増やしたコードをAIに探させない ~ jscpdとknipの違いと使い分け ~

AIコーディングを続けると、コードベースに2種類のゴミが溜まります。
 1. 重複コード: 別セッションで似た関数をもう一度書く
 2. デッドコード・未使用依: 改善の結果、呼ばれなくなった資産が残る

これらの重複と未使用の「特定」は静的解析ツールに任せ、AIには「消してよいかの判断」と「まとめ方の実装」だけを渡すようにしましょう。
構文解析と参照解析で機械的に答えが出る問題なら推論は不要です。ツールに解かせれば実質ゼロトークン。

Avatar for hidao

hidao

September 18, 2026

More Decks by hidao

Other Decks in Programming

Transcript

  1. 自己紹介 ひだお(hidao80) 好きなこと: 情報整理:Markdown-vault × AI 自作ツール開発:PWA / UserScript /

    ブラウザ拡張機能 HN: / ... 活動: 技術記事投稿:Qiita / Zenn / dev.to OSS個人開発:VS Code / Chrome拡張 / PWA モットー: 最適・最小・理性的 / 三方利益 2
  2. 検出できる「重複」は3種類 種別 Type-1(完全一 致) Type-2(リネー ム) (近似) Type-3 内容 トークンが完全一致

    変数名・リテラルだけ 違う 数行の挿入・構文木が 類似 検出方法 jscpd . --ignore-identifiers --ignoreliterals --max-gap-lines / --similarity が生成する重複は完全なコピペとは限らない → デフォルト実行で「重複なし」でも、オプションで見え方が変わる AI 9
  3. よく使うオプション オプション -l, --min-lines -k, --min-tokens -t, --threshold -r, --reporters

    -m, --mode --cross-formats 説明 重複と判定する最小行数 重複と判定する最小トークン数 閾値超過でビルドを失敗させる割合 レポーター指定(約15種類) 検索精度 strict / mild / weak 拡張子をまたぐ検出(例 js-ts ) デフォルト 5 50 null time,console mild - 10
  4. 既存の重複に埋もれないために jscpd . --update-baseline # 現状を記録 jscpd . --fail-on-new-clones #

    新規の重複だけCIで落とす クローンの指紋はコンテンツハッシュ → 行移動や無関係な編集では誤検知しない --baseline-from-ref origin/main でgit refとの比較も可能 → 「今日から増やさない」 を守る運用が現実的 11
  5. knip :未使用(デッドコード)を検出する npm init @knip/config # 対話式セットアップ(推奨) npm run knip

    未使用ファイル・未使用exports・未使用依存関係を検出 実際のフレームワーク構成からエントリポイントを導く「advanced analysis」 npm月間4,000万DL / Vercelは約30万行の削除に活用 12
  6. knip の設定:ハマりどころ { "entry": ["src/index.ts", "scripts/{build,create}.js"], "project": ["src/**/*.ts", "scripts/**/*.js"] }

    書いた値はデフォルトへの追加ではなく置き換え → 自分で entry を書いた時点で既定の src/index.ts は対象外になる 公式Tip:entryは具体的に、ワイルドカードは最小限に ただしプラグインが自動追加するエントリは別枠(消えない) 13
  7. knip のプラグイン 以上を標準搭載 150 Astro / Cypress / ESLint /

    Jest / GitHub Actions / Next.js / Nx / など プラグインが有効なら、そのフレームワークのエントリも自動追加 Remix / Storybook / Svelte / Vite / Vitest / webpack 「設定ファイルからしか参照されていないパッケージ」を未使用と誤判定しないのは、 この仕組みのおかげ → 14
  8. 違いと使い分け 観点 jscpd 検出対象 重複(コピペ) 主な用途 リファクタリング対象の特定 対応言語 224言語 実装

    Rust製バイナリ(v5〜) 統合 GitHub Action, SARIF, pre-commit 排他ではなく併用/順序は knip → jscpd (先に消せば、jscpdの指摘そのものが減る) knip 未使用(デッドコード) 削除可能なファイル・依存の特定 JavaScript / TypeScript中心 Node.js製CLI 150+プラグイン、モノレポ 15
  9. AI コーディングへの組み込み方 を実行して未使用ファイル・exports・依存を一覧化 2. 一覧をAIに渡し、「消してよいか」の判断と削除だけを依頼 3. jscpdを実行して重複の座標を得る( --reporters ai )

    4. 共通化する価値があるものだけ、ファイルを明示して依頼 5. --baseline を更新し、以降は新規の重複だけをCIで止める 1. knip ポイントは「AIに探させない」こと ファイルパスと行番号を先に渡せば、AIによる探索工程はまるごと省ける 16
  10. ツール側も同じ問題意識を持っている 公式トップの見出し: jscpd 「Agents copy. Reviewers miss it. Your build

    shouldn't.」 (エージェントはコピーする。レビュアーは見落とす。ビルドは見逃すな。) 向けレポーター。デフォルト比約79%のトークン削減を公称 --dashboard : 重複・複雑なファイル・デッドコードを1画面に --reporters ai : LLM 17
  11. MCP サーバーとエージェントスキル:jscpd { "mcpServers": { "jscpd": { "command": "jscpd", "args":

    ["--mcp", "."] } } } スニペットの重複確認・クローン一覧・再スキャン・類似関数検索をエージェントから npx skills add kucherenko/jscpd でエージェントスキルも導入可 18
  12. まとめ は重複、knipは未使用を発見する。対象が違うので併用する jscpdは --baseline + --fail-on-new-clones で「今日から増やさない」 knipはゼロコンフィグで動くが、 entry は具体的に書く

    「探索は静的解析、判断と実装はAI」 対象の特定にトークンを払わないことが、そのまま認知負荷の削減になる jscpd 「AIが増やしたコードをAIに探させる」のは、いちばん高くつくやり方 21