feat(skills): curated GitHub catalog redesign (#3016)

* feat(skills): remove ClawHub catalog integration

Drop the ClawHub registry as a skills catalog source across web server,
shared UI, VS Code, docs, and locales. The catalog now serves git-based
sources only: the curated Anthropic repo and user-defined repositories.
Also removes the now-unused adm-zip dependency.

* feat(skills): redesign catalog around curated GitHub repositories

Replace the single-source dropdown with a card grid of curated GitHub
repositories (Anthropic, OpenAI, Cursor pstack/skills, Matt Pocock) plus
user-defined sources. Source cards show skill counts, GitHub stars, and
last-updated time; a global search covers all loaded sources.

Server: curated sources gain GitHub repo metadata (stars, pushed_at)
fetched best-effort with a 3-hour in-memory and on-disk cache; scans
run through a concurrency-limited, deduplicated cache with 3-hour TTL
persisted across restarts. Refresh still bypasses the cache.

Shared UI: source cards, global search with clear button, per-skill
GitHub links, install/installed states. VS Code curated list updated
to match. All new copy translated across 12 locales.

* fix(skills): address catalog review findings

- GitHub metadata fetch timeout drops to 1.5s (under the catalog
  client's 3s deadline) and failed lookups cache briefly (5 min) so
  repeated catalog loads do not re-hit a failing API.
- Disk cache files are written with owner-only permissions (0o600);
  rename preserves the mode.
- loadSource deduplicates concurrent in-flight requests per source and
  the shared isLoadingSource flag now clears only when the last active
  source load finishes.
This commit is contained in:
Bohdan Triapitsyn
2026-08-20 01:40:10 +03:00
committed by GitHub
parent 90d8868bfc
commit 1ed3f1f575
45 changed files with 1143 additions and 1286 deletions
@@ -865,16 +865,26 @@ export const settingsDict = {
"settings.skills.catalog.page.mode.manual": "Вручну",
"settings.skills.catalog.page.mode.external": "зовнішній",
"settings.skills.catalog.page.title": "Каталог навичок",
'settings.skills.catalog.page.subtitle': 'Встановлюйте готові скіли з курованих репозиторіїв або додайте власне джерело.',
'settings.skills.catalog.page.section.sources': 'Джерела',
'settings.skills.catalog.page.searchAllPlaceholder': 'Пошук скілів у всіх джерелах…',
'settings.skills.catalog.page.search.clear': 'Очистити пошук',
'settings.skills.catalog.page.source.skillsCount': 'Скілів: {count}',
'settings.skills.catalog.page.source.stars': 'Зірок: {count}',
'settings.skills.catalog.page.source.updated': 'Оновлено {time}',
'settings.skills.catalog.page.source.addOwnTitle': 'Додати власне джерело',
'settings.skills.catalog.page.source.addOwnDescription': 'Будь-який git-репозиторій зі скілами',
'settings.skills.catalog.page.source.viewRepo': 'Відкрити репозиторій на GitHub',
'settings.skills.catalog.page.skill.viewOnGithub': 'Переглянути скіл на GitHub',
'settings.skills.catalog.page.list.searchTitle': 'Результати пошуку',
"settings.skills.catalog.page.section.sourceRepository": "Репозиторій вихідного коду",
"settings.skills.catalog.page.field.selectSourcePlaceholder": "Виберіть джерело",
"settings.skills.catalog.page.actions.refreshTitle": "Оновити",
"settings.skills.catalog.page.actions.removeCatalogTitle": "Видалити каталог",
"settings.skills.catalog.page.actions.addCatalog": "Додати каталог",
"settings.skills.catalog.page.actions.removeCatalog": "Видалити каталог",
"settings.skills.catalog.page.actions.loadMoreSkills": "Завантажити додаткові навички",
"settings.skills.catalog.page.loading.catalog": "Завантаження...",
"settings.skills.catalog.page.loading.skills": "Завантаження навичок...",
"settings.skills.catalog.page.loading.more": "Завантаження...",
"settings.skills.catalog.page.foundCount": "Знайдено навички {count}",
"settings.skills.catalog.page.error.catalogTitle": "Помилка каталогу",
"settings.skills.catalog.page.empty.noSkillsTitle": "Навички не знайдено",
@@ -882,7 +892,6 @@ export const settingsDict = {
"settings.skills.catalog.page.badge.installed": "встановлено ({scope})",
"settings.skills.catalog.page.badge.notInstallable": "не встановлюється",
"settings.skills.catalog.page.badge.unknown": "невідомий",
"settings.skills.catalog.page.byOwnerPrefix": "за",
"settings.skills.catalog.page.removeDialog.title": "Видалити каталог",
"settings.skills.catalog.page.removeDialog.description": "Ви впевнені, що хочете видалити цей каталог?",
"settings.openchamber.passkeys.title": "Ключі доступу",