Repository: AlohaFactory-Dev/loxops
Pull request #8: Add comment filtering and prioritization options to code review assistant
Author: login: am2rican5
Created: 2025-04-07T10:11:24Z | Merged: 2025-04-07T10:18:03Z



Diff:
diff --git a/README.md b/README.md
index dbb01df..a6ef047 100644
--- a/README.md
+++ b/README.md
@@ -68,6 +68,8 @@ jobs:
 - `max-files`: 한 번에 분석할 최대 파일 수
 - `model`: 사용할 Claude 모델
 - `use-repomix`: Repomix를 사용하여 전체 저장소 컨텍스트를 AI에게 제공할지 여부 (기본값: true)
+- `max_comments`: 생성할 최대 코멘트 수 (기본값: 모든 코멘트)
+- `comment_priority`: 코멘트 우선순위 필터링 ('all', 'medium', 'high', 'critical', 기본값: 'medium')
 
 ## 지원하는 프로젝트 유형
 
@@ -86,6 +88,35 @@ jobs:
 
 Repomix 사용을 비활성화하려면 `use-repomix: 'false'`로 설정하세요.
 
+## 코멘트 필터링 및 우선순위화
+
+코드 리뷰 도구가 너무 많은 코멘트를 생성하면 실제 리뷰어가 중요한 문제점을 놓칠 수 있습니다. 이 문제를 해결하기 위해 다음과 같은 기능을 제공합니다:
+
+- **우선순위 기반 필터링**: `comment_priority` 옵션을 통해 코멘트의 중요도에 따라 필터링할 수 있습니다:
+  - `critical`: 가장 중요한(높은 심각도) 코멘트만 표시
+  - `high`: 중간 이상 중요도의 코멘트만 표시
+  - `medium`: 낮은 중요도를 제외한 모든 코멘트 표시 (기본값)
+  - `all`: 모든 코멘트 표시
+
+- **코멘트 수 제한**: `max_comments` 옵션을 사용하여 PR에 표시될 최대 코멘트 수를 제한할 수 있습니다. 설정한 수를 초과하는 코멘트는 우선순위가 낮은 것부터 자동으로 필터링됩니다.
+
+- **우선순위 자동 감지**: 코드 리뷰 도구는 코멘트 내용에서 "심각도: 높음", "priority: high" 등의 표현을 인식하여 자동으로 우선순위를 부여합니다.
+
+- **요약 정보 제공**: 필터링된 코멘트가 있을 경우, 리뷰 요약에 몇 개의 코멘트가 필터링되었는지 정보를 추가합니다.
+
+이러한 필터링 옵션을 사용하면 PR 작성자와 리뷰어 모두 중요한 이슈에 집중할 수 있어 코드 리뷰의 효율성이 향상됩니다.
+
+예시 설정:
+```yaml
+- name: Run Code Review Assistant
+  uses: AlohaFactory-Dev/loxops@v1.0.1
+  with:
+    github-token: ${{ secrets.GITHUB_TOKEN }}
+    claude-api-key: ${{ secrets.CLAUDE_API_KEY }}
+    max_comments: 5
+    comment_priority: 'high'
+```
+
 ## 비용 최적화 팁
 
 Claude API 사용에는 비용이 발생하므로, 다음 최적화를 고려하세요:
diff --git a/action.yml b/action.yml
index 16b6d64..24c6862 100644
--- a/action.yml
+++ b/action.yml
@@ -1,47 +1,54 @@
-name: 'Loxops - AI Code Review Assistant'
-description: 'Automated code reviews using Claude AI with support for various project types'
-author: 'Aloha Factory'
+name: "Loxops - AI Code Review Assistant"
+description: "Automated code reviews using Claude AI with support for various project types"
+author: "Aloha Factory"
 
 inputs:
   github-token:
-    description: 'GitHub token for API authentication'
+    description: "GitHub token for API authentication"
     required: true
   claude-api-key:
-    description: 'Claude API key'
+    description: "Claude API key"
     required: true
   project-type:
-    description: 'Project type (unity, springboot, android, nextjs, or auto)'
+    description: "Project type (unity, springboot, android, nextjs, or auto)"
     required: false
-    default: 'auto'
+    default: "auto"
   file-extensions:
-    description: 'Comma-separated list of file extensions to analyze'
+    description: "Comma-separated list of file extensions to analyze"
     required: false
-    default: '.ts,.js,.tsx,.jsx,.cs,.java,.kt,.xml,.json,.yaml,.yml'
+    default: ".ts,.js,.tsx,.jsx,.cs,.java,.kt,.xml,.json,.yaml,.yml"
   exclude-patterns:
-    description: 'Comma-separated list of glob patterns to exclude'
+    description: "Comma-separated list of glob patterns to exclude"
     required: false
-    default: 'node_modules/**,dist/**,build/**,*.min.js,*.test.*'
+    default: "node_modules/**,dist/**,build/**,*.min.js,*.test.*"
   find-related-files:
-    description: 'Whether to find and analyze related files'
+    description: "Whether to find and analyze related files"
     required: false
-    default: 'true'
+    default: "true"
   max-files:
-    description: 'Maximum number of files to analyze in a single PR'
+    description: "Maximum number of files to analyze in a single PR"
     required: false
-    default: '10'
+    default: "10"
   model:
-    description: 'Claude model to use'
+    description: "Claude model to use"
     required: false
-    default: 'claude-3-5-haiku-20241022'
+    default: "claude-3-5-haiku-20241022"
   use-repomix:
-    description: 'Whether to use Repomix to pack repository for comprehensive review'
+    description: "Whether to use Repomix to pack repository for comprehensive review"
     required: false
-    default: 'true'
+    default: "true"
+  max-comments:
+    description: "Maximum number of comments to include in the review (default: all)"
+    required: false
+  comment-priority:
+    description: "Filter comments by priority (all, medium, high, critical)"
+    required: false
+    default: "medium"
 
 runs:
-  using: 'node20'
-  main: 'dist/index.js'
+  using: "node20"
+  main: "dist/index.js"
 
 branding:
-  icon: 'code'
-  color: 'purple'
\ No newline at end of file
+  icon: "code"
+  color: "purple"
diff --git a/dist/index.js b/dist/index.js
index 13d839f..4381c50 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -41071,6 +41071,10 @@ async function run() {
         const maxFiles = Number.parseInt(core.getInput("max-files"), 10);
         const model = core.getInput("model");
         const useRepomix = core.getInput("use-repomix") === "true";
+        const maxComments = core.getInput("max-comments")
+            ? Number.parseInt(core.getInput("max-comments"))
+            : undefined;
+        const commentPriority = core.getInput("comment-priority");
         // Initialize options
         const options = {
             projectType,
@@ -41080,6 +41084,8 @@ async function run() {
             maxFiles,
             model,
             useRepomix,
+            maxComments,
+            commentPriority: commentPriority || "medium",
         };
         // Initialize services
         const fileAnalyzerService = new file_analyzer_1.FileAnalyzerService(githubToken, options);
@@ -41196,63 +41202,63 @@ class ClaudeService {
         return systemPrompt;
     }
     getResponseFormatInstructions() {
-        // Keep this the same as in your original code
-        return `\n\n# Response Format
-Please provide your review in a structured JSON format that MUST ONLY include these exact fields:
-1. "summary" - A string with overall feedback
-2. "comments" - An array of comment objects
+        return `\n\n# Response Format Instructions
 
-Your ENTIRE response must be valid JSON enclosed in a markdown code block. Do not include any text, explanations, or comments outside the JSON code block.
+You must respond with ONLY a JSON object inside a code block. No other text allowed.
 
-The JSON MUST follow this exact structure:
+\`\`\`json
 {
-  "summary": string,
+  "summary": "Brief overall assessment",
   "comments": [
     {
-      "path": string,
-      "line": number,
-      "body": string
-    },
-    ...
+      "path": "file/path.ext",
+      "line": 42,
+      "priority": "critical|high|medium|low",
+      "body": "Comment with markdown formatting"
+    }
   ]
 }
+\`\`\`
 
-DO NOT add any extra fields to this structure. Fields like "overview", "keyChanges", "recommendedImprovements", "potentialRisks", or any other fields not explicitly listed above are NOT allowed and will cause parsing errors.
-
-Format both the "summary" and comment "body" fields as markdown text. This allows you to include:
-- Code blocks with syntax highlighting
-- Bullet points and numbered lists
-- Bold/italic text for emphasis
-- Links to documentation when relevant
+## Key Requirements
 
-IMPORTANT: When including code snippets or special characters in your response, ensure they are properly escaped for JSON. Double quotes must be escaped with a backslash (\\"), newlines with \\n, tabs with \\t, and backslashes themselves with a double backslash (\\\\).
+1. **Structure:** Include only "summary" and "comments" fields
+2. **Focus:** Address only 3-5 most important issues
+3. **Priority:** Label each comment as "critical", "high", "medium", or "low"
+4. **Comments:** Format your comment bodies with markdown:
+   - Use code blocks with syntax highlighting
+   - Use bullet points and formatting
+   - Do NOT include priority text in comments (use the priority field)
 
-IMPORTANT: When using code blocks with backticks in your response, each backtick should be properly escaped as \\\` in the JSON. For triple backticks that start/end code blocks, use \\\`\\\`\\\` in the JSON.
+## Formatting Guidelines
 
-When writing Korean or other non-Latin characters, make sure they are properly encoded in UTF-8. Do not add extra escape sequences for non-Latin characters.
+- Properly escape JSON characters: \\" for quotes, \\n for newlines, \\\` for backticks
+- For code blocks use triple backticks with language: \\\`\\\`\\\`language
+- Use UTF-8 for Korean or other non-Latin characters without extra escaping
 
-The newlines in markdown should be properly escaped in the JSON as "\\n".
+## Example
 
-Example format:
 \`\`\`json
 {
-  "summary": "전반적으로 코드는 잘 구성되어 있지만, 몇 가지 개선할 영역이 있습니다:\\n\\n- 일부 함수명이 더 명확할 수 있음\\n- 오류 처리가 향상될 수 있음\\n- 더 많은 단위 테스트를 고려해보세요",
+  "summary": "코드는 잘 작성되었지만 몇 가지 중요한 이슈가 있습니다:\\n\\n- 일부 함수명이 명확하지 않음\\n- 오류 처리 개선 필요\\n- 성능 이슈",
   "comments": [
     {
-      "path": "src/utils/parser.ts",
+      "path": "src/utils.ts",
       "line": 42,
-      "body": "이 함수 이름이 설명적이지 않습니다. 무엇을 하는지 더 명확하게 설명하도록 이름을 변경하는 것을 고려하세요.\\n\\n예시:\\n\\n\\\`\\\`\\\`typescript\\n// 대신\\nfunction process(data) {\\n  // ...\\n}\\n\\n// 다음과 같이 고려\\nfunction validateUserInput(data) {\\n  // ...\\n}\\n\\\`\\\`\\\`"
+      "priority": "high",
+      "body": "함수 이름을 더 명확하게 변경하세요:\\n\\n\\\`\\\`\\\`typescript\\n// Before\\nfunction process(data) { ... }\\n\\n// After\\nfunction validateUserInput(data) { ... }\\n\\\`\\\`\\\`"
     },
     {
-      "path": "src/models/user.ts",
+      "path": "src/models.ts",
       "line": 57,
-      "body": "오류 처리를 개선할 수 있습니다. try/catch 블록을 사용하고 더 구체적인 오류 메시지를 제공하는 것을 고려하세요."
+      "priority": "critical",
+      "body": "예외 처리가 부족합니다. try/catch를 추가하세요."
     }
   ]
 }
 \`\`\`
 
-Please ensure your JSON is valid and properly formatted. Make sure to escape any special characters in the JSON to prevent parsing errors.`;
+Ensure your output is valid JSON and follows this exact structure.`;
     }
     async callClaudeApi(systemPrompt) {
         core.debug(`Using model: ${this.options.model}`);
@@ -41276,7 +41282,8 @@ Please ensure your JSON is valid and properly formatted. Make sure to escape any
     async parseClaudeResponse(responseText) {
         const jsonString = this.extractJsonFromResponse(responseText);
         try {
-            return this.parseReviewJson(jsonString);
+            const review = this.parseReviewJson(jsonString);
+            return this.filterReviewComments(review);
         }
         catch (firstError) {
             core.warning(`First JSON parsing attempt failed: ${firstError instanceof Error ? firstError.message : String(firstError)}`);
@@ -41345,6 +41352,7 @@ Please ensure your JSON is valid and properly formatted. Make sure to escape any
         return {
             path: comment.path,
             line: comment.line,
+            priority: comment.priority,
             body: body,
         };
     }
@@ -41518,6 +41526,72 @@ Please ensure your JSON is valid and properly formatted. Make sure to escape any
             };
         }
     }
+    /**
+     * Filter and prioritize comments based on user preferences
+     */
+    filterReviewComments(review) {
+        if (!review.comments || review.comments.length === 0) {
+            return review;
+        }
+        // Sort comments by priority/severity
+        const sortedComments = [...review.comments].sort((a, b) => {
+            return this.getCommentPriority(b) - this.getCommentPriority(a);
+        });
+        // Filter by priority level if specified
+        let filteredComments = sortedComments;
+        if (this.options.commentPriority) {
+            const minPriority = this.getMinPriorityLevel(this.options.commentPriority);
+            filteredComments = sortedComments.filter((comment) => this.getCommentPriority(comment) >= minPriority);
+        }
+        // Limit number of comments if specified
+        if (this.options.maxComments && this.options.maxComments > 0) {
+            filteredComments = filteredComments.slice(0, this.options.maxComments);
+        }
+        // Update summary to reflect filtering if needed
+        let summary = review.summary;
+        if (filteredComments.length < review.comments.length) {
+            const removedCount = review.comments.length - filteredComments.length;
+            summary = `${summary}\n\n_참고: ${review.comments.length}개 중 ${filteredComments.length}개의 주요 코멘트만 표시되었습니다. ${removedCount}개의 낮은 우선순위 코멘트는 필터링되었습니다._`;
+        }
+        return {
+            summary,
+            comments: filteredComments,
+        };
+    }
+    /**
+     * Extract priority level from comment (critical = 3, high = 2, medium = 1, low = 0)
+     */
+    getCommentPriority(comment) {
+        // Use the explicit priority field if available
+        if (comment.priority) {
+            switch (comment.priority) {
+                case "critical":
+                    return 3;
+                case "high":
+                    return 2;
+                case "medium":
+                    return 1;
+                case "low":
+                    return 0;
+            }
+        }
+        return 0;
+    }
+    /**
+     * Get minimum priority level based on user preference
+     */
+    getMinPriorityLevel(priority) {
+        switch (priority) {
+            case "critical":
+                return 3;
+            case "high":
+                return 2;
+            case "medium":
+                return 1;
+            default:
+                return 0;
+        }
+    }
     handleGenerationError(error) {
         if (error instanceof Error) {
             core.error(`Error during Claude review generation: ${error.message}`);
diff --git a/src/index.ts b/src/index.ts
index 6e89127..1c32185 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -16,6 +16,15 @@ async function run(): Promise<void> {
 		const maxFiles = Number.parseInt(core.getInput("max-files"), 10);
 		const model = core.getInput("model");
 		const useRepomix = core.getInput("use-repomix") === "true";
+		const maxComments = core.getInput("max-comments")
+			? Number.parseInt(core.getInput("max-comments"))
+			: undefined;
+		const commentPriority = core.getInput("comment-priority") as
+			| "all"
+			| "medium"
+			| "high"
+			| "critical"
+			| undefined;
 
 		// Initialize options
 		const options: ReviewOptions = {
@@ -26,6 +35,8 @@ async function run(): Promise<void> {
 			maxFiles,
 			model,
 			useRepomix,
+			maxComments,
+			commentPriority: commentPriority || "medium",
 		};
 
 		// Initialize services
diff --git a/src/services/claude.ts b/src/services/claude.ts
index eb19195..c0322f4 100644
--- a/src/services/claude.ts
+++ b/src/services/claude.ts
@@ -62,63 +62,63 @@ export class ClaudeService {
 	}
 
 	protected getResponseFormatInstructions(): string {
-		// Keep this the same as in your original code
-		return `\n\n# Response Format
-Please provide your review in a structured JSON format that MUST ONLY include these exact fields:
-1. "summary" - A string with overall feedback
-2. "comments" - An array of comment objects
+		return `\n\n# Response Format Instructions
 
-Your ENTIRE response must be valid JSON enclosed in a markdown code block. Do not include any text, explanations, or comments outside the JSON code block.
+You must respond with ONLY a JSON object inside a code block. No other text allowed.
 
-The JSON MUST follow this exact structure:
+\`\`\`json
 {
-  "summary": string,
+  "summary": "Brief overall assessment",
   "comments": [
     {
-      "path": string,
-      "line": number,
-      "body": string
-    },
-    ...
+      "path": "file/path.ext",
+      "line": 42,
+      "priority": "critical|high|medium|low",
+      "body": "Comment with markdown formatting"
+    }
   ]
 }
+\`\`\`
 
-DO NOT add any extra fields to this structure. Fields like "overview", "keyChanges", "recommendedImprovements", "potentialRisks", or any other fields not explicitly listed above are NOT allowed and will cause parsing errors.
-
-Format both the "summary" and comment "body" fields as markdown text. This allows you to include:
-- Code blocks with syntax highlighting
-- Bullet points and numbered lists
-- Bold/italic text for emphasis
-- Links to documentation when relevant
+## Key Requirements
 
-IMPORTANT: When including code snippets or special characters in your response, ensure they are properly escaped for JSON. Double quotes must be escaped with a backslash (\\"), newlines with \\n, tabs with \\t, and backslashes themselves with a double backslash (\\\\).
+1. **Structure:** Include only "summary" and "comments" fields
+2. **Focus:** Address only 3-5 most important issues
+3. **Priority:** Label each comment as "critical", "high", "medium", or "low"
+4. **Comments:** Format your comment bodies with markdown:
+   - Use code blocks with syntax highlighting
+   - Use bullet points and formatting
+   - Do NOT include priority text in comments (use the priority field)
 
-IMPORTANT: When using code blocks with backticks in your response, each backtick should be properly escaped as \\\` in the JSON. For triple backticks that start/end code blocks, use \\\`\\\`\\\` in the JSON.
+## Formatting Guidelines
 
-When writing Korean or other non-Latin characters, make sure they are properly encoded in UTF-8. Do not add extra escape sequences for non-Latin characters.
+- Properly escape JSON characters: \\" for quotes, \\n for newlines, \\\` for backticks
+- For code blocks use triple backticks with language: \\\`\\\`\\\`language
+- Use UTF-8 for Korean or other non-Latin characters without extra escaping
 
-The newlines in markdown should be properly escaped in the JSON as "\\n".
+## Example
 
-Example format:
 \`\`\`json
 {
-  "summary": "전반적으로 코드는 잘 구성되어 있지만, 몇 가지 개선할 영역이 있습니다:\\n\\n- 일부 함수명이 더 명확할 수 있음\\n- 오류 처리가 향상될 수 있음\\n- 더 많은 단위 테스트를 고려해보세요",
+  "summary": "코드는 잘 작성되었지만 몇 가지 중요한 이슈가 있습니다:\\n\\n- 일부 함수명이 명확하지 않음\\n- 오류 처리 개선 필요\\n- 성능 이슈",
   "comments": [
     {
-      "path": "src/utils/parser.ts",
+      "path": "src/utils.ts",
       "line": 42,
-      "body": "이 함수 이름이 설명적이지 않습니다. 무엇을 하는지 더 명확하게 설명하도록 이름을 변경하는 것을 고려하세요.\\n\\n예시:\\n\\n\\\`\\\`\\\`typescript\\n// 대신\\nfunction process(data) {\\n  // ...\\n}\\n\\n// 다음과 같이 고려\\nfunction validateUserInput(data) {\\n  // ...\\n}\\n\\\`\\\`\\\`"
+      "priority": "high",
+      "body": "함수 이름을 더 명확하게 변경하세요:\\n\\n\\\`\\\`\\\`typescript\\n// Before\\nfunction process(data) { ... }\\n\\n// After\\nfunction validateUserInput(data) { ... }\\n\\\`\\\`\\\`"
     },
     {
-      "path": "src/models/user.ts",
+      "path": "src/models.ts",
       "line": 57,
-      "body": "오류 처리를 개선할 수 있습니다. try/catch 블록을 사용하고 더 구체적인 오류 메시지를 제공하는 것을 고려하세요."
+      "priority": "critical",
+      "body": "예외 처리가 부족합니다. try/catch를 추가하세요."
     }
   ]
 }
 \`\`\`
 
-Please ensure your JSON is valid and properly formatted. Make sure to escape any special characters in the JSON to prevent parsing errors.`;
+Ensure your output is valid JSON and follows this exact structure.`;
 	}
 
 	protected async callClaudeApi(systemPrompt: string): Promise<string> {
@@ -149,7 +149,8 @@ Please ensure your JSON is valid and properly formatted. Make sure to escape any
 	): Promise<StructuredReview> {
 		const jsonString = this.extractJsonFromResponse(responseText);
 		try {
-			return this.parseReviewJson(jsonString);
+			const review = this.parseReviewJson(jsonString);
+			return this.filterReviewComments(review);
 		} catch (firstError) {
 			core.warning(
 				`First JSON parsing attempt failed: ${firstError instanceof Error ? firstError.message : String(firstError)}`,
@@ -243,6 +244,7 @@ Please ensure your JSON is valid and properly formatted. Make sure to escape any
 		return {
 			path: comment.path,
 			line: comment.line,
+			priority: comment.priority,
 			body: body,
 		};
 	}
@@ -467,6 +469,87 @@ Please ensure your JSON is valid and properly formatted. Make sure to escape any
 		}
 	}
 
+	/**
+	 * Filter and prioritize comments based on user preferences
+	 */
+	protected filterReviewComments(review: StructuredReview): StructuredReview {
+		if (!review.comments || review.comments.length === 0) {
+			return review;
+		}
+
+		// Sort comments by priority/severity
+		const sortedComments = [...review.comments].sort((a, b) => {
+			return this.getCommentPriority(b) - this.getCommentPriority(a);
+		});
+
+		// Filter by priority level if specified
+		let filteredComments = sortedComments;
+		if (this.options.commentPriority) {
+			const minPriority = this.getMinPriorityLevel(
+				this.options.commentPriority,
+			);
+			filteredComments = sortedComments.filter(
+				(comment) => this.getCommentPriority(comment) >= minPriority,
+			);
+		}
+
+		// Limit number of comments if specified
+		if (this.options.maxComments && this.options.maxComments > 0) {
+			filteredComments = filteredComments.slice(0, this.options.maxComments);
+		}
+
+		// Update summary to reflect filtering if needed
+		let summary = review.summary;
+		if (filteredComments.length < review.comments.length) {
+			const removedCount = review.comments.length - filteredComments.length;
+			summary = `${summary}\n\n_참고: ${review.comments.length}개 중 ${filteredComments.length}개의 주요 코멘트만 표시되었습니다. ${removedCount}개의 낮은 우선순위 코멘트는 필터링되었습니다._`;
+		}
+
+		return {
+			summary,
+			comments: filteredComments,
+		};
+	}
+
+	/**
+	 * Extract priority level from comment (critical = 3, high = 2, medium = 1, low = 0)
+	 */
+	private getCommentPriority(comment: ReviewComment): number {
+		// Use the explicit priority field if available
+		if (comment.priority) {
+			switch (comment.priority) {
+				case "critical":
+					return 3;
+				case "high":
+					return 2;
+				case "medium":
+					return 1;
+				case "low":
+					return 0;
+			}
+		}
+
+		return 0;
+	}
+
+	/**
+	 * Get minimum priority level based on user preference
+	 */
+	private getMinPriorityLevel(
+		priority: "all" | "medium" | "high" | "critical",
+	): number {
+		switch (priority) {
+			case "critical":
+				return 3;
+			case "high":
+				return 2;
+			case "medium":
+				return 1;
+			default:
+				return 0;
+		}
+	}
+
 	protected handleGenerationError(error: unknown): StructuredReview {
 		if (error instanceof Error) {
 			core.error(`Error during Claude review generation: ${error.message}`);
diff --git a/src/types.ts b/src/types.ts
index 456090d..566a7ce 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -27,6 +27,8 @@ export interface ReviewOptions {
 	model: string;
 	useRepomix: boolean;
 	commentStdout?: boolean;
+	maxComments?: number;
+	commentPriority?: "all" | "medium" | "high" | "critical";
 }
 
 export interface UserComment {
@@ -59,6 +61,7 @@ export interface ReviewComment {
 	path: string;
 	line: number;
 	body: string;
+	priority?: "critical" | "high" | "medium" | "low";
 }
 
 export interface StructuredReview {
diff --git a/tests/services/claude.test.ts b/tests/services/claude.test.ts
index 70b2668..25df7ef 100644
--- a/tests/services/claude.test.ts
+++ b/tests/services/claude.test.ts
@@ -1,5 +1,5 @@
 import { ClaudeService } from "../../src/services/claude";
-import type { ProjectType, ReviewOptions } from "../../src/types";
+import type { ReviewOptions } from "../../src/types";
 
 // Mock the core module to avoid actual logging in tests
 jest.mock("@actions/core", () => ({
@@ -235,5 +235,305 @@ describe("ClaudeService", () => {
 			expect(result.comments[0].body).toContain("```typescript");
 			expect(result.comments[0].body).toContain("function example()");
 		});
+
+		test("parses valid JSON response with priority field", async () => {
+			const response = `\`\`\`json
+{
+  "summary": "Good code",
+  "comments": [
+    {
+      "path": "file.ts",
+      "line": 5,
+      "priority": "high",
+      "body": "Consider using a different approach:\\n\\n\\\`\\\`\\\`typescript\\nconst x = 1;\\n\\\`\\\`\\\`"
+    }
+  ]
+}
+\`\`\``;
+
+			const result = await service.parseJsonExposed(response);
+			expect(result.summary).toBe("Good code");
+			expect(result.comments).toHaveLength(1);
+			expect(result.comments[0].priority).toBe("high");
+			expect(result.comments[0].body).toContain("```typescript");
+		});
+	});
+
+	describe("Comment Filtering", () => {
+		test("should limit comments based on maxComments option", async () => {
+			// Create a service with maxComments option
+			const options: ReviewOptions = {
+				model: "claude-3-opus-20240229",
+				projectType: "auto",
+				useRepomix: false,
+				fileExtensions: [".ts", ".js"],
+				excludePatterns: [],
+				findRelatedFiles: false,
+				maxFiles: 10,
+				maxComments: 2,
+			};
+			const limitService = new TestableClaudeService("fake-api-key", options);
+
+			// Create a test response with multiple comments
+			const response = `\`\`\`json
+{
+  "summary": "Test summary",
+  "comments": [
+    {
+      "path": "file1.ts",
+      "line": 10,
+      "body": "Comment 1"
+    },
+    {
+      "path": "file2.ts",
+      "line": 20,
+      "body": "Comment 2"
+    },
+    {
+      "path": "file3.ts",
+      "line": 30,
+      "body": "Comment 3"
+    },
+    {
+      "path": "file4.ts",
+      "line": 40,
+      "body": "Comment 4"
+    }
+  ]
+}
+\`\`\``;
+
+			const result = await limitService.parseJsonExposed(response);
+			
+			// Verify only the first 2 comments were kept
+			expect(result.comments).toHaveLength(2);
+			expect(result.comments[0].path).toBe("file1.ts");
+			expect(result.comments[1].path).toBe("file2.ts");
+			
+			// Verify summary includes a note about filtered comments
+			expect(result.summary).toContain("참고: 4개 중 2개의 주요 코멘트만 표시되었습니다");
+		});
+
+		test("should filter comments based on commentPriority option", async () => {
+			// Create a service with commentPriority option
+			const options: ReviewOptions = {
+				model: "claude-3-opus-20240229",
+				projectType: "auto",
+				useRepomix: false,
+				fileExtensions: [".ts", ".js"],
+				excludePatterns: [],
+				findRelatedFiles: false,
+				maxFiles: 10,
+				commentPriority: "high",
+			};
+			const priorityService = new TestableClaudeService("fake-api-key", options);
+
+			// Create a test response with various priority comments
+			const response = `\`\`\`json
+{
+  "summary": "Test summary",
+  "comments": [
+    {
+      "path": "file1.ts",
+      "line": 10,
+      "priority": "low",
+      "body": "Low priority comment"
+    },
+    {
+      "path": "file2.ts",
+      "line": 20,
+      "priority": "medium",
+      "body": "Medium priority comment"
+    },
+    {
+      "path": "file3.ts",
+      "line": 30,
+      "priority": "high",
+      "body": "High priority comment"
+    },
+    {
+      "path": "file4.ts",
+      "line": 40,
+      "priority": "critical",
+      "body": "Critical priority comment"
+    }
+  ]
+}
+\`\`\``;
+
+			const result = await priorityService.parseJsonExposed(response);
+			
+			// Verify only high and critical comments were kept (priority >= high)
+			expect(result.comments).toHaveLength(2);
+			expect(result.comments[0].priority).toBe("critical");
+			expect(result.comments[1].priority).toBe("high");
+			
+			// Verify summary includes a note about filtered comments
+			expect(result.summary).toContain("참고: 4개 중 2개의 주요 코멘트만 표시되었습니다");
+		});
+
+		test("should sort comments by priority", async () => {
+			// Create a service with no filtering
+			const options: ReviewOptions = {
+				model: "claude-3-opus-20240229",
+				projectType: "auto",
+				useRepomix: false,
+				fileExtensions: [".ts", ".js"],
+				excludePatterns: [],
+				findRelatedFiles: false,
+				maxFiles: 10,
+			};
+			const service = new TestableClaudeService("fake-api-key", options);
+
+			// Create a test response with mixed priority comments in random order
+			const response = `\`\`\`json
+{
+  "summary": "Test summary",
+  "comments": [
+    {
+      "path": "file1.ts",
+      "line": 10,
+      "priority": "medium",
+      "body": "Medium priority comment"
+    },
+    {
+      "path": "file2.ts",
+      "line": 20,
+      "priority": "low",
+      "body": "Low priority comment"
+    },
+    {
+      "path": "file3.ts",
+      "line": 30,
+      "priority": "critical",
+      "body": "Critical priority comment"
+    },
+    {
+      "path": "file4.ts",
+      "line": 40,
+      "priority": "high",
+      "body": "High priority comment"
+    }
+  ]
+}
+\`\`\``;
+
+			const result = await service.parseJsonExposed(response);
+			
+			// Verify comments are sorted by priority (critical, high, medium, low)
+			expect(result.comments).toHaveLength(4);
+			expect(result.comments[0].priority).toBe("critical");
+			expect(result.comments[1].priority).toBe("high");
+			expect(result.comments[2].priority).toBe("medium");
+			expect(result.comments[3].priority).toBe("low");
+		});
+
+		test("should combine maxComments and commentPriority options", async () => {
+			// Create a service with both maxComments and commentPriority
+			const options: ReviewOptions = {
+				model: "claude-3-opus-20240229",
+				projectType: "auto",
+				useRepomix: false,
+				fileExtensions: [".ts", ".js"],
+				excludePatterns: [],
+				findRelatedFiles: false,
+				maxFiles: 10,
+				maxComments: 1,
+				commentPriority: "medium",
+			};
+			const combinedService = new TestableClaudeService("fake-api-key", options);
+
+			// Create a test response with various priority comments
+			const response = `\`\`\`json
+{
+  "summary": "Test summary",
+  "comments": [
+    {
+      "path": "file1.ts",
+      "line": 10,
+      "priority": "low",
+      "body": "Low priority comment"
+    },
+    {
+      "path": "file2.ts",
+      "line": 20,
+      "priority": "medium",
+      "body": "Medium priority comment"
+    },
+    {
+      "path": "file3.ts",
+      "line": 30,
+      "priority": "high",
+      "body": "High priority comment"
+    },
+    {
+      "path": "file4.ts",
+      "line": 40,
+      "priority": "critical",
+      "body": "Critical priority comment"
+    }
+  ]
+}
+\`\`\``;
+
+			const result = await combinedService.parseJsonExposed(response);
+			
+			// First filter by priority (medium, high, critical) then limit to 1
+			// So we should only get the critical comment
+			expect(result.comments).toHaveLength(1);
+			expect(result.comments[0].priority).toBe("critical");
+			
+			// Verify summary includes a note about filtered comments
+			expect(result.summary).toContain("참고: 4개 중 1개의 주요 코멘트만 표시되었습니다");
+		});
+
+		test("should handle missing priority values correctly", async () => {
+			// Create a service with commentPriority option
+			const options: ReviewOptions = {
+				model: "claude-3-opus-20240229",
+				projectType: "auto",
+				useRepomix: false,
+				fileExtensions: [".ts", ".js"],
+				excludePatterns: [],
+				findRelatedFiles: false,
+				maxFiles: 10,
+				commentPriority: "medium",
+			};
+			const service = new TestableClaudeService("fake-api-key", options);
+
+			// Create a test response with some missing priority values
+			const response = `\`\`\`json
+{
+  "summary": "Test summary",
+  "comments": [
+    {
+      "path": "file1.ts",
+      "line": 10,
+      "body": "Comment with no priority"
+    },
+    {
+      "path": "file2.ts",
+      "line": 20,
+      "priority": "medium",
+      "body": "Medium priority comment"
+    },
+    {
+      "path": "file3.ts",
+      "line": 30,
+      "priority": "high",
+      "body": "High priority comment"
+    }
+  ]
+}
+\`\`\``;
+
+			const result = await service.parseJsonExposed(response);
+			
+			// Comments without priority should be treated as lowest priority
+			// So with medium filter, only medium and high should remain
+			expect(result.comments).toHaveLength(2);
+			expect(result.comments[0].priority).toBe("high");
+			expect(result.comments[1].priority).toBe("medium");
+		});
 	});
 });


Reviews:
user: login: copilot-pull-request-reviewer[bot]
body: 

Copilot reviewed 7 out of 7 changed files in this pull request and generated no comments.


<details>
<summary>Comments suppressed due to low confidence (2)</summary>

**action.yml:43**
* The allowed values mentioned in the 'comment-priority' input description do not match the implementation in src/types.ts (which supports 'all', 'medium', 'high', 'critical'). Please reconcile the documentation and implementation to use a consistent set of options.
```
comment-priority: Filter comments by priority (all, high, medium-high, critical-only)
```
**README.md:72**
* The README now lists allowed options for 'comment_priority' that conflict with an earlier mention in the same section (e.g. 'medium-high' and 'critical-only' are mentioned later). Please update the documentation to consistently reflect the valid options as defined in the code.
```
- `comment_priority`: 코멘트 우선순위 필터링 ('all', 'medium', 'high', 'critical', 기본값: 'medium')
```
</details>


state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T10:11:43Z
user: login: github-actions[bot]
body: # AI 코드 리뷰 - 라인별 코멘트
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-07T10:12:08Z
user: login: github-actions[bot]
body: # AI 코드 리뷰 - 라인별 코멘트
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-07T10:14:02Z
user: login: copilot-pull-request-reviewer[bot]
body: 

Copilot reviewed 7 out of 7 changed files in this pull request and generated no comments.


<details>
<summary>Comments suppressed due to low confidence (1)</summary>

**README.md:96**
* The documentation for the 'comment_priority' option lists values like 'critical-only' and 'medium-high', which do not match the implemented valid values ('all', 'medium', 'high', 'critical') in the code. Please update the README to reflect the correct option values.
```
  - `critical-only`: 가장 중요한(높은 심각도) 코멘트만 표시
```
</details>


state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T10:14:45Z
user: login: github-actions[bot]
body: # AI 코드 리뷰 - 라인별 코멘트
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-07T10:16:20Z
user: login: copilot-pull-request-reviewer[bot]
body: 

Copilot reviewed 7 out of 7 changed files in this pull request and generated no comments.


<details>
<summary>Comments suppressed due to low confidence (2)</summary>

**src/services/claude.ts:505**
* [nitpick] The summary message is written in Korean; consider parameterizing or documenting the language choice so that non-Korean users understand the filtering note.
```
summary = `${summary}\n\n_참고: ${review.comments.length}개 중 ${filteredComments.length}개의 주요 코멘트만 표시되었습니다. ${removedCount}개의 낮은 우선순위 코멘트는 필터링되었습니다._`;
```
**src/services/claude.ts:538**
* [nitpick] The handling of the "all" option defaults to a minimum level of 0, which preserves all comments. Consider adding inline documentation to clarify that this behavior is intentional.
```
private getMinPriorityLevel(priority: "all" | "medium" | "high" | "critical"): number {
```
</details>


state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T10:17:12Z

Review comments:
diff_hunk: @@ -1,47 +1,54 @@
-name: 'Loxops - AI Code Review Assistant'
-description: 'Automated code reviews using Claude AI with support for various project types'
-author: 'Aloha Factory'
+name: "Loxops - AI Code Review Assistant"
+description: "Automated code reviews using Claude AI with support for various project types"
+author: "Aloha Factory"
 
 inputs:
   github-token:
-    description: 'GitHub token for API authentication'
+    description: "GitHub token for API authentication"
     required: true
   claude-api-key:
-    description: 'Claude API key'
+    description: "Claude API key"
     required: true
   project-type:
-    description: 'Project type (unity, springboot, android, nextjs, or auto)'
+    description: "Project type (unity, springboot, android, nextjs, or auto)"
     required: false
-    default: 'auto'
+    default: "auto"
   file-extensions:
-    description: 'Comma-separated list of file extensions to analyze'
+    description: "Comma-separated list of file extensions to analyze"
     required: false
-    default: '.ts,.js,.tsx,.jsx,.cs,.java,.kt,.xml,.json,.yaml,.yml'
+    default: ".ts,.js,.tsx,.jsx,.cs,.java,.kt,.xml,.json,.yaml,.yml"
   exclude-patterns:
-    description: 'Comma-separated list of glob patterns to exclude'
+    description: "Comma-separated list of glob patterns to exclude"
     required: false
-    default: 'node_modules/**,dist/**,build/**,*.min.js,*.test.*'
+    default: "node_modules/**,dist/**,build/**,*.min.js,*.test.*"
   find-related-files:
-    description: 'Whether to find and analyze related files'
+    description: "Whether to find and analyze related files"
     required: false
-    default: 'true'
+    default: "true"
   max-files:
-    description: 'Maximum number of files to analyze in a single PR'
+    description: "Maximum number of files to analyze in a single PR"
     required: false
-    default: '10'
+    default: "10"
   model:
path: action.yml
user: login: github-actions[bot]
body: 새로운 입력 옵션 `max-comments`와 `comment-priority`가 추가되었습니다. 이는 코드 리뷰의 세부 조정을 가능하게 해줍니다.

장점:
- 리뷰 코멘트 수 제한 가능
- 우선순위에 따른 코멘트 필터링 지원

권장 사용 예시:
```yaml
- uses: aloha-factory/loxops-ai-review@v1
  with:
    max-comments: 5
    comment-priority: high
```
created_at: 2025-04-07T10:12:07Z
author_association: NONE
diff_hunk: @@ -27,6 +27,8 @@ export interface ReviewOptions {
 	model: string;
 	useRepomix: boolean;
 	commentStdout?: boolean;
+	maxComments?: number;
path: src/types.ts
user: login: github-actions[bot]
body: 타입 정의에 `maxComments`와 `commentPriority` 옵션 추가로 타입 안전성 및 유연성 향상.

개선된 타입 정의:
```typescript
export interface ReviewOptions {
  // 기존 옵션들...
  maxComments?: number;
  commentPriority?: 'all' | 'medium' | 'high' | 'critical';
}
```

타입 변경으로 인한 주의사항:
- 기존 코드와의 호환성 확인 필요
- TypeScript 프로젝트에서 타입 검사 권장
created_at: 2025-04-07T10:12:07Z
author_association: NONE
diff_hunk: @@ -467,6 +469,87 @@ Please ensure your JSON is valid and properly formatted. Make sure to escape any
 		}
 	}
path: src/services/claude.ts
user: login: github-actions[bot]
body: 코멘트 필터링 및 우선순위 처리 로직 추가로 AI 응답의 품질 제어 기능 강화.

주요 개선 사항:
- 우선순위 기반 코멘트 정렬
- 최대 코멘트 수 제한
- 동적 요약 메시지 생성

잠재적 성능 고려사항:
- 대규모 리뷰에서 정렬/필터링 오버헤드 최소화 필요
- 알고리즘의 시간 복잡도 O(n log n) 주의
created_at: 2025-04-07T10:12:08Z
author_association: NONE
diff_hunk: @@ -16,6 +16,15 @@ async function run(): Promise<void> {
 		const maxFiles = Number.parseInt(core.getInput("max-files"), 10);
 		const model = core.getInput("model");
 		const useRepomix = core.getInput("use-repomix") === "true";
+		const maxComments = core.getInput("max-comments")
+			? Number.parseInt(core.getInput("max-comments"))
+			: undefined;
+		const commentPriority = core.getInput("comment-priority") as
+			| "all"
+			| "medium"
+			| "high"
path: src/index.ts
user: login: github-actions[bot]
body: 새로운 입력값 처리 로직 추가로 구성 유연성 개선.

핵심 변경 사항:
```typescript
const maxComments = core.getInput('max-comments')
  ? Number.parseInt(core.getInput('max-comments'))
  : undefined;

const commentPriority = core.getInput('comment-priority') as
  | 'all'
  | 'medium'
  | 'high'
  | 'critical'
  | undefined;
```

개선 포인트:
- 선택적 입력값 처리
- 타입 안전성 확보
- 기본값 및 폴백 메커니즘 구현
created_at: 2025-04-07T10:12:08Z
author_association: NONE
diff_hunk: @@ -1,47 +1,54 @@
-name: 'Loxops - AI Code Review Assistant'
-description: 'Automated code reviews using Claude AI with support for various project types'
-author: 'Aloha Factory'
+name: "Loxops - AI Code Review Assistant"
+description: "Automated code reviews using Claude AI with support for various project types"
+author: "Aloha Factory"
 
 inputs:
   github-token:
-    description: 'GitHub token for API authentication'
+    description: "GitHub token for API authentication"
     required: true
   claude-api-key:
-    description: 'Claude API key'
+    description: "Claude API key"
     required: true
   project-type:
-    description: 'Project type (unity, springboot, android, nextjs, or auto)'
+    description: "Project type (unity, springboot, android, nextjs, or auto)"
     required: false
-    default: 'auto'
+    default: "auto"
   file-extensions:
-    description: 'Comma-separated list of file extensions to analyze'
+    description: "Comma-separated list of file extensions to analyze"
     required: false
-    default: '.ts,.js,.tsx,.jsx,.cs,.java,.kt,.xml,.json,.yaml,.yml'
+    default: ".ts,.js,.tsx,.jsx,.cs,.java,.kt,.xml,.json,.yaml,.yml"
   exclude-patterns:
-    description: 'Comma-separated list of glob patterns to exclude'
+    description: "Comma-separated list of glob patterns to exclude"
     required: false
-    default: 'node_modules/**,dist/**,build/**,*.min.js,*.test.*'
+    default: "node_modules/**,dist/**,build/**,*.min.js,*.test.*"
   find-related-files:
-    description: 'Whether to find and analyze related files'
+    description: "Whether to find and analyze related files"
     required: false
-    default: 'true'
+    default: "true"
   max-files:
-    description: 'Maximum number of files to analyze in a single PR'
+    description: "Maximum number of files to analyze in a single PR"
     required: false
path: action.yml
user: login: github-actions[bot]
body: 새로운 입력 파라미터 `max-comments`와 `comment-priority`가 추가되었습니다. 이는 코드 리뷰의 세부 조정을 가능하게 하는 유연한 설계입니다.

주요 개선점:
- 최대 코멘트 수 제한 가능
- 코멘트 우선순위 필터링 지원

```yaml
inputs:
  max-comments:
    description: 'Maximum number of comments to include in the review'
    required: false
  comment-priority:
    description: 'Filter comments by priority'
    required: false
    default: 'medium'
```
created_at: 2025-04-07T10:14:02Z
author_association: NONE
diff_hunk: @@ -1,47 +1,54 @@
-name: 'Loxops - AI Code Review Assistant'
-description: 'Automated code reviews using Claude AI with support for various project types'
-author: 'Aloha Factory'
+name: "Loxops - AI Code Review Assistant"
+description: "Automated code reviews using Claude AI with support for various project types"
+author: "Aloha Factory"
 
 inputs:
   github-token:
-    description: 'GitHub token for API authentication'
+    description: "GitHub token for API authentication"
     required: true
   claude-api-key:
-    description: 'Claude API key'
+    description: "Claude API key"
     required: true
   project-type:
-    description: 'Project type (unity, springboot, android, nextjs, or auto)'
+    description: "Project type (unity, springboot, android, nextjs, or auto)"
     required: false
-    default: 'auto'
+    default: "auto"
   file-extensions:
-    description: 'Comma-separated list of file extensions to analyze'
+    description: "Comma-separated list of file extensions to analyze"
     required: false
-    default: '.ts,.js,.tsx,.jsx,.cs,.java,.kt,.xml,.json,.yaml,.yml'
+    default: ".ts,.js,.tsx,.jsx,.cs,.java,.kt,.xml,.json,.yaml,.yml"
   exclude-patterns:
-    description: 'Comma-separated list of glob patterns to exclude'
+    description: "Comma-separated list of glob patterns to exclude"
     required: false
-    default: 'node_modules/**,dist/**,build/**,*.min.js,*.test.*'
+    default: "node_modules/**,dist/**,build/**,*.min.js,*.test.*"
   find-related-files:
-    description: 'Whether to find and analyze related files'
+    description: "Whether to find and analyze related files"
     required: false
-    default: 'true'
+    default: "true"
   max-files:
-    description: 'Maximum number of files to analyze in a single PR'
+    description: "Maximum number of files to analyze in a single PR"
     required: false
-    default: '10'
+    default: "10"
   model:
-    description: 'Claude model to use'
+    description: "Claude model to use"
     required: false
-    default: 'claude-3-5-haiku-20241022'
+    default: "claude-3-5-haiku-20241022"
   use-repomix:
-    description: 'Whether to use Repomix to pack repository for comprehensive review'
+    description: "Whether to use Repomix to pack repository for comprehensive review"
path: action.yml
user: login: github-actions[bot]
body: 새로운 입력 파라미터 추가로 GitHub Action의 유연성이 크게 향상되었습니다.

주목할 만한 신규 파라미터:
- `max-comments`: 리뷰에 포함될 최대 코멘트 수 제한
- `comment-priority`: 코멘트 우선순위 필터링 옵션

예시 설정:
```yaml
with:
  max-comments: 5  # 최대 5개의 코멘트만 포함
  comment-priority: high  # 높은 우선순위 코멘트만 표시
```

이러한 파라미터는 코드 리뷰의 세부 제어를 가능하게 하여, 사용자 경험을 크게 개선합니다.
created_at: 2025-04-07T10:16:20Z
author_association: NONE
diff_hunk: @@ -62,63 +62,63 @@ export class ClaudeService {
 	}
path: src/services/claude.ts
user: login: github-actions[bot]
body: JSON 응답 형식 지침이 크게 개선되었습니다. 특히 주목할 만한 변경사항:

1. 우선순위(priority) 필드 추가
2. 보다 엄격하고 명확한 응답 구조 정의
3. 응답 포맷에 대한 상세한 가이드라인 제공

코드 예시:
```typescript
// 개선된 ReviewComment 인터페이스
interface ReviewComment {
  path: string;
  line: number;
  body: string;
  priority?: 'critical' | 'high' | 'medium' | 'low';
}
```

이러한 변경은 코드 리뷰의 구조화된 피드백을 더욱 강화합니다.
created_at: 2025-04-07T10:16:20Z
author_association: NONE
diff_hunk: @@ -16,6 +16,15 @@ async function run(): Promise<void> {
 		const maxFiles = Number.parseInt(core.getInput("max-files"), 10);
 		const model = core.getInput("model");
 		const useRepomix = core.getInput("use-repomix") === "true";
+		const maxComments = core.getInput("max-comments")
+			? Number.parseInt(core.getInput("max-comments"))
path: src/index.ts
user: login: github-actions[bot]
body: 새로운 입력 옵션 처리 로직이 추가되어 코드 리뷰 프로세스의 유연성이 향상되었습니다.

주요 변경 사항:
- 최대 코멘트 수 제한 옵션 (`maxComments`)
- 코멘트 우선순위 필터링 옵션 (`commentPriority`)

잠재적 개선점:
1. 옵션 유효성 검사 추가
2. 기본값에 대한 명시적 문서화
3. 오류 처리 메커니즘 강화
created_at: 2025-04-07T10:16:20Z
author_association: NONE

PR comments:
user: login: github-actions[bot]
created_at: 2025-04-07T10:12:06Z
body: # AI 코드 리뷰

## Overall Assessment

이번 업데이트는 Loxops AI 코드 리뷰 GitHub Action의 기능을 확장하고 유연성을 개선했습니다. 주요 변경사항은 다음과 같습니다:

- 코멘트 필터링 및 우선순위 기능 추가
- 코드 검토 과정의 더욱 세밀한 제어 가능
- JSON 응답 파싱의 강건성(Robustness) 향상
- 개발자 경험 개선을 위한 새로운 구성 옵션 도입
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-07T10:14:01Z
body: # AI 코드 리뷰

## Overall Assessment

이번 변경사항은 GitHub Action의 코드 리뷰 기능을 강화하고, 사용자 맞춤형 리뷰 옵션을 추가하는 중요한 개선을 포함합니다. 주요 개선점은 코멘트 우선순위 필터링, 최대 코멘트 수 제한, 그리고 더 세밀한 JSON 파싱 메커니즘입니다.

주요 개선 영역:
- 코멘트 우선순위 및 필터링 메커니즘 추가
- Claude AI 응답 파싱의 견고성 향상
- GitHub Action 입력 파라미터 확장
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-07T10:16:19Z
body: # AI 코드 리뷰

## Overall Assessment

GitHub Action의 코드 리뷰 기능을 개선하기 위한 중요한 업데이트가 수행되었습니다. 주요 변경사항은 코드 리뷰의 유연성과 세부 제어를 강화하는 데 초점을 맞추고 있으며, 특히 코멘트 필터링, 우선순위 지정, 최대 코멘트 수 제한 등의 기능이 추가되었습니다.

핵심 개선 영역:
- 코드 리뷰 옵션의 세분화
- JSON 파싱 및 처리 로직 강화
- 코멘트 우선순위 및 필터링 메커니즘 추가
author_association: NONE