546ef939bd
- README Usage block now documents `deepseek resume <SESSION_ID>` and `deepseek fork <SESSION_ID>`. Both commands have existed since v0.7 but were undiscoverable; #682 reported "no way to resume." - New GitHub Actions for issue triage (#688): * triage.yml — keyword-driven auto-labeller (bug / feat / docs / question, area:* by file-path mention, os:*, lang:zh on CJK titles). Only adds labels that already exist on the repo so it can't create noise unilaterally. * stale.yml — 14 d stale → 7 d close on `needs-info` issues only; PRs untouched; respects pinned/keep-open/ bug/security exemptions. * spam-lockdown.yml — auto-closes promotional issues from accounts <30 days old. Pure github-script (no third-party action) so the matching rules stay readable. - CHANGELOG (v0.8.12) updated: README install rewrite (#672), Scoop (#696), pricing extension (#692), Resume docs surface, and the cargo-install-on-stable fix from the previous commit. Lease "pending" caveat removed since it's now actually fixed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
75 lines
2.5 KiB
YAML
75 lines
2.5 KiB
YAML
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@v7
|
|
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
|