sync: stale skill detection, sentry filtering, claim removal, review improvements

Stale Detection:
- Detect skills removed/moved from GitHub (3 consecutive 404s threshold)
- Hide stale skills from browse/search, show warning banner on detail page
- Serve cached files with isStale flag when GitHub returns 404
- Add stale-check crawler command for batch verification
- CLI shows warning when installing stale skills from cache

Sentry & Error Handling:
- Filter browser extension errors and add denyUrls
- Anti-inflation measures and sentinel recalibration for curation

Claim & Removal:
- Enhanced ClaimForm with repo-level removal support
- Add repo-removal-request API endpoint with tests
- Improved owner page with bilingual content

Review Pipeline:
- Review version and reviewer tracking in submit API
- Source format filter for pending reviews
- Updated review tests

Other:
- Updated i18n strings (en/fa)
- BrowseFilters improvements
- Dockerfile updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
airano
2026-03-12 05:59:26 +03:30
parent 447f9eff59
commit 4212b5ba47
31 changed files with 1590 additions and 58 deletions

View File

@@ -545,6 +545,8 @@
"browseAll": "مرور همه مهارت‌ها",
"claimCta": "آیا این مخزن شماست؟",
"claimButton": "ثبت مالکیت",
"ownerManageCta": "این مهارت‌ها متعلق به شما هستند.",
"ownerManageButton": "مدیریت / حذف مهارت‌ها",
"installCta": "نصب محبوب‌ترین مهارت از این مالک:",
"stats": {
"skills": "{count, plural, one {# مهارت} other {# مهارت}}",
@@ -696,7 +698,8 @@
},
"tabs": {
"remove": "حذف مهارت",
"add": "افزودن مهارت"
"add": "افزودن مهارت",
"removeRepo": "حذف مخزن"
},
"form": {
"skillId": "شناسه مهارت",
@@ -732,7 +735,9 @@
"viewRequests": "مشاهده درخواست‌ها",
"foundSkillsIn": "مهارت‌ها در این مسیرها یافت شدند:",
"root": "(root)",
"andMore": "... و {count} مورد دیگر"
"andMore": "... و {count} مورد دیگر",
"reEnabledTitle": "مخزن فعال‌سازی مجدد شد",
"reEnabledDescription": "مخزن شما رفع انسداد شد و پس از اسکن بعدی دوباره نمایش داده خواهد شد."
},
"error": {
"notOwner": "شما مالک یا ادمین این مخزن نیستید. فقط مالکان مخزن می‌توانند درخواست حذف دهند.",
@@ -744,7 +749,8 @@
"invalidRepo": "مخزن یافت نشد یا قابل دسترسی نیست. لطفاً URL را بررسی کنید و اطمینان حاصل کنید که مخزن عمومی است.",
"rateLimitExceeded": "محدودیت API GitHub تمام شده است. لطفاً چند دقیقه بعد دوباره تلاش کنید.",
"networkTimeout": "هنگام بررسی مخزن زمان اتصال تمام شد. لطفاً دوباره تلاش کنید.",
"generic": "خطایی رخ داد. لطفاً دوباره تلاش کنید."
"generic": "خطایی رخ داد. لطفاً دوباره تلاش کنید.",
"repoBlockedByOwner": "این مخزن توسط مالکش حذف شده و قابل افزودن مجدد نیست."
},
"myRequests": {
"title": "درخواست‌های من",
@@ -760,6 +766,25 @@
"showLess": "نمایش کمتر",
"showAllPrefix": "نمایش همه ",
"showAllSuffix": " مسیر"
},
"removeRepoForm": {
"repoUrl": "آدرس مخزن گیت‌هاب یا owner/repo",
"repoUrlPlaceholder": "https://github.com/owner/repo",
"repoUrlHelp": "تمام مهارت‌های این مخزن از SkillHub حذف شده و دیگر ایندکس نخواهد شد.",
"reason": "دلیل حذف",
"reasonPlaceholder": "چرا این مخزن را حذف می‌کنید؟",
"submit": "حذف تمام مهارت‌ها",
"submitting": "در حال حذف..."
},
"removeRepoSuccess": {
"title": "مخزن حذف شد",
"description": "تمام {count} مهارت از {repo} از SkillHub حذف شدند.",
"descriptionZero": "هیچ مهارت فعالی برای این مخزن یافت نشد. مخزن از ایندکس‌سازی مجدد مسدود شده است."
},
"removeRepoError": {
"notOwner": "شما مالک این مخزن نیستید.",
"invalidRepo": "مخزن در گیت‌هاب یافت نشد.",
"parseError": "فرمت نادرست. از https://github.com/owner/repo یا owner/repo استفاده کنید."
}
},
"attribution": {