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>
This commit is contained in:
Aaron Powell
2026-02-25 15:54:09 +11:00
parent 2cb6bde4fb
commit 5bff7cadc0
9 changed files with 9 additions and 242 deletions

View File

@@ -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)
*/

View File

@@ -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<void> {
const manifest = await fetchData<Manifest>('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) {

View File

@@ -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<Prompt>();
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 = '<div class="empty-state"><h3>No prompts found</h3><p>Try a different search term or adjust filters</p></div>';
return;
}
list.innerHTML = items.map(item => `
<div class="resource-item" data-path="${escapeHtml(item.path)}">
<div class="resource-info">
<div class="resource-title">${query ? search.highlight(item.title, query) : escapeHtml(item.title)}</div>
<div class="resource-description">${escapeHtml(item.description || 'No description')}</div>
<div class="resource-meta">
${item.tools?.slice(0, 4).map(t => `<span class="resource-tag">${escapeHtml(t)}</span>`).join('') || ''}
${item.tools && item.tools.length > 4 ? `<span class="resource-tag">+${item.tools.length - 4} more</span>` : ''}
${getLastUpdatedHtml(item.lastUpdated)}
</div>
</div>
<div class="resource-actions">
${getInstallDropdownHtml(resourceType, item.path, true)}
${getActionButtonsHtml(item.path, true)}
<a href="${getGitHubUrl(item.path)}" class="btn btn-secondary btn-small" target="_blank" onclick="event.stopPropagation()" title="View on GitHub">
GitHub
</a>
</div>
</div>
`).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<void> {
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<PromptsData>('prompts.json');
if (!data || !data.items) {
if (list) list.innerHTML = '<div class="empty-state"><h3>Failed to load data</h3></div>';
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);

View File

@@ -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<boolean> {
/**
* 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<string, string> = {
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<string, string> = {
agent: "🤖",
prompt: "🎯",
instruction: "📋",
skill: "⚡",
hook: "🪝",