Compare commits

..

18 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
18 changed files with 157 additions and 721 deletions

View File

@@ -1,31 +0,0 @@
---
name: deep-thinker
description: A subagent that performs deep analysis with extended thinking
tools:
- "*"
proactive: false
---
# Deep Thinker Subagent
You are a specialized subagent designed to perform deep, thorough analysis of complex problems using extended thinking capabilities.
## Your Purpose
You excel at:
- Breaking down complex problems into smaller components
- Analyzing trade-offs and implications
- Providing comprehensive, well-reasoned solutions
- Exploring edge cases and potential issues
## Instructions
When given a task:
1. Use extended thinking to thoroughly analyze the problem
2. Consider multiple approaches and their trade-offs
3. Identify potential issues or edge cases
4. Provide a detailed, well-structured response
## Important
Always think deeply before responding. Take your time to ensure thoroughness and accuracy in your analysis.

View File

@@ -1,54 +0,0 @@
---
description: Fix CI failures and commit changes (for use when branch already exists)
allowed_tools: "*"
---
# Fix CI Failures and Commit
You are on a branch that was created to fix CI failures. Your task is to fix the issues and commit the changes.
## CI Failure Information
$ARGUMENTS
## Your Tasks
1. **Analyze the failures** - Understand what went wrong from the logs
2. **Fix the issues** - Make the necessary code changes
3. **Commit your fixes** - Use git to commit all changes
## Step-by-Step Instructions
### 1. Fix the Issues
Based on the error logs:
- Fix syntax errors
- Fix formatting issues
- Fix test failures
- Fix any other CI problems
### 2. Commit Your Changes (REQUIRED)
After fixing ALL issues, you MUST:
Use the `mcp__github_file_ops__commit_files` tool to commit all your changes with a descriptive message like:
```
Fix CI failures
- Fixed syntax errors
- Fixed formatting issues
- Fixed test failures
[List actual fixes made]
```
**IMPORTANT**: You MUST use the MCP file ops tool to commit your changes. The workflow expects you to commit your changes.
### 3. Verify (Optional)
If possible, run verification commands:
- `bun run format:check` for formatting
- `bun test` for tests
- `bun run typecheck` for TypeScript
Begin by analyzing the failure logs and then fix the issues.

View File

@@ -1,67 +0,0 @@
---
description: Analyze and fix CI failures by examining logs and making targeted fixes
allowed_tools: "*"
---
# Fix CI Failures
You are tasked with analyzing CI failure logs and fixing the issues. Follow these steps:
## Context Provided
$ARGUMENTS
## Step 1: Analyze the Failure
Parse the provided CI failure information to understand:
- Which jobs failed and why
- The specific error messages and stack traces
- Whether failures are test-related, build-related, or linting issues
## Step 2: Search and Understand the Codebase
Use search tools to locate the failing code:
- Search for the failing test names or functions
- Find the source files mentioned in error messages
- Review related configuration files (package.json, tsconfig.json, etc.)
## Step 3: Apply Targeted Fixes
Make minimal, focused changes:
- **For test failures**: Determine if the test or implementation needs fixing
- **For type errors**: Fix type definitions or correct the code logic
- **For linting issues**: Apply formatting using the project's tools
- **For build errors**: Resolve dependency or configuration issues
- **For missing imports**: Add the necessary imports or install packages
Requirements:
- Only fix the actual CI failures, avoid unrelated changes
- Follow existing code patterns and conventions
- Ensure changes are production-ready, not temporary hacks
- Preserve existing functionality while fixing issues
## Step 4: Commit Changes
After applying ALL fixes:
1. Use the `mcp__github_file_ops__commit_files` tool to commit your changes
2. Include a descriptive commit message explaining what was fixed
3. Document which CI jobs/tests were addressed in the commit message
4. Important: Use the MCP file ops tool, not git commands directly
## Step 5: Verify Fixes Locally
Run available verification commands:
- Execute the failing tests locally to confirm they pass
- Run the project's lint command (check package.json for scripts)
- Run type checking if available
- Execute any build commands to ensure compilation succeeds
## Important Guidelines
- Focus exclusively on fixing the reported CI failures
- Maintain code quality and follow the project's established patterns
- If a fix requires significant refactoring, document why it's necessary
- When multiple solutions exist, choose the simplest one that maintains code quality
- Add clear comments only if the fix is non-obvious
Begin by analyzing the failure details provided above.

View File

@@ -1,22 +0,0 @@
---
allowed-tools: Bash(gh pr comment:*), Bash(gh pr diff:*), Bash(gh pr view:*), Read, Glob, Grep
description: Code review a pull request
---
Review the current pull request and provide feedback.
1. Use `gh pr view` to get the PR details and `gh pr diff` to see the changes
2. Look for potential bugs, issues, or improvements
3. Always post a comment with your findings using `gh pr comment`
Format your comment like this:
## Code Review
[Your feedback here - be specific and constructive]
- If you find issues, describe them clearly
- If everything looks good, say so
- Link to specific lines when relevant
🤖 Generated with [Claude Code](https://claude.ai/code)

View File

@@ -1,177 +0,0 @@
name: Auto Fix CI Failures (Inline)
on:
workflow_run:
workflows: ["CI"]
types:
- completed
permissions:
contents: write
pull-requests: write
actions: read
issues: write
jobs:
auto-fix:
if: |
github.event.workflow_run.conclusion == 'failure' &&
github.event.workflow_run.name != 'Auto Fix CI Failures' &&
github.event.workflow_run.name != 'Auto Fix CI Failures (Inline)'
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.event.workflow_run.head_branch }}
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup git
run: |
git config --global user.name "claude[bot]"
git config --global user.email "198276+claude[bot]@users.noreply.github.com"
- name: Create fix branch
id: branch
run: |
BRANCH_NAME="claude-auto-fix-ci-${{ github.event.workflow_run.head_branch }}-${{ github.run_id }}"
git checkout -b "$BRANCH_NAME"
echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT
- name: Get CI failure details
id: failure_details
uses: actions/github-script@v7
with:
script: |
const run = await github.rest.actions.getWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{ github.event.workflow_run.id }}
});
const jobs = await github.rest.actions.listJobsForWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{ github.event.workflow_run.id }}
});
const failedJobs = jobs.data.jobs.filter(job => job.conclusion === 'failure');
let errorLogs = [];
for (const job of failedJobs) {
const logs = await github.rest.actions.downloadJobLogsForWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
job_id: job.id
});
errorLogs.push({
jobName: job.name,
logs: logs.data
});
}
return {
runUrl: run.data.html_url,
failedJobs: failedJobs.map(j => j.name),
errorLogs: errorLogs
};
- name: Fix CI failures with Claude
uses: anthropics/claude-code-action@v1-dev
with:
prompt: |
You are tasked with analyzing CI failure logs and fixing the issues. Follow these steps:
## Context Provided
Failed CI Run: ${{ fromJSON(steps.failure_details.outputs.result).runUrl }}
Failed Jobs: ${{ join(fromJSON(steps.failure_details.outputs.result).failedJobs, ', ') }}
Error logs:
${{ toJSON(fromJSON(steps.failure_details.outputs.result).errorLogs) }}
## Step 1: Analyze the Failure
Parse the provided CI failure information to understand:
- Which jobs failed and why
- The specific error messages and stack traces
- Whether failures are test-related, build-related, or linting issues
## Step 2: Search and Understand the Codebase
Use search tools to locate the failing code:
- Search for the failing test names or functions
- Find the source files mentioned in error messages
- Review related configuration files (package.json, tsconfig.json, etc.)
## Step 3: Apply Targeted Fixes
Make minimal, focused changes:
- **For test failures**: Determine if the test or implementation needs fixing
- **For type errors**: Fix type definitions or correct the code logic
- **For linting issues**: Apply formatting using the project's tools
- **For build errors**: Resolve dependency or configuration issues
- **For missing imports**: Add the necessary imports or install packages
Requirements:
- Only fix the actual CI failures, avoid unrelated changes
- Follow existing code patterns and conventions
- Ensure changes are production-ready, not temporary hacks
- Preserve existing functionality while fixing issues
## Step 4: Commit Changes
After applying ALL fixes:
1. Stage all modified files with `git add -A`
2. Commit with: `git commit -m "Fix CI failures: prettier formatting and syntax errors"`
3. Important: You MUST commit your changes - the branch already exists
## Step 5: Verify Fixes Locally
Run available verification commands:
- Execute the failing tests locally to confirm they pass
- Run the project's lint command (check package.json for scripts)
- Run type checking if available
- Execute any build commands to ensure compilation succeeds
## Important Guidelines
- Focus exclusively on fixing the reported CI failures
- Maintain code quality and follow the project's established patterns
- If a fix requires significant refactoring, document why it's necessary
- When multiple solutions exist, choose the simplest one that maintains code quality
Begin by analyzing the failure details provided above.
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
timeout_minutes: "30"
use_sticky_comment: "true"
use_commit_signing: "true"
allowed_tools: "Edit,MultiEdit,Write,Read,Glob,Grep,LS,Bash,mcp__github_file_ops__commit_files,mcp__github_file_ops__delete_files"
claude_args: "--max-turns 15"
- name: Push fix branch
if: success()
run: |
git push origin ${{ steps.branch.outputs.branch_name }}
- name: Create pull request comment
if: success()
uses: actions/github-script@v7
with:
script: |
const branchName = '${{ steps.branch.outputs.branch_name }}';
const baseBranch = '${{ github.event.workflow_run.head_branch }}';
const prUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/compare/${baseBranch}...${branchName}?quick_pull=1`;
const issueNumber = ${{ github.event.workflow_run.pull_requests[0] && github.event.workflow_run.pull_requests[0].number || 'null' }};
if (issueNumber) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
body: `## 🤖 CI Auto-Fix Available\n\nClaude has analyzed the CI failures and prepared fixes.\n\n[**→ Create pull request to fix CI**](${prUrl})\n\n_This fix was generated automatically based on the [failed CI run](${{ fromJSON(steps.failure_details.outputs.result).runUrl }})._`
});
}

View File

@@ -1,119 +0,0 @@
name: Auto Fix CI Failures
on:
workflow_run:
workflows: ["CI"]
types:
- completed
permissions:
contents: write
pull-requests: write
actions: read
issues: write
jobs:
auto-fix:
if: |
github.event.workflow_run.conclusion == 'failure' &&
github.event.workflow_run.name != 'Auto Fix CI Failures'
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.event.workflow_run.head_branch }}
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup git
run: |
git config --global user.name "claude[bot]"
git config --global user.email "198276+claude[bot]@users.noreply.github.com"
- name: Create fix branch
id: branch
run: |
BRANCH_NAME="claude-auto-fix-ci-${{ github.event.workflow_run.head_branch }}-${{ github.run_id }}"
git checkout -b "$BRANCH_NAME"
echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT
- name: Get CI failure details
id: failure_details
uses: actions/github-script@v7
with:
script: |
const run = await github.rest.actions.getWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{ github.event.workflow_run.id }}
});
const jobs = await github.rest.actions.listJobsForWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{ github.event.workflow_run.id }}
});
const failedJobs = jobs.data.jobs.filter(job => job.conclusion === 'failure');
let errorLogs = [];
for (const job of failedJobs) {
const logs = await github.rest.actions.downloadJobLogsForWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
job_id: job.id
});
errorLogs.push({
jobName: job.name,
logs: logs.data
});
}
return {
runUrl: run.data.html_url,
failedJobs: failedJobs.map(j => j.name),
errorLogs: errorLogs
};
- name: Fix CI failures with Claude
uses: anthropics/claude-code-action@v1-dev
with:
prompt: |
/fix-ci-commit Failed CI Run: ${{ fromJSON(steps.failure_details.outputs.result).runUrl }}
Failed Jobs: ${{ join(fromJSON(steps.failure_details.outputs.result).failedJobs, ', ') }}
Error logs:
${{ toJSON(fromJSON(steps.failure_details.outputs.result).errorLogs) }}
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
timeout_minutes: "30"
use_sticky_comment: "true"
use_commit_signing: "true"
allowed_tools: "Edit,MultiEdit,Write,Read,Glob,Grep,LS,Bash,mcp__github_file_ops__commit_files,mcp__github_file_ops__delete_files"
claude_args: "--max-turns 15"
- name: Push fix branch
if: success()
run: |
git push origin ${{ steps.branch.outputs.branch_name }}
- name: Create pull request comment
if: success()
uses: actions/github-script@v7
with:
script: |
const branchName = '${{ steps.branch.outputs.branch_name }}';
const baseBranch = '${{ github.event.workflow_run.head_branch }}';
const prUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/compare/${baseBranch}...${branchName}?quick_pull=1`;
const issueNumber = ${{ github.event.workflow_run.pull_requests[0] && github.event.workflow_run.pull_requests[0].number || 'null' }};
if (issueNumber) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
body: `## 🤖 CI Auto-Fix Available\n\nClaude has analyzed the CI failures and prepared fixes.\n\n[**→ Create pull request to fix CI**](${prUrl})\n\n_This fix was generated automatically based on the [failed CI run](${{ fromJSON(steps.failure_details.outputs.result).runUrl }})._`
});
}

View File

@@ -2,7 +2,7 @@ name: Auto review PRs
on:
pull_request:
types: [opened]
types: [opened, synchronize]
jobs:
auto-review:
@@ -18,16 +18,21 @@ jobs:
fetch-depth: 1
- name: Auto review PR
uses: anthropics/claude-code-action@v1-dev
uses: ./
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
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
- 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)
- 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 }}
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

@@ -1,26 +0,0 @@
name: Auto Review PRs
on:
pull_request:
types: [opened, synchronize]
jobs:
auto-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
issues: write
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Auto review PR
uses: anthropics/claude-code-action@v1-dev
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: /review

View File

@@ -31,13 +31,9 @@ jobs:
- name: Run Claude Code
id: claude
uses: janeapp/claude-code-action@main
uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
allowed_tools: "Bash(bun install),Bash(bun test:*),Bash(bun run format),Bash(bun typecheck)"
custom_instructions: "You have also been granted tools for editing files and running bun commands (install, run, test, typecheck) for testing your changes: bun install, bun test, bun run format, bun typecheck."
model: "claude-opus-4-1-20250805"
# Testing PR 411 - sticky comment customization
use_sticky_comment: true
sticky_comment_app_bot_id: "209825114"
sticky_comment_app_bot_name: "claude"

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 (Final Test)
# 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

@@ -81,10 +81,6 @@ inputs:
description: "Enable commit signing using GitHub's commit signature verification. When false, Claude uses standard git commands"
required: false
default: "false"
allowed_tools:
description: "Comma-separated list of tools to allow Claude to use (e.g., 'Edit,MultiEdit,Write,Read'). If not set, mode defaults apply."
required: false
default: ""
experimental_allowed_domains:
description: "Restrict network access to these domains only (newline-separated). If not set, no restrictions are applied. Provider domains are auto-detected."
required: false
@@ -134,7 +130,6 @@ runs:
ADDITIONAL_PERMISSIONS: ${{ inputs.additional_permissions }}
CLAUDE_ARGS: ${{ inputs.claude_args }}
MCP_CONFIG: ${{ inputs.mcp_config }}
ALLOWED_TOOLS: ${{ inputs.allowed_tools }}
- name: Install Base Action Dependencies
if: steps.prepare.outputs.contains_trigger == 'true'

View File

@@ -79,37 +79,4 @@ export async function setupClaudeCodeSettings(
console.log(`Slash commands directory not found or error copying: ${e}`);
}
}
// Copy subagent files from repository to Claude's agents directory
// CLAUDE_WORKING_DIR is set by the action to point to the repo being processed
const workingDir = process.env.CLAUDE_WORKING_DIR || process.cwd();
const repoAgentsDir = `${workingDir}/.claude/agents`;
const targetAgentsDir = `${home}/.claude/agents`;
try {
const agentsDirExists = await $`test -d ${repoAgentsDir}`.quiet().nothrow();
if (agentsDirExists.exitCode === 0) {
console.log(`Found subagents directory at ${repoAgentsDir}`);
// Create target agents directory if it doesn't exist
await $`mkdir -p ${targetAgentsDir}`.quiet();
console.log(`Created target agents directory at ${targetAgentsDir}`);
// Copy all .md files from repo agents to Claude's agents directory
const copyResult = await $`cp -r ${repoAgentsDir}/*.md ${targetAgentsDir}/ 2>/dev/null`.quiet().nothrow();
if (copyResult.exitCode === 0) {
// List copied agents for logging
const agents = await $`ls -la ${targetAgentsDir}/*.md 2>/dev/null | wc -l`.quiet().text();
const agentCount = parseInt(agents.trim()) || 0;
console.log(`Successfully copied ${agentCount} subagent(s) to ${targetAgentsDir}`);
} else {
console.log(`No subagent files found in ${repoAgentsDir}`);
}
} else {
console.log(`No subagents directory found at ${repoAgentsDir}`);
}
} catch (e) {
console.log(`Error handling subagents: ${e}`);
}
}

View File

@@ -1,54 +0,0 @@
---
description: Fix CI failures and commit changes (for use when branch already exists)
allowed_tools: "*"
---
# Fix CI Failures and Commit
You are on a branch that was created to fix CI failures. Your task is to fix the issues and commit the changes.
## CI Failure Information
$ARGUMENTS
## Your Tasks
1. **Analyze the failures** - Understand what went wrong from the logs
2. **Fix the issues** - Make the necessary code changes
3. **Commit your fixes** - Use git to commit all changes
## Step-by-Step Instructions
### 1. Fix the Issues
Based on the error logs:
- Fix syntax errors
- Fix formatting issues
- Fix test failures
- Fix any other CI problems
### 2. Commit Your Changes (REQUIRED)
After fixing ALL issues, you MUST:
Use the `mcp__github_file_ops__commit_files` tool to commit all your changes with a descriptive message like:
```
Fix CI failures
- Fixed syntax errors
- Fixed formatting issues
- Fixed test failures
[List actual fixes made]
```
**IMPORTANT**: You MUST use the MCP file ops tool to commit your changes. The workflow expects you to commit your changes.
### 3. Verify (Optional)
If possible, run verification commands:
- `bun run format:check` for formatting
- `bun test` for tests
- `bun run typecheck` for TypeScript
Begin by analyzing the failure logs and then fix the issues.

View File

@@ -1,67 +0,0 @@
---
description: Analyze and fix CI failures by examining logs and making targeted fixes
allowed_tools: "*"
---
# Fix CI Failures
You are tasked with analyzing CI failure logs and fixing the issues. Follow these steps:
## Context Provided
$ARGUMENTS
## Step 1: Analyze the Failure
Parse the provided CI failure information to understand:
- Which jobs failed and why
- The specific error messages and stack traces
- Whether failures are test-related, build-related, or linting issues
## Step 2: Search and Understand the Codebase
Use search tools to locate the failing code:
- Search for the failing test names or functions
- Find the source files mentioned in error messages
- Review related configuration files (package.json, tsconfig.json, etc.)
## Step 3: Apply Targeted Fixes
Make minimal, focused changes:
- **For test failures**: Determine if the test or implementation needs fixing
- **For type errors**: Fix type definitions or correct the code logic
- **For linting issues**: Apply formatting using the project's tools
- **For build errors**: Resolve dependency or configuration issues
- **For missing imports**: Add the necessary imports or install packages
Requirements:
- Only fix the actual CI failures, avoid unrelated changes
- Follow existing code patterns and conventions
- Ensure changes are production-ready, not temporary hacks
- Preserve existing functionality while fixing issues
## Step 4: Commit Changes
After applying fixes:
1. Use the `mcp__github_file_ops__commit_files` tool to commit your changes
2. Include a descriptive commit message explaining what was fixed
3. Document which CI jobs/tests were addressed in the commit message
4. Important: Use the MCP file ops tool to commit your changes
## Step 5: Verify Fixes Locally
Run available verification commands:
- Execute the failing tests locally to confirm they pass
- Run the project's lint command (check package.json for scripts)
- Run type checking if available
- Execute any build commands to ensure compilation succeeds
## Important Guidelines
- Focus exclusively on fixing the reported CI failures
- Maintain code quality and follow the project's established patterns
- If a fix requires significant refactoring, document why it's necessary
- When multiple solutions exist, choose the simplest one that maintains code quality
- Add clear comments only if the fix is non-obvious
Begin by analyzing the failure details provided above.

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, githubToken }: ModeOptions): Promise<ModeResult> {
async prepare({ context, githubToken, octokit }: ModeOptions): Promise<ModeResult> {
// Agent mode handles automation events and any event with explicit prompts
// TODO: handle by createPrompt (similar to tag and review modes)
console.log(`Agent mode: githubToken provided: ${!!githubToken}, length: ${githubToken?.length || 0}`);
// 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,12 +115,12 @@ 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",
@@ -75,33 +130,54 @@ export const agentMode: Mode = {
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,
},
},
},
};
// Add GitHub file ops server when using commit signing
if (context.inputs?.useCommitSigning) {
mcpConfig.mcpServers["github-file-ops-server"] = {
// 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-file-ops-server.ts`,
`${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,
BRANCH_NAME: "", // Agent mode doesn't pre-create branches
BASE_BRANCH: "",
REPO_DIR: process.env.GITHUB_WORKSPACE || process.cwd(),
GITHUB_EVENT_NAME: process.env.GITHUB_EVENT_NAME || "",
IS_PR: "false", // Agent mode doesn't create PRs by default
GITHUB_API_URL:
process.env.GITHUB_API_URL || "https://api.github.com",
PR_NUMBER: prNumber.toString(),
GITHUB_API_URL: process.env.GITHUB_API_URL || "https://api.github.com",
},
};
}
@@ -124,23 +200,12 @@ export const agentMode: Mode = {
}
}
// Agent mode: pass through user's claude_args with MCP config and allowed_tools
// Agent mode: pass through user's claude_args with MCP config
const userClaudeArgs = process.env.CLAUDE_ARGS || "";
const userAllowedTools = process.env.ALLOWED_TOOLS || "";
const escapedMcpConfig = JSON.stringify(mcpConfig).replace(/'/g, "'\\''");
let claudeArgs = `--mcp-config '${escapedMcpConfig}'`;
// Add allowed_tools if specified
if (userAllowedTools) {
claudeArgs += ` --allowedTools "${userAllowedTools}"`;
}
// Add user's additional claude_args
if (userClaudeArgs) {
claudeArgs += ` ${userClaudeArgs}`;
}
core.setOutput("claude_args", claudeArgs.trim());
const claudeArgs =
`--mcp-config '${escapedMcpConfig}' ${userClaudeArgs}`.trim();
core.setOutput("claude_args", claudeArgs);
return {
commentId: undefined,

View File

@@ -1,13 +0,0 @@
// This file intentionally has TypeScript errors to trigger CI failure
// Testing auto-fix with MCP file ops enabled
const testFunction = (param: string): number => {
// Type error: returning string instead of number
return "this should be a number";
}
// Syntax error: missing closing brace
function brokenFunction() {
console.log("missing closing brace"
}
export { testFunction, brokenFunction };