opencode v2 mirror
README.md

opencode GitHub Action #

A GitHub Action that integrates opencode directly into your GitHub workflow.

Mention /opencode in your comment, and opencode will execute tasks within your GitHub Actions runner.

Features #

Explain an issue #

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 issue #

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

Review specific code lines #

Leave a comment directly on code lines in the PR's "Files" tab. opencode will automatically detect the file, line numbers, and diff context to provide precise responses.

[Comment on specific lines in Files tab]
/oc add error handling here

When commenting on specific lines, opencode receives:

  • The exact file being reviewed
  • The specific lines of code
  • The surrounding diff context
  • Line number information

This allows for more targeted requests without needing to specify file paths or line numbers manually.

Installation #

Run the following command in the terminal from your GitHub repo:

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.

    name: opencode
    
    on:
      issue_comment:
        types: [created]
      pull_request_review_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@v6
             with:
               fetch-depth: 1
               persist-credentials: false
    
           - name: Run opencode
            uses: anomalyco/opencode/github@latest
            env:
              ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
              GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            with:
              model: anthropic/claude-sonnet-4-20250514
              use_github_token: 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.

Support #

This is an early release. If you encounter issues or have feedback, please create an issue at https://github.com/anomalyco/opencode/issues.

Development #

To test locally:

  1. Navigate to a test repo (e.g. hello-world):

    cd hello-world
    
  2. Run:

    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 personal access token. This token is used to verify you have admin or write access to the test repo. Generate a token here.
    • 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 commenter
  • "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"}}}'

PR review comment event #

MOCK_EVENT='{"eventName":"pull_request_review_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"pull_request":{"number":7},"comment":{"id":1,"body":"hey opencode, add error handling","path":"src/components/Button.tsx","diff_hunk":"@@ -45,8 +45,11 @@\n- const handleClick = () => {\n-   console.log('clicked')\n+ const handleClick = useCallback(() => {\n+   console.log('clicked')\n+   doSomething()\n+ }, [doSomething])","line":47,"original_line":45,"position":10,"commit_id":"abc123","original_commit_id":"def456"}}}'