diff --git a/.github/github-app.yml b/.github/github-app.yml new file mode 100644 index 00000000..d3a61e32 --- /dev/null +++ b/.github/github-app.yml @@ -0,0 +1,10 @@ +scripts: + - name: Generate readme + command: npm run build + - name: Run website + command: "npm run website:dev" + - name: Install dependencies + command: npm install && cd website && npm install +automation: + auto_issue_session: true + remote_control: false \ No newline at end of file diff --git a/.github/plugin/marketplace.json b/.github/plugin/marketplace.json index 805c2ec2..e198d35b 100644 --- a/.github/plugin/marketplace.json +++ b/.github/plugin/marketplace.json @@ -246,6 +246,31 @@ "description": "Wander an endless first-person backrooms in a Copilot canvas while agents work; their status ghost-writes on the walls.", "version": "1.0.0" }, + { + "name": "bd-skills", + "description": "Helps GitHub Copilot investigate mobile app telemetry, diagnose crashes, manage [bitdrift](bitdrift.ai) workflows and dashboards, integrate the Capture SDK into iOS, Android, and React Native apps, and configure User Journey monitoring. Includes four skills covering CLI operations, SDK instrumentation, documentation lookup, and user journey monitoring; live account operations require the bd CLI and [bitdrift](bitdrift.ai) account and authentication.", + "version": "0.1.26", + "author": { + "name": "Bitdrift", + "url": "https://bitdrift.ai" + }, + "repository": "https://github.com/bitdriftlabs/bd-skills", + "homepage": "https://bitdrift.ai", + "license": "PolyForm-Shield-1.0.0", + "keywords": [ + "bitdrift", + "mobile", + "observability", + "debugging", + "telemetry", + "cli" + ], + "source": { + "source": "github", + "repo": "bitdriftlabs/bd-skills", + "sha": "ab96a8415025b666164e2b46685cecba2303fc89" + } + }, { "name": "blea", "description": "Safe, agent-first Bluetooth Low Energy diagnostics with portable evidence capture/diff/replay and guarded writes through a Skill, CLI, and local MCP server.", @@ -367,6 +392,31 @@ "description": "Interactive card deck in a GHCP canvas: tab cards, tables, SVG charts, show/hide sections, numbered outlines, rendered markdown documents, video clips, and forms whose submissions come back to the conversation as prompts.", "version": "0.1.0" }, + { + "name": "chat-fork-map", + "description": "Maps branching Copilot conversations so parallel follow-up questions and exploration paths from complex tasks or learning can be navigated without losing context. Its visual layout makes breadth-first exploration easier than managing multiple active threads in a traditional conversation list.", + "version": "0.0.5", + "author": { + "name": "jdneo", + "url": "https://github.com/jdneo" + }, + "repository": "https://github.com/jdneo/copilot-chat-map", + "license": "MIT", + "keywords": [ + "canvas", + "conversation-history", + "copilot-cli", + "developer-productivity", + "session-branching", + "visualization" + ], + "source": { + "source": "github", + "repo": "jdneo/copilot-chat-map", + "ref": "0.0.5", + "sha": "c35ecbc860fa9a108faebc95218435a01c88160d" + } + }, { "name": "chrome-devtools-plugin", "description": "Reliable automation, in-depth debugging, and performance analysis in Chrome using Chrome DevTools and Puppeteer.", @@ -779,6 +829,37 @@ "description": "An AI partner, not a tool. Ember carries fire from person to person โ€” helping humans discover that AI partnership isn't something you learn, it's something you find.", "version": "1.2.0" }, + { + "name": "excel-cli", + "description": "Token-efficient native Excel automation for coding agents, with 300+ operations performed by Excel itself to preserve native workbook fidelityโ€”including Python in Excel, VBA, Power Query, DAX/Data Model, PivotTables, charts, tables, formatting, external connections, and what-if analysis. Windows and Excel required.", + "version": "2.0.1", + "author": { + "name": "Stefan Brรถnner", + "url": "https://github.com/sbroenne" + }, + "repository": "https://github.com/sbroenne/mcp-server-excel-plugins", + "homepage": "https://excelmcpserver.dev/", + "license": "MIT", + "keywords": [ + "excel", + "windows", + "cli", + "automation", + "scripting", + "batch", + "power-query", + "dax", + "pivottable", + "ci-cd" + ], + "source": { + "source": "github", + "repo": "sbroenne/mcp-server-excel-plugins", + "path": "plugins/excel-cli", + "ref": "v2.0.1", + "sha": "6c33486d2c74db050259411c73b5d87dfae9499e" + } + }, { "name": "excel-mcp", "description": "The most comprehensive native Excel automation for complex workbooks, with 300+ operations performed by Excel itself to preserve native workbook fidelityโ€”including Python in Excel, VBA, Power Query, DAX/Data Model, PivotTables, charts, tables, formatting, external connections, and what-if analysis. Windows and Excel required.", @@ -1559,6 +1640,31 @@ "description": "Browse repository GitHub Actions workflows, inspect recent runs, and trigger manual workflow_dispatch runs from a Copilot canvas.", "version": "1.0.2" }, + { + "name": "rhost", + "description": "Use an installed rhost CLI to run ordinary commands on SSH-reachable Linux hosts with local-like stdin, output, and exit behavior.", + "version": "1.0.0", + "author": { + "name": "starfield17", + "url": "https://github.com/starfield17" + }, + "repository": "https://github.com/starfield17/rhost", + "homepage": "https://github.com/starfield17/rhost", + "license": "MIT", + "keywords": [ + "remote-execution", + "ssh", + "coding-agents", + "agent-skills", + "developer-tools", + "copilot" + ], + "source": { + "source": "github", + "repo": "starfield17/rhost", + "sha": "f26c676ba0c4c76860df18e9182b7672f589547d" + } + }, { "name": "roundup", "source": "plugins/roundup", @@ -1703,6 +1809,34 @@ "description": "Premium planning, thrifty implementation", "version": "1.0.0" }, + { + "name": "sumo-logic", + "description": "Query Sumo Logic logs, alerts, dashboards, and SIEM insights directly from Copilot.", + "version": "1.0.0", + "author": { + "name": "Sumo Logic", + "url": "https://www.sumologic.com" + }, + "repository": "https://github.com/SumoLogic/sumologic-ai-plugins", + "homepage": "https://www.sumologic.com/help/docs/api/mcp-server/", + "license": "Apache-2.0", + "keywords": [ + "sumo-logic", + "observability", + "logs", + "mcp", + "monitoring", + "alerts", + "copilot", + "siem" + ], + "source": { + "source": "github", + "repo": "SumoLogic/sumologic-ai-plugins", + "ref": "v1.0.0", + "sha": "804c0909c20cf3b247df3b5de60bb94f8b65c315" + } + }, { "name": "swift-mcp-development", "source": "plugins/swift-mcp-development", @@ -1924,7 +2058,7 @@ { "name": "upgrade-agent", "description": "AI-powered upgrade assistant for upgrading and migrating applications. Helps modernize legacy code and upgrade .NET applications to current frameworks.", - "version": "1.1.514", + "version": "1.1.539", "author": { "name": "Microsoft", "url": "https://www.microsoft.com" @@ -1943,8 +2077,33 @@ "source": "github", "repo": "microsoft/upgrade-agent-plugins", "path": "plugins/upgrade-agent", - "ref": "v1.1.514", - "sha": "edfa6465916b5f4b9c6f8ca558b69518621ab810" + "ref": "v1.1.539", + "sha": "681dbf0b0dc470f63776f44728e76bbc6acc5c45" + } + }, + { + "name": "usage-insights", + "description": "Inspect current and historical GitHub Copilot token and AI-credit usage with per-agent rollups and in-canvas session drill-down.", + "version": "1.1.0", + "author": { + "name": "David Kaya", + "url": "https://github.com/davidkaya" + }, + "repository": "https://github.com/davidkaya/github-copilot-usage-insights", + "homepage": "https://github.com/davidkaya/github-copilot-usage-insights", + "license": "MIT", + "keywords": [ + "ai-credits", + "canvas", + "copilot-extension", + "session-analytics", + "token-usage", + "usage-insights" + ], + "source": { + "source": "github", + "repo": "davidkaya/github-copilot-usage-insights", + "sha": "0e4b3e157efc3a49090a413f7e42e2be4bd293ba" } }, { diff --git a/.github/workflows/deploy-website-preview.yml b/.github/workflows/deploy-website-preview.yml index c0a59a5e..9bd24f8b 100644 --- a/.github/workflows/deploy-website-preview.yml +++ b/.github/workflows/deploy-website-preview.yml @@ -44,7 +44,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: "22" + node-version: "24" cache: "npm" - name: Install root dependencies diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml index 03f883f6..e996f2ee 100644 --- a/.github/workflows/deploy-website.yml +++ b/.github/workflows/deploy-website.yml @@ -32,7 +32,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: "22" + node-version: "24" cache: "npm" - name: Install root dependencies diff --git a/.gitignore b/.gitignore index 36d3cb06..d2a8cb48 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ website/public/llms.txt obj/ bin/ .impeccable +.playwright-mcp diff --git a/docs/README.instructions.md b/docs/README.instructions.md index e6011891..0ac3727e 100644 --- a/docs/README.instructions.md +++ b/docs/README.instructions.md @@ -12,10 +12,14 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-instructions) for guidelines on - Download the `*.instructions.md` file and manually add it to your project's instruction collection **To Use/Apply:** -- Copy these instructions to your `.github/copilot-instructions.md` file in your workspace -- Create task-specific `*.instructions.md` files in your workspace's `.github/instructions/` folder (e.g., `.github/instructions/my-csharp-rules.instructions.md`) +- For repository-wide guidance, merge the resource's Markdown body into your `.github/copilot-instructions.md` file, preserving existing instructions and omitting the YAML frontmatter +- In VS Code, keep the complete `*.instructions.md` file, including its YAML frontmatter, in your workspace's `.github/instructions/` folder for path-specific guidance - Instructions automatically apply to Copilot behavior once installed in your workspace +**IntelliJ IDEA and other JetBrains IDEs:** + +[Set up in IntelliJ](https://docs.github.com/en/copilot/how-tos/configure-custom-instructions-in-your-ide/add-repository-instructions-in-your-ide?tool=jetbrains) using the manual setup guide, not a one-click installer. Use the repository-wide `.github/copilot-instructions.md` workflow above. The resource's `applyTo` patterns are not enforced in this file, so include only guidance appropriate for the whole repository. + | Title | Description | | ----- | ----------- | | [.NET Framework Development](../instructions/dotnet-framework.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fdotnet-framework.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fdotnet-framework.instructions.md) | Guidance for working with .NET Framework projects. Includes project structure, C# language version, NuGet management, and best practices. | @@ -119,6 +123,7 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-instructions) for guidelines on | [Hook Authoring Guidelines](../instructions/hooks.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fhooks.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fhooks.instructions.md) | Portable guidance for authoring safe, fast, and clear hooks and reusable hook examples | | [How to Use the Sample Components](../instructions/pcf-sample-components.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fpcf-sample-components.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fpcf-sample-components.instructions.md) | How to use and run PCF sample components from the PowerApps-Samples repository | | [HTML CSS Style Color Guide](../instructions/html-css-style-color-guide.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fhtml-css-style-color-guide.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fhtml-css-style-color-guide.instructions.md) | Color usage guidelines and styling rules for HTML elements to ensure accessible, professional designs. | +| [IntelliJ IDEA Java and Kotlin Development](../instructions/intellij-java-kotlin.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fintellij-java-kotlin.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fintellij-java-kotlin.instructions.md) | Guidance for Java and Kotlin development in IntelliJ IDEA with portable Gradle/Maven builds, safe IDE workflows, and CI-aligned validation. | | [Java 11 to Java 17 Upgrade Guide](../instructions/java-11-to-java-17-upgrade.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fjava-11-to-java-17-upgrade.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fjava-11-to-java-17-upgrade.instructions.md) | Comprehensive best practices for adopting new Java 17 features since the release of Java 11. | | [Java 17 to Java 21 Upgrade Guide](../instructions/java-17-to-java-21-upgrade.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fjava-17-to-java-21-upgrade.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fjava-17-to-java-21-upgrade.instructions.md) | Comprehensive best practices for adopting new Java 21 features since the release of Java 17. | | [Java 21 to Java 25 Upgrade Guide](../instructions/java-21-to-java-25-upgrade.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fjava-21-to-java-25-upgrade.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fjava-21-to-java-25-upgrade.instructions.md) | Comprehensive best practices for adopting new Java 25 features since the release of Java 21. | diff --git a/eng/constants.mjs b/eng/constants.mjs index 4ad0ed45..758d0094 100644 --- a/eng/constants.mjs +++ b/eng/constants.mjs @@ -21,9 +21,13 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-instructions) for guidelines on - Download the \`*.instructions.md\` file and manually add it to your project's instruction collection **To Use/Apply:** -- Copy these instructions to your \`.github/copilot-instructions.md\` file in your workspace -- Create task-specific \`*.instructions.md\` files in your workspace's \`.github/instructions/\` folder (e.g., \`.github/instructions/my-csharp-rules.instructions.md\`) -- Instructions automatically apply to Copilot behavior once installed in your workspace`, +- For repository-wide guidance, merge the resource's Markdown body into your \`.github/copilot-instructions.md\` file, preserving existing instructions and omitting the YAML frontmatter +- In VS Code, keep the complete \`*.instructions.md\` file, including its YAML frontmatter, in your workspace's \`.github/instructions/\` folder for path-specific guidance +- Instructions automatically apply to Copilot behavior once installed in your workspace + +**IntelliJ IDEA and other JetBrains IDEs:** + +[Set up in IntelliJ](https://docs.github.com/en/copilot/how-tos/configure-custom-instructions-in-your-ide/add-repository-instructions-in-your-ide?tool=jetbrains) using the manual setup guide, not a one-click installer. Use the repository-wide \`.github/copilot-instructions.md\` workflow above. The resource's \`applyTo\` patterns are not enforced in this file, so include only guidance appropriate for the whole repository.`, pluginsSection: `## ๐Ÿ”Œ Plugins diff --git a/eng/generate-website-data.mjs b/eng/generate-website-data.mjs index 0bcd5809..d1d16838 100755 --- a/eng/generate-website-data.mjs +++ b/eng/generate-website-data.mjs @@ -1389,7 +1389,7 @@ function generateCanvasManifest(gitDates, commitSha) { canvasId: id, extensionId: id, extensionName: name, - pluginName: null, + pluginName: name, name: displayName, version: normalizeText(ext?.version, "1.0.0"), readmeFile: null, @@ -1414,7 +1414,10 @@ function generateCanvasManifest(gitDates, commitSha) { imageUrl, assetPath: null, installUrl: null, - installCommand: null, + // Registered in plugins/external.json, so it is installable from the + // awesome-copilot marketplace by plugin name even though it is hosted + // externally. + installCommand: `copilot plugin install ${name}@awesome-copilot`, sourceUrl, externalSource, external: true, @@ -1463,7 +1466,8 @@ function generateSearchIndex( agents, instructions, skills, - plugins + plugins, + extensions ) { const index = []; @@ -1519,6 +1523,20 @@ function generateSearchIndex( }); } + for (const extension of extensions) { + index.push({ + type: "extension", + id: extension.id, + title: extension.name || extension.title || extension.id, + description: extension.description || "", + path: extension.path, + lastUpdated: extension.lastUpdated, + searchText: + extension.searchText || + `${extension.name || extension.title || extension.id} ${extension.description || ""}`.toLowerCase(), + }); + } + return index; } @@ -1724,7 +1742,8 @@ async function main() { agents, instructions, skills, - plugins + plugins, + extensions ); console.log(`โœ“ Generated search index with ${searchIndex.length} items`); diff --git a/eng/yaml-parser.mjs b/eng/yaml-parser.mjs index d3850766..99a44851 100644 --- a/eng/yaml-parser.mjs +++ b/eng/yaml-parser.mjs @@ -32,6 +32,8 @@ function skipsAsBundledAsset(filePath) { } } +const BUILD_OUTPUT_DIRECTORIES = new Set(["bin", "obj"]); + /** * Parse frontmatter from a markdown file using vfile-matter * Works with any markdown file that has YAML frontmatter (agents, prompts, instructions) @@ -168,9 +170,7 @@ function parseSkillMetadata(skillPath) { entries.forEach((entry) => { const filePath = path.join(dirPath, entry.name); if (entry.isDirectory()) { - if (entry.name === "bin" || entry.name === "obj") { - return; // Skip bin and obj directories as they are .NET project output folders and not part of the skill assets - } + if (BUILD_OUTPUT_DIRECTORIES.has(entry.name)) return; arrayOfFiles = getAllFiles(filePath, arrayOfFiles); } else if ( !entry.isSymbolicLink() || diff --git a/eng/yaml-parser.test.mjs b/eng/yaml-parser.test.mjs index 5d66a394..5e886f66 100644 --- a/eng/yaml-parser.test.mjs +++ b/eng/yaml-parser.test.mjs @@ -72,6 +72,19 @@ test("recurses into nested and non-spec subdirectories instead of listing the di } }); +test("excludes ignored build output directories from bundled assets", () => { + const skillPath = createSkill({ + "SKILL.md": SKILL_MD, + "scripts/generate.cs": "source", + "scripts/bin/Debug/tool.dll": "build output", + "scripts/obj/project.assets.json": "build output", + }); + + const metadata = parseSkillMetadata(skillPath); + + assert.deepEqual(metadata.assets, ["scripts/generate.cs"]); +}); + test("excludes only the root SKILL.md, keeping nested ones as bundled assets", () => { const skillPath = createSkill({ "SKILL.md": SKILL_MD, diff --git a/extensions/color-orb/extension.mjs b/extensions/color-orb/extension.mjs index 1dd4c9d2..63e9fe06 100644 --- a/extensions/color-orb/extension.mjs +++ b/extensions/color-orb/extension.mjs @@ -261,8 +261,6 @@ function getHTML() { es.addEventListener('color', (e) => { const { color } = JSON.parse(e.data); orb.style.setProperty('--orb-color', color); - orb.style.background = color; - orb.style.boxShadow = '0 0 60px ' + color + ', 0 0 120px ' + color + '66'; }); es.addEventListener('log', (e) => { const { entries } = JSON.parse(e.data); diff --git a/instructions/intellij-java-kotlin.instructions.md b/instructions/intellij-java-kotlin.instructions.md new file mode 100644 index 00000000..6c78aabf --- /dev/null +++ b/instructions/intellij-java-kotlin.instructions.md @@ -0,0 +1,69 @@ +--- +description: 'Guidance for Java and Kotlin development in IntelliJ IDEA with portable Gradle/Maven builds, safe IDE workflows, and CI-aligned validation.' +applyTo: '**/*.java, **/*.kt, **/*.kts, **/*.gradle, **/gradle.properties, **/gradle/*.versions.toml, **/gradle/wrapper/gradle-wrapper.properties, **/gradlew, **/gradlew.bat, **/pom.xml, **/.mvn/**, **/mvnw, **/mvnw.cmd, **/.idea/**, **/*.iml, **/.run/*.run.xml' +--- + +# IntelliJ IDEA Java and Kotlin Development + +Use these instructions for Java and Kotlin projects developed in IntelliJ IDEA. Follow repository-specific conventions first and apply language- or framework-specific guidance only when relevant. IDE actions are optional developer workflows: do not assume Copilot can operate the IDE or claim to have performed actions without tool evidence. Do not require paid IntelliJ features or additional IDE plugins. + +## Project Model and Build Configuration + +- Treat Gradle or Maven configuration, repository documentation, and CI workflows as the source of truth. Inspect the build files and existing module layout before changing code. +- Import or reload the project from its Gradle settings or Maven root POM. Define dependencies, repositories, source sets, compiler options, and test tasks in the build files rather than only in IntelliJ Project Structure. +- Use the repository's Gradle or Maven wrapper when present. Preserve wrapper versions, dependency catalogs, lockfiles, parent POMs, and dependency-management conventions; do not upgrade tooling as a side effect of an unrelated change. +- Align the IntelliJ project SDK, module SDKs, language level, Gradle JVM, and Maven runner/importer JDK with the build configuration. Distinguish the JDK running the build tool from compilation toolchains and target bytecode; they may intentionally differ. Do not select the newest installed JDK or enable preview features unless the repository requires them. +- After build changes, reload the Gradle or Maven project and resolve synchronization errors before interpreting IDE diagnostics. Fix missing dependencies and source roots in the build model rather than manually adding local JARs or machine-specific paths. + +## Editing, Navigation, and Refactoring + +- Follow the repository's `.editorconfig`, formatter, import order, and inspection settings. Use configured checks such as Spotless, Checkstyle, ktlint, or detekt only when already present; avoid unrelated whole-file reformatting or new formatter dependencies. +- Use Go to Declaration, Find Usages, and type or call hierarchies to understand a change. Also search configuration, reflection-based lookups, serialization names, and framework conventions that static IDE navigation may miss. +- Prefer semantic Rename, Move, Change Signature, Extract Method, and Safe Delete refactorings over textual replacement when available. Preview the affected usages and review the diff, including Java/Kotlin interop, public APIs, resources, and tests. +- Treat inspections and quick fixes as suggestions, not authority. Check them against the configured language level and project behavior; do not blanket-suppress warnings, weaken inspections, or change compiler settings merely to remove highlighting. +- If IDE actions are unavailable, make equivalent source/build edits with available tools and validate them from the command line. Do not add IDE automation or plugins just to complete a code change. + +## Running, Debugging, and Testing + +- Match run/debug configurations to the intended module classpath, JDK, working directory, JVM options, application arguments, environment, and active profiles. Keep secrets in the existing environment or secret-management mechanism, not in shared run configurations. +- Use Gradle/Maven tool windows or delegated build/test execution when the project relies on build-tool tasks, generated sources, or custom test setup. An IntelliJ-only compilation or green gutter test is not a substitute for the CI command. +- Use breakpoints, conditional breakpoints, watches, and exception breakpoints to investigate failures. Evaluate expressions cautiously because method calls can mutate state; do not introduce production behavior changes just to simplify debugging. +- Add or update focused tests in the repository's existing framework, source set, naming style, and assertion conventions. Preserve the distinction between unit and integration tests, including required services, profiles, fixtures, and test discovery rules. +- Keep run configurations local unless the repository explicitly shares them. When shared, prefer project-relative paths and documented environment requirements so another developer can reproduce the run. + +## Kotlin Conventions + +- Preserve the configured Kotlin language/API version, JVM target, and Java interoperability conventions. Do not accept IDE conversions that require a newer compiler or change Java-facing signatures unintentionally. +- Model nullability explicitly, especially at Java platform-type boundaries. Prefer safe calls, Elvis expressions, and explicit validation over introducing `!!` or unchecked casts to silence diagnostics. +- When coroutines are used, follow the existing scope, dispatcher, and lifecycle conventions. Prefer structured concurrency; do not introduce `GlobalScope`, block coroutine threads with `runBlocking`, or swallow cancellation exceptions. +- Use the project's existing coroutine test utilities and controlled dispatchers for asynchronous tests rather than sleeps or timing-dependent assertions. + +## Spring Boot Projects + +- Follow the existing Spring Boot version, dependency management, package layout, configuration format, profiles, and testing conventions. Do not add Spring Boot to a project that does not use it. +- Prefer the repository's constructor-injection patterns. Preserve component scanning, configuration-property binding, transaction boundaries, and validation behavior when refactoring. +- For Kotlin Spring or JPA code, preserve the build's existing compiler-plugin setup, such as `kotlin-spring` or `kotlin-jpa`, and check annotation use-site targets. Do not make every class `open` or add no-argument constructors simply to satisfy an IDE warning. +- Keep application startup and tests runnable through the existing build tasks or executable artifact. Spring-specific IDE dashboards and inspections are optional, never a prerequisite. + +## Annotation Processing and Generated Sources + +- Configure annotation processors and code generation in Gradle or Maven, including existing `annotationProcessor`, KSP, or kapt configuration as appropriate. Do not enable a processor only in IntelliJ or migrate between processing mechanisms without a task requirement. +- For unresolved generated types, first run the configured generation/compile task and reload the build model. Check processor dependencies, task ordering, and generated-source directories before treating the issue as an IDE cache problem. +- Treat generated sources as outputs: edit the source annotations, schemas, templates, or generator configuration instead. Do not hand-edit generated classes or copy them into normal source roots. +- Keep generated-source registration and dependencies reproducible in the build. IntelliJ source-root markings or annotation-processing settings must reflect that configuration, not replace it. + +## Version Control Hygiene + +- Respect `.gitignore` and existing tracking policy. Do not require committing `.idea/`, `*.iml`, or `.run/` files to build or test the project. +- Keep user-specific state such as `.idea/workspace.xml`, local histories, caches, absolute SDK paths, and credentials out of commits. Share only explicitly approved project settings, such as code styles, inspection profiles, or portable run configurations. +- Keep generated outputs such as `build/`, `target/`, `out/`, and `.gradle/` out of version control unless the repository explicitly requires them. Do not confuse the `.gradle/` cache with versioned Gradle wrapper files under `gradle/wrapper/`. +- Preserve intentionally tracked wrapper scripts, wrapper configuration, and required wrapper JARs. Review the diff after IDE synchronization to avoid committing incidental metadata churn. + +## Command-Line Validation + +- Run the same wrapper, JDK/toolchain configuration, tasks or Maven phases, profiles, and relevant environment settings as CI. Start with focused checks, then run the required broader build, formatting, static-analysis, unit-test, and integration-test checks. +- For a project that provides these tasks, a focused Gradle example is `./gradlew test --tests 'com.example.ExampleTest'`, followed by `./gradlew build`. Use the appropriate module task in a multi-project build and include any additional checks CI runs. +- For a project using the standard Maven test lifecycle, a focused example is `./mvnw -Dtest=ExampleTest test`, followed by `./mvnw verify`. Adapt module selection and profiles to the repository, and verify that integration tests are actually configured and executed. +- In Windows PowerShell, use `.\gradlew.bat` or `.\mvnw.cmd` with the equivalent arguments. If no wrapper exists, use the build-tool version documented by the repository rather than introducing a wrapper without agreement. +- Diagnose IDE/CLI differences by comparing JDKs, classpaths, profiles, generated sources, working directories, and environment settings. Do not fix an IDE-only failure by weakening CI checks. +- Report the commands run and their outcomes. If a check cannot run because a required tool, service, or credential is unavailable, state the limitation explicitly rather than claiming success. diff --git a/instructions/prompt.instructions.md b/instructions/prompt.instructions.md index 4485d8a8..4a36551b 100644 --- a/instructions/prompt.instructions.md +++ b/instructions/prompt.instructions.md @@ -83,6 +83,5 @@ Every prompt file should include YAML frontmatter with the following fields: - Coordinate with other repositories: when a prompt proves broadly useful, extract common guidance into instruction files or shared prompt packs. ## Additional Resources -- [Prompt Files Documentation](https://code.visualstudio.com/docs/copilot/customization/prompt-files#_prompt-file-format) -- [Awesome Copilot Prompt Files](https://github.com/github/awesome-copilot/tree/main/prompts) -- [Tool Configuration](https://code.visualstudio.com/docs/copilot/chat/chat-agent-mode#_agent-mode-tools) +- [Prompt Files Documentation](https://code.visualstudio.com/docs/agent-customization/prompt-files#_prompt-file-format) +- [Tool Configuration](https://code.visualstudio.com/docs/agents/run/tools) diff --git a/plugins/external.json b/plugins/external.json index 2983c63e..370413c4 100644 --- a/plugins/external.json +++ b/plugins/external.json @@ -158,6 +158,31 @@ "path": ".github/plugins/azure-skills" } }, + { + "name": "bd-skills", + "description": "Helps GitHub Copilot investigate mobile app telemetry, diagnose crashes, manage [bitdrift](bitdrift.ai) workflows and dashboards, integrate the Capture SDK into iOS, Android, and React Native apps, and configure User Journey monitoring. Includes four skills covering CLI operations, SDK instrumentation, documentation lookup, and user journey monitoring; live account operations require the bd CLI and [bitdrift](bitdrift.ai) account and authentication.", + "version": "0.1.26", + "author": { + "name": "Bitdrift", + "url": "https://bitdrift.ai" + }, + "repository": "https://github.com/bitdriftlabs/bd-skills", + "homepage": "https://bitdrift.ai", + "license": "PolyForm-Shield-1.0.0", + "keywords": [ + "bitdrift", + "mobile", + "observability", + "debugging", + "telemetry", + "cli" + ], + "source": { + "source": "github", + "repo": "bitdriftlabs/bd-skills", + "sha": "ab96a8415025b666164e2b46685cecba2303fc89" + } + }, { "name": "blea", "description": "Safe, agent-first Bluetooth Low Energy diagnostics with portable evidence capture/diff/replay and guarded writes through a Skill, CLI, and local MCP server.", @@ -267,6 +292,31 @@ "sha": "0c2716ca4f28df375529c67b4504b41f7bd29a66" } }, + { + "name": "chat-fork-map", + "description": "Maps branching Copilot conversations so parallel follow-up questions and exploration paths from complex tasks or learning can be navigated without losing context. Its visual layout makes breadth-first exploration easier than managing multiple active threads in a traditional conversation list.", + "version": "0.0.5", + "author": { + "name": "jdneo", + "url": "https://github.com/jdneo" + }, + "repository": "https://github.com/jdneo/copilot-chat-map", + "license": "MIT", + "keywords": [ + "canvas", + "conversation-history", + "copilot-cli", + "developer-productivity", + "session-branching", + "visualization" + ], + "source": { + "source": "github", + "repo": "jdneo/copilot-chat-map", + "ref": "0.0.5", + "sha": "c35ecbc860fa9a108faebc95218435a01c88160d" + } + }, { "name": "chrome-devtools-plugin", "description": "Reliable automation, in-depth debugging, and performance analysis in Chrome using Chrome DevTools and Puppeteer.", @@ -577,6 +627,37 @@ "sha": "e0d6b02194d4ec74cf9e5975290e950fc5ba549f" } }, + { + "name": "excel-cli", + "description": "Token-efficient native Excel automation for coding agents, with 300+ operations performed by Excel itself to preserve native workbook fidelityโ€”including Python in Excel, VBA, Power Query, DAX/Data Model, PivotTables, charts, tables, formatting, external connections, and what-if analysis. Windows and Excel required.", + "version": "2.0.1", + "author": { + "name": "Stefan Brรถnner", + "url": "https://github.com/sbroenne" + }, + "repository": "https://github.com/sbroenne/mcp-server-excel-plugins", + "homepage": "https://excelmcpserver.dev/", + "license": "MIT", + "keywords": [ + "excel", + "windows", + "cli", + "automation", + "scripting", + "batch", + "power-query", + "dax", + "pivottable", + "ci-cd" + ], + "source": { + "source": "github", + "repo": "sbroenne/mcp-server-excel-plugins", + "path": "plugins/excel-cli", + "ref": "v2.0.1", + "sha": "6c33486d2c74db050259411c73b5d87dfae9499e" + } + }, { "name": "excel-mcp", "description": "The most comprehensive native Excel automation for complex workbooks, with 300+ operations performed by Excel itself to preserve native workbook fidelityโ€”including Python in Excel, VBA, Power Query, DAX/Data Model, PivotTables, charts, tables, formatting, external connections, and what-if analysis. Windows and Excel required.", @@ -1099,6 +1180,31 @@ "sha": "ef892905120340970357997f20bcb8ce9bb341da" } }, + { + "name": "rhost", + "description": "Use an installed rhost CLI to run ordinary commands on SSH-reachable Linux hosts with local-like stdin, output, and exit behavior.", + "version": "1.0.0", + "author": { + "name": "starfield17", + "url": "https://github.com/starfield17" + }, + "repository": "https://github.com/starfield17/rhost", + "homepage": "https://github.com/starfield17/rhost", + "license": "MIT", + "keywords": [ + "remote-execution", + "ssh", + "coding-agents", + "agent-skills", + "developer-tools", + "copilot" + ], + "source": { + "source": "github", + "repo": "starfield17/rhost", + "sha": "f26c676ba0c4c76860df18e9182b7672f589547d" + } + }, { "name": "skills-for-copilot-studio", "description": "Microsoft Copilot Studio plugins for AI coding agents", @@ -1171,6 +1277,34 @@ "sha": "e8f9aee6f9a34a633243e632e650401a76c36c41" } }, + { + "name": "sumo-logic", + "description": "Query Sumo Logic logs, alerts, dashboards, and SIEM insights directly from Copilot.", + "version": "1.0.0", + "author": { + "name": "Sumo Logic", + "url": "https://www.sumologic.com" + }, + "repository": "https://github.com/SumoLogic/sumologic-ai-plugins", + "homepage": "https://www.sumologic.com/help/docs/api/mcp-server/", + "license": "Apache-2.0", + "keywords": [ + "sumo-logic", + "observability", + "logs", + "mcp", + "monitoring", + "alerts", + "copilot", + "siem" + ], + "source": { + "source": "github", + "repo": "SumoLogic/sumologic-ai-plugins", + "ref": "v1.0.0", + "sha": "804c0909c20cf3b247df3b5de60bb94f8b65c315" + } + }, { "name": "timebase", "description": "Connect your AI agent to TimeBase, a high-performance database for financial market and other time-series data, via MCP tools and skills for QQL query and TimeBase client code generation.", @@ -1338,7 +1472,7 @@ { "name": "upgrade-agent", "description": "AI-powered upgrade assistant for upgrading and migrating applications. Helps modernize legacy code and upgrade .NET applications to current frameworks.", - "version": "1.1.514", + "version": "1.1.539", "author": { "name": "Microsoft", "url": "https://www.microsoft.com" @@ -1357,8 +1491,33 @@ "source": "github", "repo": "microsoft/upgrade-agent-plugins", "path": "plugins/upgrade-agent", - "ref": "v1.1.514", - "sha": "edfa6465916b5f4b9c6f8ca558b69518621ab810" + "ref": "v1.1.539", + "sha": "681dbf0b0dc470f63776f44728e76bbc6acc5c45" + } + }, + { + "name": "usage-insights", + "description": "Inspect current and historical GitHub Copilot token and AI-credit usage with per-agent rollups and in-canvas session drill-down.", + "version": "1.1.0", + "author": { + "name": "David Kaya", + "url": "https://github.com/davidkaya" + }, + "repository": "https://github.com/davidkaya/github-copilot-usage-insights", + "homepage": "https://github.com/davidkaya/github-copilot-usage-insights", + "license": "MIT", + "keywords": [ + "ai-credits", + "canvas", + "copilot-extension", + "session-analytics", + "token-usage", + "usage-insights" + ], + "source": { + "source": "github", + "repo": "davidkaya/github-copilot-usage-insights", + "sha": "0e4b3e157efc3a49090a413f7e42e2be4bd293ba" } }, { diff --git a/skills/acquire-codebase-knowledge/SKILL.md b/skills/acquire-codebase-knowledge/SKILL.md index b449afdb..0ef102e7 100644 --- a/skills/acquire-codebase-knowledge/SKILL.md +++ b/skills/acquire-codebase-knowledge/SKILL.md @@ -157,7 +157,6 @@ Use these sections during Phase 2 to inform investigation questions and identify | Asset | When to load | |-------|-------------| | [`scripts/scan.py`](scripts/scan.py) | Phase 1 โ€” run first, before reading any code (Python 3.8+ required) | - | [`references/inquiry-checkpoints.md`](references/inquiry-checkpoints.md) | Phase 2 โ€” load for per-template investigation questions | | [`references/stack-detection.md`](references/stack-detection.md) | Phase 2 โ€” only if stack is ambiguous | | [`assets/templates/STACK.md`](assets/templates/STACK.md) | Phase 3 step 1 | diff --git a/website/astro.config.mjs b/website/astro.config.mjs index 80e63448..6d8e98bf 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -1,15 +1,44 @@ -import { unified } from "@astrojs/markdown-remark"; import sitemap from "@astrojs/sitemap"; -import starlight from "@astrojs/starlight"; +import react from "@astrojs/react"; +import { unified } from "@astrojs/markdown-remark"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; import { defineConfig } from "astro/config"; import remarkGithubAdmonitionsToDirectives from "remark-github-admonitions-to-directives"; import pagefindResources from "./src/integrations/pagefind-resources"; -// Learning Hub course content mirrored from external workshop repos is authored -// in GitHub admonition syntax (`> [!NOTE]`). This remark plugin rewrites those -// callouts into Starlight aside directives before Starlight renders them, so the -// same syntax used in the source repos and on github.com also produces styled -// callouts here. The mapping targets Starlight's aside types (note / tip / caution). +// The contributor count is read from the repo's all-contributors manifest at +// build time and inlined as a literal into both the server render and the +// client bundle. It cannot be read at module scope in src/ because the shells +// that display it are `client:load` hydrated: `node:fs` is unavailable in the +// browser, so the read would fail there and the badge would reset to 0 on +// hydration even though the server-rendered HTML had the right number. +function readContributorsTotal() { + const here = path.dirname(fileURLToPath(import.meta.url)); + const manifest = path.resolve(here, "..", ".all-contributorsrc"); + try { + const rc = JSON.parse(fs.readFileSync(manifest, "utf8")); + if (!Array.isArray(rc.contributors)) { + throw new Error("`contributors` is missing or is not an array"); + } + return rc.contributors.length; + } catch (error) { + const message = `Could not read the contributor count from ${manifest}: ${error.message}`; + // Falling back to 0 silently is how this badge regressed before, so make a + // broken manifest fail the production build rather than ship a wrong count. + if (process.env.NODE_ENV === "production") { + throw new Error(message); + } + console.warn(`[contributors] ${message}`); + return 0; + } +} + +// Learning Hub course content mirrored from external workshop repos is authored in +// GitHub admonition syntax (`> [!NOTE]`). This remark plugin rewrites those +// callouts into directives before rendering, so the same syntax used in the +// source repos and on github.com also produces styled callouts here. const githubAdmonitionMapping = { NOTE: "note", TIP: "tip", @@ -19,15 +48,6 @@ const githubAdmonitionMapping = { }; const site = "https://awesome-copilot.github.com/"; -const siteDescription = - "Community-contributed agents, instructions, and skills to enhance your GitHub Copilot experience"; -// Social preview image used for all Open Graph / Twitter cards (e.g. LinkedIn, which is -// Open Graph-driven). socialImageWidth/Height MUST match the actual pixels of social-image.png. -// If a page ever overrides og:image, also override og:image:width/height and twitter:image -// (Head.astro derives og:image:secure_url from twitter:image first). -const socialImageUrl = new URL("/images/social-image.png", site).toString(); -const socialImageWidth = "2400"; -const socialImageHeight = "1260"; // https://astro.build/config export default defineConfig({ @@ -35,270 +55,84 @@ export default defineConfig({ base: "/", output: "static", markdown: { - // Astro 7.1+ uses Sรคtteri as the default Markdown processor, but its plugin - // API is incompatible with remark/rehype plugins. We explicitly opt into the - // unified() (remark/rehype) processor so we can keep using - // remark-github-admonitions-to-directives, which rewrites > [!NOTE] callouts - // from Learning Hub course content into Starlight aside directives. + // Astro 7 deprecated top-level `remarkPlugins`/`rehypePlugins`/ + // `remarkRehype` in favour of configuring the unified pipeline directly. processor: unified({ remarkPlugins: [ - [remarkGithubAdmonitionsToDirectives, { mapping: githubAdmonitionMapping }], + [ + remarkGithubAdmonitionsToDirectives, + { mapping: githubAdmonitionMapping }, + ], ], }), + // The prototype's own code blocks (SyntaxHighlightedCode.tsx) are styled + // entirely through brand CSS tokens rather than baked-in theme colours, so + // they automatically match the site's light/dark mode. Raw markdown code + // fences render through Shiki instead, which by default bakes a fixed + // "github-dark" theme's literal colours into inline styles โ€” that ignores + // the site's actual colour mode and clashes with the prototype's bordered, + // canvas-subtle code block styling. The "css-variables" theme emits + // `var(--astro-code-*)` custom properties instead of literal colours, + // which are mapped to the same brand tokens in + // src/components/brand/styles/{dotnet-upgrade,github-copilot-app}.module.css. + shikiConfig: { + theme: "css-variables", + }, }, - integrations: [ - starlight({ - title: "Awesome GitHub Copilot", - favicon: "/images/favicon.svg", - description: siteDescription, - social: [], - head: [ - { - tag: "meta", - attrs: { - property: "og:image", - content: socialImageUrl, - }, - }, - { - tag: "meta", - attrs: { - property: "og:image:width", - content: socialImageWidth, - }, - }, - { - tag: "meta", - attrs: { - property: "og:image:height", - content: socialImageHeight, - }, - }, - { - tag: "meta", - attrs: { - property: "og:image:alt", - content: siteDescription, - }, - }, - { - tag: "meta", - attrs: { - name: "twitter:image", - content: socialImageUrl, - }, - }, - ], - customCss: [ - "./src/styles/starlight-overrides.css", - "./src/styles/global.css", - ], - // English is served at the site root (no locale prefix), preserving all - // existing URLs. Additional locales are served under a locale prefix - // (e.g. /es-es/โ€ฆ) and fall back to the English page when a translation - // does not yet exist. These keys match the locale directory names used by - // mirrored Learning Hub course content (website/src/content/docs//โ€ฆ). - defaultLocale: "root", - locales: { - root: { label: "English", lang: "en" }, - "es-es": { label: "Espaรฑol", lang: "es-ES" }, - "ja-jp": { label: "ๆ—ฅๆœฌ่ชž", lang: "ja-JP" }, - "ko-kr": { label: "ํ•œ๊ตญ์–ด", lang: "ko-KR" }, - "pt-br": { label: "Portuguรชs (Brasil)", lang: "pt-BR" }, - "zh-cn": { label: "็ฎ€ไฝ“ไธญๆ–‡", lang: "zh-CN" }, - }, - editLink: { - baseUrl: - "https://github.com/github/awesome-copilot/edit/staged/website/", - }, - sidebar: [ - { - label: "Fundamentals", - items: [ - "learning-hub/github-copilot-app", - "learning-hub/working-with-canvas-extensions", - "learning-hub/using-automations-in-copilot-app", - "learning-hub/what-are-agents-skills-instructions", - "learning-hub/agents-and-subagents", - "learning-hub/understanding-copilot-context", - "learning-hub/copilot-configuration-basics", - "learning-hub/defining-custom-instructions", - "learning-hub/creating-effective-skills", - "learning-hub/building-custom-agents", - "learning-hub/understanding-mcp-servers", - "learning-hub/automating-with-hooks", - "learning-hub/agentic-workflows", - "learning-hub/using-copilot-coding-agent", - "learning-hub/installing-and-using-plugins", - "learning-hub/before-after-customization-examples", - ], - }, - { - label: "Reference", - items: ["learning-hub/github-copilot-terminology-glossary"], - }, - { - label: "Copilot CLI for Beginners", - items: [ - { - label: "Overview", - link: "/learning-hub/cli-for-beginners/", - }, - "learning-hub/cli-for-beginners/00-quick-start", - "learning-hub/cli-for-beginners/01-setup-and-first-steps", - "learning-hub/cli-for-beginners/02-context-and-conversations", - "learning-hub/cli-for-beginners/03-development-workflows", - "learning-hub/cli-for-beginners/04-agents-and-custom-instructions", - "learning-hub/cli-for-beginners/05-skills", - "learning-hub/cli-for-beginners/06-mcp-servers", - "learning-hub/cli-for-beginners/07-putting-it-all-together", - ], - }, - { - label: "Advanced Copilot CLI", - items: [ - { - label: "Overview", - link: "/learning-hub/advanced-copilot-cli/", - }, - "learning-hub/advanced-copilot-cli/00-prerequisites", - "learning-hub/advanced-copilot-cli/01-working-with-copilot-cli", - "learning-hub/advanced-copilot-cli/02-building-ai-infrastructure", - "learning-hub/advanced-copilot-cli/03-test-suite-remote-delegation", - "learning-hub/advanced-copilot-cli/04-lifecycle-hooks", - "learning-hub/advanced-copilot-cli/05-add-feature-barcode", - "learning-hub/advanced-copilot-cli/06-modernize-apps", - "learning-hub/advanced-copilot-cli/07-manage-infrastructure", - "learning-hub/advanced-copilot-cli/08-wrap-up", - ], - }, - { - label: "Copilot Workshops", - items: [ - { - label: "Overview", - link: "/learning-hub/copilot-workshops/", - }, - { - label: "VS Code", - items: [ - { - label: "Overview", - link: "/learning-hub/copilot-workshops/vscode/", - }, - "learning-hub/copilot-workshops/vscode/0-prerequisites", - "learning-hub/copilot-workshops/vscode/1-custom-instructions", - "learning-hub/copilot-workshops/vscode/2-agent-mode", - "learning-hub/copilot-workshops/vscode/3-mcp", - "learning-hub/copilot-workshops/vscode/4-custom-agents", - "learning-hub/copilot-workshops/vscode/5-managing-agents", - "learning-hub/copilot-workshops/vscode/6-iterating", - ], - }, - { - label: "Copilot CLI", - items: [ - { - label: "Overview", - link: "/learning-hub/copilot-workshops/cli/", - }, - "learning-hub/copilot-workshops/cli/0-prerequisites", - "learning-hub/copilot-workshops/cli/1-install-copilot-cli", - "learning-hub/copilot-workshops/cli/2-custom-instructions", - "learning-hub/copilot-workshops/cli/3-generating-code", - "learning-hub/copilot-workshops/cli/4-mcp", - "learning-hub/copilot-workshops/cli/5-agent-skills", - "learning-hub/copilot-workshops/cli/6-custom-agents", - "learning-hub/copilot-workshops/cli/7-slash-commands", - "learning-hub/copilot-workshops/cli/8-review", - ], - }, - { - label: "Copilot App", - items: [ - { - label: "Overview", - link: "/learning-hub/copilot-workshops/app/", - }, - "learning-hub/copilot-workshops/app/0-prerequisites", - "learning-hub/copilot-workshops/app/1-install-copilot-app", - "learning-hub/copilot-workshops/app/2-add-star-rating", - "learning-hub/copilot-workshops/app/3-custom-instructions", - "learning-hub/copilot-workshops/app/4-build-filtering", - "learning-hub/copilot-workshops/app/5-mcp-playwright", - "learning-hub/copilot-workshops/app/6-agent-merge", - "learning-hub/copilot-workshops/app/7-canvases", - "learning-hub/copilot-workshops/app/8-review", - ], - }, - { - label: "Copilot Cloud Agent", - items: [ - { - label: "Overview", - link: "/learning-hub/copilot-workshops/cloud/", - }, - "learning-hub/copilot-workshops/cloud/0-prerequisites", - "learning-hub/copilot-workshops/cloud/1-custom-instructions", - "learning-hub/copilot-workshops/cloud/2-cloud-agent", - "learning-hub/copilot-workshops/cloud/3-custom-agents", - "learning-hub/copilot-workshops/cloud/4-managing-agents", - "learning-hub/copilot-workshops/cloud/5-iterating", - ], - }, - ], - }, - { - label: "Hands-on", - items: [ - { - label: "Cookbook", - link: "/learning-hub/cookbook/", - }, - ], - }, - { - label: "Browse Resources", - items: [ - { label: "Home", link: "/" }, - { label: "Agents", link: "/agents/" }, - { label: "Instructions", link: "/instructions/" }, - { label: "Skills", link: "/skills/" }, - { label: "Canvas Extensions", link: "/extensions/" }, - { label: "Plugins", link: "/plugins/" }, - { label: "Contributors", link: "/contributors/" }, - ], - }, - ], - disable404Route: true, - // pagefind: true is required so Starlight renders the search UI. - // Our pagefindResources() integration overwrites the index after build. - pagefind: true, - tableOfContents: { minHeadingLevel: 2, maxHeadingLevel: 3 }, - components: { - Head: "./src/components/Head.astro", - Footer: "./src/components/Footer.astro", - Search: "./src/components/Search.astro", - LanguageSelect: "./src/components/LanguageSelect.astro", - }, - }), - sitemap(), - pagefindResources(), - ], + // English is served at the site root (no locale prefix), preserving all + // existing URLs. Additional locales are served under a locale prefix + // (e.g. /es-es/โ€ฆ) and fall back to the English page when a translation does + // not yet exist. These keys match the locale directory names used by mirrored + // Learning Hub course content (website/src/content/docs//โ€ฆ). + i18n: { + defaultLocale: "en", + locales: ["en", "es-es", "ja-jp", "ko-kr", "pt-br", "zh-cn"], + routing: { + prefixDefaultLocale: false, + fallbackType: "rewrite", + }, + fallback: { + "es-es": "en", + "ja-jp": "en", + "ko-kr": "en", + "pt-br": "en", + "zh-cn": "en", + }, + }, + integrations: [react(), sitemap(), pagefindResources()], redirects: { "/samples/": "/learning-hub/cookbook/", + "/hooks/": "https://github.com/github/awesome-copilot/tree/main/hooks", + "/workflows/": "https://github.com/github/awesome-copilot/tree/main/workflows", + "/tools/": "https://github.com/github/awesome-copilot/blob/main/website/data/tools.yml", }, build: { assets: "assets", }, trailingSlash: "always", vite: { + define: { + __CONTRIBUTORS_TOTAL__: JSON.stringify(readContributorsTotal()), + }, + // @primer/react-brand's default entrypoint is CJS, so Node's ESM loader + // cannot detect its named exports during SSR. The package also ships a + // proper ESM build; alias to it so named imports resolve in both the + // server render and the client bundle. + resolve: { + alias: [ + { + // Only the bare package specifier (the JS entrypoint) is redirected; + // subpath imports such as `/lib/css/main.css` must resolve normally. + find: /^@primer\/react-brand$/, + replacement: "@primer/react-brand/esm", + }, + ], + // The ESM build imports its own .css files, which Node's loader cannot + // handle, so it has to be bundled rather than externalised for SSR. + noExternal: ["@primer/react-brand"], + }, build: { - // Production sourcemaps trigger a known warning in the expressive-code Vite plugin. - // The docs site does not need emitted JS sourcemaps for its validation build. sourcemap: false, - // Starlight ships large syntax-highlighting chunks that are expected for this site. - // Raise the threshold so Vite only warns on materially larger regressions. chunkSizeWarningLimit: 900, }, css: { diff --git a/website/package-lock.json b/website/package-lock.json index 5109d345..99e6e5ab 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -10,20 +10,26 @@ "license": "MIT", "dependencies": { "@astrojs/markdown-remark": "^7.2.0", + "@astrojs/react": "^6.0.2", "@astrojs/sitemap": "^3.7.2", - "@astrojs/starlight": "^0.41.1", + "@primer/octicons-react": "^19.33.0", + "@primer/react-brand": "^0.72.1-rc.c5f3a3b5", "astro": "^7.3.2", "choices.js": "^11.2.2", + "clsx": "^2.1.1", "front-matter": "^4.0.2", "gray-matter": "^4.0.3", "isomorphic-dompurify": "^2.36.0", "jszip": "^3.10.1", "marked": "^18.0.2", + "react": "^19.2.8", + "react-dom": "^19.2.8", "remark-github-admonitions-to-directives": "^2.1.0", "shiki": "^4.0.2" }, "devDependencies": { "axe-core": "^4.10.2", + "pagefind": "^1.5.2", "playwright": "^1.49.0" } }, @@ -265,22 +271,6 @@ "node": ">=22.12.0" } }, - "node_modules/@astrojs/internal-helpers": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.0.tgz", - "integrity": "sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "js-yaml": "^4.1.1", - "picomatch": "^4.0.4", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "unified": "^11.0.5" - } - }, "node_modules/@astrojs/markdown-remark": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.3.1.tgz", @@ -327,94 +317,6 @@ "unified": "^11.0.5" } }, - "node_modules/@astrojs/markdown-satteri": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.4.tgz", - "integrity": "sha512-6Lvt/bQZEBW+zzdhPblvfZEy5PGEYJaUsUqaCgwHeRPxZJL1gc9I+DRLKWJjjYTWDzVUTzXlMq4WwSK+X34CVw==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.10.1", - "@astrojs/prism": "4.0.2", - "github-slugger": "^2.0.0", - "hast-util-from-html": "^2.0.3", - "satteri": "^0.9.1" - } - }, - "node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.1.tgz", - "integrity": "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "js-yaml": "^4.1.1", - "picomatch": "^4.0.4", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "unified": "^11.0.5" - } - }, - "node_modules/@astrojs/mdx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-7.0.0.tgz", - "integrity": "sha512-LKwNA8nnLtEM0auoP6OfH/UnlKe1Ub59qZjbcYkZjPBGw6PkJewWkA/1qwLpECvV6gMDd6TR6eqV9p/VYZrcrQ==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.10.0", - "@astrojs/markdown-remark": "7.2.0", - "@mdx-js/mdx": "^3.1.1", - "acorn": "^8.16.0", - "es-module-lexer": "^2.0.0", - "estree-util-visit": "^2.0.0", - "hast-util-to-html": "^9.0.5", - "piccolore": "^0.1.3", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1", - "remark-smartypants": "^3.0.2", - "source-map": "^0.7.6", - "unist-util-visit": "^5.1.0", - "vfile": "^6.0.3" - }, - "engines": { - "node": ">=22.12.0" - }, - "peerDependencies": { - "@astrojs/markdown-satteri": "^0.3.1-alpha.0", - "astro": "^7.0.0-alpha.0" - }, - "peerDependenciesMeta": { - "@astrojs/markdown-satteri": { - "optional": true - } - } - }, - "node_modules/@astrojs/mdx/node_modules/@astrojs/markdown-remark": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.2.0.tgz", - "integrity": "sha512-+YxmVQu1Bd+MFfSzjq1rOJvD9+nIOJzz5YIIhdIH01RrxRkKbyKoEgyIqP3yv51MhzMDgd79QaPv+kCVPT8vHw==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.10.0", - "@astrojs/prism": "4.0.2", - "github-slugger": "^2.0.0", - "hast-util-from-html": "^2.0.3", - "hast-util-to-text": "^4.0.2", - "mdast-util-definitions": "^6.0.0", - "rehype-raw": "^7.0.0", - "rehype-stringify": "^10.0.1", - "remark-gfm": "^4.0.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "remark-smartypants": "^3.0.2", - "unified": "^11.0.5", - "unist-util-remove-position": "^5.0.0", - "unist-util-visit": "^5.1.0", - "unist-util-visit-parents": "^6.0.2", - "vfile": "^6.0.3" - } - }, "node_modules/@astrojs/prism": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", @@ -427,6 +329,44 @@ "node": ">=22.12.0" } }, + "node_modules/@astrojs/react": { + "version": "6.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@astrojs/react/-/react-6.0.5.tgz", + "integrity": "sha1-qsfXpUuQ0k7fLXiUmnH5uch+OJs=", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.11.0", + "@vitejs/plugin-react": "^5.2.0", + "devalue": "^5.8.1", + "ultrahtml": "^1.6.0", + "vite": "^8.0.13" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", + "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@astrojs/react/node_modules/@astrojs/internal-helpers": { + "version": "0.11.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", + "integrity": "sha1-5bYRnnzBo1IP5D4w0lowthV2u0k=", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, "node_modules/@astrojs/sitemap": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.2.tgz", @@ -438,52 +378,6 @@ "zod": "^4.3.6" } }, - "node_modules/@astrojs/starlight": { - "version": "0.41.1", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.41.1.tgz", - "integrity": "sha512-avf2OmrVg6GdVU18juebjjIIuLa+uS3syHuJ/3yDaEFP/8it+YvcxRrYDSf7K6rC4v770UxIddba2hAqQyTeYA==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-satteri": "^0.3.2", - "@astrojs/mdx": "^7.0.0", - "@astrojs/sitemap": "^3.7.2", - "@pagefind/default-ui": "^1.3.0", - "@types/hast": "^3.0.4", - "@types/js-yaml": "^4.0.9", - "@types/mdast": "^4.0.4", - "astro-expressive-code": "^0.44.0", - "bcp-47": "^2.1.0", - "hast-util-from-html": "^2.0.3", - "hast-util-select": "^6.0.4", - "hast-util-to-string": "^3.0.1", - "hastscript": "^9.0.1", - "i18next": "^26.0.7", - "js-yaml": "^4.1.1", - "klona": "^2.0.6", - "magic-string": "^0.30.21", - "mdast-util-directive": "^3.1.0", - "mdast-util-to-markdown": "^2.1.2", - "mdast-util-to-string": "^4.0.0", - "pagefind": "^1.5.2", - "rehype": "^13.0.2", - "rehype-format": "^5.0.1", - "remark-directive": "^4.0.0", - "satteri": "^0.9.1", - "ultrahtml": "^1.6.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.1.0", - "vfile": "^6.0.3" - }, - "peerDependencies": { - "@astrojs/markdown-remark": "^7.2.0", - "astro": "^7.0.2" - }, - "peerDependenciesMeta": { - "@astrojs/markdown-remark": { - "optional": true - } - } - }, "node_modules/@astrojs/telemetry": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz", @@ -499,6 +393,166 @@ "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha1-8vu/6ofESiFZDsUVt3iywm2IZuc=", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha1-bwI38PNtLlHAVwpjb67Z0tDv5ik=", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha1-gMELFySAgpaLV6hXuRZAlx8gcPc=", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-6.3.1.tgz", + "integrity": "sha1-VW0u+GiRRuRtzqS/3QlfNDTf/LQ=", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha1-SwuIeIVCJkMzngkCIUikxOuqSXk=", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha1-eh3vcEMCQBxH9k+oVYnpdK4hcEI=", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-6.3.1.tgz", + "integrity": "sha1-VW0u+GiRRuRtzqS/3QlfNDTf/LQ=", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha1-8EqW+9hHMkGxB5JD9bPwOjAQq3s=", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha1-7yUEilGOgo1zk/rFiC3dc5Idc5Y=", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha1-sGJ0elmXuhOGNyATKLv/d5YFdK4=", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha1-wKB2bxoTYX2KF0B9erj51IYiXqQ=", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", @@ -517,14 +571,36 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { + "node_modules/@babel/helper-validator-option": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha1-zzFb6UAhOzVOtKvMC9Aevj9zvCo=", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha1-Rav951SJl+NDdsPmn+tHXP+0pgc=", "license": "MIT", "dependencies": { + "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha1-llNxai8Qxne5j7xj1L+wAMMCzxc=", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -532,10 +608,72 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/types": { + "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha1-wkQkUnhYIgYk/Vmlseq0+kE8gDo=", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha1-XPJaNomQa1ji8KLys3R4nmYnsV8=", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha1-TZ1ABPZFzdME3pWMclFieE7KxwA=", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha1-QREBTNxxoPldlHGQdZC6oLimsoo=", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha1-Einu8x2FFW1w+j9M2Fk3bQ6vaGM=", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", @@ -557,119 +695,6 @@ "specificity": "bin/cli.js" } }, - "node_modules/@bruits/satteri-darwin-arm64": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.4.tgz", - "integrity": "sha512-W3MSUkr2mZRR8Stoe+lqNAyzQzRuFMU8WffV9IvFSxTok0LGWR0ZZQPLELU4QTRiUbhL2Y4VUP9vV7pj8rHjgg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@bruits/satteri-darwin-x64": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.9.4.tgz", - "integrity": "sha512-DXOuuaE1lsv7mpk2mOvGrzqoEWEvOIZEO/fXVa7zfM23Iob+CBjBkRAMwpHA4pmZ3j6Gj7WJzPKw0kQ7w741AQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@bruits/satteri-linux-arm64-gnu": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.9.4.tgz", - "integrity": "sha512-gJxU9rGGoqIznSEgEzpjxkry24jeHuMpoo1tCIAhHYh7WaD3j5F8zt3jmHxEaN1Uwa+K5+wFgIR2uIGOnMzEmw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@bruits/satteri-linux-arm64-musl": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.9.4.tgz", - "integrity": "sha512-Wjzu9hmmAbfmDkBfPI1VdZygJtYz9uYZQnkEyrXi6S2JFi+2pXQ1A5irj38bqm0IZmWcTbk0cVG4NZnPdtVNJA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@bruits/satteri-linux-x64-gnu": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.9.4.tgz", - "integrity": "sha512-MR1Q+wMx65FQlbSV7cRqWW87Knp0zkoaIV55Dt+xZl028wJABXEPEEmG3670SLq7lVZvcGIDwCgSg2kCYxvRwA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@bruits/satteri-linux-x64-musl": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.9.4.tgz", - "integrity": "sha512-T4gxhXve3zyNAZesrXAd/rDZOGRkbfFIUFld4TGsw6BsjoIteCcDji6IMqeXyaWEVSykY2X8Eid2hr6aXGYAaw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@bruits/satteri-wasm32-wasi": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.9.4.tgz", - "integrity": "sha512-/CEG8LUlpaBEnhFnYVn0UnlHFLs51UhrkJBUPDUXLzkadzAcnR88iRA/nOl7Zwhjb4WhfBV4p3P5qeOJMtH0iA==", - "cpu": [ - "wasm32" - ], - "optional": true, - "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@bruits/satteri-win32-arm64-msvc": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.9.4.tgz", - "integrity": "sha512-E1ZPQbgCtFKiU7pFYVndynvY7ne4coeVDUgnVThErSFlJ2ceQCBZrfRTD1lzrIDy63Bbqo+g/cZY9duw+JYjIw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@bruits/satteri-win32-x64-msvc": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.9.4.tgz", - "integrity": "sha512-5I7SiarsNdAUuhJb50CXJPTwr/ECVrBoU+fymoLjChK5fW//+srhY4lstcNTzgFRtQSYfVtm4OQZz16CVMeTeA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@capsizecss/unpack": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", @@ -844,15 +869,6 @@ "node": ">=20.19.0" } }, - "node_modules/@ctrl/tinycolor": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", - "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, "node_modules/@emnapi/core": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", @@ -1317,51 +1333,6 @@ } } }, - "node_modules/@expressive-code/core": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.44.0.tgz", - "integrity": "sha512-xgiF2P6tYUbrhi3+x0S8xHZWT1t3Bvb3U91tAtRbLb9HLejLvYc5GZUqKICKLaUN4iSGhhNJu2fM/aH8e5yCMg==", - "license": "MIT", - "dependencies": { - "@ctrl/tinycolor": "^4.0.4", - "hast-util-select": "^6.0.2", - "hast-util-to-html": "^9.0.1", - "hast-util-to-text": "^4.0.1", - "hastscript": "^9.0.0", - "postcss": "^8.4.38", - "postcss-nested": "^6.0.1", - "unist-util-visit": "^5.0.0", - "unist-util-visit-parents": "^6.0.1" - } - }, - "node_modules/@expressive-code/plugin-frames": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.44.0.tgz", - "integrity": "sha512-V6M6+zVc1GzqCvXkQHc2m5rcFOIVzJgMq5gnfrMnVf2gwtj/sg4H93c1f/mGeqHycubwkHFUDyParAOiGeDZeA==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.44.0" - } - }, - "node_modules/@expressive-code/plugin-shiki": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.44.0.tgz", - "integrity": "sha512-RZsdaqlbGqyAQKuoX4myQXxjmiE2l5KBpJ/gKPh62tCdIdpWyjbzVqSo8+5XsezZxkfi8AJ/J6EUaBTPROFX/Q==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.44.0", - "shiki": "^4.0.2" - } - }, - "node_modules/@expressive-code/plugin-text-markers": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.44.0.tgz", - "integrity": "sha512-0/m3A5b+lz2upyNq+wzZ1S69HRoJmyFs5LsR42lVZ9pmGRlBiSBYQpvqlji4DBj1+Riamxc0AvcCr5kuzOQeWA==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.44.0" - } - }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -1921,12 +1892,51 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha1-Y0Khn0Q0dRjJPkOxrGnes8Rlah8=", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha1-N1xHbRlylHhRuh4Vro8SMEdEWqE=", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha1-eg7mAfYPmaIMfHxf8MgDiMEYm9Y=", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha1-2xXWeByTHzolGj2sOVAcmKYIL9A=", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@mdx-js/mdx": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", @@ -1985,6 +1995,12 @@ "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, + "node_modules/@oddbird/popover-polyfill": { + "version": "0.5.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@oddbird/popover-polyfill/-/popover-polyfill-0.5.2.tgz", + "integrity": "sha1-mhQsrlS25IgkvsYelOOVQcl0a2k=", + "license": "BSD-3-Clause" + }, "node_modules/@oslojs/encoding": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", @@ -2007,6 +2023,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2020,18 +2037,13 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, - "node_modules/@pagefind/default-ui": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.5.2.tgz", - "integrity": "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==", - "license": "MIT" - }, "node_modules/@pagefind/freebsd-x64": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz", @@ -2039,6 +2051,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2052,6 +2065,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2065,6 +2079,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2078,6 +2093,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2091,12 +2107,59 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, + "node_modules/@primer/behaviors": { + "version": "1.10.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@primer/behaviors/-/behaviors-1.10.3.tgz", + "integrity": "sha1-/TNGsj+14V5M5gWQs111CqrqYWg=", + "license": "MIT" + }, + "node_modules/@primer/octicons-react": { + "version": "19.33.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@primer/octicons-react/-/octicons-react-19.33.0.tgz", + "integrity": "sha1-XWqIDIAMgpaJiA57PfPesrc1+fs=", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.3" + } + }, + "node_modules/@primer/react-brand": { + "version": "0.72.1-rc.c5f3a3b5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@primer/react-brand/-/react-brand-0.72.1-rc.c5f3a3b5.tgz", + "integrity": "sha1-yZSBmtUQOMVkcn7FQMTD/ByqdSo=", + "license": "MIT", + "dependencies": { + "@oddbird/popover-polyfill": "0.5.2", + "@primer/behaviors": "^1.8.2" + }, + "engines": { + "node": ">=24.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@types/react": ">=18 <20", + "@types/react-dom": ">=18 <20", + "react": ">=18 <20", + "react-dom": ">=18 <20" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", @@ -2455,6 +2518,47 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha1-PfFfJ7qFMZyqB7oI0HIYibs5wBc=", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha1-tYGSlMUReZV6+uw0FEL5NB5BCKk=", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha1-VnJRNwHBshmbxtrWNqnXSRWGdm8=", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha1-B9cT1szg0mXJhJ2wy+YtP2Hzb3Q=", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, "node_modules/@types/debug": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", @@ -2488,12 +2592,6 @@ "@types/unist": "*" } }, - "node_modules/@types/js-yaml": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", - "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "license": "MIT" - }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -2533,6 +2631,26 @@ "undici-types": "~7.16.0" } }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/react/-/react-19.2.18.tgz", + "integrity": "sha1-6wtqH7Y10alpLV+Eo0lb2K0VNwc=", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha1-66ePxiAeVkmG7EDVbIbIQ0WTys4=", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", @@ -2561,6 +2679,32 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha1-EIvQ9WbyiM41Zpgt9O/xN97XsV8=", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha1-iojMkqD3Qb78e8EJyxpMa5QI4cU=", + "license": "MIT" + }, "node_modules/acorn": { "version": "8.17.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", @@ -2752,19 +2896,6 @@ } } }, - "node_modules/astro-expressive-code": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.44.0.tgz", - "integrity": "sha512-b1wN/ZvbJprzxlGKIpIes2kQrCY5KRLwys2tWbZAZyjGZcW5ZtgneZnBwzNRiBna9/48d4mQl19KLjcRuhO1hw==", - "license": "MIT", - "dependencies": { - "rehype-expressive-code": "^0.44.0", - "url-extras": "^0.1.0" - }, - "peerDependencies": { - "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" - } - }, "node_modules/astro/node_modules/@astrojs/internal-helpers": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", @@ -2988,29 +3119,16 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/bcp-47": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", - "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0" + "node_modules/baseline-browser-mapping": { + "version": "2.11.21", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz", + "integrity": "sha1-ma9zy45UAH5PU0XhMieOJsJmLyw=", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/bcp-47-match": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", - "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=6.0.0" } }, "node_modules/bidi-js": { @@ -3028,6 +3146,59 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, + "node_modules/browserslist": { + "version": "4.28.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/browserslist/-/browserslist-4.28.9.tgz", + "integrity": "sha1-B85rRJuQr4gOub+3zTk3LMT3HIw=", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.20", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.420", + "node-releases": "^2.0.54", + "update-browserslist-db": "^1.3.2" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha1-SXC0d96jJ4N03pvEOqj105/DzaI=", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -3164,6 +3335,12 @@ "node": ">= 18" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha1-S1YPZJ/E6RjdCrdc9JYei8iC2Co=", + "license": "MIT" + }, "node_modules/cookie": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", @@ -3214,22 +3391,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css-selector-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", - "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "node_modules/css-tree": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", @@ -3255,18 +3416,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/csso": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", @@ -3315,6 +3464,13 @@ "node": ">=20" } }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha1-7EjA8+mT5QZIyG2lWeJhCZXPmJo=", + "license": "MIT", + "peer": true + }, "node_modules/data-urls": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", @@ -3422,19 +3578,6 @@ "node": ">=0.3.1" } }, - "node_modules/direction": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", - "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", - "license": "MIT", - "bin": { - "direction": "cli.js" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -3520,6 +3663,12 @@ "node": ">=4" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.422", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/electron-to-chromium/-/electron-to-chromium-1.5.422.tgz", + "integrity": "sha1-4n+xyg5r72EqZHAi4UaXAf6p7h8=", + "license": "ISC" + }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -3611,6 +3760,15 @@ "@esbuild/win32-x64": "0.28.1" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha1-ARo/aYVroYnf+n3I/M6Z0qh5A+U=", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -3733,18 +3891,6 @@ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, - "node_modules/expressive-code": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.44.0.tgz", - "integrity": "sha512-JXVWVNCKlLuZLMQH8cOiDUSosT0Bb+elwE/dbAkpwFwDFmyFyWlECoWZIohh2FkIF1iI67TQJ+Ts9k7oNDh2qA==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.44.0", - "@expressive-code/plugin-frames": "^0.44.0", - "@expressive-code/plugin-shiki": "^0.44.0", - "@expressive-code/plugin-text-markers": "^0.44.0" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3901,6 +4047,15 @@ "url": "https://github.com/sponsors/krisk" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-tsconfig": { "version": "5.0.0-beta.4", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", @@ -3976,39 +4131,6 @@ "uncrypto": "^0.1.3" } }, - "node_modules/hast-util-embedded": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", - "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-is-element": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-format": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", - "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-minify-whitespace": "^1.0.0", - "hast-util-phrasing": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "html-whitespace-sensitive-tag-names": "^3.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-from-html": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", @@ -4047,32 +4169,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-has-property": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", - "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-body-ok-link": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", - "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-is-element": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", @@ -4086,23 +4182,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-minify-whitespace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", - "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", @@ -4116,23 +4195,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-has-property": "^3.0.0", - "hast-util-is-body-ok-link": "^3.0.0", - "hast-util-is-element": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-raw": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", @@ -4158,33 +4220,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-select": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", - "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "bcp-47-match": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "css-selector-parser": "^3.0.0", - "devlop": "^1.0.0", - "direction": "^2.0.0", - "hast-util-has-property": "^3.0.0", - "hast-util-to-string": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "nth-check": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-to-estree": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", @@ -4282,19 +4317,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-string": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", - "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-to-text": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", @@ -4369,16 +4391,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/html-whitespace-sensitive-tag-names": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", - "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", @@ -4411,34 +4423,6 @@ "node": ">= 14" } }, - "node_modules/i18next": { - "version": "26.3.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.3.3.tgz", - "integrity": "sha512-aYVegyBdXSO93CMMihvr47jI7GHSOcIahMpJX+qzUXDzW4xDJf2uenIA+45vDU+YhiVdcfsql70AC9RVdMNrHg==", - "funding": [ - { - "type": "individual", - "url": "https://www.locize.com/i18next" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - }, - { - "type": "individual", - "url": "https://www.locize.com" - } - ], - "license": "MIT", - "peerDependencies": { - "typescript": "^5 || ^6" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -4571,6 +4555,12 @@ "node": ">=20.19.5" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", @@ -4657,6 +4647,30 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha1-dNM1ojT2ftGZB/2t+sfM+dQJgl0=", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json5/-/json5-2.2.3.tgz", + "integrity": "sha1-eM1vGhm9wStz21rQxh79ZsHikoM=", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonc-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", @@ -4684,15 +4698,6 @@ "node": ">=0.10.0" } }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -4970,15 +4975,6 @@ "node": "20 || >=22" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/magicast": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", @@ -5422,25 +5418,6 @@ "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-extension-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", @@ -6156,6 +6133,15 @@ "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", "license": "MIT" }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha1-Ca8X1WR6qfIh7FzyvsuVtoqYGv4=", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6277,6 +6263,7 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", + "dev": true, "license": "MIT", "bin": { "pagefind": "lib/runner/bin.cjs" @@ -6451,44 +6438,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", - "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -6538,6 +6487,36 @@ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "license": "MIT" }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react/-/react-19.2.8.tgz", + "integrity": "sha1-qAZj27WNacb+P9KR08syTop9/y0=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha1-O0a57tqHfN/yzxPSdw//SuNsLsI=", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha1-Lc6X9P6TKk2BQvoWMOR1wXKcgGI=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -6657,60 +6636,6 @@ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "license": "MIT" }, - "node_modules/rehype": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", - "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "rehype-parse": "^9.0.0", - "rehype-stringify": "^10.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-expressive-code": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.44.0.tgz", - "integrity": "sha512-5r74C5F2sMR3X+QJH8OKWgZBO/cqRw5W1fLT6GVlSfLqepk+4j8tGFkyPqZYWjwntsBHzKPDH2zI68sZ7ScLfA==", - "license": "MIT", - "dependencies": { - "expressive-code": "^0.44.0" - } - }, - "node_modules/rehype-format": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", - "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-format": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", - "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", @@ -6756,22 +6681,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", - "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^4.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -7000,28 +6909,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, - "node_modules/satteri": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.4.tgz", - "integrity": "sha512-BKob126Tay84diOZsnVNH/Q/c+3njPJTCad3w5zLKa6j8bVjxskPNHDtxrMwYK4bN/RlqUSdMnPwKY4k65EMOQ==", - "dependencies": { - "@types/estree-jsx": "^1.0.5", - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "@types/unist": "^3.0.3" - }, - "optionalDependencies": { - "@bruits/satteri-darwin-arm64": "0.9.4", - "@bruits/satteri-darwin-x64": "0.9.4", - "@bruits/satteri-linux-arm64-gnu": "0.9.4", - "@bruits/satteri-linux-arm64-musl": "0.9.4", - "@bruits/satteri-linux-x64-gnu": "0.9.4", - "@bruits/satteri-linux-x64-musl": "0.9.4", - "@bruits/satteri-wasm32-wasi": "0.9.4", - "@bruits/satteri-win32-arm64-msvc": "0.9.4", - "@bruits/satteri-win32-x64-msvc": "0.9.4" - } - }, "node_modules/sax": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", @@ -7043,6 +6930,12 @@ "node": ">=v12.22.7" } }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha1-DE74LWfR5cHjWej8dtOofwRf5b0=", + "license": "MIT" + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -7714,16 +7607,34 @@ } } }, - "node_modules/url-extras": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/url-extras/-/url-extras-0.1.0.tgz", - "integrity": "sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==", + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha1-nZn7/1bFC7Ebpf01zs5ZFtpZWDY=", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "engines": { - "node": ">=20" + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, "node_modules/util-deprecate": { @@ -7945,6 +7856,12 @@ "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", "license": "MIT" }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + "license": "ISC" + }, "node_modules/yargs-parser": { "version": "22.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", diff --git a/website/package.json b/website/package.json index 5b976841..150f8aff 100644 --- a/website/package.json +++ b/website/package.json @@ -20,20 +20,35 @@ "license": "MIT", "dependencies": { "@astrojs/markdown-remark": "^7.2.0", + "@astrojs/react": "^6.0.2", "@astrojs/sitemap": "^3.7.2", - "@astrojs/starlight": "^0.41.1", + "@primer/octicons-react": "^19.33.0", + "@primer/react-brand": "^0.72.1-rc.c5f3a3b5", "astro": "^7.3.2", "choices.js": "^11.2.2", + "clsx": "^2.1.1", "front-matter": "^4.0.2", "gray-matter": "^4.0.3", "isomorphic-dompurify": "^2.36.0", "jszip": "^3.10.1", "marked": "^18.0.2", + "react": "^19.2.8", + "react-dom": "^19.2.8", "remark-github-admonitions-to-directives": "^2.1.0", "shiki": "^4.0.2" }, "devDependencies": { "axe-core": "^4.10.2", + "pagefind": "^1.5.2", "playwright": "^1.49.0" + }, + "overrides": { + "js-yaml": "^4.3.2", + "front-matter": { + "js-yaml": "^3.15.2" + }, + "gray-matter": { + "js-yaml": "^3.15.2" + } } } diff --git a/website/public/images/favicon.svg b/website/public/images/favicon.svg index 0411bb16..998ae699 100755 --- a/website/public/images/favicon.svg +++ b/website/public/images/favicon.svg @@ -1,9 +1,15 @@ + - - - + + + diff --git a/website/public/images/learning-hub/github-copilot-app/copilot-app-centralized-inbox-poster.webp b/website/public/images/learning-hub/github-copilot-app/copilot-app-centralized-inbox-poster.webp new file mode 100644 index 00000000..6b469566 Binary files /dev/null and b/website/public/images/learning-hub/github-copilot-app/copilot-app-centralized-inbox-poster.webp differ diff --git a/website/public/images/learning-hub/github-copilot-app/copilot-app-delegate-to-agents.webp b/website/public/images/learning-hub/github-copilot-app/copilot-app-delegate-to-agents.webp new file mode 100644 index 00000000..854ced8b Binary files /dev/null and b/website/public/images/learning-hub/github-copilot-app/copilot-app-delegate-to-agents.webp differ diff --git a/website/public/images/learning-hub/using-automations-in-copilot-app/copilot-app-delegate-to-agents.webp b/website/public/images/learning-hub/using-automations-in-copilot-app/copilot-app-delegate-to-agents.webp new file mode 100644 index 00000000..854ced8b Binary files /dev/null and b/website/public/images/learning-hub/using-automations-in-copilot-app/copilot-app-delegate-to-agents.webp differ diff --git a/website/public/images/learning-hub/working-with-canvas-extensions/canvases-light.webp b/website/public/images/learning-hub/working-with-canvas-extensions/canvases-light.webp new file mode 100644 index 00000000..75689023 Binary files /dev/null and b/website/public/images/learning-hub/working-with-canvas-extensions/canvases-light.webp differ diff --git a/website/public/media/automations-dark.webp b/website/public/media/automations-dark.webp new file mode 100644 index 00000000..52c995fe Binary files /dev/null and b/website/public/media/automations-dark.webp differ diff --git a/website/public/media/automations-light.webp b/website/public/media/automations-light.webp new file mode 100644 index 00000000..9a3036b0 Binary files /dev/null and b/website/public/media/automations-light.webp differ diff --git a/website/public/media/brand-divider-copilot-jumping.webp b/website/public/media/brand-divider-copilot-jumping.webp new file mode 100644 index 00000000..7664533b Binary files /dev/null and b/website/public/media/brand-divider-copilot-jumping.webp differ diff --git a/website/public/media/brand-divider-copilot-sitting.webp b/website/public/media/brand-divider-copilot-sitting.webp new file mode 100644 index 00000000..679197eb Binary files /dev/null and b/website/public/media/brand-divider-copilot-sitting.webp differ diff --git a/website/public/media/canvases-dark.webp b/website/public/media/canvases-dark.webp new file mode 100644 index 00000000..9ba4c831 Binary files /dev/null and b/website/public/media/canvases-dark.webp differ diff --git a/website/public/media/canvases-light.webp b/website/public/media/canvases-light.webp new file mode 100644 index 00000000..75689023 Binary files /dev/null and b/website/public/media/canvases-light.webp differ diff --git a/website/public/media/cli-for-beginners-intro.mp4 b/website/public/media/cli-for-beginners-intro.mp4 new file mode 100644 index 00000000..4e5bfe5c Binary files /dev/null and b/website/public/media/cli-for-beginners-intro.mp4 differ diff --git a/website/public/media/copilot-app-centralized-inbox-poster.webp b/website/public/media/copilot-app-centralized-inbox-poster.webp new file mode 100644 index 00000000..6b469566 Binary files /dev/null and b/website/public/media/copilot-app-centralized-inbox-poster.webp differ diff --git a/website/public/media/copilot-app-delegate-to-agents.webp b/website/public/media/copilot-app-delegate-to-agents.webp new file mode 100644 index 00000000..854ced8b Binary files /dev/null and b/website/public/media/copilot-app-delegate-to-agents.webp differ diff --git a/website/public/media/desktop-app-light.webp b/website/public/media/desktop-app-light.webp new file mode 100644 index 00000000..77835a18 Binary files /dev/null and b/website/public/media/desktop-app-light.webp differ diff --git a/website/public/media/desktop-app.webp b/website/public/media/desktop-app.webp new file mode 100644 index 00000000..21569d39 Binary files /dev/null and b/website/public/media/desktop-app.webp differ diff --git a/website/public/media/dither-dark.webp b/website/public/media/dither-dark.webp new file mode 100644 index 00000000..dff98001 Binary files /dev/null and b/website/public/media/dither-dark.webp differ diff --git a/website/public/media/dither-light.webp b/website/public/media/dither-light.webp new file mode 100644 index 00000000..71ee7b67 Binary files /dev/null and b/website/public/media/dither-light.webp differ diff --git a/website/public/media/duck-progress.svg b/website/public/media/duck-progress.svg new file mode 100644 index 00000000..61252b14 --- /dev/null +++ b/website/public/media/duck-progress.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/public/media/fundamentals-light.webp b/website/public/media/fundamentals-light.webp new file mode 100644 index 00000000..248dfcdb Binary files /dev/null and b/website/public/media/fundamentals-light.webp differ diff --git a/website/public/media/fundamentals.webp b/website/public/media/fundamentals.webp new file mode 100644 index 00000000..d76ea005 Binary files /dev/null and b/website/public/media/fundamentals.webp differ diff --git a/website/public/media/reference-dark.webp b/website/public/media/reference-dark.webp new file mode 100644 index 00000000..f076c8f1 Binary files /dev/null and b/website/public/media/reference-dark.webp differ diff --git a/website/public/media/reference-light.webp b/website/public/media/reference-light.webp new file mode 100644 index 00000000..0cd9ea6c Binary files /dev/null and b/website/public/media/reference-light.webp differ diff --git a/website/public/media/terminal-light.webp b/website/public/media/terminal-light.webp new file mode 100644 index 00000000..4dc677a2 Binary files /dev/null and b/website/public/media/terminal-light.webp differ diff --git a/website/public/media/terminal.webp b/website/public/media/terminal.webp new file mode 100644 index 00000000..5e6ebe1e Binary files /dev/null and b/website/public/media/terminal.webp differ diff --git a/website/scripts/a11y-audit.mjs b/website/scripts/a11y-audit.mjs index ac130494..603a8802 100644 --- a/website/scripts/a11y-audit.mjs +++ b/website/scripts/a11y-audit.mjs @@ -28,21 +28,19 @@ const routes = [ '/agents/', '/instructions/', '/skills/', - '/hooks/', - '/workflows/', '/extensions/', '/plugins/', - '/tools/', '/contributors/', - '/learning-hub/cookbook/', + '/learning-hub/', + // Keep a representative Learning Hub article in the matrix so the article + // chassis is audited in addition to the Learning Hub landing page. '/learning-hub/github-copilot-app/', + '/learning-hub/cookbook/', // Representative dedicated detail pages (one per resource type) so the audit // covers the shared detail layout, sidebar, install buttons, and file browser. '/agent/accessibility/', '/instruction/a11y/', '/skill/acquire-codebase-knowledge/', - '/hook/dependency-license-checker/', - '/workflow/daily-issues-report/', '/plugin/accessibility-kanban/', '/extension/accessibility-kanban/', ]; diff --git a/website/src/components/BackToTop.astro b/website/src/components/BackToTop.astro deleted file mode 100644 index d6518283..00000000 --- a/website/src/components/BackToTop.astro +++ /dev/null @@ -1,129 +0,0 @@ ---- -// Back to Top Button Component ---- - - - - - - diff --git a/website/src/components/ContributeCTA.astro b/website/src/components/ContributeCTA.astro deleted file mode 100644 index 70078f29..00000000 --- a/website/src/components/ContributeCTA.astro +++ /dev/null @@ -1,108 +0,0 @@ ---- -interface Props { - resourceType: string; -} - -const { resourceType } = Astro.props; -const contributingUrl = 'https://github.com/github/awesome-copilot/blob/main/CONTRIBUTING.md'; -const newIssueUrl = 'https://github.com/github/awesome-copilot/issues/new'; ---- - -
-
-

Don't see what you're looking for?

-

This collection is community-driven. Share your own {resourceType} to help others get more out of GitHub Copilot.

-
- -
- - - diff --git a/website/src/components/EmbeddedPageData.astro b/website/src/components/EmbeddedPageData.astro deleted file mode 100644 index 61a03455..00000000 --- a/website/src/components/EmbeddedPageData.astro +++ /dev/null @@ -1,19 +0,0 @@ ---- -import { - getEmbeddedDataElementId, - serializeEmbeddedData, -} from "../scripts/embedded-data"; - -interface Props { - filename: string; - data: unknown; -} - -const { filename, data } = Astro.props; ---- - - diff --git a/website/src/components/Footer.astro b/website/src/components/Footer.astro deleted file mode 100644 index ddfdf99f..00000000 --- a/website/src/components/Footer.astro +++ /dev/null @@ -1,257 +0,0 @@ ---- -import EditLink from "@astrojs/starlight/components/EditLink.astro"; -import LastUpdated from "@astrojs/starlight/components/LastUpdated.astro"; -import Pagination from "@astrojs/starlight/components/Pagination.astro"; -import config from "virtual:starlight/user-config"; -import { Icon } from "@astrojs/starlight/components"; -import ThemeToggle from "./ThemeToggle.astro"; -const currentYear = new Date().getFullYear(); ---- - - - - - - diff --git a/website/src/components/Head.astro b/website/src/components/Head.astro deleted file mode 100644 index 53ded830..00000000 --- a/website/src/components/Head.astro +++ /dev/null @@ -1,116 +0,0 @@ ---- -import Default from '@astrojs/starlight/components/Head.astro'; -const { head, entry } = Astro.locals.starlightRoute; -const basePath = import.meta.env.BASE_URL; - -const getMetaContent = (key: string, attribute: 'name' | 'property' = 'name') => - head.find((tag) => tag.tag === 'meta' && tag.attrs?.[attribute] === key)?.attrs?.content; - -const getLinkHref = (rel: string) => - head.find((tag) => tag.tag === 'link' && tag.attrs?.rel === rel)?.attrs?.href; - -const twitterTitle = entry.data.title; -const description = - entry.data.description ?? - getMetaContent('description') ?? - getMetaContent('og:description', 'property'); -const canonicalUrl = - getLinkHref('canonical') ?? getMetaContent('og:url', 'property'); -const socialImageUrl = - getMetaContent('twitter:image') ?? getMetaContent('og:image', 'property'); -const socialImageAlt = - getMetaContent('twitter:image:alt') ?? - getMetaContent('og:image:alt', 'property') ?? - description; -const socialImageType = socialImageUrl?.endsWith('.png') - ? 'image/png' - : socialImageUrl?.endsWith('.jpg') || socialImageUrl?.endsWith('.jpeg') - ? 'image/jpeg' - : socialImageUrl?.endsWith('.webp') - ? 'image/webp' - : undefined; - -const twitterDomain = - canonicalUrl && URL.canParse(canonicalUrl) - ? new URL(canonicalUrl).hostname - : undefined; -const contentSecurityPolicy = [ - "default-src 'self'", - "base-uri 'self'", - "object-src 'none'", - "form-action 'none'", - "script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' https://analytics.githubassets.com", - "style-src 'self' 'unsafe-inline'", - "img-src 'self' data: https:", - "font-src 'self' data:", - "connect-src 'self' https://raw.githubusercontent.com https://collector.githubapp.com", - "worker-src 'self' blob:", - "upgrade-insecure-requests", -].join("; "); ---- - - - - -{twitterTitle && } -{description && } -{canonicalUrl && } -{twitterDomain && } -{socialImageUrl && } -{socialImageType && } -{socialImageAlt && } - - - - - -{import.meta.env.PROD && ( - <> - - - -)} diff --git a/website/src/components/Icon.astro b/website/src/components/Icon.astro deleted file mode 100644 index 4ffcc2bc..00000000 --- a/website/src/components/Icon.astro +++ /dev/null @@ -1,120 +0,0 @@ ---- -// Icon component with SVG icons -// Icons are either fill-based (from GitHub Primer) or stroke-based (custom) -// GitHub Primer icons are sourced from https://primer.style/foundations/icons/ - -export interface Props { - name: 'agents' | 'instructions' | 'skills' | 'hooks' | 'workflows' | 'plugins' | 'tools' | 'learning' | 'close' | 'copy' | 'download' | 'share' | 'external' | 'plus' | 'search' | 'chevron-down' | 'document' | 'lightning' | 'hook' | 'workflow' | 'plug' | 'wrench' | 'book' | 'robot' | 'sync'; - size?: number; - class?: string; -} - -const { name, size = 24, class: className = '' } = Astro.props; - -// Icon definitions: { path: SVG path(s), fill: true for fill-based icons } -const icons: Record = { - // Resource type icons - using GitHub Primer icons where available - - // Agent icon - using GitHub Primer's agent-24 (sparkle over workflow) - // Source: https://primer.style/foundations/icons/agent-24 - 'robot': { - fill: true, - path: `` - }, - - // Document icon - custom stroke-based - 'document': { - path: `` - }, - - // Lightning icon - custom stroke-based (for skills) - 'lightning': { - path: `` - }, - - // Hook icon - using GitHub Primer's sync-24 (represents hooks/iterations) - // Source: https://primer.style/foundations/icons/sync-24 - 'hook': { - fill: true, - path: `` - }, - - // Workflow icon - using GitHub Primer's workflow-24 - // Source: https://primer.style/foundations/icons/workflow-24 - // Also used by https://github.github.com/gh-aw/ - 'workflow': { - fill: true, - path: `` - }, - - // Plug icon - using GitHub Primer's plug-24 - // Source: https://primer.style/foundations/icons/plug-24 - 'plug': { - fill: true, - path: `` - }, - - // Wrench icon - custom stroke-based (for tools) - 'wrench': { - path: `` - }, - - // Book icon - custom stroke-based (for learning) - 'book': { - path: `` - }, - - // Action icons - all custom stroke-based - 'close': { - path: `` - }, - - 'copy': { - path: `` - }, - - 'download': { - path: `` - }, - - 'share': { - path: `` - }, - - 'external': { - path: `` - }, - - 'plus': { - path: `` - }, - - 'search': { - path: `` - }, - - 'chevron-down': { - path: `` - }, - - // Alias for hook - same as 'hook' - 'sync': { - fill: true, - path: `` - }, -}; - -const iconData = icons[name] || { path: '' }; -const isFill = iconData.fill ?? false; -const iconPath = iconData.path; ---- - - \ No newline at end of file diff --git a/website/src/components/LanguageSelect.astro b/website/src/components/LanguageSelect.astro deleted file mode 100644 index 7d930795..00000000 --- a/website/src/components/LanguageSelect.astro +++ /dev/null @@ -1,40 +0,0 @@ ---- -// Custom override of Starlight's LanguageSelect. -// -// By default Starlight renders the language dropdown on every page as soon as -// more than one locale is configured. Most of this site's docs are English-only, -// so we only want the picker to appear on pages that actually have a translation -// in a non-English locale. This override checks the docs collection for a -// translated version of the current page and renders the stock picker only when -// one exists; otherwise it renders nothing (no dropdown). -import Default from "@astrojs/starlight/components/LanguageSelect.astro"; -import config from "virtual:starlight/user-config"; -import { getCollection } from "astro:content"; - -// Locale directory names configured for the site, excluding the English root. -const localeCodes = Object.keys(config.locales ?? {}).filter( - (code) => code !== "root" -); - -/** Strip a leading `/` segment from a docs entry id, if present. */ -function baseSlug(id) { - const [first, ...rest] = id.split("/"); - return localeCodes.includes(first) ? rest.join("/") : id; -} - -// Set of base slugs (locale-stripped) that have at least one non-English -// translation available in the docs collection. -const docs = await getCollection("docs"); -const translatedBaseSlugs = new Set(); -for (const entry of docs) { - const [first, ...rest] = entry.id.split("/"); - if (localeCodes.includes(first)) { - translatedBaseSlugs.add(rest.join("/")); - } -} - -const currentBaseSlug = baseSlug(Astro.locals.starlightRoute.id); -const hasTranslations = translatedBaseSlugs.has(currentBaseSlug); ---- - -{hasTranslations && } diff --git a/website/src/components/PageHeader.astro b/website/src/components/PageHeader.astro deleted file mode 100644 index 4719267a..00000000 --- a/website/src/components/PageHeader.astro +++ /dev/null @@ -1,38 +0,0 @@ ---- -import Icon from './Icon.astro'; - -interface Props { - title: string; - description: string; - icon?: 'robot' | 'document' | 'lightning' | 'hook' | 'workflow' | 'plug' | 'wrench' | 'book'; -} - -const { title, description, icon } = Astro.props; -const contributingUrl = 'https://github.com/github/awesome-copilot/blob/main/CONTRIBUTING.md'; ---- - - - - diff --git a/website/src/components/Search.astro b/website/src/components/Search.astro deleted file mode 100644 index 6a34da31..00000000 --- a/website/src/components/Search.astro +++ /dev/null @@ -1,516 +0,0 @@ ---- -import Icon from './Icon.astro'; -import project from 'virtual:starlight/project-context'; - -const pagefindTranslations = { - placeholder: Astro.locals.t('search.label'), - ...Object.fromEntries( - Object.entries(Astro.locals.t.all()) - .filter(([key]) => key.startsWith('pagefind.')) - .map(([key, value]) => [key.replace('pagefind.', ''), value]) - ), -}; - -const dataAttributes: DOMStringMap = { 'data-translations': JSON.stringify(pagefindTranslations) }; -if (project.trailingSlash === 'never') dataAttributes['data-strip-trailing-slash'] = ''; ---- - - - - - -
- { - /* TODO: Make the layout of this button flexible to accommodate different word lengths. Currently hard-coded for English: โ€œCancelโ€ */ - } - - { - import.meta.env.DEV ? ( -
-

{Astro.locals.t('search.devWarning')}

-
- ) : ( -
- - ) - } -
-
-
- -{ - /** - * This is intentionally inlined to avoid briefly showing an invalid shortcut. - * Purposely using the deprecated `navigator.platform` property to detect Apple devices, as the - * user agent is spoofed by some browsers when opening the devtools. - */ -} - - - - - - - diff --git a/website/src/components/ThemeToggle.astro b/website/src/components/ThemeToggle.astro deleted file mode 100644 index 55077f3a..00000000 --- a/website/src/components/ThemeToggle.astro +++ /dev/null @@ -1,170 +0,0 @@ ---- -// Theme Toggle Component - 3 state slider: Auto | Dark | Light ---- - -
- -
- - - - diff --git a/website/src/components/brand/AgentDetail.tsx b/website/src/components/brand/AgentDetail.tsx new file mode 100644 index 00000000..d94e8676 --- /dev/null +++ b/website/src/components/brand/AgentDetail.tsx @@ -0,0 +1,164 @@ +import { DownloadIcon, MarkGithubIcon, PlusIcon } from "@primer/octicons-react"; +import React from "react"; + +import { ActionMenu, Button } from "@primer/react-brand"; + +import { DetailChassis, type DetailSibling } from "./DetailChassis"; +import { ResourceMeta } from "./ResourceMeta"; +import { pageHref } from "./pageHref"; +import { downloadFile } from "./resourceActions"; +import type { SearchItem } from "./searchIndex"; +import styles from "./styles/dotnet-upgrade.module.css"; + +export type AgentDetailItem = { + id: string; + title: string; + description?: string; + model?: string | string[]; + tools?: string[]; + handoffs?: (string | { label?: string; agent?: string })[]; + mcpServers?: string[]; + path: string; + filename?: string; +}; + +export type AgentDetailProps = { + item: AgentDetailItem; + /** Rendered, sanitized markdown body with heading ids already stamped. */ + markdownHtml: string; + vscodeUrl: string; + insidersUrl: string; + githubUrl: string; + downloadUrl: string; + rawMarkdown: string; + lastUpdated?: string | null; + previous?: DetailSibling; + next?: DetailSibling; + searchIndex?: SearchItem[]; + contributorsTotal?: number; +}; + +export function AgentDetail({ + item, + markdownHtml, + vscodeUrl, + insidersUrl, + githubUrl, + downloadUrl, + rawMarkdown, + lastUpdated, + previous, + next, + searchIndex, + contributorsTotal, +}: AgentDetailProps) { + const models = Array.isArray(item.model) + ? item.model + : item.model + ? [item.model] + : []; + + // Handoffs are recorded as `{ label, agent }` records; the chip shows the + // human label, falling back to the agent id. + const handoffs = (item.handoffs ?? []) + .map((handoff) => + typeof handoff === "string" + ? handoff + : (handoff.label ?? handoff.agent ?? ""), + ) + .filter(Boolean); + + const handleCopyMarkdown = React.useCallback(async () => { + try { + await navigator.clipboard.writeText(rawMarkdown); + } catch { + /* clipboard unavailable */ + } + }, [rawMarkdown]); + + const handleDownload = React.useCallback( + () => downloadFile(downloadUrl, item.filename ?? `${item.id}.agent.md`), + [downloadUrl, item.filename, item.id], + ); + + const install = ( + <> + + + Install + + + + Install in VS Code + + + Install in VS Code Insiders + + void handleDownload()}> + Download file + + + Copy markdown + + + + + + + ); + + return ( + + } + previous={previous} + next={next} + currentPage="agents" + searchIndex={searchIndex} + contributorsTotal={contributorsTotal} + > +
+
+
+
+ ); +} diff --git a/website/src/components/brand/AgentsCatalog.tsx b/website/src/components/brand/AgentsCatalog.tsx new file mode 100644 index 00000000..dfd6d321 --- /dev/null +++ b/website/src/components/brand/AgentsCatalog.tsx @@ -0,0 +1,503 @@ +import { ChevronDownIcon, DownloadIcon, MarkGithubIcon } from "@primer/octicons-react"; +import { + ActionMenu, + Box, + Button, + CTABanner, + Card, + Checkbox, + FormControl, + Grid, + Heading, + Pagination, + Section, + Stack, + Text, + useTheme, +} from "@primer/react-brand"; +import { clsx } from "clsx"; +import { useEffect, useMemo, useRef, useState } from "react"; + +import { PageShell } from "./PageShell"; +import { CatalogSortControl, CATALOG_SORT_OPTIONS } from "./CatalogSortControl"; +import { daysSince, toggleValue, updatedBuckets, updatedBucketOf } from "./catalogFilters"; +import { pageHref } from "./pageHref"; +import { downloadFile } from "./resourceActions"; +import { getScrollBehavior } from "./scrollBehavior"; +import type { SearchItem } from "./searchIndex"; +import styles from "./styles/agents.module.css"; + +const CONTRIBUTE_URL = + "https://github.com/github/awesome-copilot/blob/main/docs/README.agents.md#how-to-contribute"; +const REQUEST_URL = "https://github.com/github/awesome-copilot/issues/new"; + +const RAW_BASE = "https://raw.githubusercontent.com/github/awesome-copilot/main"; +const GITHUB_BASE = "https://github.com/github/awesome-copilot/blob/main"; +const INSTALL_REDIRECT = "https://aka.ms/awesome-copilot/install/agent"; + +/** An agent record as emitted into public/data/agents.json. */ +export type AgentItem = { + id: string; + title: string; + description: string; + model?: unknown; + tools?: string[]; + path: string; + filename: string; + lastUpdated: string; +}; + +/** Filter facets emitted alongside the items in public/data/agents.json. */ +export type AgentFilters = { + models?: unknown[]; + tools?: string[]; +}; + +export const agentSourceUrl = (agent: AgentItem) => `${GITHUB_BASE}/${agent.path}`; + +export const downloadUrl = (agent: AgentItem) => `${RAW_BASE}/${agent.path}`; + +/** + * VS Code deep link, matching the scheme used by the agent detail pages + * (`src/lib/detail-page.ts`): an `aka.ms` redirect wrapping the editor URI. + */ +export const installUrl = (agent: AgentItem, insiders = false) => { + const editor = insiders ? "vscode-insiders" : "vscode"; + const innerUrl = `${editor}:chat-agent/install?url=${encodeURIComponent( + downloadUrl(agent), + )}`; + return `${INSTALL_REDIRECT}?url=${encodeURIComponent(innerUrl)}`; +}; + +const agentDetailHref = (agent: AgentItem) => pageHref(`agent/${agent.id}`); + +/** `model` may be a single name or a list of accepted models. */ +const modelsOf = (agent: AgentItem): string[] => flattenNames(agent.model); + +function flattenNames(value: unknown): string[] { + if (typeof value === "string") return [value]; + if (Array.isArray(value)) return value.flatMap(flattenNames); + return []; +} + +const uniqueSorted = (values: string[]) => + Array.from(new Set(values)).sort((a, b) => a.localeCompare(b)); + +type FilterGroupId = "model" | "tools" | "updated"; + +type FilterState = Record; + +const emptyFilters: FilterState = { model: [], tools: [], updated: [] }; + +type SortMode = "az" | "newest"; + +const PAGE_SIZE = 6; + +/** + * Long facets collapse behind a "Show N more" toggle, matching the prototype's + * extensions page. Real data produces far longer option lists than the + * prototype's hardcoded arrays, so every catalog needs this. + */ +const FILTER_COLLAPSE_LIMIT = 10; + +/** + * The Agents catalog, ported from the design prototype's `agents.tsx`. The + * prototype's hardcoded array and hardcoded model/capability options are + * replaced by build-time data; the layout, filters, and interactions are + * unchanged. + */ +export function AgentsCatalog({ + agents, + filters: dataFilters, + searchIndex, + contributorsTotal, +}: { + agents: AgentItem[]; + filters?: AgentFilters; + searchIndex?: SearchItem[]; + contributorsTotal?: number; +}) { + const { colorMode } = useTheme(); + const [sortMode, setSortMode] = useState("az"); + const [currentPage, setCurrentPage] = useState(1); + const previousPage = useRef(currentPage); + const [mobileFiltersOpen, setMobileFiltersOpen] = useState(false); + const [filters, setFilters] = useState(emptyFilters); + const [expandedGroups, setExpandedGroups] = useState< + Record + >({ model: false, tools: false, updated: false }); + const toggleGroupExpanded = (groupId: FilterGroupId) => { + setExpandedGroups((prev) => ({ ...prev, [groupId]: !prev[groupId] })); + }; + + const filterGroups = useMemo< + { id: FilterGroupId; label: string; options: string[] }[] + >(() => { + const models = dataFilters?.models + ? uniqueSorted(flattenNames(dataFilters.models)) + : uniqueSorted(agents.flatMap(modelsOf)); + const tools = dataFilters?.tools + ? uniqueSorted(dataFilters.tools) + : uniqueSorted(agents.flatMap((agent) => agent.tools ?? [])); + return [ + { id: "model", label: "Model", options: models }, + { id: "tools", label: "Tools", options: tools }, + { + id: "updated", + label: "Last updated", + options: updatedBuckets.map((bucket) => bucket.label), + }, + ]; + }, [agents, dataFilters]); + + const sortedAgents = useMemo(() => { + const copy = agents.filter((agent) => { + const models = modelsOf(agent); + const modelOk = + filters.model.length === 0 || + filters.model.some((model) => models.includes(model)); + const toolsOk = + filters.tools.length === 0 || + filters.tools.every((tool) => (agent.tools ?? []).includes(tool)); + const updatedOk = + filters.updated.length === 0 || + filters.updated.includes(updatedBucketOf(daysSince(agent.lastUpdated))); + return modelOk && toolsOk && updatedOk; + }); + if (sortMode === "newest") { + copy.sort((a, b) => daysSince(a.lastUpdated) - daysSince(b.lastUpdated)); + } else { + copy.sort((a, b) => a.title.localeCompare(b.title)); + } + return copy; + }, [agents, filters, sortMode]); + + const toggleFilter = (groupId: FilterGroupId, option: string) => { + setFilters((prev) => ({ + ...prev, + [groupId]: toggleValue(prev[groupId], option), + })); + setCurrentPage(1); + }; + + const clearFilters = () => { + setFilters(emptyFilters); + setCurrentPage(1); + }; + + const activeFilterCount = + filters.model.length + filters.tools.length + filters.updated.length; + const hasActiveFilters = activeFilterCount > 0; + const pageCount = Math.max(1, Math.ceil(sortedAgents.length / PAGE_SIZE)); + const page = Math.min(currentPage, pageCount); + const visibleAgents = sortedAgents.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE); + + useEffect(() => { + if (previousPage.current === currentPage) return; + previousPage.current = currentPage; + const frame = window.requestAnimationFrame(() => { + const catalog = document.getElementById("catalog"); + if (!catalog) return; + catalog.scrollIntoView({ behavior: getScrollBehavior(), block: "start" }); + catalog.focus({ preventScroll: true }); + }); + return () => window.cancelAnimationFrame(frame); + }, [currentPage]); + + return ( + + +
+ + + Agents + + + Specialized agents that enhance GitHub Copilot for specific + technologies, workflows, and domains โ€” contributed and curated by + the community. + +
+
+ +
+ + + + + + { + setSortMode(value); + setCurrentPage(1); + }} + /> + + + + + {visibleAgents.map((agent) => ( + + + + {agent.title} + + + {agent.description} + + + +
+ + + Install + + + + VS Code + + + VS Code Insiders + + + + + +
+
+
+ ))} +
+
+
+ + {sortedAgents.length === 0 ? ( + + + No agents match the selected filters. + + + ) : null} +
+
+
+ +