Skip to content

Commit f74336b

Browse files
zhujian0805claude
andcommitted
feat(plugins): add alias support for plugin repositories
- Add aliases field to PluginRepo model for alternative names - Update repo lookup methods to resolve aliases to canonical names - Add superpowers-marketplace as builtin repo - Add every-marketplace as alias for compounding-engineering 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent b7789b6 commit f74336b

3 files changed

Lines changed: 53 additions & 17 deletions

File tree

code_assistant_manager/plugin_repos.json

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,30 @@
22
"compounding-engineering": {
33
"name": "compounding-engineering",
44
"description": "A Claude Code plugin for compounding engineering practices",
5+
"enabled": true,
6+
"type": "plugin",
57
"repoOwner": "EveryInc",
68
"repoName": "compounding-engineering-plugin",
79
"repoBranch": "main",
810
"pluginPath": "plugins/compounding-engineering",
9-
"type": "plugin",
10-
"enabled": true
11+
"aliases": ["every-marketplace"]
1112
},
1213
"claude-code-plugins-plus": {
1314
"name": "claude-code-plugins-plus",
14-
"description": "A marketplace with 100+ Claude Code plugins for various domains",
15+
"description": "A comprehensive marketplace and educational hub for Claude Code plugins",
16+
"enabled": true,
17+
"type": "marketplace",
1518
"repoOwner": "jeremylongshore",
1619
"repoName": "claude-code-plugins-plus",
17-
"repoBranch": "main",
20+
"repoBranch": "main"
21+
},
22+
"superpowers-marketplace": {
23+
"name": "superpowers-marketplace",
24+
"description": "Curated Claude Code plugins: skills, workflows, and productivity tools",
25+
"enabled": true,
1826
"type": "marketplace",
19-
"enabled": true
27+
"repoOwner": "obra",
28+
"repoName": "superpowers-marketplace",
29+
"repoBranch": "main"
2030
}
2131
}

code_assistant_manager/plugins/manager.py

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def _load_builtin_plugin_repos() -> Dict[str, PluginRepo]:
3232
plugin_path=repo_data.get("pluginPath"),
3333
enabled=repo_data.get("enabled", True),
3434
type=repo_data.get("type", "plugin"),
35+
aliases=repo_data.get("aliases", []),
3536
)
3637
logger.debug(f"Loaded {len(repos)} builtin plugin repos")
3738
except Exception as e:
@@ -234,8 +235,11 @@ def get_builtin_repos(self) -> Dict[str, PluginRepo]:
234235
return BUILTIN_PLUGIN_REPOS.copy()
235236

236237
def get_builtin_repo(self, name: str) -> Optional[PluginRepo]:
237-
"""Get a built-in plugin repository by name."""
238-
return BUILTIN_PLUGIN_REPOS.get(name)
238+
"""Get a built-in plugin repository by name (supports aliases)."""
239+
resolved = self._resolve_repo_name(name, self.get_builtin_repos())
240+
if resolved:
241+
return BUILTIN_PLUGIN_REPOS.get(resolved)
242+
return None
239243

240244
# ==================== User Plugin Repos ====================
241245

@@ -258,6 +262,7 @@ def _load_user_repos(self) -> Dict[str, PluginRepo]:
258262
plugin_path=repo_data.get("pluginPath"),
259263
enabled=repo_data.get("enabled", True),
260264
type=repo_data.get("type", "plugin"),
265+
aliases=repo_data.get("aliases", []),
261266
)
262267
return repos
263268
except Exception as e:
@@ -275,9 +280,12 @@ def get_user_repos(self) -> Dict[str, PluginRepo]:
275280
return self._load_user_repos()
276281

277282
def get_user_repo(self, name: str) -> Optional[PluginRepo]:
278-
"""Get a user plugin repository by name."""
279-
repos = self._load_user_repos()
280-
return repos.get(name)
283+
"""Get a user plugin repository by name (supports aliases)."""
284+
user_repos = self._load_user_repos()
285+
resolved = self._resolve_repo_name(name, user_repos)
286+
if resolved:
287+
return user_repos.get(resolved)
288+
return None
281289

282290
def add_user_repo(self, repo: PluginRepo) -> None:
283291
"""Add or update a user plugin repository."""
@@ -302,14 +310,28 @@ def get_all_repos(self) -> Dict[str, PluginRepo]:
302310
repos.update(self._load_user_repos())
303311
return repos
304312

313+
def _resolve_repo_name(
314+
self, name: str, repos: Dict[str, PluginRepo]
315+
) -> Optional[str]:
316+
"""Resolve a repo name, checking for aliases. Returns the canonical name or None."""
317+
# First check if it's a direct match
318+
if name in repos:
319+
return name
320+
321+
# Check if it's an alias
322+
for canonical_name, repo in repos.items():
323+
if name in repo.aliases:
324+
return canonical_name
325+
326+
return None
327+
305328
def get_repo(self, name: str) -> Optional[PluginRepo]:
306-
"""Get a plugin repo by name (user repos take precedence)."""
307-
# Check user repos first
308-
user_repo = self.get_user_repo(name)
309-
if user_repo:
310-
return user_repo
311-
# Fall back to builtin
312-
return self.get_builtin_repo(name)
329+
"""Get a plugin repo by name, supporting aliases (user repos take precedence)."""
330+
all_repos = self.get_all_repos()
331+
resolved = self._resolve_repo_name(name, all_repos)
332+
if resolved:
333+
return all_repos.get(resolved)
334+
return None
313335

314336
# ==================== Installation Operations ====================
315337

code_assistant_manager/plugins/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ class PluginRepo:
146146
plugin_path: Optional[str] = None
147147
enabled: bool = True
148148
type: str = "plugin" # "plugin" or "marketplace"
149+
aliases: List[str] = field(default_factory=list) # Alternative names for this entry
149150

150151
def to_dict(self) -> Dict[str, Any]:
151152
"""Convert to dictionary."""
@@ -163,6 +164,8 @@ def to_dict(self) -> Dict[str, Any]:
163164
data["repoBranch"] = self.repo_branch
164165
if self.plugin_path:
165166
data["pluginPath"] = self.plugin_path
167+
if self.aliases:
168+
data["aliases"] = self.aliases
166169
return data
167170

168171
@classmethod
@@ -176,4 +179,5 @@ def from_dict(cls, data: Dict[str, Any]) -> "PluginRepo":
176179
repo_branch=data.get("repoBranch", "main"),
177180
plugin_path=data.get("pluginPath"),
178181
enabled=data.get("enabled", True),
182+
aliases=data.get("aliases", []),
179183
)

0 commit comments

Comments
 (0)