tech-debt-audit について
tech-debt-auditは、oh-my-openagent向けのモデル非依存スキルです。根拠に基づく技術的負債のレビューを導き、引用付きのTECH_DEBT_AUDIT.mdを作成します。
主な機能
- 019領域の監査手順
- 02リポジトリ概要とホットスポット確認
- 03ファイルと行番号付きの指摘
- 04優先度付き提案とクイックウィン
- 05並列サブエージェントの指針
活用シーン
- 01保守作業前のリポジトリレビュー
- 02変更頻度の高い大規模コードの特定
- 03技術的負債の修正順序の策定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ code-yeongyu/ oh-my-openagent --skill tech-debt-auditインストール後、Claude Code で/tech-debt-auditを入力して読み込まれたか確認します。
詳細
技術的負債の監査プロトコル
oh-my-openagent(OMO)向けの、モデルに依存しない技術的負債の監査です。OMO に組み込まれたツール(grep、glob、bash と sg、read、lsp_diagnostics、task)を使用します。根拠を示し、引用可能な TECH_DEBT_AUDIT.md 成果物を作成します。
出力
リポジトリのルートにある TECH_DEBT_AUDIT.md に、次の結果を書き出します。
- エグゼクティブサマリー — 全体的な健全性、最も深刻な項目、すぐに対応できる改善項目の数を3〜5文で記述します
- メンタルモデル — リポジトリのアーキテクチャを1段落で記述します(何をするのか、技術スタック、モジュールの境界)
- 指摘事項の表 — 列:ID、カテゴリ、ファイル:行、重大度(Critical/High/Medium/Low)、工数(時間)、説明、推奨事項
- 優先度トップ5 — 影響度と工数の比率で順位付けします
- すぐにできる改善のチェックリスト — それぞれ30分未満で対応できる項目
- 「問題に見えるが問題ではないもの」 — 技術的負債のように見えるものの、意図的に採用されているパターン
- 未解決の質問 — メンテナーに確認してもらう事項
フェーズ0:状況を把握する
標準(常に実行)
glob("**/*.ts")/glob("**/*.py")/ など — 言語スタックを把握しますglob("**/package.json")+read()— 依存関係とビルドツールを確認しますbash("git log --oneline -200")— 変更頻度を調べ、変更の多いファイルを特定しますglob("**/*")+ 基本的な計算 — 最大のファイルを特定します(300 LOC 超は候補です)- 変更頻度が高く、かつサイズの大きいファイルを照合し、負債が集中する領域を特定します
- 作業コンテキスト内で、メンタルモデルの段落を作成します
フェーズ1:9つの観点で監査する
各観点で OMO ツールを使用します。各観点の中では、ツール呼び出しを並行して実行します。すべての指摘事項に file:line:col を必ず記載してください。
1. アーキテクチャの劣化
標準(常に実行)
bash("sg -p \"import { $$$ } from '$SRC'\" -l ts .")— モジュールグラフを把握し、循環しているパターンを確認しますbash("sg -p \"class $NAME { $$$ }\" -l ts .")— 巨大クラスがないか確認しますgrep("TODO|FIXME|HACK|XXX|WORKAROUND|TEMP")— タグ付きの負債マーカーを検索します- 同期処理に見えるファイルで
grep("async|await")を実行します — 不適切な非同期処理の境界を探します - フェーズ0で見つかった各大規模ファイルに対して
bash("wc -l <file>")を実行します
指摘対象
- 500 LOC 超のファイル(巨大ファイル)
- 80 LOC 超の関数、またはネストが4階層を超える関数
- 15個を超えるメソッド、または400 LOCを超えるクラス
- インポートの循環(A → B → A)
- デッドエクスポート:関数/クラスが定義されているものの、ほかの場所から一度もインポートされていないもの(
lsp_find_referencesで確認します) - コメントアウトされたコードブロック(3行を超えて連続するもの)
2. 一貫性の劣化
標準(常に実行)
bash("sg -p \"import $CLIENT from '$PKG'\" -l ts .")— 複数の HTTP クライアントがないか確認しますgrep("console.log|console.error|console.warn")— ロガーではなくコンソールを直接使用していないか確認しますbash("sg -p \"try { $$$ } catch ($$$) { $$$ }\" -l ts .")— エラー処理のパターンを確認しますgrep("as any|@ts-ignore|@ts-expect-error|as unknown")— 型の回避を検索しますgrep("eslint-disable|prettier-ignore")— リント抑制を検索します
指摘対象
- 同じ処理の方法が3種類以上ある(HTTP、ロギング、バリデーション、設定)
- 命名規則の混在(camelCase、snake_case、PascalCase)
- 日付/時刻処理ライブラリの複数使用
- モジュール間でのエラーレスポンス形式の混在
3. 型と契約の負債
標準(常に実行)
bash("sg -p \"$VALUE as any\" -l ts .")— 実行時の型回避を検索しますgrep("@ts-expect-error")— 抑制されたエラーを検索しますgrep("@ts-ignore")— 抑制されたエラー(レガシー)を検索しますbash("sg -p \"$NAME: any\" -l ts .")—anyとして型付けされた箇所を検索しますlsp_diagnostics(filePath="<src-dir>")— 現在の型エラーを確認します
指摘対象
- 公開 API およびエクスポートされたインターフェースでの
any型 - 型指定のない関数パラメーター
- API/IO 境界でのスキーマ検証の欠如
- ファイルごとにまとめた LSP の型エラー
4. テストの負債
標準(常に実行)
glob("**/*.test.ts")— すべてのテストファイルを検索しますbash("bun test 2>&1 | grep -E '(fail|skip|todo)'")— 現在のテストの健全性を確認します- フェーズ0で変更頻度が高いファイルと、テストの有無を照合します
指摘対象
- 重要な処理経路にある、テストが一切ないファイル
- スキップされたテスト(
test.skip、describe.skip) - 動作ではなく実装の詳細を検証しているテスト
- 遅いテスト(各テストに1秒超)
5. 依存関係と設定の負債
標準(必ず実行)
bash("npm audit --omit=dev 2>&1 | head -40")— 既知の CVE(node_modules が存在する場合)read("package.json")— 依存関係の数と古い依存関係を確認しますgrep(".env|process.env|Bun.env")— 環境変数の使用状況- 設定ファイル以外で
grep("API_KEY|SECRET|PASSWORD|TOKEN")— ハードコードされた設定
指摘対象
- メジャーバージョンが古い依存関係
- 同じ機能を持つ依存関係(ライブラリの重複)
- README に記載されていない、参照されている環境変数
- 環境固有の値のハードコード
6. パフォーマンスとリソース管理
標準(必ず実行)
bash("sg -p \"for ($$$ of $$$) { $$$ await $$$ }\" -l ts .")— ループ内の非同期処理grep("await.*map|await.*filter|await.*forEach")— 順次実行される非同期イテレーションgrep("Promise\\.all|Promise\\.allSettled")— 既存の並列処理パターン(良い兆候)- 近くに
removeEventListener|off\\(|unsubscribeがない状態でのgrep("addEventListener|on\\(|subscribe")— リスナーの適切な管理
指摘対象
for/ofループ内のawait(並列実行が可能なのに順次実行)- N+1 クエリのパターン
- イベントリスナー、インターバル、ハンドルのクリーンアップ漏れ
- 不要なシリアライズ/デシリアライズ
7. エラー処理と可観測性
標準(必ず実行)
bash("sg -p \"catch ($$$) { $$$ }\" -l ts .")— catch ブロックgrep("catch.*{}|catch.*{\\s*}")— 空の catch ブロックgrep("console.error|logger\\.error|log\\.error")— 実際のエラーログ出力bash("sg -p \"throw new $ERR($$$)\" -l ts .")— 使用されているエラー型
指摘対象
- 空の catch ブロック(最も重大な問題)
- リカバリー処理のない汎用的な
catch (e) { console.error(e) } - モジュール間で一貫性のないエラー形式
- 重要な処理経路での構造化ログの不足
- Promise チェーン内で握りつぶされるエラー(
.catch(() => {}))
8. セキュリティ管理
標準(必ず実行)
- 設定ファイルや環境変数ファイルを除くソースファイルで
grep("api[Kk]ey|api_secret|password|secret|token|credential") grep("SELECT .* FROM|INSERT INTO|UPDATE.*SET|DELETE FROM")— SQL の構築grep("innerHTML|dangerouslySetInnerHTML")— XSS の脆弱性につながる箇所grep("eval\\(|Function\\(|setTimeout\\(.*string|setInterval\\(.*string")— コードインジェクション
指摘対象
- ソースコード内にハードコードされたシークレット
- 文字列連結による SQL の構築
innerHTML/dangerouslySetInnerHTMLの使用eval()または文字列を使用したsetTimeout/setInterval- 許容範囲が広すぎる CORS または認証ミドルウェア
9. ドキュメントとの乖離
標準(必ず実行)
read("README.md")— 記載内容が実際の仕様と一致しているか確認しますgrep("@param|@returns|@throws")— docstring の記述状況grep("FIXME|TODO|HACK|XXX|WORKAROUND")— 修正メモの密度- README の API 使用例と実際のシグネチャを比較します
指摘対象
- README に実装されていない機能が記載されている
- 公開関数にドキュメントコメントがない
- コードと矛盾するコメント
- 存在する場合、古くなったアーキテクチャ決定記録(ADR)
フェーズ 2:詳細調査(並列サブエージェント)
大規模なコードベース(>50k LOC)では、負荷の高い調査項目を並列サブエージェントに委任します。各サブエージェントは担当項目について標準のツール実行を行います。
task(category="unspecified-low", run_in_background=true, load_skills=[], prompt="[CONTEXT] Tech debt audit. [GOAL] Audit dimensions 1 (Architecture) and 2 (Consistency). [REQUEST] Run ast_grep and grep searches for dimensions 1-2 from the tech-debt-audit skill. Report every finding with file:line:col. Tag severity: Critical/High/Medium/Low.")
task(category="unspecified-low", run_in_background=true, load_skills=[], prompt="[CONTEXT] Tech debt audit. [GOAL] Audit dimensions 3 (Type debt) and 7 (Error handling). [REQUEST] Run searches for dimensions 3 and 7 from the tech-debt-audit skill. Report every finding with file:line:col. Tag severity.")
負荷の高い項目を担当するサブエージェントを 2~3 個起動し、結果を並列で集めてから統合します。
フェーズ 3:統合と報告
- 直接のツール呼び出しとサブエージェントの結果から、すべての調査結果を集めます
- 重複を除きます(複数の調査項目で指摘された同じ問題)
- 重大度を分類します:
- Critical — 不正な動作、データ損失、またはセキュリティ脆弱性を引き起こす
- High — 本番環境で問題を引き起こす、または保守を妨げる
- Medium — 保守性を低下させる、または規約に違反する
- Low — 表面的な問題。該当箇所を変更する際に修正すべき
- 各指摘事項の作業時間を保守的に見積もります
- 必要なセクションをすべて含む
TECH_DEBT_AUDIT.mdを作成します - ユーザーに概要を報告します
重大度の基準
Critical = actively causing bugs or security holes
High = will cause problems under normal operation; blocks changes
Medium = reduces maintainability; inconsistent; violates team conventions
Low = cosmetic; would be nice to fix when nearby
完了前のクイックチェック
- 具体的な指摘すべてに
file:line:colの引用を記載している - 根拠のない一般的な主張がない
- 「問題に見えるが問題ない」セクションで、少なくとも2~3個のパターンを説明している
- 優先度の高い上位5項目を、影響度と作業量で順位付けしている
- クイックウィンは、それぞれ30分未満で修正できる項目になっている
コメント
Markdown 対応