Ryan Vogel пре 2 месеци
родитељ
комит
ba02738d34

+ 12 - 0
.github/workflows/pr-standards.yml

@@ -6,6 +6,18 @@ on:
 
 jobs:
   check-standards:
+    if: |
+      github.event.pull_request.user.login != 'actions-user' &&
+      github.event.pull_request.user.login != 'opencode' &&
+      github.event.pull_request.user.login != 'rekram1-node' &&
+      github.event.pull_request.user.login != 'thdxr' &&
+      github.event.pull_request.user.login != 'kommander' &&
+      github.event.pull_request.user.login != 'jayair' &&
+      github.event.pull_request.user.login != 'fwang' &&
+      github.event.pull_request.user.login != 'adamdotdevin' &&
+      github.event.pull_request.user.login != 'iamdavidhill' &&
+      github.event.pull_request.user.login != 'R44VC0RP' &&
+      github.event.pull_request.user.login != 'opencode-agent[bot]'
     runs-on: ubuntu-latest
     permissions:
       contents: read

+ 27 - 0
.opencode/agent/duplicate-issue.md

@@ -0,0 +1,27 @@
+---
+mode: primary
+hidden: true
+model: opencode/claude-haiku-4-5
+color: "#E67E22"
+tools:
+  "*": false
+  "github-issue-search": true
+  "github-pr-search": true
+---
+
+You are a duplicate issue detection agent. When an issue is opened, your job is to search for potentially duplicate or related open issues.
+
+Use the github-issue-search tool to search for issues that might be addressing the same issue or feature. You also have the github-pr-search tool to search for PRs that might be addressing the same issue or feature.
+
+IMPORTANT: The input will contain a line `CURRENT_PR_NUMBER: NNNN`. This is the current PR number, you should not mark that the current PR as a duplicate of itself.
+
+Search using keywords from the PR title and description. Try multiple searches with different relevant terms.
+
+If you find potential duplicates:
+
+- List them with their titles and URLs
+- Briefly explain why they might be related
+
+If no duplicates are found, say so clearly. BUT ONLY SAY "No duplicate PRs found" (don't say anything else if no dups)
+
+Keep your response concise and actionable.

+ 57 - 0
.opencode/tool/github-issue-search.ts

@@ -0,0 +1,57 @@
+/// <reference path="../env.d.ts" />
+import { tool } from "@opencode-ai/plugin"
+import DESCRIPTION from "./github-issue-search.txt"
+
+async function githubFetch(endpoint: string, options: RequestInit = {}) {
+  const response = await fetch(`https://api.github.com${endpoint}`, {
+    ...options,
+    headers: {
+      Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,
+      Accept: "application/vnd.github+json",
+      "Content-Type": "application/json",
+      ...options.headers,
+    },
+  })
+  if (!response.ok) {
+    throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
+  }
+  return response.json()
+}
+
+interface Issue {
+  title: string
+  html_url: string
+}
+
+export default tool({
+  description: DESCRIPTION,
+  args: {
+    query: tool.schema.string().describe("Search query for issue titles and descriptions"),
+    limit: tool.schema.number().describe("Maximum number of results to return").default(10),
+    offset: tool.schema.number().describe("Number of results to skip for pagination").default(0),
+  },
+  async execute(args) {
+    const owner = "anomalyco"
+    const repo = "opencode"
+
+    const page = Math.floor(args.offset / args.limit) + 1
+    const searchQuery = encodeURIComponent(`${args.query} repo:${owner}/${repo} type:issue state:open`)
+    const result = await githubFetch(
+      `/search/issues?q=${searchQuery}&per_page=${args.limit}&page=${page}&sort=updated&order=desc`,
+    )
+
+    if (result.total_count === 0) {
+      return `No issues found matching "${args.query}"`
+    }
+
+    const issues = result.items as Issue[]
+
+    if (issues.length === 0) {
+      return `No other issues found matching "${args.query}"`
+    }
+
+    const formatted = issues.map((issue) => `${issue.title}\n${issue.html_url}`).join("\n\n")
+
+    return `Found ${result.total_count} issues (showing ${issues.length}):\n\n${formatted}`
+  },
+})

+ 10 - 0
.opencode/tool/github-issue-search.txt

@@ -0,0 +1,10 @@
+Use this tool to search GitHub issues by title and description.
+
+This tool searches issues in the sst/opencode repository and returns LLM-friendly results including:
+- Issue number and title
+- Author
+- State (open/closed/merged)
+- Labels
+- Description snippet
+
+Use the query parameter to search for keywords that might appear in issue titles or descriptions.