diff --git a/docs/README.workflows.md b/docs/README.workflows.md index abd23819b..1675151f0 100644 --- a/docs/README.workflows.md +++ b/docs/README.workflows.md @@ -33,4 +33,4 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-agentic-workflows) for guideline | Name | Description | Triggers | | ---- | ----------- | -------- | -| [Daily Issues Report](../workflows/daily-issues-report.md) | Generates a daily summary of open issues and recent activity as a GitHub issue | N/A | +| [Daily Issues Report](../workflows/daily-issues-report.md) | Generates a daily summary of open issues and recent activity as a GitHub issue | schedule | 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/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/src/layouts/BaseLayout.astro b/website/src/layouts/BaseLayout.astro index d89f0cc8b..5efa9caef 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 Hooks + Workflows

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

-
-
-
-
@@ -65,6 +57,14 @@ const base = import.meta.env.BASE_URL;
-
+ + +
+

Workflows

+

AI-powered automations for GitHub Actions

+
+
-
+
@@ -103,7 +103,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..f5f7ba022 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'; --- - +
@@ -18,7 +18,7 @@ import Modal from '../components/Modal.astro';
- +
@@ -32,7 +32,7 @@ import Modal from '../components/Modal.astro';
- +
Loading plugins...
diff --git a/website/src/pages/prompts.astro b/website/src/pages/workflows.astro similarity index 64% rename from website/src/pages/prompts.astro rename to website/src/pages/workflows.astro index 9b7b390a2..fc91bc043 100644 --- a/website/src/pages/prompts.astro +++ b/website/src/pages/workflows.astro @@ -3,26 +3,26 @@ import BaseLayout from '../layouts/BaseLayout.astro'; import Modal from '../components/Modal.astro'; --- - +
- - + +
@@ -36,7 +36,7 @@ import Modal from '../components/Modal.astro';
-
Loading prompts...
+
Loading workflows...
@@ -45,6 +45,6 @@ import Modal from '../components/Modal.astro'; 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/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/index.ts b/website/src/scripts/pages/index.ts index e44d4de50..54dac8ded 100644 --- a/website/src/scripts/pages/index.ts +++ b/website/src/scripts/pages/index.ts @@ -8,10 +8,10 @@ import { setupModal, openFileModal } from '../modal'; interface Manifest { counts: { agents: number; - prompts: number; instructions: number; skills: number; hooks: number; + workflows: number; plugins: number; tools: number; }; @@ -36,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', 'prompts', '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/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/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/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, diff --git a/website/src/scripts/pages/workflows.ts b/website/src/scripts/pages/workflows.ts new file mode 100644 index 000000000..e320b9903 --- /dev/null +++ b/website/src/scripts/pages/workflows.ts @@ -0,0 +1,198 @@ +/** + * 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[]; + lastUpdated?: string | null; +} + +interface WorkflowsData { + items: Workflow[]; + filters: { + triggers: string[]; + }; +} + +type SortOption = "title" | "lastUpdated"; + +const resourceType = "workflow"; +let allItems: Workflow[] = []; +let search = new FuzzySearch(); +let triggerSelect: Choices; +let currentFilters = { + triggers: [] 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)) + ); + } + + 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" : "" + }` + ); + 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) => ` +
+
+
${ + query ? search.highlight(item.title, query) : escapeHtml(item.title) + }
+
${escapeHtml( + item.description || "No description" + )}
+
+ ${item.triggers + .map( + (t) => + `${escapeHtml(t)}` + ) + .join("")} + ${getLastUpdatedHtml(item.lastUpdated)} +
+
+
+ ${getActionButtonsHtml(item.path)} + GitHub +
+
+ ` + ) + .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(); + }); + + sortSelect?.addEventListener("change", () => { + currentSort = sortSelect.value as SortOption; + applyFiltersAndRender(); + }); + + applyFiltersAndRender(); + searchInput?.addEventListener( + "input", + debounce(() => applyFiltersAndRender(), 200) + ); + + clearFiltersBtn?.addEventListener("click", () => { + currentFilters = { triggers: [] }; + currentSort = "title"; + triggerSelect.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 7c17f6fd1..33eedaab7 100644 --- a/website/src/scripts/utils.ts +++ b/website/src/scripts/utils.ts @@ -15,9 +15,9 @@ 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", + instruction: { + baseUrl: "https://aka.ms/awesome-copilot/install/instructions", + scheme: "chat-instructions", }, agent: { baseUrl: "https://aka.ms/awesome-copilot/install/agent", @@ -93,7 +93,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,12 +227,13 @@ 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"; 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) @@ -246,10 +247,10 @@ 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", + workflow: "⚡ Workflow", plugin: "🔌 Plugin", }; return labels[type] || type; @@ -261,10 +262,10 @@ export function formatResourceType(type: string): string { export function getResourceIcon(type: string): string { const icons: Record = { agent: "🤖", - prompt: "🎯", instruction: "📋", skill: "⚡", hook: "🪝", + workflow: "⚡", plugin: "🔌", }; return icons[type] || "📄"; 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" +}