Compare commits

..

24 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
km-anthropic
0c533aaff5 Fix: Pass GitHub token to MCP servers in agent mode
The token was being obtained successfully but not outputted from the prepare step for use in later steps. Added explicit output of the GitHub token and debug logging.
2025-08-11 16:17:01 -07:00
km-anthropic
8102aebe6d Test: Verify Claude doesn't approve PRs 2025-08-11 15:07:40 -07:00
km-anthropic
57cb0d9828 Match old workflow exactly - prevent approvals
- Use exact same permissions as old workflow
- Use fetch-depth: 1 like old workflow
- Remove timeout and extra features
- Only trigger on opened PRs
- Use claude_args with --allowedTools format
2025-08-11 14:54:48 -07:00
km-anthropic
44dd9dd8a8 Final test: Update README for complete review workflow test 2025-08-11 14:01:41 -07:00
km-anthropic
8052d271ce Enable PR review submission and remove old workflow
- Add back review submission tools to allow Claude to comment
- Keep using v1-dev with the fixed agent mode
- This replaces the old claude-review.yml functionality
2025-08-11 14:00:48 -07:00
km-anthropic
b61185b14c Test: Update README title for workflow testing 2025-08-11 13:55:00 -07:00
km-anthropic
808408602d Simplify review workflow - prevent multiple submissions
- Rename workflow to avoid conflicts
- Remove review submission tools
- Keep only essential tools for reading and analyzing PR
2025-08-11 13:53:02 -07:00
km-anthropic
c03f13d243 Fix agent mode to include GitHub MCP server with proper token 2025-08-11 13:46:35 -07:00
9 changed files with 193 additions and 50 deletions

View File

@@ -0,0 +1,38 @@
name: Auto review PRs
on:
pull_request:
types: [opened, synchronize]
jobs:
auto-review:
permissions:
contents: read
id-token: write
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Auto review PR
uses: ./
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
prompt: |
Please review this PR and provide comprehensive feedback.
Focus on:
- Code quality and best practices
- Potential bugs or issues
- Suggestions for improvements
- Overall architecture and design decisions
- Documentation consistency
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 }}
claude_args: "--allowedTools mcp__github__create_pending_pull_request_review,mcp__github__submit_pull_request_review,Read,Grep,Glob"

View File

@@ -1,33 +0,0 @@
name: Auto review PRs
on:
pull_request:
types: [opened]
jobs:
auto-review:
permissions:
contents: read
id-token: write
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Auto review PR
uses: anthropics/claude-code-action@main
with:
direct_prompt: |
Please review this PR. Look at the changes and provide thoughtful feedback on:
- Code quality and best practices
- Potential bugs or issues
- Suggestions for improvements
- 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)
Be constructive and specific in your feedback. Give inline comments where applicable.
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
allowed_tools: "mcp__github__create_pending_pull_request_review,mcp__github__add_comment_to_pending_review,mcp__github__submit_pending_pull_request_review,mcp__github__get_pull_request_diff"

View File

@@ -1,6 +1,6 @@
![Claude Code Action responding to a comment](https://github.com/user-attachments/assets/1d60c2e9-82ed-4ee5-b749-f9e021c85f4d)
# Claude Code Action
# Claude Code Action - No Approval Test
A general-purpose [Claude Code](https://claude.ai/code) action for GitHub PRs and issues that can answer questions and implement code changes. This action listens for a trigger phrase in comments and activates Claude act on the request. It supports multiple authentication methods including Anthropic direct API, Amazon Bedrock, and Google Vertex AI.
@@ -57,3 +57,21 @@ Having issues or questions? Check out our [Frequently Asked Questions](./docs/fa
## License
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

@@ -141,7 +141,7 @@ runs:
echo "Base-action dependencies installed"
cd -
# Install Claude Code globally
bun install -g @anthropic-ai/claude-code@1.0.73
bun install -g @anthropic-ai/claude-code@1.0.72
- name: Setup Network Restrictions
if: steps.prepare.outputs.contains_trigger == 'true' && inputs.experimental_allowed_domains != ''

View File

@@ -85,7 +85,7 @@ runs:
- name: Install Claude Code
shell: bash
run: bun install -g @anthropic-ai/claude-code@1.0.73
run: bun install -g @anthropic-ai/claude-code@1.0.72
- name: Run Claude Code Action
shell: bash

View File

@@ -56,6 +56,7 @@ async function run() {
mode,
githubToken,
});
core.setOutput("GITHUB_TOKEN", githubToken);
// MCP config is handled by individual modes (tag/agent) and included in their claude_args output

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
const hasWorkflowToken = !!process.env.DEFAULT_WORKFLOW_TOKEN;
// Include inline comment server for experimental review mode
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
const actuallyHasPermission = await checkActionsReadPermission(
process.env.DEFAULT_WORKFLOW_TOKEN || "",

View File

@@ -2,6 +2,16 @@ import * as core from "@actions/core";
import { mkdir, writeFile } from "fs/promises";
import type { Mode, ModeOptions, ModeResult } from "../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.
@@ -39,19 +49,64 @@ export const agentMode: Mode = {
return false;
},
async prepare({ context }: ModeOptions): Promise<ModeResult> {
async prepare({ context, githubToken, octokit }: ModeOptions): Promise<ModeResult> {
// Agent mode handles automation events and any event with explicit prompts
console.log(`Agent mode: githubToken provided: ${!!githubToken}, length: ${githubToken?.length || 0}`);
// TODO: handle by createPrompt (similar to tag and review modes)
// Create prompt directory
await mkdir(`${process.env.RUNNER_TEMP}/claude-prompts`, {
recursive: true,
});
// Write the prompt file - the base action requires a prompt_file parameter.
// Use the unified prompt field from v1.0.
const promptContent =
context.inputs.prompt ||
// Fetch GitHub context data if we're in an entity context (PR/issue)
let githubContextPrefix = '';
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}`;
const promptContent = githubContextPrefix + userPrompt;
await writeFile(
`${process.env.RUNNER_TEMP}/claude-prompts/claude-prompt.txt`,
promptContent,
@@ -60,28 +115,72 @@ export const agentMode: Mode = {
// Agent mode: User has full control via claudeArgs
// No default tools are enforced - Claude Code's defaults will apply
// Always include the GitHub comment server in agent mode
// This ensures GitHub tools (PR reviews, comments, etc.) work out of the box
// without requiring users to manually configure the MCP server
// Include both GitHub comment server and main GitHub MCP server by default
// This ensures comprehensive GitHub tools work out of the box
const mcpConfig: any = {
mcpServers: {
"github-comment-server": {
// GitHub comment server for updating Claude comments
github_comment: {
command: "bun",
args: [
"run",
`${process.env.GITHUB_ACTION_PATH}/src/mcp/github-comment-server.ts`,
],
env: {
GITHUB_TOKEN: process.env.GITHUB_TOKEN || "",
GITHUB_TOKEN: githubToken || "",
REPO_OWNER: context.repository.owner,
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_API_URL:
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
const additionalMcpConfig = process.env.MCP_CONFIG || "";

View File

@@ -0,0 +1 @@
Custom prompt content