Skip to content

Commit 29d04d1

Browse files
committed
feat(skills): add curated skill repo links to Skills settings page
Add a "Browse skills online" section to the Skills settings panel with clickable links to places users can find and download SKILL.md skills (Anthropic Skills, the agentskills.io open standard, the Claude Code Marketplace, and SkillsMP). Each link opens in the browser and is paired with a short description; a hint directs users to drop a downloaded skill folder into a scanned directory and hit Reload. This is a lightweight first step toward skill discovery, ahead of a full marketplace-style installer. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGXHB8jKct1peZjM8E1J5W
1 parent c238b9e commit 29d04d1

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)