diff --git a/examples/auto-fix-ci-signed/auto-fix-ci-signed.yml b/examples/auto-fix-ci-signed/auto-fix-ci-signed.yml new file mode 100644 index 0000000..a6c6c4e --- /dev/null +++ b/examples/auto-fix-ci-signed/auto-fix-ci-signed.yml @@ -0,0 +1,98 @@ +name: Auto Fix CI Failures (Signed Commits) + +on: + workflow_run: + workflows: ["CI"] + types: + - completed + +permissions: + contents: write + pull-requests: write + actions: read + issues: write + id-token: write # Required for OIDC token exchange + +jobs: + auto-fix-signed: + if: | + github.event.workflow_run.conclusion == 'failure' && + github.event.workflow_run.pull_requests[0] && + !startsWith(github.event.workflow_run.head_branch, 'claude-auto-fix-ci-signed-') + 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: Generate fix branch name + id: branch + run: | + BRANCH_NAME="claude-auto-fix-ci-signed-${{ github.event.workflow_run.head_branch }}-${{ github.run_id }}" + echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT + # Don't create branch locally - MCP tools will create it via API + echo "Generated branch name: $BRANCH_NAME (will be created by MCP tools)" + + - 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 (Signed Commits) + id: claude + uses: anthropics/claude-code-action@v1-dev + env: + CLAUDE_BRANCH: ${{ steps.branch.outputs.branch_name }} + BASE_BRANCH: ${{ github.event.workflow_run.head_branch }} + with: + prompt: | + /fix-ci-signed + Failed CI Run: ${{ fromJSON(steps.failure_details.outputs.result).runUrl }} + Failed Jobs: ${{ join(fromJSON(steps.failure_details.outputs.result).failedJobs, ', ') }} + PR Number: ${{ github.event.workflow_run.pull_requests[0].number }} + Branch Name: ${{ steps.branch.outputs.branch_name }} + Base Branch: ${{ github.event.workflow_run.head_branch }} + Repository: ${{ github.repository }} + + Error logs: + ${{ toJSON(fromJSON(steps.failure_details.outputs.result).errorLogs) }} + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} + timeout_minutes: "30" + use_commit_signing: true + claude_args: "--allowedTools 'Edit,MultiEdit,Write,Read,Glob,Grep,LS,Bash(bun:*),Bash(npm:*),Bash(npx:*),Bash(gh:*),mcp__github_file_ops__commit_files,mcp__github_file_ops__delete_files'" diff --git a/examples/auto-fix-ci-signed/commands/fix-ci-signed.md b/examples/auto-fix-ci-signed/commands/fix-ci-signed.md new file mode 100644 index 0000000..f22b367 --- /dev/null +++ b/examples/auto-fix-ci-signed/commands/fix-ci-signed.md @@ -0,0 +1,148 @@ +--- +description: Analyze and fix CI failures with signed commits using MCP tools +allowed_tools: Edit,MultiEdit,Write,Read,Glob,Grep,LS,Bash(bun:*),Bash(npm:*),Bash(npx:*),Bash(gh:*),mcp__github_file_ops__commit_files,mcp__github_file_ops__delete_files +--- + +# Fix CI Failures with Signed Commits + +You are tasked with analyzing CI failure logs and fixing the issues using MCP tools for signed commits. Follow these steps: + +## Context Provided + +$ARGUMENTS + +## Important Context Information + +Look for these key pieces of information in the arguments: + +- **Failed CI Run URL**: Link to the failed CI run +- **Failed Jobs**: List of jobs that failed +- **PR Number**: The PR number to comment on +- **Branch Name**: The fix branch you're working on +- **Base Branch**: The original PR branch +- **Error logs**: Detailed logs from failed jobs + +## CRITICAL: Use MCP Tools for Git Operations + +**IMPORTANT**: You MUST use MCP tools for all git operations to ensure commits are properly signed. DO NOT use `git` commands directly via Bash. + +- Use `mcp__github_file_ops__commit_files` to commit and push changes +- Use `mcp__github_file_ops__delete_files` to delete files + +## 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 MCP search tools to locate the failing code: + +- Use `mcp_github_file_ops_server__search_files` or `mcp_github_file_ops_server__file_search` to find failing test names or functions +- Use `mcp_github_file_ops_server__read_file` to read 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: Verify Fixes Locally + +Run available verification commands using Bash: + +- 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 + +## Step 5: Commit and Push Changes Using MCP + +**CRITICAL**: You MUST use MCP tools for committing and pushing: + +1. Prepare all your file changes (using Edit/MultiEdit/Write tools as needed) +2. **Use `mcp__github_file_ops__commit_files` to commit and push all changes** + - Pass the file paths you've edited in the `files` array + - Set `message` to describe the specific fixes (e.g., "Fix CI failures: remove syntax errors and format code") + - The MCP tool will automatically create the branch specified in "Branch Name:" from the context and push signed commits + +**IMPORTANT**: The MCP tool will create the branch from the context automatically. The branch name from "Branch Name:" in the context will be used. + +Example usage: + +``` +mcp__github_file_ops__commit_files with: +- files: ["src/utils/retry.ts", "src/other/file.ts"] // List of file paths you edited +- message: "Fix CI failures: [describe specific fixes]" +``` + +Note: The branch will be created from the Base Branch specified in the context. + +## Step 6: Create PR Comment (REQUIRED - DO NOT SKIP) + +**CRITICAL: You MUST create a PR comment after pushing. This step is MANDATORY.** + +After successfully pushing the fixes, you MUST create a comment on the original PR to notify about the auto-fix. DO NOT end the task without completing this step. + +1. Extract the PR number from the context provided in arguments (look for "PR Number:" in the context) +2. **MANDATORY**: Execute the gh CLI command below to create the comment +3. Verify the comment was created successfully + +**YOU MUST RUN THIS COMMAND** (replace placeholders with actual values from context): + +```bash +gh pr comment PR_NUMBER --body "## 🤖 CI Auto-Fix Available (Signed Commits) + +Claude has analyzed the CI failures and prepared fixes with signed commits. + +[**→ Create pull request to fix CI**](https://github.com/OWNER/REPO/compare/BASE_BRANCH...FIX_BRANCH?quick_pull=1) + +_This fix was generated automatically based on the [failed CI run](FAILED_CI_RUN_URL)._" +``` + +**IMPORTANT REPLACEMENTS YOU MUST MAKE:** + +- Replace `PR_NUMBER` with the actual PR number from "PR Number:" in context +- Replace `OWNER/REPO` with the repository from "Repository:" in context +- Replace `BASE_BRANCH` with the branch from "Base Branch:" in context +- Replace `FIX_BRANCH` with the branch from "Branch Name:" in context +- Replace `FAILED_CI_RUN_URL` with the URL from "Failed CI Run:" in context + +**DO NOT SKIP THIS STEP. The task is NOT complete until the PR comment is created.** + +## Step 7: Final Verification + +**BEFORE CONSIDERING THE TASK COMPLETE**, verify you have: + +1. ✅ Fixed all CI failures +2. ✅ Committed the changes using `mcp_github_file_ops_server__push_files` +3. ✅ Verified the branch was pushed successfully +4. ✅ **CREATED THE PR COMMENT using `gh pr comment` command from Step 6** + +If you have NOT created the PR comment, go back to Step 6 and execute the command. + +## Important Guidelines + +- Always use MCP tools for git operations to ensure proper commit signing +- 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 +- **THE TASK IS NOT COMPLETE WITHOUT THE PR COMMENT** + +Begin by analyzing the failure details provided above. diff --git a/examples/auto-fix-ci/auto-fix-ci.yml b/examples/auto-fix-ci/auto-fix-ci.yml new file mode 100644 index 0000000..87b5369 --- /dev/null +++ b/examples/auto-fix-ci/auto-fix-ci.yml @@ -0,0 +1,98 @@ +name: Auto Fix CI Failures + +on: + workflow_run: + workflows: ["CI"] + types: + - completed + +permissions: + contents: write + pull-requests: write + actions: read + issues: write + id-token: write # Required for OIDC token exchange + +jobs: + auto-fix: + if: | + github.event.workflow_run.conclusion == 'failure' && + github.event.workflow_run.pull_requests[0] && + !startsWith(github.event.workflow_run.head_branch, 'claude-auto-fix-ci-') + 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 identity + run: | + git config --global user.email "claude[bot]@users.noreply.github.com" + git config --global user.name "claude[bot]" + + - 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 + id: claude + uses: anthropics/claude-code-action@v1-dev + with: + prompt: | + /fix-ci + Failed CI Run: ${{ fromJSON(steps.failure_details.outputs.result).runUrl }} + Failed Jobs: ${{ join(fromJSON(steps.failure_details.outputs.result).failedJobs, ', ') }} + PR Number: ${{ github.event.workflow_run.pull_requests[0].number }} + Branch Name: ${{ steps.branch.outputs.branch_name }} + Base Branch: ${{ github.event.workflow_run.head_branch }} + Repository: ${{ github.repository }} + + Error logs: + ${{ toJSON(fromJSON(steps.failure_details.outputs.result).errorLogs) }} + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} + timeout_minutes: "30" + claude_args: "--allowedTools 'Edit,MultiEdit,Write,Read,Glob,Grep,LS,Bash(git:*),Bash(bun:*),Bash(npm:*),Bash(npx:*),Bash(gh:*)'" diff --git a/examples/auto-fix-ci/commands/fix-ci.md b/examples/auto-fix-ci/commands/fix-ci.md new file mode 100644 index 0000000..ab26bfc --- /dev/null +++ b/examples/auto-fix-ci/commands/fix-ci.md @@ -0,0 +1,127 @@ +--- +description: Analyze and fix CI failures by examining logs and making targeted fixes +allowed_tools: Edit,MultiEdit,Write,Read,Glob,Grep,LS,Bash(git:*),Bash(bun:*),Bash(npm:*),Bash(npx:*),Bash(gh:*) +--- + +# Fix CI Failures + +You are tasked with analyzing CI failure logs and fixing the issues. Follow these steps: + +## Context Provided + +$ARGUMENTS + +## Important Context Information + +Look for these key pieces of information in the arguments: + +- **Failed CI Run URL**: Link to the failed CI run +- **Failed Jobs**: List of jobs that failed +- **PR Number**: The PR number to comment on +- **Branch Name**: The fix branch you're working on +- **Base Branch**: The original PR branch +- **Error logs**: Detailed logs from failed jobs + +## 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: 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 + +## Step 5: Commit and Push Changes + +After applying ALL fixes: + +1. Stage all modified files with `git add -A` +2. Commit with: `git commit -m "Fix CI failures: [describe specific fixes]"` +3. Document which CI jobs/tests were addressed +4. **CRITICAL**: Push the branch with `git push origin HEAD` - You MUST push the branch after committing + +## Step 6: Create PR Comment (REQUIRED - DO NOT SKIP) + +**CRITICAL: You MUST create a PR comment after pushing. This step is MANDATORY.** + +After successfully pushing the fixes, you MUST create a comment on the original PR to notify about the auto-fix. DO NOT end the task without completing this step. + +1. Extract the PR number from the context provided in arguments (look for "PR Number:" in the context) +2. **MANDATORY**: Execute the gh CLI command below to create the comment +3. Verify the comment was created successfully + +**YOU MUST RUN THIS COMMAND** (replace placeholders with actual values from context): + +```bash +gh pr comment PR_NUMBER --body "## 🤖 CI Auto-Fix Available + +Claude has analyzed the CI failures and prepared fixes. + +[**→ Create pull request to fix CI**](https://github.com/OWNER/REPO/compare/BASE_BRANCH...FIX_BRANCH?quick_pull=1) + +_This fix was generated automatically based on the [failed CI run](FAILED_CI_RUN_URL)._" +``` + +**IMPORTANT REPLACEMENTS YOU MUST MAKE:** + +- Replace `PR_NUMBER` with the actual PR number from "PR Number:" in context +- Replace `OWNER/REPO` with the repository from "Repository:" in context +- Replace `BASE_BRANCH` with the branch from "Base Branch:" in context +- Replace `FIX_BRANCH` with the branch from "Branch Name:" in context +- Replace `FAILED_CI_RUN_URL` with the URL from "Failed CI Run:" in context + +**DO NOT SKIP THIS STEP. The task is NOT complete until the PR comment is created.** + +## Step 7: Final Verification + +**BEFORE CONSIDERING THE TASK COMPLETE**, verify you have: + +1. ✅ Fixed all CI failures +2. ✅ Committed the changes +3. ✅ Pushed the branch with `git push origin HEAD` +4. ✅ **CREATED THE PR COMMENT using `gh pr comment` command from Step 6** + +If you have NOT created the PR comment, go back to Step 6 and execute the command. + +## 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 +- **THE TASK IS NOT COMPLETE WITHOUT THE PR COMMENT** + +Begin by analyzing the failure details provided above.