Files
claude-code/.github/workflows/auto-close-duplicates.yml
Workflow config file is invalid. Please check your config file: yaml: line 91: could not find expected ':'
Boris Cherny 3d5ef4e8c0 Add auto-close functionality for duplicate issues
- Update dedupe command to include auto-close warning
- Add commit-push-pr command for streamlined workflow
- Add GitHub workflow to automatically close duplicates

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-04 17:09:09 -07:00

95 lines
3.6 KiB
YAML

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`);
}