mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-20 09:14:22 +01:00
wip: github actions
This commit is contained in:
6
.github/workflows/opencode.yml
vendored
6
.github/workflows/opencode.yml
vendored
@@ -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
|
||||||
|
|||||||
@@ -2,57 +2,55 @@
|
|||||||
|
|
||||||
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
|
||||||
|
|
||||||
1. Install the GitHub app https://github.com/apps/opencode-agent. Make sure it is installed on the target repository.
|
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`.
|
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
|
```yml
|
||||||
name: opencode
|
name: opencode
|
||||||
|
|
||||||
on:
|
on:
|
||||||
issue_comment:
|
issue_comment:
|
||||||
types: [created]
|
types: [created]
|
||||||
|
|
||||||
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
|
||||||
@@ -68,7 +66,7 @@ jobs:
|
|||||||
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||||
with:
|
with:
|
||||||
model: anthropic/claude-sonnet-4-20250514
|
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.
|
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`):
|
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 \
|
||||||
bun /path/to/opencode/packages/opencode/src/index.ts github run \
|
bun /path/to/opencode/packages/opencode/src/index.ts github run \
|
||||||
--token 'github_pat_1234567890' \
|
--token 'github_pat_1234567890' \
|
||||||
--event '{"eventName":"issue_comment",...}'
|
--event '{"eventName":"issue_comment",...}'
|
||||||
```
|
```
|
||||||
|
|
||||||
- `MODEL`: The model used by opencode. Same as the `MODEL` defined in the GitHub workflow.
|
- `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.
|
- `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.
|
- `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`.
|
- `/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).
|
- `--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"}}}'
|
||||||
```
|
```
|
||||||
|
|
||||||
Replace:
|
Replace:
|
||||||
@@ -118,16 +116,16 @@ 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 "}}}'
|
--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).
|
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"}}}'
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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)"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
94
packages/web/src/content/docs/docs/github.mdx
Normal file
94
packages/web/src/content/docs/docs/github.mdx
Normal 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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user