summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/duplicate-prs.yml6
-rwxr-xr-xscript/duplicate-pr.ts78
2 files changed, 81 insertions, 3 deletions
diff --git a/.github/workflows/duplicate-prs.yml b/.github/workflows/duplicate-prs.yml
index 54bd9f3ef..87168dd72 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 000000000..aba078cec
--- /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] <message>
+
+Options:
+ -f, --file <path> 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()