feat(20-02): add compatibleAdapters prop to SkillCard and wire Browse/Trending tabs
- Add optional compatibleAdapters prop to SkillCardProps interface - Render 'Works with: ...' line when compatibleAdapters is provided and non-empty - Pass COMPATIBLE_ADAPTER_LABELS to all Browse tab SkillCard renders - Pass COMPATIBLE_ADAPTER_LABELS to all Trending tab SkillCard renders (gainingTraction, recentlyUpdated, youMightLike) - Installed tab SkillCards intentionally omit compatibleAdapters (already agent-scoped)
This commit is contained in:
parent
f79e0aa628
commit
f5ccdd5ff8
2 changed files with 13 additions and 0 deletions
|
|
@ -23,6 +23,7 @@ export interface SkillCardProps {
|
||||||
isReadOnly?: boolean;
|
isReadOnly?: boolean;
|
||||||
source?: "managed" | "native";
|
source?: "managed" | "native";
|
||||||
className?: string;
|
className?: string;
|
||||||
|
compatibleAdapters?: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function SkillCard({
|
export function SkillCard({
|
||||||
|
|
@ -37,6 +38,7 @@ export function SkillCard({
|
||||||
isReadOnly = false,
|
isReadOnly = false,
|
||||||
source,
|
source,
|
||||||
className,
|
className,
|
||||||
|
compatibleAdapters,
|
||||||
}: SkillCardProps) {
|
}: SkillCardProps) {
|
||||||
return (
|
return (
|
||||||
<Card className={cn("flex flex-col", className)}>
|
<Card className={cn("flex flex-col", className)}>
|
||||||
|
|
@ -77,6 +79,13 @@ export function SkillCard({
|
||||||
<p className="text-xs text-muted-foreground line-clamp-2">{skill.description}</p>
|
<p className="text-xs text-muted-foreground line-clamp-2">{skill.description}</p>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Row 2b: compatible adapters (Browse/Trending only) */}
|
||||||
|
{compatibleAdapters && compatibleAdapters.length > 0 && (
|
||||||
|
<p className="text-[10px] text-muted-foreground mt-1">
|
||||||
|
Works with: {compatibleAdapters.join(", ")}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Row 3: source badge + rating + actions (push right) */}
|
{/* Row 3: source badge + rating + actions (push right) */}
|
||||||
<div className="flex items-center gap-2 mt-auto pt-2">
|
<div className="flex items-center gap-2 mt-auto pt-2">
|
||||||
<Badge variant="secondary" className="text-xs">{skill.sourceId}</Badge>
|
<Badge variant="secondary" className="text-xs">{skill.sourceId}</Badge>
|
||||||
|
|
|
||||||
|
|
@ -387,6 +387,7 @@ export function SkillBrowser() {
|
||||||
skill={skill}
|
skill={skill}
|
||||||
isInstalled={!!skill.activeVersionId}
|
isInstalled={!!skill.activeVersionId}
|
||||||
hasUpdate={false}
|
hasUpdate={false}
|
||||||
|
compatibleAdapters={COMPATIBLE_ADAPTER_LABELS}
|
||||||
onInstall={() => setInstallDialog({ skillId: skill.id })}
|
onInstall={() => setInstallDialog({ skillId: skill.id })}
|
||||||
onUpdate={() => setInstallDialog({ skillId: skill.id, isUpdate: true })}
|
onUpdate={() => setInstallDialog({ skillId: skill.id, isUpdate: true })}
|
||||||
onRollback={() => handleRollback(skill.id)}
|
onRollback={() => handleRollback(skill.id)}
|
||||||
|
|
@ -546,6 +547,7 @@ export function SkillBrowser() {
|
||||||
skill={skill}
|
skill={skill}
|
||||||
isInstalled={!!skill.activeVersionId}
|
isInstalled={!!skill.activeVersionId}
|
||||||
hasUpdate={false}
|
hasUpdate={false}
|
||||||
|
compatibleAdapters={COMPATIBLE_ADAPTER_LABELS}
|
||||||
onInstall={() => setInstallDialog({ skillId: skill.id })}
|
onInstall={() => setInstallDialog({ skillId: skill.id })}
|
||||||
onUpdate={() => setInstallDialog({ skillId: skill.id, isUpdate: true })}
|
onUpdate={() => setInstallDialog({ skillId: skill.id, isUpdate: true })}
|
||||||
onRollback={() => handleRollback(skill.id)}
|
onRollback={() => handleRollback(skill.id)}
|
||||||
|
|
@ -565,6 +567,7 @@ export function SkillBrowser() {
|
||||||
skill={skill}
|
skill={skill}
|
||||||
isInstalled={!!skill.activeVersionId}
|
isInstalled={!!skill.activeVersionId}
|
||||||
hasUpdate={false}
|
hasUpdate={false}
|
||||||
|
compatibleAdapters={COMPATIBLE_ADAPTER_LABELS}
|
||||||
onInstall={() => setInstallDialog({ skillId: skill.id })}
|
onInstall={() => setInstallDialog({ skillId: skill.id })}
|
||||||
onUpdate={() => setInstallDialog({ skillId: skill.id, isUpdate: true })}
|
onUpdate={() => setInstallDialog({ skillId: skill.id, isUpdate: true })}
|
||||||
onRollback={() => handleRollback(skill.id)}
|
onRollback={() => handleRollback(skill.id)}
|
||||||
|
|
@ -584,6 +587,7 @@ export function SkillBrowser() {
|
||||||
skill={skill}
|
skill={skill}
|
||||||
isInstalled={!!skill.activeVersionId}
|
isInstalled={!!skill.activeVersionId}
|
||||||
hasUpdate={false}
|
hasUpdate={false}
|
||||||
|
compatibleAdapters={COMPATIBLE_ADAPTER_LABELS}
|
||||||
onInstall={() => setInstallDialog({ skillId: skill.id })}
|
onInstall={() => setInstallDialog({ skillId: skill.id })}
|
||||||
onUpdate={() => setInstallDialog({ skillId: skill.id, isUpdate: true })}
|
onUpdate={() => setInstallDialog({ skillId: skill.id, isUpdate: true })}
|
||||||
onRollback={() => handleRollback(skill.id)}
|
onRollback={() => handleRollback(skill.id)}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue