Add Agentic Workflows as a new resource type

Add support for contributing Agentic Workflows — AI-powered repository
automations that run coding agents in GitHub Actions, defined in markdown
with natural language instructions (https://github.github.com/gh-aw).

Changes:
- Create workflows/ directory for community-contributed workflows
- Add workflow metadata parsing (yaml-parser.mjs)
- Add workflow README generation (update-readme.mjs, constants.mjs)
- Add workflow data to website generation (generate-website-data.mjs)
- Update README.md, CONTRIBUTING.md, and AGENTS.md with workflow docs,
  contributing guidelines, and code review checklists

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Bruno Borges
2026-02-20 15:28:28 -08:00
parent 7bebd4a385
commit 997d6302bd
9 changed files with 402 additions and 7 deletions

View File

@@ -17,12 +17,14 @@ import {
TEMPLATES,
vscodeInsidersInstallImage,
vscodeInstallImage,
WORKFLOWS_DIR,
} from "./constants.mjs";
import {
extractMcpServerConfigs,
parseFrontmatter,
parseSkillMetadata,
parseHookMetadata,
parseWorkflowMetadata,
} from "./yaml-parser.mjs";
const __filename = fileURLToPath(import.meta.url);
@@ -577,6 +579,67 @@ function generateHooksSection(hooksDir) {
return `${TEMPLATES.hooksSection}\n${TEMPLATES.hooksUsage}\n\n${content}`;
}
/**
* Generate the workflows section with a table of all agentic workflows
*/
function generateWorkflowsSection(workflowsDir) {
if (!fs.existsSync(workflowsDir)) {
console.log(`Workflows directory does not exist: ${workflowsDir}`);
return "";
}
// Get all workflow folders (directories)
const workflowFolders = fs.readdirSync(workflowsDir).filter((file) => {
const filePath = path.join(workflowsDir, file);
return fs.statSync(filePath).isDirectory();
});
// Parse each workflow folder
const workflowEntries = workflowFolders
.map((folder) => {
const workflowPath = path.join(workflowsDir, folder);
const metadata = parseWorkflowMetadata(workflowPath);
if (!metadata) return null;
return {
folder,
name: metadata.name,
description: metadata.description,
triggers: metadata.triggers,
tags: metadata.tags,
assets: metadata.assets,
};
})
.filter((entry) => entry !== null)
.sort((a, b) => a.name.localeCompare(b.name));
console.log(`Found ${workflowEntries.length} workflow(s)`);
if (workflowEntries.length === 0) {
return "";
}
// Create table header
let content =
"| Name | Description | Triggers | Bundled Assets |\n| ---- | ----------- | -------- | -------------- |\n";
// Generate table rows for each workflow
for (const workflow of workflowEntries) {
const link = `../workflows/${workflow.folder}/README.md`;
const triggers = workflow.triggers.length > 0 ? workflow.triggers.join(", ") : "N/A";
const assetsList =
workflow.assets.length > 0
? workflow.assets.map((a) => `\`${a}\``).join("<br />")
: "None";
content += `| [${workflow.name}](${link}) | ${formatTableCell(
workflow.description
)} | ${triggers} | ${assetsList} |\n`;
}
return `${TEMPLATES.workflowsSection}\n${TEMPLATES.workflowsUsage}\n\n${content}`;
}
/**
* Generate the skills section with a table of all skills
*/
@@ -921,6 +984,7 @@ async function main() {
const promptsHeader = TEMPLATES.promptsSection.replace(/^##\s/m, "# ");
const agentsHeader = TEMPLATES.agentsSection.replace(/^##\s/m, "# ");
const hooksHeader = TEMPLATES.hooksSection.replace(/^##\s/m, "# ");
const workflowsHeader = TEMPLATES.workflowsSection.replace(/^##\s/m, "# ");
const skillsHeader = TEMPLATES.skillsSection.replace(/^##\s/m, "# ");
const pluginsHeader = TEMPLATES.pluginsSection.replace(
/^##\s/m,
@@ -959,6 +1023,15 @@ async function main() {
registryNames
);
// Generate workflows README
const workflowsReadme = buildCategoryReadme(
generateWorkflowsSection,
WORKFLOWS_DIR,
workflowsHeader,
TEMPLATES.workflowsUsage,
registryNames
);
// Generate skills README
const skillsReadme = buildCategoryReadme(
generateSkillsSection,
@@ -990,6 +1063,7 @@ async function main() {
writeFileIfChanged(path.join(DOCS_DIR, "README.prompts.md"), promptsReadme);
writeFileIfChanged(path.join(DOCS_DIR, "README.agents.md"), agentsReadme);
writeFileIfChanged(path.join(DOCS_DIR, "README.hooks.md"), hooksReadme);
writeFileIfChanged(path.join(DOCS_DIR, "README.workflows.md"), workflowsReadme);
writeFileIfChanged(path.join(DOCS_DIR, "README.skills.md"), skillsReadme);
writeFileIfChanged(
path.join(DOCS_DIR, "README.plugins.md"),