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: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} GIT_TOKEN: ${{ secrets.GIT_TOKEN }} run: | set -e # 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',''))") # 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...\"}" # Build the prompt PROMPT=$(cat <<'PROMPT_EOF' You are working on a code repository. A Gitea issue needs your attention. PROMPT_EOF ) PROMPT="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." # Run Claude Code in non-interactive mode claude -p "${PROMPT}" \ --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 > /tmp/claude-output.txt 2>&1 || true echo "=== Claude Output ===" cat /tmp/claude-output.txt echo "=== End Output ===" # Stage any remaining unstaged changes git add -A # Check if there are changes if ! git diff --cached --quiet 2>/dev/null || [ "$(git log origin/main..HEAD --oneline 2>/dev/null | wc -l)" -gt 0 ]; then # Commit if there are staged changes git diff --cached --quiet 2>/dev/null || git commit -m "Claude: Address issue #${ISSUE_NUMBER} - ${ISSUE_TITLE}" # Push 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 "") # Comment with PR link 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 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