const getSkillsScript = () => ` // ─── Skills ─── var skillsSearchTimeout = null; var skillsCache = null; var topSkills = (window.__topSkills || []); function showSkillsModal() { sendStats('Skills modal opened'); document.getElementById('skillsModal').style.display = 'flex'; loadInstalledSkills(); if (topSkills.length > 0) { renderFeaturedSkills(topSkills); } } function renderFeaturedSkills(skills) { var grid = document.getElementById('skillsGrid'); if (!grid) return; var html = ''; skills.forEach(function(skill) { var name = skill.name || 'Unknown'; var installs = skill.installs || 0; var source = skill.source || ''; var installsHtml = installs > 0 ? '' + (installs >= 1000 ? (Math.round(installs / 100) / 10) + 'k' : installs) + ' installs' : ''; var safeId = escapeHtml(skill.id || name).replace(/'/g, '''); var rawUrl = skill.rawUrl || ''; var installsText = installs >= 1000 ? (Math.round(installs / 100) / 10) + 'k installs' : (installs > 0 ? installs + ' installs' : ''); html += '
' + '
' + '
' + escapeHtml(name.charAt(0).toUpperCase()) + '
' + '
' + '
' + escapeHtml(name) + '
' + '
' + installsHtml + '
' + '
' + '
' + '
' + escapeHtml(source) + '
' + '
'; }); grid.innerHTML = html; } function hideSkillsModal() { document.getElementById('skillsModal').style.display = 'none'; } function loadInstalledSkills() { vscode.postMessage({ type: 'loadSkills' }); } function displaySkills(skills) { var skillsList = document.getElementById('skillsList'); skillsList.innerHTML = ''; if (!skills || skills.length === 0) { skillsList.innerHTML = '
' + '
' + '
No skills installed
' + '' + '
'; return; } skills.forEach(function(skill, idx) { var item = document.createElement('div'); item.className = 'mcp-server-item'; item.style.flexDirection = 'column'; item.style.alignItems = 'stretch'; var desc = skill.description || 'No description'; var content = skill.content || ''; var detailId = 'skill-detail-' + idx; item.innerHTML = '
' + '
' + '
' + escapeHtml(skill.name) + ' ' + escapeHtml(skill.scope) + '
' + '
' + escapeHtml(desc) + '
' + '
' + '
' + '' + '' + '
' + '
' + ''; skillsList.appendChild(item); }); // Add create button at bottom var addDiv = document.createElement('div'); addDiv.className = 'mcp-add-server'; addDiv.innerHTML = ''; skillsList.appendChild(addDiv); } function showSkillAddForm() { document.getElementById('skillsList').style.display = 'none'; document.getElementById('skillsMarketplace').style.display = 'none'; document.getElementById('skillAddForm').style.display = 'block'; // Clear form document.getElementById('skillName').value = ''; document.getElementById('skillDescription').value = ''; document.getElementById('skillContent').value = ''; document.getElementById('skillName').disabled = false; } function hideSkillAddForm() { document.getElementById('skillsList').style.display = ''; document.getElementById('skillsMarketplace').style.display = 'block'; document.getElementById('skillAddForm').style.display = 'none'; loadInstalledSkills(); } function saveSkill() { var name = document.getElementById('skillName').value.trim(); var description = document.getElementById('skillDescription').value.trim(); var scope = document.getElementById('skillScope').value; var content = document.getElementById('skillContent').value; if (!name) return; // Build SKILL.md content var skillMd = '---\\n'; skillMd += 'name: ' + name + '\\n'; if (description) { skillMd += 'description: ' + description + '\\n'; } skillMd += '---\\n\\n'; skillMd += content || ''; vscode.postMessage({ type: 'saveSkill', name: name, scope: scope, content: skillMd }); hideSkillAddForm(); } function deleteSkill(name, scope) { vscode.postMessage({ type: 'deleteSkill', name: name, scope: scope }); } function searchSkills(query) { clearTimeout(skillsSearchTimeout); skillsSearchTimeout = setTimeout(function() { if (!query || query.length < 2) { renderFeaturedSkills(topSkills); return; } // Filter featured locally first var q = query.toLowerCase(); var local = topSkills.filter(function(s) { return (s.name && s.name.toLowerCase().indexOf(q) >= 0) || (s.source && s.source.toLowerCase().indexOf(q) >= 0); }); if (local.length > 0) { renderFeaturedSkills(local); } else { var grid = document.getElementById('skillsGrid'); grid.innerHTML = '
Searching...
'; } // Also search API vscode.postMessage({ type: 'searchSkills', query: query }); }, 300); } function handleSkillsSearchResponse(data) { var grid = document.getElementById('skillsGrid'); if (!grid) return; var skills = data.skills || []; if (skills.length === 0) { grid.innerHTML = '
No skills found.
'; return; } var html = ''; skills.forEach(function(skill) { var name = skill.name || skill.skillId || 'Unknown'; var installs = skill.installs || 0; var source = skill.source || ''; var safeId = escapeHtml(skill.id || name).replace(/'/g, '''); var installsHtml = installs > 0 ? '' + (installs >= 1000 ? (Math.round(installs / 100) / 10) + 'k' : installs) + ' installs' : ''; var rawUrl = skill.rawUrl || ''; var installsText = installs >= 1000 ? (Math.round(installs / 100) / 10) + 'k installs' : (installs > 0 ? installs + ' installs' : ''); html += '
' + '
' + '
' + escapeHtml(name.charAt(0).toUpperCase()) + '
' + '
' + '
' + escapeHtml(name) + '
' + '
' + installsHtml + '
' + '
' + '
' + '
' + escapeHtml(source) + '
' + '
'; }); grid.innerHTML = html; } var skillsDisplayedList = null; function installSkillFromMarketplace(el) { var source = el.dataset.skillSource; var name = el.dataset.skillName; var installs = el.dataset.skillInstalls || ''; if (!source || !name) return; var repoUrl = 'https://github.com/' + source.replace(/^github\\//, ''); var installsHtml = installs ? '' + installs + '' : ''; var grid = document.getElementById('skillsGrid'); // Save current grid content to restore on back skillsDisplayedList = grid.innerHTML; grid.innerHTML = '
' + '' + '
' + '
' + escapeHtml(name.charAt(0).toUpperCase()) + '
' + '
' + '
' + escapeHtml(name) + '
' + '
' + installsHtml + 'GitHub' + '
' + '
' + '
' + '
' + escapeHtml('Source: ' + source) + '
' + '
' + '
Install to
' + '
' + '' + '
' + '
' + '
' + '' + '
Opens a terminal running npx skills add via skills.sh
' + '
' + '
'; } function backToSkillsList() { var grid = document.getElementById('skillsGrid'); if (skillsDisplayedList) { grid.innerHTML = skillsDisplayedList; } else { renderFeaturedSkills(topSkills); } } function toggleSkillDetail(id) { var el = document.getElementById(id); if (!el) return; el.style.display = el.style.display === 'none' ? 'block' : 'none'; } function confirmSkillInstall(btn) { var source = btn.dataset.source; var name = btn.dataset.name; sendStats('Skill installed', { name: name, source: source }); var scope = document.getElementById('skillInstallScope').value; var repoUrl = 'https://github.com/' + source.replace(/^github\\//, ''); var command = 'npx -y skills add ' + repoUrl + ' --skill ' + name + ' --agent claude-code -y'; if (scope === 'global') { command += ' --global'; } vscode.postMessage({ type: 'runTerminalCommand', command: command }); hideSkillsModal(); } `; export default getSkillsScript;