name: "Claude Code Base Action" description: "Run Claude Code in GitHub Actions workflows" branding: icon: "code" color: "orange" inputs: # Claude Code arguments prompt: description: "The prompt to send to Claude Code (mutually exclusive with prompt_file)" required: false default: "" prompt_file: description: "Path to a file containing the prompt to send to Claude Code (mutually exclusive with prompt)" required: false default: "" settings: description: "Claude Code settings as JSON string or path to settings JSON file" required: false default: "" # Action settings claude_args: description: "Additional arguments to pass directly to Claude CLI (e.g., '--max-turns 3 --mcp-config /path/to/config.json')" required: false default: "" # Authentication settings anthropic_api_key: description: "Anthropic API key (required for direct Anthropic API)" required: false default: "" claude_code_oauth_token: description: "Claude Code OAuth token (alternative to anthropic_api_key)" required: false default: "" use_bedrock: description: "Use Amazon Bedrock with OIDC authentication instead of direct Anthropic API" required: false default: "false" use_vertex: description: "Use Google Vertex AI with OIDC authentication instead of direct Anthropic API" required: false default: "false" use_foundry: description: "Use Microsoft Foundry with OIDC authentication instead of direct Anthropic API" required: false default: "false" use_node_cache: description: "Whether to use Node.js dependency caching (set to true only for Node.js projects with lock files)" required: false default: "false" path_to_claude_code_executable: description: "Optional path to a custom Claude Code executable. If provided, skips automatic installation and uses this executable instead. WARNING: Using an older version may cause problems if the action begins taking advantage of new Claude Code features. This input is typically not needed unless you're debugging something specific or have unique needs in your environment." required: false default: "" path_to_bun_executable: description: "Optional path to a custom Bun executable. If provided, skips automatic Bun installation and uses this executable instead. WARNING: Using an incompatible version may cause problems if the action requires specific Bun features. This input is typically not needed unless you're debugging something specific or have unique needs in your environment." required: false default: "" show_full_output: description: "Show full JSON output from Claude Code. WARNING: This outputs ALL Claude messages including tool execution results which may contain secrets, API keys, or other sensitive information. These logs are publicly visible in GitHub Actions. Only enable for debugging in non-sensitive environments." required: false default: "false" plugins: description: "Newline-separated list of Claude Code plugin names to install (e.g., 'code-review@claude-code-plugins\nfeature-dev@claude-code-plugins')" required: false default: "" plugin_marketplaces: description: "Newline-separated list of Claude Code plugin marketplace Git URLs to install from (e.g., 'https://github.com/user/marketplace1.git\nhttps://github.com/user/marketplace2.git')" required: false default: "" outputs: conclusion: description: "Execution status of Claude Code ('success' or 'failure')" value: ${{ steps.run_claude.outputs.conclusion }} execution_file: description: "Path to the JSON file containing Claude Code execution log" value: ${{ steps.run_claude.outputs.execution_file }} structured_output: description: "JSON string containing all structured output fields when --json-schema is provided in claude_args (use fromJSON() or jq to parse)" value: ${{ steps.run_claude.outputs.structured_output }} runs: using: "composite" steps: - name: Setup Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # https://github.com/actions/setup-node/releases/tag/v4.4.0 with: node-version: ${{ env.NODE_VERSION || '18.x' }} cache: ${{ inputs.use_node_cache == 'true' && 'npm' || '' }} - name: Install Bun if: inputs.path_to_bun_executable == '' uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # https://github.com/oven-sh/setup-bun/releases/tag/v2.0.2 with: bun-version: 1.2.11 - name: Setup Custom Bun Path if: inputs.path_to_bun_executable != '' shell: bash env: PATH_TO_BUN_EXECUTABLE: ${{ inputs.path_to_bun_executable }} run: | echo "Using custom Bun executable: $PATH_TO_BUN_EXECUTABLE" # Add the directory containing the custom executable to PATH BUN_DIR=$(dirname "$PATH_TO_BUN_EXECUTABLE") echo "$BUN_DIR" >> "$GITHUB_PATH" - name: Install Dependencies shell: bash run: | cd ${GITHUB_ACTION_PATH} bun install - name: Install Claude Code shell: bash env: PATH_TO_CLAUDE_CODE_EXECUTABLE: ${{ inputs.path_to_claude_code_executable }} run: | if [ -z "$PATH_TO_CLAUDE_CODE_EXECUTABLE" ]; then CLAUDE_CODE_VERSION="2.0.62" echo "Installing Claude Code v${CLAUDE_CODE_VERSION}..." for attempt in 1 2 3; do echo "Installation attempt $attempt..." if command -v timeout &> /dev/null; then timeout 120 bash -c "curl -fsSL https://claude.ai/install.sh | bash -s -- $CLAUDE_CODE_VERSION" && break else curl -fsSL https://claude.ai/install.sh | bash -s -- "$CLAUDE_CODE_VERSION" && break fi if [ $attempt -eq 3 ]; then echo "Failed to install Claude Code after 3 attempts" exit 1 fi echo "Installation failed, retrying..." sleep 5 done echo "Claude Code installed successfully" else echo "Using custom Claude Code executable: $PATH_TO_CLAUDE_CODE_EXECUTABLE" # Add the directory containing the custom executable to PATH CLAUDE_DIR=$(dirname "$PATH_TO_CLAUDE_CODE_EXECUTABLE") echo "$CLAUDE_DIR" >> "$GITHUB_PATH" fi - name: Run Claude Code Action shell: bash id: run_claude run: | # Change to CLAUDE_WORKING_DIR if set (for running in custom directories) if [ -n "$CLAUDE_WORKING_DIR" ]; then echo "Changing directory to CLAUDE_WORKING_DIR: $CLAUDE_WORKING_DIR" cd "$CLAUDE_WORKING_DIR" fi bun run ${GITHUB_ACTION_PATH}/src/index.ts env: # Model configuration CLAUDE_CODE_ACTION: "1" INPUT_PROMPT: ${{ inputs.prompt }} INPUT_PROMPT_FILE: ${{ inputs.prompt_file }} INPUT_SETTINGS: ${{ inputs.settings }} INPUT_CLAUDE_ARGS: ${{ inputs.claude_args }} INPUT_PATH_TO_CLAUDE_CODE_EXECUTABLE: ${{ inputs.path_to_claude_code_executable }} INPUT_PATH_TO_BUN_EXECUTABLE: ${{ inputs.path_to_bun_executable }} INPUT_SHOW_FULL_OUTPUT: ${{ inputs.show_full_output }} INPUT_PLUGINS: ${{ inputs.plugins }} INPUT_PLUGIN_MARKETPLACES: ${{ inputs.plugin_marketplaces }} # Provider configuration ANTHROPIC_API_KEY: ${{ inputs.anthropic_api_key }} CLAUDE_CODE_OAUTH_TOKEN: ${{ inputs.claude_code_oauth_token }} ANTHROPIC_BASE_URL: ${{ env.ANTHROPIC_BASE_URL }} ANTHROPIC_CUSTOM_HEADERS: ${{ env.ANTHROPIC_CUSTOM_HEADERS }} # Only set provider flags if explicitly true, since any value (including "false") is truthy CLAUDE_CODE_USE_BEDROCK: ${{ inputs.use_bedrock == 'true' && '1' || '' }} CLAUDE_CODE_USE_VERTEX: ${{ inputs.use_vertex == 'true' && '1' || '' }} CLAUDE_CODE_USE_FOUNDRY: ${{ inputs.use_foundry == 'true' && '1' || '' }} # AWS configuration AWS_REGION: ${{ env.AWS_REGION }} AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }} AWS_SESSION_TOKEN: ${{ env.AWS_SESSION_TOKEN }} AWS_BEARER_TOKEN_BEDROCK: ${{ env.AWS_BEARER_TOKEN_BEDROCK }} ANTHROPIC_BEDROCK_BASE_URL: ${{ env.ANTHROPIC_BEDROCK_BASE_URL || (env.AWS_REGION && format('https://bedrock-runtime.{0}.amazonaws.com', env.AWS_REGION)) }} # GCP configuration ANTHROPIC_VERTEX_PROJECT_ID: ${{ env.ANTHROPIC_VERTEX_PROJECT_ID }} CLOUD_ML_REGION: ${{ env.CLOUD_ML_REGION }} GOOGLE_APPLICATION_CREDENTIALS: ${{ env.GOOGLE_APPLICATION_CREDENTIALS }} ANTHROPIC_VERTEX_BASE_URL: ${{ env.ANTHROPIC_VERTEX_BASE_URL }} # Microsoft Foundry configuration ANTHROPIC_FOUNDRY_RESOURCE: ${{ env.ANTHROPIC_FOUNDRY_RESOURCE }} ANTHROPIC_FOUNDRY_BASE_URL: ${{ env.ANTHROPIC_FOUNDRY_BASE_URL }} ANTHROPIC_DEFAULT_SONNET_MODEL: ${{ env.ANTHROPIC_DEFAULT_SONNET_MODEL }} ANTHROPIC_DEFAULT_HAIKU_MODEL: ${{ env.ANTHROPIC_DEFAULT_HAIKU_MODEL }} ANTHROPIC_DEFAULT_OPUS_MODEL: ${{ env.ANTHROPIC_DEFAULT_OPUS_MODEL }}