Skip to content

Commit 4dbe509

Browse files
authored
Merge pull request #165 from posit-dev/enh-present-multiple-skills
enh: present multiple skills
2 parents 66b8b7c + 6b2191f commit 4dbe509

20 files changed

Lines changed: 3132 additions & 127 deletions

File tree

great-docs.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,3 +354,22 @@ reference:
354354
- install_skill
355355
- check_skill
356356
- list_skills
357+
358+
# Agent Skills
359+
# ------------
360+
# Multiple named skills for the documentation site. Each entry maps
361+
# a human-readable name to a SKILL.md file path. All skills appear
362+
# on the Skills page with a switcher bar and are placed in
363+
# .well-known/agent-skills/ for auto-discovery.
364+
skill:
365+
skills:
366+
- name: great-docs
367+
file: skills/great-docs/SKILL.md
368+
- name: write-user-guide
369+
file: skills/write-user-guide/SKILL.md
370+
- name: revise-docstrings
371+
file: skills/revise-docstrings/SKILL.md
372+
- name: configure-site
373+
file: skills/configure-site/SKILL.md
374+
- name: author-skills
375+
file: skills/author-skills/SKILL.md

great_docs/_skill_install.py

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,15 @@ def _find_package_skills(package: str) -> list[Path]:
135135
return skill_files
136136

137137

138-
def _find_skill_from_url(url: str) -> tuple[str, str] | None:
139-
"""Fetch a SKILL.md from a well-known URL.
138+
def _find_skill_from_url(url: str) -> list[tuple[str, str]] | None:
139+
"""Fetch skills from a well-known URL.
140140
141141
Tries the agent-skills discovery protocol:
142142
143-
1. `{url}/.well-known/agent-skills/index.json`
144-
2. falls back to `{url}/skill.md`
143+
1. `{url}/.well-known/agent-skills/index.json` — fetches *all* listed skills
144+
2. falls back to `{url}/skill.md` (single skill)
145145
146-
Returns `(skill_name, content)` or `None` on failure.
146+
Returns a list of `(skill_name, content)` tuples, or `None` on failure.
147147
"""
148148
import urllib.error
149149
import urllib.request
@@ -158,12 +158,18 @@ def _find_skill_from_url(url: str) -> tuple[str, str] | None:
158158

159159
skills = index_data.get("skills", [])
160160
if skills:
161-
skill_entry = skills[0] # Take first skill
162-
name = skill_entry.get("name", "default")
163-
skill_url = f"{base}/.well-known/agent-skills/{name}/SKILL.md"
164-
with urllib.request.urlopen(skill_url, timeout=10) as resp: # noqa: S310
165-
content = resp.read().decode("utf-8")
166-
return name, content
161+
results: list[tuple[str, str]] = []
162+
for skill_entry in skills:
163+
name = skill_entry.get("name", "default")
164+
skill_url = f"{base}/.well-known/agent-skills/{name}/SKILL.md"
165+
try:
166+
with urllib.request.urlopen(skill_url, timeout=10) as resp: # noqa: S310
167+
content = resp.read().decode("utf-8")
168+
results.append((name, content))
169+
except (urllib.error.URLError, OSError):
170+
pass # Skip skills that fail to download
171+
if results:
172+
return results
167173
except (urllib.error.URLError, json.JSONDecodeError, KeyError, OSError):
168174
pass
169175

@@ -174,7 +180,7 @@ def _find_skill_from_url(url: str) -> tuple[str, str] | None:
174180
content = resp.read().decode("utf-8")
175181
fm, _ = _parse_frontmatter(content)
176182
name = fm.get("name", "default")
177-
return name, content
183+
return [(name, content)]
178184
except (urllib.error.URLError, OSError):
179185
pass
180186

@@ -316,14 +322,14 @@ def install_skill(
316322
skills_to_install.append((name, skill_content, extra_files or {}))
317323

318324
elif url:
319-
result = _find_skill_from_url(url)
320-
if result is None:
325+
results = _find_skill_from_url(url)
326+
if results is None:
321327
if not quiet:
322328
print(f"Error: Could not find skills at {url}")
323329
return []
324-
name, content = result
325-
name = skill_name or name
326-
skills_to_install.append((name, content, extra_files or {}))
330+
for name, content in results:
331+
name = skill_name or name
332+
skills_to_install.append((name, content, extra_files or {}))
327333

328334
elif package:
329335
skill_files = _find_package_skills(package)

great_docs/_translations.py

Lines changed: 161 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3585,6 +3585,33 @@
35853585
"ar": "تثبيت هذا الـ skill (المهارة)",
35863586
"he": "התקן skill (מיומנות) זה",
35873587
},
3588+
"install_these_skills": {
3589+
"en": "Install these skills",
3590+
"fr": "Installer ces skills (compétences)",
3591+
"de": "Diese Skills (Fähigkeiten) installieren",
3592+
"es": "Instalar estos skills (habilidades)",
3593+
"pt": "Instalar estes skills (habilidades)",
3594+
"it": "Installa questi skills (competenze)",
3595+
"nl": "Deze skills (vaardigheden) installeren",
3596+
"ja": "これらのスキル (skills) をインストール",
3597+
"ko": "이 스킬들 (skills) 설치",
3598+
"zh-Hans": "安装这些 skills (技能)",
3599+
"zh-Hant": "安裝這些 skills (技能)",
3600+
"ru": "Установить эти skills (навыки)",
3601+
"pl": "Zainstaluj te skills (umiejętności)",
3602+
"tr": "Bu skills (becerileri) yükle",
3603+
"sv": "Installera dessa färdigheter",
3604+
"da": "Installér disse færdigheder",
3605+
"nb": "Installer disse ferdighetene",
3606+
"is": "Setja upp þessar færnir",
3607+
"fi": "Asenna nämä taidot",
3608+
"cs": "Nainstalovat tyto dovednosti",
3609+
"ro": "Instalați aceste abilități",
3610+
"el": "Εγκαταστήστε αυτές τις δεξιότητες",
3611+
"hi": "ये कौशल इंस्टॉल करें",
3612+
"ar": "تثبيت هذه الـ skills (المهارات)",
3613+
"he": "התקן skills (מיומנויות) אלה",
3614+
},
35883615
"any_agent": {
35893616
"en": "Any agent",
35903617
"fr": "Tout agent",
@@ -3801,6 +3828,33 @@
38013828
"ar": "أو تصفح",
38023829
"he": "או עיין בקובץ",
38033830
},
3831+
"browse_skill_files": {
3832+
"en": "Or browse the skill files below",
3833+
"fr": "Ou parcourir les fichiers de compétences ci-dessous",
3834+
"de": "Oder die Fähigkeitsdateien unten ansehen",
3835+
"es": "O navegar los archivos de habilidades a continuación",
3836+
"pt": "Ou navegar os arquivos de habilidades abaixo",
3837+
"it": "Oppure sfoglia i file delle competenze qui sotto",
3838+
"nl": "Of bekijk de vaardigheidsbestanden hieronder",
3839+
"ja": "または以下のスキルファイルを閲覧する",
3840+
"ko": "또는 아래 스킬 파일 찾아보기",
3841+
"zh-Hans": "或浏览以下技能文件",
3842+
"zh-Hant": "或瀏覽以下技能檔案",
3843+
"ru": "Или просмотрите файлы навыков ниже",
3844+
"pl": "Lub przeglądaj pliki umiejętności poniżej",
3845+
"tr": "Veya aşağıdaki beceri dosyalarına göz atın",
3846+
"sv": "Eller bläddra i färdighetsfilerna nedan",
3847+
"da": "Eller gennemse færdighedsfilerne nedenfor",
3848+
"nb": "Eller bla gjennom ferdighetsfilene nedenfor",
3849+
"is": "Eða skoðaðu færniskrárnar hér að neðan",
3850+
"fi": "Tai selaa taitotiedostoja alla",
3851+
"cs": "Nebo procházejte soubory dovedností níže",
3852+
"ro": "Sau răsfoiți fișierele de abilități de mai jos",
3853+
"el": "Ή περιηγηθείτε στα αρχεία δεξιοτήτων παρακάτω",
3854+
"hi": "या नीचे कौशल फ़ाइलें ब्राउज़ करें",
3855+
"ar": "أو تصفح ملفات المهارات أدناه",
3856+
"he": "או עיין בקבצי המיומנויות למטה",
3857+
},
38043858
"file_word": {
38053859
"en": "file",
38063860
"fr": "fichier",
@@ -4144,32 +4198,113 @@
41444198
"ar": "التثبيت باستخدام",
41454199
"he": "התקן עם",
41464200
},
4147-
"works_with_agents": {
4148-
"en": "and [30+ other agents](https://github.com/vercel-labs/skills).",
4149-
"fr": "et [30+ autres agents](https://github.com/vercel-labs/skills).",
4150-
"de": "und [30+ weitere Agenten](https://github.com/vercel-labs/skills).",
4151-
"es": "y [30+ otros agentes](https://github.com/vercel-labs/skills).",
4152-
"pt": "e [30+ outros agentes](https://github.com/vercel-labs/skills).",
4153-
"it": "e [30+ altri agenti](https://github.com/vercel-labs/skills).",
4154-
"nl": "en [30+ andere agents](https://github.com/vercel-labs/skills).",
4155-
"ja": "、[30以上の他のエージェント](https://github.com/vercel-labs/skills)に対応。",
4156-
"ko": " 및 [30개 이상의 다른 에이전트](https://github.com/vercel-labs/skills).",
4157-
"zh-Hans": "以及[30多个其他代理](https://github.com/vercel-labs/skills)。",
4158-
"zh-Hant": "以及[30多個其他代理](https://github.com/vercel-labs/skills)。",
4159-
"ru": "и [30+ других агентов](https://github.com/vercel-labs/skills).",
4160-
"pl": "i [30+ innych agentów](https://github.com/vercel-labs/skills).",
4161-
"tr": "ve [30+ diğer ajan](https://github.com/vercel-labs/skills).",
4162-
"sv": "och [30+ andra agenter](https://github.com/vercel-labs/skills).",
4163-
"da": "og [30+ andre agenter](https://github.com/vercel-labs/skills).",
4164-
"nb": "og [30+ andre agenter](https://github.com/vercel-labs/skills).",
4165-
"is": "og [30+ aðrir agentar](https://github.com/vercel-labs/skills).",
4166-
"fi": "ja [yli 30 muuta agenttia](https://github.com/vercel-labs/skills).",
4167-
"cs": "a [30+ dalších agentů](https://github.com/vercel-labs/skills).",
4168-
"ro": "și [peste 30 de alți agenți](https://github.com/vercel-labs/skills).",
4169-
"el": "και [30+ άλλους πράκτορες](https://github.com/vercel-labs/skills).",
4170-
"hi": "और [30+ अन्य एजेंट](https://github.com/vercel-labs/skills)।",
4171-
"ar": "و[أكثر من 30 وكيلًا آخر](https://github.com/vercel-labs/skills).",
4172-
"he": "ו-[30+ סוכנים נוספים](https://github.com/vercel-labs/skills).",
4201+
"install_all_with_npx": {
4202+
"en": "install all with",
4203+
"fr": "tout installer avec",
4204+
"de": "alle installieren mit",
4205+
"es": "instalar todos con",
4206+
"pt": "instalar todos com",
4207+
"it": "installare tutti con",
4208+
"nl": "alles installeren met",
4209+
"ja": "すべてインストール:",
4210+
"ko": "모두 설치:",
4211+
"zh-Hans": "全部安装:",
4212+
"zh-Hant": "全部安裝:",
4213+
"ru": "установить все с помощью",
4214+
"pl": "zainstaluj wszystkie za pomocą",
4215+
"tr": "tümünü yükle:",
4216+
"sv": "installera alla med",
4217+
"da": "installér alle med",
4218+
"nb": "installer alle med",
4219+
"is": "setja allt upp með",
4220+
"fi": "asenna kaikki käyttäen",
4221+
"cs": "nainstalovat vše pomocí",
4222+
"ro": "instalați toate cu",
4223+
"el": "εγκαταστήστε όλα με",
4224+
"hi": "सभी इंस्टॉल करें:",
4225+
"ar": "تثبيت الكل باستخدام",
4226+
"he": "התקן הכל עם",
4227+
},
4228+
"cli_install": {
4229+
"en": "CLI",
4230+
"fr": "CLI",
4231+
"de": "CLI",
4232+
"es": "CLI",
4233+
"pt": "CLI",
4234+
"it": "CLI",
4235+
"nl": "CLI",
4236+
"ja": "CLI",
4237+
"ko": "CLI",
4238+
"zh-Hans": "CLI",
4239+
"zh-Hant": "CLI",
4240+
"ru": "CLI",
4241+
"pl": "CLI",
4242+
"tr": "CLI",
4243+
"sv": "CLI",
4244+
"da": "CLI",
4245+
"nb": "CLI",
4246+
"is": "CLI",
4247+
"fi": "CLI",
4248+
"cs": "CLI",
4249+
"ro": "CLI",
4250+
"el": "CLI",
4251+
"hi": "CLI",
4252+
"ar": "CLI",
4253+
"he": "CLI",
4254+
},
4255+
"install_all_in_project": {
4256+
"en": "install all skills in a project",
4257+
"fr": "installer toutes les compétences dans un projet",
4258+
"de": "alle Fähigkeiten in einem Projekt installieren",
4259+
"es": "instalar todas las habilidades en un proyecto",
4260+
"pt": "instalar todas as habilidades em um projeto",
4261+
"it": "installare tutte le competenze in un progetto",
4262+
"nl": "alle vaardigheden in een project installeren",
4263+
"ja": "プロジェクト内のすべてのスキルをインストール",
4264+
"ko": "프로젝트의 모든 스킬 설치",
4265+
"zh-Hans": "在项目中安装所有技能",
4266+
"zh-Hant": "在專案中安裝所有技能",
4267+
"ru": "установить все навыки в проекте",
4268+
"pl": "zainstaluj wszystkie umiejętności w projekcie",
4269+
"tr": "projede tüm becerileri yükle",
4270+
"sv": "installera alla färdigheter i ett projekt",
4271+
"da": "installér alle færdigheder i et projekt",
4272+
"nb": "installer alle ferdigheter i et prosjekt",
4273+
"is": "setja upp allar færnir í verkefni",
4274+
"fi": "asenna kaikki taidot projektiin",
4275+
"cs": "nainstalovat všechny dovednosti v projektu",
4276+
"ro": "instalați toate abilitățile într-un proiect",
4277+
"el": "εγκαταστήστε όλες τις δεξιότητες σε ένα έργο",
4278+
"hi": "एक प्रोजेक्ट में सभी कौशल इंस्टॉल करें",
4279+
"ar": "تثبيت جميع المهارات في المشروع",
4280+
"he": "התקן את כל המיומנויות בפרויקט",
4281+
},
4282+
"tell_the_agent_to_fetch": {
4283+
"en": "tell the agent to fetch these skill files",
4284+
"fr": "demandez à l'agent de récupérer ces fichiers de compétences",
4285+
"de": "sagen Sie dem Agenten, diese Fähigkeitsdateien abzurufen",
4286+
"es": "dígale al agente que obtenga estos archivos de habilidades",
4287+
"pt": "diga ao agente para buscar estes arquivos de habilidades",
4288+
"it": "dì all'agente di recuperare questi file di competenze",
4289+
"nl": "vertel de agent deze vaardigheidsbestanden op te halen",
4290+
"ja": "エージェントにこれらのスキルファイルを取得するよう指示:",
4291+
"ko": "에이전트에게 이 스킬 파일들을 가져오라고 전달:",
4292+
"zh-Hans": "告诉代理获取这些技能文件:",
4293+
"zh-Hant": "告訴代理取得這些技能檔案:",
4294+
"ru": "скажите агенту получить эти файлы навыков",
4295+
"pl": "powiedz agentowi, aby pobrał te pliki umiejętności",
4296+
"tr": "ajana bu beceri dosyalarını almasını söyleyin",
4297+
"sv": "be agenten att hämta dessa färdighetsfiler",
4298+
"da": "bed agenten om at hente disse færdighedsfiler",
4299+
"nb": "be agenten hente disse ferdighetsfilene",
4300+
"is": "segðu agentanum að sækja þessar færniskrár",
4301+
"fi": "pyydä agenttia hakemaan nämä taitotiedostot",
4302+
"cs": "řekněte agentovi, aby stáhl tyto soubory dovedností",
4303+
"ro": "spuneți agentului să descarce aceste fișiere de abilități",
4304+
"el": "πείτε στον πράκτορα να ανακτήσει αυτά τα αρχεία δεξιοτήτων",
4305+
"hi": "एजेंट को ये कौशल फ़ाइलें प्राप्त करने को कहें",
4306+
"ar": "أخبر الوكيل بجلب ملفات المهارات هذه",
4307+
"he": "אמור לסוכן להוריד את קבצי המיומנויות האלה",
41734308
},
41744309
# ── RST directive / callout labels ────────────────────────────────────
41754310
"added_in_version": {

0 commit comments

Comments
 (0)