wip: github actions

This commit is contained in:
Frank
2025-07-25 20:27:40 -04:00
parent 2c924b9fdb
commit a007d65f62
5 changed files with 161 additions and 79 deletions

View File

@@ -7,10 +7,8 @@ on:
jobs: jobs:
opencode: opencode:
if: | if: |
startsWith(github.event.comment.body, 'opencode') || contains(github.event.comment.body, '/oc') ||
startsWith(github.event.comment.body, 'hi opencode') || contains(github.event.comment.body, '/opencode')
startsWith(github.event.comment.body, 'hey opencode') ||
contains(github.event.comment.body, '@opencode-agent')
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
id-token: write id-token: write

View File

@@ -2,37 +2,37 @@
A GitHub Action that integrates [opencode](https://opencode.ai) directly into your GitHub workflow. 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 ## Features
#### Triage and explain issues #### Triage and explain issues
``` ```bash
hey opencode, explain this issue /opencode explain this issue
``` ```
#### Fix or implement issues - opencode will create a PR with the changes. #### Fix or implement issues - opencode will create a PR with the changes.
``` ```bash
hi opencode, fix this /opencode fix this
``` ```
- Review PRs and make changes #### Review PRs and make changes
``` ```bash
Delete the attachment from S3 when the note is removed @opencode-agent Delete the attachment from S3 when the note is removed /oc
``` ```
## Installation ## Installation
Run the following command in the terminal from your GitHub repo: Run the following command in the terminal from your GitHub repo:
``` ```bash
opencode github install 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 ### Manual Setup
@@ -49,10 +49,8 @@ on:
jobs: jobs:
opencode: opencode:
if: | if: |
startsWith(github.event.comment.body, 'opencode') || contains(github.event.comment.body, '/oc') ||
startsWith(github.event.comment.body, 'hi opencode') || contains(github.event.comment.body, '/opencode')
startsWith(github.event.comment.body, 'hey opencode') ||
contains(github.event.comment.body, '@opencode-agent')
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
id-token: write id-token: write
@@ -82,13 +80,13 @@ To test locally:
1. Navigate to a test repo (e.g. `hello-world`): 1. Navigate to a test repo (e.g. `hello-world`):
``` ```bash
cd hello-world cd hello-world
``` ```
2. Run: 2. Run:
``` ```bash
MODEL=anthropic/claude-sonnet-4-20250514 \ MODEL=anthropic/claude-sonnet-4-20250514 \
ANTHROPIC_API_KEY=sk-ant-api03-1234567890 \ ANTHROPIC_API_KEY=sk-ant-api03-1234567890 \
GITHUB_RUN_ID=dummy \ GITHUB_RUN_ID=dummy \
@@ -104,7 +102,7 @@ MODEL=anthropic/claude-sonnet-4-20250514 \
- `--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). - `--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). - `--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"}}}'
@@ -118,7 +116,7 @@ Replace:
- `"number":4` with the GitHub issue id - `"number":4` with the GitHub issue id
- `"body":"hey opencode, summarize thread"` with comment body - `"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 ![Image](https://github.com/user-attachments/assets/xxxxxxxx)"}}}' --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)"}}}'
@@ -126,7 +124,7 @@ Replace:
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). 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"}}}'

View File

@@ -7,7 +7,7 @@ branding:
inputs: inputs:
model: model:
description: "Model to use" description: "Model to use"
required: false required: true
share: share:
description: "Share the opencode session (defaults to true for public repos)" description: "Share the opencode session (defaults to true for public repos)"

View File

@@ -316,10 +316,8 @@ on:
jobs: jobs:
opencode: opencode:
if: | if: |
startsWith(github.event.comment.body, 'opencode') || contains(github.event.comment.body, '/oc') ||
startsWith(github.event.comment.body, 'hi opencode') || contains(github.event.comment.body, '/opencode')
startsWith(github.event.comment.body, 'hey opencode') ||
contains(github.event.comment.body, '@opencode-agent')
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
id-token: write id-token: write
@@ -508,16 +506,10 @@ export const GithubRunCommand = cmd({
async function getUserPrompt() { async function getUserPrompt() {
let prompt = (() => { let prompt = (() => {
const body = payload.comment.body const body = payload.comment.body.trim()
if (body.match("@opencode-agent")) return body if (body === "/opencode" || body === "/oc") return "Summarize this thread"
if (body.includes("/opencode") || body.includes("/oc")) return body
const match = body.match(/^(?:hey|hi)?\s*opencode(?:-agent)?,?\s*(.*)$/is) throw new Error("Comments must mention `/opencode` or `/oc`")
if (match?.[1] === undefined)
throw new Error(
"Command must mention @opencode-agent, or start with `opencode`, `hi opencode`, or `hey opencode` followed by instructions",
)
if (match[1] === "") return "Summarize this thread"
return match[1]
})() })()
// Handle images // Handle images

View File

@@ -0,0 +1,94 @@
---
title: GitHub
description: Using opencode within GitHub Issues and Pull-Requests
---
opencode integrates directly into your GitHub workflow. Mention `/opencode` in your comment, and opencode will execute tasks within your GitHub Actions runner.
---
## Features
- **Triage Issues**: Ask opencode to look into an issue and explain it to you
- **Fix and Implement**: Ask opencode to fix an issue or implement a feature. And it will work in a new branch and submits a PR with all the changes.
- **Secure**: opencode runs inside your GitHub's runners.
---
## 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
# share: true
```
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.
---
### Inputs
- `model`: The model used by opencode. Takes the format of `provider/model` (**required**)
- `share`: Share the session. Sessions are shared by default for public repos.
---
### Usage Examples
- Explain an issue
```bash
/opencode explain this issue
```
- Fix an issue - opencode will create a PR with the changes.
```bash
/opencode fix this
```
- Review PRs and make changes
```bash
Delete the attachment from S3 when the note is removed /oc
```