205 lines
6.5 KiB
YAML
205 lines
6.5 KiB
YAML
name: duplicate-issues
|
|
|
|
on:
|
|
issues:
|
|
types: [opened, edited]
|
|
|
|
jobs:
|
|
check-duplicates:
|
|
if: github.event.action == 'opened'
|
|
runs-on: blacksmith-4vcpu-ubuntu-2404
|
|
permissions:
|
|
contents: read
|
|
issues: write
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 1
|
|
|
|
- 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 }}
|
|
run: |
|
|
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
|
|
|
|
- name: Post comment and label issue
|
|
env:
|
|
COMMENT: ${{ github.workspace }}/issue_comment.txt
|
|
uses: actions/github-script@v8
|
|
with:
|
|
script: |
|
|
const fs = require("fs")
|
|
const comment = fs.readFileSync(process.env.COMMENT, "utf8").trim()
|
|
|
|
if (comment === "No action required") {
|
|
core.info("No comment needed")
|
|
return
|
|
}
|
|
|
|
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"],
|
|
})
|
|
|
|
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
|
|
with:
|
|
fetch-depth: 1
|
|
|
|
- uses: ./.github/actions/setup-bun
|
|
|
|
- name: Install dependencies
|
|
run: bun install
|
|
|
|
- name: Install opencode
|
|
run: curl -fsSL https://opencode.ai/install | bash
|
|
|
|
- name: Build recheck prompt
|
|
uses: actions/github-script@v8
|
|
with:
|
|
script: |
|
|
const fs = require("fs")
|
|
const issue = context.payload.issue
|
|
const body = issue.body ?? ""
|
|
const text = [
|
|
"Recheck this edited issue for compliance:",
|
|
"",
|
|
"MODE: recheck-compliance",
|
|
`CURRENT_ISSUE_NUMBER: ${issue.number}`,
|
|
"",
|
|
`Title: ${issue.title}`,
|
|
"",
|
|
"Description:",
|
|
body,
|
|
].join("\n")
|
|
|
|
fs.writeFileSync("issue_info.txt", text)
|
|
|
|
- name: Recheck compliance
|
|
env:
|
|
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
bun script/duplicate-issue.ts -f issue_info.txt "Recheck compliance for this edited issue and return either No action required or a compliance comment body" > issue_comment.txt
|
|
|
|
- name: Update compliance state
|
|
env:
|
|
COMMENT: ${{ github.workspace }}/issue_comment.txt
|
|
uses: actions/github-script@v8
|
|
with:
|
|
script: |
|
|
const fs = require("fs")
|
|
const marker = "<!-- issue-compliance -->"
|
|
const comment = fs.readFileSync(process.env.COMMENT, "utf8").trim()
|
|
const issue_number = context.payload.issue.number
|
|
|
|
const { data: comments } = await github.rest.issues.listComments({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number,
|
|
per_page: 100,
|
|
})
|
|
|
|
const compliance = comments.filter((x) => (x.body ?? "").includes(marker))
|
|
|
|
if (comment === "No action required") {
|
|
try {
|
|
await github.rest.issues.removeLabel({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number,
|
|
name: "needs:compliance",
|
|
})
|
|
} catch {}
|
|
|
|
for (const entry of compliance) {
|
|
await github.rest.issues.deleteComment({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
comment_id: entry.id,
|
|
})
|
|
}
|
|
|
|
await github.rest.issues.createComment({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number,
|
|
body: "Thanks for updating your issue. It now meets our contributing guidelines. :+1:",
|
|
})
|
|
return
|
|
}
|
|
|
|
await github.rest.issues.addLabels({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number,
|
|
labels: ["needs:compliance"],
|
|
})
|
|
|
|
const body = `_The following comment was made by an LLM, it may be inaccurate:_\n\n${comment}`
|
|
const existing = compliance.at(-1)
|
|
if (!existing) {
|
|
await github.rest.issues.createComment({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number,
|
|
body,
|
|
})
|
|
return
|
|
}
|
|
|
|
await github.rest.issues.updateComment({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
comment_id: existing.id,
|
|
body,
|
|
})
|