opencode/github/README.md
Frank 2034fabc7d Squashed commit of the following:
commit 7b2ad6a1abf88e0731f15bbf6e281b29a610dd76
Merge: 74c85391 847a63e1
Author: Frank <frank@sst.dev>
Date:   Mon Aug 18 15:31:54 2025 +0800

    Merge branch 'dev' into github

commit 74c85391b576d01df298f6c30e3399b281b5c997
Author: Frank <frank@sst.dev>
Date:   Mon Aug 18 15:30:14 2025 +0800

    sync

commit 0d27f8e490f1aa242e1a3fcd1f21eb077f852207
Author: Frank <frank@sst.dev>
Date:   Mon Aug 18 14:30:57 2025 +0800

    sync

commit 0cf7e6c89f
Author: Frank <frank@sst.dev>
Date:   Mon Aug 18 11:54:57 2025 +0800

    sync

commit a782cb7a26
Author: Frank <frank@sst.dev>
Date:   Mon Aug 18 11:53:25 2025 +0800

    sync

commit aa55701458
Author: Frank <frank@sst.dev>
Date:   Mon Aug 18 11:48:10 2025 +0800

    sync

commit 73c8150479
Author: Frank <frank@sst.dev>
Date:   Mon Aug 18 01:29:29 2025 +0800

    sync

commit c5325134e8
Author: Frank <frank@sst.dev>
Date:   Mon Aug 18 01:07:48 2025 +0800

    sync

commit c5b646aa88
Author: Frank <frank@sst.dev>
Date:   Mon Aug 18 01:02:02 2025 +0800

    sync

commit 27f7cc86ab
Author: Frank <frank@sst.dev>
Date:   Mon Aug 18 00:59:22 2025 +0800

    sync

commit 0a6152a0e0
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 18:11:31 2025 +0800

    fix /opencode trigger

commit f1089103c6
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 17:55:14 2025 +0800

    sync

commit 3ad1824024
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 17:44:11 2025 +0800

    sync

commit 24f0f81773
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 17:18:22 2025 +0800

    sync

commit bc199d32be
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 16:59:03 2025 +0800

    sync

commit 6cf860be84
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 16:54:48 2025 +0800

    sync

commit f5f753ff38
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 14:43:12 2025 +0800

    sync

commit 26d2e23a3e
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 14:33:40 2025 +0800

    sync

commit c5b3f54a0a
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 14:16:10 2025 +0800

    sync

commit 1c74e9a7ad
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 08:17:53 2025 +0800

    sync

commit 89052dc9aa
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 08:12:43 2025 +0800

    sync

commit 42931d4d2a
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 08:08:37 2025 +0800

    sync

commit f22e97dd05
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 08:01:57 2025 +0800

    sync

commit 2dda422ef8
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 07:55:38 2025 +0800

    sync

commit b8be1d0e9e
Author: Frank <frank@sst.dev>
Date:   Sun Aug 17 07:48:18 2025 +0800

    sync

commit 78c84b96a3
Author: Frank <frank@sst.dev>
Date:   Sat Aug 16 20:49:26 2025 +0800

    sync

commit dd9c0c8309
Author: Frank <frank@sst.dev>
Date:   Sat Aug 16 20:47:25 2025 +0800

    sync

commit 5eb917abba
Author: Frank <frank@sst.dev>
Date:   Sat Aug 16 20:35:48 2025 +0800

    sync

commit 43cf83e7cc
Author: Frank <frank@sst.dev>
Date:   Sat Aug 16 20:32:49 2025 +0800

    sync

commit 10673ca3d2
Author: Frank <frank@sst.dev>
Date:   Sat Aug 16 19:55:53 2025 +0800

    sync

commit c45ae8a233
Author: Frank <frank@sst.dev>
Date:   Sat Aug 16 19:53:52 2025 +0800

    sync

commit 3c329dee05
Author: Frank <frank@sst.dev>
Date:   Sat Aug 16 19:49:56 2025 +0800

    sync

commit 5797048db8
Author: Frank <frank@sst.dev>
Date:   Sat Aug 16 18:00:04 2025 +0800

    sync

commit 2741338e8a
Author: Frank <frank@sst.dev>
Date:   Sat Aug 16 17:54:42 2025 +0800

    sync

commit a51a8ca6d0
Author: Frank <frank@sst.dev>
Date:   Fri Aug 15 18:59:29 2025 +0800

    sync

commit f4eeeb612d
Author: Frank <frank@sst.dev>
Date:   Fri Aug 15 18:56:35 2025 +0800

    sync

commit 1d0509c563
Author: Frank <frank@sst.dev>
Date:   Fri Aug 15 18:54:21 2025 +0800

    sync

commit 339807d1b8
Author: Frank <frank@sst.dev>
Date:   Fri Aug 15 18:49:22 2025 +0800

    sync

commit 70b4b78922
Author: Frank <frank@sst.dev>
Date:   Fri Aug 15 18:04:57 2025 +0800

    sync
2025-08-18 15:34:28 +08:00

137 lines
4.6 KiB
Markdown

# opencode GitHub Action
A GitHub Action that integrates [opencode](https://opencode.ai) directly into your GitHub workflow.
Mention `/opencode` in your comment, and opencode will execute tasks within your GitHub Actions runner.
## Features
#### Explain an issues
Leave the following comment on a GitHub issue. `opencode` will read the entire thread, including all comments, and reply with a clear explanation.
```
/opencode explain this issue
```
#### Fix an issues
Leave the following comment on a GitHub issue. opencode will create a new branch, implement the changes, and open a PR with the changes.
```
/opencode fix this
```
#### Review PRs and make changes
Leave the following comment on a GitHub PR. opencode will implement the requested change and commit it to the same PR.
```
Delete the attachment from S3 when the note is removed /oc
```
## Installation
Run the following command in the terminal from your GitHub repo:
```bash
opencode github install
```
This will walk you through installing the GitHub app, creating the workflow, and setting up secrets.
### Manual Setup
1. Install the GitHub app https://github.com/apps/opencode-agent. Make sure it is installed on the target repository.
2. Add the following workflow file to `.github/workflows/opencode.yml` in your repo. Set the appropriate `model` and required API keys in `env`.
```yml
name: opencode
on:
issue_comment:
types: [created]
jobs:
opencode:
if: |
contains(github.event.comment.body, '/oc') ||
contains(github.event.comment.body, '/opencode')
runs-on: ubuntu-latest
permissions:
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Run opencode
uses: sst/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
```
3. Store the API keys in secrets. In your organization or project **settings**, expand **Secrets and variables** on the left and select **Actions**. Add the required API keys.
## Support
This is an early release. If you encounter issues or have feedback, please create an issue at https://github.com/sst/opencode/issues.
## Development
To test locally:
1. Navigate to a test repo (e.g. `hello-world`):
```bash
cd hello-world
```
2. Run:
```bash
MODEL=anthropic/claude-sonnet-4-20250514 \
ANTHROPIC_API_KEY=sk-ant-api03-1234567890 \
GITHUB_RUN_ID=dummy \
MOCK_TOKEN=github_pat_1234567890 \
MOCK_EVENT='{"eventName":"issue_comment",...}' \
bun /path/to/opencode/github/index.ts
```
- `MODEL`: The model used by opencode. Same as the `MODEL` defined in the GitHub workflow.
- `ANTHROPIC_API_KEY`: Your model provider API key. Same as the keys defined in the GitHub workflow.
- `GITHUB_RUN_ID`: Dummy value to emulate GitHub action environment.
- `MOCK_TOKEN`: A GitHub persontal access token. This token is used to verify you have `admin` or `write` access to the test repo. Generate a token [here](https://github.com/settings/personal-access-tokens).
- `MOCK_EVENT`: Mock GitHub event payload (see templates below).
- `/path/to/opencode`: Path to your cloned opencode repo. `bun /path/to/opencode/github/index.ts` runs your local version of `opencode`.
### Issue comment event
```
MOCK_EVENT='{"eventName":"issue_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"issue":{"number":4},"comment":{"id":1,"body":"hey opencode, summarize thread"}}}'
```
Replace:
- `"owner":"sst"` with repo owner
- `"repo":"hello-world"` with repo name
- `"actor":"fwang"` with the GitHub username of commentor
- `"number":4` with the GitHub issue id
- `"body":"hey opencode, summarize thread"` with comment body
### Issue comment with image attachment.
```
MOCK_EVENT='{"eventName":"issue_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"issue":{"number":4},"comment":{"id":1,"body":"hey opencode, what is in my image ![Image](https://github.com/user-attachments/assets/xxxxxxxx)"}}}'
```
Replace the image URL `https://github.com/user-attachments/assets/xxxxxxxx` with a valid GitHub attachment (you can generate one by commenting with an image in any issue).
### PR comment event
```
MOCK_EVENT='{"eventName":"issue_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"issue":{"number":4,"pull_request":{}},"comment":{"id":1,"body":"hey opencode, summarize thread"}}}'
```