Files
awesome-copilot/website/pages/skills.html
Aaron Powell f8829be835 feat: Add GitHub Pages website for browsing resources
- Add static website with pages for agents, prompts, instructions, skills, and collections
- Implement client-side fuzzy search across all resources
- Add file viewer modal with copy-to-clipboard and install-to-editor functionality
- Add Tools page for MCP server and future tools
- Add Samples page placeholder for copilot-sdk cookbook migration
- Add metadata JSON generation script (eng/generate-website-data.mjs)
- Add GitHub Actions workflow for automated Pages deployment
- Update package.json with website build scripts
2026-01-28 13:43:41 +11:00

172 lines
7.2 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Skills - Awesome GitHub Copilot</title>
<meta name="description" content="Self-contained agent skills with instructions and bundled resources">
<link rel="stylesheet" href="../css/styles.css">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>⚡</text></svg>">
</head>
<body>
<header class="site-header">
<div class="container">
<div class="header-content">
<a href="../index.html" class="logo">
<span class="logo-icon">🤖</span>
<span class="logo-text">Awesome Copilot</span>
</a>
<nav class="main-nav">
<a href="agents.html">Agents</a>
<a href="prompts.html">Prompts</a>
<a href="instructions.html">Instructions</a>
<a href="skills.html" class="active">Skills</a>
<a href="collections.html">Collections</a>
<a href="tools.html">Tools</a>
<a href="samples.html">Samples</a>
</nav>
<a href="https://github.com/github/awesome-copilot" class="github-link" target="_blank" rel="noopener">
<svg viewBox="0 0 16 16" width="24" height="24" fill="currentColor">
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"></path>
</svg>
</a>
</div>
</div>
</header>
<main>
<div class="page-header">
<div class="container">
<h1>⚡ Agent Skills</h1>
<p>Self-contained folders with instructions and bundled resources for specialized AI capabilities</p>
</div>
</div>
<div class="page-content">
<div class="container">
<div class="search-bar">
<input type="text" id="search-input" placeholder="Search skills..." autocomplete="off">
</div>
<div class="results-count" id="results-count"></div>
<div class="resource-list" id="resource-list">
<div class="loading">Loading skills...</div>
</div>
</div>
</div>
</main>
<footer class="site-footer">
<div class="container">
<p>
<a href="https://github.com/github/awesome-copilot" target="_blank" rel="noopener">GitHub</a> ·
<a href="https://github.com/github/awesome-copilot/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener">Contribute</a> ·
<a href="https://github.com/github/awesome-copilot/blob/main/LICENSE" target="_blank" rel="noopener">MIT License</a>
</p>
</div>
</footer>
<!-- File Viewer Modal -->
<div id="file-modal" class="modal hidden">
<div class="modal-content">
<div class="modal-header">
<h3 id="modal-title">File</h3>
<div class="modal-actions">
<button id="copy-btn" class="btn btn-secondary" title="Copy to clipboard">
<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path>
<path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path>
</svg>
Copy
</button>
<a id="install-vscode-btn" href="#" class="btn btn-primary" style="display:none" title="Install to VS Code">
Install
</a>
<a id="github-btn" href="#" class="btn btn-secondary" target="_blank" title="View on GitHub">
GitHub
</a>
<button id="close-modal" class="btn btn-icon" title="Close">
<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor">
<path d="M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z"></path>
</svg>
</button>
</div>
</div>
<div class="modal-body">
<pre id="modal-content"><code></code></pre>
</div>
</div>
</div>
<script src="../js/utils.js"></script>
<script src="../js/search.js"></script>
<script src="../js/app.js"></script>
<script>
const resourceType = 'skill';
const dataFile = 'skills.json';
let allItems = [];
let search = new FuzzySearch();
async function initPage() {
const list = document.getElementById('resource-list');
const countEl = document.getElementById('results-count');
const searchInput = document.getElementById('search-input');
const data = await fetchData(dataFile);
if (!data) {
list.innerHTML = '<div class="empty-state"><h3>Failed to load data</h3></div>';
return;
}
allItems = data;
search.setItems(allItems);
renderItems(allItems);
countEl.textContent = `${allItems.length} skills`;
searchInput.addEventListener('input', debounce((e) => {
const query = e.target.value;
const results = query ? search.search(query) : allItems;
renderItems(results, query);
countEl.textContent = `${results.length} of ${allItems.length} skills`;
}, 200));
setupModal();
}
function renderItems(items, query = '') {
const list = document.getElementById('resource-list');
if (items.length === 0) {
list.innerHTML = `
<div class="empty-state">
<h3>No skills found</h3>
<p>Try a different search term</p>
</div>
`;
return;
}
list.innerHTML = items.map(item => `
<div class="resource-item" onclick="openFileModal('${item.skillFile}', '${resourceType}')">
<div class="resource-info">
<div class="resource-title">${query ? search.highlight(item.title, query) : escapeHtml(item.title)}</div>
<div class="resource-description">${escapeHtml(item.description || 'No description')}</div>
${item.assets?.length ? `
<div class="resource-meta">
<span class="resource-tag">${item.assets.length} bundled asset${item.assets.length === 1 ? '' : 's'}</span>
</div>
` : ''}
</div>
<div class="resource-actions">
<a href="${getGitHubUrl(item.path)}" class="btn btn-secondary" target="_blank" onclick="event.stopPropagation()">
View Folder
</a>
</div>
</div>
`).join('');
}
document.addEventListener('DOMContentLoaded', initPage);
</script>
</body>
</html>