From 99ba0392bb640eb247349b0289f3387aa7d3e11b Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 9 Mar 2026 18:22:38 +0000 Subject: [PATCH] Add Claude Code workflow --- .gitea/workflows/claude.yml | 91 +++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 .gitea/workflows/claude.yml diff --git a/.gitea/workflows/claude.yml b/.gitea/workflows/claude.yml new file mode 100644 index 0000000..8efb411 --- /dev/null +++ b/.gitea/workflows/claude.yml @@ -0,0 +1,91 @@ +name: Claude Code Assistant + +on: + issues: + types: [opened, labeled] + issue_comment: + types: [created] + +jobs: + claude-code: + if: | + (github.event_name == 'issues' && + contains(github.event.issue.labels.*.name, 'claude')) || + (github.event_name == 'issue_comment' && + contains(github.event.comment.body, '@claude')) + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Configure Git + run: | + git config user.name "Claude Bot" + git config user.email "claude@localhost" + git remote set-url origin http://admin:${{ secrets.GITEA_TOKEN }}@localhost:3000/${{ github.repository }}.git + + - name: Run Claude Code + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + run: | + ISSUE_NUMBER=${{ github.event.issue.number }} + REPO=${{ github.repository }} + + # Get issue details + ISSUE_TITLE="${{ github.event.issue.title }}" + ISSUE_BODY=$(curl -s "http://localhost:3000/api/v1/repos/${REPO}/issues/${ISSUE_NUMBER}" -H "Authorization: token ${GITEA_TOKEN}" | python3 -c "import sys,json; print(json.load(sys.stdin).get('body',''))") + + # Get comment if triggered by comment + COMMENT_BODY="" + if [ "${{ github.event_name }}" = "issue_comment" ]; then + COMMENT_BODY="${{ github.event.comment.body }}" + fi + + # Create branch + BRANCH="claude/issue-${ISSUE_NUMBER}" + git checkout -b "${BRANCH}" + + # Post a "working on it" comment + curl -s -X POST "http://localhost:3000/api/v1/repos/${REPO}/issues/${ISSUE_NUMBER}/comments" -H "Authorization: token ${GITEA_TOKEN}" -H "Content-Type: application/json" -d "{"body": "🤖 Claude is working on this issue..."}" + + # Run Claude + 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: ${COMMENT_BODY} + + Instructions: + 1. Read and understand the codebase + 2. Implement the requested changes + 3. Make sure the code is correct and complete + 4. Commit all changes with a descriptive message + + Work in the current directory. The branch is already created." --allowedTools "Bash,Read,Edit,Write,Glob,Grep" --mcp-config /etc/claude/mcp-gitea.json --max-turns 50 --dangerously-skip-permissions --output-format text > /tmp/claude-output.txt 2>&1 || true + + cat /tmp/claude-output.txt + + # Check if there are changes to commit/push + if [ -n "" ] || [ "0" -gt 0 ]; then + git add -A + git diff --cached --quiet || 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 ${GITEA_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) + + # Comment on issue with PR link + curl -s -X POST "http://localhost:3000/api/v1/repos/${REPO}/issues/${ISSUE_NUMBER}/comments" -H "Authorization: token ${GITEA_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 ${GITEA_TOKEN}" -H "Content-Type: application/json" -d "{"body": "Claude reviewed the issue but made no code changes."}" + fi