Skip to content

Commit f94d831

Browse files
authored
Merge pull request #1168 from devoxx/claude/plugin-skill-integration-xb3opr
2 parents a786e93 + 29d04d1 commit f94d831

1 file changed

Lines changed: 65 additions & 0 deletions

File tree

src/main/java/com/devoxx/genie/ui/settings/skill/SkillsSettingsComponent.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.devoxx.genie.ui.settings.DevoxxGenieStateService;
66
import com.intellij.ide.BrowserUtil;
77
import com.intellij.openapi.project.Project;
8+
import com.intellij.ui.HyperlinkLabel;
89
import com.intellij.ui.JBColor;
910
import com.intellij.ui.components.JBLabel;
1011
import com.intellij.ui.components.JBScrollPane;
@@ -35,6 +36,29 @@ public class SkillsSettingsComponent extends AbstractSettingsComponent {
3536

3637
private static final String DOCS_URL = "https://genie.devoxx.com/docs/features/skills";
3738

39+
/** A curated external source where users can discover and download skills. */
40+
private record SkillLink(String title, String url, String description) {}
41+
42+
/**
43+
* Curated links shown in the "Browse skills online" section. Skills follow the open
44+
* {@code SKILL.md} standard, so a skill folder downloaded from any of these sources can be
45+
* dropped into one of the scanned skill directories and picked up by the {@link SkillRegistry}.
46+
*/
47+
private static final SkillLink[] SKILL_LINKS = {
48+
new SkillLink("Anthropic Skills",
49+
"https://github.com/anthropics/skills",
50+
"Official Agent Skills published by Anthropic"),
51+
new SkillLink("Agent Skills standard",
52+
"https://agentskills.io",
53+
"The open SKILL.md specification, portable across AI coding tools"),
54+
new SkillLink("Claude Code Marketplace",
55+
"https://github.com/netresearch/claude-code-marketplace",
56+
"40+ community skills for AI-assisted development"),
57+
new SkillLink("SkillsMP",
58+
"https://skillsmp.com",
59+
"Searchable directory of community SKILL.md files"),
60+
};
61+
3862
private final Project project;
3963
private final SkillRegistry registry;
4064
private final SkillsTableModel tableModel = new SkillsTableModel();
@@ -100,6 +124,17 @@ public JPanel createPanel() {
100124
gbc.gridy++;
101125
panel.add(description, gbc);
102126

127+
// Curated links to places where users can find skills to download into the folders above.
128+
addSection(panel, gbc, "Browse skills online");
129+
130+
JBLabel linksHint = new JBLabel(
131+
"Download a skill's folder from one of these sources into a directory above, then click Reload.");
132+
gbc.gridy++;
133+
panel.add(linksHint, gbc);
134+
135+
gbc.gridy++;
136+
panel.add(buildLinksPanel(), gbc);
137+
103138
// Toolbar: a single "Open Skills Folder" button + dropdown that selects which of the
104139
// six skill directories to open, followed by the Reload button on the same row. The
105140
// previous layout (six side-by-side buttons in a FlowLayout) overflowed and clipped
@@ -172,6 +207,36 @@ public JPanel createPanel() {
172207
return panel;
173208
}
174209

210+
/**
211+
* Builds a panel listing the curated {@link #SKILL_LINKS}, one per row: a clickable
212+
* {@link HyperlinkLabel} opening the source in the browser, followed by a short description.
213+
*/
214+
private JPanel buildLinksPanel() {
215+
JPanel linksPanel = new JPanel(new GridBagLayout());
216+
GridBagConstraints lgbc = new GridBagConstraints();
217+
lgbc.gridy = 0;
218+
lgbc.anchor = GridBagConstraints.WEST;
219+
lgbc.insets = JBUI.insets(2, 0, 2, 12);
220+
221+
for (SkillLink link : SKILL_LINKS) {
222+
HyperlinkLabel label = new HyperlinkLabel(link.title());
223+
label.setHyperlinkTarget(link.url());
224+
label.setToolTipText(link.url());
225+
lgbc.gridx = 0;
226+
lgbc.weightx = 0;
227+
linksPanel.add(label, lgbc);
228+
229+
JBLabel desc = new JBLabel(link.description());
230+
desc.setForeground(JBColor.GRAY);
231+
lgbc.gridx = 1;
232+
lgbc.weightx = 1.0;
233+
linksPanel.add(desc, lgbc);
234+
235+
lgbc.gridy++;
236+
}
237+
return linksPanel;
238+
}
239+
175240
public boolean isModified() {
176241
Set<String> persisted = DevoxxGenieStateService.getInstance().getDisabledSkillNames();
177242
if (persisted == null) {

0 commit comments

Comments
 (0)