diff --git a/.github/workflows/opencode.yml b/.github/workflows/opencode.yml index ca59f277..cecae36e 100644 --- a/.github/workflows/opencode.yml +++ b/.github/workflows/opencode.yml @@ -7,10 +7,8 @@ on: 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') + contains(github.event.comment.body, '/oc') || + contains(github.event.comment.body, '/opencode') runs-on: ubuntu-latest permissions: id-token: write diff --git a/github/README.md b/github/README.md index 7e9a8906..22ce463d 100644 --- a/github/README.md +++ b/github/README.md @@ -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 + ```yml + name: opencode -on: - issue_comment: - types: [created] + 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 + 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 -``` + - 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 ![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)"}}}' ``` 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"}}}' ``` diff --git a/github/action.yml b/github/action.yml index 2f9c952b..0b7367de 100644 --- a/github/action.yml +++ b/github/action.yml @@ -7,7 +7,7 @@ branding: inputs: model: description: "Model to use" - required: false + required: true share: description: "Share the opencode session (defaults to true for public repos)" diff --git a/packages/opencode/src/cli/cmd/github.ts b/packages/opencode/src/cli/cmd/github.ts index 5256a963..b8ce6582 100644 --- a/packages/opencode/src/cli/cmd/github.ts +++ b/packages/opencode/src/cli/cmd/github.ts @@ -316,10 +316,8 @@ on: 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') + contains(github.event.comment.body, '/oc') || + contains(github.event.comment.body, '/opencode') runs-on: ubuntu-latest permissions: id-token: write @@ -508,16 +506,10 @@ export const GithubRunCommand = cmd({ async function getUserPrompt() { let prompt = (() => { - const body = payload.comment.body - if (body.match("@opencode-agent")) return body - - const match = body.match(/^(?:hey|hi)?\s*opencode(?:-agent)?,?\s*(.*)$/is) - 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] + const body = payload.comment.body.trim() + if (body === "/opencode" || body === "/oc") return "Summarize this thread" + if (body.includes("/opencode") || body.includes("/oc")) return body + throw new Error("Comments must mention `/opencode` or `/oc`") })() // Handle images diff --git a/packages/web/src/content/docs/docs/github.mdx b/packages/web/src/content/docs/docs/github.mdx new file mode 100644 index 00000000..ef763ee3 --- /dev/null +++ b/packages/web/src/content/docs/docs/github.mdx @@ -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 + ```