|
|
@@ -2,73 +2,71 @@
|
|
|
|
|
|
A GitHub Action that integrates [opencode](https://opencode.ai) directly into your GitHub workflow.
|
|
|
|
|
|
-Start your comment with `hey opencode`, and opencode will take action via your GitHub Actions runner.
|
|
|
+Mention `/opencode` in your comment, and opencode will execute tasks within your GitHub Actions runner.
|
|
|
|
|
|
## Features
|
|
|
|
|
|
#### Triage and explain issues
|
|
|
|
|
|
-```
|
|
|
-hey opencode, explain this issue
|
|
|
+```bash
|
|
|
+/opencode explain this issue
|
|
|
```
|
|
|
|
|
|
#### Fix or implement issues - opencode will create a PR with the changes.
|
|
|
|
|
|
-```
|
|
|
-hi opencode, fix this
|
|
|
+```bash
|
|
|
+/opencode fix this
|
|
|
```
|
|
|
|
|
|
-- Review PRs and make changes
|
|
|
+#### Review PRs and make changes
|
|
|
|
|
|
-```
|
|
|
-Delete the attachment from S3 when the note is removed @opencode-agent
|
|
|
+```bash
|
|
|
+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, configuring the workflow, and setting up secrets.
|
|
|
+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: |
|
|
|
- startsWith(github.event.comment.body, 'opencode') ||
|
|
|
- startsWith(github.event.comment.body, 'hi opencode') ||
|
|
|
- startsWith(github.event.comment.body, 'hey opencode') ||
|
|
|
- contains(github.event.comment.body, '@opencode-agent')
|
|
|
- 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
|
|
|
-```
|
|
|
+ ```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.
|
|
|
|
|
|
@@ -82,32 +80,32 @@ To test locally:
|
|
|
|
|
|
1. Navigate to a test repo (e.g. `hello-world`):
|
|
|
|
|
|
-```
|
|
|
-cd hello-world
|
|
|
-```
|
|
|
+ ```bash
|
|
|
+ cd hello-world
|
|
|
+ ```
|
|
|
|
|
|
2. Run:
|
|
|
|
|
|
-```
|
|
|
-MODEL=anthropic/claude-sonnet-4-20250514 \
|
|
|
- ANTHROPIC_API_KEY=sk-ant-api03-1234567890 \
|
|
|
- GITHUB_RUN_ID=dummy \
|
|
|
- bun /path/to/opencode/packages/opencode/src/index.ts github run \
|
|
|
- --token 'github_pat_1234567890' \
|
|
|
- --event '{"eventName":"issue_comment",...}'
|
|
|
-```
|
|
|
+ ```bash
|
|
|
+ MODEL=anthropic/claude-sonnet-4-20250514 \
|
|
|
+ ANTHROPIC_API_KEY=sk-ant-api03-1234567890 \
|
|
|
+ GITHUB_RUN_ID=dummy \
|
|
|
+ bun /path/to/opencode/packages/opencode/src/index.ts github run \
|
|
|
+ --token 'github_pat_1234567890' \
|
|
|
+ --event '{"eventName":"issue_comment",...}'
|
|
|
+ ```
|
|
|
|
|
|
-- `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.
|
|
|
-- `/path/to/opencode`: Path to your cloned opencode repo. `bun /path/to/opencode/packages/opencode/src/index.ts` runs your local version of `opencode`.
|
|
|
-- `--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).
|
|
|
-- `--event`: Mock GitHub event payload (see templates below).
|
|
|
+ - `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.
|
|
|
+ - `/path/to/opencode`: Path to your cloned opencode repo. `bun /path/to/opencode/packages/opencode/src/index.ts` runs your local version of `opencode`.
|
|
|
+ - `--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).
|
|
|
+ - `--event`: Mock GitHub event payload (see templates below).
|
|
|
|
|
|
-#### Issue comment event
|
|
|
+### Issue comment event
|
|
|
|
|
|
```
|
|
|
- --event '{"eventName":"issue_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"issue":{"number":4},"comment":{"id":1,"body":"hey opencode, summarize thread"}}}'
|
|
|
+--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:
|
|
|
@@ -118,16 +116,16 @@ Replace:
|
|
|
- `"number":4` with the GitHub issue id
|
|
|
- `"body":"hey opencode, summarize thread"` with comment body
|
|
|
|
|
|
-#### Issue comment with image attachment.
|
|
|
+### Issue comment with image attachment.
|
|
|
|
|
|
```
|
|
|
- --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 "}}}'
|
|
|
+--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 "}}}'
|
|
|
```
|
|
|
|
|
|
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
|
|
|
+### PR comment event
|
|
|
|
|
|
```
|
|
|
- --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"}}}'
|
|
|
+--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"}}}'
|
|
|
```
|