From ce7b4838e161086b6d8b2f35bb4f9ee1e31ebc3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Mon, 2 Feb 2026 13:51:33 +0100 Subject: [PATCH] fix: move Claude allowed tools to claude_args (#17625) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - `allowed_tools` is not a valid input for `claude-code-action@v1` — it was silently ignored (visible as a warning in CI logs) - This caused Claude to lack file write permissions, preventing it from making actual code changes - Move the tools list into `claude_args` as `--allowedTools` where it's actually parsed ## Test plan - [ ] Trigger `@claude` on a cross-repo issue requesting a code change — verify it can edit files and create a PR 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.5 --- .github/workflows/claude.yml | 85 +++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 4b7585af600..dd26583c5bb 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -9,11 +9,13 @@ on: types: [submitted] issues: types: [opened, assigned] + discussion_comment: + types: [created] repository_dispatch: types: [claude-core-team-issues] concurrency: - group: ${{ github.workflow }}-${{ github.event.issue.number || github.event.pull_request.number || github.event.client_payload.issue_number }} + group: ${{ github.workflow }}-${{ github.event.issue.number || github.event.pull_request.number || github.event.client_payload.issue_number || github.event.discussion.number }} cancel-in-progress: true jobs: @@ -59,8 +61,7 @@ jobs: uses: anthropics/claude-code-action@v1 with: claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} - claude_args: "--max-turns 50 --model opus" - allowed_tools: "Edit,Write,Bash(bash packages/twenty-utils/setup-dev-env.sh),Bash(npx nx *),Bash(npx jest *),Bash(yarn *),Bash(git *),Bash(gh *),Bash(sed *),Bash(python3 *),WebFetch" + claude_args: '--max-turns 50 --model opus --allowedTools "Edit,Write,WebFetch,Bash(bash packages/twenty-utils/setup-dev-env.sh),Bash(npx nx *),Bash(npx jest *),Bash(yarn *),Bash(git *),Bash(gh *),Bash(sed *),Bash(python3 *)"' settings: | { "env": { @@ -68,6 +69,81 @@ jobs: } } + claude-discussion: + if: | + github.event_name == 'discussion_comment' && contains(github.event.comment.body, '@claude') + runs-on: ubuntu-latest + timeout-minutes: 60 + permissions: + contents: write + pull-requests: write + issues: write + id-token: write + discussions: write + 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 prompt from discussion + id: prompt + uses: actions/github-script@v7 + with: + script: | + const discussion = context.payload.discussion; + const comment = context.payload.comment; + const prompt = `You are responding to a comment on discussion #${discussion.number} ("${discussion.title}") in the ${context.repo.owner}/${context.repo.repo} repository.\n\nThe comment by @${comment.user.login} says:\n\n${comment.body}\n\nDiscussion body:\n\n${discussion.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('discussion_node_id', discussion.node_id); + - 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 }} + claude_args: '--max-turns 50 --model opus --allowedTools "Edit,Write,WebFetch,Bash(bash packages/twenty-utils/setup-dev-env.sh),Bash(npx nx *),Bash(npx jest *),Bash(yarn *),Bash(git *),Bash(gh *),Bash(sed *),Bash(python3 *)"' + settings: | + { + "env": { + "PG_DATABASE_URL": "postgres://postgres:postgres@localhost:5432/default" + } + } + - name: Post response to discussion + if: always() + uses: actions/github-script@v7 + with: + script: | + const response = `Claude finished processing this request. [See workflow run](${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId})`; + await github.graphql(` + mutation($discussionId: ID!, $body: String!) { + addDiscussionComment(input: {discussionId: $discussionId, body: $body}) { + comment { id } + } + } + `, { + discussionId: '${{ steps.prompt.outputs.discussion_node_id }}', + body: response + }); + claude-cross-repo: if: github.event_name == 'repository_dispatch' runs-on: ubuntu-latest @@ -122,8 +198,7 @@ jobs: with: claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} prompt: ${{ steps.prompt.outputs.prompt }} - claude_args: "--max-turns 50 --model opus" - allowed_tools: "Edit,Write,Bash(bash packages/twenty-utils/setup-dev-env.sh),Bash(npx nx *),Bash(npx jest *),Bash(yarn *),Bash(git *),Bash(gh *),Bash(sed *),Bash(python3 *),WebFetch" + claude_args: '--max-turns 50 --model opus --allowedTools "Edit,Write,WebFetch,Bash(bash packages/twenty-utils/setup-dev-env.sh),Bash(npx nx *),Bash(npx jest *),Bash(yarn *),Bash(git *),Bash(gh *),Bash(sed *),Bash(python3 *)"' settings: | { "env": {