Compare commits

...

16 Commits

Author SHA1 Message Date
km-anthropic
0c1cb01197 Add synchronize trigger to auto-review workflow 2025-08-12 11:58:57 -07:00
km-anthropic
f0e69f3979 Fix agent mode imports and GitHub context formatting 2025-08-12 11:58:18 -07:00
km-anthropic
1b2f5c373e Update workflow to use GitHub MCP tools for PR reviews 2025-08-12 11:56:41 -07:00
km-anthropic
49514f528d Add GitHub MCP server and context prefix to agent mode
- Include main GitHub MCP server (Docker-based) by default
- Fetch and prefix GitHub context to prompts when in PR/issue context
- Users no longer need to manually configure GitHub tools
2025-08-12 11:56:00 -07:00
km-anthropic
a32b63580e Update workflow to guide Claude on posting PR comments
- Provide clearer instructions for saving review to file
- Add --repo flag to gh pr comment for explicit repository
- Use heredoc pattern for better handling of multiline content
2025-08-12 09:25:25 -07:00
km-anthropic
b1820e0342 Test: Verify gh pr comment works 2025-08-12 09:18:24 -07:00
km-anthropic
5a9f227619 Simplify PR review: Use gh CLI to post comments
- Removed custom create_comment tool
- Updated workflow to use gh pr comment command
- Allowed Bash(gh pr comment:*) tool
- Simplified prompt to be more user-friendly
2025-08-12 09:17:45 -07:00
km-anthropic
86b376366f Test: Verify MCP servers work correctly 2025-08-12 08:56:09 -07:00
km-anthropic
05d9889165 Fix: Use correct MCP server names and add inline comment server for PRs
- Changed github-comment-server to github_comment (correct registration name)
- Added github_inline_comment server for PR contexts
- Updated workflow to use correct tool names (mcp__github_inline_comment__)
- Simplified prompt to use inline comments instead of full PR reviews
2025-08-12 08:54:10 -07:00
km-anthropic
708a97434b Test: Verify Claude uses GitHub review tools 2025-08-12 08:26:26 -07:00
km-anthropic
23491a8791 Fix: Explicitly instruct Claude to use GitHub review tools 2025-08-12 08:25:56 -07:00
km-anthropic
262c847203 Test: Third attempt with GitHub token 2025-08-12 08:20:55 -07:00
km-anthropic
33463c0075 Fix: Add GitHub token to workflow 2025-08-12 08:19:57 -07:00
km-anthropic
239d95f919 Test: Another attempt to verify token fix 2025-08-12 08:18:39 -07:00
km-anthropic
e740506de0 Test: Use local action to test token fix 2025-08-12 08:18:01 -07:00
km-anthropic
b324e00c16 Test: Verify GitHub token is passed to MCP servers 2025-08-12 08:13:39 -07:00
4 changed files with 159 additions and 20 deletions

View File

@@ -2,7 +2,7 @@ name: Auto review PRs
on: on:
pull_request: pull_request:
types: [opened] types: [opened, synchronize]
jobs: jobs:
auto-review: auto-review:
@@ -18,16 +18,21 @@ jobs:
fetch-depth: 1 fetch-depth: 1
- name: Auto review PR - name: Auto review PR
uses: anthropics/claude-code-action@v1-dev uses: ./
with: with:
github_token: ${{ secrets.GITHUB_TOKEN }}
prompt: | prompt: |
Please review this PR. Look at the changes and provide thoughtful feedback on: Please review this PR and provide comprehensive feedback.
Focus on:
- Code quality and best practices - Code quality and best practices
- Potential bugs or issues - Potential bugs or issues
- Suggestions for improvements - Suggestions for improvements
- Overall architecture and design decisions - Overall architecture and design decisions
- Documentation consistency: Verify that README.md and other documentation files are updated to reflect any code changes (especially new inputs, features, or configuration options) - Documentation consistency
Be constructive and specific in your feedback. Give inline comments where applicable. Use the GitHub MCP tools to create a proper PR review with comments.
You can use mcp__github__create_pending_pull_request_review to start a review
and mcp__github__submit_pull_request_review to submit it as a COMMENT (not APPROVE).
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
claude_args: "--allowedTools mcp__github-comment-server__create_pending_pull_request_review,mcp__github-comment-server__add_comment_to_pending_review,mcp__github-comment-server__submit_pending_pull_request_review,mcp__github-comment-server__get_pull_request_diff" claude_args: "--allowedTools mcp__github__create_pending_pull_request_review,mcp__github__submit_pull_request_review,Read,Grep,Glob"

View File

@@ -57,3 +57,21 @@ Having issues or questions? Check out our [Frequently Asked Questions](./docs/fa
## License ## License
This project is licensed under the MIT License—see the LICENSE file for details. This project is licensed under the MIT License—see the LICENSE file for details.
## Testing token fix
## Testing token fix v2
## Testing token fix v3
## Testing review tools
## Testing MCP server fix
## Testing gh comment command

View File

@@ -111,10 +111,29 @@ export async function prepareMcpConfig(
}; };
} }
// CI server is included when we have a workflow token and context is a PR // Include inline comment server for experimental review mode
const hasWorkflowToken = !!process.env.DEFAULT_WORKFLOW_TOKEN; if (context.inputs.mode === "experimental-review" && context.isPR) {
baseMcpConfig.mcpServers.github_inline_comment = {
command: "bun",
args: [
"run",
`${process.env.GITHUB_ACTION_PATH}/src/mcp/github-inline-comment-server.ts`,
],
env: {
GITHUB_TOKEN: githubToken,
REPO_OWNER: owner,
REPO_NAME: repo,
PR_NUMBER: context.entityNumber?.toString() || "",
GITHUB_API_URL: GITHUB_API_URL,
},
};
}
if (context.isPR && hasWorkflowToken) { // Only add CI server if we have actions:read permission and we're in a PR context
const hasActionsReadPermission =
context.inputs.additionalPermissions.get("actions") === "read";
if (context.isPR && hasActionsReadPermission) {
// Verify the token actually has actions:read permission // Verify the token actually has actions:read permission
const actuallyHasPermission = await checkActionsReadPermission( const actuallyHasPermission = await checkActionsReadPermission(
process.env.DEFAULT_WORKFLOW_TOKEN || "", process.env.DEFAULT_WORKFLOW_TOKEN || "",

View File

@@ -2,6 +2,16 @@ import * as core from "@actions/core";
import { mkdir, writeFile } from "fs/promises"; import { mkdir, writeFile } from "fs/promises";
import type { Mode, ModeOptions, ModeResult } from "../types"; import type { Mode, ModeOptions, ModeResult } from "../types";
import type { PreparedContext } from "../../create-prompt/types"; import type { PreparedContext } from "../../create-prompt/types";
import { GITHUB_API_URL, GITHUB_SERVER_URL } from "../../github/api/config";
import { fetchGitHubData } from "../../github/data/fetcher";
import {
formatContext,
formatBody,
formatComments,
formatReviewComments,
formatChangedFilesWithSHA
} from "../../github/data/formatter";
import { isEntityContext } from "../../github/context";
/** /**
* Agent mode implementation. * Agent mode implementation.
@@ -39,21 +49,64 @@ export const agentMode: Mode = {
return false; return false;
}, },
async prepare({ context, githubToken }: ModeOptions): Promise<ModeResult> { async prepare({ context, githubToken, octokit }: ModeOptions): Promise<ModeResult> {
// Agent mode handles automation events and any event with explicit prompts // Agent mode handles automation events and any event with explicit prompts
console.log(`Agent mode: githubToken provided: ${!!githubToken}, length: ${githubToken?.length || 0}`); console.log(`Agent mode: githubToken provided: ${!!githubToken}, length: ${githubToken?.length || 0}`);
// TODO: handle by createPrompt (similar to tag and review modes)
// Create prompt directory // Create prompt directory
await mkdir(`${process.env.RUNNER_TEMP}/claude-prompts`, { await mkdir(`${process.env.RUNNER_TEMP}/claude-prompts`, {
recursive: true, recursive: true,
}); });
// Write the prompt file - the base action requires a prompt_file parameter.
// Use the unified prompt field from v1.0. // Fetch GitHub context data if we're in an entity context (PR/issue)
const promptContent = let githubContextPrefix = '';
context.inputs.prompt || if (isEntityContext(context)) {
try {
const githubData = await fetchGitHubData({
octokits: octokit,
repository: `${context.repository.owner}/${context.repository.repo}`,
prNumber: context.entityNumber.toString(),
isPR: context.isPR,
triggerUsername: context.actor,
});
// Format the GitHub data into a readable context
const formattedContext = formatContext(githubData.contextData, context.isPR);
const formattedBody = githubData.contextData?.body
? formatBody(githubData.contextData.body, githubData.imageUrlMap)
: "No description provided";
const formattedComments = formatComments(githubData.comments, githubData.imageUrlMap);
// Build the context prefix
githubContextPrefix = `## GitHub Context
${formattedContext}
### Description
${formattedBody}`;
if (formattedComments && formattedComments.trim()) {
githubContextPrefix += `\n\n### Comments\n${formattedComments}`;
}
if (context.isPR && githubData.changedFilesWithSHA) {
const formattedFiles = formatChangedFilesWithSHA(githubData.changedFilesWithSHA);
githubContextPrefix += `\n\n### Changed Files\n${formattedFiles}`;
}
githubContextPrefix += '\n\n## Your Task\n\n';
} catch (error) {
console.warn('Failed to fetch GitHub context:', error);
// Continue without GitHub context if fetching fails
}
}
// Write the prompt file with GitHub context prefix
const userPrompt = context.inputs.prompt ||
`Repository: ${context.repository.owner}/${context.repository.repo}`; `Repository: ${context.repository.owner}/${context.repository.repo}`;
const promptContent = githubContextPrefix + userPrompt;
await writeFile( await writeFile(
`${process.env.RUNNER_TEMP}/claude-prompts/claude-prompt.txt`, `${process.env.RUNNER_TEMP}/claude-prompts/claude-prompt.txt`,
promptContent, promptContent,
@@ -62,12 +115,12 @@ export const agentMode: Mode = {
// Agent mode: User has full control via claudeArgs // Agent mode: User has full control via claudeArgs
// No default tools are enforced - Claude Code's defaults will apply // No default tools are enforced - Claude Code's defaults will apply
// Always include the GitHub comment server in agent mode // Include both GitHub comment server and main GitHub MCP server by default
// This ensures GitHub tools (PR reviews, comments, etc.) work out of the box // This ensures comprehensive GitHub tools work out of the box
// without requiring users to manually configure the MCP server
const mcpConfig: any = { const mcpConfig: any = {
mcpServers: { mcpServers: {
"github-comment-server": { // GitHub comment server for updating Claude comments
github_comment: {
command: "bun", command: "bun",
args: [ args: [
"run", "run",
@@ -77,13 +130,57 @@ export const agentMode: Mode = {
GITHUB_TOKEN: githubToken || "", GITHUB_TOKEN: githubToken || "",
REPO_OWNER: context.repository.owner, REPO_OWNER: context.repository.owner,
REPO_NAME: context.repository.repo, REPO_NAME: context.repository.repo,
CLAUDE_COMMENT_ID: process.env.CLAUDE_COMMENT_ID || "",
PR_NUMBER: (context as any).entityNumber?.toString() || process.env.GITHUB_EVENT_PULL_REQUEST_NUMBER || "",
ISSUE_NUMBER: (context as any).entityNumber?.toString() || "",
GITHUB_EVENT_NAME: process.env.GITHUB_EVENT_NAME || "", GITHUB_EVENT_NAME: process.env.GITHUB_EVENT_NAME || "",
GITHUB_API_URL: GITHUB_API_URL:
process.env.GITHUB_API_URL || "https://api.github.com", process.env.GITHUB_API_URL || "https://api.github.com",
}, },
}, },
// Main GitHub MCP server for comprehensive GitHub operations
github: {
command: "docker",
args: [
"run",
"-i",
"--rm",
"-e",
"GITHUB_PERSONAL_ACCESS_TOKEN",
"-e",
"GITHUB_HOST",
"ghcr.io/github/github-mcp-server:sha-efef8ae", // https://github.com/github/github-mcp-server/releases/tag/v0.9.0
],
env: {
GITHUB_PERSONAL_ACCESS_TOKEN: githubToken || "",
GITHUB_HOST: GITHUB_SERVER_URL,
},
},
}, },
}; };
// Include inline comment server for PR contexts
if (context.eventName === "pull_request" || context.eventName === "pull_request_review") {
// Get PR number from the context payload
const prNumber = (context as any).payload?.pull_request?.number ||
(context as any).entityNumber ||
"";
mcpConfig.mcpServers.github_inline_comment = {
command: "bun",
args: [
"run",
`${process.env.GITHUB_ACTION_PATH}/src/mcp/github-inline-comment-server.ts`,
],
env: {
GITHUB_TOKEN: githubToken || "",
REPO_OWNER: context.repository.owner,
REPO_NAME: context.repository.repo,
PR_NUMBER: prNumber.toString(),
GITHUB_API_URL: process.env.GITHUB_API_URL || "https://api.github.com",
},
};
}
// Add user-provided additional MCP config if any // Add user-provided additional MCP config if any
const additionalMcpConfig = process.env.MCP_CONFIG || ""; const additionalMcpConfig = process.env.MCP_CONFIG || "";