diff options
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/opencode/src/cli/cmd/github.ts | 46 | ||||
| -rw-r--r-- | packages/web/src/content/docs/github.mdx | 19 |
2 files changed, 59 insertions, 6 deletions
diff --git a/packages/opencode/src/cli/cmd/github.ts b/packages/opencode/src/cli/cmd/github.ts index 1f60e81e9..5f9bcded1 100644 --- a/packages/opencode/src/cli/cmd/github.ts +++ b/packages/opencode/src/cli/cmd/github.ts @@ -7,7 +7,7 @@ import { graphql } from "@octokit/graphql" import * as core from "@actions/core" import * as github from "@actions/github" import type { Context } from "@actions/github/lib/context" -import type { IssueCommentEvent } from "@octokit/webhooks-types" +import type { IssueCommentEvent, PullRequestReviewCommentEvent } from "@octokit/webhooks-types" import { UI } from "../ui" import { cmd } from "./cmd" import { ModelsDev } from "../../provider/models" @@ -328,6 +328,8 @@ export const GithubInstallCommand = cmd({ on: issue_comment: types: [created] + pull_request_review_comment: + types: [created] jobs: opencode: @@ -378,7 +380,7 @@ export const GithubRunCommand = cmd({ const isMock = args.token || args.event const context = isMock ? (JSON.parse(args.event!) as Context) : github.context - if (context.eventName !== "issue_comment") { + if (context.eventName !== "issue_comment" && context.eventName !== "pull_request_review_comment") { core.setFailed(`Unsupported event type: ${context.eventName}`) process.exit(1) } @@ -387,9 +389,13 @@ export const GithubRunCommand = cmd({ const runId = normalizeRunId() const share = normalizeShare() const { owner, repo } = context.repo - const payload = context.payload as IssueCommentEvent + const payload = context.payload as IssueCommentEvent | PullRequestReviewCommentEvent const actor = context.actor - const issueId = payload.issue.number + + const issueId = + context.eventName === "pull_request_review_comment" + ? (payload as PullRequestReviewCommentEvent).pull_request.number + : (payload as IssueCommentEvent).issue.number const runUrl = `/${owner}/${repo}/actions/runs/${runId}` const shareBaseUrl = isMock ? "https://dev.opencode.ai" : "https://opencode.ai" @@ -531,11 +537,39 @@ export const GithubRunCommand = cmd({ throw new Error(`Invalid share value: ${value}. Share must be a boolean.`) } + function getReviewCommentContext() { + if (context.eventName !== "pull_request_review_comment") { + return null + } + + const reviewPayload = payload as PullRequestReviewCommentEvent + return { + file: reviewPayload.comment.path, + diffHunk: reviewPayload.comment.diff_hunk, + line: reviewPayload.comment.line, + originalLine: reviewPayload.comment.original_line, + position: reviewPayload.comment.position, + commitId: reviewPayload.comment.commit_id, + originalCommitId: reviewPayload.comment.original_commit_id, + } + } + async function getUserPrompt() { + const reviewContext = getReviewCommentContext() let prompt = (() => { const body = payload.comment.body.trim() - if (body === "/opencode" || body === "/oc") return "Summarize this thread" - if (body.includes("/opencode") || body.includes("/oc")) return body + if (body === "/opencode" || body === "/oc") { + if (reviewContext) { + return `Review this code change and suggest improvements for the commented lines:\n\nFile: ${reviewContext.file}\nLines: ${reviewContext.line}\n\n${reviewContext.diffHunk}` + } + return "Summarize this thread" + } + if (body.includes("/opencode") || body.includes("/oc")) { + if (reviewContext) { + return `${body}\n\nContext: You are reviewing a comment on file "${reviewContext.file}" at line ${reviewContext.line}.\n\nDiff context:\n${reviewContext.diffHunk}` + } + return body + } throw new Error("Comments must mention `/opencode` or `/oc`") })() diff --git a/packages/web/src/content/docs/github.mdx b/packages/web/src/content/docs/github.mdx index 359f696fc..19c7782ef 100644 --- a/packages/web/src/content/docs/github.mdx +++ b/packages/web/src/content/docs/github.mdx @@ -45,6 +45,8 @@ Or you can set it up manually. on: issue_comment: types: [created] + pull_request_review_comment: + types: [created] jobs: opencode: @@ -129,3 +131,20 @@ Here are some examples of how you can use opencode in GitHub. ``` opencode will implement the requested change and commit it to the same PR. + +- **Review specific code lines** + + Leave a comment directly on code lines in the PR's "Files" tab. opencode automatically detects 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. |
