Imported from langcore-org/united-productions-web (
.claude/skills/feature-cleanup/SKILL.md). Install upstream withnpx skills add langcore-org/united-productions-web --skill feature-cleanup. Copyright stays with the author.
Feature Cleanup Skill
機能を安全に削除・移行するためのエージェント行動指針。
⚠️ 重要な原則: スクリプトは補助ツール。最終判断は常にエージェントが行う。スクリプトの結果を鵜呑みにせず、臨機応変に対応すること。
バージョン: 3.0 最終更新: 2026-03-05
参照ガイド
- dialog-templates.md - Phase 4の詳細対話例(削除実行時に参照)
- practical-guide.md - 実例・エラー対応・スキル改善方法(トラブル時・学習時に参照)
🆕 v2.0 の新機能
| 機能 | コマンド | 説明 |
|---|---|---|
| 空ディレクトリ検出 | audit-unused.mjs |
自動的に空のディレクトリを検出 |
| DB削除スクリプト自動生成 | --generate-delete [ID] |
機能IDに応じた削除スクリプトを生成 |
| 対話的削除モード | --interactive |
対話的に削除対象を選択・実行 |
| 削除履歴自動記録 | verify.mjs --record |
削除結果を docs/backlog/ に自動記録 |
| 誤検出防止 | 全スクリプト | 単語境界チェックで正確な検索を実現 |
🎯 エージェンティック対応の原則(最重要)
「スクリプト頼み」になっていないか定期的に確認
❌ 悪い例(スクリプト頼み):
スクリプト結果 → 「削除候補はありません」と報告 → 終了
✅ 良い例(エージェンティック):
スクリプト結果 → 「あれ?これは変だ」と違和感を持つ
→ grepで実際に検索
→ ファイルを開いて内容確認
→ 「実はこういう状態」と判断
→ ユーザーに「こういう理由で削除可能/不可」と説明
臨機応変な対応パターン
| 状況 | スクリプト的対応 | エージェンティック対応 |
|---|---|---|
| 検出結果が0件 | 「削除候補なし」と報告 | 「本当に?手動でも確認してみる」 |
| 検出結果が多い | すべて報告 | 重要度でフィルタリングして優先提示 |
| 誤検出がある | そのまま報告 | 「これは誤検出だ」と判断して除外 |
| 曖昧な結果 | スクリプトの判定に従う | 追加調査して判断 |
| ユーザーが迷っている | 選択肢を提示するだけ | 推奨を明確に述べる |
対話の流れ(理想形)
ユーザー: 「未使用機能を整理したい」
エージェント:
1. スクリプト実行(候補発見)
2. 結果を見て「あ、これはおかしい」と違和感を持つ
3. 追加調査(grep, ファイル確認)
4. 「調査した結果、以下の3パターンがあります:
A. 即座に削除可能(空ディレクトリ)
B. 確認が必要(Sidebarにないが参照あり)
C. 残すべき(将来的に使用予定)
推奨は A を先に処理し、B は詳細調査後に判断」
5. ユーザーと対話しながら進行
重要な思考パターン
スクリプト実行後、必ず自問する:
- 「この結果、本当に正しいか?」
- 「違和感はないか?」
- 「見落としはないか?」
- 「ユーザーが納得する説明ができるか?」
違和感があれば、躊躇なく追加調査:
# スクリプトでは検出できないケースを手動で確認
grep -rn "怪しいキーワード" app/ lib/ --include="*.tsx"
find app/ -type d -empty # 空ディレクトリ
ls -la app/(authenticated)/ # ディレクトリ一覧確認
ユーザーの意図を汲み取る:
- 「整理したい」→ 削除だけでなく、分類・優先順位付けも提案
- 「この機能不要?」→ なぜ不要と思ったかを確認(技術的負債?仕様変更?)
- 「安全に削除したい」→ 慎重アプローチ(DRY RUN→段階的削除)
スクリプトとエージェントの役割分担(再確認)
| 作業 | スクリプトの役割 | エージェントの役割 |
|---|---|---|
| 候補発見 | パターンに基づき候補を列挙 | 候補の妥当性を判断 |
| 詳細調査 | 統計情報を収集 | ファイルを開いて意味を理解 |
| リスク評価 | 依存関係を数値化 | 本当の影響範囲を判断 |
| 削除実行 | 機械的な削除処理 | 削除の順序・方法を設計 |
| 検証 | 自動チェック | 最終的な品質確認 |
結論: スクリプトは「手を動かす」、エージェントは「頭を使う」
エージェントの基本姿勢
判断基準:いつこのスキルを使うか
| ユーザーの発言パターン | エージェントの対応 |
|---|---|
| 「〜を削除したい」 | 削除対象の調査から開始 |
| 「〜はもう使ってない」 | 使用状況の確認を提案 |
| 「整理したい」「掃除したい」 | クリーンアップ対象の洗い出し |
| 「LangChainを消したい」等 | 技術的負債解消として対応 |
| 「〜をアーカイブしたい」 | 移行・整理として対応 |
臨機応変な対応パターン
| 状況 | エージェントの対応 |
|---|---|
| 削除対象が明確 | analyze-risk.mjs → 即座に削除実行 |
| 削除対象が不明確 | audit-unused.mjs → エージェントによる詳細調査 → ユーザー選択委譲 |
| 🔴重大リスク検出 | 段階的削除を推奨 |
| 🟡中リスク以下 | 一括削除を推奨 |
| ユーザーが迷っている | 判断材料を提示 |
| 削除中に問題発生 | 自動修正/手動修正/スキップ/ロールバックの選択肢を提示 |
重要:スクリプトとエージェントの役割分担
基本原則:スクリプトは「候補発見」、エージェントが「最終判断」
| 作業タイプ | スクリプトの役割 | エージェントの役割 |
|---|---|---|
| 候補発見 | audit-unused.mjs で候補リスト作成 |
リストを確認し、違和感があれば追加調査 |
| 詳細調査 | analyze.mjs で全体像提示 |
ファイルを開いて内容を確認し、実際の使用状況を判断 |
| リスク分析 | analyze-risk.mjs で候補提示 |
コードを読み、本当の影響範囲を判断 |
| 削除実行 | delete-feature.mjs で統合削除 |
エディタで細かい修正を補完 |
| 検証 | verify.mjs で最終チェック |
異常があれば追加調査 |
エージェンティック調査の重要性:
❌ 悪い例:
audit-unused.mjs の結果だけを見て「削除候補はありません」と報告
✅ 良い例:
audit-unused.mjs を実行 → 結果を確認
→ 「na-scriptはSidebarにないがページがある。実際に使われているか確認が必要」
→ grep で使用箇所を確認
→ page.tsx を開いて内容を確認
→ 「実際には無効化されており、直接URLアクセスのみ可能」と判断
→ ユーザーに「完全削除か無効化か」を確認
エージェンティック調査ワークフロー
Phase 0: 候補発見(スクリプト実行)
# 基本調査(空ディレクトリも自動検出)
node .claude/skills/feature-cleanup/scripts/audit-unused.mjs
# 深層調査(prisma/schema, types/, config/ も含む)
node .claude/skills/feature-cleanup/scripts/audit-unused.mjs --deep
# 対話的削除モード
node .claude/skills/feature-cleanup/scripts/audit-unused.mjs --interactive
# DB削除スクリプト自動生成
node .claude/skills/feature-cleanup/scripts/audit-unused.mjs --generate-delete "機能ID"
スクリプト出力の読み方:
- 【✅ アクティブ機能】→ 無視
- 【⚠️ 非表示だが使用中】→ エージェント詳細調査対象
- 【📄 設定のみ】→ エージェント詳細調査対象
- 【🗑️ 削除候補】→ 即座に削除検討
- 【💬 コメントアウト済み】→ 即座に削除検討
- 【🔍 空のディレクトリ】→ 即座に削除可能
Phase 1: エージェントによる詳細調査(必須)
スクリプトの結果だけで判断してはいけない。
Step 1: 定義ファイルを確認
# 機能IDがどこで定義されているか確認
grep -rn "featureId.*\"機能ID\"" lib/ types/ config/ --include="*.ts"
該当ファイルを開いて:
- 型定義のみか、実際の設定オブジェクトもあるか
- 他の設定とどう関連しているか
Step 2: コード参照を確認
# どこから参照されているか
grep -rn "機能ID" app/ lib/ components/ --include="*.ts" --include="*.tsx" | head -30
該当ファイルを開いて:
- import されているか、文字列リテラルとしてのみ使われているか
- 実際のロジックで使用されているか、型定義のみか
Step 3: 実際の使用状況を判断
判断チェックリスト:
| 確認項目 | 削除可能サイン | 要注意サイン |
|---|---|---|
| 型定義 | 型のみで実体なし | 他の型と相互参照 |
| import | されていない | 複数ファイルからimport |
| 実行時使用 | 条件分岐で使われていない | 動的に呼び出されている |
| 将来的使用 | TODOコメントあり | 「将来使う」コメントあり |
Phase 2: リスク評価と方針決定
node .claude/skills/feature-cleanup/scripts/analyze-risk.mjs "[機能ID]"
エージェント判断ポイント:
- スクリプトの「🔴重大」は本当に重大か?
- 「🟡中」は実際に影響があるか?
Phase 3-5: 以降は従来通り
Phase 3以降は「Phase 0-5: 削除ワークフロー」セクションを参照。
対話型ワークフロー
削除作業は対話的に進行。ユーザーの判断を仰ぐポイントを明示。
特別モード: 未使用機能の発見と選択的削除
「未使用機能を整理したい」などの要望があった場合:
# まずスクリプトで候補発見
node .claude/skills/feature-cleanup/scripts/audit-unused.mjs
# 違和感があれば深層調査
node .claude/skills/feature-cleanup/scripts/audit-unused.mjs --deep
エージェントによる詳細調査(必須):
スクリプト結果:
【⚠️ 非表示だが使用中】
na-script
参照: 11件 (app: 4, lib: 6)
ページ: あり | API: なし
エージェントの対応:
→ 「na-script は Sidebar にないがページがあります。詳細を確認します。」
→ grep -rn "na-script" app/ --include="*.tsx"
→ page.tsx を開いて内容確認
→ 「実際には isActive=false で無効化されています。完全削除できます。」
ユーザーへの提示と選択後のフロー:
- A/B/C(削除選択)→ 通常の削除ワークフロー(Phase 2以降)へ
- D(個別確認)→ 各機能の詳細調査(analyze.mjs + エージェント調査)を実行
- E(削除しない)→ 理由を確認して記録
未使用機能の判断基準
| 状態 | 判断基準 | 推奨アクション |
|---|---|---|
| 未使用 | Sidebarなし + 参照≤1 | 削除検討 |
| コメントアウト | コードがコメントアウト | 削除検討 |
| 非表示使用中 | Sidebarなし + 参照>1 | エージェント調査必須 |
| 設定のみ | 定義あり + コード参照なし | エージェント調査必須 |
| ページのみ | ページあり + 参照なし | エージェント調査必須 |
| 空ディレクトリ | ディレクトリはあるが中身なし | 即座に削除 |
エージェンティック調査の実践例
ケース1: 「参照0件」だけど実は使われている
# スクリプト結果: 「参照0件(未使用)」
# エージェントの対応:
→ 「本当か?動的に呼び出されている可能性を確認」
→ grep -rn "featureId" app/ --include="*.tsx" | grep -v "import"
→ 「あ、query parameterで動的に指定されている!使用されている」
ケース2: 「削除候補」だけど実は重要
# スクリプト結果: 「Sidebarなし、参照1件(削除候補)」
# エージェントの対応:
→ 「どこから参照されているか確認」
→ grep -rn "機能ID" lib/ --include="*.ts"
→ 「lib/settings/db.ts から参照されている...これは重要ファイル」
→ 「削除すると他機能に影響する可能性がある」と判断
ケース3: スクリプトが検出できないケース
# スクリプト結果: 「問題なし」
# エージェントの対応:
→ 「本当に?手動で確認してみる」
→ ls -la app/(authenticated)/
→ 「あ、na-script という空ディレクトリがある!」
→ 「これはスクリプトの検出パターンに含まれていなかった」
→ ユーザーに報告して削除を提案
ケース4: ユーザーの真意を汲み取る
ユーザー: 「general-chat 必要?」
スクリプト的対応:
→ Sidebarにないが参照あり
→ 「詳細調査が必要です」
エージェンティック対応:
→ 「general-chat を確認しました」
→ 「実はデフォルト機能として /chat で使用されています」
→ 「ユーザーがagent指定なしでアクセスした時のfallbackです」
→ 「削除すると /chat?new=1 が動作しなくなります」
→ 「残すことを推奨します。削除する場合は代替機能の設計が必要です」
🔄 削除ワークフロー(承認制)
原則: 削除実行は必ずユーザー承認後。事前に徹底的な調査・解説を行う。
[Step 1] 候補発見 → [Step 2] 詳細調査 → [Step 3] 影響分析 → [Step 4] リスク解説作成
↓
[Step 6] 削除実行 ← [Step 5] ユーザー承認 ← ユーザーへの提示(一覧+解説+推奨)
↓
[中止/保留/修正依頼]
Step 1: 候補一覧作成(発見)
目的: 削除対象になりうるものを網羅的に発見する
# 1.1 未使用機能の発見
node .claude/skills/feature-cleanup/scripts/audit-unused.mjs
# 1.2 深層調査(必要に応じて)
node .claude/skills/feature-cleanup/scripts/audit-unused.mjs --deep
# 1.3 特定キーワードの検索(ユーザー指定時)
grep -rn "キーワード" app/ lib/ --include="*.ts" --include="*.tsx" | head -50
候補一覧の作成基準:
| カテゴリ | 基準 | 優先度 |
|---|---|---|
| 🗑️ 即座に削除可能 | 空ディレクトリ、コメントアウト済み、参照0 | 🔴 高 |
| ⚠️ 要詳細調査 | Sidebarなし+参照あり、設定のみ、ページのみ | 🟡 中 |
| 💾 要判断 | 将来使用予定、代替機能あり、データあり | 🟢 低 |
エージェントの判断(スクリプト結果を鵜呑みにしない):
❌ 「audit-unused.mjs の結果: 削除候補2件」→ そのまま報告
✅ 「スクリプト結果を確認 → これは実際には使われているか?
→ grepで追加検索 → ファイルを開いて確認
→ 「削除候補2件、うち1件は実際に使用されている可能性あり」」
Step 2: 詳細調査(コード・設定・データ)
目的: 各候補について、実際の使用状況と影響範囲を正確に把握する
2.1 コード参照の徹底調査
# 定義場所の特定
grep -rn "featureId.*\"候補ID\"" lib/ types/ config/ --include="*.ts"
# 全コードベースでの参照検索
grep -rn "候補ID" app/ lib/ components/ --include="*.ts" --include="*.tsx"
# import関係の確認
grep -rn "import.*候補ID\|from.*候補ID" app/ lib/ components/ --include="*.ts" --include="*.tsx"
# 動的参照の確認(query parameter, localStorage等)
grep -rn "query\|params\|localStorage\|sessionStorage" app/ --include="*.tsx" | grep -i "候補関連"
2.2 設定・型定義の確認
# 型定義の確認
grep -rn "type.*FeatureId\|interface.*Feature" types/ lib/ --include="*.ts"
# 設定オブジェクトの確認
grep -rn "FEATURES\|featureConfigs\|AGENTS" lib/ --include="*.ts"
# Sidebar設定の確認
grep -rn "sidebar\|navigation\|menu" lib/ components/ --include="*.ts" --include="*.tsx"
2.3 DB関連の調査
# プロンプトキーの確認
node prompt-tuning/scripts/get.mjs "候補ID" 2>/dev/null || echo "プロンプトなし"
# DBスキーマでの確認
grep -rn "候補ID\|Enum.*Feature" prisma/ --include="*.prisma"
2.4 実際のファイル確認(最重要)
該当ファイルを1つずつ開いて確認:
| 確認項目 | 確認内容 | 判断材料 |
|---|---|---|
| ページファイル | page.tsx の中身 |
実際にレンダリングしているか |
| APIルート | route.ts のロジック |
他から呼ばれているか |
| コンポーネント | props, hooksの使用 | どこから使われているか |
| 設定ファイル | 定数、マッピング | 削除時の影響範囲 |
調査結果の記録テンプレート:
### 候補: [機能ID]
**発見経緯**: audit-unused.mjs / 手動検索 / ユーザー指定
**定義場所**:
- `lib/settings/db.ts` - FEATURES配列
- `types/feature.ts` - FeatureId型
**参照箇所**:
- `app/(authenticated)/[feature]/page.tsx` - ページ(未使用と判断)
- `lib/chat/agent-config.ts` - エージェント設定(他機能と共有)
**DB関連**:
- SystemPrompt: あり(key: FEATURE_ID)
- Chat/Message: 15件の会話履歴
**使用状況判断**:
- [ ] 実際に使用されている
- [x] 未使用(Sidebarなし、直接URLのみ)
- [ ] 判断保留(要追加調査)
**備考**:
- isActive=falseで無効化済み
- 2024-12に最後に使用
Step 3: 影響分析(リスク特定)
目的: 削除時の影響範囲と重大度を特定し、対策を検討する
3.1 依存関係の可視化
# 削除対象ファイルの依存関係を分析
node .claude/skills/feature-cleanup/scripts/analyze-risk.mjs "機能ID"
# 手動での依存確認(スクリプトでは検出できないケース)
grep -rn "import.*from.*機能関連" app/ lib/ --include="*.ts" --include="*.tsx"
3.2 影響カテゴリの評価
| 影響カテゴリ | 評価項目 | 重大度 |
|---|---|---|
| 機能停止 | 削除により他機能が動作しなくなるか | 🔴 重大 |
| データ損失 | ユーザー履歴・設定が失われるか | 🔴 重大 |
| 型定義崩壊 | 型定義が不完全になりビルドエラーになるか | 🟠 高 |
| UI崩壊 | Sidebarやナビゲーションが壊れるか | 🟠 高 |
| 将来影響 | 計画中の機能に影響するか | 🟡 中 |
| 保守性 | 削除によりコードが複雑化するか | 🟢 低 |
3.3 削除パターンの選定
| パターン | 適用条件 | 削除範囲 |
|---|---|---|
| A. 完全削除 | 依存なし、未使用確実 | ファイル・コード・DB全削除 |
| B. 段階的削除 | 依存あり、リスクあり | まず無効化→影響確認→完全削除 |
| C. 部分削除 | 一部のみ不要 | 不要部分のみ削除、残りは維持 |
| D. 保留 | 判断材料不足・将来使用予定 | 削除せず、記録のみ |
Step 4: リスク解説ドキュメント作成
目的: ユーザーが削除の判断を下せるよう、分かりやすく解説する
4.1 解説ドキュメントの構成
## 削除候補レポート
作成日: YYYY-MM-DD
調査者: AI Agent
### サマリー
削除候補 N件(🔴即座削除可能: X件 / 🟡要確認: Y件 / 🟢保留推奨: Z件)
---
### 候補1: [機能ID] - 🔴 即座削除可能
**概要**:
空のディレクトリ。コード・設定・DB参照なし。
**調査詳細**:
- 定義場所: なし
- 参照: 0件
- DB関連: なし
- 最終使用: 不明(作成のみ)
**リスク評価**: ✅ リスクなし
- 機能停止: なし
- データ損失: なし
- 型定義崩壊: なし
**推奨アクション**:
🗑️ **即座に削除可能**です。実行しますか?
[削除する] [スキップ]
---
### 候補2: [機能ID] - 🟡 要確認
**概要**:
Sidebarにないが、コード参照あり。実際の使用状況要確認。
**調査詳細**:
- 定義場所: `lib/settings/features.ts` - FEATURES配列
- 参照: 5件
- `app/(authenticated)/[feature]/page.tsx` - ページ(コメントアウト済み)
- `lib/hooks/useFeature.ts` - Hook(他機能でも使用)
- DB関連: SystemPromptあり(key: FEATURE_ID, version: 3)
- 最終使用: 2025-01(3ヶ月前)
**リスク評価**: ⚠️ 中リスク
- 機能停止: 🟡 なし(コメントアウト済み)
- データ損失: 🔴 **15件の会話履歴が失われます**
- 型定義崩壊: 🟡 `lib/hooks/useFeature.ts` で共用(修正必要)
**推奨アクション**:
🟡 **無効化(isActive=false)を推奨**。完全削除は履歴失うため。
選択肢:
- [ ] A) 完全削除(履歴も削除)
- [ ] B) 無効化のみ(履歴保持、機能非表示)
- [ ] C) 保留(判断保留)
- [ ] D) 詳細調査(追加調査が必要)
---
### 候補3: [機能ID] - 🟢 保留推奨
**概要**:
Sidebarにないが、計画中の機能で使用予定あり。
**調査詳細**:
- 参照: 2件(設定ファイルのみ)
- 最終使用: 未使用
- 備考: `docs/plans/future-feature.md` で将来使用と記載
**リスク評価**:
- 削除自体は問題ないが、将来再作成が必要
**推奨アクション**:
🟢 **保留**。docs/backlog/に記録し、将来の判断材料に。
[保留して記録] [削除する] [詳細確認]
Step 5: ユーザーへの提示と承認
目的: 分かりやすく解説し、明確な承認を得る
5.1 提示のポイント
ユーザーへの提示フォーマット:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 削除候補レポート(N件)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【即座削除可能】🔴
1. [機能ID1] - 空ディレクトリ
2. [機能ID2] - コメントアウト済み
【要確認】🟡
3. [機能ID3] - 履歴15件あり、無効化を推奨
4. [機能ID4] - 他機能と型を共有、修正必要
【保留推奨】🟢
5. [機能ID5] - 将来使用予定
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 推奨アクション:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
A) 🔴 のみ削除(安全)
B) 🔴+🟡 を無効化 or 削除(要詳細説明)
C) 全て保留(調査のみ)
D) 個別に確認(1つずつ判断)
どれを選択しますか?
または、特定の候補について詳細を知りたい場合はお知らせください。
5.2 個別詳細説明(ユーザー要求時)
ユーザー: 「[機能ID3]について詳しく」
エージェント:
「[機能ID3]の詳細です:
📍 現状:
- Sidebarには表示されていません
- しかし、過去に15回の会話が記録されています
- 最後の使用は3ヶ月前(2025-01)
⚠️ 削除の影響:
- 15件の会話履歴が完全に消えます
- ユーザーが「過去の相談を見たい」ときに見られなくなります
💡 代替案:
- 完全削除 → 履歴も消える
- 無効化(isActive=false)→ 履歴は残る、新規使用のみ不可
- どちらをご希望ですか?」
5.3 承認の明確化
承認を得る際のチェックリスト:
- 削除対象を具体的に明示(ファイル名、DBテーブル等)
- 影響範囲を説明(「〜が使えなくなります」)
- リスクを提示(「〜が失われます」)
- 代替案を提示(無効化、部分削除等)
- 推奨を明確に述べる(「〜を推奨します」)
- 明確なYes/Noを求める(「削除してよろしいですか?」)
Step 6: 削除実行(承認後)
目的: 承認された対象のみを、安全に削除する
6.1 実行前最終確認
# DRY RUNで最終確認(必須)
node .claude/skills/feature-cleanup/scripts/delete-feature.mjs "機能ID" --dry-run
# または個別に確認
echo "=== 削除対象ファイル ==="
find app/ -name "*機能ID*" -type f
echo "=== 削除対象ディレクトリ ==="
find app/ -name "*機能ID*" -type d
6.2 段階的削除実行
パターンA: 完全削除(承認済み)
# Step 1: ファイル削除
node .claude/skills/feature-cleanup/scripts/delete-feature.mjs "機能ID" --only-files
# Step 2: 検証
npx tsc --noEmit 2>&1 | grep -v node_modules | head -10
# Step 3: 問題なければDB削除
node .claude/skills/feature-cleanup/scripts/delete-feature.mjs "機能ID" --only-db
# Step 4: 最終検証
node .claude/skills/feature-cleanup/scripts/verify.mjs "機能ID"
パターンB: 無効化(推奨時)
# DBのisActiveフラグをfalseに(実装依存)
# または設定ファイルで無効化
6.3 実行中の問題対応
| 問題 | 対応 |
|---|---|
| 型エラー発生 | 依存ファイルの修正 → 再検証 |
| 削除失敗 | 原因調査 → 手動削除 or スキップ |
| 予期せぬ参照発見 | 削除中断 → ユーザー報告 → 再評価 |
Step 7: 検証と記録
目的: 削除が正しく完了したことを確認し、記録を残す
7.1 検証チェックリスト
# コード検証
grep -rn "機能ID" app/ lib/ --include="*.ts" --include="*.tsx" | wc -l
# → 0件であること
# 型チェック
npx tsc --noEmit 2>&1 | grep -v node_modules
# Lint
npx biome check . 2>&1 | grep -E "error|warning" | head -10
# ビルド
npm run build 2>&1 | tail -20
7.2 削除完了レポート
## 削除完了レポート
実行日: YYYY-MM-DD
### 実行サマリー
- 削除候補: N件
- 削除実行: X件
- 無効化: Y件
- 保留: Z件
### 削除詳細
| 機能ID | アクション | 結果 | 備考 |
|--------|-----------|------|------|
| feature-1 | 完全削除 | ✅ 成功 | ファイル3件、DBレコード1件 |
| feature-2 | 無効化 | ✅ 成功 | isActive=falseに設定 |
| feature-3 | 保留 | ⏸️ - | 将来使用予定のため |
### 検証結果
- [x] コード参照: 0件(クリア)
- [x] 型チェック: 通過
- [x] Lint: 通過
- [x] ビルド: 成功
### コミット
git add . git commit -m "cleanup: remove feature-1, disable feature-2
- feature-1: 未使用のため完全削除
- feature-2: 履歴保持のため無効化
- feature-3: 将来使用予定のため保留"
7.3 削除履歴の記録(重要)
# backlogに記録
node .claude/skills/feature-cleanup/scripts/verify.mjs "機能ID" --record
# または手動で記録
cat > docs/backlog/cleanup-removed-$(date +%s).md << 'EOF'
# 削除実行記録
## 削除対象
- feature-1
- feature-2
## 理由
未使用機能の整理
## 影響
- feature-1: 影響なし
- feature-2: 新規使用不可、履歴は保持
## 実行日
YYYY-MM-DD
EOF
対話例:ワークフロー実践
シナリオ: 「整理したい」→ 承認制ワークフロー
ユーザー: 「未使用機能を整理したい」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 1: 候補発見
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: audit-unused.mjs を実行
→ 候補3件発見
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 2: 詳細調査
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: 各候補を詳細調査
- feature-a: 空ディレクトリ → 🔴 即座削除可能
- feature-b: 参照あり、履歴あり → 🟡 要確認
- feature-c: 将来使用予定 → 🟢 保留
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 3: 影響分析
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: 影響を分析
- feature-b: 15件の履歴失う、型定義共有あり
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 4: 解説ドキュメント作成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: レポート作成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 5: ユーザー提示・承認
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント:
「調査完了しました。
📋 削除候補レポート:
🔴 feature-a: 即座削除可能(リスクなし)
🟡 feature-b: 履歴15件あり、無効化を推奨
🟢 feature-c: 将来使用予定、保留
🎯 推奨: feature-aを削除、feature-bを無効化
実行しますか?」
ユーザー: 「feature-bは完全削除で」
エージェント:
「feature-bは履歴15件が失われます。
本当に完全削除でよろしいですか?
(無効化なら履歴は保持されます)」
ユーザー: 「あ、じゃあ無効化で」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 6: 削除実行(承認後)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: DRY RUN → 実行 → 検証
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 7: 完了記録
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: 完了レポートを作成
ユーザー介入が必要なポイント(承認制ワークフロー)
必ず承認を得るポイント
| ステップ | 介入ポイント | 判断内容 | エージェントの action |
|---|---|---|---|
| Step 5 | 削除候補レポートの確認 | 一覧を確認し、方針を決定 | 解説ドキュメントを提示 |
| Step 5 | 個別詳細説明の要求 | 特定候補の詳細を知りたい | 詳細調査結果を説明 |
| Step 5 | 削除方法の選択 | 完全削除/無効化/保留 | 推奨を述べつつ選択肢を提示 |
| Step 6 | 最終実行承認 | DRY RUN結果を確認後、実行 | 最終確認をとってから実行 |
| Step 7 | 削除完了の確認 | 検証結果を確認 | 完了レポートを提示 |
自動実行可能(承認不要)
| ステップ | 作業内容 | 理由 |
|---|---|---|
| Step 1 | 候補発見(audit-unused.mjs) | 調査は安全 |
| Step 2 | 詳細調査(grep, ファイル確認) | 調査は安全 |
| Step 3 | 影響分析(analyze-risk.mjs) | 分析は安全 |
| Step 4 | 解説ドキュメント作成 | 作成は安全 |
| Step 6 | DRY RUN | 実際の変更なし |
| Step 7 | 検証(verify.mjs) | 検証は安全 |
決して自動実行しない(必ず承認を得る)
| 作業 | 理由 |
|---|---|
| ❌ 実ファイルの削除 | 元に戻せなくなる可能性 |
| ❌ DBデータの削除 | データ損失のリスク |
| ❌ 設定の変更(isActive等) | 影響範囲が広い |
| ❌ gitコミット | ユーザーが内容を確認する権利 |
承認を得る際の必須要素
✅ 削除対象の明確な特定(ファイル名、DBレコード等)
✅ 影響範囲の説明(「〜が使えなくなります」)
✅ リスクの提示(「〜が失われます」)
✅ 代替案の提示(無効化、部分削除等)
✅ 推奨の明確化(「〜を推奨します」)
✅ Yes/Noの明確化(「削除してよろしいですか?」)
スクリプト一覧
| スクリプト | 用途 | 実行タイミング | エージェント補完 |
|---|---|---|---|
audit-unused.mjs |
未使用機能の発見 | Phase 1 | 必須 - 結果を確認し追加調査 |
analyze.mjs |
削除対象の自動検出 | Phase 1 | 推奨 - ファイル内容確認 |
analyze-risk.mjs |
削除リスクの詳細分析 | Phase 2 | 推奨 - 本当の影響範囲確認 |
pre-check.mjs |
削除前の状態確認 | Phase 2 | - |
delete-feature.mjs |
統合削除スクリプト | Phase 4 | 推奨 - 削除実行 |
verify.mjs |
削除後の検証 | Phase 5 | - |
🆕 v2.0 スクリプト使用方法
audit-unused.mjs:
# 基本調査(空ディレクトリ自動検出)
node audit-unused.mjs
# 深層調査
node audit-unused.mjs --deep
# 対話的削除モード
node audit-unused.mjs --interactive
# 削除スクリプト生成
node audit-unused.mjs --generate-delete "機能ID"
delete-feature.mjs (NEW):
# DRY RUN
node delete-feature.mjs "機能ID" --dry-run
# 完全削除
node delete-feature.mjs "機能ID"
# ファイルのみ
node delete-feature.mjs "機能ID" --only-files
# DBのみ
node delete-feature.mjs "機能ID" --only-db
verify.mjs:
# 通常の検証
node verify.mjs "機能ID"
# 削除履歴を自動記録
node verify.mjs "機能ID" --record
スクリプト使用時の注意
重要: --deep や --generate-delete でも網羅的ではない。エージェントによる追加調査が必要。
削除対象カテゴリと対応
1. フロントエンドファイル
| 対象 | パターン | 対応 |
|---|---|---|
| ページ | app/**/[feature]/page.tsx |
削除 |
| レイアウト | app/**/[feature]/layout.tsx |
削除 |
| API | app/api/[feature]/route.ts |
削除 |
| コンポーネント | components/**/[Feature]* |
削除 |
| 空ディレクトリ | app/**/[feature]/ (中身なし) |
即座に削除 |
2. コード(修正必須)
| 対象 | パターン | 優先度 |
|---|---|---|
| 型定義 | type FeatureId = | "feature" |
🔴 高 |
| 定数 | FEATURES = { "feature": ... } |
🔴 高 |
| Agent定義 | AGENTS = [{ id: "feature" }] |
🔴 高 |
| 設定 | featureConfigs = { "feature": ... } |
🔴 高 |
| DB設定 | db.ts のマッピング |
🔴 高 |
| UI | Sidebar, ボタン | 🟡 中 |
| ページリンク | page.tsx のリンク |
🟡 中 |
3. DBデータ
| 対象 | テーブル | Hard Delete | Soft Delete |
|---|---|---|---|
| プロンプト | SystemPrompt | DELETE | isActive=false |
| 機能紐付け | FeaturePrompt | DELETE | isActive=false |
| バージョン履歴 | SystemPromptVersion | CASCADE DELETE | - |
| ユーザーデータ | Chat, Message | 別途検討 | 別途検討 |
4. ドキュメント
| 種類 | 対応 | 理由 |
|---|---|---|
| plans/ | archiveへ移動 | 完了した計画 |
| backlog/ | 削除 | 不要なタスク |
| specs/ | 更新 or 削除 | 仕様の変更 |
| lessons/ | 保持 | 学びは価値がある |
| archive/ | 保持 | すでにアーカイブ済 |
典型的な削除パターン(承認制ワークフロー適用)
| パターン | 特徴 | フロー(承認制) |
|---|---|---|
| A: シンプル削除 | 依存が少ない、リスクなし | Step1-4自動 → Step5承認 → Step6実行 → Step7検証 → コミット承認 |
| B: 複雑な依存 | 修正が多い、リスクあり | Step1-4自動 → Step5詳細説明 → Step5承認 → Step6段階的実行 → Step7検証 → コミット承認 |
| C: ライブラリ削除 | npm関連、影響範囲広 | Step1-4自動 → Step5影響説明 → Step5承認 → Step6実行 → Step7検証 → コミット承認 |
| D: データあり | 履歴・データがある | Step1-4自動 → Step5代替案提示(無効化推奨)→ Step5承認 → Step6実行 → Step7検証 → コミット承認 |
| E: 空ディレクトリ | 残骸のみ | Step1-4自動 → Step5承認(簡易) → Step6実行 → Step7検証 → コミット承認 |
すべてのパターン共通:
- Step 1-4は自動実行(調査・分析・解説作成)
- Step 5(承認)は必ず実施
- Step 6は承認後のみ実行
- gitコミットも承認後
実践ガイド・エラー対応・スキル改善
詳細は references/practical-guide.md を参照
参照タイミング:
- 削除実行中に問題が発生した時 → practical-guide.md の「トラブルシューティング」
- 具体的な削除例が知りたい時 → practical-guide.md の「実例:na-script削除」
- スキルを改善・カスタマイズしたい時 → practical-guide.md の「スキルの継続的改善」
- 人間による最終確認が必要な時 → practical-guide.md の「目視確認チェックリスト」
対話例:承認制ワークフローの実践
シナリオ1: 「未使用機能を整理したい」→ 7ステップワークフロー
ユーザー: 「未使用機能を整理したい」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 1: 候補発見(自動)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: audit-unused.mjs を実行
→ 候補3件を発見
- feature-a: 空ディレクトリ
- feature-b: Sidebarなし、参照あり
- feature-c: 設定のみ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 2: 詳細調査(自動)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: 各候補を詳細調査
- feature-a: 参照0件、DBなし → 🔴 即座削除可能
- feature-b: 参照5件(うち4件はコメントアウト)、DBあり(履歴15件)
- feature-c: 参照1件(設定ファイルのみ)、未使用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 3: 影響分析(自動)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: 影響を分析
- feature-b: 履歴15件失う、型定義を他と共有(修正必要)
- feature-c: 影響なし(設定のみ)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 4: 解説ドキュメント作成(自動)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: レポート作成完了
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 5: ユーザー提示・承認(承認ポイント①)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント:
「調査完了しました。削除候補レポートです:
🔴 【即座削除可能】
- feature-a: 空ディレクトリ(リスクなし)
- feature-c: 設定のみ(リスクなし)
🟡 【要確認】
- feature-b: 履歴15件あり
→ 完全削除: 履歴が失われます
→ 無効化: 履歴は保持、新規使用のみ不可
🎯 推奨アクション:
A) 🔴を削除、🟡を無効化
B) 🔴のみ削除
C) 個別に確認
D) 保留
どうしますか?」
ユーザー: 「Bで。feature-bはまた今度考える」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 6: 削除実行(承認後)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント:
「承認ありがとうございます。DRY RUNで最終確認します...」
→ DRY RUN実行
→ 「以下を削除します:
- app/(authenticated)/feature-a/(空ディレクトリ)
- lib/settings/feature-c.ts(設定ファイル)
実行しますか?」
ユーザー: 「はい」
エージェント: 削除実行 → 検証
→ 「✅ 削除完了しました」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 7: 完了記録(承認ポイント②)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント:
「完了レポートです:
- feature-a: ✅ 削除完了
- feature-c: ✅ 削除完了
- 型チェック: 通過
- Lint: 通過
コミットしますか?
git add . && git commit -m "cleanup: remove feature-a, feature-c"
」
ユーザー: 「OK」
エージェント: コミット完了
シナリオ2: 「na-script削除して」→ 詳細調査の重要性
ユーザー: 「na-script削除して」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 1-4: 調査・解説作成(自動)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント:
- ls -la app/(authenticated)/na-script/
→ 空のディレクトリを確認
→ grep -rn "na-script" app/ lib/
→ 参照なしを確認
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 5: ユーザー提示・承認(承認ポイント)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント:
「na-script を調査しました:
📍 状況:
- 空のディレクトリ: app/(authenticated)/na-script/
- コード参照: 0件
- DB関連: なし
⚠️ リスク: なし
🗑️ 即座に削除可能です。実行しますか?」
ユーザー: 「お願い」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 6-7: 実行・検証・記録
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: 削除 → 検証 → コミット承認 → 完了
シナリオ3: 「transcript機能削除したい」→ 誤検出防止
ユーザー: 「transcript機能削除したい」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 1-3: 調査(自動)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: audit-unused.mjs
→ 「⚠️ 非表示だが使用中: transcript」「参照: 15件」
エージェント: (違和感)「15件も参照がある...」
→ grep -rn "transcript" lib/ --include="*.ts"
→ 「あ、これは TRANSCRIPT プロンプトキー」
→ 「minutes 機能で使用されている!」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 4: 解説ドキュメント作成(自動)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント: 重要な発見を記録
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 5: ユーザー提示・承認(承認ポイント)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
エージェント:
「⚠️ 重要な発見があります:
調査した結果、transcript(TRANSCRIPT)は
議事録作成機能で使用されているプロンプトです。
🔴 削除の影響:
- 議事録作成機能が動作しなくなります
- 過去の議事録履歴が参照できなくなります
💡 選択肢:
A) 完全削除(議事録作成も削除)
B) 削除しない(推奨)
C) 議事録作成からTRANSCRIPT参照を削除してから実施
※ 推奨は B) です。議事録作成機能は現在使用中です。」
ユーザー: 「Bで。気づいてよかった」
エージェント: 「保留として記録します。調査結果は
docs/backlog/ に保存しておきます。」
スキルの継続的改善
このスキルを使用する際、以下の改善機会があれば即座に更新してください:
- 「この手順がない」 → SKILL.md に追加
- 「このスクリプトがほしい」 → scripts/ に作成
- 「説明がわかりにくい」 → SKILL.md を書き換え
- 「エラーが出た」 → トラブルシューティング追加
- 「もっと効率的な方法がある」 → ベストプラクティス更新
- 「スクリプトに頼りすぎた」 → エージェンティック対応の例を追加
改善例:
使用中: 「audit-unused.mjs が [xxx] を検出できていない」
↓
即座に修正: スクリプトに [xxx] の検出ロジックを追加
↓
コミット: git commit -m "refactor(skill): improve audit-unused - add [xxx] detection"
v3.0 改善の記録(承認制ワークフロー)
| 改善項目 | 内容 | 日付 |
|---|---|---|
| 承認制ワークフロー導入 | 7ステップの明確なワークフロー化 | 2026-03-05 |
| 候補一覧作成の徹底化 | Step 1-4を自動調査、Step 5で承認 | 2026-03-05 |
| 詳細調査テンプレート | 調査結果の記録フォーマットを標準化 | 2026-03-05 |
| リスク解説ドキュメント | ユーザー向け解説レポートのテンプレート化 | 2026-03-05 |
| 承認ポイントの明確化 | どこで承認を得るかを明確に定義 | 2026-03-05 |
| 対話例の更新 | 新ワークフローに合わせた対話例を追加 | 2026-03-05 |
v2.0 改善の記録
| 改善項目 | 内容 | 日付 |
|---|---|---|
| エージェンティック対応強化 | SKILL.md に原則・対話例を追加 | 2026-02-27 |
| 誤検出防止 | verify.mjs の検索に単語境界を導入 | 2026-02-27 |
| 空ディレクトリ検出 | audit-unused.mjs に自動検出機能を追加 | 2026-02-27 |
| DB削除スクリプト自動生成 | --generate-delete オプションを追加 | 2026-02-27 |
| 対話的削除モード | --interactive モードを追加 | 2026-02-27 |
| 削除履歴自動記録 | verify.mjs --record を追加 | 2026-02-27 |
| 統合削除スクリプト | delete-feature.mjs を新規作成 | 2026-02-27 |