From b5a68085aa523eb5b500c627fb14b188e47899d6 Mon Sep 17 00:00:00 2001 From: Rick Hightower Date: Fri, 9 Jan 2026 15:33:03 -0600 Subject: [PATCH] fix: correct skilz visit marketplace URL format - Change base URL from skillzwave.ai/skill to skillzwave.ai/agent-skill - Update slug format from owner__repo__skill__SKILL to owner__repo__skill - Handle single skill names by assuming spillwavesolutions organization - Update tests to match new URL format Example: - Before: skilz visit sdd -> https://skillzwave.ai/skill/sdd__SKILL/ - After: skilz visit sdd -> https://skillzwave.ai/agent-skill/spillwavesolutions__sdd__sdd Fixes marketplace URL generation for visit command. --- src/skilz/commands/visit_cmd.py | 30 +++++++++++++++++++++--------- tests/test_visit_cmd.py | 10 ++++------ 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/skilz/commands/visit_cmd.py b/src/skilz/commands/visit_cmd.py index fb923ab..6ff8022 100644 --- a/src/skilz/commands/visit_cmd.py +++ b/src/skilz/commands/visit_cmd.py @@ -9,7 +9,7 @@ from urllib.request import urlopen # Marketplace base URL -MARKETPLACE_BASE_URL = "https://skillzwave.ai/skill" +MARKETPLACE_BASE_URL = "https://skillzwave.ai/agent-skill" def resolve_github_url(source: str) -> str: @@ -86,25 +86,37 @@ def resolve_marketplace_url(source: str) -> str: return source # Convert owner/repo/skill format to marketplace format - # Marketplace uses: owner__repo__skill-name__SKILL + # Marketplace uses: owner__repo__skill-name (no __SKILL suffix) parts = source.split("/") if len(parts) >= 3: # owner/repo/skill-name format owner = parts[0] repo = parts[1] - skill_path = "__".join(parts[2:]) - marketplace_id = f"{owner}__{repo}__{skill_path}__SKILL" + skill_name = parts[-1] # Last part is the skill name + marketplace_id = f"{owner}__{repo}__{skill_name}" elif len(parts) == 2: - # owner/repo format - just the repo page + # owner/repo format - assume skill name is repo name owner = parts[0] repo = parts[1] - marketplace_id = f"{owner}__{repo}" + skill_name = repo # Assume skill name = repo name + marketplace_id = f"{owner}__{repo}__{skill_name}" + elif len(parts) == 1: + # Single name - assume it's a skill from spillwavesolutions organization + skill_name = parts[0] + # For single names, assume spillwavesolutions organization and skill name = repo name + marketplace_id = f"spillwavesolutions__{skill_name}__{skill_name}" else: # Assume it's already a marketplace ID or skill name - marketplace_id = source.replace("/", "__") - if not marketplace_id.endswith("__SKILL"): - marketplace_id = f"{marketplace_id}__SKILL" + # Try to parse as owner__repo__skill format + if "__" in source and source.count("__") >= 2: + marketplace_id = source + else: + # Fallback: assume it's just a skill name, can't generate proper URL + raise ValueError( + f"Cannot generate marketplace URL for '{source}'. " + "Expected format: owner/repo, owner/repo/skill-name, or skill-name" + ) return f"{MARKETPLACE_BASE_URL}/{marketplace_id}/" diff --git a/tests/test_visit_cmd.py b/tests/test_visit_cmd.py index c31dee7..25bb865 100644 --- a/tests/test_visit_cmd.py +++ b/tests/test_visit_cmd.py @@ -84,21 +84,19 @@ class TestResolveMarketplaceUrl: def test_owner_repo_skill_format(self): """owner/repo/skill should resolve to marketplace URL.""" url = resolve_marketplace_url("Jamie-BitFlight/claude_skills/brainstorming-skill") - expected = ( - f"{MARKETPLACE_BASE_URL}/Jamie-BitFlight__claude_skills__brainstorming-skill__SKILL/" - ) + expected = f"{MARKETPLACE_BASE_URL}/Jamie-BitFlight__claude_skills__brainstorming-skill/" assert url == expected def test_owner_repo_format(self): """owner/repo should resolve to marketplace URL.""" url = resolve_marketplace_url("anthropics/skills") - expected = f"{MARKETPLACE_BASE_URL}/anthropics__skills/" + expected = f"{MARKETPLACE_BASE_URL}/anthropics__skills__skills/" assert url == expected def test_nested_skill_path(self): """owner/repo/path/to/skill should work.""" url = resolve_marketplace_url("owner/repo/skills/xlsx") - expected = f"{MARKETPLACE_BASE_URL}/owner__repo__skills__xlsx__SKILL/" + expected = f"{MARKETPLACE_BASE_URL}/owner__repo__xlsx/" assert url == expected def test_https_passthrough(self): @@ -114,7 +112,7 @@ def test_empty_raises_error(self): def test_single_skill_name(self): """Single skill name should be converted.""" url = resolve_marketplace_url("my-skill") - expected = f"{MARKETPLACE_BASE_URL}/my-skill__SKILL/" + expected = f"{MARKETPLACE_BASE_URL}/spillwavesolutions__my-skill__my-skill/" assert url == expected