diff --git a/CLAUDE.md b/CLAUDE.md index 22ad980..9f9c79a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -65,3 +65,10 @@ When adding new MCP tools: 2. **Expose to Claude**: Add the tool name to `BASE_ALLOWED_TOOLS` array in `src/create-prompt/index.ts` 3. **Tool Naming**: Follow the pattern `mcp__server_name__tool_name` (e.g., `mcp__local_git_ops__checkout_branch`) 4. **Documentation**: Update the prompt's "What You CAN Do" section if the tool adds new capabilities + +## Feature Development Reminders + +When implementing new features that add action inputs, configuration options, or capabilities: +1. Always update README.md to document new inputs in the inputs table +2. Update example workflows to show how new inputs can be used +3. Add appropriate defaults and descriptions to action.yml diff --git a/README.md b/README.md index 1713a50..d368e6d 100644 --- a/README.md +++ b/README.md @@ -64,26 +64,30 @@ jobs: with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} gitea_token: ${{ secrets.GITEA_TOKEN }} + claude_git_name: Claude # optional + claude_git_email: claude@anthropic.com # optional ``` ## Inputs -| Input | Description | Required | Default | -| --------------------- | ------------------------------------------------------------------------------------------------------------------- | -------- | --------- | +| Input | Description | Required | Default | +| --------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -------- | --------- | | `anthropic_api_key` | Anthropic API key (required for direct API, not needed for Bedrock/Vertex). Set to 'use-oauth' when using claude_credentials | No\* | - | -| `claude_credentials` | Claude OAuth credentials JSON for Claude AI Max subscription authentication | No | - | -| `direct_prompt` | Direct prompt for Claude to execute automatically without needing a trigger (for automated workflows) | No | - | -| `timeout_minutes` | Timeout in minutes for execution | No | `30` | -| `gitea_token` | Gitea token for Claude to operate with. **Only include this if you're connecting a custom GitHub app of your own!** | No | - | -| `model` | Model to use (provider-specific format required for Bedrock/Vertex) | No | - | -| `anthropic_model` | **DEPRECATED**: Use `model` instead. Kept for backward compatibility. | No | - | -| `use_bedrock` | Use Amazon Bedrock with OIDC authentication instead of direct Anthropic API | No | `false` | -| `use_vertex` | Use Google Vertex AI with OIDC authentication instead of direct Anthropic API | No | `false` | -| `allowed_tools` | Additional tools for Claude to use (the base GitHub tools will always be included) | No | "" | -| `disallowed_tools` | Tools that Claude should never use | No | "" | -| `custom_instructions` | Additional custom instructions to include in the prompt for Claude | No | "" | -| `assignee_trigger` | The assignee username that triggers the action (e.g. @claude). Only used for issue assignment | No | - | -| `trigger_phrase` | The trigger phrase to look for in comments, issue/PR bodies, and issue titles | No | `@claude` | +| `claude_credentials` | Claude OAuth credentials JSON for Claude AI Max subscription authentication | No | - | +| `direct_prompt` | Direct prompt for Claude to execute automatically without needing a trigger (for automated workflows) | No | - | +| `timeout_minutes` | Timeout in minutes for execution | No | `30` | +| `gitea_token` | Gitea token for Claude to operate with. **Only include this if you're connecting a custom GitHub app of your own!** | No | - | +| `model` | Model to use (provider-specific format required for Bedrock/Vertex) | No | - | +| `anthropic_model` | **DEPRECATED**: Use `model` instead. Kept for backward compatibility. | No | - | +| `use_bedrock` | Use Amazon Bedrock with OIDC authentication instead of direct Anthropic API | No | `false` | +| `use_vertex` | Use Google Vertex AI with OIDC authentication instead of direct Anthropic API | No | `false` | +| `allowed_tools` | Additional tools for Claude to use (the base GitHub tools will always be included) | No | "" | +| `disallowed_tools` | Tools that Claude should never use | No | "" | +| `custom_instructions` | Additional custom instructions to include in the prompt for Claude | No | "" | +| `assignee_trigger` | The assignee username that triggers the action (e.g. @claude). Only used for issue assignment | No | - | +| `trigger_phrase` | The trigger phrase to look for in comments, issue/PR bodies, and issue titles | No | `@claude` | +| `claude_git_name` | Git user.name for commits made by Claude | No | `Claude` | +| `claude_git_email` | Git user.email for commits made by Claude | No | `claude@anthropic.com` | \*Required when using direct Anthropic API (default and when not using Bedrock or Vertex) @@ -96,6 +100,7 @@ This action supports authentication using Claude Max OAuth credentials. This all ### Setup 1. **Get OAuth Credentials**: Use Claude Code to generate OAuth credentials: + ``` /auth-setup ``` @@ -107,7 +112,7 @@ This action supports authentication using Claude Max OAuth credentials. This all ```yaml - uses: anthropics/claude-code-action@beta with: - anthropic_api_key: 'use-oauth' + anthropic_api_key: "use-oauth" claude_credentials: ${{ secrets.CLAUDE_CREDENTIALS }} gitea_token: ${{ secrets.GITHUB_TOKEN }} ``` diff --git a/action.yml b/action.yml index 005f0e7..140264f 100644 --- a/action.yml +++ b/action.yml @@ -63,6 +63,14 @@ inputs: description: "Timeout in minutes for execution" required: false default: "30" + claude_git_name: + description: "Git user.name for commits made by Claude" + required: false + default: "Claude" + claude_git_email: + description: "Git user.email for commits made by Claude" + required: false + default: "claude@anthropic.com" outputs: execution_file: @@ -134,6 +142,10 @@ runs: GITHUB_TOKEN: ${{ steps.prepare.outputs.GITHUB_TOKEN }} GITEA_API_URL: ${{ env.GITHUB_SERVER_URL }} + # Git configuration + CLAUDE_GIT_NAME: ${{ inputs.claude_git_name }} + CLAUDE_GIT_EMAIL: ${{ inputs.claude_git_email }} + # Provider configuration (for future cloud provider support) ANTHROPIC_BASE_URL: ${{ env.ANTHROPIC_BASE_URL }} AWS_REGION: ${{ env.AWS_REGION }} diff --git a/src/claude/oauth-setup.ts b/src/claude/oauth-setup.ts index f9d3a41..e44f274 100644 --- a/src/claude/oauth-setup.ts +++ b/src/claude/oauth-setup.ts @@ -20,16 +20,20 @@ interface ClaudeCredentialsInput { export async function setupOAuthCredentials(credentialsJson: string) { try { // Parse the credentials JSON - const parsedCredentials: ClaudeCredentialsInput = JSON.parse(credentialsJson); - + const parsedCredentials: ClaudeCredentialsInput = + JSON.parse(credentialsJson); + if (!parsedCredentials.claudeAiOauth) { throw new Error("Invalid credentials format: missing claudeAiOauth"); } - const { accessToken, refreshToken, expiresAt } = parsedCredentials.claudeAiOauth; - + const { accessToken, refreshToken, expiresAt } = + parsedCredentials.claudeAiOauth; + if (!accessToken || !refreshToken || !expiresAt) { - throw new Error("Invalid credentials format: missing required OAuth fields"); + throw new Error( + "Invalid credentials format: missing required OAuth fields", + ); } const claudeDir = join(homedir(), ".claude"); @@ -56,4 +60,4 @@ export async function setupOAuthCredentials(credentialsJson: string) { const errorMessage = error instanceof Error ? error.message : String(error); throw new Error(`Failed to setup OAuth credentials: ${errorMessage}`); } -} \ No newline at end of file +} diff --git a/src/entrypoints/prepare.ts b/src/entrypoints/prepare.ts index 5b0d497..774e335 100644 --- a/src/entrypoints/prepare.ts +++ b/src/entrypoints/prepare.ts @@ -25,10 +25,12 @@ async function run() { // Step 1: Setup OAuth credentials if provided const claudeCredentials = process.env.CLAUDE_CREDENTIALS; const anthropicApiKey = process.env.ANTHROPIC_API_KEY; - + if (claudeCredentials && anthropicApiKey === "use-oauth") { await setupOAuthCredentials(claudeCredentials); - console.log("OAuth credentials configured for Claude AI Max subscription"); + console.log( + "OAuth credentials configured for Claude AI Max subscription", + ); } // Step 2: Setup GitHub token diff --git a/src/mcp/local-git-ops-server.ts b/src/mcp/local-git-ops-server.ts index f0d380f..4373379 100644 --- a/src/mcp/local-git-ops-server.ts +++ b/src/mcp/local-git-ops-server.ts @@ -60,15 +60,18 @@ function runGitCommand(command: string): string { // Helper function to ensure git user is configured function ensureGitUserConfigured(): void { + const gitName = process.env.CLAUDE_GIT_NAME || "Claude"; + const gitEmail = process.env.CLAUDE_GIT_EMAIL || "claude@anthropic.com"; + try { // Check if user.email is already configured runGitCommand("git config user.email"); console.log(`[LOCAL-GIT-MCP] Git user.email already configured`); } catch (error) { console.log( - `[LOCAL-GIT-MCP] Git user.email not configured, setting default`, + `[LOCAL-GIT-MCP] Git user.email not configured, setting to: ${gitEmail}`, ); - runGitCommand('git config user.email "claude@anthropic.com"'); + runGitCommand(`git config user.email "${gitEmail}"`); } try { @@ -77,9 +80,9 @@ function ensureGitUserConfigured(): void { console.log(`[LOCAL-GIT-MCP] Git user.name already configured`); } catch (error) { console.log( - `[LOCAL-GIT-MCP] Git user.name not configured, setting default`, + `[LOCAL-GIT-MCP] Git user.name not configured, setting to: ${gitName}`, ); - runGitCommand('git config user.name "Claude"'); + runGitCommand(`git config user.name "${gitName}"`); } }