diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 009c48a38c..d47c31d004 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -9,9 +9,11 @@ on: types: [submitted] issues: types: [opened, assigned] + repository_dispatch: + types: [claude-core-team-issues] concurrency: - group: ${{ github.workflow }}-${{ github.event.issue.number || github.event.pull_request.number }} + group: ${{ github.workflow }}-${{ github.event.issue.number || github.event.pull_request.number || github.event.client_payload.issue_number }} cancel-in-progress: true jobs: @@ -73,3 +75,83 @@ jobs: additional_permissions: | actions: read claude_args: "--max-turns 50" + + claude-cross-repo: + if: github.event_name == 'repository_dispatch' + runs-on: ubuntu-latest + timeout-minutes: 60 + services: + postgres: + image: postgres:16 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: postgres + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + redis: + image: redis + ports: + - 6379:6379 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Install dependencies + uses: ./.github/actions/yarn-install + - name: Build shared dependencies + run: | + npx nx build twenty-shared + npx nx build twenty-emails + - name: Setup env files + run: | + npx nx reset:env twenty-front + npx nx reset:env twenty-server + - name: Create databases + run: | + PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d postgres -c 'CREATE DATABASE "default";' + PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d postgres -c 'CREATE DATABASE "test";' + - name: Build prompt from dispatch payload + id: prompt + uses: actions/github-script@v7 + with: + script: | + const p = context.payload.client_payload; + let prompt; + if (p.comment_body) { + prompt = `You are responding to a comment on issue #${p.issue_number} ("${p.issue_title}") in the ${p.repo_full_name} repository.\n\nThe comment by @${p.sender} says:\n\n${p.comment_body}\n\nIssue body:\n\n${p.issue_body}\n\nPlease help with this request. The code you are working with is the twenty codebase (this repository).`; + } else { + prompt = `You are responding to issue #${p.issue_number} ("${p.issue_title}") in the ${p.repo_full_name} repository, opened by @${p.sender}.\n\nIssue body:\n\n${p.issue_body}\n\nPlease help with this request. The code you are working with is the twenty codebase (this repository).`; + } + core.setOutput('prompt', prompt); + core.setOutput('repo', p.repo_full_name); + core.setOutput('issue_number', p.issue_number); + - name: Run Claude Code + id: claude + uses: anthropics/claude-code-action@v1 + with: + claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + prompt: ${{ steps.prompt.outputs.prompt }} + additional_permissions: | + actions: read + claude_args: "--max-turns 50" + - name: Post response to source issue + if: always() + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.TWENTY_DISPATCH_TOKEN }} + script: | + const [owner, repo] = '${{ steps.prompt.outputs.repo }}'.split('/'); + const issueNumber = parseInt('${{ steps.prompt.outputs.issue_number }}', 10); + + await github.rest.issues.createComment({ + owner, + repo, + issue_number: issueNumber, + body: `Claude finished processing this request. [See workflow run](${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId})` + });