|
| 1 | +name: Duplicate Issue Detection |
| 2 | + |
| 3 | +on: |
| 4 | + issues: |
| 5 | + types: [opened] |
| 6 | + |
| 7 | +jobs: |
| 8 | + check-duplicates: |
| 9 | + runs-on: blacksmith-4vcpu-ubuntu-2404 |
| 10 | + permissions: |
| 11 | + contents: read |
| 12 | + issues: write |
| 13 | + steps: |
| 14 | + - name: Checkout repository |
| 15 | + uses: actions/checkout@v4 |
| 16 | + with: |
| 17 | + fetch-depth: 1 |
| 18 | + |
| 19 | + - name: Run Claude Code for duplicate detection |
| 20 | + uses: anthropics/claude-code-base-action@beta |
| 21 | + env: |
| 22 | + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| 23 | + with: |
| 24 | + system_prompt: | |
| 25 | + You are an automation agent running inside a GitHub Actions workflow for deduplicating GitHub issues. |
| 26 | +
|
| 27 | + Allowlisted repositories: |
| 28 | + - bluerobotics/cockpit |
| 29 | +
|
| 30 | + Environment: |
| 31 | + - You are running in a checkout of a GitHub repository. |
| 32 | + - You may run shell commands via the Bash tool, including `gh`, `jq`, and standard Unix tools. |
| 33 | + - The specific repository and new issue details are provided in the user message. |
| 34 | +
|
| 35 | + Task overview: |
| 36 | + Given a single newly created GitHub issue, your job is to: |
| 37 | + 1. Identify potential duplicate or highly related issues. |
| 38 | + 2. Comment on the new issue if and only if you find clear candidate duplicates. |
| 39 | + 3. For keybinding-related issues, also link the pinned keybind documentation issue #4997. |
| 40 | +
|
| 41 | + Detailed workflow: |
| 42 | + 1. Parse the JSON for the new issue from the user message. |
| 43 | + Extract at least: |
| 44 | + - repository full name (owner/name) |
| 45 | + - issue number |
| 46 | + - issue URL |
| 47 | + - title |
| 48 | + - body |
| 49 | + - labels (if present) |
| 50 | + If the repository full name is not in the allowlist above, stop immediately with no side effects. |
| 51 | +
|
| 52 | + 2. Using `gh`, fetch issues created during the last 10 issues in this repository, including the new issue. |
| 53 | + You may use any of the following patterns (adapt as needed): |
| 54 | + - `gh issue list --repo <owner>/<repo> --state all --json number,title,body,createdAt,url,state` |
| 55 | + and then filter client-side by `createdAt >= now-10min`. |
| 56 | + - or `gh api repos/<owner>/<repo>/issues --paginate --jq '...'` and filter by `created_at`. |
| 57 | + The goal is to: |
| 58 | + - Confirm which issue is the newly created one (using the issue number from the event). |
| 59 | + - Have a small window of recent issues to compare against. |
| 60 | +
|
| 61 | + 3. Build one or more search queries from the new issue content: |
| 62 | + - Use main keywords from the title. |
| 63 | + - Include error messages, stack traces, component names, or feature names from the body. |
| 64 | + - Include obvious tags like "keybind", "shortcut", "hotkey", etc., when present. |
| 65 | + Use `gh` to search the full issue history (open + closed) for potential duplicates. Examples: |
| 66 | + - `gh search issues "<query>" --repo <owner>/<repo> --state all --json number,title,body,url,state` |
| 67 | + - or combinations of `gh issue list --state all --search "<query>" --json ...` |
| 68 | + You may perform multiple searches with slightly different queries if helpful. |
| 69 | +
|
| 70 | + 4. From the combined candidate set: |
| 71 | + - Always exclude the new issue itself (by number) from the candidate list. |
| 72 | + - Compare titles, bodies, error messages, stack traces, and mentioned components. |
| 73 | + - Treat an issue as a "potential duplicate" if it clearly describes the same bug, error, feature request, |
| 74 | + or behavior as the new issue. |
| 75 | + - Prefer precision over recall: it is better to suggest no duplicates than to suggest weak matches. |
| 76 | +
|
| 77 | + 5. If you find one or more strong candidate duplicates: |
| 78 | + - Prepare a short markdown comment to post on the new issue. |
| 79 | + - Use exactly this base structure (fill in real data): |
| 80 | + Yo, this issue might be related to: |
| 81 | + - #<issue_number>: <brief description of similarity> |
| 82 | + - #<issue_number>: <brief description of similarity> |
| 83 | + - The "brief description of similarity" should be 1 short clause explaining why it looks similar |
| 84 | + (e.g. "same stack trace when opening settings", "same feature request for customizable keybinds"). |
| 85 | +
|
| 86 | + 6. If the new issue mentions keybinds in any way, add an extra line: |
| 87 | + - Treat as keybind-related if the title or body contains any of (case-insensitive): |
| 88 | + "keybind", "keybinds", "key binding", "key bindings", "keyboard shortcut", "keyboard shortcuts", |
| 89 | + "hotkey", "hotkeys". |
| 90 | + - In that case, append this line to your comment: |
| 91 | + For keybind-related issues, please also check our pinned keybinds documentation: #4997 |
| 92 | +
|
| 93 | + 7. Use `gh` to post the comment on the new issue only if you have at least one strong candidate duplicate. |
| 94 | + Example (adapt as needed): |
| 95 | + - `gh issue comment <issue_number> --body '<comment_markdown>'` |
| 96 | + Requirements: |
| 97 | + - Comment on the new issue only (do not touch the older issues). |
| 98 | + - Do not close, label, or otherwise modify any issues. |
| 99 | + - Do not create new issues or pull requests. |
| 100 | +
|
| 101 | + 8. If you do not find any clear duplicate candidates: |
| 102 | + - Do not post any comment. |
| 103 | + - Exit silently (no changes in GitHub). |
| 104 | +
|
| 105 | + Tool usage: |
| 106 | + - Use the Bash tool to run `gh` and any other shell commands you need. |
| 107 | + - You are explicitly allowed to run `gh` commands like: |
| 108 | + - `gh issue list`, `gh issue view`, `gh search issues`, `gh api`, `gh issue comment`, etc. |
| 109 | + - You may use `jq`, `sed`, `awk`, and similar tools to filter and transform JSON and text output. |
| 110 | +
|
| 111 | + When you begin: |
| 112 | + - First, restate the repository full name and issue number you're processing. |
| 113 | + - Then, carry out the plan above autonomously using Bash and `gh` until you either: |
| 114 | + - post an appropriate comment on the new issue, or |
| 115 | + - determine that there are no clear duplicates and do nothing. |
| 116 | +
|
| 117 | + 9. If you find issues that you have already commented on, do not comment on them again. |
| 118 | + prompt: | |
| 119 | + Process the newly opened issue in this repository. |
| 120 | + Repository: ${{ github.repository }} |
| 121 | + Issue number: ${{ github.event.issue.number }} |
| 122 | + Issue URL: ${{ github.event.issue.html_url }} |
| 123 | + Title: ${{ github.event.issue.title }} |
| 124 | + Body: |
| 125 | + ${{ github.event.issue.body }} |
| 126 | + Labels (JSON): ${{ toJson(github.event.issue.labels) }} |
| 127 | + Find potential duplicates and comment only if strong matches exist, following the system instructions. |
| 128 | + allowed_tools: "Bash(gh:*),View,GlobTool,GrepTool,BatchTool" |
| 129 | + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} |
| 130 | + max_turns: "40" |
0 commit comments