name: Auto-close duplicate issues description: Auto-close issues marked as duplicates after 3 days if no response on: schedule: - cron: '0 9 * * *' jobs: auto-close-duplicates: runs-on: ubuntu-latest timeout-minutes: 10 permissions: contents: read issues: write steps: - name: Auto-close duplicate issues uses: actions/github-script@v7 with: script: | const threeDaysAgo = new Date(); threeDaysAgo.setDate(threeDaysAgo.getDate() - 3); // Get all open issues const { data: issues } = await github.rest.issues.listForRepo({ owner: context.repo.owner, repo: context.repo.repo, state: 'open', per_page: 100 }); for (const issue of issues) { // Get comments for this issue const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number }); // Find duplicate comments (look for "Found 1 possible duplicate" or "Found X possible duplicate") const dupeComments = comments.filter(comment => comment.body.includes('Found') && comment.body.includes('possible duplicate') && comment.user.type === 'Bot' ); if (dupeComments.length === 0) continue; // Get the most recent duplicate comment const lastDupeComment = dupeComments[dupeComments.length - 1]; const dupeCommentDate = new Date(lastDupeComment.created_at); // Check if the duplicate comment is 3+ days old if (dupeCommentDate > threeDaysAgo) continue; // Check if there are any comments after the duplicate comment const commentsAfterDupe = comments.filter(comment => new Date(comment.created_at) > dupeCommentDate ); if (commentsAfterDupe.length > 0) continue; // Check if issue author reacted with thumbs down to the duplicate comment const { data: reactions } = await github.rest.reactions.listForIssueComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: lastDupeComment.id }); const authorThumbsDown = reactions.some(reaction => reaction.user.id === issue.user.id && reaction.content === '-1' ); if (authorThumbsDown) continue; // Auto-close the issue as duplicate await github.rest.issues.update({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, state: 'closed', state_reason: 'duplicate' }); // Add closing comment await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, body: `This issue has been automatically closed as a duplicate after 3 days with no response. If this was closed in error, please reopen it. 🤖 Generated with Claude Code` }); console.log(`Auto-closed issue #${issue.number} as duplicate`); }