[BUG] Marketplace name is derived from the bare repo name, so any two `*/skills` repos collide
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report
- [x] I am using the latest version of Claude Code
What's Wrong?
When a GitHub repo is connected as a marketplace on the web, its name is derived from the bare repo name, with the owner discarded, and before the repo is synced. Since marketplace names must be unique per account and per organization, any two repos sharing a name — e.g. stepankuzmin/skills and mattpocock/skills — cannot both be added. Whoever adds second gets marketplace_name_taken.
There is no workaround short of renaming one of the repos, which the affected user often does not control. skills is close to the default name for an agent-skills repo, so collisions are common rather than exotic.
The name is repo-derived, and assigned before sync. The record created when adding stepankuzmin/skills:
{
"id": "marketplace_01PbhYVb5oXLXudTdqv7M6uZ",
"name": "skills",
"description": "stepankuzmin/skills",
"source_url": "https://github.com/stepankuzmin/skills",
"sync_status": "in_progress",
"last_synced_sha": null,
"sync_errors": null
}
Two things follow:
nameisskills, but that repo's.claude-plugin/marketplace.jsondeclares"name": "stepankuzmin", and has in every commit that ever touched the file. The name cannot have come from the manifest.sync_statusisin_progresswithlast_synced_sha: null. The repo had not been cloned yet, so the manifest was not readable at the point uniqueness was enforced.
The uniqueness check runs against a provisional, owner-stripped name, and the manifest's name field is ignored at the one moment it matters. stepankuzmin/skills and mattpocock/skills are already unambiguous as a pair. Only the truncation to skills manufactures the conflict.
Related: the CLI uses a different rule. claude plugin marketplace add (2.1.274) resolves the name from the manifest instead:
$ claude plugin marketplace add stepankuzmin/skills
√ Successfully added marketplace: stepankuzmin
And on a name collision it does not error, it silently replaces the existing entry (previously reported in #44042, closed as inactive without a fix). So the two surfaces disagree on both the name source and the collision behavior:
| | name source | on collision |
| --- | --- | --- |
| CLI | manifest name | silently overwrites |
| Web / API | bare repo name, pre-sync | rejects with marketplace_name_taken |
What Should Happen?
Two marketplaces from distinctly-named repos should coexist. Any of:
- Namespace the derived name as
owner/repo, which is already unique. - Clone and read the manifest
namebefore enforcing uniqueness, making the declared name authoritative on both surfaces. - Let the user supply a name at add time.
Independently, and cheap regardless of which is chosen: the error should say which name was taken and what the conflicting marketplace's source_url is. As written it gives the user nothing to act on, and does not even reveal that the offending name is skills rather than the manifest's declared name.
Error Messages/Logs
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "A marketplace with this name already exists.",
"details": {
"error_visibility": "user_facing",
"error_code": "marketplace_name_taken"
}
}
}
Steps to Reproduce
- On Claude Code Web, add
https://github.com/stepankuzmin/skillsas a marketplace. Succeeds, stored asname: "skills". - Add
https://github.com/mattpocock/skills. Fails withmarketplace_name_taken. - Reverse the order and the failure moves to the other repo. Reproduced on both a personal account and an organization.
Neither repo's marketplace.json declares "name": "skills".
Is this a regression?
I don't know
Claude Code Version
2.1.274
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Other
Additional Information
Claude Code Web (personal account and organization) plus CLI 2.1.274 on macOS.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗