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": "Browse all skills",
"claimCta": "Is this your repository?",
"claimButton": "Claim ownership",
"ownerManageCta": "You own these skills.",
"ownerManageButton": "Manage / Remove Skills",
"installCta": "Install the most popular skill from this owner:",
"stats": {
"skills": "{count, plural, one {# skill} other {# skills}}",
@@ -696,7 +698,8 @@
},
"tabs": {
"remove": "Remove Skill",
"add": "Add Skill"
"add": "Add Skill",
"removeRepo": "Remove Repository"
},
"form": {
"skillId": "Skill ID",
@@ -732,7 +735,9 @@
"viewRequests": "View My Requests",
"foundSkillsIn": "Found skills in:",
"root": "(root)",
"andMore": "... and {count} more"
"andMore": "... and {count} more",
"reEnabledTitle": "Repository Re-enabled",
"reEnabledDescription": "Your repository has been unblocked and will appear again after the next scan."
},
"error": {
"notOwner": "You are not the owner or admin of this repository. Only repository owners can request removal.",
@@ -744,7 +749,8 @@
"invalidRepo": "The repository was not found or is not accessible. Please check the URL and ensure the repository is public.",
"rateLimitExceeded": "GitHub API rate limit exceeded. Please try again in a few minutes.",
"networkTimeout": "Request timed out while checking the repository. Please try again.",
"generic": "An error occurred. Please try again."
"generic": "An error occurred. Please try again.",
"repoBlockedByOwner": "This repository was removed by its owner and cannot be re-added."
},
"myRequests": {
"title": "My Requests",
@@ -760,6 +766,25 @@
"showLess": "Show less",
"showAllPrefix": "Show all ",
"showAllSuffix": " paths"
},
"removeRepoForm": {
"repoUrl": "GitHub Repository URL or owner/repo",
"repoUrlPlaceholder": "https://github.com/owner/repo",
"repoUrlHelp": "All skills from this repository will be removed from SkillHub and it will not be re-indexed.",
"reason": "Reason for removal",
"reasonPlaceholder": "Why are you removing this repository?",
"submit": "Remove All Skills",
"submitting": "Removing..."
},
"removeRepoSuccess": {
"title": "Repository Removed",
"description": "All {count} skills from {repo} have been removed from SkillHub.",
"descriptionZero": "No active skills were found for this repository. It has been blocked from re-indexing."
},
"removeRepoError": {
"notOwner": "You are not the owner of this repository.",
"invalidRepo": "Repository not found on GitHub.",
"parseError": "Invalid format. Use https://github.com/owner/repo or owner/repo."
}
},
"attribution": {