mcpField
C
code-review-ai-ai-review

code-review-ai-ai-review

github.com/sickn33テスト・品質48.7k443 回インストール今日更新
リポジトリ

code-review-ai-ai-review について

静的解析ツールと AI による推論を用いて、セキュリティ、性能、アーキテクチャ、保守性の確認を導くコードレビュー用スキルです。カタログ版には参照スクリプトが含まれていません。

主な機能

  1. 01差分の分類と初期確認
  2. 02複数ツールによる静的解析の指針
  3. 03セキュリティと性能のレビュー
  4. 04重大度付き構造化コメント
  5. 05CI/CD レビュー手順の指針

活用シーン

  1. 01Pull Request のセキュリティ問題の確認
  2. 02性能やアーキテクチャ変更の評価
  3. 03自動コードレビュー手順の計画

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill code-review-ai-ai-review

インストール後、Claude Code で/code-review-ai-ai-reviewを入力して読み込まれたか確認します。

詳細

補足資料の利用可否

このカタログのコピーには以下のインラインガイダンスが含まれていますが、次の補足パスは含まれていません。これらは外部の前提条件であり、同梱ファイルではありません。

  • <support-root>/scripts/ai_review.py

これらのパスに依存する手順を使用する前に、元の補足資料または既存のインストール環境を入手してください。このカタログには、検証済みのダウンロード元は記載されていません。各パスはそのインストール環境を基準に解決し、内容を確認したうえで、該当するライセンスと実行の前提条件を検証してください。必要なファイルが存在することを確認するまでは、コマンドを実行したり、参照された手順を実施したと主張したりしないでください。不足しているスクリプトを捏造したり、同じ名前の無関係なファイルを同等のものとして扱ったりしないでください。ここにすべて記載された独立した手順は、ユーザーが許可した範囲内で実行できます。依存する手順については、利用できないことを報告してください。

AI を活用したコードレビューのスペシャリスト

自動静的解析、インテリジェントなパターン認識、最新の DevOps プラクティスを組み合わせた、AI を活用したコードレビューのエキスパートです。AI ツール(GitHub Copilot、Qodo、GPT-5、Claude 4.5 Sonnet)と、実績のあるプラットフォーム(SonarQube、CodeQL、Semgrep)を活用して、バグ、脆弱性、パフォーマンスの問題を特定します。

このスキルを使用する場面

  • AI を活用したコードレビューのスペシャリストに関するタスクやワークフローに取り組む場合
  • AI を活用したコードレビューのスペシャリストに関するガイダンス、ベストプラクティス、チェックリストが必要な場合

このスキルを使用しない場面

  • タスクが AI を活用したコードレビューのスペシャリストに関係しない場合
  • この範囲外の別の分野やツールが必要な場合

手順

  • 目標、制約、必要な入力を明確にしてください。
  • 関連するベストプラクティスを適用し、結果を検証してください。
  • 実行可能な手順と検証方法を提示してください。

コンテキスト

CI/CD パイプラインと統合した多層コードレビューワークフローにより、アーキテクチャ上の判断には人間による監督を加えながら、プルリクエストに即時のフィードバックを提供します。30 以上の言語を対象とするレビューでは、ルールベースの解析と、AI による文脈理解を組み合わせます。

要件

レビュー対象:$ARGUMENTS

セキュリティ、パフォーマンス、アーキテクチャ、保守性、テスト、AI/ML 固有の懸念事項を包括的に分析してください。行番号の参照、コード例、実行可能な推奨事項を含むレビューコメントを作成してください。

自動コードレビューワークフロー

初期トリアージ
  1. 差分を解析し、変更されたファイルと影響を受けるコンポーネントを特定する
  2. ファイルの種類に応じて最適な静的解析ツールを選ぶ
  3. プルリクエストの規模に応じて解析の深さを調整する(1,000 行を超える場合は簡易、200 行未満の場合は詳細)
  4. 変更の種類を分類する:機能追加、バグ修正、リファクタリング、破壊的変更
複数ツールによる静的解析

並行して実行します:

  • CodeQL:詳細な脆弱性分析(SQL インジェクション、XSS、認証バイパス)
  • SonarQube:コードスメル、複雑性、重複、保守性
  • Semgrep:組織固有のルールとセキュリティポリシー
  • Snyk/Dependabot:サプライチェーンセキュリティ
  • GitGuardian/TruffleHog:シークレットの検出
AI 支援レビュー
# Context-aware review prompt for Claude 4.5 Sonnet
review_prompt = f"""
You are reviewing a pull request for a {language} {project_type} application.

**Change Summary:** {pr_description}
**Modified Code:** {code_diff}
**Static Analysis:** {sonarqube_issues}, {codeql_alerts}
**Architecture:** {system_architecture_summary}

Focus on:
1. Security vulnerabilities missed by static tools
2. Performance implications at scale
3. Edge cases and error handling gaps
4. API contract compatibility
5. Testability and missing coverage
6. Architectural alignment

For each issue:
- Specify file path and line numbers
- Classify severity: CRITICAL/HIGH/MEDIUM/LOW
- Explain problem (1-2 sentences)
- Provide concrete fix example
- Link relevant documentation

Format as JSON array.
"""
モデルの選択(2025 年)
  • 高速レビュー(200 行未満):GPT-4o-mini または Claude 4.5 Haiku
  • 詳細な推論:Claude 4.5 Sonnet または GPT-5(200K 以上のトークン)
  • コード生成:GitHub Copilot または Qodo
  • 複数言語への対応:Qodo または CodeAnt AI(30 以上の言語)
レビューの振り分け
interface ReviewRoutingStrategy {
  async routeReview(pr: PullRequest): Promise<ReviewEngine> {
    const metrics = await this.analyzePRComplexity(pr);

    if (metrics.filesChanged > 50 || metrics.linesChanged > 1000) {
      return new HumanReviewRequired("Too large for automation");
    }

    if (metrics.securitySensitive || metrics.affectsAuth) {
      return new AIEngine("claude-3.7-sonnet", {
        temperature: 0.1,
        maxTokens: 4000,
        systemPrompt: SECURITY_FOCUSED_PROMPT
      });
    }

    if (metrics.testCoverageGap > 20) {
      return new QodoEngine({ mode: "test-generation", coverageTarget: 80 });
    }

    return new AIEngine("gpt-4o", { temperature: 0.3, maxTokens: 2000 });
  }
}

アーキテクチャ分析

アーキテクチャの一貫性
  1. 依存関係の方向:内側のレイヤーは外側のレイヤーに依存しない
  2. SOLID 原則:
    • 単一責任、開放/閉鎖、リスコフの置換
    • インターフェース分離、依存性逆転
  3. アンチパターン:
    • シングルトン(グローバル状態)、ゴッドオブジェクト(500 行超、20 メソッド超)
    • 貧血ドメインモデル、ショットガン手術
マイクロサービスのレビュー
type MicroserviceReviewChecklist struct {
    CheckServiceCohesion       bool  // Single capability per service?
    CheckDataOwnership         bool  // Each service owns database?
    CheckAPIVersioning         bool  // Semantic versioning?
    CheckBackwardCompatibility bool  // Breaking changes flagged?
    CheckCircuitBreakers       bool  // Resilience patterns?
    CheckIdempotency           bool  // Duplicate event handling?
}

func (r *MicroserviceReviewer) AnalyzeServiceBoundaries(code string) []Issue {
    issues := []Issue{}

    if detectsSharedDatabase(code) {
        issues = append(issues, Issue{
            Severity: "HIGH",
            Category: "Architecture",
            Message: "Services sharing database violates bounded context",
            Fix: "Implement database-per-service with eventual consistency",
        })
    }

    if hasBreakingAPIChanges(code) && !hasDeprecationWarnings(code) {
        issues = append(issues, Issue{
            Severity: "CRITICAL",
            Category: "API Design",
            Message: "Breaking change without deprecation period",
            Fix: "Maintain backward compatibility via versioning (v1, v2)",
        })
    }

    return issues
}

セキュリティ脆弱性の検出

多層セキュリティ

SAST レイヤー:CodeQL、Semgrep、Bandit/Brakeman/Gosec

AI による脅威モデリングの強化:

security_analysis_prompt = """
Analyze authentication code for vulnerabilities:
{code_snippet}

Check for:
1. Authentication bypass, broken access control (IDOR)
2. JWT token validation flaws
3. Session fixation/hijacking, timing attacks
4. Missing rate limiting, insecure password storage
5. Credential stuffing protection gaps

Provide: CWE identifier, CVSS score, exploit scenario, remediation code
"""

findings = claude.analyze(security_analysis_prompt, temperature=0.1)

シークレットスキャン:

trufflehog git file://. --json | \
  jq '.[] | select(.Verified == true) | {
    secret_type: .DetectorName,
    file: .SourceMetadata.Data.Filename,
    severity: "CRITICAL"
  }'
OWASP Top 10 (2025)
  1. A01 - アクセス制御の不備:認可の欠如、IDOR
  2. A02 - 暗号化の失敗:脆弱なハッシュ化、安全でない RNG
  3. A03 - インジェクション:汚染解析による SQL、NoSQL、コマンドインジェクション
  4. A04 - 安全でない設計:脅威モデリングの欠如
  5. A05 - セキュリティ設定の不備:デフォルトの認証情報
  6. A06 - 脆弱なコンポーネント:CVE 対策に Snyk/Dependabot を使用
  7. A07 - 認証の失敗:脆弱なセッション管理
  8. A08 - データ整合性の失敗:署名されていない JWT
  9. A09 - ログ記録の失敗:監査ログの欠如
  10. A10 - SSRF:検証されていないユーザー制御の URL

パフォーマンスレビュー

パフォーマンスプロファイリング
class PerformanceReviewAgent {
  async analyzePRPerformance(prNumber) {
    const baseline = await this.loadBaselineMetrics('main');
    const prBranch = await this.runBenchmarks(`pr-${prNumber}`);

    const regressions = this.detectRegressions(baseline, prBranch, {
      cpuThreshold: 10, memoryThreshold: 15, latencyThreshold: 20
    });

    if (regressions.length > 0) {
      await this.postReviewComment(prNumber, {
        severity: 'HIGH',
        title: '⚠️ Performance Regression Detected',
        body: this.formatRegressionReport(regressions),
        suggestions: await this.aiGenerateOptimizations(regressions)
      });
    }
  }
}
スケーラビリティの危険信号
  • N+1 クエリ、インデックスの欠如、同期的な外部呼び出し
  • インメモリ状態、上限のないコレクション、ページネーションの欠如
  • コネクションプーリングなし、レート制限なし
def detect_n_plus_1_queries(code_ast):
    issues = []
    for loop in find_loops(code_ast):
        db_calls = find_database_calls_in_scope(loop.body)
        if len(db_calls) > 0:
            issues.append({
                'severity': 'HIGH',
                'line': loop.line_number,
                'message': f'N+1 query: {len(db_calls)} DB calls in loop',
                'fix': 'Use eager loading (JOIN) or batch loading'
            })
    return issues

レビューコメントの生成

構造化フォーマット
interface ReviewComment {
  path: string; line: number;
  severity: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | 'INFO';
  category: 'Security' | 'Performance' | 'Bug' | 'Maintainability';
  title: string; description: string;
  codeExample?: string; references?: string[];
  autoFixable: boolean; cwe?: string; cvss?: number;
  effort: 'trivial' | 'easy' | 'medium' | 'hard';
}

const comment: ReviewComment = {
  path: "src/auth/login.ts", line: 42,
  severity: "CRITICAL", category: "Security",
  title: "SQL Injection in Login Query",
  description: `String concatenation with user input enables SQL injection.
**Attack Vector:** Input 'admin' OR '1'='1' bypasses authentication.
**Impact:** Complete auth bypass, unauthorized access.`,
  codeExample: `
// ❌ Vulnerable
const query = \`SELECT * FROM users WHERE username = '\${username}'\`;

// ✅ Secure
const query = 'SELECT * FROM users WHERE username = ?';
const result = await db.execute(query, [username]);
  `,
  references: ["https://cwe.mitre.org/data/definitions/89.html"],
  autoFixable: false, cwe: "CWE-89", cvss: 9.8, effort: "easy"
};

CI/CD 統合

GitHub Actions
name: AI Code Review
on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  ai-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Static Analysis
        run: |
          sonar-scanner -Dsonar.pullrequest.key=${{ github.event.number }}
          codeql database create codeql-db --language=javascript,python
          semgrep scan --config=auto --sarif --output=semgrep.sarif

      - name: AI-Enhanced Review (GPT-5)
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        run: |
          python scripts/ai_review.py \
            --pr-number ${{ github.event.number }} \
            --model gpt-4o \
            --static-analysis-results codeql.sarif,semgrep.sarif

      - name: Post Comments
        uses: actions/github-script@v7
        with:
          script: |
            const comments = JSON.parse(fs.readFileSync('review-comments.json'));
            for (const comment of comments) {
              await github.rest.pulls.createReviewComment({
                owner: context.repo.owner,
                repo: context.repo.repo,
                pull_number: context.issue.number,
                body: comment.body, path: comment.path, line: comment.line
              });
            }

      - name: Quality Gate
        run: |
          CRITICAL=$(jq '[.[] | select(.severity == "CRITICAL")] | length' review-comments.json)
          if [ $CRITICAL -gt 0 ]; then
            echo "❌ Found $CRITICAL critical issues"
            exit 1
          fi

完全な例:AI レビューワークフローの自動化

#!/usr/bin/env python3
import os, json, subprocess
from dataclasses import dataclass
from typing import List, Dict, Any
from anthropic import Anthropic

@dataclass
class ReviewIssue:
    file_path: str; line: int; severity: str
    category: str; title: str; description: str
    code_example: str = ""; auto_fixable: bool = False

class CodeReviewOrchestrator:
    def __init__(self, pr_number: int, repo: str):
        self.pr_number = pr_number; self.repo = repo
        self.github_token = os.environ['GITHUB_TOKEN']
        self.anthropic_client = Anthropic(api_key=os.environ['ANTHROPIC_API_KEY'])
        self.issues: List[ReviewIssue] = []

    def run_static_analysis(self) -> Dict[str, Any]:
        results = {}

        # SonarQube
        subprocess.run(['sonar-scanner', f'-Dsonar.projectKey={self.repo}'], check=True)

        # Semgrep
        semgrep_output = subprocess.check_output(['semgrep', 'scan', '--config=auto', '--json'])
        results['semgrep'] = json.loads(semgrep_output)

        return results

    def ai_review(self, diff: str, static_results: Dict) -> List[ReviewIssue]:
        prompt = f"""Review this PR comprehensively.

**Diff:** {diff[:15000]}
**Static Analysis:** {json.dumps(static_results, indent=2)[:5000]}

Focus: Security, Performance, Architecture, Bug risks, Maintainability

Return JSON array:
[{{
  "file_path": "src/auth.py", "line": 42, "severity": "CRITICAL",
  "category": "Security", "title": "Brief summary",
  "description": "Detailed explanation", "code_example": "Fix code"
}}]
"""

        response = self.anthropic_client.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=8000, temperature=0.2,
            messages=[{"role": "user", "content": prompt}]
        )

        content = response.content[0].text
        if '```json' in content:
            content = content.split('```json')[1].split('```')[0]

        return [ReviewIssue(**issue) for issue in json.loads(content.strip())]

    def post_review_comments(self, issues: List[ReviewIssue]):
        summary = "## 🤖 AI Code Review\n\n"
        by_severity = {}
        for issue in issues:
            by_severity.setdefault(issue.severity, []).append(issue)

        for severity in ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW']:
            count = len(by_severity.get(severity, []))
            if count > 0:
                summary += f"- **{severity}**: {count}\n"

        critical_count = len(by_severity.get('CRITICAL', []))
        review_data = {
            'body': summary,
            'event': 'REQUEST_CHANGES' if critical_count > 0 else 'COMMENT',
            'comments': [issue.to_github_comment() for issue in issues]
        }

        # Post to GitHub API
        print(f"✅ Posted review with {len(issues)} comments")

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--pr-number', type=int, required=True)
    parser.add_argument('--repo', required=True)
    args = parser.parse_args()

    reviewer = CodeReviewOrchestrator(args.pr_number, args.repo)
    static_results = reviewer.run_static_analysis()
    diff = reviewer.get_pr_diff()
    ai_issues = reviewer.ai_review(diff, static_results)
    reviewer.post_review_comments(ai_issues)

まとめ

以下を組み合わせた包括的な AI コードレビューです。

  1. 複数のツールによる静的解析(SonarQube、CodeQL、Semgrep)
  2. 最先端の LLM(GPT-5、Claude 4.5 Sonnet)
  3. シームレスな CI/CD 統合(GitHub Actions、GitLab、Azure DevOps)
  4. 言語固有のリンターによる 30 以上の言語のサポート
  5. 重大度と修正例を含む、実行可能なレビューコメント
  6. レビューの有効性を測定する DORA メトリクスの追跡
  7. 低品質なコードを防ぐ品質ゲート
  8. Qodo/CodiumAI によるテストの自動生成

このツールを使うと、コードレビューを手作業から自動化された AI 支援型の品質保証へと変革し、問題を早期に検出して即座にフィードバックを得られます。

制限事項

  • このスキルは、タスクが上記の説明にある範囲と明確に一致する場合にのみ使用してください。
  • 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
  • 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中止して確認を求めてください。

コメント