Skip to content

refactor(skills): align SKILL.md frontmatter with Anthropic skill standard #15

refactor(skills): align SKILL.md frontmatter with Anthropic skill standard

refactor(skills): align SKILL.md frontmatter with Anthropic skill standard #15

name: Auto-close Issues on PR Merge
on:
pull_request:
types: [closed]
jobs:
close-linked-issues:
# Only run if PR was actually merged (not just closed)
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: read
steps:
- name: Extract issue numbers from PR
id: extract-issues
uses: actions/github-script@v7
with:
script: |
const prNumber = context.payload.pull_request.number;
const prTitle = context.payload.pull_request.title;
const prBody = context.payload.pull_request.body || '';
const prUrl = context.payload.pull_request.html_url;
// Regex to find issue references like "Fixes #123", "Closes #456", "Resolves #789"
const issuePattern = /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s*:?\s*#(\d+)/gi;
const issueNumbers = new Set();
let match;
// Search in PR title
while ((match = issuePattern.exec(prTitle)) !== null) {
issueNumbers.add(match[1]);
}
// Search in PR body
issuePattern.lastIndex = 0; // Reset regex
while ((match = issuePattern.exec(prBody)) !== null) {
issueNumbers.add(match[1]);
}
const issues = Array.from(issueNumbers);
console.log(`Found issues: ${issues.join(', ')}`);
// Store for next step
core.setOutput('issue_numbers', issues.join(','));
core.setOutput('pr_number', prNumber);
core.setOutput('pr_url', prUrl);
core.setOutput('pr_title', prTitle);
- name: Comment and close issues
if: steps.extract-issues.outputs.issue_numbers != ''
uses: actions/github-script@v7
with:
script: |
const issueNumbers = '${{ steps.extract-issues.outputs.issue_numbers }}'.split(',');
const prNumber = '${{ steps.extract-issues.outputs.pr_number }}';
const prUrl = '${{ steps.extract-issues.outputs.pr_url }}';
const prTitle = `${{ steps.extract-issues.outputs.pr_title }}`;
for (const issueNumber of issueNumbers) {
if (!issueNumber) continue;
try {
// Add comment to the issue
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: parseInt(issueNumber),
body: `✅ This issue has been automatically closed because PR #${prNumber} was merged.\n\n**PR Title:** ${prTitle}\n**PR Link:** ${prUrl}`
});
console.log(`Added comment to issue #${issueNumber}`);
// Close the issue
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: parseInt(issueNumber),
state: 'closed'
});
console.log(`Closed issue #${issueNumber}`);
} catch (error) {
console.error(`Error processing issue #${issueNumber}:`, error.message);
}
}