name: Claude Code Assistant on: issues: types: [opened, labeled] issue_comment: types: [created] jobs: claude-code: if: >- (github.event_name == 'issues' && contains(toJSON(github.event.issue.labels), 'claude')) || (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Run Claude on Issue env: GIT_TOKEN: ${{ secrets.GIT_TOKEN }} run: | set -x # Only set ANTHROPIC_API_KEY if the secret is configured if [ -n "${{ secrets.ANTHROPIC_API_KEY }}" ]; then export ANTHROPIC_API_KEY="${{ secrets.ANTHROPIC_API_KEY }}" fi # Debug info echo "Running as: $(whoami)" echo "Home: $HOME" echo "Claude version: $(claude --version 2>&1)" echo "Working dir: $(pwd)" ls -la # Configure git git config user.name "Claude Bot" git config user.email "claude@localhost" git remote set-url origin "http://admin:${GIT_TOKEN}@localhost:3000/${{ github.repository }}.git" # Extract issue info ISSUE_NUMBER="${{ github.event.issue.number }}" ISSUE_TITLE="${{ github.event.issue.title }}" REPO="${{ github.repository }}" # Fetch issue body via API ISSUE_BODY=$(curl -s "http://localhost:3000/api/v1/repos/${REPO}/issues/${ISSUE_NUMBER}" \ -H "Authorization: token ${GIT_TOKEN}" | python3 -c "import sys,json; print(json.load(sys.stdin).get('body',''))") echo "Issue: #${ISSUE_NUMBER} - ${ISSUE_TITLE}" echo "Body: ${ISSUE_BODY}" # Get comment body if triggered by comment COMMENT_BODY="" if [ "${{ github.event_name }}" = "issue_comment" ]; then COMMENT_ID="${{ github.event.comment.id }}" COMMENT_BODY=$(curl -s "http://localhost:3000/api/v1/repos/${REPO}/issues/comments/${COMMENT_ID}" \ -H "Authorization: token ${GIT_TOKEN}" | python3 -c "import sys,json; print(json.load(sys.stdin).get('body',''))") fi # Create working branch BRANCH="claude/issue-${ISSUE_NUMBER}" git checkout -b "${BRANCH}" # Post status comment curl -s -X POST "http://localhost:3000/api/v1/repos/${REPO}/issues/${ISSUE_NUMBER}/comments" \ -H "Authorization: token ${GIT_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"body\": \"Claude is working on this issue...\"}" # Run Claude Code CLAUDE_OUTPUT=$(claude -p "You are working on the repository ${REPO}. A Gitea issue needs your attention: Issue #${ISSUE_NUMBER}: ${ISSUE_TITLE} Description: ${ISSUE_BODY} Additional context from comment: ${COMMENT_BODY} Instructions: 1. Read and understand the codebase structure 2. Implement the requested changes carefully 3. Make sure the code is correct and complete 4. Commit all changes with a descriptive commit message You are on branch ${BRANCH}. Work in the current directory." \ --allowedTools "Bash,Read,Edit,Write,Glob,Grep" \ --mcp-config /home/claude-runner/.claude/mcp-gitea.json \ --max-turns 50 \ --permission-mode bypassPermissions \ --output-format text 2>&1) || true echo "=== CLAUDE OUTPUT START ===" echo "${CLAUDE_OUTPUT}" echo "=== CLAUDE OUTPUT END ===" # Also save to a persistent location for debugging echo "${CLAUDE_OUTPUT}" > /home/claude-runner/last-claude-output.txt # Stage any remaining unstaged changes git add -A echo "=== GIT STATUS ===" git status echo "=== GIT DIFF ===" git diff --cached --stat # Check if there are changes if ! git diff --cached --quiet 2>/dev/null; then git commit -m "Claude: Address issue #${ISSUE_NUMBER} - ${ISSUE_TITLE}" git push origin "${BRANCH}" # Create PR PR_RESPONSE=$(curl -s -X POST "http://localhost:3000/api/v1/repos/${REPO}/pulls" \ -H "Authorization: token ${GIT_TOKEN}" \ -H "Content-Type: application/json" \ -d "{ \"title\": \"Claude: Fix #${ISSUE_NUMBER} - ${ISSUE_TITLE}\", \"body\": \"Automated PR by Claude Code for issue #${ISSUE_NUMBER}\n\nCloses #${ISSUE_NUMBER}\", \"head\": \"${BRANCH}\", \"base\": \"main\" }") PR_URL=$(echo "${PR_RESPONSE}" | python3 -c "import sys,json; print(json.load(sys.stdin).get('html_url',''))" 2>/dev/null || echo "unknown") curl -s -X POST "http://localhost:3000/api/v1/repos/${REPO}/issues/${ISSUE_NUMBER}/comments" \ -H "Authorization: token ${GIT_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"body\": \"Claude has created a pull request: ${PR_URL}\"}" else echo "No changes detected by Claude" curl -s -X POST "http://localhost:3000/api/v1/repos/${REPO}/issues/${ISSUE_NUMBER}/comments" \ -H "Authorization: token ${GIT_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"body\": \"Claude reviewed the issue but made no code changes.\"}" fi