|
|
@@ -2,11 +2,10 @@ name: duplicate-issues
|
|
|
|
|
|
on:
|
|
|
issues:
|
|
|
- types: [opened, edited]
|
|
|
+ types: [opened]
|
|
|
|
|
|
jobs:
|
|
|
check-duplicates:
|
|
|
- if: github.event.action == 'opened'
|
|
|
runs-on: blacksmith-4vcpu-ubuntu-2404
|
|
|
permissions:
|
|
|
contents: read
|
|
|
@@ -19,159 +18,65 @@ jobs:
|
|
|
|
|
|
- uses: ./.github/actions/setup-bun
|
|
|
|
|
|
+ - name: Install dependencies
|
|
|
+ run: bun install
|
|
|
+
|
|
|
- name: Install opencode
|
|
|
run: curl -fsSL https://opencode.ai/install | bash
|
|
|
|
|
|
+ - name: Build prompt
|
|
|
+ uses: actions/github-script@v8
|
|
|
+ with:
|
|
|
+ script: |
|
|
|
+ const fs = require("fs")
|
|
|
+ const issue = context.payload.issue
|
|
|
+ const body = issue.body ?? ""
|
|
|
+ const text = [
|
|
|
+ "Check this new issue for compliance and duplicates:",
|
|
|
+ "",
|
|
|
+ `CURRENT_ISSUE_NUMBER: ${issue.number}`,
|
|
|
+ "",
|
|
|
+ `Title: ${issue.title}`,
|
|
|
+ "",
|
|
|
+ "Description:",
|
|
|
+ body,
|
|
|
+ ].join("\n")
|
|
|
+
|
|
|
+ fs.writeFileSync("issue_info.txt", text)
|
|
|
+
|
|
|
- name: Check duplicates and compliance
|
|
|
env:
|
|
|
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
|
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
- OPENCODE_PERMISSION: |
|
|
|
- {
|
|
|
- "bash": {
|
|
|
- "*": "deny",
|
|
|
- "gh issue*": "allow"
|
|
|
- },
|
|
|
- "webfetch": "deny"
|
|
|
- }
|
|
|
run: |
|
|
|
- opencode run -m opencode/claude-sonnet-4-6 "A new issue has been created:
|
|
|
-
|
|
|
- Issue number: ${{ github.event.issue.number }}
|
|
|
-
|
|
|
- Lookup this issue with gh issue view ${{ github.event.issue.number }}.
|
|
|
-
|
|
|
- You have TWO tasks. Perform both, then post a SINGLE comment (if needed).
|
|
|
-
|
|
|
- ---
|
|
|
-
|
|
|
- TASK 1: CONTRIBUTING GUIDELINES COMPLIANCE CHECK
|
|
|
-
|
|
|
- Check whether the issue follows our contributing guidelines and issue templates.
|
|
|
-
|
|
|
- This project has three issue templates that every issue MUST use one of:
|
|
|
-
|
|
|
- 1. Bug Report - requires a Description field with real content
|
|
|
- 2. Feature Request - requires a verification checkbox and description, title should start with [FEATURE]:
|
|
|
- 3. Question - requires the Question field with real content
|
|
|
-
|
|
|
- Additionally check:
|
|
|
- - No AI-generated walls of text (long, AI-generated descriptions are not acceptable)
|
|
|
- - The issue has real content, not just template placeholder text left unchanged
|
|
|
- - Bug reports should include some context about how to reproduce
|
|
|
- - Feature requests should explain the problem or need
|
|
|
- - We want to push for having the user provide system description & information
|
|
|
-
|
|
|
- Do NOT be nitpicky about optional fields. Only flag real problems like: no template used, required fields empty or placeholder text only, obviously AI-generated walls of text, or completely empty/nonsensical content.
|
|
|
-
|
|
|
- ---
|
|
|
-
|
|
|
- TASK 2: DUPLICATE CHECK
|
|
|
-
|
|
|
- Search through existing issues (excluding #${{ github.event.issue.number }}) to find potential duplicates.
|
|
|
- Consider:
|
|
|
- 1. Similar titles or descriptions
|
|
|
- 2. Same error messages or symptoms
|
|
|
- 3. Related functionality or components
|
|
|
- 4. Similar feature requests
|
|
|
-
|
|
|
- Additionally, if the issue mentions keybinds, keyboard shortcuts, or key bindings, note the pinned keybinds issue #4997.
|
|
|
-
|
|
|
- ---
|
|
|
-
|
|
|
- POSTING YOUR COMMENT:
|
|
|
-
|
|
|
- Based on your findings, post a SINGLE comment on issue #${{ github.event.issue.number }}. Build the comment as follows:
|
|
|
-
|
|
|
- If the issue is NOT compliant, start the comment with:
|
|
|
- <!-- issue-compliance -->
|
|
|
- Then explain what needs to be fixed and that they have 2 hours to edit the issue before it is automatically closed. Also add the label needs:compliance to the issue using: gh issue edit ${{ github.event.issue.number }} --add-label needs:compliance
|
|
|
-
|
|
|
- If duplicates were found, include a section about potential duplicates with links.
|
|
|
-
|
|
|
- If the issue mentions keybinds/keyboard shortcuts, include a note about #4997.
|
|
|
-
|
|
|
- If the issue IS compliant AND no duplicates were found AND no keybind reference, do NOT comment at all.
|
|
|
-
|
|
|
- Use this format for the comment:
|
|
|
-
|
|
|
- [If not compliant:]
|
|
|
- <!-- issue-compliance -->
|
|
|
- This issue doesn't fully meet our [contributing guidelines](../blob/dev/CONTRIBUTING.md).
|
|
|
-
|
|
|
- **What needs to be fixed:**
|
|
|
- - [specific reasons]
|
|
|
-
|
|
|
- Please edit this issue to address the above within **2 hours**, or it will be automatically closed.
|
|
|
+ bun script/duplicate-issue.ts -f issue_info.txt "Check the attached file for issue details and return either a comment body or No action required" > issue_comment.txt
|
|
|
|
|
|
- [If duplicates found, add:]
|
|
|
- ---
|
|
|
- This issue might be a duplicate of existing issues. Please check:
|
|
|
- - #[issue_number]: [brief description of similarity]
|
|
|
-
|
|
|
- [If keybind-related, add:]
|
|
|
- For keybind-related issues, please also check our pinned keybinds documentation: #4997
|
|
|
-
|
|
|
- [End with if not compliant:]
|
|
|
- If you believe this was flagged incorrectly, please let a maintainer know.
|
|
|
-
|
|
|
- Remember: post at most ONE comment combining all findings. If everything is fine, post nothing."
|
|
|
-
|
|
|
- recheck-compliance:
|
|
|
- if: github.event.action == 'edited' && contains(github.event.issue.labels.*.name, 'needs:compliance')
|
|
|
- runs-on: blacksmith-4vcpu-ubuntu-2404
|
|
|
- permissions:
|
|
|
- contents: read
|
|
|
- issues: write
|
|
|
- steps:
|
|
|
- - name: Checkout repository
|
|
|
- uses: actions/checkout@v4
|
|
|
+ - name: Post comment and label issue
|
|
|
+ env:
|
|
|
+ COMMENT: ${{ github.workspace }}/issue_comment.txt
|
|
|
+ uses: actions/github-script@v8
|
|
|
with:
|
|
|
- fetch-depth: 1
|
|
|
-
|
|
|
- - uses: ./.github/actions/setup-bun
|
|
|
+ script: |
|
|
|
+ const fs = require("fs")
|
|
|
+ const comment = fs.readFileSync(process.env.COMMENT, "utf8").trim()
|
|
|
|
|
|
- - name: Install opencode
|
|
|
- run: curl -fsSL https://opencode.ai/install | bash
|
|
|
-
|
|
|
- - name: Recheck compliance
|
|
|
- env:
|
|
|
- OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
|
|
|
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
- OPENCODE_PERMISSION: |
|
|
|
- {
|
|
|
- "bash": {
|
|
|
- "*": "deny",
|
|
|
- "gh issue*": "allow"
|
|
|
- },
|
|
|
- "webfetch": "deny"
|
|
|
+ if (comment === "No action required") {
|
|
|
+ core.info("No comment needed")
|
|
|
+ return
|
|
|
}
|
|
|
- run: |
|
|
|
- opencode run -m opencode/claude-sonnet-4-6 "Issue #${{ github.event.issue.number }} was previously flagged as non-compliant and has been edited.
|
|
|
-
|
|
|
- Lookup this issue with gh issue view ${{ github.event.issue.number }}.
|
|
|
-
|
|
|
- Re-check whether the issue now follows our contributing guidelines and issue templates.
|
|
|
-
|
|
|
- This project has three issue templates that every issue MUST use one of:
|
|
|
-
|
|
|
- 1. Bug Report - requires a Description field with real content
|
|
|
- 2. Feature Request - requires a verification checkbox and description, title should start with [FEATURE]:
|
|
|
- 3. Question - requires the Question field with real content
|
|
|
-
|
|
|
- Additionally check:
|
|
|
- - No AI-generated walls of text (long, AI-generated descriptions are not acceptable)
|
|
|
- - The issue has real content, not just template placeholder text left unchanged
|
|
|
- - Bug reports should include some context about how to reproduce
|
|
|
- - Feature requests should explain the problem or need
|
|
|
- - We want to push for having the user provide system description & information
|
|
|
-
|
|
|
- Do NOT be nitpicky about optional fields. Only flag real problems like: no template used, required fields empty or placeholder text only, obviously AI-generated walls of text, or completely empty/nonsensical content.
|
|
|
-
|
|
|
- If the issue is NOW compliant:
|
|
|
- 1. Remove the needs:compliance label: gh issue edit ${{ github.event.issue.number }} --remove-label needs:compliance
|
|
|
- 2. Find and delete the previous compliance comment (the one containing <!-- issue-compliance -->) using: gh api repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/comments --jq '.[] | select(.body | contains(\"<!-- issue-compliance -->\")) | .id' then delete it with: gh api -X DELETE repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/comments/{id}
|
|
|
- 3. Post a short comment thanking them for updating the issue.
|
|
|
|
|
|
- If the issue is STILL not compliant:
|
|
|
- Post a comment explaining what still needs to be fixed. Keep the needs:compliance label."
|
|
|
+ await github.rest.issues.createComment({
|
|
|
+ owner: context.repo.owner,
|
|
|
+ repo: context.repo.repo,
|
|
|
+ issue_number: context.payload.issue.number,
|
|
|
+ body: `_The following comment was made by an LLM, it may be inaccurate:_\n\n${comment}`,
|
|
|
+ })
|
|
|
+
|
|
|
+ if (!comment.includes("<!-- issue-compliance -->")) return
|
|
|
+
|
|
|
+ await github.rest.issues.addLabels({
|
|
|
+ owner: context.repo.owner,
|
|
|
+ repo: context.repo.repo,
|
|
|
+ issue_number: context.payload.issue.number,
|
|
|
+ labels: ["needs:compliance"],
|
|
|
+ })
|