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 #
-
Install the GitHub app https://github.com/apps/opencode-agent. Make sure it is installed on the target repository.
-
Add the following workflow file to
.github/workflows/opencode.ymlin your repo. Set the appropriatemodeland required API keys inenv.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 -
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:
-
Navigate to a test repo (e.g.
hello-world):cd hello-world -
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.tsMODEL: The model used by opencode. Same as theMODELdefined 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 haveadminorwriteaccess 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.tsruns your local version ofopencode.
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":4with 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 "}}}'
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"}}}'