mirror of
https://github.com/github/awesome-copilot.git
synced 2026-02-20 02:15:12 +00:00
feat(website): add samples/cookbook page with recipe browser
Integrates the cookbook/ folder into the website's Samples page: Data Structure: - Add cookbook/cookbook.yml manifest defining cookbooks and recipes - Add .schemas/cookbook.schema.json for validation - Add COOKBOOK_DIR constant to eng/constants.mjs Build Integration: - Add generateSamplesData() to generate samples.json from cookbook.yml - Include recipe variants with file paths for each language - Add samples count to manifest.json Website UI: - Create samples.ts with FuzzySearch, language/tag filtering - Replace placeholder samples.astro with functional recipe browser - Recipe cards with language indicators and action buttons - Language tabs for switching between implementations - View Recipe/View Example buttons open modal - GitHub link for each recipe Features: - Search recipes by name/description - Filter by programming language (Node.js, Python, .NET, Go) - Filter by tags (multi-select with Choices.js) - 5 recipes across 4 languages = 20 recipe variants
This commit is contained in:
99
.schemas/cookbook.schema.json
Normal file
99
.schemas/cookbook.schema.json
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "Cookbook Manifest",
|
||||||
|
"description": "Schema for cookbook.yml manifest defining cookbooks and recipes",
|
||||||
|
"type": "object",
|
||||||
|
"required": ["cookbooks"],
|
||||||
|
"properties": {
|
||||||
|
"cookbooks": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "List of cookbooks",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["id", "name", "description", "path", "languages", "recipes"],
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Unique identifier for the cookbook",
|
||||||
|
"pattern": "^[a-z0-9-]+$"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Display name for the cookbook"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Brief description of the cookbook"
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Relative path to the cookbook folder"
|
||||||
|
},
|
||||||
|
"featured": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Whether this cookbook should be featured",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"languages": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "Programming languages supported by this cookbook",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["id", "name"],
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Language identifier (folder name)",
|
||||||
|
"pattern": "^[a-z0-9-]+$"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Display name for the language"
|
||||||
|
},
|
||||||
|
"icon": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Emoji icon for the language"
|
||||||
|
},
|
||||||
|
"extension": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "File extension for runnable examples",
|
||||||
|
"pattern": "^\\.[a-z]+$"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"recipes": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "List of recipes in this cookbook",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["id", "name", "description"],
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Recipe identifier (matches markdown filename without extension)",
|
||||||
|
"pattern": "^[a-z0-9-]+$"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Display name for the recipe"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Brief description of what the recipe covers"
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "Tags for filtering and categorization",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
63
cookbook/cookbook.yml
Normal file
63
cookbook/cookbook.yml
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
# yaml-language-server: $schema=../.schemas/cookbook.schema.json
|
||||||
|
# Cookbook manifest for the Awesome GitHub Copilot website
|
||||||
|
# This file defines the structure of cookbooks and recipes for the Samples page
|
||||||
|
|
||||||
|
cookbooks:
|
||||||
|
- id: copilot-sdk
|
||||||
|
name: GitHub Copilot SDK
|
||||||
|
description: Ready-to-use recipes for building with the GitHub Copilot SDK across multiple languages
|
||||||
|
path: cookbook/copilot-sdk
|
||||||
|
featured: true
|
||||||
|
languages:
|
||||||
|
- id: nodejs
|
||||||
|
name: Node.js / TypeScript
|
||||||
|
icon: 🟢
|
||||||
|
extension: .ts
|
||||||
|
- id: python
|
||||||
|
name: Python
|
||||||
|
icon: 🐍
|
||||||
|
extension: .py
|
||||||
|
- id: dotnet
|
||||||
|
name: .NET (C#)
|
||||||
|
icon: 🟣
|
||||||
|
extension: .cs
|
||||||
|
- id: go
|
||||||
|
name: Go
|
||||||
|
icon: 🔵
|
||||||
|
extension: .go
|
||||||
|
recipes:
|
||||||
|
- id: error-handling
|
||||||
|
name: Error Handling
|
||||||
|
description: Handle errors gracefully including connection failures, timeouts, and cleanup
|
||||||
|
tags:
|
||||||
|
- errors
|
||||||
|
- basics
|
||||||
|
- reliability
|
||||||
|
- id: multiple-sessions
|
||||||
|
name: Multiple Sessions
|
||||||
|
description: Manage multiple independent conversations simultaneously
|
||||||
|
tags:
|
||||||
|
- sessions
|
||||||
|
- advanced
|
||||||
|
- concurrency
|
||||||
|
- id: managing-local-files
|
||||||
|
name: Managing Local Files
|
||||||
|
description: Organize files by metadata using AI-powered grouping strategies
|
||||||
|
tags:
|
||||||
|
- files
|
||||||
|
- organization
|
||||||
|
- ai-powered
|
||||||
|
- id: pr-visualization
|
||||||
|
name: PR Visualization
|
||||||
|
description: Generate interactive PR age charts using GitHub MCP Server
|
||||||
|
tags:
|
||||||
|
- github
|
||||||
|
- visualization
|
||||||
|
- mcp
|
||||||
|
- id: persisting-sessions
|
||||||
|
name: Persisting Sessions
|
||||||
|
description: Save and resume sessions across restarts
|
||||||
|
tags:
|
||||||
|
- sessions
|
||||||
|
- persistence
|
||||||
|
- state-management
|
||||||
@@ -123,6 +123,7 @@ const PROMPTS_DIR = path.join(ROOT_FOLDER, "prompts");
|
|||||||
const AGENTS_DIR = path.join(ROOT_FOLDER, "agents");
|
const AGENTS_DIR = path.join(ROOT_FOLDER, "agents");
|
||||||
const SKILLS_DIR = path.join(ROOT_FOLDER, "skills");
|
const SKILLS_DIR = path.join(ROOT_FOLDER, "skills");
|
||||||
const COLLECTIONS_DIR = path.join(ROOT_FOLDER, "collections");
|
const COLLECTIONS_DIR = path.join(ROOT_FOLDER, "collections");
|
||||||
|
const COOKBOOK_DIR = path.join(ROOT_FOLDER, "cookbook");
|
||||||
const MAX_COLLECTION_ITEMS = 50;
|
const MAX_COLLECTION_ITEMS = 50;
|
||||||
|
|
||||||
// Agent Skills validation constants
|
// Agent Skills validation constants
|
||||||
@@ -145,6 +146,7 @@ export {
|
|||||||
AGENTS_DIR,
|
AGENTS_DIR,
|
||||||
SKILLS_DIR,
|
SKILLS_DIR,
|
||||||
COLLECTIONS_DIR,
|
COLLECTIONS_DIR,
|
||||||
|
COOKBOOK_DIR,
|
||||||
MAX_COLLECTION_ITEMS,
|
MAX_COLLECTION_ITEMS,
|
||||||
SKILL_NAME_MIN_LENGTH,
|
SKILL_NAME_MIN_LENGTH,
|
||||||
SKILL_NAME_MAX_LENGTH,
|
SKILL_NAME_MAX_LENGTH,
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import {
|
|||||||
PROMPTS_DIR,
|
PROMPTS_DIR,
|
||||||
SKILLS_DIR,
|
SKILLS_DIR,
|
||||||
COLLECTIONS_DIR,
|
COLLECTIONS_DIR,
|
||||||
|
COOKBOOK_DIR,
|
||||||
ROOT_FOLDER,
|
ROOT_FOLDER,
|
||||||
} from "./constants.mjs";
|
} from "./constants.mjs";
|
||||||
import {
|
import {
|
||||||
@@ -559,6 +560,89 @@ function generateSearchIndex(agents, prompts, instructions, skills, collections)
|
|||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate samples/cookbook data from cookbook.yml
|
||||||
|
*/
|
||||||
|
function generateSamplesData() {
|
||||||
|
const cookbookYamlPath = path.join(COOKBOOK_DIR, "cookbook.yml");
|
||||||
|
|
||||||
|
if (!fs.existsSync(cookbookYamlPath)) {
|
||||||
|
console.warn("Warning: cookbook/cookbook.yml not found, skipping samples generation");
|
||||||
|
return { cookbooks: [], totalRecipes: 0, totalCookbooks: 0, filters: { languages: [], tags: [] } };
|
||||||
|
}
|
||||||
|
|
||||||
|
const cookbookManifest = parseYamlFile(cookbookYamlPath);
|
||||||
|
if (!cookbookManifest || !cookbookManifest.cookbooks) {
|
||||||
|
console.warn("Warning: Invalid cookbook.yml format");
|
||||||
|
return { cookbooks: [], totalRecipes: 0, totalCookbooks: 0, filters: { languages: [], tags: [] } };
|
||||||
|
}
|
||||||
|
|
||||||
|
const allLanguages = new Set();
|
||||||
|
const allTags = new Set();
|
||||||
|
let totalRecipes = 0;
|
||||||
|
|
||||||
|
const cookbooks = cookbookManifest.cookbooks.map(cookbook => {
|
||||||
|
// Collect languages
|
||||||
|
cookbook.languages.forEach(lang => allLanguages.add(lang.id));
|
||||||
|
|
||||||
|
// Process recipes and add file paths
|
||||||
|
const recipes = cookbook.recipes.map(recipe => {
|
||||||
|
// Collect tags
|
||||||
|
if (recipe.tags) {
|
||||||
|
recipe.tags.forEach(tag => allTags.add(tag));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build variants with file paths for each language
|
||||||
|
const variants = {};
|
||||||
|
cookbook.languages.forEach(lang => {
|
||||||
|
const docPath = `${cookbook.path}/${lang.id}/${recipe.id}.md`;
|
||||||
|
const examplePath = `${cookbook.path}/${lang.id}/recipe/${recipe.id}${lang.extension}`;
|
||||||
|
|
||||||
|
// Check if files exist
|
||||||
|
const docFullPath = path.join(ROOT_FOLDER, docPath);
|
||||||
|
const exampleFullPath = path.join(ROOT_FOLDER, examplePath);
|
||||||
|
|
||||||
|
if (fs.existsSync(docFullPath)) {
|
||||||
|
variants[lang.id] = {
|
||||||
|
doc: docPath,
|
||||||
|
example: fs.existsSync(exampleFullPath) ? examplePath : null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
totalRecipes++;
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: recipe.id,
|
||||||
|
name: recipe.name,
|
||||||
|
description: recipe.description,
|
||||||
|
tags: recipe.tags || [],
|
||||||
|
variants
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: cookbook.id,
|
||||||
|
name: cookbook.name,
|
||||||
|
description: cookbook.description,
|
||||||
|
path: cookbook.path,
|
||||||
|
featured: cookbook.featured || false,
|
||||||
|
languages: cookbook.languages,
|
||||||
|
recipes
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
cookbooks,
|
||||||
|
totalRecipes,
|
||||||
|
totalCookbooks: cookbooks.length,
|
||||||
|
filters: {
|
||||||
|
languages: Array.from(allLanguages).sort(),
|
||||||
|
tags: Array.from(allTags).sort()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main function
|
* Main function
|
||||||
*/
|
*/
|
||||||
@@ -592,6 +676,9 @@ async function main() {
|
|||||||
const tools = toolsData.items;
|
const tools = toolsData.items;
|
||||||
console.log(`✓ Generated ${tools.length} tools (${toolsData.filters.categories.length} categories)`);
|
console.log(`✓ Generated ${tools.length} tools (${toolsData.filters.categories.length} categories)`);
|
||||||
|
|
||||||
|
const samplesData = generateSamplesData();
|
||||||
|
console.log(`✓ Generated ${samplesData.totalRecipes} recipes in ${samplesData.totalCookbooks} cookbooks (${samplesData.filters.languages.length} languages, ${samplesData.filters.tags.length} tags)`);
|
||||||
|
|
||||||
const searchIndex = generateSearchIndex(agents, prompts, instructions, skills, collections);
|
const searchIndex = generateSearchIndex(agents, prompts, instructions, skills, collections);
|
||||||
console.log(`✓ Generated search index with ${searchIndex.length} items`);
|
console.log(`✓ Generated search index with ${searchIndex.length} items`);
|
||||||
|
|
||||||
@@ -626,6 +713,11 @@ async function main() {
|
|||||||
JSON.stringify(toolsData, null, 2)
|
JSON.stringify(toolsData, null, 2)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
fs.writeFileSync(
|
||||||
|
path.join(WEBSITE_DATA_DIR, "samples.json"),
|
||||||
|
JSON.stringify(samplesData, null, 2)
|
||||||
|
);
|
||||||
|
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
path.join(WEBSITE_DATA_DIR, "search-index.json"),
|
path.join(WEBSITE_DATA_DIR, "search-index.json"),
|
||||||
JSON.stringify(searchIndex, null, 2)
|
JSON.stringify(searchIndex, null, 2)
|
||||||
@@ -641,6 +733,7 @@ async function main() {
|
|||||||
skills: skills.length,
|
skills: skills.length,
|
||||||
collections: collections.length,
|
collections: collections.length,
|
||||||
tools: tools.length,
|
tools: tools.length,
|
||||||
|
samples: samplesData.totalRecipes,
|
||||||
total: searchIndex.length,
|
total: searchIndex.length,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -148,6 +148,24 @@
|
|||||||
"path": "agents/apify-integration-expert.agent.md",
|
"path": "agents/apify-integration-expert.agent.md",
|
||||||
"filename": "apify-integration-expert.agent.md"
|
"filename": "apify-integration-expert.agent.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "arch-linux-expert",
|
||||||
|
"title": "Arch Linux Expert",
|
||||||
|
"description": "Arch Linux specialist focused on pacman, rolling-release maintenance, and Arch-centric system administration workflows.",
|
||||||
|
"model": "GPT-5",
|
||||||
|
"tools": [
|
||||||
|
"codebase",
|
||||||
|
"search",
|
||||||
|
"terminalCommand",
|
||||||
|
"runCommands",
|
||||||
|
"edit/editFiles"
|
||||||
|
],
|
||||||
|
"hasHandoffs": false,
|
||||||
|
"handoffs": [],
|
||||||
|
"mcpServers": [],
|
||||||
|
"path": "agents/arch-linux-expert.agent.md",
|
||||||
|
"filename": "arch-linux-expert.agent.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "arm-migration",
|
"id": "arm-migration",
|
||||||
"title": "Arm Migration Agent",
|
"title": "Arm Migration Agent",
|
||||||
@@ -569,6 +587,24 @@
|
|||||||
"path": "agents/cast-imaging-structural-quality-advisor.agent.md",
|
"path": "agents/cast-imaging-structural-quality-advisor.agent.md",
|
||||||
"filename": "cast-imaging-structural-quality-advisor.agent.md"
|
"filename": "cast-imaging-structural-quality-advisor.agent.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "centos-linux-expert",
|
||||||
|
"title": "CentOS Linux Expert",
|
||||||
|
"description": "CentOS (Stream/Legacy) Linux specialist focused on RHEL-compatible administration, yum/dnf workflows, and enterprise hardening.",
|
||||||
|
"model": "GPT-4.1",
|
||||||
|
"tools": [
|
||||||
|
"codebase",
|
||||||
|
"search",
|
||||||
|
"terminalCommand",
|
||||||
|
"runCommands",
|
||||||
|
"edit/editFiles"
|
||||||
|
],
|
||||||
|
"hasHandoffs": false,
|
||||||
|
"handoffs": [],
|
||||||
|
"mcpServers": [],
|
||||||
|
"path": "agents/centos-linux-expert.agent.md",
|
||||||
|
"filename": "centos-linux-expert.agent.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "clojure-interactive-programming",
|
"id": "clojure-interactive-programming",
|
||||||
"title": "Clojure Interactive Programming",
|
"title": "Clojure Interactive Programming",
|
||||||
@@ -730,6 +766,24 @@
|
|||||||
"path": "agents/custom-agent-foundry.agent.md",
|
"path": "agents/custom-agent-foundry.agent.md",
|
||||||
"filename": "custom-agent-foundry.agent.md"
|
"filename": "custom-agent-foundry.agent.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "debian-linux-expert",
|
||||||
|
"title": "Debian Linux Expert",
|
||||||
|
"description": "Debian Linux specialist focused on stable system administration, apt-based package management, and Debian policy-aligned practices.",
|
||||||
|
"model": "Claude Sonnet 4",
|
||||||
|
"tools": [
|
||||||
|
"codebase",
|
||||||
|
"search",
|
||||||
|
"terminalCommand",
|
||||||
|
"runCommands",
|
||||||
|
"edit/editFiles"
|
||||||
|
],
|
||||||
|
"hasHandoffs": false,
|
||||||
|
"handoffs": [],
|
||||||
|
"mcpServers": [],
|
||||||
|
"path": "agents/debian-linux-expert.agent.md",
|
||||||
|
"filename": "debian-linux-expert.agent.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "debug",
|
"id": "debug",
|
||||||
"title": "Debug",
|
"title": "Debug",
|
||||||
@@ -1103,6 +1157,24 @@
|
|||||||
"path": "agents/expert-react-frontend-engineer.agent.md",
|
"path": "agents/expert-react-frontend-engineer.agent.md",
|
||||||
"filename": "expert-react-frontend-engineer.agent.md"
|
"filename": "expert-react-frontend-engineer.agent.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "fedora-linux-expert",
|
||||||
|
"title": "Fedora Linux Expert",
|
||||||
|
"description": "Fedora (Red Hat family) Linux specialist focused on dnf, SELinux, and modern systemd-based workflows.",
|
||||||
|
"model": "GPT-5",
|
||||||
|
"tools": [
|
||||||
|
"codebase",
|
||||||
|
"search",
|
||||||
|
"terminalCommand",
|
||||||
|
"runCommands",
|
||||||
|
"edit/editFiles"
|
||||||
|
],
|
||||||
|
"hasHandoffs": false,
|
||||||
|
"handoffs": [],
|
||||||
|
"mcpServers": [],
|
||||||
|
"path": "agents/fedora-linux-expert.agent.md",
|
||||||
|
"filename": "fedora-linux-expert.agent.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "gilfoyle",
|
"id": "gilfoyle",
|
||||||
"title": "Gilfoyle",
|
"title": "Gilfoyle",
|
||||||
@@ -2232,6 +2304,28 @@
|
|||||||
"path": "agents/refine-issue.agent.md",
|
"path": "agents/refine-issue.agent.md",
|
||||||
"filename": "refine-issue.agent.md"
|
"filename": "refine-issue.agent.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "repo-architect",
|
||||||
|
"title": "Repo Architect",
|
||||||
|
"description": "Bootstraps and validates agentic project structures for GitHub Copilot (VS Code) and OpenCode CLI workflows. Run after `opencode /init` or VS Code Copilot initialization to scaffold proper folder hierarchies, instructions, agents, skills, and prompts.",
|
||||||
|
"model": "GPT-4.1",
|
||||||
|
"tools": [
|
||||||
|
"changes",
|
||||||
|
"codebase",
|
||||||
|
"editFiles",
|
||||||
|
"fetch",
|
||||||
|
"new",
|
||||||
|
"problems",
|
||||||
|
"runCommands",
|
||||||
|
"search",
|
||||||
|
"terminalLastCommand"
|
||||||
|
],
|
||||||
|
"hasHandoffs": false,
|
||||||
|
"handoffs": [],
|
||||||
|
"mcpServers": [],
|
||||||
|
"path": "agents/repo-architect.agent.md",
|
||||||
|
"filename": "repo-architect.agent.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "ruby-mcp-expert",
|
"id": "ruby-mcp-expert",
|
||||||
"title": "Ruby MCP Expert",
|
"title": "Ruby MCP Expert",
|
||||||
|
|||||||
@@ -78,6 +78,11 @@
|
|||||||
"path": "instructions/copilot-sdk-python.instructions.md",
|
"path": "instructions/copilot-sdk-python.instructions.md",
|
||||||
"kind": "instruction",
|
"kind": "instruction",
|
||||||
"usage": null
|
"usage": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/copilot-sdk/SKILL.md",
|
||||||
|
"kind": "skill",
|
||||||
|
"usage": null
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"path": "collections/copilot-sdk.collection.yml",
|
"path": "collections/copilot-sdk.collection.yml",
|
||||||
|
|||||||
@@ -113,6 +113,18 @@
|
|||||||
"path": "instructions/apex.instructions.md",
|
"path": "instructions/apex.instructions.md",
|
||||||
"filename": "apex.instructions.md"
|
"filename": "apex.instructions.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "arch-linux",
|
||||||
|
"title": "Arch Linux",
|
||||||
|
"description": "Guidance for Arch Linux administration, pacman workflows, and rolling-release best practices.",
|
||||||
|
"applyTo": "**",
|
||||||
|
"applyToPatterns": [
|
||||||
|
"**"
|
||||||
|
],
|
||||||
|
"extensions": [],
|
||||||
|
"path": "instructions/arch-linux.instructions.md",
|
||||||
|
"filename": "arch-linux.instructions.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "aspnet-rest-apis",
|
"id": "aspnet-rest-apis",
|
||||||
"title": "Aspnet Rest Apis",
|
"title": "Aspnet Rest Apis",
|
||||||
@@ -272,6 +284,18 @@
|
|||||||
"path": "instructions/blazor.instructions.md",
|
"path": "instructions/blazor.instructions.md",
|
||||||
"filename": "blazor.instructions.md"
|
"filename": "blazor.instructions.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "centos-linux",
|
||||||
|
"title": "Centos Linux",
|
||||||
|
"description": "Guidance for CentOS administration, RHEL-compatible tooling, and SELinux-aware operations.",
|
||||||
|
"applyTo": "**",
|
||||||
|
"applyToPatterns": [
|
||||||
|
"**"
|
||||||
|
],
|
||||||
|
"extensions": [],
|
||||||
|
"path": "instructions/centos-linux.instructions.md",
|
||||||
|
"filename": "centos-linux.instructions.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "clojure",
|
"id": "clojure",
|
||||||
"title": "Clojure",
|
"title": "Clojure",
|
||||||
@@ -675,6 +699,18 @@
|
|||||||
"path": "instructions/dataverse-python-testing-debugging.instructions.md",
|
"path": "instructions/dataverse-python-testing-debugging.instructions.md",
|
||||||
"filename": "dataverse-python-testing-debugging.instructions.md"
|
"filename": "dataverse-python-testing-debugging.instructions.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "debian-linux",
|
||||||
|
"title": "Debian Linux",
|
||||||
|
"description": "Guidance for Debian-based Linux administration, apt workflows, and Debian policy conventions.",
|
||||||
|
"applyTo": "**",
|
||||||
|
"applyToPatterns": [
|
||||||
|
"**"
|
||||||
|
],
|
||||||
|
"extensions": [],
|
||||||
|
"path": "instructions/debian-linux.instructions.md",
|
||||||
|
"filename": "debian-linux.instructions.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "declarative-agents-microsoft365",
|
"id": "declarative-agents-microsoft365",
|
||||||
"title": "Declarative Agents Microsoft365",
|
"title": "Declarative Agents Microsoft365",
|
||||||
@@ -807,6 +843,18 @@
|
|||||||
"path": "instructions/dotnet-wpf.instructions.md",
|
"path": "instructions/dotnet-wpf.instructions.md",
|
||||||
"filename": "dotnet-wpf.instructions.md"
|
"filename": "dotnet-wpf.instructions.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "fedora-linux",
|
||||||
|
"title": "Fedora Linux",
|
||||||
|
"description": "Guidance for Fedora (Red Hat family) systems, dnf workflows, SELinux, and modern systemd practices.",
|
||||||
|
"applyTo": "**",
|
||||||
|
"applyToPatterns": [
|
||||||
|
"**"
|
||||||
|
],
|
||||||
|
"extensions": [],
|
||||||
|
"path": "instructions/fedora-linux.instructions.md",
|
||||||
|
"filename": "fedora-linux.instructions.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "genaiscript",
|
"id": "genaiscript",
|
||||||
"title": "Genaiscript",
|
"title": "Genaiscript",
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
{
|
{
|
||||||
"generated": "2026-02-02T02:45:34.292Z",
|
"generated": "2026-02-02T04:05:33.889Z",
|
||||||
"counts": {
|
"counts": {
|
||||||
"agents": 140,
|
"agents": 145,
|
||||||
"prompts": 134,
|
"prompts": 138,
|
||||||
"instructions": 163,
|
"instructions": 167,
|
||||||
"skills": 28,
|
"skills": 32,
|
||||||
"collections": 39,
|
"collections": 39,
|
||||||
"tools": 6,
|
"tools": 6,
|
||||||
"total": 504
|
"samples": 5,
|
||||||
|
"total": 521
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,6 +53,21 @@
|
|||||||
"path": "prompts/apple-appstore-reviewer.prompt.md",
|
"path": "prompts/apple-appstore-reviewer.prompt.md",
|
||||||
"filename": "apple-appstore-reviewer.prompt.md"
|
"filename": "apple-appstore-reviewer.prompt.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "arch-linux-triage",
|
||||||
|
"title": "Arch Linux Triage",
|
||||||
|
"description": "Triage and resolve Arch Linux issues with pacman, systemd, and rolling-release best practices.",
|
||||||
|
"agent": "agent",
|
||||||
|
"model": "gpt-4.1",
|
||||||
|
"tools": [
|
||||||
|
"search",
|
||||||
|
"runCommands",
|
||||||
|
"terminalCommand",
|
||||||
|
"edit/editFiles"
|
||||||
|
],
|
||||||
|
"path": "prompts/arch-linux-triage.prompt.md",
|
||||||
|
"filename": "arch-linux-triage.prompt.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "architecture-blueprint-generator",
|
"id": "architecture-blueprint-generator",
|
||||||
"title": "Architecture Blueprint Generator",
|
"title": "Architecture Blueprint Generator",
|
||||||
@@ -168,6 +183,21 @@
|
|||||||
"path": "prompts/breakdown-test.prompt.md",
|
"path": "prompts/breakdown-test.prompt.md",
|
||||||
"filename": "breakdown-test.prompt.md"
|
"filename": "breakdown-test.prompt.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "centos-linux-triage",
|
||||||
|
"title": "Centos Linux Triage",
|
||||||
|
"description": "Triage and resolve CentOS issues using RHEL-compatible tooling, SELinux-aware practices, and firewalld.",
|
||||||
|
"agent": "agent",
|
||||||
|
"model": "gpt-4.1",
|
||||||
|
"tools": [
|
||||||
|
"search",
|
||||||
|
"runCommands",
|
||||||
|
"terminalCommand",
|
||||||
|
"edit/editFiles"
|
||||||
|
],
|
||||||
|
"path": "prompts/centos-linux-triage.prompt.md",
|
||||||
|
"filename": "centos-linux-triage.prompt.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "code-exemplars-blueprint-generator",
|
"id": "code-exemplars-blueprint-generator",
|
||||||
"title": "Code Exemplars Blueprint Generator",
|
"title": "Code Exemplars Blueprint Generator",
|
||||||
@@ -731,6 +761,21 @@
|
|||||||
"path": "prompts/dataverse-python-quickstart.prompt.md",
|
"path": "prompts/dataverse-python-quickstart.prompt.md",
|
||||||
"filename": "dataverse-python-quickstart.prompt.md"
|
"filename": "dataverse-python-quickstart.prompt.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "debian-linux-triage",
|
||||||
|
"title": "Debian Linux Triage",
|
||||||
|
"description": "Triage and resolve Debian Linux issues with apt, systemd, and AppArmor-aware guidance.",
|
||||||
|
"agent": "agent",
|
||||||
|
"model": "gpt-4.1",
|
||||||
|
"tools": [
|
||||||
|
"search",
|
||||||
|
"runCommands",
|
||||||
|
"terminalCommand",
|
||||||
|
"edit/editFiles"
|
||||||
|
],
|
||||||
|
"path": "prompts/debian-linux-triage.prompt.md",
|
||||||
|
"filename": "debian-linux-triage.prompt.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "declarative-agents",
|
"id": "declarative-agents",
|
||||||
"title": "Declarative Agents",
|
"title": "Declarative Agents",
|
||||||
@@ -816,6 +861,21 @@
|
|||||||
"path": "prompts/ef-core.prompt.md",
|
"path": "prompts/ef-core.prompt.md",
|
||||||
"filename": "ef-core.prompt.md"
|
"filename": "ef-core.prompt.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "fedora-linux-triage",
|
||||||
|
"title": "Fedora Linux Triage",
|
||||||
|
"description": "Triage and resolve Fedora issues with dnf, systemd, and SELinux-aware guidance.",
|
||||||
|
"agent": "agent",
|
||||||
|
"model": "gpt-4.1",
|
||||||
|
"tools": [
|
||||||
|
"search",
|
||||||
|
"runCommands",
|
||||||
|
"terminalCommand",
|
||||||
|
"edit/editFiles"
|
||||||
|
],
|
||||||
|
"path": "prompts/fedora-linux-triage.prompt.md",
|
||||||
|
"filename": "fedora-linux-triage.prompt.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "finalize-agent-prompt",
|
"id": "finalize-agent-prompt",
|
||||||
"title": "Finalize Agent Prompt",
|
"title": "Finalize Agent Prompt",
|
||||||
|
|||||||
205
website/public/data/samples.json
Normal file
205
website/public/data/samples.json
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
{
|
||||||
|
"cookbooks": [
|
||||||
|
{
|
||||||
|
"id": "copilot-sdk",
|
||||||
|
"name": "GitHub Copilot SDK",
|
||||||
|
"description": "Ready-to-use recipes for building with the GitHub Copilot SDK across multiple languages",
|
||||||
|
"path": "cookbook/copilot-sdk",
|
||||||
|
"featured": true,
|
||||||
|
"languages": [
|
||||||
|
{
|
||||||
|
"id": "nodejs",
|
||||||
|
"name": "Node.js / TypeScript",
|
||||||
|
"icon": "🟢",
|
||||||
|
"extension": ".ts"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "python",
|
||||||
|
"name": "Python",
|
||||||
|
"icon": "🐍",
|
||||||
|
"extension": ".py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dotnet",
|
||||||
|
"name": ".NET (C#)",
|
||||||
|
"icon": "🟣",
|
||||||
|
"extension": ".cs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "go",
|
||||||
|
"name": "Go",
|
||||||
|
"icon": "🔵",
|
||||||
|
"extension": ".go"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"recipes": [
|
||||||
|
{
|
||||||
|
"id": "error-handling",
|
||||||
|
"name": "Error Handling",
|
||||||
|
"description": "Handle errors gracefully including connection failures, timeouts, and cleanup",
|
||||||
|
"tags": [
|
||||||
|
"errors",
|
||||||
|
"basics",
|
||||||
|
"reliability"
|
||||||
|
],
|
||||||
|
"variants": {
|
||||||
|
"nodejs": {
|
||||||
|
"doc": "cookbook/copilot-sdk/nodejs/error-handling.md",
|
||||||
|
"example": "cookbook/copilot-sdk/nodejs/recipe/error-handling.ts"
|
||||||
|
},
|
||||||
|
"python": {
|
||||||
|
"doc": "cookbook/copilot-sdk/python/error-handling.md",
|
||||||
|
"example": null
|
||||||
|
},
|
||||||
|
"dotnet": {
|
||||||
|
"doc": "cookbook/copilot-sdk/dotnet/error-handling.md",
|
||||||
|
"example": "cookbook/copilot-sdk/dotnet/recipe/error-handling.cs"
|
||||||
|
},
|
||||||
|
"go": {
|
||||||
|
"doc": "cookbook/copilot-sdk/go/error-handling.md",
|
||||||
|
"example": "cookbook/copilot-sdk/go/recipe/error-handling.go"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiple-sessions",
|
||||||
|
"name": "Multiple Sessions",
|
||||||
|
"description": "Manage multiple independent conversations simultaneously",
|
||||||
|
"tags": [
|
||||||
|
"sessions",
|
||||||
|
"advanced",
|
||||||
|
"concurrency"
|
||||||
|
],
|
||||||
|
"variants": {
|
||||||
|
"nodejs": {
|
||||||
|
"doc": "cookbook/copilot-sdk/nodejs/multiple-sessions.md",
|
||||||
|
"example": "cookbook/copilot-sdk/nodejs/recipe/multiple-sessions.ts"
|
||||||
|
},
|
||||||
|
"python": {
|
||||||
|
"doc": "cookbook/copilot-sdk/python/multiple-sessions.md",
|
||||||
|
"example": null
|
||||||
|
},
|
||||||
|
"dotnet": {
|
||||||
|
"doc": "cookbook/copilot-sdk/dotnet/multiple-sessions.md",
|
||||||
|
"example": "cookbook/copilot-sdk/dotnet/recipe/multiple-sessions.cs"
|
||||||
|
},
|
||||||
|
"go": {
|
||||||
|
"doc": "cookbook/copilot-sdk/go/multiple-sessions.md",
|
||||||
|
"example": "cookbook/copilot-sdk/go/recipe/multiple-sessions.go"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "managing-local-files",
|
||||||
|
"name": "Managing Local Files",
|
||||||
|
"description": "Organize files by metadata using AI-powered grouping strategies",
|
||||||
|
"tags": [
|
||||||
|
"files",
|
||||||
|
"organization",
|
||||||
|
"ai-powered"
|
||||||
|
],
|
||||||
|
"variants": {
|
||||||
|
"nodejs": {
|
||||||
|
"doc": "cookbook/copilot-sdk/nodejs/managing-local-files.md",
|
||||||
|
"example": "cookbook/copilot-sdk/nodejs/recipe/managing-local-files.ts"
|
||||||
|
},
|
||||||
|
"python": {
|
||||||
|
"doc": "cookbook/copilot-sdk/python/managing-local-files.md",
|
||||||
|
"example": null
|
||||||
|
},
|
||||||
|
"dotnet": {
|
||||||
|
"doc": "cookbook/copilot-sdk/dotnet/managing-local-files.md",
|
||||||
|
"example": "cookbook/copilot-sdk/dotnet/recipe/managing-local-files.cs"
|
||||||
|
},
|
||||||
|
"go": {
|
||||||
|
"doc": "cookbook/copilot-sdk/go/managing-local-files.md",
|
||||||
|
"example": "cookbook/copilot-sdk/go/recipe/managing-local-files.go"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pr-visualization",
|
||||||
|
"name": "PR Visualization",
|
||||||
|
"description": "Generate interactive PR age charts using GitHub MCP Server",
|
||||||
|
"tags": [
|
||||||
|
"github",
|
||||||
|
"visualization",
|
||||||
|
"mcp"
|
||||||
|
],
|
||||||
|
"variants": {
|
||||||
|
"nodejs": {
|
||||||
|
"doc": "cookbook/copilot-sdk/nodejs/pr-visualization.md",
|
||||||
|
"example": "cookbook/copilot-sdk/nodejs/recipe/pr-visualization.ts"
|
||||||
|
},
|
||||||
|
"python": {
|
||||||
|
"doc": "cookbook/copilot-sdk/python/pr-visualization.md",
|
||||||
|
"example": null
|
||||||
|
},
|
||||||
|
"dotnet": {
|
||||||
|
"doc": "cookbook/copilot-sdk/dotnet/pr-visualization.md",
|
||||||
|
"example": "cookbook/copilot-sdk/dotnet/recipe/pr-visualization.cs"
|
||||||
|
},
|
||||||
|
"go": {
|
||||||
|
"doc": "cookbook/copilot-sdk/go/pr-visualization.md",
|
||||||
|
"example": "cookbook/copilot-sdk/go/recipe/pr-visualization.go"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "persisting-sessions",
|
||||||
|
"name": "Persisting Sessions",
|
||||||
|
"description": "Save and resume sessions across restarts",
|
||||||
|
"tags": [
|
||||||
|
"sessions",
|
||||||
|
"persistence",
|
||||||
|
"state-management"
|
||||||
|
],
|
||||||
|
"variants": {
|
||||||
|
"nodejs": {
|
||||||
|
"doc": "cookbook/copilot-sdk/nodejs/persisting-sessions.md",
|
||||||
|
"example": "cookbook/copilot-sdk/nodejs/recipe/persisting-sessions.ts"
|
||||||
|
},
|
||||||
|
"python": {
|
||||||
|
"doc": "cookbook/copilot-sdk/python/persisting-sessions.md",
|
||||||
|
"example": null
|
||||||
|
},
|
||||||
|
"dotnet": {
|
||||||
|
"doc": "cookbook/copilot-sdk/dotnet/persisting-sessions.md",
|
||||||
|
"example": "cookbook/copilot-sdk/dotnet/recipe/persisting-sessions.cs"
|
||||||
|
},
|
||||||
|
"go": {
|
||||||
|
"doc": "cookbook/copilot-sdk/go/persisting-sessions.md",
|
||||||
|
"example": "cookbook/copilot-sdk/go/recipe/persisting-sessions.go"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"totalRecipes": 5,
|
||||||
|
"totalCookbooks": 1,
|
||||||
|
"filters": {
|
||||||
|
"languages": [
|
||||||
|
"dotnet",
|
||||||
|
"go",
|
||||||
|
"nodejs",
|
||||||
|
"python"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"advanced",
|
||||||
|
"ai-powered",
|
||||||
|
"basics",
|
||||||
|
"concurrency",
|
||||||
|
"errors",
|
||||||
|
"files",
|
||||||
|
"github",
|
||||||
|
"mcp",
|
||||||
|
"organization",
|
||||||
|
"persistence",
|
||||||
|
"reliability",
|
||||||
|
"sessions",
|
||||||
|
"state-management",
|
||||||
|
"visualization"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -63,6 +63,14 @@
|
|||||||
"path": "agents/apify-integration-expert.agent.md",
|
"path": "agents/apify-integration-expert.agent.md",
|
||||||
"searchText": "apify integration expert expert agent for integrating apify actors into codebases. handles actor selection, workflow design, implementation across javascript/typescript and python, testing, and production-ready deployment. "
|
"searchText": "apify integration expert expert agent for integrating apify actors into codebases. handles actor selection, workflow design, implementation across javascript/typescript and python, testing, and production-ready deployment. "
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "agent",
|
||||||
|
"id": "arch-linux-expert",
|
||||||
|
"title": "Arch Linux Expert",
|
||||||
|
"description": "Arch Linux specialist focused on pacman, rolling-release maintenance, and Arch-centric system administration workflows.",
|
||||||
|
"path": "agents/arch-linux-expert.agent.md",
|
||||||
|
"searchText": "arch linux expert arch linux specialist focused on pacman, rolling-release maintenance, and arch-centric system administration workflows. codebase search terminalcommand runcommands edit/editfiles"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "agent",
|
"type": "agent",
|
||||||
"id": "arm-migration",
|
"id": "arm-migration",
|
||||||
@@ -223,6 +231,14 @@
|
|||||||
"path": "agents/cast-imaging-structural-quality-advisor.agent.md",
|
"path": "agents/cast-imaging-structural-quality-advisor.agent.md",
|
||||||
"searchText": "cast imaging structural quality advisor agent specialized agent for identifying, analyzing, and providing remediation guidance for code quality issues using cast imaging "
|
"searchText": "cast imaging structural quality advisor agent specialized agent for identifying, analyzing, and providing remediation guidance for code quality issues using cast imaging "
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "agent",
|
||||||
|
"id": "centos-linux-expert",
|
||||||
|
"title": "CentOS Linux Expert",
|
||||||
|
"description": "CentOS (Stream/Legacy) Linux specialist focused on RHEL-compatible administration, yum/dnf workflows, and enterprise hardening.",
|
||||||
|
"path": "agents/centos-linux-expert.agent.md",
|
||||||
|
"searchText": "centos linux expert centos (stream/legacy) linux specialist focused on rhel-compatible administration, yum/dnf workflows, and enterprise hardening. codebase search terminalcommand runcommands edit/editfiles"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "agent",
|
"type": "agent",
|
||||||
"id": "clojure-interactive-programming",
|
"id": "clojure-interactive-programming",
|
||||||
@@ -279,6 +295,14 @@
|
|||||||
"path": "agents/custom-agent-foundry.agent.md",
|
"path": "agents/custom-agent-foundry.agent.md",
|
||||||
"searchText": "custom agent foundry expert at designing and creating vs code custom agents with optimal configurations vscode execute read edit search web agent github/* todo"
|
"searchText": "custom agent foundry expert at designing and creating vs code custom agents with optimal configurations vscode execute read edit search web agent github/* todo"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "agent",
|
||||||
|
"id": "debian-linux-expert",
|
||||||
|
"title": "Debian Linux Expert",
|
||||||
|
"description": "Debian Linux specialist focused on stable system administration, apt-based package management, and Debian policy-aligned practices.",
|
||||||
|
"path": "agents/debian-linux-expert.agent.md",
|
||||||
|
"searchText": "debian linux expert debian linux specialist focused on stable system administration, apt-based package management, and debian policy-aligned practices. codebase search terminalcommand runcommands edit/editfiles"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "agent",
|
"type": "agent",
|
||||||
"id": "debug",
|
"id": "debug",
|
||||||
@@ -407,6 +431,14 @@
|
|||||||
"path": "agents/expert-react-frontend-engineer.agent.md",
|
"path": "agents/expert-react-frontend-engineer.agent.md",
|
||||||
"searchText": "expert react frontend engineer expert react 19.2 frontend engineer specializing in modern hooks, server components, actions, typescript, and performance optimization changes codebase edit/editfiles extensions fetch findtestfiles githubrepo new opensimplebrowser problems runcommands runtasks runtests search searchresults terminallastcommand terminalselection testfailure usages vscodeapi microsoft.docs.mcp"
|
"searchText": "expert react frontend engineer expert react 19.2 frontend engineer specializing in modern hooks, server components, actions, typescript, and performance optimization changes codebase edit/editfiles extensions fetch findtestfiles githubrepo new opensimplebrowser problems runcommands runtasks runtests search searchresults terminallastcommand terminalselection testfailure usages vscodeapi microsoft.docs.mcp"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "agent",
|
||||||
|
"id": "fedora-linux-expert",
|
||||||
|
"title": "Fedora Linux Expert",
|
||||||
|
"description": "Fedora (Red Hat family) Linux specialist focused on dnf, SELinux, and modern systemd-based workflows.",
|
||||||
|
"path": "agents/fedora-linux-expert.agent.md",
|
||||||
|
"searchText": "fedora linux expert fedora (red hat family) linux specialist focused on dnf, selinux, and modern systemd-based workflows. codebase search terminalcommand runcommands edit/editfiles"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "agent",
|
"type": "agent",
|
||||||
"id": "gilfoyle",
|
"id": "gilfoyle",
|
||||||
@@ -807,6 +839,14 @@
|
|||||||
"path": "agents/refine-issue.agent.md",
|
"path": "agents/refine-issue.agent.md",
|
||||||
"searchText": "refine issue refine the requirement or issue with acceptance criteria, technical considerations, edge cases, and nfrs list_issues githubrepo search add_issue_comment create_issue create_issue_comment update_issue delete_issue get_issue search_issues"
|
"searchText": "refine issue refine the requirement or issue with acceptance criteria, technical considerations, edge cases, and nfrs list_issues githubrepo search add_issue_comment create_issue create_issue_comment update_issue delete_issue get_issue search_issues"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "agent",
|
||||||
|
"id": "repo-architect",
|
||||||
|
"title": "Repo Architect",
|
||||||
|
"description": "Bootstraps and validates agentic project structures for GitHub Copilot (VS Code) and OpenCode CLI workflows. Run after `opencode /init` or VS Code Copilot initialization to scaffold proper folder hierarchies, instructions, agents, skills, and prompts.",
|
||||||
|
"path": "agents/repo-architect.agent.md",
|
||||||
|
"searchText": "repo architect bootstraps and validates agentic project structures for github copilot (vs code) and opencode cli workflows. run after `opencode /init` or vs code copilot initialization to scaffold proper folder hierarchies, instructions, agents, skills, and prompts. changes codebase editfiles fetch new problems runcommands search terminallastcommand"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "agent",
|
"type": "agent",
|
||||||
"id": "ruby-mcp-expert",
|
"id": "ruby-mcp-expert",
|
||||||
@@ -1151,6 +1191,14 @@
|
|||||||
"path": "prompts/apple-appstore-reviewer.prompt.md",
|
"path": "prompts/apple-appstore-reviewer.prompt.md",
|
||||||
"searchText": "apple app store reviewer serves as a reviewer of the codebase with instructions on looking for apple app store optimizations or rejection reasons."
|
"searchText": "apple app store reviewer serves as a reviewer of the codebase with instructions on looking for apple app store optimizations or rejection reasons."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "prompt",
|
||||||
|
"id": "arch-linux-triage",
|
||||||
|
"title": "Arch Linux Triage",
|
||||||
|
"description": "Triage and resolve Arch Linux issues with pacman, systemd, and rolling-release best practices.",
|
||||||
|
"path": "prompts/arch-linux-triage.prompt.md",
|
||||||
|
"searchText": "arch linux triage triage and resolve arch linux issues with pacman, systemd, and rolling-release best practices."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "prompt",
|
"type": "prompt",
|
||||||
"id": "architecture-blueprint-generator",
|
"id": "architecture-blueprint-generator",
|
||||||
@@ -1239,6 +1287,14 @@
|
|||||||
"path": "prompts/breakdown-test.prompt.md",
|
"path": "prompts/breakdown-test.prompt.md",
|
||||||
"searchText": "breakdown test test planning and quality assurance prompt that generates comprehensive test strategies, task breakdowns, and quality validation plans for github projects."
|
"searchText": "breakdown test test planning and quality assurance prompt that generates comprehensive test strategies, task breakdowns, and quality validation plans for github projects."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "prompt",
|
||||||
|
"id": "centos-linux-triage",
|
||||||
|
"title": "Centos Linux Triage",
|
||||||
|
"description": "Triage and resolve CentOS issues using RHEL-compatible tooling, SELinux-aware practices, and firewalld.",
|
||||||
|
"path": "prompts/centos-linux-triage.prompt.md",
|
||||||
|
"searchText": "centos linux triage triage and resolve centos issues using rhel-compatible tooling, selinux-aware practices, and firewalld."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "prompt",
|
"type": "prompt",
|
||||||
"id": "code-exemplars-blueprint-generator",
|
"id": "code-exemplars-blueprint-generator",
|
||||||
@@ -1519,6 +1575,14 @@
|
|||||||
"path": "prompts/dataverse-python-quickstart.prompt.md",
|
"path": "prompts/dataverse-python-quickstart.prompt.md",
|
||||||
"searchText": "dataverse python quickstart generator generate python sdk setup + crud + bulk + paging snippets using official patterns."
|
"searchText": "dataverse python quickstart generator generate python sdk setup + crud + bulk + paging snippets using official patterns."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "prompt",
|
||||||
|
"id": "debian-linux-triage",
|
||||||
|
"title": "Debian Linux Triage",
|
||||||
|
"description": "Triage and resolve Debian Linux issues with apt, systemd, and AppArmor-aware guidance.",
|
||||||
|
"path": "prompts/debian-linux-triage.prompt.md",
|
||||||
|
"searchText": "debian linux triage triage and resolve debian linux issues with apt, systemd, and apparmor-aware guidance."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "prompt",
|
"type": "prompt",
|
||||||
"id": "declarative-agents",
|
"id": "declarative-agents",
|
||||||
@@ -1575,6 +1639,14 @@
|
|||||||
"path": "prompts/ef-core.prompt.md",
|
"path": "prompts/ef-core.prompt.md",
|
||||||
"searchText": "ef core get best practices for entity framework core"
|
"searchText": "ef core get best practices for entity framework core"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "prompt",
|
||||||
|
"id": "fedora-linux-triage",
|
||||||
|
"title": "Fedora Linux Triage",
|
||||||
|
"description": "Triage and resolve Fedora issues with dnf, systemd, and SELinux-aware guidance.",
|
||||||
|
"path": "prompts/fedora-linux-triage.prompt.md",
|
||||||
|
"searchText": "fedora linux triage triage and resolve fedora issues with dnf, systemd, and selinux-aware guidance."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "prompt",
|
"type": "prompt",
|
||||||
"id": "finalize-agent-prompt",
|
"id": "finalize-agent-prompt",
|
||||||
@@ -2255,6 +2327,14 @@
|
|||||||
"path": "instructions/apex.instructions.md",
|
"path": "instructions/apex.instructions.md",
|
||||||
"searchText": "apex guidelines and best practices for apex development on the salesforce platform **/*.cls, **/*.trigger"
|
"searchText": "apex guidelines and best practices for apex development on the salesforce platform **/*.cls, **/*.trigger"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "instruction",
|
||||||
|
"id": "arch-linux",
|
||||||
|
"title": "Arch Linux",
|
||||||
|
"description": "Guidance for Arch Linux administration, pacman workflows, and rolling-release best practices.",
|
||||||
|
"path": "instructions/arch-linux.instructions.md",
|
||||||
|
"searchText": "arch linux guidance for arch linux administration, pacman workflows, and rolling-release best practices. **"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "instruction",
|
"type": "instruction",
|
||||||
"id": "aspnet-rest-apis",
|
"id": "aspnet-rest-apis",
|
||||||
@@ -2327,6 +2407,14 @@
|
|||||||
"path": "instructions/blazor.instructions.md",
|
"path": "instructions/blazor.instructions.md",
|
||||||
"searchText": "blazor blazor component and application patterns **/*.razor, **/*.razor.cs, **/*.razor.css"
|
"searchText": "blazor blazor component and application patterns **/*.razor, **/*.razor.cs, **/*.razor.css"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "instruction",
|
||||||
|
"id": "centos-linux",
|
||||||
|
"title": "Centos Linux",
|
||||||
|
"description": "Guidance for CentOS administration, RHEL-compatible tooling, and SELinux-aware operations.",
|
||||||
|
"path": "instructions/centos-linux.instructions.md",
|
||||||
|
"searchText": "centos linux guidance for centos administration, rhel-compatible tooling, and selinux-aware operations. **"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "instruction",
|
"type": "instruction",
|
||||||
"id": "clojure",
|
"id": "clojure",
|
||||||
@@ -2567,6 +2655,14 @@
|
|||||||
"path": "instructions/dataverse-python-testing-debugging.instructions.md",
|
"path": "instructions/dataverse-python-testing-debugging.instructions.md",
|
||||||
"searchText": "dataverse python testing debugging **"
|
"searchText": "dataverse python testing debugging **"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "instruction",
|
||||||
|
"id": "debian-linux",
|
||||||
|
"title": "Debian Linux",
|
||||||
|
"description": "Guidance for Debian-based Linux administration, apt workflows, and Debian policy conventions.",
|
||||||
|
"path": "instructions/debian-linux.instructions.md",
|
||||||
|
"searchText": "debian linux guidance for debian-based linux administration, apt workflows, and debian policy conventions. **"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "instruction",
|
"type": "instruction",
|
||||||
"id": "declarative-agents-microsoft365",
|
"id": "declarative-agents-microsoft365",
|
||||||
@@ -2631,6 +2727,14 @@
|
|||||||
"path": "instructions/dotnet-wpf.instructions.md",
|
"path": "instructions/dotnet-wpf.instructions.md",
|
||||||
"searchText": "dotnet wpf .net wpf component and application patterns **/*.xaml, **/*.cs"
|
"searchText": "dotnet wpf .net wpf component and application patterns **/*.xaml, **/*.cs"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "instruction",
|
||||||
|
"id": "fedora-linux",
|
||||||
|
"title": "Fedora Linux",
|
||||||
|
"description": "Guidance for Fedora (Red Hat family) systems, dnf workflows, SELinux, and modern systemd practices.",
|
||||||
|
"path": "instructions/fedora-linux.instructions.md",
|
||||||
|
"searchText": "fedora linux guidance for fedora (red hat family) systems, dnf workflows, selinux, and modern systemd practices. **"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "instruction",
|
"type": "instruction",
|
||||||
"id": "genaiscript",
|
"id": "genaiscript",
|
||||||
@@ -3559,6 +3663,14 @@
|
|||||||
"path": "skills/chrome-devtools",
|
"path": "skills/chrome-devtools",
|
||||||
"searchText": "chrome devtools expert-level browser automation, debugging, and performance analysis using chrome devtools mcp. use for interacting with web pages, capturing screenshots, analyzing network traffic, and profiling performance."
|
"searchText": "chrome devtools expert-level browser automation, debugging, and performance analysis using chrome devtools mcp. use for interacting with web pages, capturing screenshots, analyzing network traffic, and profiling performance."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "skill",
|
||||||
|
"id": "copilot-sdk",
|
||||||
|
"title": "Copilot Sdk",
|
||||||
|
"description": "Build agentic applications with GitHub Copilot SDK. Use when embedding AI agents in apps, creating custom tools, implementing streaming responses, managing sessions, connecting to MCP servers, or creating custom agents. Triggers on Copilot SDK, GitHub SDK, agentic app, embed Copilot, programmable agent, MCP server, custom agent.",
|
||||||
|
"path": "skills/copilot-sdk",
|
||||||
|
"searchText": "copilot sdk build agentic applications with github copilot sdk. use when embedding ai agents in apps, creating custom tools, implementing streaming responses, managing sessions, connecting to mcp servers, or creating custom agents. triggers on copilot sdk, github sdk, agentic app, embed copilot, programmable agent, mcp server, custom agent."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "skill",
|
"type": "skill",
|
||||||
"id": "gh-cli",
|
"id": "gh-cli",
|
||||||
@@ -3607,6 +3719,14 @@
|
|||||||
"path": "skills/make-skill-template",
|
"path": "skills/make-skill-template",
|
||||||
"searchText": "make skill template create new agent skills for github copilot from prompts or by duplicating this template. use when asked to \"create a skill\", \"make a new skill\", \"scaffold a skill\", or when building specialized ai capabilities with bundled resources. generates skill.md files with proper frontmatter, directory structure, and optional scripts/references/assets folders."
|
"searchText": "make skill template create new agent skills for github copilot from prompts or by duplicating this template. use when asked to \"create a skill\", \"make a new skill\", \"scaffold a skill\", or when building specialized ai capabilities with bundled resources. generates skill.md files with proper frontmatter, directory structure, and optional scripts/references/assets folders."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "skill",
|
||||||
|
"id": "markdown-to-html",
|
||||||
|
"title": "Markdown To Html",
|
||||||
|
"description": "Convert Markdown files to HTML similar to `marked.js`, `pandoc`, `gomarkdown/markdown`, or similar tools; or writing custom script to convert markdown to html and/or working on web template systems like `jekyll/jekyll`, `gohugoio/hugo`, or similar web templating systems that utilize markdown documents, converting them to html. Use when asked to \"convert markdown to html\", \"transform md to html\", \"render markdown\", \"generate html from markdown\", or when working with .md files and/or web a templating system that converts markdown to HTML output. Supports CLI and Node.js workflows with GFM, CommonMark, and standard Markdown flavors.",
|
||||||
|
"path": "skills/markdown-to-html",
|
||||||
|
"searchText": "markdown to html convert markdown files to html similar to `marked.js`, `pandoc`, `gomarkdown/markdown`, or similar tools; or writing custom script to convert markdown to html and/or working on web template systems like `jekyll/jekyll`, `gohugoio/hugo`, or similar web templating systems that utilize markdown documents, converting them to html. use when asked to \"convert markdown to html\", \"transform md to html\", \"render markdown\", \"generate html from markdown\", or when working with .md files and/or web a templating system that converts markdown to html output. supports cli and node.js workflows with gfm, commonmark, and standard markdown flavors."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "skill",
|
"type": "skill",
|
||||||
"id": "mcp-cli",
|
"id": "mcp-cli",
|
||||||
@@ -3679,6 +3799,14 @@
|
|||||||
"path": "skills/snowflake-semanticview",
|
"path": "skills/snowflake-semanticview",
|
||||||
"searchText": "snowflake semanticview create, alter, and validate snowflake semantic views using snowflake cli (snow). use when asked to build or troubleshoot semantic views/semantic layer definitions with create/alter semantic view, to validate semantic-view ddl against snowflake via cli, or to guide snowflake cli installation and connection setup."
|
"searchText": "snowflake semanticview create, alter, and validate snowflake semantic views using snowflake cli (snow). use when asked to build or troubleshoot semantic views/semantic layer definitions with create/alter semantic view, to validate semantic-view ddl against snowflake via cli, or to guide snowflake cli installation and connection setup."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "skill",
|
||||||
|
"id": "terraform-azurerm-set-diff-analyzer",
|
||||||
|
"title": "Terraform Azurerm Set Diff Analyzer",
|
||||||
|
"description": "Analyze Terraform plan JSON output for AzureRM Provider to distinguish between false-positive diffs (order-only changes in Set-type attributes) and actual resource changes. Use when reviewing terraform plan output for Azure resources like Application Gateway, Load Balancer, Firewall, Front Door, NSG, and other resources with Set-type attributes that cause spurious diffs due to internal ordering changes.",
|
||||||
|
"path": "skills/terraform-azurerm-set-diff-analyzer",
|
||||||
|
"searchText": "terraform azurerm set diff analyzer analyze terraform plan json output for azurerm provider to distinguish between false-positive diffs (order-only changes in set-type attributes) and actual resource changes. use when reviewing terraform plan output for azure resources like application gateway, load balancer, firewall, front door, nsg, and other resources with set-type attributes that cause spurious diffs due to internal ordering changes."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "skill",
|
"type": "skill",
|
||||||
"id": "vscode-ext-commands",
|
"id": "vscode-ext-commands",
|
||||||
@@ -3711,6 +3839,14 @@
|
|||||||
"path": "skills/webapp-testing",
|
"path": "skills/webapp-testing",
|
||||||
"searchText": "webapp testing toolkit for interacting with and testing local web applications using playwright. supports verifying frontend functionality, debugging ui behavior, capturing browser screenshots, and viewing browser logs."
|
"searchText": "webapp testing toolkit for interacting with and testing local web applications using playwright. supports verifying frontend functionality, debugging ui behavior, capturing browser screenshots, and viewing browser logs."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "skill",
|
||||||
|
"id": "winapp-cli",
|
||||||
|
"title": "Winapp Cli",
|
||||||
|
"description": "Windows App Development CLI (winapp) for building, packaging, and deploying Windows applications. Use when asked to initialize Windows app projects, create MSIX packages, generate AppxManifest.xml, manage development certificates, add package identity for debugging, sign packages, or access Windows SDK build tools. Supports .NET, C++, Electron, Rust, Tauri, and cross-platform frameworks targeting Windows.",
|
||||||
|
"path": "skills/winapp-cli",
|
||||||
|
"searchText": "winapp cli windows app development cli (winapp) for building, packaging, and deploying windows applications. use when asked to initialize windows app projects, create msix packages, generate appxmanifest.xml, manage development certificates, add package identity for debugging, sign packages, or access windows sdk build tools. supports .net, c++, electron, rust, tauri, and cross-platform frameworks targeting windows."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "skill",
|
"type": "skill",
|
||||||
"id": "workiq-copilot",
|
"id": "workiq-copilot",
|
||||||
|
|||||||
@@ -234,6 +234,25 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "copilot-sdk",
|
||||||
|
"name": "copilot-sdk",
|
||||||
|
"title": "Copilot Sdk",
|
||||||
|
"description": "Build agentic applications with GitHub Copilot SDK. Use when embedding AI agents in apps, creating custom tools, implementing streaming responses, managing sessions, connecting to MCP servers, or creating custom agents. Triggers on Copilot SDK, GitHub SDK, agentic app, embed Copilot, programmable agent, MCP server, custom agent.",
|
||||||
|
"assets": [],
|
||||||
|
"hasAssets": false,
|
||||||
|
"assetCount": 0,
|
||||||
|
"category": "Git & GitHub",
|
||||||
|
"path": "skills/copilot-sdk",
|
||||||
|
"skillFile": "skills/copilot-sdk/SKILL.md",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "skills/copilot-sdk/SKILL.md",
|
||||||
|
"name": "SKILL.md",
|
||||||
|
"size": 22409
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "gh-cli",
|
"id": "gh-cli",
|
||||||
"name": "gh-cli",
|
"name": "gh-cli",
|
||||||
@@ -476,6 +495,116 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "markdown-to-html",
|
||||||
|
"name": "markdown-to-html",
|
||||||
|
"title": "Markdown To Html",
|
||||||
|
"description": "Convert Markdown files to HTML similar to `marked.js`, `pandoc`, `gomarkdown/markdown`, or similar tools; or writing custom script to convert markdown to html and/or working on web template systems like `jekyll/jekyll`, `gohugoio/hugo`, or similar web templating systems that utilize markdown documents, converting them to html. Use when asked to \"convert markdown to html\", \"transform md to html\", \"render markdown\", \"generate html from markdown\", or when working with .md files and/or web a templating system that converts markdown to HTML output. Supports CLI and Node.js workflows with GFM, CommonMark, and standard Markdown flavors.",
|
||||||
|
"assets": [
|
||||||
|
"references/basic-markdown-to-html.md",
|
||||||
|
"references/basic-markdown.md",
|
||||||
|
"references/code-blocks-to-html.md",
|
||||||
|
"references/code-blocks.md",
|
||||||
|
"references/collapsed-sections-to-html.md",
|
||||||
|
"references/collapsed-sections.md",
|
||||||
|
"references/gomarkdown.md",
|
||||||
|
"references/hugo.md",
|
||||||
|
"references/jekyll.md",
|
||||||
|
"references/marked.md",
|
||||||
|
"references/pandoc.md",
|
||||||
|
"references/tables-to-html.md",
|
||||||
|
"references/tables.md",
|
||||||
|
"references/writing-mathematical-expressions-to-html.md",
|
||||||
|
"references/writing-mathematical-expressions.md"
|
||||||
|
],
|
||||||
|
"hasAssets": true,
|
||||||
|
"assetCount": 15,
|
||||||
|
"category": "CLI Tools",
|
||||||
|
"path": "skills/markdown-to-html",
|
||||||
|
"skillFile": "skills/markdown-to-html/SKILL.md",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/SKILL.md",
|
||||||
|
"name": "SKILL.md",
|
||||||
|
"size": 24632
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/basic-markdown-to-html.md",
|
||||||
|
"name": "references/basic-markdown-to-html.md",
|
||||||
|
"size": 4291
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/basic-markdown.md",
|
||||||
|
"name": "references/basic-markdown.md",
|
||||||
|
"size": 31397
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/code-blocks-to-html.md",
|
||||||
|
"name": "references/code-blocks-to-html.md",
|
||||||
|
"size": 2704
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/code-blocks.md",
|
||||||
|
"name": "references/code-blocks.md",
|
||||||
|
"size": 3810
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/collapsed-sections-to-html.md",
|
||||||
|
"name": "references/collapsed-sections-to-html.md",
|
||||||
|
"size": 2608
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/collapsed-sections.md",
|
||||||
|
"name": "references/collapsed-sections.md",
|
||||||
|
"size": 2787
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/gomarkdown.md",
|
||||||
|
"name": "references/gomarkdown.md",
|
||||||
|
"size": 6253
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/hugo.md",
|
||||||
|
"name": "references/hugo.md",
|
||||||
|
"size": 7029
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/jekyll.md",
|
||||||
|
"name": "references/jekyll.md",
|
||||||
|
"size": 5760
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/marked.md",
|
||||||
|
"name": "references/marked.md",
|
||||||
|
"size": 2984
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/pandoc.md",
|
||||||
|
"name": "references/pandoc.md",
|
||||||
|
"size": 4123
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/tables-to-html.md",
|
||||||
|
"name": "references/tables-to-html.md",
|
||||||
|
"size": 2665
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/tables.md",
|
||||||
|
"name": "references/tables.md",
|
||||||
|
"size": 3767
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/writing-mathematical-expressions-to-html.md",
|
||||||
|
"name": "references/writing-mathematical-expressions-to-html.md",
|
||||||
|
"size": 6004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/markdown-to-html/references/writing-mathematical-expressions.md",
|
||||||
|
"name": "references/writing-mathematical-expressions.md",
|
||||||
|
"size": 4886
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "mcp-cli",
|
"id": "mcp-cli",
|
||||||
"name": "mcp-cli",
|
"name": "mcp-cli",
|
||||||
@@ -647,6 +776,56 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "terraform-azurerm-set-diff-analyzer",
|
||||||
|
"name": "terraform-azurerm-set-diff-analyzer",
|
||||||
|
"title": "Terraform Azurerm Set Diff Analyzer",
|
||||||
|
"description": "Analyze Terraform plan JSON output for AzureRM Provider to distinguish between false-positive diffs (order-only changes in Set-type attributes) and actual resource changes. Use when reviewing terraform plan output for Azure resources like Application Gateway, Load Balancer, Firewall, Front Door, NSG, and other resources with Set-type attributes that cause spurious diffs due to internal ordering changes.",
|
||||||
|
"assets": [
|
||||||
|
"references/azurerm_set_attributes.json",
|
||||||
|
"references/azurerm_set_attributes.md",
|
||||||
|
"scripts/.gitignore",
|
||||||
|
"scripts/README.md",
|
||||||
|
"scripts/analyze_plan.py"
|
||||||
|
],
|
||||||
|
"hasAssets": true,
|
||||||
|
"assetCount": 5,
|
||||||
|
"category": "Azure",
|
||||||
|
"path": "skills/terraform-azurerm-set-diff-analyzer",
|
||||||
|
"skillFile": "skills/terraform-azurerm-set-diff-analyzer/SKILL.md",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "skills/terraform-azurerm-set-diff-analyzer/SKILL.md",
|
||||||
|
"name": "SKILL.md",
|
||||||
|
"size": 2187
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/terraform-azurerm-set-diff-analyzer/references/azurerm_set_attributes.json",
|
||||||
|
"name": "references/azurerm_set_attributes.json",
|
||||||
|
"size": 5106
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/terraform-azurerm-set-diff-analyzer/references/azurerm_set_attributes.md",
|
||||||
|
"name": "references/azurerm_set_attributes.md",
|
||||||
|
"size": 3966
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/terraform-azurerm-set-diff-analyzer/scripts/.gitignore",
|
||||||
|
"name": "scripts/.gitignore",
|
||||||
|
"size": 742
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/terraform-azurerm-set-diff-analyzer/scripts/README.md",
|
||||||
|
"name": "scripts/README.md",
|
||||||
|
"size": 5306
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/terraform-azurerm-set-diff-analyzer/scripts/analyze_plan.py",
|
||||||
|
"name": "scripts/analyze_plan.py",
|
||||||
|
"size": 30996
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "vscode-ext-commands",
|
"id": "vscode-ext-commands",
|
||||||
"name": "vscode-ext-commands",
|
"name": "vscode-ext-commands",
|
||||||
@@ -743,6 +922,25 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "winapp-cli",
|
||||||
|
"name": "winapp-cli",
|
||||||
|
"title": "Winapp Cli",
|
||||||
|
"description": "Windows App Development CLI (winapp) for building, packaging, and deploying Windows applications. Use when asked to initialize Windows app projects, create MSIX packages, generate AppxManifest.xml, manage development certificates, add package identity for debugging, sign packages, or access Windows SDK build tools. Supports .NET, C++, Electron, Rust, Tauri, and cross-platform frameworks targeting Windows.",
|
||||||
|
"assets": [],
|
||||||
|
"hasAssets": false,
|
||||||
|
"assetCount": 0,
|
||||||
|
"category": "CLI Tools",
|
||||||
|
"path": "skills/winapp-cli",
|
||||||
|
"skillFile": "skills/winapp-cli/SKILL.md",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "skills/winapp-cli/SKILL.md",
|
||||||
|
"name": "SKILL.md",
|
||||||
|
"size": 7654
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "workiq-copilot",
|
"id": "workiq-copilot",
|
||||||
"name": "workiq-copilot",
|
"name": "workiq-copilot",
|
||||||
|
|||||||
@@ -1,95 +1,246 @@
|
|||||||
---
|
---
|
||||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||||
|
import Modal from '../components/Modal.astro';
|
||||||
|
|
||||||
const base = import.meta.env.BASE_URL;
|
const base = import.meta.env.BASE_URL;
|
||||||
---
|
---
|
||||||
|
|
||||||
<BaseLayout title="Samples" description="Code samples and examples for building with GitHub Copilot" activeNav="samples">
|
<BaseLayout title="Samples" description="Code samples, recipes, and examples for building with GitHub Copilot" activeNav="samples">
|
||||||
<main id="main-content">
|
<main id="main-content">
|
||||||
<div class="page-header">
|
<div class="page-header">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1>📚 Samples</h1>
|
<h1>📚 Samples & Recipes</h1>
|
||||||
<p>Code samples and examples for building with GitHub Copilot</p>
|
<p>Code samples, recipes, and examples for building with GitHub Copilot tools</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="page-content">
|
<div class="page-content">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="coming-soon">
|
<div class="search-bar">
|
||||||
<div class="coming-soon-icon" aria-hidden="true">🚧</div>
|
<label for="search-input" class="sr-only">Search recipes</label>
|
||||||
<h2>Coming Soon</h2>
|
<input type="text" id="search-input" placeholder="Search recipes..." autocomplete="off">
|
||||||
<p>We're migrating code samples from the <a href="https://github.com/github/copilot-sdk/tree/main/cookbook" target="_blank" rel="noopener">Copilot SDK Cookbook</a> to this repository.</p>
|
|
||||||
<p>Check back soon for examples including:</p>
|
|
||||||
<ul class="sample-list">
|
|
||||||
<li>Building custom agents</li>
|
|
||||||
<li>Integrating with MCP servers</li>
|
|
||||||
<li>Creating prompt templates</li>
|
|
||||||
<li>Working with Copilot APIs</li>
|
|
||||||
</ul>
|
|
||||||
<div class="coming-soon-actions">
|
|
||||||
<a href="https://github.com/github/copilot-sdk/tree/main/cookbook" class="btn btn-primary" target="_blank" rel="noopener">
|
|
||||||
View Current Cookbook
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/github/awesome-copilot" class="btn btn-secondary" target="_blank" rel="noopener">
|
|
||||||
Watch Repository
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="filters-bar" id="filters-bar">
|
||||||
|
<div class="filter-group">
|
||||||
|
<label for="filter-language">Language:</label>
|
||||||
|
<select id="filter-language" aria-label="Filter by language">
|
||||||
|
<option value="">All Languages</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="filter-group">
|
||||||
|
<label for="filter-tag">Tags:</label>
|
||||||
|
<select id="filter-tag" multiple aria-label="Filter by tags"></select>
|
||||||
|
</div>
|
||||||
|
<button id="clear-filters" class="btn btn-secondary btn-small">Clear Filters</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="results-count" id="results-count" aria-live="polite"></div>
|
||||||
|
|
||||||
|
<div id="samples-list" role="list">
|
||||||
|
<div class="loading" aria-live="polite">Loading samples...</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<style>
|
<Modal />
|
||||||
.coming-soon {
|
|
||||||
text-align: center;
|
<style is:global>
|
||||||
padding: 64px 32px;
|
/* Cookbook Section */
|
||||||
background-color: var(--color-bg-secondary);
|
.cookbook-section {
|
||||||
border: 1px dashed var(--color-border);
|
margin-bottom: 48px;
|
||||||
border-radius: var(--border-radius-lg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.coming-soon-icon {
|
.cookbook-header {
|
||||||
font-size: 64px;
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 24px;
|
||||||
margin-bottom: 24px;
|
margin-bottom: 24px;
|
||||||
}
|
padding-bottom: 16px;
|
||||||
|
|
||||||
.coming-soon h2 {
|
|
||||||
color: var(--color-text-emphasis);
|
|
||||||
margin-bottom: 16px;
|
|
||||||
font-size: 28px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.coming-soon p {
|
|
||||||
color: var(--color-text-muted);
|
|
||||||
max-width: 500px;
|
|
||||||
margin: 0 auto 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sample-list {
|
|
||||||
list-style: none;
|
|
||||||
padding: 0;
|
|
||||||
margin: 24px auto;
|
|
||||||
max-width: 300px;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sample-list li {
|
|
||||||
padding: 8px 0;
|
|
||||||
color: var(--color-text);
|
|
||||||
border-bottom: 1px solid var(--color-border);
|
border-bottom: 1px solid var(--color-border);
|
||||||
}
|
}
|
||||||
|
|
||||||
.sample-list li::before {
|
.cookbook-info h2 {
|
||||||
content: '→ ';
|
margin: 0 0 8px 0;
|
||||||
color: var(--color-link);
|
font-size: 24px;
|
||||||
|
color: var(--color-text-emphasis);
|
||||||
}
|
}
|
||||||
|
|
||||||
.coming-soon-actions {
|
.cookbook-info p {
|
||||||
margin-top: 32px;
|
margin: 0;
|
||||||
|
color: var(--color-text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cookbook-languages {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lang-tab {
|
||||||
|
padding: 8px 12px;
|
||||||
|
border: 1px solid var(--color-border);
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
background: var(--color-bg-secondary);
|
||||||
|
color: var(--color-text);
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 16px;
|
||||||
|
transition: all var(--transition);
|
||||||
|
}
|
||||||
|
|
||||||
|
.lang-tab:hover {
|
||||||
|
border-color: var(--color-link);
|
||||||
|
background: var(--color-bg-tertiary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.lang-tab.active {
|
||||||
|
border-color: var(--color-link);
|
||||||
|
background: var(--color-link);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Recipe Grid */
|
||||||
|
.recipes-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Recipe Card */
|
||||||
|
.recipe-card {
|
||||||
|
background: var(--color-card-bg);
|
||||||
|
border: 1px solid var(--color-border);
|
||||||
|
border-radius: var(--border-radius-lg);
|
||||||
|
padding: 24px;
|
||||||
|
transition: all var(--transition);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-card:hover {
|
||||||
|
border-color: var(--color-link);
|
||||||
|
box-shadow: var(--shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-start;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
justify-content: center;
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-header h3 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 18px;
|
||||||
|
color: var(--color-text-emphasis);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-langs {
|
||||||
|
display: flex;
|
||||||
|
gap: 4px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lang-indicator {
|
||||||
|
font-size: 14px;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-description {
|
||||||
|
color: var(--color-text-muted);
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 0 0 16px 0;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-tags {
|
||||||
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
gap: 6px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-tag {
|
||||||
|
background: var(--color-bg-secondary);
|
||||||
|
color: var(--color-text-muted);
|
||||||
|
padding: 4px 10px;
|
||||||
|
border-radius: 12px;
|
||||||
|
font-size: 12px;
|
||||||
|
border: 1px solid var(--color-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-actions {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 8px;
|
||||||
|
padding-top: 16px;
|
||||||
|
border-top: 1px solid var(--color-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-actions .btn {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-actions .btn svg {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-variant {
|
||||||
|
color: var(--color-text-muted);
|
||||||
|
font-size: 13px;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Empty state */
|
||||||
|
.empty-state {
|
||||||
|
text-align: center;
|
||||||
|
padding: 64px 24px;
|
||||||
|
background: var(--color-bg-secondary);
|
||||||
|
border-radius: var(--border-radius-lg);
|
||||||
|
border: 1px dashed var(--color-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.empty-state h3 {
|
||||||
|
margin: 0 0 8px 0;
|
||||||
|
color: var(--color-text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.empty-state p {
|
||||||
|
margin: 0;
|
||||||
|
color: var(--color-text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Search highlight */
|
||||||
|
.search-highlight {
|
||||||
|
background-color: var(--color-warning);
|
||||||
|
color: var(--color-text-emphasis);
|
||||||
|
padding: 0 2px;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Responsive */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.cookbook-header {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipes-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-actions {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe-actions .btn {
|
||||||
|
width: 100%;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import '../scripts/pages/samples';
|
||||||
|
</script>
|
||||||
</BaseLayout>
|
</BaseLayout>
|
||||||
|
|||||||
477
website/src/scripts/pages/samples.ts
Normal file
477
website/src/scripts/pages/samples.ts
Normal file
@@ -0,0 +1,477 @@
|
|||||||
|
/**
|
||||||
|
* Samples/Cookbook page functionality
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { FuzzySearch, type SearchableItem } from '../search';
|
||||||
|
import { fetchData, fetchFileContent, escapeHtml } from '../utils';
|
||||||
|
|
||||||
|
// Types
|
||||||
|
interface Language {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
icon: string;
|
||||||
|
extension: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RecipeVariant {
|
||||||
|
doc: string;
|
||||||
|
example: string | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Recipe extends SearchableItem {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
tags: string[];
|
||||||
|
variants: Record<string, RecipeVariant>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Cookbook {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
path: string;
|
||||||
|
featured: boolean;
|
||||||
|
languages: Language[];
|
||||||
|
recipes: Recipe[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SamplesData {
|
||||||
|
cookbooks: Cookbook[];
|
||||||
|
totalRecipes: number;
|
||||||
|
totalCookbooks: number;
|
||||||
|
filters: {
|
||||||
|
languages: string[];
|
||||||
|
tags: string[];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// State
|
||||||
|
let samplesData: SamplesData | null = null;
|
||||||
|
let search: FuzzySearch<Recipe & { title: string; cookbookId: string }> | null = null;
|
||||||
|
let selectedLanguage: string | null = null;
|
||||||
|
let selectedTags: string[] = [];
|
||||||
|
let expandedRecipes: Set<string> = new Set();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the samples page
|
||||||
|
*/
|
||||||
|
export async function initSamplesPage(): Promise<void> {
|
||||||
|
// Load samples data
|
||||||
|
samplesData = await fetchData<SamplesData>('samples.json');
|
||||||
|
|
||||||
|
if (!samplesData || samplesData.cookbooks.length === 0) {
|
||||||
|
showEmptyState();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize search with all recipes
|
||||||
|
const allRecipes = samplesData.cookbooks.flatMap(cookbook =>
|
||||||
|
cookbook.recipes.map(recipe => ({
|
||||||
|
...recipe,
|
||||||
|
title: recipe.name,
|
||||||
|
cookbookId: cookbook.id
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
search = new FuzzySearch(allRecipes);
|
||||||
|
|
||||||
|
// Setup UI
|
||||||
|
setupFilters();
|
||||||
|
setupSearch();
|
||||||
|
renderCookbooks();
|
||||||
|
updateResultsCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show empty state when no cookbooks are available
|
||||||
|
*/
|
||||||
|
function showEmptyState(): void {
|
||||||
|
const container = document.getElementById('samples-list');
|
||||||
|
if (container) {
|
||||||
|
container.innerHTML = `
|
||||||
|
<div class="empty-state">
|
||||||
|
<h3>No Samples Available</h3>
|
||||||
|
<p>Check back soon for code samples and recipes.</p>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide filters
|
||||||
|
const filtersBar = document.getElementById('filters-bar');
|
||||||
|
if (filtersBar) filtersBar.style.display = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup language and tag filters
|
||||||
|
*/
|
||||||
|
function setupFilters(): void {
|
||||||
|
if (!samplesData) return;
|
||||||
|
|
||||||
|
// Language filter
|
||||||
|
const languageSelect = document.getElementById('filter-language') as HTMLSelectElement;
|
||||||
|
if (languageSelect) {
|
||||||
|
// Get unique languages across all cookbooks
|
||||||
|
const languages = new Map<string, Language>();
|
||||||
|
samplesData.cookbooks.forEach(cookbook => {
|
||||||
|
cookbook.languages.forEach(lang => {
|
||||||
|
if (!languages.has(lang.id)) {
|
||||||
|
languages.set(lang.id, lang);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
languageSelect.innerHTML = '<option value="">All Languages</option>';
|
||||||
|
languages.forEach((lang, id) => {
|
||||||
|
const option = document.createElement('option');
|
||||||
|
option.value = id;
|
||||||
|
option.textContent = `${lang.icon} ${lang.name}`;
|
||||||
|
languageSelect.appendChild(option);
|
||||||
|
});
|
||||||
|
|
||||||
|
languageSelect.addEventListener('change', () => {
|
||||||
|
selectedLanguage = languageSelect.value || null;
|
||||||
|
renderCookbooks();
|
||||||
|
updateResultsCount();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tag filter (multi-select with Choices.js if available)
|
||||||
|
const tagSelect = document.getElementById('filter-tag') as HTMLSelectElement;
|
||||||
|
if (tagSelect && samplesData.filters.tags.length > 0) {
|
||||||
|
tagSelect.innerHTML = '';
|
||||||
|
samplesData.filters.tags.forEach(tag => {
|
||||||
|
const option = document.createElement('option');
|
||||||
|
option.value = tag;
|
||||||
|
option.textContent = tag;
|
||||||
|
tagSelect.appendChild(option);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Initialize Choices.js if available
|
||||||
|
if (typeof window !== 'undefined' && (window as any).Choices) {
|
||||||
|
const choices = new (window as any).Choices(tagSelect, {
|
||||||
|
removeItemButton: true,
|
||||||
|
placeholder: true,
|
||||||
|
placeholderValue: 'Filter by tags...',
|
||||||
|
searchPlaceholderValue: 'Search tags...',
|
||||||
|
noResultsText: 'No tags found',
|
||||||
|
noChoicesText: 'No tags available',
|
||||||
|
});
|
||||||
|
|
||||||
|
tagSelect.addEventListener('change', () => {
|
||||||
|
selectedTags = choices.getValue(true) as string[];
|
||||||
|
renderCookbooks();
|
||||||
|
updateResultsCount();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
tagSelect.multiple = true;
|
||||||
|
tagSelect.addEventListener('change', () => {
|
||||||
|
selectedTags = Array.from(tagSelect.selectedOptions).map(o => o.value);
|
||||||
|
renderCookbooks();
|
||||||
|
updateResultsCount();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear filters button
|
||||||
|
const clearBtn = document.getElementById('clear-filters');
|
||||||
|
clearBtn?.addEventListener('click', clearFilters);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup search functionality
|
||||||
|
*/
|
||||||
|
function setupSearch(): void {
|
||||||
|
const searchInput = document.getElementById('search-input') as HTMLInputElement;
|
||||||
|
if (!searchInput) return;
|
||||||
|
|
||||||
|
let debounceTimer: number;
|
||||||
|
searchInput.addEventListener('input', () => {
|
||||||
|
clearTimeout(debounceTimer);
|
||||||
|
debounceTimer = window.setTimeout(() => {
|
||||||
|
renderCookbooks();
|
||||||
|
updateResultsCount();
|
||||||
|
}, 200);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear all filters
|
||||||
|
*/
|
||||||
|
function clearFilters(): void {
|
||||||
|
selectedLanguage = null;
|
||||||
|
selectedTags = [];
|
||||||
|
|
||||||
|
const languageSelect = document.getElementById('filter-language') as HTMLSelectElement;
|
||||||
|
if (languageSelect) languageSelect.value = '';
|
||||||
|
|
||||||
|
const tagSelect = document.getElementById('filter-tag') as HTMLSelectElement;
|
||||||
|
if (tagSelect && (window as any).Choices) {
|
||||||
|
// Clear Choices.js selection
|
||||||
|
const choicesInstance = tagSelect.closest('.choices');
|
||||||
|
if (choicesInstance) {
|
||||||
|
const choices = (tagSelect as any).choices;
|
||||||
|
if (choices) choices.removeActiveItems();
|
||||||
|
}
|
||||||
|
} else if (tagSelect) {
|
||||||
|
Array.from(tagSelect.options).forEach(o => o.selected = false);
|
||||||
|
}
|
||||||
|
|
||||||
|
const searchInput = document.getElementById('search-input') as HTMLInputElement;
|
||||||
|
if (searchInput) searchInput.value = '';
|
||||||
|
|
||||||
|
renderCookbooks();
|
||||||
|
updateResultsCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get filtered recipes
|
||||||
|
*/
|
||||||
|
function getFilteredRecipes(): { cookbook: Cookbook; recipe: Recipe; highlighted?: string }[] {
|
||||||
|
if (!samplesData || !search) return [];
|
||||||
|
|
||||||
|
const searchInput = document.getElementById('search-input') as HTMLInputElement;
|
||||||
|
const query = searchInput?.value.trim() || '';
|
||||||
|
|
||||||
|
let results: { cookbook: Cookbook; recipe: Recipe; highlighted?: string }[] = [];
|
||||||
|
|
||||||
|
if (query) {
|
||||||
|
// Use fuzzy search
|
||||||
|
const searchResults = search.search(query);
|
||||||
|
results = searchResults.map(result => {
|
||||||
|
const cookbook = samplesData!.cookbooks.find(c => c.id === result.item.cookbookId)!;
|
||||||
|
return {
|
||||||
|
cookbook,
|
||||||
|
recipe: result.item,
|
||||||
|
highlighted: search!.highlight(result.item.title, query)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// No search query - return all recipes
|
||||||
|
results = samplesData.cookbooks.flatMap(cookbook =>
|
||||||
|
cookbook.recipes.map(recipe => ({ cookbook, recipe }))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply language filter
|
||||||
|
if (selectedLanguage) {
|
||||||
|
results = results.filter(({ recipe }) =>
|
||||||
|
recipe.variants[selectedLanguage!]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply tag filter
|
||||||
|
if (selectedTags.length > 0) {
|
||||||
|
results = results.filter(({ recipe }) =>
|
||||||
|
selectedTags.some(tag => recipe.tags.includes(tag))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render cookbooks and recipes
|
||||||
|
*/
|
||||||
|
function renderCookbooks(): void {
|
||||||
|
const container = document.getElementById('samples-list');
|
||||||
|
if (!container || !samplesData) return;
|
||||||
|
|
||||||
|
const filteredResults = getFilteredRecipes();
|
||||||
|
|
||||||
|
if (filteredResults.length === 0) {
|
||||||
|
container.innerHTML = `
|
||||||
|
<div class="empty-state">
|
||||||
|
<h3>No Results Found</h3>
|
||||||
|
<p>Try adjusting your search or filters.</p>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Group by cookbook
|
||||||
|
const byCookbook = new Map<string, { cookbook: Cookbook; recipes: { recipe: Recipe; highlighted?: string }[] }>();
|
||||||
|
filteredResults.forEach(({ cookbook, recipe, highlighted }) => {
|
||||||
|
if (!byCookbook.has(cookbook.id)) {
|
||||||
|
byCookbook.set(cookbook.id, { cookbook, recipes: [] });
|
||||||
|
}
|
||||||
|
byCookbook.get(cookbook.id)!.recipes.push({ recipe, highlighted });
|
||||||
|
});
|
||||||
|
|
||||||
|
let html = '';
|
||||||
|
byCookbook.forEach(({ cookbook, recipes }) => {
|
||||||
|
html += renderCookbookSection(cookbook, recipes);
|
||||||
|
});
|
||||||
|
|
||||||
|
container.innerHTML = html;
|
||||||
|
|
||||||
|
// Setup event listeners
|
||||||
|
setupRecipeListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render a cookbook section
|
||||||
|
*/
|
||||||
|
function renderCookbookSection(cookbook: Cookbook, recipes: { recipe: Recipe; highlighted?: string }[]): string {
|
||||||
|
const languageTabs = cookbook.languages.map(lang => `
|
||||||
|
<button class="lang-tab${selectedLanguage === lang.id ? ' active' : ''}"
|
||||||
|
data-lang="${lang.id}"
|
||||||
|
title="${lang.name}">
|
||||||
|
${lang.icon}
|
||||||
|
</button>
|
||||||
|
`).join('');
|
||||||
|
|
||||||
|
const recipeCards = recipes.map(({ recipe, highlighted }) =>
|
||||||
|
renderRecipeCard(cookbook, recipe, highlighted)
|
||||||
|
).join('');
|
||||||
|
|
||||||
|
return `
|
||||||
|
<div class="cookbook-section" data-cookbook="${cookbook.id}">
|
||||||
|
<div class="cookbook-header">
|
||||||
|
<div class="cookbook-info">
|
||||||
|
<h2>${escapeHtml(cookbook.name)}</h2>
|
||||||
|
<p>${escapeHtml(cookbook.description)}</p>
|
||||||
|
</div>
|
||||||
|
<div class="cookbook-languages">
|
||||||
|
${languageTabs}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="recipes-grid">
|
||||||
|
${recipeCards}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render a recipe card
|
||||||
|
*/
|
||||||
|
function renderRecipeCard(cookbook: Cookbook, recipe: Recipe, highlightedName?: string): string {
|
||||||
|
const recipeKey = `${cookbook.id}-${recipe.id}`;
|
||||||
|
const isExpanded = expandedRecipes.has(recipeKey);
|
||||||
|
|
||||||
|
// Determine which language to show
|
||||||
|
const displayLang = selectedLanguage || cookbook.languages[0]?.id || 'nodejs';
|
||||||
|
const variant = recipe.variants[displayLang];
|
||||||
|
|
||||||
|
const tags = recipe.tags.map(tag =>
|
||||||
|
`<span class="recipe-tag">${escapeHtml(tag)}</span>`
|
||||||
|
).join('');
|
||||||
|
|
||||||
|
const langIndicators = cookbook.languages
|
||||||
|
.filter(lang => recipe.variants[lang.id])
|
||||||
|
.map(lang => `<span class="lang-indicator" title="${lang.name}">${lang.icon}</span>`)
|
||||||
|
.join('');
|
||||||
|
|
||||||
|
return `
|
||||||
|
<div class="recipe-card${isExpanded ? ' expanded' : ''}" data-recipe="${recipeKey}" data-cookbook="${cookbook.id}" data-recipe-id="${recipe.id}">
|
||||||
|
<div class="recipe-header">
|
||||||
|
<h3>${highlightedName || escapeHtml(recipe.name)}</h3>
|
||||||
|
<div class="recipe-langs">${langIndicators}</div>
|
||||||
|
</div>
|
||||||
|
<p class="recipe-description">${escapeHtml(recipe.description)}</p>
|
||||||
|
<div class="recipe-tags">${tags}</div>
|
||||||
|
<div class="recipe-actions">
|
||||||
|
${variant ? `
|
||||||
|
<button class="btn btn-secondary btn-small view-recipe-btn" data-doc="${variant.doc}">
|
||||||
|
<svg viewBox="0 0 16 16" width="14" height="14" fill="currentColor" aria-hidden="true">
|
||||||
|
<path d="M1 2.75A.75.75 0 0 1 1.75 2h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 2.75zm0 5A.75.75 0 0 1 1.75 7h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 7.75zM1.75 12h12.5a.75.75 0 0 1 0 1.5H1.75a.75.75 0 0 1 0-1.5z"/>
|
||||||
|
</svg>
|
||||||
|
View Recipe
|
||||||
|
</button>
|
||||||
|
${variant.example ? `
|
||||||
|
<button class="btn btn-secondary btn-small view-example-btn" data-example="${variant.example}">
|
||||||
|
<svg viewBox="0 0 16 16" width="14" height="14" fill="currentColor" aria-hidden="true">
|
||||||
|
<path d="M4.72 3.22a.75.75 0 0 1 1.06 0l3.5 3.5a.75.75 0 0 1 0 1.06l-3.5 3.5a.75.75 0 0 1-1.06-1.06L7.69 7.5 4.72 4.28a.75.75 0 0 1 0-1.06zm6.25 1.06L10.22 5l.75.75-2.25 2.25 2.25 2.25-.75.75-.75-.72L11.97 7.5z"/>
|
||||||
|
</svg>
|
||||||
|
View Example
|
||||||
|
</button>
|
||||||
|
` : ''}
|
||||||
|
<a href="https://github.com/github/awesome-copilot/blob/main/${variant.doc}"
|
||||||
|
class="btn btn-secondary btn-small" target="_blank" rel="noopener">
|
||||||
|
<svg viewBox="0 0 16 16" width="14" height="14" fill="currentColor" aria-hidden="true">
|
||||||
|
<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"/>
|
||||||
|
</svg>
|
||||||
|
GitHub
|
||||||
|
</a>
|
||||||
|
` : '<span class="no-variant">Not available for selected language</span>'}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup event listeners for recipe interactions
|
||||||
|
*/
|
||||||
|
function setupRecipeListeners(): void {
|
||||||
|
// View recipe buttons
|
||||||
|
document.querySelectorAll('.view-recipe-btn').forEach(btn => {
|
||||||
|
btn.addEventListener('click', async (e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
const docPath = (btn as HTMLElement).dataset.doc;
|
||||||
|
if (docPath) {
|
||||||
|
await showRecipeContent(docPath, 'recipe');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// View example buttons
|
||||||
|
document.querySelectorAll('.view-example-btn').forEach(btn => {
|
||||||
|
btn.addEventListener('click', async (e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
const examplePath = (btn as HTMLElement).dataset.example;
|
||||||
|
if (examplePath) {
|
||||||
|
await showRecipeContent(examplePath, 'example');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Language tab clicks
|
||||||
|
document.querySelectorAll('.lang-tab').forEach(tab => {
|
||||||
|
tab.addEventListener('click', (e) => {
|
||||||
|
const langId = (tab as HTMLElement).dataset.lang;
|
||||||
|
if (langId) {
|
||||||
|
selectedLanguage = langId;
|
||||||
|
// Update language filter select
|
||||||
|
const languageSelect = document.getElementById('filter-language') as HTMLSelectElement;
|
||||||
|
if (languageSelect) languageSelect.value = langId;
|
||||||
|
renderCookbooks();
|
||||||
|
updateResultsCount();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show recipe/example content in modal
|
||||||
|
*/
|
||||||
|
async function showRecipeContent(filePath: string, type: 'recipe' | 'example'): Promise<void> {
|
||||||
|
// Use existing modal infrastructure
|
||||||
|
const { openFileModal } = await import('../modal');
|
||||||
|
await openFileModal(filePath, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update results count display
|
||||||
|
*/
|
||||||
|
function updateResultsCount(): void {
|
||||||
|
const resultsCount = document.getElementById('results-count');
|
||||||
|
if (!resultsCount || !samplesData) return;
|
||||||
|
|
||||||
|
const filtered = getFilteredRecipes();
|
||||||
|
const total = samplesData.totalRecipes;
|
||||||
|
|
||||||
|
if (filtered.length === total) {
|
||||||
|
resultsCount.textContent = `${total} recipe${total !== 1 ? 's' : ''}`;
|
||||||
|
} else {
|
||||||
|
resultsCount.textContent = `${filtered.length} of ${total} recipe${total !== 1 ? 's' : ''}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Auto-initialize when DOM is ready
|
||||||
|
if (typeof document !== 'undefined') {
|
||||||
|
if (document.readyState === 'loading') {
|
||||||
|
document.addEventListener('DOMContentLoaded', () => initSamplesPage());
|
||||||
|
} else {
|
||||||
|
initSamplesPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user