From 5bff7cadc09c416f83c8d7440b7994f15a77c4f0 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Wed, 25 Feb 2026 15:54:09 +1100 Subject: [PATCH 1/8] Remove prompts from website Remove the prompts page, navigation link, homepage card, and all references to prompts across the website source code. The repo no longer contains prompt files, so the website should not reference them. Files removed: - website/src/pages/prompts.astro - website/src/scripts/pages/prompts.ts Files updated: - BaseLayout.astro: remove nav link and update description - index.astro: remove prompts card and update text - llms.txt.ts: remove prompts import and section - plugins.astro: update description text - utils.ts: remove prompt type from install config, icons, labels - pages/index.ts: remove prompts from counts - modal.ts: update JSDoc comment Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- website/src/layouts/BaseLayout.astro | 6 +- website/src/pages/index.astro | 12 +-- website/src/pages/llms.txt.ts | 16 +-- website/src/pages/plugins.astro | 4 +- website/src/pages/prompts.astro | 50 --------- website/src/scripts/modal.ts | 2 +- website/src/scripts/pages/index.ts | 3 +- website/src/scripts/pages/prompts.ts | 149 --------------------------- website/src/scripts/utils.ts | 9 +- 9 files changed, 9 insertions(+), 242 deletions(-) delete mode 100644 website/src/pages/prompts.astro delete mode 100644 website/src/scripts/pages/prompts.ts diff --git a/website/src/layouts/BaseLayout.astro b/website/src/layouts/BaseLayout.astro index d89f0cc8b..6f114e9c9 100644 --- a/website/src/layouts/BaseLayout.astro +++ b/website/src/layouts/BaseLayout.astro @@ -9,7 +9,7 @@ interface Props { const { title, - description = "Community-driven collection of custom agents, prompts, and instructions for GitHub Copilot", + description = "Community-driven collection of custom agents, instructions, and skills for GitHub Copilot", activeNav = "", } = Astro.props; const base = import.meta.env.BASE_URL; @@ -57,10 +57,6 @@ try { href={`${base}agents/`} class:list={[{ active: activeNav === "agents" }]}>Agents - Prompts

Awesome GitHub Copilot

-

Community-contributed instructions, prompts, agents, and skills to enhance your GitHub Copilot experience

+

Community-contributed agents, instructions, and skills to enhance your GitHub Copilot experience

-
- - -
-

Prompts

-

Ready-to-use prompt templates for development tasks

-
-
-
-
@@ -103,7 +95,7 @@ const base = import.meta.env.BASE_URL;

Browse

-

Explore agents, prompts, instructions, and skills

+

Explore agents, instructions, skills, and plugins

diff --git a/website/src/pages/llms.txt.ts b/website/src/pages/llms.txt.ts index 3cf5a9b8b..bd5a06472 100644 --- a/website/src/pages/llms.txt.ts +++ b/website/src/pages/llms.txt.ts @@ -1,6 +1,5 @@ import type { APIRoute } from "astro"; import agentsData from "../../public/data/agents.json"; -import promptsData from "../../public/data/prompts.json"; import instructionsData from "../../public/data/instructions.json"; import skillsData from "../../public/data/skills.json"; @@ -9,7 +8,6 @@ const GITHUB_RAW_BASE = "https://raw.githubusercontent.com/github/awesome-copilo export const GET: APIRoute = () => { const agents = agentsData.items; - const prompts = promptsData.items; const instructions = instructionsData.items; const skills = skillsData.items; @@ -22,7 +20,7 @@ export const GET: APIRoute = () => { // Summary blockquote (optional but recommended) content += - "> A community-driven collection of custom agents, prompts, instructions, and skills to enhance GitHub Copilot experiences across various domains, languages, and use cases.\n\n"; + "> A community-driven collection of custom agents, instructions, and skills to enhance GitHub Copilot experiences across various domains, languages, and use cases.\n\n"; // Add overview section content += "## Overview\n\n"; @@ -30,8 +28,6 @@ export const GET: APIRoute = () => { "This repository provides resources to customize and enhance GitHub Copilot:\n\n"; content += "- **Agents**: Specialized GitHub Copilot agents that integrate with MCP servers\n"; - content += - "- **Prompts**: Task-specific prompts for code generation and problem-solving\n"; content += "- **Instructions**: Coding standards and best practices applied to specific file patterns\n"; content += @@ -47,16 +43,6 @@ export const GET: APIRoute = () => { } content += "\n"; - // Process Prompts - content += "## Prompts\n\n"; - for (const prompt of prompts) { - const description = (prompt.description || "No description available") - .replace(/\s+/g, " ") - .trim(); - content += `- [${prompt.title}](${url(prompt.path)}): ${description}\n`; - } - content += "\n"; - // Process Instructions content += "## Instructions\n\n"; for (const instruction of instructions) { diff --git a/website/src/pages/plugins.astro b/website/src/pages/plugins.astro index 27e203718..f95aa9562 100644 --- a/website/src/pages/plugins.astro +++ b/website/src/pages/plugins.astro @@ -3,12 +3,12 @@ import BaseLayout from '../layouts/BaseLayout.astro'; import Modal from '../components/Modal.astro'; --- - +
diff --git a/website/src/pages/prompts.astro b/website/src/pages/prompts.astro deleted file mode 100644 index 9b7b390a2..000000000 --- a/website/src/pages/prompts.astro +++ /dev/null @@ -1,50 +0,0 @@ ---- -import BaseLayout from '../layouts/BaseLayout.astro'; -import Modal from '../components/Modal.astro'; ---- - - -
- - -
-
- - -
-
- - -
-
- - -
- -
- -
-
-
Loading prompts...
-
-
-
-
- - - - -
diff --git a/website/src/scripts/modal.ts b/website/src/scripts/modal.ts index 3aafc100f..f6c48a144 100644 --- a/website/src/scripts/modal.ts +++ b/website/src/scripts/modal.ts @@ -287,7 +287,7 @@ export function setupInstallDropdown(containerId: string): void { /** * Open file viewer modal * @param filePath - Path to the file - * @param type - Resource type (agent, prompt, instruction, etc.) + * @param type - Resource type (agent, instruction, etc.) * @param updateUrl - Whether to update the URL hash (default: true) * @param trigger - The element that triggered the modal (for focus return) */ diff --git a/website/src/scripts/pages/index.ts b/website/src/scripts/pages/index.ts index e44d4de50..82fbcd12d 100644 --- a/website/src/scripts/pages/index.ts +++ b/website/src/scripts/pages/index.ts @@ -8,7 +8,6 @@ import { setupModal, openFileModal } from '../modal'; interface Manifest { counts: { agents: number; - prompts: number; instructions: number; skills: number; hooks: number; @@ -36,7 +35,7 @@ export async function initHomepage(): Promise { const manifest = await fetchData('manifest.json'); if (manifest && manifest.counts) { // Populate counts in cards - const countKeys = ['agents', 'prompts', 'instructions', 'skills', 'hooks', 'plugins', 'tools'] as const; + const countKeys = ['agents', 'instructions', 'skills', 'hooks', 'plugins', 'tools'] as const; countKeys.forEach(key => { const countEl = document.querySelector(`.card-count[data-count="${key}"]`); if (countEl && manifest.counts[key] !== undefined) { diff --git a/website/src/scripts/pages/prompts.ts b/website/src/scripts/pages/prompts.ts deleted file mode 100644 index 02799ad66..000000000 --- a/website/src/scripts/pages/prompts.ts +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Prompts page functionality - */ -import { createChoices, getChoicesValues, type Choices } from '../choices'; -import { FuzzySearch, SearchItem } from '../search'; -import { fetchData, debounce, escapeHtml, getGitHubUrl, getInstallDropdownHtml, setupDropdownCloseHandlers, getActionButtonsHtml, setupActionHandlers, getLastUpdatedHtml } from '../utils'; -import { setupModal, openFileModal } from '../modal'; - -interface Prompt extends SearchItem { - path: string; - tools?: string[]; - lastUpdated?: string | null; -} - -interface PromptsData { - items: Prompt[]; - filters: { - tools: string[]; - }; -} - -type SortOption = 'title' | 'lastUpdated'; - -const resourceType = 'prompt'; -let allItems: Prompt[] = []; -let search = new FuzzySearch(); -let toolSelect: Choices; -let currentFilters = { tools: [] as string[] }; -let currentSort: SortOption = 'title'; - -function sortItems(items: Prompt[]): Prompt[] { - return [...items].sort((a, b) => { - if (currentSort === 'lastUpdated') { - const dateA = a.lastUpdated ? new Date(a.lastUpdated).getTime() : 0; - const dateB = b.lastUpdated ? new Date(b.lastUpdated).getTime() : 0; - return dateB - dateA; - } - return a.title.localeCompare(b.title); - }); -} - -function applyFiltersAndRender(): void { - const searchInput = document.getElementById('search-input') as HTMLInputElement; - const countEl = document.getElementById('results-count'); - const query = searchInput?.value || ''; - - let results = query ? search.search(query) : [...allItems]; - - if (currentFilters.tools.length > 0) { - results = results.filter(item => - item.tools?.some(tool => currentFilters.tools.includes(tool)) - ); - } - - results = sortItems(results); - - renderItems(results, query); - let countText = `${results.length} of ${allItems.length} prompts`; - if (currentFilters.tools.length > 0) { - countText += ` (filtered by ${currentFilters.tools.length} tool${currentFilters.tools.length > 1 ? 's' : ''})`; - } - if (countEl) countEl.textContent = countText; -} - -function renderItems(items: Prompt[], query = ''): void { - const list = document.getElementById('resource-list'); - if (!list) return; - - if (items.length === 0) { - list.innerHTML = '

No prompts found

Try a different search term or adjust filters

'; - return; - } - - list.innerHTML = items.map(item => ` -
- `).join(''); - - // Add click handlers - list.querySelectorAll('.resource-item').forEach(el => { - el.addEventListener('click', () => { - const path = (el as HTMLElement).dataset.path; - if (path) openFileModal(path, resourceType); - }); - }); -} - -export async function initPromptsPage(): Promise { - const list = document.getElementById('resource-list'); - const searchInput = document.getElementById('search-input') as HTMLInputElement; - const clearFiltersBtn = document.getElementById('clear-filters'); - const sortSelect = document.getElementById('sort-select') as HTMLSelectElement; - - const data = await fetchData('prompts.json'); - if (!data || !data.items) { - if (list) list.innerHTML = '

Failed to load data

'; - return; - } - - allItems = data.items; - search.setItems(allItems); - - toolSelect = createChoices('#filter-tool', { placeholderValue: 'All Tools' }); - toolSelect.setChoices(data.filters.tools.map(t => ({ value: t, label: t })), 'value', 'label', true); - document.getElementById('filter-tool')?.addEventListener('change', () => { - currentFilters.tools = getChoicesValues(toolSelect); - applyFiltersAndRender(); - }); - - sortSelect?.addEventListener('change', () => { - currentSort = sortSelect.value as SortOption; - applyFiltersAndRender(); - }); - - applyFiltersAndRender(); - searchInput?.addEventListener('input', debounce(() => applyFiltersAndRender(), 200)); - - clearFiltersBtn?.addEventListener('click', () => { - currentFilters = { tools: [] }; - currentSort = 'title'; - toolSelect.removeActiveItems(); - if (searchInput) searchInput.value = ''; - if (sortSelect) sortSelect.value = 'title'; - applyFiltersAndRender(); - }); - - setupModal(); - setupDropdownCloseHandlers(); - setupActionHandlers(); -} - -// Auto-initialize when DOM is ready -document.addEventListener('DOMContentLoaded', initPromptsPage); diff --git a/website/src/scripts/utils.ts b/website/src/scripts/utils.ts index 7c17f6fd1..ee6fe2a93 100644 --- a/website/src/scripts/utils.ts +++ b/website/src/scripts/utils.ts @@ -15,10 +15,6 @@ const VSCODE_INSTALL_CONFIG: Record< baseUrl: "https://aka.ms/awesome-copilot/install/instructions", scheme: "chat-instructions", }, - prompt: { - baseUrl: "https://aka.ms/awesome-copilot/install/prompt", - scheme: "chat-prompt", - }, agent: { baseUrl: "https://aka.ms/awesome-copilot/install/agent", scheme: "chat-agent", @@ -93,7 +89,7 @@ export async function copyToClipboard(text: string): Promise { /** * Generate VS Code install URL - * @param type - Resource type (agent, prompt, instructions) + * @param type - Resource type (agent, instructions) * @param filePath - Path to the file * @param insiders - Whether to use VS Code Insiders */ @@ -227,7 +223,6 @@ export function truncate(text: string | undefined, maxLength: number): string { */ export function getResourceType(filePath: string): string { if (filePath.endsWith(".agent.md")) return "agent"; - if (filePath.endsWith(".prompt.md")) return "prompt"; if (filePath.endsWith(".instructions.md")) return "instruction"; if (/(^|\/)skills\//.test(filePath) && filePath.endsWith("SKILL.md")) return "skill"; @@ -246,7 +241,6 @@ export function getResourceType(filePath: string): string { export function formatResourceType(type: string): string { const labels: Record = { agent: "🤖 Agent", - prompt: "🎯 Prompt", instruction: "📋 Instruction", skill: "⚡ Skill", hook: "🪝 Hook", @@ -261,7 +255,6 @@ export function formatResourceType(type: string): string { export function getResourceIcon(type: string): string { const icons: Record = { agent: "🤖", - prompt: "🎯", instruction: "📋", skill: "⚡", hook: "🪝", From a038e281db65e1650e40d154cef139326e212ad5 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Wed, 25 Feb 2026 15:54:15 +1100 Subject: [PATCH 2/8] Add TypeScript config for Astro website Add tsconfig.json extending astro/tsconfigs/base and env.d.ts with Astro client type references to resolve import.meta.env type errors. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- website/src/env.d.ts | 1 + website/tsconfig.json | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 website/src/env.d.ts create mode 100644 website/tsconfig.json diff --git a/website/src/env.d.ts b/website/src/env.d.ts new file mode 100644 index 000000000..f964fe0cf --- /dev/null +++ b/website/src/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/website/tsconfig.json b/website/tsconfig.json new file mode 100644 index 000000000..d78f81ec4 --- /dev/null +++ b/website/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "astro/tsconfigs/base" +} From f5ac9768365f2665a9b846ed39b4a378041a39d6 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Wed, 25 Feb 2026 16:03:02 +1100 Subject: [PATCH 3/8] Add agentic workflows page to website Add a new /workflows/ page for browsing agentic workflow definitions with search, trigger/tag filters, and sorting. Follows the same patterns as the existing hooks page. New files: - website/src/pages/workflows.astro - website/src/scripts/pages/workflows.ts Updated files: - BaseLayout.astro: add Workflows nav link - index.astro: add Workflows card to homepage - pages/index.ts: add workflows to counts - utils.ts: add workflow type to icons, labels, and getResourceType Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- website/src/layouts/BaseLayout.astro | 4 + website/src/pages/index.astro | 8 + website/src/pages/workflows.astro | 54 ++++++ website/src/scripts/pages/index.ts | 3 +- website/src/scripts/pages/workflows.ts | 235 +++++++++++++++++++++++++ website/src/scripts/utils.ts | 4 + 6 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 website/src/pages/workflows.astro create mode 100644 website/src/scripts/pages/workflows.ts diff --git a/website/src/layouts/BaseLayout.astro b/website/src/layouts/BaseLayout.astro index 6f114e9c9..5efa9caef 100644 --- a/website/src/layouts/BaseLayout.astro +++ b/website/src/layouts/BaseLayout.astro @@ -70,6 +70,10 @@ try { href={`${base}hooks/`} class:list={[{ active: activeNav === "hooks" }]}>Hooks + Workflows
-
+ + +
+

Workflows

+

AI-powered automations for GitHub Actions

+
+
-
+
diff --git a/website/src/pages/workflows.astro b/website/src/pages/workflows.astro new file mode 100644 index 000000000..5f4074d24 --- /dev/null +++ b/website/src/pages/workflows.astro @@ -0,0 +1,54 @@ +--- +import BaseLayout from '../layouts/BaseLayout.astro'; +import Modal from '../components/Modal.astro'; +--- + + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+
+
Loading workflows...
+
+
+
+
+ + + + +
diff --git a/website/src/scripts/pages/index.ts b/website/src/scripts/pages/index.ts index 82fbcd12d..54dac8ded 100644 --- a/website/src/scripts/pages/index.ts +++ b/website/src/scripts/pages/index.ts @@ -11,6 +11,7 @@ interface Manifest { instructions: number; skills: number; hooks: number; + workflows: number; plugins: number; tools: number; }; @@ -35,7 +36,7 @@ export async function initHomepage(): Promise { const manifest = await fetchData('manifest.json'); if (manifest && manifest.counts) { // Populate counts in cards - const countKeys = ['agents', 'instructions', 'skills', 'hooks', 'plugins', 'tools'] as const; + const countKeys = ['agents', 'instructions', 'skills', 'hooks', 'workflows', 'plugins', 'tools'] as const; countKeys.forEach(key => { const countEl = document.querySelector(`.card-count[data-count="${key}"]`); if (countEl && manifest.counts[key] !== undefined) { diff --git a/website/src/scripts/pages/workflows.ts b/website/src/scripts/pages/workflows.ts new file mode 100644 index 000000000..ea76d5694 --- /dev/null +++ b/website/src/scripts/pages/workflows.ts @@ -0,0 +1,235 @@ +/** + * Workflows page functionality + */ +import { createChoices, getChoicesValues, type Choices } from "../choices"; +import { FuzzySearch, type SearchItem } from "../search"; +import { + fetchData, + debounce, + escapeHtml, + getGitHubUrl, + getActionButtonsHtml, + setupActionHandlers, + getLastUpdatedHtml, +} from "../utils"; +import { setupModal, openFileModal } from "../modal"; + +interface Workflow extends SearchItem { + id: string; + path: string; + triggers: string[]; + tags: string[]; + lastUpdated?: string | null; +} + +interface WorkflowsData { + items: Workflow[]; + filters: { + triggers: string[]; + tags: string[]; + }; +} + +type SortOption = "title" | "lastUpdated"; + +const resourceType = "workflow"; +let allItems: Workflow[] = []; +let search = new FuzzySearch(); +let triggerSelect: Choices; +let tagSelect: Choices; +let currentFilters = { + triggers: [] as string[], + tags: [] as string[], +}; +let currentSort: SortOption = "title"; + +function sortItems(items: Workflow[]): Workflow[] { + return [...items].sort((a, b) => { + if (currentSort === "lastUpdated") { + const dateA = a.lastUpdated ? new Date(a.lastUpdated).getTime() : 0; + const dateB = b.lastUpdated ? new Date(b.lastUpdated).getTime() : 0; + return dateB - dateA; + } + return a.title.localeCompare(b.title); + }); +} + +function applyFiltersAndRender(): void { + const searchInput = document.getElementById( + "search-input" + ) as HTMLInputElement; + const countEl = document.getElementById("results-count"); + const query = searchInput?.value || ""; + + let results = query ? search.search(query) : [...allItems]; + + if (currentFilters.triggers.length > 0) { + results = results.filter((item) => + item.triggers.some((t) => currentFilters.triggers.includes(t)) + ); + } + if (currentFilters.tags.length > 0) { + results = results.filter((item) => + item.tags.some((t) => currentFilters.tags.includes(t)) + ); + } + + results = sortItems(results); + + renderItems(results, query); + const activeFilters: string[] = []; + if (currentFilters.triggers.length > 0) + activeFilters.push( + `${currentFilters.triggers.length} trigger${ + currentFilters.triggers.length > 1 ? "s" : "" + }` + ); + if (currentFilters.tags.length > 0) + activeFilters.push( + `${currentFilters.tags.length} tag${ + currentFilters.tags.length > 1 ? "s" : "" + }` + ); + let countText = `${results.length} of ${allItems.length} workflows`; + if (activeFilters.length > 0) { + countText += ` (filtered by ${activeFilters.join(", ")})`; + } + if (countEl) countEl.textContent = countText; +} + +function renderItems(items: Workflow[], query = ""): void { + const list = document.getElementById("resource-list"); + if (!list) return; + + if (items.length === 0) { + list.innerHTML = + '

No workflows found

Try a different search term or adjust filters

'; + return; + } + + list.innerHTML = items + .map( + (item) => ` +
+ ` + ) + .join(""); + + // Add click handlers for opening modal + list.querySelectorAll(".resource-item").forEach((el) => { + el.addEventListener("click", (e) => { + if ((e.target as HTMLElement).closest(".resource-actions")) return; + const path = (el as HTMLElement).dataset.path; + if (path) openFileModal(path, resourceType); + }); + }); +} + +export async function initWorkflowsPage(): Promise { + const list = document.getElementById("resource-list"); + const searchInput = document.getElementById( + "search-input" + ) as HTMLInputElement; + const clearFiltersBtn = document.getElementById("clear-filters"); + const sortSelect = document.getElementById( + "sort-select" + ) as HTMLSelectElement; + + const data = await fetchData("workflows.json"); + if (!data || !data.items) { + if (list) + list.innerHTML = + '

Failed to load data

'; + return; + } + + allItems = data.items; + search.setItems(allItems); + + // Setup trigger filter + triggerSelect = createChoices("#filter-trigger", { + placeholderValue: "All Triggers", + }); + triggerSelect.setChoices( + data.filters.triggers.map((t) => ({ value: t, label: t })), + "value", + "label", + true + ); + document.getElementById("filter-trigger")?.addEventListener("change", () => { + currentFilters.triggers = getChoicesValues(triggerSelect); + applyFiltersAndRender(); + }); + + // Setup tag filter + tagSelect = createChoices("#filter-tag", { + placeholderValue: "All Tags", + }); + tagSelect.setChoices( + data.filters.tags.map((t) => ({ value: t, label: t })), + "value", + "label", + true + ); + document.getElementById("filter-tag")?.addEventListener("change", () => { + currentFilters.tags = getChoicesValues(tagSelect); + applyFiltersAndRender(); + }); + + sortSelect?.addEventListener("change", () => { + currentSort = sortSelect.value as SortOption; + applyFiltersAndRender(); + }); + + applyFiltersAndRender(); + searchInput?.addEventListener( + "input", + debounce(() => applyFiltersAndRender(), 200) + ); + + clearFiltersBtn?.addEventListener("click", () => { + currentFilters = { triggers: [], tags: [] }; + currentSort = "title"; + triggerSelect.removeActiveItems(); + tagSelect.removeActiveItems(); + if (searchInput) searchInput.value = ""; + if (sortSelect) sortSelect.value = "title"; + applyFiltersAndRender(); + }); + + setupModal(); + setupActionHandlers(); +} + +// Auto-initialize when DOM is ready +document.addEventListener("DOMContentLoaded", initWorkflowsPage); diff --git a/website/src/scripts/utils.ts b/website/src/scripts/utils.ts index ee6fe2a93..6ea978539 100644 --- a/website/src/scripts/utils.ts +++ b/website/src/scripts/utils.ts @@ -228,6 +228,8 @@ export function getResourceType(filePath: string): string { return "skill"; if (/(^|\/)hooks\//.test(filePath) && filePath.endsWith("README.md")) return "hook"; + if (/(^|\/)workflows\//.test(filePath) && filePath.endsWith(".md")) + return "workflow"; // Check for plugin directories (e.g., plugins/, plugins//) if (/(^|\/)plugins\/[^/]+\/?$/.test(filePath)) return "plugin"; // Check for plugin.json files (e.g., plugins//.github/plugin/plugin.json) @@ -244,6 +246,7 @@ export function formatResourceType(type: string): string { instruction: "📋 Instruction", skill: "⚡ Skill", hook: "🪝 Hook", + workflow: "⚡ Workflow", plugin: "🔌 Plugin", }; return labels[type] || type; @@ -258,6 +261,7 @@ export function getResourceIcon(type: string): string { instruction: "📋", skill: "⚡", hook: "🪝", + workflow: "⚡", plugin: "🔌", }; return icons[type] || "📄"; From 6fc9e9375a77b8f21fe06b257497c3fbb7c1571b Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Wed, 25 Feb 2026 16:13:04 +1100 Subject: [PATCH 4/8] Fix type-only imports for SearchItem across page scripts Use 'type' modifier on SearchItem imports to satisfy verbatimModuleSyntax. Without this, esbuild strips the interface export but leaves the value import, causing a runtime error. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- website/src/scripts/pages/agents.ts | 2 +- website/src/scripts/pages/hooks.ts | 2 +- website/src/scripts/pages/instructions.ts | 2 +- website/src/scripts/pages/plugins.ts | 2 +- website/src/scripts/pages/skills.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/website/src/scripts/pages/agents.ts b/website/src/scripts/pages/agents.ts index 28a822af2..cb32dc2b4 100644 --- a/website/src/scripts/pages/agents.ts +++ b/website/src/scripts/pages/agents.ts @@ -2,7 +2,7 @@ * Agents page functionality */ import { createChoices, getChoicesValues, type Choices } from '../choices'; -import { FuzzySearch, SearchItem } from '../search'; +import { FuzzySearch, type SearchItem } from '../search'; import { fetchData, debounce, escapeHtml, getGitHubUrl, getInstallDropdownHtml, setupDropdownCloseHandlers, getActionButtonsHtml, setupActionHandlers, getLastUpdatedHtml } from '../utils'; import { setupModal, openFileModal } from '../modal'; diff --git a/website/src/scripts/pages/hooks.ts b/website/src/scripts/pages/hooks.ts index 2373c80cc..7a8667e6d 100644 --- a/website/src/scripts/pages/hooks.ts +++ b/website/src/scripts/pages/hooks.ts @@ -2,7 +2,7 @@ * Hooks page functionality */ import { createChoices, getChoicesValues, type Choices } from "../choices"; -import { FuzzySearch, SearchItem } from "../search"; +import { FuzzySearch, type SearchItem } from "../search"; import { fetchData, debounce, diff --git a/website/src/scripts/pages/instructions.ts b/website/src/scripts/pages/instructions.ts index 0501ec42c..a4d89823c 100644 --- a/website/src/scripts/pages/instructions.ts +++ b/website/src/scripts/pages/instructions.ts @@ -2,7 +2,7 @@ * Instructions page functionality */ import { createChoices, getChoicesValues, type Choices } from '../choices'; -import { FuzzySearch, SearchItem } from '../search'; +import { FuzzySearch, type SearchItem } from '../search'; import { fetchData, debounce, escapeHtml, getGitHubUrl, getInstallDropdownHtml, setupDropdownCloseHandlers, getActionButtonsHtml, setupActionHandlers, getLastUpdatedHtml } from '../utils'; import { setupModal, openFileModal } from '../modal'; diff --git a/website/src/scripts/pages/plugins.ts b/website/src/scripts/pages/plugins.ts index 53e94f200..32968b6b3 100644 --- a/website/src/scripts/pages/plugins.ts +++ b/website/src/scripts/pages/plugins.ts @@ -2,7 +2,7 @@ * Plugins page functionality */ import { createChoices, getChoicesValues, type Choices } from '../choices'; -import { FuzzySearch, SearchItem } from '../search'; +import { FuzzySearch, type SearchItem } from '../search'; import { fetchData, debounce, escapeHtml, getGitHubUrl } from '../utils'; import { setupModal, openFileModal } from '../modal'; diff --git a/website/src/scripts/pages/skills.ts b/website/src/scripts/pages/skills.ts index e079ff4ec..5e58c3368 100644 --- a/website/src/scripts/pages/skills.ts +++ b/website/src/scripts/pages/skills.ts @@ -2,7 +2,7 @@ * Skills page functionality */ import { createChoices, getChoicesValues, type Choices } from "../choices"; -import { FuzzySearch, SearchItem } from "../search"; +import { FuzzySearch, type SearchItem } from "../search"; import { fetchData, debounce, From 83aed9e9743fb410407108867a0e8f77efd1db3e Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Wed, 25 Feb 2026 16:23:49 +1100 Subject: [PATCH 5/8] Extract workflow triggers from 'on' frontmatter field, drop tags Update parseWorkflowMetadata to extract triggers from the 'on' property keys (e.g. schedule, issue_comment) instead of a separate 'triggers' field. Remove tags support from workflows since workflows don't use tags. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/generate-website-data.mjs | 11 ++------ eng/yaml-parser.mjs | 11 ++++++-- website/src/pages/workflows.astro | 4 --- website/src/scripts/pages/workflows.ts | 39 +------------------------- 4 files changed, 11 insertions(+), 54 deletions(-) diff --git a/eng/generate-website-data.mjs b/eng/generate-website-data.mjs index c302b9524..9b145bd5b 100644 --- a/eng/generate-website-data.mjs +++ b/eng/generate-website-data.mjs @@ -204,7 +204,6 @@ function generateWorkflowsData(gitDates) { items: workflows, filters: { triggers: [], - tags: [], }, }; } @@ -214,7 +213,6 @@ function generateWorkflowsData(gitDates) { }); const allTriggers = new Set(); - const allTags = new Set(); for (const file of workflowFiles) { const filePath = path.join(WORKFLOWS_DIR, file); @@ -226,7 +224,6 @@ function generateWorkflowsData(gitDates) { .replace(/\\/g, "/"); (metadata.triggers || []).forEach((t) => allTriggers.add(t)); - (metadata.tags || []).forEach((t) => allTags.add(t)); const id = path.basename(file, ".md"); workflows.push({ @@ -234,7 +231,6 @@ function generateWorkflowsData(gitDates) { title: metadata.name, description: metadata.description, triggers: metadata.triggers || [], - tags: metadata.tags || [], path: relativePath, lastUpdated: gitDates.get(relativePath) || null, }); @@ -248,7 +244,6 @@ function generateWorkflowsData(gitDates) { items: sortedWorkflows, filters: { triggers: Array.from(allTriggers).sort(), - tags: Array.from(allTags).sort(), }, }; } @@ -682,9 +677,7 @@ function generateSearchIndex( lastUpdated: workflow.lastUpdated, searchText: `${workflow.title} ${ workflow.description - } ${workflow.triggers.join(" ")} ${workflow.tags.join( - " " - )}`.toLowerCase(), + } ${workflow.triggers.join(" ")}`.toLowerCase(), }); } @@ -843,7 +836,7 @@ async function main() { const workflowsData = generateWorkflowsData(gitDates); const workflows = workflowsData.items; console.log( - `✓ Generated ${workflows.length} workflows (${workflowsData.filters.triggers.length} triggers, ${workflowsData.filters.tags.length} tags)` + `✓ Generated ${workflows.length} workflows (${workflowsData.filters.triggers.length} triggers)` ); const instructionsData = generateInstructionsData(gitDates); diff --git a/eng/yaml-parser.mjs b/eng/yaml-parser.mjs index 88d16582f..27aeaf0d2 100644 --- a/eng/yaml-parser.mjs +++ b/eng/yaml-parser.mjs @@ -275,14 +275,19 @@ function parseWorkflowMetadata(filePath) { return null; } - // Extract triggers from frontmatter if present - const triggers = frontmatter.triggers || []; + // Extract triggers from the 'on' field (top-level keys) + const onField = frontmatter.on; + const triggers = []; + if (onField && typeof onField === "object") { + triggers.push(...Object.keys(onField)); + } else if (typeof onField === "string") { + triggers.push(onField); + } return { name: frontmatter.name, description: frontmatter.description, triggers, - tags: frontmatter.tags || [], path: filePath, }; }, diff --git a/website/src/pages/workflows.astro b/website/src/pages/workflows.astro index 5f4074d24..fc91bc043 100644 --- a/website/src/pages/workflows.astro +++ b/website/src/pages/workflows.astro @@ -24,10 +24,6 @@ import Modal from '../components/Modal.astro';
-
- - -
- +
@@ -32,7 +32,7 @@ import Modal from '../components/Modal.astro';
- +
Loading plugins...