mirror of
https://github.com/github/awesome-copilot.git
synced 2026-02-24 12:25:11 +00:00
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:
@@ -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"),
|
||||
|
||||
Reference in New Issue
Block a user