diff --git a/.github/workflows/duplicate-prs.yml b/.github/workflows/duplicate-prs.yml index 54bd9f3efd..87168dd72a 100644 --- a/.github/workflows/duplicate-prs.yml +++ b/.github/workflows/duplicate-prs.yml @@ -30,8 +30,8 @@ jobs: - name: Setup Bun uses: ./.github/actions/setup-bun - - name: Install opencode - run: curl -fsSL https://opencode.ai/install | bash + - name: Install dependencies + run: bun install - name: Build prompt env: @@ -53,7 +53,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PR_NUMBER: ${{ github.event.pull_request.number }} run: | - COMMENT=$(opencode run --agent duplicate-pr --print -f pr_info.txt "Check the attached file for PR details and search for duplicates") + COMMENT=$(bun script/duplicate-pr.ts -f pr_info.txt "Check the attached file for PR details and search for duplicates") gh pr comment "$PR_NUMBER" --body "_The following comment was made by an LLM, it may be inaccurate:_ diff --git a/script/duplicate-pr.ts b/script/duplicate-pr.ts new file mode 100755 index 0000000000..aba078cecf --- /dev/null +++ b/script/duplicate-pr.ts @@ -0,0 +1,78 @@ +#!/usr/bin/env bun + +import path from "path" +import { createOpencode } from "@opencode-ai/sdk" +import { parseArgs } from "util" + +async function main() { + const { values, positionals } = parseArgs({ + args: Bun.argv.slice(2), + options: { + file: { type: "string", short: "f" }, + help: { type: "boolean", short: "h", default: false }, + }, + allowPositionals: true, + }) + + if (values.help) { + console.log(` +Usage: bun script/duplicate-pr.ts [options] + +Options: + -f, --file File to attach to the prompt + -h, --help Show this help message + +Examples: + bun script/duplicate-pr.ts -f pr_info.txt "Check the attached file for PR details" +`) + process.exit(0) + } + + const message = positionals.join(" ") + if (!message) { + console.error("Error: message is required") + process.exit(1) + } + + const opencode = await createOpencode({ port: 0 }) + + try { + const parts: Array<{ type: "text"; text: string } | { type: "file"; url: string; filename: string; mime: string }> = + [] + + if (values.file) { + const resolved = path.resolve(process.cwd(), values.file) + const file = Bun.file(resolved) + if (!(await file.exists())) { + console.error(`Error: file not found: ${values.file}`) + process.exit(1) + } + parts.push({ + type: "file", + url: `file://${resolved}`, + filename: path.basename(resolved), + mime: "text/plain", + }) + } + + parts.push({ type: "text", text: message }) + + const session = await opencode.client.session.create() + const result = await opencode.client.session + .prompt({ + path: { id: session.data!.id }, + body: { + agent: "duplicate-pr", + parts, + }, + signal: AbortSignal.timeout(120_000), + }) + .then((x) => x.data?.parts?.find((y) => y.type === "text")?.text ?? "") + + console.log(result.trim()) + } finally { + opencode.server.close() + } +} + +main()