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:
Aaron Powell
2026-02-02 15:11:12 +11:00
parent 23f08bbb63
commit b8d93a0344
14 changed files with 1699 additions and 67 deletions

View 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"
]
}
}