feat: OpenDesign (nexu-io/open-design) compatibility — MCP today, native runtime adapter upstream #2168
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Lock down obvious spam issues | |
| on: | |
| issues: | |
| types: [opened] | |
| permissions: | |
| issues: write | |
| jobs: | |
| lockdown: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Auto-close spam patterns from new accounts | |
| uses: actions/github-script@v9 | |
| with: | |
| script: | | |
| const issue = context.payload.issue; | |
| const author = issue.user; | |
| // Only consider brand-new accounts. If the user has been around | |
| // long enough to file good-faith issues elsewhere, don't touch. | |
| const created = new Date(author.created_at || 0); | |
| const ageDays = (Date.now() - created.getTime()) / 86_400_000; | |
| if (ageDays > 30) return; | |
| const blob = `${issue.title || ''}\n${issue.body || ''}`; | |
| const patterns = [ | |
| /\bcrypto\b/i, | |
| /\bairdrop\b/i, | |
| /\bnft\b/i, | |
| /\bpresale\b/i, | |
| /\busdt\b/i, | |
| /\btg\s*@/i, | |
| /\btelegram\s+@/i, | |
| /\bt\.me\//i, | |
| /\bwhatsapp\s+\+/i, | |
| /\bseo\s+service/i, | |
| /\bguest\s+post/i, | |
| /\bbacklink/i, | |
| /\bbuy\s+followers/i, | |
| /\bjoin\s+our\s+(community|server|group)/i, | |
| /\bpromot[ei]\s+your\b/i, | |
| ]; | |
| const hit = patterns.find(p => p.test(blob)); | |
| if (!hit) return; | |
| await github.rest.issues.createComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: issue.number, | |
| body: [ | |
| 'This issue was auto-closed because the title or body matches', | |
| 'a spam pattern (paid promotion / unrelated link) and the author', | |
| 'account is less than 30 days old. If this is a real bug or', | |
| 'feature request, please reopen with a clearer description', | |
| '(in English or 中文) of the project-relevant context.', | |
| ].join(' '), | |
| }); | |
| await github.rest.issues.update({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: issue.number, | |
| state: 'closed', | |
| state_reason: 'not_planned', | |
| }); | |
| await github.rest.issues.addLabels({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: issue.number, | |
| labels: ['spam'], | |
| }).catch(() => {}); // ignore if label doesn't exist yet |