docs: replace instance-specific values with placeholders in forgejo.md
Replace hardcoded bot_id "48" and bot_email "claude@wxs.ro" with generic placeholders in Quick Start and setup examples so readers don't copy instance-specific values. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
b4a6c34853
commit
07e0384538
1 file changed
+99
-14
+99
-14
@@ -7,19 +7,16 @@ This action supports [Forgejo](https://forgejo.org/) (and Forgejo Actions) as an
|
|||||||
- **Forgejo instance** with [Forgejo Actions](https://forgejo.org/docs/latest/user/actions/) enabled
|
- **Forgejo instance** with [Forgejo Actions](https://forgejo.org/docs/latest/user/actions/) enabled
|
||||||
- **Forgejo runner** registered and operational (e.g., a `grunt` or `ubuntu-latest` runner)
|
- **Forgejo runner** registered and operational (e.g., a `grunt` or `ubuntu-latest` runner)
|
||||||
- **Anthropic API key** or **Claude Code OAuth token** for Claude API access
|
- **Anthropic API key** or **Claude Code OAuth token** for Claude API access
|
||||||
- **Forgejo token** with repo access (automatically available as `github.token` in workflows, or use a dedicated token)
|
- **Forgejo token** with repo access (automatically available as `github.token` in workflows, or use a [dedicated bot user](#dedicated-bot-user-recommended))
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
### 1. Add Secrets
|
### 1. Add Secrets
|
||||||
|
|
||||||
In your Forgejo repository, go to **Settings > Actions > Secrets** and add:
|
Add secrets at the **organization level** (Settings > Actions > Secrets) so all repos can share them:
|
||||||
|
|
||||||
- `ANTHROPIC_API_KEY` — Your Anthropic API key (starting with `sk-ant-`)
|
- `ANTHROPIC_API_KEY` — Your Anthropic API key (starting with `sk-ant-`)
|
||||||
|
- `CLAUDE_BOT_TOKEN` — API token for the dedicated bot user (see [Dedicated Bot User](#dedicated-bot-user-recommended) below)
|
||||||
If you need a dedicated token for Claude's GitHub operations (recommended for tag mode):
|
|
||||||
|
|
||||||
- `FORGEJO_CLAUDE_TOKEN` — A Forgejo personal access token with `repo` scope
|
|
||||||
|
|
||||||
### 2. Create Workflow
|
### 2. Create Workflow
|
||||||
|
|
||||||
@@ -45,7 +42,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||||
platform: "forgejo"
|
platform: "forgejo"
|
||||||
github_token: ${{ secrets.FORGEJO_CLAUDE_TOKEN }}
|
github_token: ${{ secrets.CLAUDE_BOT_TOKEN }}
|
||||||
|
bot_id: "YOUR_BOT_ID" # Replace with your bot's Forgejo user ID (see step 5 below)
|
||||||
|
bot_name: "claude-bot"
|
||||||
|
bot_email: "claude@yourdomain.com" # Must match the bot user's registered email
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Agent Mode (Automation)
|
### 3. Agent Mode (Automation)
|
||||||
@@ -70,7 +70,10 @@ jobs:
|
|||||||
prompt: ${{ github.event.inputs.task }}
|
prompt: ${{ github.event.inputs.task }}
|
||||||
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||||
platform: "forgejo"
|
platform: "forgejo"
|
||||||
github_token: ${{ secrets.FORGEJO_CLAUDE_TOKEN }}
|
github_token: ${{ secrets.CLAUDE_BOT_TOKEN }}
|
||||||
|
bot_id: "YOUR_BOT_ID" # Replace with your bot's Forgejo user ID
|
||||||
|
bot_name: "claude-bot"
|
||||||
|
bot_email: "claude@yourdomain.com"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Platform Detection
|
## Platform Detection
|
||||||
@@ -89,12 +92,12 @@ The action detects the platform using a three-tier strategy:
|
|||||||
|
|
||||||
### Authentication
|
### Authentication
|
||||||
|
|
||||||
| Aspect | GitHub | Forgejo |
|
| Aspect | GitHub | Forgejo |
|
||||||
| ------------------------ | ------------------------------- | --------------------------------------- |
|
| ------------------------ | ------------------------------- | ------------------------------------------------------------- |
|
||||||
| **Default auth** | GitHub App OIDC token exchange | Direct `GITHUB_TOKEN` / `FORGEJO_TOKEN` |
|
| **Default auth** | GitHub App OIDC token exchange | Direct `GITHUB_TOKEN` / `FORGEJO_TOKEN` |
|
||||||
| **Token setup** | Automatic via Claude GitHub App | Manual — provide `github_token` input |
|
| **Token setup** | Automatic via Claude GitHub App | Manual — provide `github_token` input |
|
||||||
| **App token revocation** | Automatic cleanup step | Skipped (no app token) |
|
| **App token revocation** | Automatic cleanup step | Skipped (no app token) |
|
||||||
| **Bot identity** | `claude[bot]` (ID: 41898282) | Token owner's identity |
|
| **Bot identity** | `claude[bot]` (ID: 41898282) | Dedicated bot user via `bot_id`/`bot_name`/`bot_email` inputs |
|
||||||
|
|
||||||
On Forgejo, there is no OIDC token exchange with Anthropic. The action uses the workflow token (`github.token`) or a user-provided `github_token` directly.
|
On Forgejo, there is no OIDC token exchange with Anthropic. The action uses the workflow token (`github.token`) or a user-provided `github_token` directly.
|
||||||
|
|
||||||
@@ -131,6 +134,88 @@ platform:
|
|||||||
|
|
||||||
All other inputs work identically on both platforms. See the [Usage Guide](./usage.md) for the full list.
|
All other inputs work identically on both platforms. See the [Usage Guide](./usage.md) for the full list.
|
||||||
|
|
||||||
|
## Dedicated Bot User (Recommended)
|
||||||
|
|
||||||
|
On GitHub, Claude gets its own identity via the GitHub App (`claude[bot]`). On Forgejo, there's no such mechanism — by default the action runs under whatever token you provide, meaning commits and comments appear as the human user.
|
||||||
|
|
||||||
|
Creating a dedicated bot user solves this:
|
||||||
|
|
||||||
|
- **Clear attribution**: Commits and comments show as `claude-bot`, not your personal account
|
||||||
|
- **Least privilege**: The bot token has only the permissions Claude needs
|
||||||
|
- **Audit trail**: Easy to distinguish human actions from bot actions in repo history
|
||||||
|
- **Security**: If the action is compromised, only the bot's scoped token is exposed
|
||||||
|
|
||||||
|
### Setup Steps
|
||||||
|
|
||||||
|
#### 1. Create the bot user
|
||||||
|
|
||||||
|
Go to **Site Administration > User Accounts > Create User Account** or use the admin API:
|
||||||
|
|
||||||
|
- **Username**: `claude-bot`
|
||||||
|
- **Email**: e.g., `claude@yourdomain.com`
|
||||||
|
- **Password**: any strong password (you'll use API tokens, not password login)
|
||||||
|
- **Uncheck** "Require user to change password"
|
||||||
|
- Leave "Admin" **unchecked**
|
||||||
|
- Optionally set a display name and avatar to distinguish from human users
|
||||||
|
|
||||||
|
#### 2. Add to organizations via teams
|
||||||
|
|
||||||
|
For each organization where Claude should operate:
|
||||||
|
|
||||||
|
1. Go to **Org Settings > Teams > New Team**
|
||||||
|
2. Create a team named `Claude` with:
|
||||||
|
- **Permission**: `Write`
|
||||||
|
- **Access**: All Repositories (so new repos are automatically covered)
|
||||||
|
3. Add `claude-bot` to the team's **Members**
|
||||||
|
|
||||||
|
#### 3. Generate a scoped API token
|
||||||
|
|
||||||
|
Log in as `claude-bot`, go to **Settings > Applications**, and create a token:
|
||||||
|
|
||||||
|
- **Token Name**: `claude-code-action`
|
||||||
|
- **Scopes**:
|
||||||
|
- `repo` — read/write (issues, PRs, comments, branches, commits)
|
||||||
|
- `user:read` — needed for API identity
|
||||||
|
- Leave `admin`, `organization`, `package` **unchecked**
|
||||||
|
|
||||||
|
#### 4. Store the token as an org-level secret
|
||||||
|
|
||||||
|
Add the token as `CLAUDE_BOT_TOKEN` at the **organization level** (Settings > Actions > Secrets) with visibility set to "All repositories". This way all repos in the org share the same secret.
|
||||||
|
|
||||||
|
#### 5. Get the bot user's ID
|
||||||
|
|
||||||
|
You'll need the Forgejo user ID for the `bot_id` input:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -s "https://your-forgejo-instance/api/v1/users/claude-bot" | jq '.id'
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 6. Configure the workflow
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: https://git.wxs.ro/actions/claude-code-action@v1
|
||||||
|
with:
|
||||||
|
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||||
|
platform: "forgejo"
|
||||||
|
github_token: ${{ secrets.CLAUDE_BOT_TOKEN }}
|
||||||
|
bot_id: "YOUR_BOT_ID" # Replace with the ID from step 5
|
||||||
|
bot_name: "claude-bot"
|
||||||
|
bot_email: "claude@yourdomain.com" # Must match the bot user's registered email
|
||||||
|
```
|
||||||
|
|
||||||
|
The `bot_email` input overrides the default noreply email format. When it matches the bot user's registered email in Forgejo, commits will be linked to the bot's profile in the UI.
|
||||||
|
|
||||||
|
### Token Rotation
|
||||||
|
|
||||||
|
Forgejo API tokens can expire. Plan for rotation:
|
||||||
|
|
||||||
|
1. **Set a calendar reminder** for before the token expires
|
||||||
|
2. **Generate a new token** by logging in as `claude-bot` (same scopes as above)
|
||||||
|
3. **Update the org secret** `CLAUDE_BOT_TOKEN` with the new token value
|
||||||
|
4. **No code changes needed** — the workflow reads the secret at runtime
|
||||||
|
|
||||||
|
Alternatively, generate a token without an expiration date (if your Forgejo instance allows it).
|
||||||
|
|
||||||
## Included CI Workflows
|
## Included CI Workflows
|
||||||
|
|
||||||
This fork includes four Forgejo-native workflows in `.forgejo/workflows/`:
|
This fork includes four Forgejo-native workflows in `.forgejo/workflows/`:
|
||||||
|
|||||||
Reference in new issue
Block a user