Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 21 additions & 9 deletions src/skilz/commands/visit_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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}/"

Expand Down
10 changes: 4 additions & 6 deletions tests/test_visit_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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


Expand Down