From 1322aa2dde39898083ba0a71fa9626922c6f3472 Mon Sep 17 00:00:00 2001 From: Ashley Childress <6563688+anchildress1@users.noreply.github.com> Date: Fri, 19 Dec 2025 20:43:27 -0500 Subject: [PATCH 01/15] feat(eng): add contributor reporting and management scripts - Add eng/README.md documenting maintainer utilities - Add eng/contributor-report.mjs for generating contributor reports - Add eng/add-missing-contributors.mjs for automating contributor additions - Add eng/utils/graceful-shutdown.mjs for script lifecycle management - Update eng/update-readme.mjs with minor fixes - Update package.json with new contributor scripts Generated-by: GitHub Copilot Signed-off-by: Ashley Childress <6563688+anchildress1@users.noreply.github.com> --- .all-contributorsrc | 2050 +++++++++++++++++++--------- .github/workflows/contributors.yml | 40 +- .gitignore | 1 + CONTRIBUTING.md | 37 +- README.md | 301 ++-- eng/README.md | 36 + eng/add-missing-contributors.mjs | 306 +++++ eng/contributor-report.mjs | 597 ++++++++ eng/utils/graceful-shutdown.mjs | 60 + package.json | 5 +- 10 files changed, 2634 insertions(+), 799 deletions(-) create mode 100644 eng/README.md create mode 100644 eng/add-missing-contributors.mjs create mode 100644 eng/contributor-report.mjs create mode 100644 eng/utils/graceful-shutdown.mjs diff --git a/.all-contributorsrc b/.all-contributorsrc index 8372d6ac..bd9775d3 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -9,6 +9,35 @@ "imageSize": 100, "commit": false, "commitConvention": "none", + "contributorsPerLine": 7, + "linkToUsage": true, + "commitType": "docs", + "types": { + "instructions": { + "symbol": "🧭", + "description": "Custom instructions for GitHub Copilot" + }, + "prompts": { + "symbol": "⌨️", + "description": "Reusable prompts for GitHub Copilot" + }, + "agents": { + "symbol": "🎭", + "description": "Specialized agents for GitHub Copilot" + }, + "collections": { + "symbol": "🎁", + "description": "Curated collections of related content" + } + }, + "ignoreList": [ + "dependabot[bot]", + "github-actions[bot]", + "allcontributors[bot]", + "Copilot", + "Claude" + ], + "contributorsSortAlphabetically": false, "contributors": [ { "login": "aaronpowell", @@ -16,136 +45,13 @@ "avatar_url": "https://avatars.githubusercontent.com/u/434140?v=4", "profile": "https://www.aaron-powell.com/", "contributions": [ - "code", + "agents", + "collections", + "doc", + "infra", + "instructions", "maintenance", - "projectManagement", - "promotion" - ] - }, - { - "login": "mubaidr", - "name": "Muhammad Ubaid Raza", - "avatar_url": "https://avatars.githubusercontent.com/u/2222702?v=4", - "profile": "https://mubaidr.js.org/", - "contributions": [ - "code" - ] - }, - { - "login": "digitarald", - "name": "Harald Kirschner", - "avatar_url": "https://avatars.githubusercontent.com/u/8599?v=4", - "profile": "http://digitarald.de/", - "contributions": [ - "code" - ] - }, - { - "login": "mbianchidev", - "name": "Matteo Bianchi", - "avatar_url": "https://avatars.githubusercontent.com/u/37507190?v=4", - "profile": "https://github.com/mbianchidev", - "contributions": [ - "code" - ] - }, - { - "login": "AungMyoKyaw", - "name": "Aung Myo Kyaw", - "avatar_url": "https://avatars.githubusercontent.com/u/9404824?v=4", - "profile": "https://github.com/AungMyoKyaw", - "contributions": [ - "code" - ] - }, - { - "login": "PlagueHO", - "name": "Daniel Scott-Raynsford", - "avatar_url": "https://avatars.githubusercontent.com/u/7589164?v=4", - "profile": "https://danielscottraynsford.com/", - "contributions": [ - "code" - ] - }, - { - "login": "burkeholland", - "name": "Burke Holland", - "avatar_url": "https://avatars.githubusercontent.com/u/686963?v=4", - "profile": "https://github.com/burkeholland", - "contributions": [ - "code" - ] - }, - { - "login": "PEZ", - "name": "Peter Strömberg", - "avatar_url": "https://avatars.githubusercontent.com/u/30010?v=4", - "profile": "https://calva.io/", - "contributions": [ - "code" - ] - }, - { - "login": "danielmeppiel", - "name": "Daniel Meppiel", - "avatar_url": "https://avatars.githubusercontent.com/u/51440732?v=4", - "profile": "https://www.devprodlogs.com/", - "contributions": [ - "code" - ] - }, - { - "login": "jamesmontemagno", - "name": "James Montemagno", - "avatar_url": "https://avatars.githubusercontent.com/u/1676321?v=4", - "profile": "https://montemagno.com/", - "contributions": [ - "code" - ] - }, - { - "login": "VamshiVerma", - "name": "Vamshi Verma", - "avatar_url": "https://avatars.githubusercontent.com/u/21999324?v=4", - "profile": "https://github.com/VamshiVerma", - "contributions": [ - "code" - ] - }, - { - "login": "sinedied", - "name": "Yohan Lasorsa", - "avatar_url": "https://avatars.githubusercontent.com/u/593151?v=4", - "profile": "https://github.com/sinedied", - "contributions": [ - "code" - ] - }, - { - "login": "OrenMe", - "name": "Oren Me", - "avatar_url": "https://avatars.githubusercontent.com/u/5461862?v=4", - "profile": "https://github.com/OrenMe", - "contributions": [ - "code" - ] - }, - { - "login": "mjrousos", - "name": "Mike Rousos", - "avatar_url": "https://avatars.githubusercontent.com/u/10077254?v=4", - "profile": "https://github.com/mjrousos", - "contributions": [ - "code" - ] - }, - { - "login": "guiopen", - "name": "Guilherme do Amaral Alves ", - "avatar_url": "https://avatars.githubusercontent.com/u/94094527?v=4", - "profile": "https://github.com/guiopen", - "contributions": [ - "code" + "prompts" ] }, { @@ -154,7 +60,137 @@ "avatar_url": "https://avatars.githubusercontent.com/u/44444967?v=4", "profile": "https://www.buymeacoffee.com/troystaylor", "contributions": [ - "code" + "agents", + "collections", + "instructions", + "prompts" + ] + }, + { + "login": "PEZ", + "name": "Peter Strömberg", + "avatar_url": "https://avatars.githubusercontent.com/u/30010?v=4", + "profile": "https://calva.io/", + "contributions": [ + "agents", + "collections", + "instructions", + "prompts" + ] + }, + { + "login": "PlagueHO", + "name": "Daniel Scott-Raynsford", + "avatar_url": "https://avatars.githubusercontent.com/u/7589164?v=4", + "profile": "https://danielscottraynsford.com/", + "contributions": [ + "agents", + "collections", + "instructions", + "prompts" + ] + }, + { + "login": "jhauga", + "name": "John Haugabook", + "avatar_url": "https://avatars.githubusercontent.com/u/10998676?v=4", + "profile": "https://github.com/jhauga", + "contributions": [ + "instructions", + "prompts" + ] + }, + { + "login": "mubaidr", + "name": "Muhammad Ubaid Raza", + "avatar_url": "https://avatars.githubusercontent.com/u/2222702?v=4", + "profile": "https://mubaidr.js.org/", + "contributions": [ + "agents", + "instructions" + ] + }, + { + "login": "AungMyoKyaw", + "name": "Aung Myo Kyaw", + "avatar_url": "https://avatars.githubusercontent.com/u/9404824?v=4", + "profile": "https://www.aungmyokyaw.com/", + "contributions": [ + "agents", + "prompts" + ] + }, + { + "login": "digitarald", + "name": "Harald Kirschner", + "avatar_url": "https://avatars.githubusercontent.com/u/8599?v=4", + "profile": "http://digitarald.de/", + "contributions": [ + "doc", + "maintenance" + ] + }, + { + "login": "burkeholland", + "name": "Burke Holland", + "avatar_url": "https://avatars.githubusercontent.com/u/686963?v=4", + "profile": "https://github.com/burkeholland", + "contributions": [ + "agents", + "infra", + "instructions", + "prompts" + ] + }, + { + "login": "danielmeppiel", + "name": "Daniel Meppiel", + "avatar_url": "https://avatars.githubusercontent.com/u/51440732?v=4", + "profile": "https://www.devprodlogs.com/", + "contributions": [ + "prompts" + ] + }, + { + "login": "jamesmontemagno", + "name": "James Montemagno", + "avatar_url": "https://avatars.githubusercontent.com/u/1676321?v=4", + "profile": "https://montemagno.com/", + "contributions": [ + "agents", + "doc", + "instructions", + "prompts" + ] + }, + { + "login": "VamshiVerma", + "name": "Vamshi Verma", + "avatar_url": "https://avatars.githubusercontent.com/u/21999324?v=4", + "profile": "https://github.com/VamshiVerma", + "contributions": [ + "instructions", + "prompts" + ] + }, + { + "login": "sinedied", + "name": "Yohan Lasorsa", + "avatar_url": "https://avatars.githubusercontent.com/u/593151?v=4", + "profile": "https://github.com/sinedied", + "contributions": [ + "instructions", + "prompts" + ] + }, + { + "login": "spectatora", + "name": "spectatora", + "avatar_url": "https://avatars.githubusercontent.com/u/1385755?v=4", + "profile": "https://github.com/spectatora", + "contributions": [ + "agents", + "maintenance" ] }, { @@ -163,61 +199,28 @@ "avatar_url": "https://avatars.githubusercontent.com/u/10282550?v=4", "profile": "https://www.linkedin.com/in/ambilykk/", "contributions": [ - "code" + "agents", + "instructions" ] }, { - "login": "tgrall", - "name": "Tugdual Grall", - "avatar_url": "https://avatars.githubusercontent.com/u/541250?v=4", - "profile": "http://tgrall.github.io/", + "login": "OrenMe", + "name": "Oren Me", + "avatar_url": "https://avatars.githubusercontent.com/u/5461862?v=4", + "profile": "https://www.promptboost.dev/", "contributions": [ - "code" + "agents", + "instructions" ] }, { - "login": "TianqiZhang", - "name": "Tianqi Zhang", - "avatar_url": "https://avatars.githubusercontent.com/u/5326582?v=4", - "profile": "https://github.com/TianqiZhang", + "login": "mjrousos", + "name": "Mike Rousos", + "avatar_url": "https://avatars.githubusercontent.com/u/10077254?v=4", + "profile": "https://github.com/mjrousos", "contributions": [ - "code" - ] - }, - { - "login": "shubham070", - "name": "Shubham Gaikwad", - "avatar_url": "https://avatars.githubusercontent.com/u/5480589?v=4", - "profile": "https://github.com/shubham070", - "contributions": [ - "code" - ] - }, - { - "login": "sdolgin", - "name": "Saul Dolgin", - "avatar_url": "https://avatars.githubusercontent.com/u/576449?v=4", - "profile": "https://github.com/sdolgin", - "contributions": [ - "code" - ] - }, - { - "login": "nullchimp", - "name": "NULLchimp", - "avatar_url": "https://avatars.githubusercontent.com/u/58362593?v=4", - "profile": "https://github.com/nullchimp", - "contributions": [ - "code" - ] - }, - { - "login": "MattVevang", - "name": "Matt Vevang", - "avatar_url": "https://avatars.githubusercontent.com/u/20714898?v=4", - "profile": "https://github.com/MattVevang", - "contributions": [ - "code" + "instructions", + "prompts" ] }, { @@ -226,322 +229,37 @@ "avatar_url": "https://avatars.githubusercontent.com/u/1538528?v=4", "profile": "https://devkimchi.com/", "contributions": [ - "code" + "instructions" ] }, { - "login": "0GiS0", - "name": "Gisela Torres", - "avatar_url": "https://avatars.githubusercontent.com/u/175379?v=4", - "profile": "https://hachyderm.io/@0gis0", + "login": "guiopen", + "name": "Guilherme do Amaral Alves ", + "avatar_url": "https://avatars.githubusercontent.com/u/94094527?v=4", + "profile": "https://github.com/guiopen", "contributions": [ - "code" + "instructions" ] }, { - "login": "debs-obrien", - "name": "Debbie O'Brien", - "avatar_url": "https://avatars.githubusercontent.com/u/13063165?v=4", - "profile": "https://debbie.codes/", + "login": "griffinashe", + "name": "Griffin Ashe", + "avatar_url": "https://avatars.githubusercontent.com/u/6391612?v=4", + "profile": "https://www.linkedin.com/in/griffinashe/", "contributions": [ - "code" + "agents", + "collections" ] }, { - "login": "agreaves-ms", - "name": "Allen Greaves", - "avatar_url": "https://avatars.githubusercontent.com/u/111466195?v=4", - "profile": "https://github.com/agreaves-ms", + "login": "anchildress1", + "name": "Ashley Childress", + "avatar_url": "https://avatars.githubusercontent.com/u/6563688?v=4", + "profile": "https://github.com/anchildress1", "contributions": [ - "code" - ] - }, - { - "login": "AmeliaRose802", - "name": "Amelia Payne", - "avatar_url": "https://avatars.githubusercontent.com/u/26167931?v=4", - "profile": "https://github.com/AmeliaRose802", - "contributions": [ - "code" - ] - }, - { - "login": "SebastienDegodez", - "name": "Sebastien DEGODEZ", - "avatar_url": "https://avatars.githubusercontent.com/u/2349146?v=4", - "profile": "https://github.com/SebastienDegodez", - "contributions": [ - "code" - ] - }, - { - "login": "segraef", - "name": "Sebastian Gräf", - "avatar_url": "https://avatars.githubusercontent.com/u/19261257?v=4", - "profile": "https://graef.io/", - "contributions": [ - "code" - ] - }, - { - "login": "9ssi7", - "name": "Salih İbrahimbaş", - "avatar_url": "https://avatars.githubusercontent.com/u/76786120?v=4", - "profile": "https://9ssi7.dev/", - "contributions": [ - "code" - ] - }, - { - "login": "inquinity", - "name": "Robert Altman", - "avatar_url": "https://avatars.githubusercontent.com/u/406234?v=4", - "profile": "https://github.com/inquinity", - "contributions": [ - "code" - ] - }, - { - "login": "pertrai1", - "name": "Rob Simpson", - "avatar_url": "https://avatars.githubusercontent.com/u/442374?v=4", - "profile": "https://github.com/pertrai1", - "contributions": [ - "code" - ] - }, - { - "login": "ricksmit3000", - "name": "Rick Smit", - "avatar_url": "https://avatars.githubusercontent.com/u/7207783?v=4", - "profile": "https://ricksm.it/", - "contributions": [ - "code" - ] - }, - { - "login": "psmulovics", - "name": "Peter Smulovics", - "avatar_url": "https://avatars.githubusercontent.com/u/28162552?v=4", - "profile": "http://dotneteers.net/", - "contributions": [ - "code" - ] - }, - { - "login": "pelikhan", - "name": "Peli de Halleux", - "avatar_url": "https://avatars.githubusercontent.com/u/4175913?v=4", - "profile": "https://github.com/pelikhan", - "contributions": [ - "code" - ] - }, - { - "login": "paulomorgado", - "name": "Paulo Morgado", - "avatar_url": "https://avatars.githubusercontent.com/u/470455?v=4", - "profile": "https://www.paulomorgado.net/", - "contributions": [ - "code" - ] - }, - { - "login": "nickytonline", - "name": "Nick Taylor", - "avatar_url": "https://avatars.githubusercontent.com/u/833231?v=4", - "profile": "https://nickyt.co/", - "contributions": [ - "code" - ] - }, - { - "login": "mikeparker104", - "name": "Mike Parker", - "avatar_url": "https://avatars.githubusercontent.com/u/12763221?v=4", - "profile": "https://github.com/mikeparker104", - "contributions": [ - "code" - ] - }, - { - "login": "mikekistler", - "name": "Mike Kistler", - "avatar_url": "https://avatars.githubusercontent.com/u/85643503?v=4", - "profile": "https://github.com/mikekistler", - "contributions": [ - "code" - ] - }, - { - "login": "mfairchild365", - "name": "Michael Fairchild", - "avatar_url": "https://avatars.githubusercontent.com/u/498678?v=4", - "profile": "https://a11ysupport.io/", - "contributions": [ - "code" - ] - }, - { - "login": "michaelvolz", - "name": "Michael A. Volz (Flynn)", - "avatar_url": "https://avatars.githubusercontent.com/u/129928?v=4", - "profile": "https://www.linkedin.com/in/michael-volz/", - "contributions": [ - "code" - ] - }, - { - "login": "4regab", - "name": "4regab", - "avatar_url": "https://avatars.githubusercontent.com/u/178603515?v=4", - "profile": "https://github.com/4regab", - "contributions": [ - "code" - ] - }, - { - "login": "TheovanKraay", - "name": "Theo van Kraay", - "avatar_url": "https://avatars.githubusercontent.com/u/24420698?v=4", - "profile": "https://github.com/TheovanKraay", - "contributions": [ - "code" - ] - }, - { - "login": "twitthoeft-gls", - "name": "Troy Witthoeft (glsauto)", - "avatar_url": "https://avatars.githubusercontent.com/u/132710946?v=4", - "profile": "http://glsauto.com/", - "contributions": [ - "code" - ] - }, - { - "login": "iletai", - "name": "Tài Lê", - "avatar_url": "https://avatars.githubusercontent.com/u/26614687?v=4", - "profile": "https://github.com/iletai", - "contributions": [ - "code" - ] - }, - { - "login": "udayakumarreddyv", - "name": "Udaya Veeramreddygari", - "avatar_url": "https://avatars.githubusercontent.com/u/9591887?v=4", - "profile": "https://tinyurl.com/3p5j9mwe", - "contributions": [ - "code" - ] - }, - { - "login": "warengonzaga", - "name": "Waren Gonzaga", - "avatar_url": "https://avatars.githubusercontent.com/u/15052701?v=4", - "profile": "https://bio.warengonzaga.com/", - "contributions": [ - "code" - ] - }, - { - "login": "doggy8088", - "name": "Will 保哥", - "avatar_url": "https://avatars.githubusercontent.com/u/88981?v=4", - "profile": "https://blog.miniasp.com/", - "contributions": [ - "code" - ] - }, - { - "login": "yukiomoto", - "name": "Yuki Omoto", - "avatar_url": "https://avatars.githubusercontent.com/u/38450410?v=4", - "profile": "https://github.com/yukiomoto", - "contributions": [ - "code" - ] - }, - { - "login": "hueanmy", - "name": "Meii", - "avatar_url": "https://avatars.githubusercontent.com/u/20430626?v=4", - "profile": "https://github.com/hueanmy", - "contributions": [ - "code" - ] - }, - { - "login": "samqbush", - "name": "samqbush", - "avatar_url": "https://avatars.githubusercontent.com/u/74389839?v=4", - "profile": "https://github.com/samqbush", - "contributions": [ - "code" - ] - }, - { - "login": "sdanzo-hrb", - "name": "sdanzo-hrb", - "avatar_url": "https://avatars.githubusercontent.com/u/136493100?v=4", - "profile": "https://github.com/sdanzo-hrb", - "contributions": [ - "code" - ] - }, - { - "login": "voidfnc", - "name": "voidfnc", - "avatar_url": "https://avatars.githubusercontent.com/u/194750710?v=4", - "profile": "https://github.com/voidfnc", - "contributions": [ - "code" - ] - }, - { - "login": "webreidi", - "name": "Wendy Breiding", - "avatar_url": "https://avatars.githubusercontent.com/u/55603905?v=4", - "profile": "https://github.com/webreidi", - "contributions": [ - "code" - ] - }, - { - "login": "zooav", - "name": "Ankur Sharma", - "avatar_url": "https://avatars.githubusercontent.com/u/12625412?v=4", - "profile": "https://github.com/zooav", - "contributions": [ - "code" - ] - }, - { - "login": "Jian-Min-Huang", - "name": "黃健旻 Vincent Huang", - "avatar_url": "https://avatars.githubusercontent.com/u/6296280?v=4", - "profile": "https://jianminhuang.cc/", - "contributions": [ - "code" - ] - }, - { - "login": "dgh06175", - "name": "이상현", - "avatar_url": "https://avatars.githubusercontent.com/u/77305722?v=4", - "profile": "https://github.com/dgh06175", - "contributions": [ - "code" - ] - }, - { - "login": "abdidaudpropel", - "name": "Abdi Daud", - "avatar_url": "https://avatars.githubusercontent.com/u/51310019?v=4", - "profile": "https://github.com/abdidaudpropel", - "contributions": [ - "code" + "agents", + "doc", + "instructions" ] }, { @@ -550,16 +268,18 @@ "avatar_url": "https://avatars.githubusercontent.com/u/50712277?v=4", "profile": "http://www.senseof.tech/", "contributions": [ - "code" + "agents", + "doc", + "prompts" ] }, { - "login": "tegola", - "name": "Alan Sprecacenere", - "avatar_url": "https://avatars.githubusercontent.com/u/1868590?v=4", - "profile": "http://www.qreate.it/", + "login": "Vhivi", + "name": "ANGELELLI David", + "avatar_url": "https://avatars.githubusercontent.com/u/38220028?v=4", + "profile": "https://github.com/Vhivi", "contributions": [ - "code" + "agents" ] }, { @@ -568,25 +288,122 @@ "avatar_url": "https://avatars.githubusercontent.com/u/2493377?v=4", "profile": "https://asilva.dev/", "contributions": [ - "code" + "agents", + "instructions" ] }, { - "login": "arey", - "name": "Antoine Rey", - "avatar_url": "https://avatars.githubusercontent.com/u/838318?v=4", - "profile": "https://javaetmoi.com/", + "login": "MattVevang", + "name": "Matt Vevang", + "avatar_url": "https://avatars.githubusercontent.com/u/20714898?v=4", + "profile": "https://github.com/MattVevang", "contributions": [ - "code" + "instructions" ] }, { - "login": "artemsaveliev", - "name": "Artem Saveliev", - "avatar_url": "https://avatars.githubusercontent.com/u/15679218?v=4", - "profile": "https://github.com/artemsaveliev", + "login": "mpgirro", + "name": "Maximilian Irro", + "avatar_url": "https://avatars.githubusercontent.com/u/589073?v=4", + "profile": "https://max.irro.at/", "contributions": [ - "code" + "instructions" + ] + }, + { + "login": "nullchimp", + "name": "NULLchimp", + "avatar_url": "https://avatars.githubusercontent.com/u/58362593?v=4", + "profile": "https://github.com/nullchimp", + "contributions": [ + "agents" + ] + }, + { + "login": "sdolgin", + "name": "Saul Dolgin", + "avatar_url": "https://avatars.githubusercontent.com/u/576449?v=4", + "profile": "https://github.com/sdolgin", + "contributions": [ + "agents", + "instructions", + "prompts" + ] + }, + { + "login": "shubham070", + "name": "Shubham Gaikwad", + "avatar_url": "https://avatars.githubusercontent.com/u/5480589?v=4", + "profile": "https://github.com/shubham070", + "contributions": [ + "agents", + "instructions", + "prompts" + ] + }, + { + "login": "TheovanKraay", + "name": "Theo van Kraay", + "avatar_url": "https://avatars.githubusercontent.com/u/24420698?v=4", + "profile": "https://github.com/TheovanKraay", + "contributions": [ + "instructions" + ] + }, + { + "login": "TianqiZhang", + "name": "Tianqi Zhang", + "avatar_url": "https://avatars.githubusercontent.com/u/5326582?v=4", + "profile": "https://github.com/TianqiZhang", + "contributions": [ + "agents" + ] + }, + { + "login": "tgrall", + "name": "Tugdual Grall", + "avatar_url": "https://avatars.githubusercontent.com/u/541250?v=4", + "profile": "http://tgrall.github.io/", + "contributions": [ + "instructions", + "prompts" + ] + }, + { + "login": "doggy8088", + "name": "Will 保哥", + "avatar_url": "https://avatars.githubusercontent.com/u/88981?v=4", + "profile": "https://blog.miniasp.com/", + "contributions": [ + "agents", + "prompts" + ] + }, + { + "login": "tsubakimoto", + "name": "Yuta Matsumura", + "avatar_url": "https://avatars.githubusercontent.com/u/1592808?v=4", + "profile": "https://tsubalog.hatenablog.com/", + "contributions": [ + "instructions" + ] + }, + { + "login": "hizahizi-hizumi", + "name": "hizahizi-hizumi", + "avatar_url": "https://avatars.githubusercontent.com/u/163728895?v=4", + "profile": "https://github.com/hizahizi-hizumi", + "contributions": [ + "instructions" + ] + }, + { + "login": "Jian-Min-Huang", + "name": "黃健旻 Vincent Huang", + "avatar_url": "https://avatars.githubusercontent.com/u/6296280?v=4", + "profile": "https://jianminhuang.cc/", + "contributions": [ + "prompts" ] }, { @@ -595,34 +412,65 @@ "avatar_url": "https://avatars.githubusercontent.com/u/129743?v=4", "profile": "http://brunoborges.io/", "contributions": [ - "code" - ] - }, - { - "login": "tossnet", - "name": "Christophe Peugnet", - "avatar_url": "https://avatars.githubusercontent.com/u/3845786?v=4", - "profile": "https://www.peug.net/", - "contributions": [ - "code" + "collections", + "instructions" ] }, { "login": "MovingLive", - "name": "Chtive", + "name": "Steve Magne", "avatar_url": "https://avatars.githubusercontent.com/u/14792628?v=4", "profile": "https://www.movinglive.ca/", "contributions": [ - "code" + "doc", + "instructions" ] }, { - "login": "craigbekker", - "name": "Craig Bekker", - "avatar_url": "https://avatars.githubusercontent.com/u/1115912?v=4", - "profile": "https://github.com/craigbekker", + "login": "PureWeen", + "name": "Shane Neuville", + "avatar_url": "https://avatars.githubusercontent.com/u/5375137?v=4", + "profile": "http://shaneneuville.com/", "contributions": [ - "code" + "agents", + "instructions" + ] + }, + { + "login": "agreaves-ms", + "name": "Allen Greaves", + "avatar_url": "https://avatars.githubusercontent.com/u/111466195?v=4", + "profile": "https://github.com/agreaves-ms", + "contributions": [ + "agents", + "instructions" + ] + }, + { + "login": "AmeliaRose802", + "name": "Amelia Payne", + "avatar_url": "https://avatars.githubusercontent.com/u/26167931?v=4", + "profile": "https://github.com/AmeliaRose802", + "contributions": [ + "agents" + ] + }, + { + "login": "brooke-hamilton", + "name": "Brooke Hamilton", + "avatar_url": "https://avatars.githubusercontent.com/u/45323234?v=4", + "profile": "https://azureincubations.io/", + "contributions": [ + "instructions" + ] + }, + { + "login": "GeekTrainer", + "name": "Christopher Harrison", + "avatar_url": "https://avatars.githubusercontent.com/u/6109729?v=4", + "profile": "https://github.com/GeekTrainer", + "contributions": [ + "instructions" ] }, { @@ -631,34 +479,36 @@ "avatar_url": "https://avatars.githubusercontent.com/u/1446918?v=4", "profile": "https://github.com/breakid", "contributions": [ - "code" + "instructions" ] }, { - "login": "ewega", - "name": "Eldrick Wega", - "avatar_url": "https://avatars.githubusercontent.com/u/26189114?v=4", - "profile": "https://github.com/ewega", + "login": "DanWahlin", + "name": "Dan Wahlin", + "avatar_url": "https://avatars.githubusercontent.com/u/1767249?v=4", + "profile": "https://blog.codewithdan.com/", "contributions": [ - "code" + "agents" ] }, { - "login": "felixarjuna", - "name": "Felix Arjuna", - "avatar_url": "https://avatars.githubusercontent.com/u/79026094?v=4", - "profile": "https://www.felixarjuna.dev/", + "login": "debs-obrien", + "name": "Debbie O'Brien", + "avatar_url": "https://avatars.githubusercontent.com/u/13063165?v=4", + "profile": "https://debbie.codes/", "contributions": [ - "code" + "agents", + "instructions", + "prompts" ] }, { - "login": "feapaydin", - "name": "Furkan Enes", - "avatar_url": "https://avatars.githubusercontent.com/u/19946639?v=4", - "profile": "https://github.com/feapaydin", + "login": "echarrod", + "name": "Ed Harrod", + "avatar_url": "https://avatars.githubusercontent.com/u/1381991?v=4", + "profile": "https://github.com/echarrod", "contributions": [ - "code" + "prompts" ] }, { @@ -667,133 +517,17 @@ "avatar_url": "https://avatars.githubusercontent.com/u/24882762?v=4", "profile": "http://learn.microsoft.com/dotnet", "contributions": [ - "code" + "prompts" ] }, { - "login": "geoder101", - "name": "George Dernikos", - "avatar_url": "https://avatars.githubusercontent.com/u/145904?v=4", - "profile": "https://github.com/geoder101", + "login": "guigui42", + "name": "Guillaume", + "avatar_url": "https://avatars.githubusercontent.com/u/2376010?v=4", + "profile": "https://github.com/guigui42", "contributions": [ - "code" - ] - }, - { - "login": "giomartinsdev", - "name": "Giovanni de Almeida Martins", - "avatar_url": "https://avatars.githubusercontent.com/u/125399281?v=4", - "profile": "https://github.com/giomartinsdev", - "contributions": [ - "code" - ] - }, - { - "login": "Ioana37", - "name": "Ioana A", - "avatar_url": "https://avatars.githubusercontent.com/u/69301842?v=4", - "profile": "https://github.com/Ioana37", - "contributions": [ - "code" - ] - }, - { - "login": "nohwnd", - "name": "Jakub Jareš", - "avatar_url": "https://avatars.githubusercontent.com/u/5735905?v=4", - "profile": "https://github.com/nohwnd", - "contributions": [ - "code" - ] - }, - { - "login": "joe-watkins", - "name": "Joe Watkins", - "avatar_url": "https://avatars.githubusercontent.com/u/3695795?v=4", - "profile": "http://joe-watkins.io/", - "contributions": [ - "code" - ] - }, - { - "login": "johnpapa", - "name": "John Papa", - "avatar_url": "https://avatars.githubusercontent.com/u/1202528?v=4", - "profile": "http://johnpapa.net/", - "contributions": [ - "code" - ] - }, - { - "login": "josephgonzales01", - "name": "Joseph Gonzales", - "avatar_url": "https://avatars.githubusercontent.com/u/15100839?v=4", - "profile": "http://www.sugbo4j.co.nz/", - "contributions": [ - "code" - ] - }, - { - "login": "josegarridodigio", - "name": "José Antonio Garrido", - "avatar_url": "https://avatars.githubusercontent.com/u/173672918?v=4", - "profile": "https://digio.es/", - "contributions": [ - "code" - ] - }, - { - "login": "Ranrar", - "name": "Kim Skov Rasmussen", - "avatar_url": "https://avatars.githubusercontent.com/u/95967772?v=4", - "profile": "https://github.com/Ranrar", - "contributions": [ - "code" - ] - }, - { - "login": "whiteken", - "name": "Kenny White", - "avatar_url": "https://avatars.githubusercontent.com/u/20211937?v=4", - "profile": "https://github.com/whiteken", - "contributions": [ - "code" - ] - }, - { - "login": "LouellaCreemers", - "name": "Louella Creemers", - "avatar_url": "https://avatars.githubusercontent.com/u/46204894?v=4", - "profile": "https://github.com/LouellaCreemers", - "contributions": [ - "code" - ] - }, - { - "login": "lukemurraynz", - "name": "Luke Murray", - "avatar_url": "https://avatars.githubusercontent.com/u/24467442?v=4", - "profile": "https://linktr.ee/lukemurray", - "contributions": [ - "code" - ] - }, - { - "login": "marknoble", - "name": "Mark Noble", - "avatar_url": "https://avatars.githubusercontent.com/u/3819700?v=4", - "profile": "http://marknoble.com/", - "contributions": [ - "code" - ] - }, - { - "login": "soderlind", - "name": "Per Søderlind", - "avatar_url": "https://avatars.githubusercontent.com/u/1649452?v=4", - "profile": "https://soderlind.no", - "contributions": [ - "code" + "agents", + "prompts" ] }, { @@ -802,7 +536,7 @@ "avatar_url": "https://avatars.githubusercontent.com/u/108551585?v=4", "profile": "https://github.com/riqueufmg", "contributions": [ - "code" + "prompts" ] }, { @@ -815,43 +549,1021 @@ ] }, { - "login": "spectatora", - "name": "spectatora", - "avatar_url": "https://avatars.githubusercontent.com/u/1385755?v=4", - "profile": "https://github.com/spectatora", + "login": "kartikdhiman", + "name": "Kartik Dhiman", + "avatar_url": "https://avatars.githubusercontent.com/u/59189590?v=4", + "profile": "https://github.com/kartikdhiman", + "contributions": [ + "instructions" + ] + }, + { + "login": "kristiyan-velkov", + "name": "Kristiyan Velkov", + "avatar_url": "https://avatars.githubusercontent.com/u/40764277?v=4", + "profile": "https://kristiyanvelkov.com/", + "contributions": [ + "agents" + ] + }, + { + "login": "markdav-is", + "name": "Mark Davis", + "avatar_url": "https://avatars.githubusercontent.com/u/311063?v=4", + "profile": "http://markdav.is/", + "contributions": [ + "instructions" + ] + }, + { + "login": "pelikhan", + "name": "Peli de Halleux", + "avatar_url": "https://avatars.githubusercontent.com/u/4175913?v=4", + "profile": "https://github.com/pelikhan", "contributions": [ "code" ] }, { - "login": "Mike-Hanna", - "name": "Michael", - "avatar_url": "https://avatars.githubusercontent.com/u/50142889?v=4", - "profile": "https://github.com/Mike-Hanna", + "login": "soderlind", + "name": "Per Søderlind", + "avatar_url": "https://avatars.githubusercontent.com/u/1649452?v=4", + "profile": "https://soderlind.no/", + "contributions": [ + "instructions" + ] + }, + { + "login": "psmulovics", + "name": "Peter Smulovics", + "avatar_url": "https://avatars.githubusercontent.com/u/28162552?v=4", + "profile": "http://dotneteers.net/", + "contributions": [ + "instructions" + ] + }, + { + "login": "madvimer", + "name": "Ravish Rathod", + "avatar_url": "https://avatars.githubusercontent.com/u/3188898?v=4", + "profile": "https://github.com/madvimer", + "contributions": [ + "instructions" + ] + }, + { + "login": "ricksmit3000", + "name": "Rick Smit", + "avatar_url": "https://avatars.githubusercontent.com/u/7207783?v=4", + "profile": "https://ricksm.it/", + "contributions": [ + "agents" + ] + }, + { + "login": "pertrai1", + "name": "Rob Simpson", + "avatar_url": "https://avatars.githubusercontent.com/u/442374?v=4", + "profile": "https://github.com/pertrai1", + "contributions": [ + "instructions" + ] + }, + { + "login": "inquinity", + "name": "Robert Altman", + "avatar_url": "https://avatars.githubusercontent.com/u/406234?v=4", + "profile": "https://github.com/inquinity", + "contributions": [ + "instructions" + ] + }, + { + "login": "salihguru", + "name": "Salih", + "avatar_url": "https://avatars.githubusercontent.com/u/76786120?v=4", + "profile": "https://salih.guru/", + "contributions": [ + "instructions" + ] + }, + { + "login": "segraef", + "name": "Sebastian Gräf", + "avatar_url": "https://avatars.githubusercontent.com/u/19261257?v=4", + "profile": "https://graef.io/", + "contributions": [ + "agents", + "instructions" + ] + }, + { + "login": "SebastienDegodez", + "name": "Sebastien DEGODEZ", + "avatar_url": "https://avatars.githubusercontent.com/u/2349146?v=4", + "profile": "https://github.com/SebastienDegodez", + "contributions": [ + "instructions" + ] + }, + { + "login": "sesmyrnov", + "name": "Sergiy Smyrnov", + "avatar_url": "https://avatars.githubusercontent.com/u/59627981?v=4", + "profile": "https://github.com/sesmyrnov", + "contributions": [ + "prompts" + ] + }, + { + "login": "SomeSolutionsArchitect", + "name": "SomeSolutionsArchitect", + "avatar_url": "https://avatars.githubusercontent.com/u/139817767?v=4", + "profile": "https://github.com/SomeSolutionsArchitect", + "contributions": [ + "agents" + ] + }, + { + "login": "kewalaka", + "name": "Stu Mace", + "avatar_url": "https://avatars.githubusercontent.com/u/3146590?v=4", + "profile": "https://github.com/kewalaka", + "contributions": [ + "agents", + "collections", + "instructions" + ] + }, + { + "login": "dgh06175", + "name": "이상현", + "avatar_url": "https://avatars.githubusercontent.com/u/77305722?v=4", + "profile": "https://github.com/dgh06175", + "contributions": [ + "instructions" + ] + }, + { + "login": "paulomorgado", + "name": "Paulo Morgado", + "avatar_url": "https://avatars.githubusercontent.com/u/470455?v=4", + "profile": "https://www.paulomorgado.net/", + "contributions": [ + "prompts" + ] + }, + { + "login": "pcrane", + "name": "Paul Crane", + "avatar_url": "https://avatars.githubusercontent.com/u/808676?v=4", + "profile": "https://paul.crane.net.nz/", + "contributions": [ + "agents" + ] + }, + { + "login": "pamelafox", + "name": "Pamela Fox", + "avatar_url": "https://avatars.githubusercontent.com/u/297042?v=4", + "profile": "https://www.pamelafox.org/", + "contributions": [ + "prompts" + ] + }, + { + "login": "prewk", + "name": "Oskar Thornblad", + "avatar_url": "https://avatars.githubusercontent.com/u/640102?v=4", + "profile": "https://oskarthornblad.se/", + "contributions": [ + "instructions" + ] + }, + { + "login": "nischays", + "name": "Nischay Sharma", + "avatar_url": "https://avatars.githubusercontent.com/u/54121853?v=4", + "profile": "https://github.com/nischays", + "contributions": [ + "agents" + ] + }, + { + "login": "Naikabg", + "name": "Nikolay Marinov", + "avatar_url": "https://avatars.githubusercontent.com/u/19915620?v=4", + "profile": "https://github.com/Naikabg", + "contributions": [ + "agents" + ] + }, + { + "login": "niksacdev", + "name": "Nik Sachdeva", + "avatar_url": "https://avatars.githubusercontent.com/u/20246918?v=4", + "profile": "https://www.linkedin.com/in/niksac", + "contributions": [ + "agents", + "collections" + ] + }, + { + "login": "nickytonline", + "name": "Nick Taylor", + "avatar_url": "https://avatars.githubusercontent.com/u/833231?v=4", + "profile": "https://onetipaweek.com/", "contributions": [ "code" ] }, + { + "login": "nicholasdbrady", + "name": "Nick Brady", + "avatar_url": "https://avatars.githubusercontent.com/u/18353756?v=4", + "profile": "https://nicholasdbrady.github.io/cookbook/", + "contributions": [ + "agents" + ] + }, + { + "login": "nastanford", + "name": "Nathan Stanford Sr", + "avatar_url": "https://avatars.githubusercontent.com/u/1755947?v=4", + "profile": "https://github.com/nastanford", + "contributions": [ + "instructions" + ] + }, + { + "login": "matebarabas", + "name": "Máté Barabás", + "avatar_url": "https://avatars.githubusercontent.com/u/22733424?v=4", + "profile": "https://github.com/matebarabas", + "contributions": [ + "instructions" + ] + }, + { + "login": "mikeparker104", + "name": "Mike Parker", + "avatar_url": "https://avatars.githubusercontent.com/u/12763221?v=4", + "profile": "https://github.com/mikeparker104", + "contributions": [ + "instructions" + ] + }, + { + "login": "mikekistler", + "name": "Mike Kistler", + "avatar_url": "https://avatars.githubusercontent.com/u/85643503?v=4", + "profile": "https://github.com/mikekistler", + "contributions": [ + "prompts" + ] + }, + { + "login": "mfairchild365", + "name": "Michael Fairchild", + "avatar_url": "https://avatars.githubusercontent.com/u/498678?v=4", + "profile": "https://a11ysupport.io/", + "contributions": [ + "instructions" + ] + }, + { + "login": "zooav", + "name": "Ankur Sharma", + "avatar_url": "https://avatars.githubusercontent.com/u/12625412?v=4", + "profile": "https://github.com/zooav", + "contributions": [ + "prompts" + ] + }, + { + "login": "webreidi", + "name": "Wendy Breiding", + "avatar_url": "https://avatars.githubusercontent.com/u/55603905?v=4", + "profile": "https://github.com/webreidi", + "contributions": [ + "code" + ] + }, + { + "login": "voidfnc", + "name": "voidfnc", + "avatar_url": "https://avatars.githubusercontent.com/u/194750710?v=4", + "profile": "https://github.com/voidfnc", + "contributions": [ + "agents" + ] + }, + { + "login": "shavo007", + "name": "shane lee", + "avatar_url": "https://avatars.githubusercontent.com/u/5466825?v=4", + "profile": "https://about.me/shane-lee", + "contributions": [ + "instructions" + ] + }, + { + "login": "sdanzo-hrb", + "name": "sdanzo-hrb", + "avatar_url": "https://avatars.githubusercontent.com/u/136493100?v=4", + "profile": "https://github.com/sdanzo-hrb", + "contributions": [ + "agents" + ] + }, + { + "login": "isauran", + "name": "sauran", + "avatar_url": "https://avatars.githubusercontent.com/u/33398121?v=4", + "profile": "https://github.com/nativebpm", + "contributions": [ + "instructions" + ] + }, + { + "login": "samqbush", + "name": "samqbush", + "avatar_url": "https://avatars.githubusercontent.com/u/74389839?v=4", + "profile": "https://github.com/samqbush", + "contributions": [ + "prompts" + ] + }, + { + "login": "pareenaverma", + "name": "pareenaverma", + "avatar_url": "https://avatars.githubusercontent.com/u/59843121?v=4", + "profile": "https://github.com/pareenaverma", + "contributions": [ + "agents" + ] + }, + { + "login": "oleksiyyurchyna", + "name": "oleksiyyurchyna", + "avatar_url": "https://avatars.githubusercontent.com/u/10256765?v=4", + "profile": "https://github.com/oleksiyyurchyna", + "contributions": [ + "collections", + "prompts" + ] + }, + { + "login": "time-by-waves", + "name": "oceans-of-time", + "avatar_url": "https://avatars.githubusercontent.com/u/34587654?v=4", + "profile": "https://github.com/time-by-waves", + "contributions": [ + "instructions" + ] + }, + { + "login": "kshashank57", + "name": "kshashank57", + "avatar_url": "https://avatars.githubusercontent.com/u/57212456?v=4", + "profile": "https://github.com/kshashank57", + "contributions": [ + "agents", + "instructions" + ] + }, + { + "login": "hueanmy", + "name": "Meii", + "avatar_url": "https://avatars.githubusercontent.com/u/20430626?v=4", + "profile": "https://github.com/hueanmy", + "contributions": [ + "agents" + ] + }, + { + "login": "factory-davidgu", + "name": "factory-davidgu", + "avatar_url": "https://avatars.githubusercontent.com/u/229352262?v=4", + "profile": "https://github.com/factory-davidgu", + "contributions": [ + "code" + ] + }, + { + "login": "dangelov-qa", + "name": "dangelov-qa", + "avatar_url": "https://avatars.githubusercontent.com/u/92313553?v=4", + "profile": "https://github.com/dangelov-qa", + "contributions": [ + "agents" + ] + }, + { + "login": "yukiomoto", + "name": "Yuki Omoto", + "avatar_url": "https://avatars.githubusercontent.com/u/38450410?v=4", + "profile": "https://github.com/yukiomoto", + "contributions": [ + "instructions" + ] + }, + { + "login": "wschultz-boxboat", + "name": "Will Schultz", + "avatar_url": "https://avatars.githubusercontent.com/u/110492948?v=4", + "profile": "https://github.com/wschultz-boxboat", + "contributions": [ + "agents" + ] + }, + { + "login": "warengonzaga", + "name": "Waren Gonzaga", + "avatar_url": "https://avatars.githubusercontent.com/u/15052701?v=4", + "profile": "https://bio.warengonzaga.com/", + "contributions": [ + "agents" + ] + }, + { + "login": "vincentkoc", + "name": "Vincent Koc", + "avatar_url": "https://avatars.githubusercontent.com/u/25068?v=4", + "profile": "https://linktr.ee/vincentkoc", + "contributions": [ + "agents" + ] + }, + { + "login": "Vaporjawn", + "name": "Victor Williams", + "avatar_url": "https://avatars.githubusercontent.com/u/15694665?v=4", + "profile": "https://github.com/Vaporjawn", + "contributions": [ + "agents" + ] + }, + { + "login": "VeVarunSharma", + "name": "Ve Sharma", + "avatar_url": "https://avatars.githubusercontent.com/u/62218708?v=4", + "profile": "https://vesharma.dev/", + "contributions": [ + "agents" + ] + }, + { + "login": "udayakumarreddyv", + "name": "Udaya Veeramreddygari", + "avatar_url": "https://avatars.githubusercontent.com/u/9591887?v=4", + "profile": "https://tinyurl.com/3p5j9mwe", + "contributions": [ + "instructions" + ] + }, + { + "login": "iletai", + "name": "Tài Lê", + "avatar_url": "https://avatars.githubusercontent.com/u/26614687?v=4", + "profile": "https://github.com/iletai", + "contributions": [ + "prompts" + ] + }, + { + "login": "twitthoeft-gls", + "name": "Troy Witthoeft (glsauto)", + "avatar_url": "https://avatars.githubusercontent.com/u/132710946?v=4", + "profile": "http://glsauto.com/", + "contributions": [ + "instructions" + ] + }, + { + "login": "tmeschter", + "name": "Tom Meschter", + "avatar_url": "https://avatars.githubusercontent.com/u/10506730?v=4", + "profile": "https://github.com/tmeschter", + "contributions": [ + "code" + ] + }, + { + "login": "semperteneo", + "name": "Tj Vita", + "avatar_url": "https://avatars.githubusercontent.com/u/14024037?v=4", + "profile": "http://enakdesign.com/", + "contributions": [ + "agents" + ] + }, + { + "login": "STRUDSO", + "name": "Søren Trudsø Mahon", + "avatar_url": "https://avatars.githubusercontent.com/u/1543732?v=4", + "profile": "https://github.com/STRUDSO", + "contributions": [ + "instructions" + ] + }, + { + "login": "geoder101", + "name": "George Dernikos", + "avatar_url": "https://avatars.githubusercontent.com/u/145904?v=4", + "profile": "https://github.com/geoder101", + "contributions": [ + "code" + ] + }, + { + "login": "gautambaghel", + "name": "Gautam", + "avatar_url": "https://avatars.githubusercontent.com/u/22324290?v=4", + "profile": "https://github.com/gautambaghel", + "contributions": [ + "agents" + ] + }, + { + "login": "feapaydin", + "name": "Furkan Enes", + "avatar_url": "https://avatars.githubusercontent.com/u/19946639?v=4", + "profile": "https://github.com/feapaydin", + "contributions": [ + "instructions" + ] + }, + { + "login": "fmuecke", + "name": "Florian Mücke", + "avatar_url": "https://avatars.githubusercontent.com/u/7921024?v=4", + "profile": "https://github.com/fmuecke", + "contributions": [ + "agents" + ] + }, + { + "login": "felixarjuna", + "name": "Felix Arjuna", + "avatar_url": "https://avatars.githubusercontent.com/u/79026094?v=4", + "profile": "https://www.felixarjuna.dev/", + "contributions": [ + "instructions" + ] + }, + { + "login": "ewega", + "name": "Eldrick Wega", + "avatar_url": "https://avatars.githubusercontent.com/u/26189114?v=4", + "profile": "https://github.com/ewega", + "contributions": [ + "prompts" + ] + }, + { + "login": "danchev", + "name": "Dobri Danchev", + "avatar_url": "https://avatars.githubusercontent.com/u/12420863?v=4", + "profile": "https://github.com/danchev", + "contributions": [ + "prompts" + ] + }, + { + "login": "difegam", + "name": "Diego Gamboa", + "avatar_url": "https://avatars.githubusercontent.com/u/7052267?v=4", + "profile": "https://dgamboa.com/", + "contributions": [ + "prompts" + ] + }, + { + "login": "derekclair", + "name": "Derek Clair", + "avatar_url": "https://avatars.githubusercontent.com/u/5247629?v=4", + "profile": "https://github.com/derekclair", + "contributions": [ + "agents", + "prompts" + ] + }, + { + "login": "davidortinau", + "name": "David Ortinau", + "avatar_url": "https://avatars.githubusercontent.com/u/41873?v=4", + "profile": "https://dev.to/davidortinau", + "contributions": [ + "code" + ] + }, + { + "login": "danielabbatt", + "name": "Daniel Abbatt", + "avatar_url": "https://avatars.githubusercontent.com/u/8926756?v=4", + "profile": "https://github.com/danielabbatt", + "contributions": [ + "instructions" + ] + }, + { + "login": "CypherHK", + "name": "CypherHK", + "avatar_url": "https://avatars.githubusercontent.com/u/230935834?v=4", + "profile": "https://github.com/CypherHK", + "contributions": [ + "agents", + "prompts" + ] + }, + { + "login": "craigbekker", + "name": "Craig Bekker", + "avatar_url": "https://avatars.githubusercontent.com/u/1115912?v=4", + "profile": "https://github.com/craigbekker", + "contributions": [ + "code" + ] + }, + { + "login": "tossnet", + "name": "Christophe Peugnet", + "avatar_url": "https://avatars.githubusercontent.com/u/3845786?v=4", + "profile": "https://www.peug.net/", + "contributions": [ + "instructions" + ] + }, { "login": "lechnerc77", "name": "Christian Lechner", "avatar_url": "https://avatars.githubusercontent.com/u/22294087?v=4", "profile": "https://github.com/lechnerc77", + "contributions": [ + "instructions" + ] + }, + { + "login": "charris-msft", + "name": "Chris Harris", + "avatar_url": "https://avatars.githubusercontent.com/u/74415662?v=4", + "profile": "https://github.com/charris-msft", + "contributions": [ + "agents" + ] + }, + { + "login": "BBoyBen", + "name": "BBoyBen", + "avatar_url": "https://avatars.githubusercontent.com/u/34445365?v=4", + "profile": "https://github.com/BBoyBen", + "contributions": [ + "instructions" + ] + }, + { + "login": "artemsaveliev", + "name": "Artem Saveliev", + "avatar_url": "https://avatars.githubusercontent.com/u/15679218?v=4", + "profile": "https://github.com/artemsaveliev", + "contributions": [ + "instructions" + ] + }, + { + "login": "arey", + "name": "Antoine Rey", + "avatar_url": "https://avatars.githubusercontent.com/u/838318?v=4", + "profile": "https://javaetmoi.com/", + "contributions": [ + "prompts" + ] + }, + { + "login": "PiKa919", + "name": "Ankit Das", + "avatar_url": "https://avatars.githubusercontent.com/u/96786190?v=4", + "profile": "https://github.com/PiKa919", + "contributions": [ + "instructions" + ] + }, + { + "login": "alineavila", + "name": "Aline Ávila", + "avatar_url": "https://avatars.githubusercontent.com/u/24813256?v=4", + "profile": "https://github.com/alineavila", + "contributions": [ + "instructions" + ] + }, + { + "login": "martin-cod", + "name": "Alexander Martinkevich", + "avatar_url": "https://avatars.githubusercontent.com/u/33550246?v=4", + "profile": "https://github.com/martin-cod", + "contributions": [ + "agents" + ] + }, + { + "login": "aldunchev", + "name": "Aleksandar Dunchev", + "avatar_url": "https://avatars.githubusercontent.com/u/4631021?v=4", + "profile": "https://github.com/aldunchev", + "contributions": [ + "agents" + ] + }, + { + "login": "tegola", + "name": "Alan Sprecacenere", + "avatar_url": "https://avatars.githubusercontent.com/u/1868590?v=4", + "profile": "http://www.qreate.it/", + "contributions": [ + "instructions" + ] + }, + { + "login": "akashxlr8", + "name": "Akash Kumar Shaw", + "avatar_url": "https://avatars.githubusercontent.com/u/58072860?v=4", + "profile": "https://github.com/akashxlr8", + "contributions": [ + "instructions" + ] + }, + { + "login": "abdidaudpropel", + "name": "Abdi Daud", + "avatar_url": "https://avatars.githubusercontent.com/u/51310019?v=4", + "profile": "https://github.com/abdidaudpropel", + "contributions": [ + "agents" + ] + }, + { + "login": "4regab", + "name": "4regab", + "avatar_url": "https://avatars.githubusercontent.com/u/178603515?v=4", + "profile": "https://github.com/4regab", + "contributions": [ + "instructions" + ] + }, + { + "login": "michaelvolz", + "name": "Michael A. Volz (Flynn)", + "avatar_url": "https://avatars.githubusercontent.com/u/129928?v=4", + "profile": "https://www.linkedin.com/in/michael-volz/", + "contributions": [ + "prompts" + ] + }, + { + "login": "Mike-Hanna", + "name": "Michael", + "avatar_url": "https://avatars.githubusercontent.com/u/50142889?v=4", + "profile": "https://github.com/Mike-Hanna", + "contributions": [ + "instructions" + ] + }, + { + "login": "mehmetalierol", + "name": "Mehmet Ali EROL", + "avatar_url": "https://avatars.githubusercontent.com/u/16721723?v=4", + "profile": "http://www.mehmetalierol.com/", + "contributions": [ + "agents" + ] + }, + { + "login": "maxprilutskiy", + "name": "Max Prilutskiy", + "avatar_url": "https://avatars.githubusercontent.com/u/5614659?v=4", + "profile": "https://maxprilutskiy.com/", + "contributions": [ + "agents" + ] + }, + { + "login": "mbianchidev", + "name": "Matteo Bianchi", + "avatar_url": "https://avatars.githubusercontent.com/u/37507190?v=4", + "profile": "https://github.com/mbianchidev", + "contributions": [ + "agents" + ] + }, + { + "login": "codemillmatt", + "name": "Matt Soucoup", + "avatar_url": "https://avatars.githubusercontent.com/u/2053639?v=4", + "profile": "https://codemilltech.com/", + "contributions": [ + "infra" + ] + }, + { + "login": "marknoble", + "name": "Mark Noble", + "avatar_url": "https://avatars.githubusercontent.com/u/3819700?v=4", + "profile": "http://marknoble.com/", + "contributions": [ + "agents" + ] + }, + { + "login": "ManishJayaswal", + "name": "Manish Jayaswal", + "avatar_url": "https://avatars.githubusercontent.com/u/9527491?v=4", + "profile": "https://github.com/ManishJayaswal", + "contributions": [ + "agents" + ] + }, + { + "login": "lukemurraynz", + "name": "Luke Murray", + "avatar_url": "https://avatars.githubusercontent.com/u/24467442?v=4", + "profile": "https://linktr.ee/lukemurray", + "contributions": [ + "agents" + ] + }, + { + "login": "LouellaCreemers", + "name": "Louella Creemers", + "avatar_url": "https://avatars.githubusercontent.com/u/46204894?v=4", + "profile": "https://github.com/LouellaCreemers", + "contributions": [ + "instructions" + ] + }, + { + "login": "whiteken", + "name": "Kenny White", + "avatar_url": "https://avatars.githubusercontent.com/u/20211937?v=4", + "profile": "https://github.com/whiteken", + "contributions": [ + "instructions" + ] + }, + { + "login": "KaloyanGenev", + "name": "KaloyanGenev", + "avatar_url": "https://avatars.githubusercontent.com/u/42644424?v=4", + "profile": "https://github.com/KaloyanGenev", + "contributions": [ + "agents" + ] + }, + { + "login": "Ranrar", + "name": "Kim Skov Rasmussen", + "avatar_url": "https://avatars.githubusercontent.com/u/95967772?v=4", + "profile": "https://github.com/Ranrar", "contributions": [ "code" ] }, + { + "login": "jdubois", + "name": "Julien Dubois", + "avatar_url": "https://avatars.githubusercontent.com/u/316835?v=4", + "profile": "https://www.julien-dubois.com/", + "contributions": [ + "prompts" + ] + }, + { + "login": "josegarridodigio", + "name": "José Antonio Garrido", + "avatar_url": "https://avatars.githubusercontent.com/u/173672918?v=4", + "profile": "https://digio.es/", + "contributions": [ + "instructions" + ] + }, + { + "login": "josephgonzales01", + "name": "Joseph Gonzales", + "avatar_url": "https://avatars.githubusercontent.com/u/15100839?v=4", + "profile": "http://www.sugbo4j.co.nz/", + "contributions": [ + "instructions", + "prompts" + ] + }, + { + "login": "yortch", + "name": "Jorge Balderas", + "avatar_url": "https://avatars.githubusercontent.com/u/4576246?v=4", + "profile": "https://github.com/yortch", + "contributions": [ + "instructions" + ] + }, + { + "login": "johnpapa", + "name": "John Papa", + "avatar_url": "https://avatars.githubusercontent.com/u/1202528?v=4", + "profile": "http://johnpapa.net/", + "contributions": [ + "code" + ] + }, + { + "login": "johnlokerse", + "name": "John", + "avatar_url": "https://avatars.githubusercontent.com/u/3514513?v=4", + "profile": "https://www.johnlokerse.dev/", + "contributions": [ + "agents" + ] + }, + { + "login": "joe-watkins", + "name": "Joe Watkins", + "avatar_url": "https://avatars.githubusercontent.com/u/3695795?v=4", + "profile": "http://joe-watkins.io/", + "contributions": [ + "instructions" + ] + }, { "login": "Jandev", "name": "Jan de Vries", "avatar_url": "https://avatars.githubusercontent.com/u/462356?v=4", - "profile": "https://jan-v.nl", + "profile": "https://jan-v.nl/", "contributions": [ - "code" + "agents" + ] + }, + { + "login": "nohwnd", + "name": "Jakub Jareš", + "avatar_url": "https://avatars.githubusercontent.com/u/5735905?v=4", + "profile": "https://github.com/nohwnd", + "contributions": [ + "prompts" + ] + }, + { + "login": "jaxn", + "name": "Jackson Miller", + "avatar_url": "https://avatars.githubusercontent.com/u/29095?v=4", + "profile": "https://github.com/jaxn", + "contributions": [ + "instructions" + ] + }, + { + "login": "Ioana37", + "name": "Ioana A", + "avatar_url": "https://avatars.githubusercontent.com/u/69301842?v=4", + "profile": "https://github.com/Ioana37", + "contributions": [ + "instructions" + ] + }, + { + "login": "hashimwarren", + "name": "Hashim Warren", + "avatar_url": "https://avatars.githubusercontent.com/u/6027587?v=4", + "profile": "https://github.com/hashimwarren", + "contributions": [ + "agents" + ] + }, + { + "login": "0GiS0", + "name": "Gisela Torres", + "avatar_url": "https://avatars.githubusercontent.com/u/175379?v=4", + "profile": "https://hachyderm.io/@0gis0", + "contributions": [ + "agents" + ] + }, + { + "login": "giomartinsdev", + "name": "Giovanni de Almeida Martins", + "avatar_url": "https://avatars.githubusercontent.com/u/125399281?v=4", + "profile": "https://github.com/giomartinsdev", + "contributions": [ + "instructions" + ] + }, + { + "login": "jfversluis", + "name": "Gerald Versluis", + "avatar_url": "https://avatars.githubusercontent.com/u/939291?v=4", + "profile": "https://jfversluis.dev/", + "contributions": [ + "instructions" ] } - ], - "contributorsPerLine": 7, - "linkToUsage": true, - "commitType": "docs" + ] } diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index 13adbaa3..159910ee 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -8,32 +8,52 @@ on: jobs: contributors: runs-on: ubuntu-latest + timeout-minutes: 12 permissions: contents: write pull-requests: write steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: - fetch-depth: 0 + fetch-depth: 0 # Required: add-missing-contributors.js needs full git history + + - name: Extract Node version from package.json + id: node-version + run: | + NODE_VERSION=$(jq -r '.engines.node // "22.x"' package.json) + echo "version=${NODE_VERSION}" >> "$GITHUB_OUTPUT" - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: - node-version: "20" + node-version: ${{ steps.node-version.outputs.version }} - name: Install dependencies - run: npm install + run: npm ci - - name: Update contributors - run: npm run contributors:check + - name: Check and report contributors + run: | + CHECK_OUTPUT=$(npm run contributors:check 2>&1) + echo "$CHECK_OUTPUT" + + if echo "$CHECK_OUTPUT" | grep -q "Missing contributors"; then + echo "Missing contributors detected, generating report..." + mkdir -p reports + npm run contributors:report + + if [ -f reports/contributor-report.md ]; then + cat reports/contributor-report.md >> $GITHUB_STEP_SUMMARY + fi + else + echo "No missing contributors found" + fi env: PRIVATE_TOKEN: ${{ secrets.GITHUB_TOKEN }} + continue-on-error: true - name: Regenerate README - run: | - npm install - npm start + run: npm start - name: Check for changes id: verify-changed-files diff --git a/.gitignore b/.gitignore index 8ff4ff51..893a921b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules *.orig Copilot-Processing.md +reports/ # macOS system files .DS_Store diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 524a647f..2f9bb65f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -191,7 +191,8 @@ For full example of usage checkout edge-ai tasks collection: - A brief description of what your instruction/prompt does - Any relevant context or usage notes -**Note**: Once your contribution is merged, you'll automatically be added to our [Contributors](./README.md#contributors-) section! We use [all-contributors](https://github.com/all-contributors/all-contributors) to recognize all types of contributions to the project. +> [!NOTE] +> We use [all-contributors](https://github.com/all-contributors/all-contributors) to recognize all types of contributions to the project. Jump to [Contributors Recognition](#contributor-recognition) to learn more! ## What We Accept @@ -225,21 +226,33 @@ To maintain a safe, responsible, and constructive community, we will **not accep - **Write clearly**: Use simple, direct language - **Promote best practices**: Encourage secure, maintainable, and ethical development practices -## Contributors Recognition +## Contributor Recognition -This project uses [all-contributors](https://github.com/all-contributors/all-contributors) to recognize contributors. When you make a contribution, you'll automatically be recognized in our contributors list! +We use [all-contributors](https://github.com/all-contributors/all-contributors) to recognize **all types of contributions** to this project. -We welcome contributions of all types, including: +To add yourself, leave a comment on a relevant issue or pull request using your GitHub username and the appropriate contribution type(s): -- 📝 Documentation improvements -- 💻 Code contributions -- 🐛 Bug reports and fixes -- 🎨 Design improvements -- 💡 Ideas and suggestions -- 🤔 Answering questions -- 📢 Promoting the project +```markdown +@all-contributors add @username for contributionType1, contributionType2 +``` + +The contributors list is updated automatically every Sunday at **3:00 AM UTC**. When the next run completes, your name will appear in the [README Contributors](./README.md#contributors-) section. + +### Contribution Types + +We welcome many kinds of contributions, including the custom categories below: + +| Category | Description | Emoji | +| --- | --- | :---: | +| **Instructions** | Custom instruction sets that guide GitHub Copilot behavior | 🧭 | +| **Prompts** | Reusable or one-off prompts for GitHub Copilot | ⌨️ | +| **Agents (Chat Modes)** | Defined Copilot roles or personalities | 🎭 | +| **Collections** | Curated bundles of related prompts, agents, or instructions | 🎁 | + +In addition, all standard contribution types supported by [All Contributors](https://allcontributors.org/emoji-key/) are recognized. + +> Every contribution matters. Thanks for helping improve this resource for the GitHub Copilot community. -Your contributions help make this resource better for the entire GitHub Copilot community! ## Code of Conduct diff --git a/README.md b/README.md index 58881bc9..d22fa5cf 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,6 @@ # 🤖 Awesome GitHub Copilot Customizations +[![Powered by Awesome Copilot](https://img.shields.io/badge/Powered_by-Awesome_Copilot-blue?logo=githubcopilot)](https://aka.ms/awesome-github-copilot?style=flat-square) [![GitHub contributors from allcontributors.org](https://img.shields.io/github/all-contributors/github/awesome-copilot?style=flat-square&color=ee8449)](#contributors-) -[![Powered by Awesome Copilot](https://img.shields.io/badge/Powered_by-Awesome_Copilot-blue?logo=githubcopilot)](https://aka.ms/awesome-github-copilot) - -[![All Contributors](https://img.shields.io/badge/all_contributors-93-orange.svg?style=flat-square)](#contributors-) - A community created collection of custom agents, prompts, and instructions to supercharge your GitHub Copilot experience across different domains, languages, and use cases. @@ -127,7 +124,7 @@ The customizations in this repository are sourced from and created by third-part ## Contributors ✨ -Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): +Thanks goes to these wonderful people ([emoji key](./CONTRIBUTING.md#contributors-recognition)): @@ -135,125 +132,215 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/eng/README.md b/eng/README.md new file mode 100644 index 00000000..ff95c85d --- /dev/null +++ b/eng/README.md @@ -0,0 +1,36 @@ +# Contributor Reporting (Maintainers) 🚧 + +This directory contains a lightweight helper to generate human-readable reports about missing contributors. + +- `contributor-report.mjs` — generates a markdown report of merged PRs for missing contributors (includes shared helpers). +- `add-missing-contributors.mjs` — on-demand maintainer script to automatically add missing contributors to `.all-contributorsrc` (infers contribution types from merged PR files, then runs the all-contributors CLI). + +## Key notes for maintainers + +- Reports are generated on-demand and output to `reports/contributor-report.md` for human review. +- The report output is intentionally minimal: a single list of affected PRs and one command to add missing contributor(s). +- This repository requires full git history for accurate analysis. In CI, set `fetch-depth: 0`. +- Link: [all-contributors CLI documentation](https://allcontributors.org/docs/en/cli) + +## On-demand scripts (not CI) + +These are maintainer utilities. They are intentionally on-demand only (but could be wired into CI later). + +### `add-missing-contributors.mjs` + +- Purpose: detect missing contributors, infer contribution types from their merged PR files, and run `npx all-contributors add ...` to update `.all-contributorsrc`. +- Requirements: + - GitHub CLI (`gh`) available (used to query merged PRs). + - `.all-contributorsrc` exists. + - Auth token set to avoid the anonymous GitHub rate limits: + - Set `GITHUB_TOKEN` (preferred), or `GH_TOKEN` for the `gh` CLI. + - If you use `PRIVATE_TOKEN` locally, `contributor-report.mjs` will map it to `GITHUB_TOKEN`. + +## Graceful shutdown + +- `contributor-report.mjs` calls `setupGracefulShutdown('script-name')` from `eng/utils/graceful-shutdown.mjs` early in the file to attach signal/exception handlers. + +## Testing & maintenance + +- Helper functions have small, deterministic behavior and include JSDoc comments. +- The `getMissingContributors` function in `contributor-report.mjs` is the single source of truth for detecting missing contributors from `all-contributors check` output. diff --git a/eng/add-missing-contributors.mjs b/eng/add-missing-contributors.mjs new file mode 100644 index 00000000..dc8911c5 --- /dev/null +++ b/eng/add-missing-contributors.mjs @@ -0,0 +1,306 @@ +/** + * One-time contributor detection and addition script. + * Discovers missing contributors, determines their contribution types from repo history, + * and updates .all-contributorsrc via the all-contributors CLI. + * + * Usage: node add-missing-contributors.mjs + */ +import { execSync } from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; +import { + getContributionTypes, + getMissingContributors, + fetchContributorMergedPrs +} from './contributor-report.mjs'; +import { setupGracefulShutdown } from './utils/graceful-shutdown.mjs'; + +const DEFAULT_CMD_TIMEOUT = 30_000; // 30 seconds + +setupGracefulShutdown('add-missing-contributors'); + +/** + * Get all files touched by a contributor from their merged PRs. + * @param {string} username + * @returns {string[]} + */ +const getContributorFiles = (username) => { + try { + console.log(`📁 Getting files for contributor: ${username}`); + + const prs = fetchContributorMergedPrs(username, { includeAllFiles: true }); + + if (prs.length === 0) { + console.log(`📭 No merged PRs found for ${username}`); + return []; + } + + const files = new Set(); + for (const pr of prs) { + for (const file of pr.files || []) { + if (file?.path) { + files.add(file.path); + } + } + } + + const fileList = Array.from(files); + console.log(`📄 Found ${fileList.length} unique files for ${username}: ${fileList.slice(0, 3).join(', ')}${fileList.length > 3 ? '...' : ''}`); + return fileList; + + } catch (error) { + console.error(`❌ Error getting files for ${username}:`, error.message); + return []; + } +}; + +/** + * Determine contribution types from a contributor's files. + * @param {string} username + * @returns {string} + */ +const analyzeContributor = (username) => { + try { + console.log(`🔍 Analyzing contribution types for: ${username}`); + const files = getContributorFiles(username); + + if (files.length === 0) { + console.log(`💡 No files found for ${username}, using 'code' fallback`); + return 'code'; + } + + const contributionTypes = getContributionTypes(files); + + if (!contributionTypes || contributionTypes.trim() === '') { + console.log(`💡 No matching types found for ${username}, using 'code' fallback`); + return 'code'; + } + + console.log(`✅ Determined types for ${username}: ${contributionTypes}`); + return contributionTypes; + + } catch (error) { + console.error(`❌ Error analyzing files for ${username}:`, error.message); + return 'code'; + } +}; + +/** + * Add a username to the ignore list in .all-contributorsrc. + * @param {string} username + * @returns {boolean} + */ +const addToIgnoreList = (username) => { + try { + const configPath = path.join(process.cwd(), '.all-contributorsrc'); + const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); + + const ignoreList = config.ignoreList || config.ignore || []; + if (!ignoreList.includes(username)) { + ignoreList.push(username); + config.ignoreList = ignoreList; + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + console.warn(`⚠️ Added ${username} to ignore list (user not found on GitHub)`); + return true; + } + return false; + } catch (error) { + console.error(`❌ Failed to add ${username} to ignore list:`, error.message); + return false; + } +}; + +/** + * Run the all-contributors CLI to add a contributor to the project. + * @param {string} username + * @param {string} types + * @returns {boolean} + */ +const addContributor = (username, types) => { + try { + console.log(`➕ Adding contributor: ${username} with types: ${types}`); + + const command = `npx all-contributors add ${username} ${types}`; + + execSync(command, { + encoding: 'utf8', + stdio: ['pipe', 'pipe', 'pipe'], + timeout: DEFAULT_CMD_TIMEOUT + }); + + return true; + + } catch (error) { + // System-level errors that should propagate up + if (error.message.includes('rate limit') || error.message.includes('403')) { + console.error(`⏱️ Rate limit encountered while adding ${username}.`); + throw error; + } + if (error.message.includes('network') || error.message.includes('timeout')) { + console.error(`🌐 Network error while adding ${username}.`); + throw error; + } + + // User-specific errors that can be skipped + if (error.message.includes('404') || error.message.includes('not found')) { + addToIgnoreList(username); + console.error(`❌ User ${username} not found, added to ignore list`); + return false; + } + + // Unknown error - log and skip + console.error(`❌ Failed to add contributor ${username}:`, error.message); + return false; + } +}; + +/** + * Process a single missing contributor: detect types and add via all-contributors CLI. + * @param {string} username + * @returns {{added:number, failed:number}} + */ +const processContributor = async (username) => { + let added = 0; + let failed = 0; + + try { + console.log(`📊 Step 2: Analyzing contribution types for ${username}...`); + const contributionTypes = analyzeContributor(username); + + console.log(`➕ Step 3: Adding ${username} with types: ${contributionTypes}...`); + + const success = addContributor(username, contributionTypes); + if (success) { + added++; + console.log(`✅ Successfully processed ${username}`); + } else { + failed++; + console.log(`❌ Failed to process ${username}`); + } + + } catch (error) { + failed++; + console.error(`💥 Error processing ${username}:`, error.message); + } + + return { added, failed }; +}; + +/** + * Main entry point: detect and add missing contributors. + */ +const main = async () => { + console.log('🚀 Starting add missing contributors script'); + console.log('='.repeat(50)); + + try { + console.log('\n📋 Step 1: Detecting missing contributors...'); + const missingContributors = getMissingContributors(); + + if (missingContributors.length === 0) { + console.log('🎉 No missing contributors found! All contributors are properly recognized.'); + return { processed: 0, added: 0, failed: 0 }; + } + + console.log(`\n🔄 Processing ${missingContributors.length} missing contributors...`); + + let processed = 0; + let added = 0; + let failed = 0; + + for (const username of missingContributors) { + console.log(`\n${'─'.repeat(30)}`); + console.log(`👤 Processing contributor: ${username}`); + + processed++; + + try { + const { added: deltaAdded, failed: deltaFailed } = await processContributor(username); + added += deltaAdded; + failed += deltaFailed; + } catch (error) { + // Re-throw system-level errors (rate limit, network, SIGINT) + console.error(`💥 System error processing ${username}:`, error.message); + throw error; + } + } + + return { processed, added, failed }; + } catch (error) { + console.error('\n💥 Fatal error in main execution:', error.message); + console.error('🛑 Script execution stopped'); + throw error; + } +}; + +/** + * Print a summary report of the run. + * @param {{processed:number, added:number, failed:number}} results + */ +const printSummaryReport = (results) => { + const { processed, added, failed } = results; + + console.log('\n' + '='.repeat(50)); + console.log('📊 EXECUTION SUMMARY'); + console.log('='.repeat(50)); + + console.log(`📋 Total contributors processed: ${processed}`); + console.log(`✅ Successfully added: ${added}`); + console.log(`❌ Failed to add: ${failed}`); + + if (processed === 0) { + console.log('\n🎉 SUCCESS: No missing contributors found - all contributors are properly recognized!'); + } else if (failed === 0) { + console.log('\n🎉 SUCCESS: All missing contributors have been successfully added!'); + console.log('💡 Next steps: Review the updated .all-contributorsrc file and commit the changes.'); + } else if (added > 0) { + console.log('\n⚠️ PARTIAL SUCCESS: Some contributors were added, but some failed.'); + console.log(`💡 ${added} contributors were successfully added.`); + console.log(`🔄 ${failed} contributors failed - check the error messages above for details.`); + console.log('💡 You may want to run the script again to retry failed contributors.'); + } else { + console.log('\n❌ FAILURE: No contributors could be added.'); + console.log('💡 Check the error messages above for troubleshooting guidance.'); + console.log('💡 Common issues: missing GITHUB_TOKEN, network problems, or API rate limits.'); + } + + console.log('\n📝 ACTIONABLE NEXT STEPS:'); + if (added > 0) { + console.log('• Review the updated .all-contributorsrc file'); + console.log('• Commit and push the changes to update the README'); + console.log('• Consider running "npm run contributors:generate" to update the README'); + } + if (failed > 0) { + console.log('• Check error messages above for specific failure reasons'); + console.log('• Verify GITHUB_TOKEN is set and has appropriate permissions'); + console.log('• Consider running the script again after resolving issues'); + } + if (processed === 0) { + console.log('• No action needed - all contributors are already recognized!'); + } + + console.log('\n' + '='.repeat(50)); +}; + +if (process.argv[1] === (new URL(import.meta.url)).pathname) { + try { + const results = await main(); + printSummaryReport(results); + + if (results.failed > 0 && results.added === 0) { + process.exit(1); + } else if (results.failed > 0) { + process.exit(2); + } else { + process.exit(0); + } + } catch (error) { + console.error('\n💥 Script execution failed:', error.message); + console.log('\n📝 TROUBLESHOOTING TIPS:'); + console.log('• Ensure you are in a git repository'); + console.log('• Verify all-contributors-cli is installed'); + console.log('• Check that .all-contributorsrc file exists'); + console.log('• Ensure GITHUB_TOKEN environment variable is set'); + process.exit(1); + } +} diff --git a/eng/contributor-report.mjs b/eng/contributor-report.mjs new file mode 100644 index 00000000..e67d4805 --- /dev/null +++ b/eng/contributor-report.mjs @@ -0,0 +1,597 @@ +/** + * Generate human-readable reports about missing contributors. + * This module queries merged PRs via 'gh' and produces a markdown report. + */ +import { execSync } from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; +import { setupGracefulShutdown } from './utils/graceful-shutdown.mjs'; + +const DEFAULT_CMD_TIMEOUT = 30_000; // 30s + +setupGracefulShutdown('contributor-report'); + +/** + * Patterns that represent generated files; contributors should not be credited + * for these files because they are not substantive authored content. + */ +export const AUTO_GENERATED_PATTERNS = [ + 'README.md', + 'README.*.md', + 'collections/*.md', + 'collections/*.collection.md', + 'docs/README.*.md', + 'docs/*.generated.md' +]; + +/** + * File globs used to infer contribution types from file paths. + */ +export const TYPE_PATTERNS = { + instructions: [ + 'instructions/*.instructions.md' + ], + prompts: [ + 'prompts/*.prompt.md' + ], + agents: [ + 'chatmodes/*.chatmode.md', + 'agents/*.agent.md' + ], + collections: [ + 'collections/*.collection.yml' + ], + doc: [ + 'docs/**/*.md', + '.github/**/*.md', + 'CONTRIBUTING.md', + 'SECURITY.md', + 'SUPPORT.md', + 'LICENSE.md', + 'CHANGELOG.md', + '*.md' + ], + infra: [ + '.github/workflows/**/*.yml', + '.github/workflows/**/*.yaml', + '**/*.yml', + '**/*.yaml' + ], + maintenance: [ + 'package*.json', + '*.config.js', + 'tsconfig*.json' + ], + code: [ + '**/*.{js,ts,mjs,cjs}', + '**/*.py' + ] +}; + +const globCache = new Map(); + +/** + * Convert a simple glob (with *, **) to a RegExp. + * This is intentionally small and deterministic for our repo patterns. + * @param {string} pattern + * @returns {RegExp} + */ +export const globToRegExp = (pattern) => { + const DOUBLE_WILDCARD_PLACEHOLDER = '§§DOUBLE§§'; + const replacements = [ + { pattern: /\\/g, replacement: '/' }, + { pattern: /\./g, replacement: String.raw`\.` }, + { pattern: /\*\*/g, replacement: DOUBLE_WILDCARD_PLACEHOLDER }, + { pattern: /\*/g, replacement: '[^/]*' }, + { pattern: new RegExp(DOUBLE_WILDCARD_PLACEHOLDER, 'g'), replacement: '.*' }, + { pattern: /\?/g, replacement: '.' }, + { pattern: /\//g, replacement: String.raw`\/` } + ]; + + const normalized = replacements.reduce((acc, { pattern, replacement }) => acc.replace(pattern, replacement), String(pattern)); + + return new RegExp(`^${normalized}$`); +}; + +/** + * Test whether a file path matches a glob pattern. + * @param {string} filePath + * @param {string} pattern + * @returns {boolean} + */ +export const matchGlob = (filePath, pattern) => { + if (!globCache.has(pattern)) { + try { + globCache.set(pattern, globToRegExp(pattern)); + } catch { + globCache.set(pattern, null); + } + } + + const regexp = globCache.get(pattern); + if (!regexp) { + return false; + } + + const normalized = filePath.replace(/\\/g, '/'); + return regexp.test(normalized); +}; + +/** + * Return true if the given path matches one of the known auto-generated patterns. + * @param {string} filePath + * @returns {boolean} + */ +export const isAutoGeneratedFile = (filePath) => { + return AUTO_GENERATED_PATTERNS.some((pattern) => matchGlob(filePath, pattern)); +}; + +/** + * Infer a contribution type string (e.g. 'prompts', 'agents', 'doc') for a file path. + * Returns null if no specific type matched. + * @param {string} filePath + * @returns {string|null} + */ +export const getFileContributionType = (filePath) => { + const normalized = filePath.replace(/\\/g, '/'); + + for (const [type, patterns] of Object.entries(TYPE_PATTERNS)) { + if (patterns.some((pattern) => matchGlob(normalized, pattern))) { + return type; + } + } + + return null; +}; + +/** + * Derive a comma-separated list of contribution type identifiers from a list of files. + * Auto-generated files are ignored. Returns '' when no files to process. + * @param {string[]} files + * @returns {string} + */ +export const getContributionTypes = (files) => { + const types = new Set(); + let processed = 0; + + for (const file of files) { + if (isAutoGeneratedFile(file)) { + continue; + } + + processed += 1; + const type = getFileContributionType(file); + if (type) { + types.add(type); + } + } + + if (processed === 0) { + return ''; + } + + if (types.size === 0) { + types.add('code'); + } + + return Array.from(types).sort((a, b) => a.localeCompare(b)).join(','); +}; + +/** + * Check .all-contributors output to discover missing contributors. + * This is the canonical implementation used by contributor tooling. + * @returns {string[]} + */ +export const getMissingContributors = () => { + try { + console.log('🔍 Checking for missing contributors...'); + + const configPath = path.join(process.cwd(), '.all-contributorsrc'); + const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); + const ignoreEntries = config.ignoreList || config.ignore || []; + const ignoreSet = new Set(ignoreEntries.map((entry) => entry.toLowerCase())); + + if (ignoreSet.size > 0) { + console.log(`📋 Loaded ignore list: ${Array.from(ignoreSet).join(', ')}`); + } + + const output = execSync('npx all-contributors check', { + encoding: 'utf8', + stdio: ['pipe', 'pipe', 'pipe'], + timeout: DEFAULT_CMD_TIMEOUT + }); + + const lines = output.split('\n'); + + const headerLineIndex = lines.findIndex(line => + line.includes('Missing contributors in .all-contributorsrc:') + ); + + if (headerLineIndex === -1) { + console.log('✅ No missing contributors found'); + return []; + } + + let contributorsLine = ''; + for (let i = headerLineIndex + 1; i < lines.length; i++) { + const line = lines[i].trim(); + + if (line.includes('Unknown contributors') || line.includes('✨')) { + break; + } + + if (line && !line.startsWith('⠙') && !line.startsWith('✨')) { + contributorsLine = line; + break; + } + } + + if (!contributorsLine) { + console.log('✅ No missing contributors found'); + return []; + } + + const allUsernames = contributorsLine + .split(',') + .map(username => username.trim()) + .filter(username => username.length > 0); + + const filteredUsernames = allUsernames.filter(username => { + const lowerUsername = username.toLowerCase(); + + if (ignoreSet.has(lowerUsername)) { + console.log(`⏭️ FILTERED: ${username} is in ignore list`); + return false; + } + + return true; + }); + + console.log(`📋 Found ${filteredUsernames.length} missing contributors after filtering: ${filteredUsernames.join(', ')}`); + return filteredUsernames; + + } catch (error) { + console.error('❌ Error checking for missing contributors:', error.message); + if (error.message.includes('command not found') || error.message.includes('not recognized')) { + console.error('💡 Make sure all-contributors-cli is installed: npm install all-contributors-cli'); + } + return []; + } +}; + +// --- REPORT GENERATION LOGIC --- + +/** + * Get the current GitHub repository in owner/repo format. + * Tries upstream first, then origin. + * @returns {string} + */ +const getGitHubRepo = () => { + try { + const upstreamUrl = execSync('git config --get remote.upstream.url', { + encoding: 'utf8', + stdio: ['pipe', 'pipe', 'pipe'] + }).trim(); + if (upstreamUrl) { + const match = upstreamUrl.match(/github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/); + if (match) return `${match[1]}/${match[2]}`; + } + } catch (e) { + console.debug('upstream not found, trying origin'); + } + + try { + const originUrl = execSync('git config --get remote.origin.url', { + encoding: 'utf8', + stdio: ['pipe', 'pipe', 'pipe'] + }).trim(); + const match = originUrl.match(/github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/); + if (match) return `${match[1]}/${match[2]}`; + } catch (e) { + console.debug('origin not found, using default'); + } + + return 'github/awesome-copilot'; +}; + +const CONTRIBUTION_TYPE_MAP = { + 'instructions': { symbol: '🧭', description: 'The big AI prompt recipes (Copilot instruction sets)' }, + 'prompts': { symbol: '⌨️', description: 'One-shot or reusable user-level prompts' }, + 'agents': { symbol: '🎭', description: 'Defined Copilot personalities / roles' }, + 'collections': { symbol: '🎁', description: 'Bundled thematic sets (e.g., "Copilot for Docs")' } +}; + +/** + * Fetch merged PRs for a GitHub username using the GH CLI and filter files. + * @param {string} username + * @param {{includeAllFiles?:boolean}} [opts] + * @returns {Array} Array of PR objects + */ +export const fetchContributorMergedPrs = (username, { includeAllFiles = false } = {}) => { + try { + const repo = getGitHubRepo(); + const result = execSync( + `gh pr list --repo ${repo} --state merged --author ${username} --json number,title,mergedAt,files,url --limit 100`, + { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'], timeout: DEFAULT_CMD_TIMEOUT } + ); + const prs = JSON.parse(result); + + if (includeAllFiles) { + return prs; + } + + return prs.filter(pr => { + const hasNonConfigFiles = pr.files.some(file => + !isAutoGeneratedFile(file.path) + ); + return hasNonConfigFiles; + }); + } catch (error) { + console.error(`Failed to fetch PRs for ${username}:`, error.message); + return []; + } +}; + +/** + * Convert a PR object into a normalized report entry with types and file details. + * @param {{login:string}} contributor + * @param {object} pr + * @param {{includeAllFiles?:boolean}} [opts] + * @returns {object|null} + */ +const generatePRReport = (contributor, pr, { includeAllFiles = false } = {}) => { + const types = new Set(); + const fileDetails = []; + + for (const file of pr.files) { + if (!file?.path) { + continue; + } + + // Include generated files only if includeAllFiles is true + if (!includeAllFiles && isAutoGeneratedFile(file.path)) { + continue; + } + + const type = getFileContributionType(file.path) || 'ideas'; + if (type) { + types.add(type); + } + + fileDetails.push({ + path: file.path, + type: type || 'unknown', + additions: file.additions, + deletions: file.deletions + }); + } + + // If no non-filtered files contributed to types, and we're not asked for all files, skip this PR + if (types.size === 0 && !includeAllFiles) { + return null; + } + + // Fallback to 'code' if no types detected + if (types.size === 0) { + types.add('code'); + } + + const typeList = Array.from(types); + + return { + prNumber: pr.number, + prTitle: pr.title, + prUrl: pr.url, + mergedAt: pr.mergedAt, + contributionTypes: typeList, + files: fileDetails, + commentSnippet: `@all-contributors please add @${contributor.login} for ${typeList.join(', ')}` + }; +}; + +/** + * Build a contributor report by inspecting merged PRs and mapping files to types. + * Returns null when no relevant PRs were found (unless includeAllFiles is true). + * @param {string} username + * @param {{includeAllFiles?:boolean}} [opts] + * @returns {object|null} + */ +export const generateContributorReport = (username, { includeAllFiles = false } = {}) => { + console.log(`Inspecting ${username}...`); + + const prs = fetchContributorMergedPrs(username, { includeAllFiles }); + const prReports = prs + .map(pr => generatePRReport({ login: username }, pr, { includeAllFiles })) + .filter(report => report !== null); + + // If no relevant PR reports and not explicitly including all files, skip the contributor entirely + if (prReports.length === 0 && !includeAllFiles) { + return null; + } + + return { + username, + totalPRs: prs.length, + prs: prReports + }; +}; + +/** + * Render a set of contributor reports as markdown for human review. + * @param {Array} reports + * @param {number} missingCount - number of missing contributors detected + * @returns {string} + */ +export const generateMarkdownReport = (reports, missingCount = 0) => { + // The report is intentionally minimal: a single list of affected PRs and + // a single copy/paste command maintainers can run locally. + // No timestamps, per-file breakdowns, or duplicated metadata. + + if (!missingCount) { + return 'No missing contributors detected.\n'; + } + + // 1) Single list of affected PRs (deduped). + const prEntries = new Map(); // key=prNumber or url, value={number,url,mergedAt} + for (const report of reports) { + for (const pr of report.prs) { + const key = pr.prUrl || String(pr.prNumber); + if (!prEntries.has(key)) { + prEntries.set(key, { + number: pr.prNumber, + url: pr.prUrl, + mergedAt: pr.mergedAt + }); + } + } + } + + const prList = Array.from(prEntries.values()).sort((a, b) => { + // Prefer chronological sort for stable “what happened” review. + const aTime = a.mergedAt ? Date.parse(a.mergedAt) : 0; + const bTime = b.mergedAt ? Date.parse(b.mergedAt) : 0; + if (aTime !== bTime) return aTime - bTime; + return (a.number ?? 0) - (b.number ?? 0); + }); + + // 2) One command (one line). If multiple users are missing, chain them. + const commandParts = []; + for (const report of reports) { + const typeSet = new Set(); + for (const pr of report.prs) { + for (const type of pr.contributionTypes || []) { + typeSet.add(type); + } + } + + const types = Array.from(typeSet).filter(Boolean).sort((a, b) => a.localeCompare(b)); + const typesArg = types.length > 0 ? types.join(',') : 'code'; + commandParts.push(`npx all-contributors add ${report.username} ${typesArg}`); + } + + let markdown = ''; + markdown += prList.map((pr) => `- #${pr.number} ${pr.url}`).join('\n'); + markdown += '\n\n'; + markdown += commandParts.join(' && '); + markdown += '\n'; + return markdown; +}; + +/** + * Check whether a PR already contains an all-contributors bot comment. + * @param {number} prNumber + * @returns {boolean} + */ +export const hasExistingAllContributorsComment = (prNumber) => { + try { + const repo = getGitHubRepo(); + const json = execSync(`gh pr view ${prNumber} --repo ${repo} --json comments`, { + encoding: 'utf8', + stdio: ['pipe', 'pipe', 'pipe'], + timeout: DEFAULT_CMD_TIMEOUT + }); + + const data = JSON.parse(json); + const comments = data?.comments?.nodes || data?.comments || []; + return comments.some((comment) => comment?.body?.includes(`@all-contributors`)); + } catch (error) { + console.warn(`⚠️ Unable to inspect comments for PR #${prNumber}: ${error.message}`); + return false; + } +}; + +/** + * Post a comment to a PR using the GH CLI. + * @param {number} prNumber + * @param {string} body + * @returns {boolean} + */ +export const postCommentOnPr = (prNumber, body) => { + try { + const repo = getGitHubRepo(); + execSync(`gh pr comment ${prNumber} --repo ${repo} --body "${body.replace(/"/g, '\\"')}"`, { + encoding: 'utf8', + stdio: ['pipe', 'inherit', 'inherit'], + timeout: DEFAULT_CMD_TIMEOUT + }); + + console.log(`💬 Posted recommendation comment on PR #${prNumber}`); + return true; + } catch (error) { + console.warn(`⚠️ Failed to post comment on PR #${prNumber}: ${error.message}`); + return false; + } +}; + +/** + * Post suggested all-contributors comments to PRs for a collection of reports. + * @param {Array} reports + */ +export const autoAddCommentsToReports = (reports) => { + for (const report of reports) { + for (const pr of report.prs) { + if (hasExistingAllContributorsComment(pr.prNumber)) { + console.log(`💬 Skipping PR #${pr.prNumber} for @${report.username} — comment already present`); + continue; + } + + const types = pr.contributionTypes.map(t => '`' + t + '`').join(', '); + const commentLines = [ + `Thanks for the contribution @${report.username}!`, + '', + `We detected contribution categories for this PR: ${types || '`code`'}.`, + '', + `@all-contributors please add @${report.username} for ${pr.contributionTypes.join(', ')}` + ]; + + const body = commentLines.join('\n'); + postCommentOnPr(pr.prNumber, body); + } + } +}; + +const main = () => { + try { + const ghToken = process.env.GITHUB_TOKEN || process.env.PRIVATE_TOKEN; + if (!ghToken) { + console.error('❌ GITHUB_TOKEN or PRIVATE_TOKEN environment variable is required for GitHub CLI operations'); + process.exit(1); + } + + // gh CLI only reads GITHUB_TOKEN or GH_TOKEN, so ensure it's set + if (process.env.PRIVATE_TOKEN && !process.env.GITHUB_TOKEN) { + process.env.GITHUB_TOKEN = process.env.PRIVATE_TOKEN; + } + + const args = new Set(process.argv.slice(2)); + const autoAdd = args.has('--auto-add-pr-comments'); + const includeAllFiles = args.has('--include-all-pr-files'); + + const contributors = getMissingContributors(); + console.log(`Inspecting ${contributors.length} missing contributors...\n`); + + const reports = []; + for (const contributor of contributors) { + const report = generateContributorReport(contributor, { includeAllFiles }); + reports.push(report || { username: contributor, totalPRs: 0, prs: [] }); + } + + const markdown = generateMarkdownReport(reports, contributors.length); + const outputPath = path.join(process.cwd(), 'reports', 'contributor-report.md'); + fs.writeFileSync(outputPath, markdown); + + console.log(`Report saved to: ${outputPath}`); + + if (autoAdd) { + autoAddCommentsToReports(reports); + } + + } catch (error) { + console.error('Error generating report:', error); + process.exit(1); + } +}; + +if (process.argv[1] === (new URL(import.meta.url)).pathname) { + main(); +} diff --git a/eng/utils/graceful-shutdown.mjs b/eng/utils/graceful-shutdown.mjs new file mode 100644 index 00000000..036f33f2 --- /dev/null +++ b/eng/utils/graceful-shutdown.mjs @@ -0,0 +1,60 @@ +/** + * Lightweight graceful shutdown helper for one-off scripts. + * + * Call setupGracefulShutdown('script-name') early in your script to attach + * signal and exception handlers that exit the process cleanly. + * + * @param {string} name - Human readable name for log messages + * @param {{exitCode?:number}} [opts] + * @returns {() => void} teardown function to remove handlers (useful in tests) + */ +export const setupGracefulShutdown = (name, { exitCode = 1 } = {}) => { + let _shuttingDown = false; + + const cleanup = (signal) => { + if (_shuttingDown) return; + _shuttingDown = true; + console.log(`\n🛑 ${name}: received ${signal}, shutting down gracefully...`); + // Best-effort cleanup: keep this short and synchronous + try { + // Place for lightweight cleanup tasks if needed in future + } catch (e) { + console.error(`${name}: error during shutdown cleanup:`, e); + } + + // Exit with a non-zero code to indicate abnormal termination + try { + process.exit(exitCode); + } catch (e) { + // process.exit may not be desirable in some test harnesses; swallow errors + console.warn(`${name}: process.exit failed:`, e?.message); + } + }; + + const onSigInt = () => cleanup('SIGINT'); + const onSigTerm = () => cleanup('SIGTERM'); + const onSigHup = () => cleanup('SIGHUP'); + const onUncaught = (err) => { + console.error(`${name}: Uncaught exception:`, err); + cleanup('uncaughtException'); + }; + const onUnhandledRejection = (reason) => { + console.error(`${name}: Unhandled promise rejection:`, reason); + cleanup('unhandledRejection'); + }; + + process.on('SIGINT', onSigInt); + process.on('SIGTERM', onSigTerm); + process.on('SIGHUP', onSigHup); + process.on('uncaughtException', onUncaught); + process.on('unhandledRejection', onUnhandledRejection); + + // Return a teardown function useful for tests or if a caller wants to remove handlers + return () => { + process.removeListener('SIGINT', onSigInt); + process.removeListener('SIGTERM', onSigTerm); + process.removeListener('SIGHUP', onSigHup); + process.removeListener('uncaughtException', onUncaught); + process.removeListener('unhandledRejection', onUnhandledRejection); + }; +}; diff --git a/package.json b/package.json index 5f25ae57..bf367d1a 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "start": "npm run build", "build": "node ./eng/update-readme.mjs", "contributors:add": "all-contributors add", + "contributors:report": "node ./eng/contributor-report.mjs", "contributors:generate": "all-contributors generate", "contributors:check": "all-contributors check", "collection:validate": "node ./eng/validate-collections.mjs", @@ -24,7 +25,9 @@ "copilot", "ai", "prompts", - "instructions" + "instructions", + "chat modes", + "agents" ], "author": "GitHub", "license": "MIT", From d9d99cf3aadad8ff50bb29ef341ba263367c641e Mon Sep 17 00:00:00 2001 From: Ashley Childress <6563688+anchildress1@users.noreply.github.com> Date: Fri, 19 Dec 2025 23:12:56 -0500 Subject: [PATCH 02/15] refactor(eng): update contributor report generator output - Modify generateMarkdownReport to include per-user sections with PR details - Remove total PR count and simplify PR link format Commit-generated-by: GitHub Copilot Signed-off-by: Ashley Childress <6563688+anchildress1@users.noreply.github.com> --- eng/contributor-report.mjs | 105 ++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 47 deletions(-) diff --git a/eng/contributor-report.mjs b/eng/contributor-report.mjs index e67d4805..56005170 100644 --- a/eng/contributor-report.mjs +++ b/eng/contributor-report.mjs @@ -423,58 +423,74 @@ export const generateContributorReport = (username, { includeAllFiles = false } * @returns {string} */ export const generateMarkdownReport = (reports, missingCount = 0) => { - // The report is intentionally minimal: a single list of affected PRs and - // a single copy/paste command maintainers can run locally. - // No timestamps, per-file breakdowns, or duplicated metadata. - if (!missingCount) { return 'No missing contributors detected.\n'; } - // 1) Single list of affected PRs (deduped). - const prEntries = new Map(); // key=prNumber or url, value={number,url,mergedAt} - for (const report of reports) { - for (const pr of report.prs) { - const key = pr.prUrl || String(pr.prNumber); - if (!prEntries.has(key)) { - prEntries.set(key, { - number: pr.prNumber, - url: pr.prUrl, - mergedAt: pr.mergedAt - }); - } - } - } + const nowIso = new Date().toISOString(); - const prList = Array.from(prEntries.values()).sort((a, b) => { - // Prefer chronological sort for stable “what happened” review. - const aTime = a.mergedAt ? Date.parse(a.mergedAt) : 0; - const bTime = b.mergedAt ? Date.parse(b.mergedAt) : 0; - if (aTime !== bTime) return aTime - bTime; - return (a.number ?? 0) - (b.number ?? 0); - }); - // 2) One command (one line). If multiple users are missing, chain them. - const commandParts = []; - for (const report of reports) { + const computeTypesArg = (report) => { const typeSet = new Set(); - for (const pr of report.prs) { + for (const pr of report.prs || []) { for (const type of pr.contributionTypes || []) { - typeSet.add(type); + if (type) { + typeSet.add(type); + } } } - const types = Array.from(typeSet).filter(Boolean).sort((a, b) => a.localeCompare(b)); - const typesArg = types.length > 0 ? types.join(',') : 'code'; - commandParts.push(`npx all-contributors add ${report.username} ${typesArg}`); + const types = Array.from(typeSet).sort((a, b) => a.localeCompare(b)); + return types.length > 0 ? types.join(',') : 'code'; + }; + + const lines = []; + + lines.push('# Missing Contributors Report'); + lines.push(''); + lines.push(`Generated (ISO): ${nowIso}`); + lines.push(''); + lines.push(`Missing contributors: ${missingCount}`); + lines.push(''); + + for (const report of reports) { + lines.push(`## @${report.username}`); + lines.push(''); + + const prs = Array.from(report.prs || []).sort((a, b) => { + // Prefer most recent PRs first. + const aTime = a.mergedAt ? Date.parse(a.mergedAt) : 0; + const bTime = b.mergedAt ? Date.parse(b.mergedAt) : 0; + if (aTime !== bTime) return bTime - aTime; + return (b.prNumber ?? 0) - (a.prNumber ?? 0); + }); + + for (const pr of prs) { + lines.push(`### PR #${pr.prNumber}: ${pr.prTitle}`); + lines.push(''); + lines.push(`Add this comment on PR: ${pr.prUrl}`); + lines.push(''); + + const prTypes = (pr.contributionTypes || []).filter(Boolean); + const prTypesArg = prTypes.length > 0 ? prTypes.join(', ') : 'code'; + + lines.push('```text'); + lines.push(`@all-contributors please add @${report.username} for ${prTypesArg}`); + lines.push('```'); + lines.push(''); + } + + lines.push('### CLI command (all-contributors-cli)'); + lines.push(''); + lines.push('```bash'); + lines.push(`npx all-contributors add ${report.username} ${computeTypesArg(report)}`); + lines.push('```'); + lines.push(''); + lines.push('---'); + lines.push(''); } - let markdown = ''; - markdown += prList.map((pr) => `- #${pr.number} ${pr.url}`).join('\n'); - markdown += '\n\n'; - markdown += commandParts.join(' && '); - markdown += '\n'; - return markdown; + return `${lines.join('\n')}\n`; }; /** @@ -552,14 +568,9 @@ export const autoAddCommentsToReports = (reports) => { const main = () => { try { - const ghToken = process.env.GITHUB_TOKEN || process.env.PRIVATE_TOKEN; - if (!ghToken) { - console.error('❌ GITHUB_TOKEN or PRIVATE_TOKEN environment variable is required for GitHub CLI operations'); - process.exit(1); - } - - // gh CLI only reads GITHUB_TOKEN or GH_TOKEN, so ensure it's set - if (process.env.PRIVATE_TOKEN && !process.env.GITHUB_TOKEN) { + // gh CLI can use either its own authenticated session or token env vars. + // In CI, we commonly receive a token via PRIVATE_TOKEN. + if (process.env.PRIVATE_TOKEN && !process.env.GITHUB_TOKEN && !process.env.GH_TOKEN) { process.env.GITHUB_TOKEN = process.env.PRIVATE_TOKEN; } From 455267364123ec3c71930a3f4bd7d2d38d4ec4b6 Mon Sep 17 00:00:00 2001 From: Kent Yao Date: Wed, 14 Jan 2026 19:57:02 +0800 Subject: [PATCH 03/15] feat: enhance agent suggestion prompt to detect and update outdated agents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add version comparison process to identify outdated local agents - Introduce ⚠️ status icon for installed but outdated agents - Add detailed comparison of remote vs local agent content - Include update handling instructions for outdated agents - Enhance process to fetch and compare remote versions - Update output format to show outdated agents with specific differences --- ...st-awesome-github-copilot-agents.prompt.md | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/prompts/suggest-awesome-github-copilot-agents.prompt.md b/prompts/suggest-awesome-github-copilot-agents.prompt.md index dc4a14d5..c5aed01c 100644 --- a/prompts/suggest-awesome-github-copilot-agents.prompt.md +++ b/prompts/suggest-awesome-github-copilot-agents.prompt.md @@ -1,6 +1,6 @@ --- agent: "agent" -description: "Suggest relevant GitHub Copilot Custom Agents files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom agents in this repository." +description: "Suggest relevant GitHub Copilot Custom Agents files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom agents in this repository, and identifying outdated agents that need updates." tools: ["edit", "search", "runCommands", "runTasks", "changes", "testFailure", "openSimpleBrowser", "fetch", "githubRepo", "todos"] --- @@ -13,14 +13,23 @@ Analyze current repository context and suggest relevant Custom Agents files from 1. **Fetch Available Custom Agents**: Extract Custom Agents list and descriptions from [awesome-copilot README.agents.md](https://github.com/github/awesome-copilot/blob/main/docs/README.agents.md). Must use `fetch` tool. 2. **Scan Local Custom Agents**: Discover existing custom agent files in `.github/agents/` folder 3. **Extract Descriptions**: Read front matter from local custom agent files to get descriptions -4. **Analyze Context**: Review chat history, repository files, and current project needs -5. **Compare Existing**: Check against custom agents already available in this repository -6. **Match Relevance**: Compare available custom agents against identified patterns and requirements -7. **Present Options**: Display relevant custom agents with descriptions, rationale, and availability status -8. **Validate**: Ensure suggested agents would add value not already covered by existing agents -9. **Output**: Provide structured table with suggestions, descriptions, and links to both awesome-copilot custom agents and similar local custom agents - **AWAIT** user request to proceed with installation of specific custom agents. DO NOT INSTALL UNLESS DIRECTED TO DO SO. -10. **Download Assets**: For requested agents, automatically download and install individual agents to `.github/agents/` folder. Do NOT adjust content of the files. Use `#todos` tool to track progress. Prioritize use of `#fetch` tool to download assets, but may use `curl` using `#runInTerminal` tool to ensure all content is retrieved. +4. **Fetch Remote Versions**: For each local agent, fetch the corresponding version from awesome-copilot repository using raw GitHub URLs (e.g., `https://raw.githubusercontent.com/github/awesome-copilot/main/agents/`) +5. **Compare Versions**: Compare local agent content with remote versions to identify: + - Agents that are up-to-date (exact match) + - Agents that are outdated (content differs) + - Key differences in outdated agents (tools, description, content) +6. **Analyze Context**: Review chat history, repository files, and current project needs +7. **Match Relevance**: Compare available custom agents against identified patterns and requirements +8. **Present Options**: Display relevant custom agents with descriptions, rationale, and availability status including outdated agents +9. **Validate**: Ensure suggested agents would add value not already covered by existing agents +10. **Output**: Provide structured table with suggestions, descriptions, and links to both awesome-copilot custom agents and similar local custom agents + **AWAIT** user request to proceed with installation or updates of specific custom agents. DO NOT INSTALL OR UPDATE UNLESS DIRECTED TO DO SO. +11. **Download/Update Assets**: For requested agents, automatically: + - Download new agents to `.github/agents/` folder + - Update outdated agents by replacing with latest version from awesome-copilot + - Do NOT adjust content of the files + - Use `#fetch` tool to download assets, but may use `curl` using `#runInTerminal` tool to ensure all content is retrieved + - Use `#todos` tool to track progress ## Context Analysis Criteria @@ -46,6 +55,7 @@ Display analysis results in structured table comparing awesome-copilot custom ag | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ---------------------------------- | ------------------------------------------------------------- | | [amplitude-experiment-implementation.agent.md](https://github.com/github/awesome-copilot/blob/main/agents/amplitude-experiment-implementation.agent.md) | This custom agent uses Amplitude's MCP tools to deploy new experiments inside of Amplitude, enabling seamless variant testing capabilities and rollout of product features | ❌ No | None | Would enhance experimentation capabilities within the product | | [launchdarkly-flag-cleanup.agent.md](https://github.com/github/awesome-copilot/blob/main/agents/launchdarkly-flag-cleanup.agent.md) | Feature flag cleanup agent for LaunchDarkly | ✅ Yes | launchdarkly-flag-cleanup.agent.md | Already covered by existing LaunchDarkly custom agents | +| [principal-software-engineer.agent.md](https://github.com/github/awesome-copilot/blob/main/agents/principal-software-engineer.agent.md) | Provide principal-level software engineering guidance with focus on engineering excellence, technical leadership, and pragmatic implementation. | ⚠️ Outdated | principal-software-engineer.agent.md | Tools configuration differs: remote uses `'web/fetch'` vs local `'fetch'` - Update recommended | ## Local Agent Discovery Process @@ -54,19 +64,44 @@ Display analysis results in structured table comparing awesome-copilot custom ag 3. Build comprehensive inventory of existing agents 4. Use this inventory to avoid suggesting duplicates +## Version Comparison Process + +1. For each local agent file, construct the raw GitHub URL to fetch the remote version: + - Pattern: `https://raw.githubusercontent.com/github/awesome-copilot/main/agents/` +2. Fetch the remote version using the `fetch` tool +3. Compare entire file content (including front matter, tools array, and body) +4. Identify specific differences: + - **Front matter changes** (description, tools) + - **Tools array modifications** (added, removed, or renamed tools) + - **Content updates** (instructions, examples, guidelines) +5. Document key differences for outdated agents +6. Calculate similarity to determine if update is needed + ## Requirements - Use `githubRepo` tool to get content from awesome-copilot repository agents folder - Scan local file system for existing agents in `.github/agents/` directory - Read YAML front matter from local agent files to extract descriptions +- Compare local agents with remote versions to detect outdated agents - Compare against existing agents in this repository to avoid duplicates - Focus on gaps in current agent library coverage - Validate that suggested agents align with repository's purpose and standards - Provide clear rationale for each suggestion - Include links to both awesome-copilot agents and similar local agents +- Clearly identify outdated agents with specific differences noted - Don't provide any additional information or context beyond the table and the analysis ## Icons Reference -- ✅ Already installed in repo +- ✅ Already installed and up-to-date +- ⚠️ Installed but outdated (update available) - ❌ Not installed in repo + +## Update Handling + +When outdated agents are identified: +1. Include them in the output table with ⚠️ status +2. Document specific differences in the "Suggestion Rationale" column +3. Provide recommendation to update with key changes noted +4. When user requests update, replace entire local file with remote version +5. Preserve file location in `.github/agents/` directory From 46c07753c05e292756e3dafa6ad5a8c31432c206 Mon Sep 17 00:00:00 2001 From: Kent Yao Date: Wed, 14 Jan 2026 20:01:21 +0800 Subject: [PATCH 04/15] README --- collections/awesome-copilot.md | 2 +- docs/README.prompts.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/collections/awesome-copilot.md b/collections/awesome-copilot.md index 1f85ce6c..3c45c431 100644 --- a/collections/awesome-copilot.md +++ b/collections/awesome-copilot.md @@ -10,7 +10,7 @@ Meta prompts that help you discover and generate curated GitHub Copilot chat mod | ----- | ---- | ----------- | ----------- | | [Meta Agentic Project Scaffold](../agents/meta-agentic-project-scaffold.agent.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/agent?url=vscode%3Achat-agent%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fagents%2Fmeta-agentic-project-scaffold.agent.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/agent?url=vscode-insiders%3Achat-agent%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fagents%2Fmeta-agentic-project-scaffold.agent.md) | Agent | Meta agentic project creation assistant to help users create and manage project workflows effectively. | | | [Suggest Awesome GitHub Copilot Collections](../prompts/suggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md) | Prompt | Suggest relevant GitHub Copilot collections from the awesome-copilot repository based on current repository context and chat history, providing automatic download and installation of collection assets. | | -| [Suggest Awesome GitHub Copilot Custom Agents](../prompts/suggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md) | Prompt | Suggest relevant GitHub Copilot Custom Agents files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom agents in this repository. | | +| [Suggest Awesome GitHub Copilot Custom Agents](../prompts/suggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md) | Prompt | Suggest relevant GitHub Copilot Custom Agents files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom agents in this repository, and identifying outdated agents that need updates. | | | [Suggest Awesome GitHub Copilot Custom Chat Modes](../prompts/suggest-awesome-github-copilot-chatmodes.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-chatmodes.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-chatmodes.prompt.md) | Prompt | Suggest relevant GitHub Copilot Custom Chat Modes files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom chat modes in this repository. | | | [Suggest Awesome GitHub Copilot Instructions](../prompts/suggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md) | Prompt | Suggest relevant GitHub Copilot instruction files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing instructions in this repository. | | | [Suggest Awesome GitHub Copilot Prompts](../prompts/suggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md) | Prompt | Suggest relevant GitHub Copilot prompt files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing prompts in this repository. | | diff --git a/docs/README.prompts.md b/docs/README.prompts.md index 55f4e215..1a0b6747 100644 --- a/docs/README.prompts.md +++ b/docs/README.prompts.md @@ -129,7 +129,7 @@ Ready-to-use prompt templates for specific development scenarios and tasks, defi | [SQL Code Review](../prompts/sql-code-review.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsql-code-review.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsql-code-review.prompt.md) | Universal SQL code review assistant that performs comprehensive security, maintainability, and code quality analysis across all SQL databases (MySQL, PostgreSQL, SQL Server, Oracle). Focuses on SQL injection prevention, access control, code standards, and anti-pattern detection. Complements SQL optimization prompt for complete development coverage. | | [SQL Performance Optimization Assistant](../prompts/sql-optimization.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsql-optimization.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsql-optimization.prompt.md) | Universal SQL performance optimization assistant for comprehensive query tuning, indexing strategies, and database performance analysis across all SQL databases (MySQL, PostgreSQL, SQL Server, Oracle). Provides execution plan analysis, pagination optimization, batch operations, and performance monitoring guidance. | | [Suggest Awesome GitHub Copilot Collections](../prompts/suggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md) | Suggest relevant GitHub Copilot collections from the awesome-copilot repository based on current repository context and chat history, providing automatic download and installation of collection assets. | -| [Suggest Awesome GitHub Copilot Custom Agents](../prompts/suggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md) | Suggest relevant GitHub Copilot Custom Agents files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom agents in this repository. | +| [Suggest Awesome GitHub Copilot Custom Agents](../prompts/suggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md) | Suggest relevant GitHub Copilot Custom Agents files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom agents in this repository, and identifying outdated agents that need updates. | | [Suggest Awesome GitHub Copilot Custom Chat Modes](../prompts/suggest-awesome-github-copilot-chatmodes.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-chatmodes.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-chatmodes.prompt.md) | Suggest relevant GitHub Copilot Custom Chat Modes files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom chat modes in this repository. | | [Suggest Awesome GitHub Copilot Instructions](../prompts/suggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md) | Suggest relevant GitHub Copilot instruction files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing instructions in this repository. | | [Suggest Awesome GitHub Copilot Prompts](../prompts/suggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md) | Suggest relevant GitHub Copilot prompt files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing prompts in this repository. | From e57e0f481695a4038b028041bd7a294f5e93ec3a Mon Sep 17 00:00:00 2001 From: jhauga Date: Wed, 14 Jan 2026 16:01:01 -0500 Subject: [PATCH 05/15] Instructions for best color practices --- docs/README.instructions.md | 1 + ...html-css-style-color-guide.instructions.md | 104 ++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 instructions/html-css-style-color-guide.instructions.md diff --git a/docs/README.instructions.md b/docs/README.instructions.md index 1f7d3272..4574b3d5 100644 --- a/docs/README.instructions.md +++ b/docs/README.instructions.md @@ -86,6 +86,7 @@ Team and project-specific instructions to enhance GitHub Copilot's behavior for | [Go MCP Server Development Guidelines](../instructions/go-mcp-server.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fgo-mcp-server.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fgo-mcp-server.instructions.md) | Best practices and patterns for building Model Context Protocol (MCP) servers in Go using the official github.com/modelcontextprotocol/go-sdk package. | | [Guidance for Localization](../instructions/localization.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Flocalization.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Flocalization.instructions.md) | Guidelines for localizing markdown documents | | [How to Use the Sample Components](../instructions/pcf-sample-components.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fpcf-sample-components.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fpcf-sample-components.instructions.md) | How to use and run PCF sample components from the PowerApps-Samples repository | +| [HTML CSS Style Color Guide](../instructions/html-css-style-color-guide.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fhtml-css-style-color-guide.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fhtml-css-style-color-guide.instructions.md) | Color usage guidelines and styling rules for HTML elements to ensure accessible, professional designs. | | [Instructions for accessibility](../instructions/a11y.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fa11y.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fa11y.instructions.md) | Guidance for creating more accessible code | | [Java 11 to Java 17 Upgrade Guide](../instructions/java-11-to-java-17-upgrade.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fjava-11-to-java-17-upgrade.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fjava-11-to-java-17-upgrade.instructions.md) | Comprehensive best practices for adopting new Java 17 features since the release of Java 11. | | [Java 17 to Java 21 Upgrade Guide](../instructions/java-17-to-java-21-upgrade.instructions.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fjava-17-to-java-21-upgrade.instructions.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/instructions?url=vscode-insiders%3Achat-instructions%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Finstructions%2Fjava-17-to-java-21-upgrade.instructions.md) | Comprehensive best practices for adopting new Java 21 features since the release of Java 17. | diff --git a/instructions/html-css-style-color-guide.instructions.md b/instructions/html-css-style-color-guide.instructions.md new file mode 100644 index 00000000..6a017d9b --- /dev/null +++ b/instructions/html-css-style-color-guide.instructions.md @@ -0,0 +1,104 @@ +--- +description: 'Color usage guidelines and styling rules for HTML elements to ensure accessible, professional designs.' +applyTo: '**/*.html, **/*.css, **/*.js' +--- + +# HTML CSS Style Color Guide + +Follow these guidelines when updating or creating HTML/CSS styles for browser rendering. Color names +represent the full spectrum of their respective hue ranges (e.g., "blue" includes navy, sky blue, etc.). + +## Color Definitions + +- **Hot Colors**: Oranges, reds, and yellows +- **Cool Colors**: Blues, greens, and purples +- **Neutral Colors**: Grays and grayscale variations +- **Binary Colors**: Black and white +- **60-30-10 Rule** + - **Primary Color**: Use 60% of the time (*cool or light color*) + - **Secondary Color**: Use 30% of the time (*cool or light color*) + - **Accent**: Use 10% of the time (*complimentary hot color*) + +## Color Usage Guidelines + +Balance the colors used by applying the **60-30-10 rule** to graphic desing elements like backgrounds, +buttons, cards, etc... + +### Background Colors + +**Never Use:** + +- Purple or magenta +- Red, orange, or yellow +- Pink +- Any hot color + +**Recommended:** + +- White or off-white +- Light cool colors (e.g., light blues, light greens) +- Subtle neutral tones +- Light gradients with minimal color shift + +### Text Colors + +**Never Use:** + +- Yellow (poor contrast and readability) +- Pink +- Pure white or light text on light backgrounds +- Pure black or dark text on dark backgrounds + +**Recommended:** + +- Dark neutral colors (e.g., #1f2328, #24292f) +- Near-black variations (#000000 to #333333) + - Ensure background is a light color +- Dark grays (#4d4d4d, #6c757d) +- High-contrast combinations for accessibility +- Near-white variations (#ffffff to #f0f2f3) + - Ensure background is a dark color + +### Colors to Avoid + +Unless explicitly required by design specifications or user request, avoid: + +- Bright purples and magentas +- Bright pinks and neon colors +- Highly saturated hot colors +- Colors with low contrast ratios (fails WCAG accessibility standards) + +### Colors to Use Sparingly + +**Hot Colors** (red, orange, yellow): + +- Reserve for critical alerts, warnings, or error messages +- Use only when conveying urgency or importance +- Limit to small accent areas rather than large sections +- Consider alternatives like icons or bold text before using hot colors + +## Gradients + +Apply gradients with subtle color transitions to maintain professional aesthetics. + +### Best Practices + +- Keep color shifts minimal (e.g., #E6F2FF to #F5F7FA) +- Use gradients within the same color family +- Avoid combining hot and cool colors in a single gradient +- Prefer linear gradients over radial for backgrounds + +### Appropriate Use Cases + +- Background containers and sections +- Button hover states and interactive elements +- Drop shadows and depth effects +- Header and navigation bars +- Card components and panels + +## Additional Resources + +- [Color Tool](https://civicactions.github.io/uswds-color-tool/) +- [Government or Professional Color Standards](https://designsystem.digital.gov/design-tokens/color/overview/) +- [UI Color Palette Best Practices](https://www.interaction-design.org/literature/article/ui-color-palette) +- [Color Combination Resource](https://www.figma.com/resource-library/color-combinations/) From 0b9fb232657524894f5eec9bd97d0d3eab2020fb Mon Sep 17 00:00:00 2001 From: John Haugabook Date: Wed, 14 Jan 2026 16:39:55 -0500 Subject: [PATCH 06/15] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- instructions/html-css-style-color-guide.instructions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instructions/html-css-style-color-guide.instructions.md b/instructions/html-css-style-color-guide.instructions.md index 6a017d9b..828a2027 100644 --- a/instructions/html-css-style-color-guide.instructions.md +++ b/instructions/html-css-style-color-guide.instructions.md @@ -17,11 +17,11 @@ represent the full spectrum of their respective hue ranges (e.g., "blue" include - **60-30-10 Rule** - **Primary Color**: Use 60% of the time (*cool or light color*) - **Secondary Color**: Use 30% of the time (*cool or light color*) - - **Accent**: Use 10% of the time (*complimentary hot color*) + - **Accent**: Use 10% of the time (*complementary hot color*) ## Color Usage Guidelines -Balance the colors used by applying the **60-30-10 rule** to graphic desing elements like backgrounds, +Balance the colors used by applying the **60-30-10 rule** to graphic design elements like backgrounds, buttons, cards, etc... ### Background Colors From c4f2978a51df694122c8e1a7d266776b08a6c19f Mon Sep 17 00:00:00 2001 From: Kent Yao Date: Thu, 15 Jan 2026 16:15:00 +0800 Subject: [PATCH 07/15] Add outdated detection to collections, instructions, and prompts suggestion files Similar to c12041b which added outdated agent detection, this commit adds: - Version comparison process for detecting outdated local assets - Fetch remote versions step in the process workflow - Updated icons reference with outdated status indicators - Update handling sections for managing outdated assets - Updated output table examples to show outdated status --- collections/awesome-copilot.md | 6 +- docs/README.prompts.md | 6 +- ...esome-github-copilot-collections.prompt.md | 54 ++++++++++++--- ...some-github-copilot-instructions.prompt.md | 62 ++++++++++++++---- ...t-awesome-github-copilot-prompts.prompt.md | 65 ++++++++++++++----- 5 files changed, 148 insertions(+), 45 deletions(-) diff --git a/collections/awesome-copilot.md b/collections/awesome-copilot.md index 3c45c431..371283ef 100644 --- a/collections/awesome-copilot.md +++ b/collections/awesome-copilot.md @@ -9,11 +9,11 @@ Meta prompts that help you discover and generate curated GitHub Copilot chat mod | Title | Type | Description | MCP Servers | | ----- | ---- | ----------- | ----------- | | [Meta Agentic Project Scaffold](../agents/meta-agentic-project-scaffold.agent.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/agent?url=vscode%3Achat-agent%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fagents%2Fmeta-agentic-project-scaffold.agent.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/agent?url=vscode-insiders%3Achat-agent%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fagents%2Fmeta-agentic-project-scaffold.agent.md) | Agent | Meta agentic project creation assistant to help users create and manage project workflows effectively. | | -| [Suggest Awesome GitHub Copilot Collections](../prompts/suggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md) | Prompt | Suggest relevant GitHub Copilot collections from the awesome-copilot repository based on current repository context and chat history, providing automatic download and installation of collection assets. | | +| [Suggest Awesome GitHub Copilot Collections](../prompts/suggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md) | Prompt | Suggest relevant GitHub Copilot collections from the awesome-copilot repository based on current repository context and chat history, providing automatic download and installation of collection assets, and identifying outdated collection assets that need updates. | | | [Suggest Awesome GitHub Copilot Custom Agents](../prompts/suggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md) | Prompt | Suggest relevant GitHub Copilot Custom Agents files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom agents in this repository, and identifying outdated agents that need updates. | | | [Suggest Awesome GitHub Copilot Custom Chat Modes](../prompts/suggest-awesome-github-copilot-chatmodes.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-chatmodes.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-chatmodes.prompt.md) | Prompt | Suggest relevant GitHub Copilot Custom Chat Modes files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom chat modes in this repository. | | -| [Suggest Awesome GitHub Copilot Instructions](../prompts/suggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md) | Prompt | Suggest relevant GitHub Copilot instruction files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing instructions in this repository. | | -| [Suggest Awesome GitHub Copilot Prompts](../prompts/suggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md) | Prompt | Suggest relevant GitHub Copilot prompt files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing prompts in this repository. | | +| [Suggest Awesome GitHub Copilot Instructions](../prompts/suggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md) | Prompt | Suggest relevant GitHub Copilot instruction files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing instructions in this repository, and identifying outdated instructions that need updates. | | +| [Suggest Awesome GitHub Copilot Prompts](../prompts/suggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md) | Prompt | Suggest relevant GitHub Copilot prompt files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing prompts in this repository, and identifying outdated prompts that need updates. | | --- *This collection includes 6 curated items for **Awesome Copilot**.* \ No newline at end of file diff --git a/docs/README.prompts.md b/docs/README.prompts.md index 1a0b6747..4c078bb5 100644 --- a/docs/README.prompts.md +++ b/docs/README.prompts.md @@ -128,11 +128,11 @@ Ready-to-use prompt templates for specific development scenarios and tasks, defi | [Spring Boot with Kotlin Best Practices](../prompts/kotlin-springboot.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fkotlin-springboot.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fkotlin-springboot.prompt.md) | Get best practices for developing applications with Spring Boot and Kotlin. | | [SQL Code Review](../prompts/sql-code-review.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsql-code-review.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsql-code-review.prompt.md) | Universal SQL code review assistant that performs comprehensive security, maintainability, and code quality analysis across all SQL databases (MySQL, PostgreSQL, SQL Server, Oracle). Focuses on SQL injection prevention, access control, code standards, and anti-pattern detection. Complements SQL optimization prompt for complete development coverage. | | [SQL Performance Optimization Assistant](../prompts/sql-optimization.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsql-optimization.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsql-optimization.prompt.md) | Universal SQL performance optimization assistant for comprehensive query tuning, indexing strategies, and database performance analysis across all SQL databases (MySQL, PostgreSQL, SQL Server, Oracle). Provides execution plan analysis, pagination optimization, batch operations, and performance monitoring guidance. | -| [Suggest Awesome GitHub Copilot Collections](../prompts/suggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md) | Suggest relevant GitHub Copilot collections from the awesome-copilot repository based on current repository context and chat history, providing automatic download and installation of collection assets. | +| [Suggest Awesome GitHub Copilot Collections](../prompts/suggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-collections.prompt.md) | Suggest relevant GitHub Copilot collections from the awesome-copilot repository based on current repository context and chat history, providing automatic download and installation of collection assets, and identifying outdated collection assets that need updates. | | [Suggest Awesome GitHub Copilot Custom Agents](../prompts/suggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-agents.prompt.md) | Suggest relevant GitHub Copilot Custom Agents files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom agents in this repository, and identifying outdated agents that need updates. | | [Suggest Awesome GitHub Copilot Custom Chat Modes](../prompts/suggest-awesome-github-copilot-chatmodes.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-chatmodes.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-chatmodes.prompt.md) | Suggest relevant GitHub Copilot Custom Chat Modes files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing custom chat modes in this repository. | -| [Suggest Awesome GitHub Copilot Instructions](../prompts/suggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md) | Suggest relevant GitHub Copilot instruction files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing instructions in this repository. | -| [Suggest Awesome GitHub Copilot Prompts](../prompts/suggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md) | Suggest relevant GitHub Copilot prompt files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing prompts in this repository. | +| [Suggest Awesome GitHub Copilot Instructions](../prompts/suggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-instructions.prompt.md) | Suggest relevant GitHub Copilot instruction files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing instructions in this repository, and identifying outdated instructions that need updates. | +| [Suggest Awesome GitHub Copilot Prompts](../prompts/suggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fsuggest-awesome-github-copilot-prompts.prompt.md) | Suggest relevant GitHub Copilot prompt files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing prompts in this repository, and identifying outdated prompts that need updates. | | [Swift MCP Server Generator](../prompts/swift-mcp-server-generator.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fswift-mcp-server-generator.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fswift-mcp-server-generator.prompt.md) | Generate a complete Model Context Protocol server project in Swift using the official MCP Swift SDK package. | | [Test Generation with Playwright MCP](../prompts/playwright-generate-test.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fplaywright-generate-test.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fplaywright-generate-test.prompt.md) | Generate a Playwright test based on a scenario using Playwright MCP | | [Test Planning & Quality Assurance Prompt](../prompts/breakdown-test.prompt.md)
[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fbreakdown-test.prompt.md)
[![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://aka.ms/awesome-copilot/install/prompt?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fbreakdown-test.prompt.md) | Test Planning and Quality Assurance prompt that generates comprehensive test strategies, task breakdowns, and quality validation plans for GitHub projects. | diff --git a/prompts/suggest-awesome-github-copilot-collections.prompt.md b/prompts/suggest-awesome-github-copilot-collections.prompt.md index efde6643..aa8434c5 100644 --- a/prompts/suggest-awesome-github-copilot-collections.prompt.md +++ b/prompts/suggest-awesome-github-copilot-collections.prompt.md @@ -1,6 +1,6 @@ --- agent: 'agent' -description: 'Suggest relevant GitHub Copilot collections from the awesome-copilot repository based on current repository context and chat history, providing automatic download and installation of collection assets.' +description: 'Suggest relevant GitHub Copilot collections from the awesome-copilot repository based on current repository context and chat history, providing automatic download and installation of collection assets, and identifying outdated collection assets that need updates.' tools: ['edit', 'search', 'runCommands', 'runTasks', 'think', 'changes', 'testFailure', 'openSimpleBrowser', 'web/fetch', 'githubRepo', 'todos', 'search'] --- # Suggest Awesome GitHub Copilot Collections @@ -12,13 +12,22 @@ Analyze current repository context and suggest relevant collections from the [Gi 1. **Fetch Available Collections**: Extract collection list and descriptions from [awesome-copilot README.collections.md](https://github.com/github/awesome-copilot/blob/main/docs/README.collections.md). Must use `#fetch` tool. 2. **Scan Local Assets**: Discover existing prompt files in `prompts/`, instruction files in `instructions/`, and chat modes in `agents/` folders 3. **Extract Local Descriptions**: Read front matter from local asset files to understand existing capabilities -4. **Analyze Repository Context**: Review chat history, repository files, programming languages, frameworks, and current project needs -5. **Match Collection Relevance**: Compare available collections against identified patterns and requirements -6. **Check Asset Overlap**: For relevant collections, analyze individual items to avoid duplicates with existing repository assets -7. **Present Collection Options**: Display relevant collections with descriptions, item counts, and rationale for suggestion -8. **Provide Usage Guidance**: Explain how the installed collection enhances the development workflow - **AWAIT** user request to proceed with installation of specific collections. DO NOT INSTALL UNLESS DIRECTED TO DO SO. -9. **Download Assets**: For requested collections, automatically download and install each individual asset (prompts, instructions, chat modes) to appropriate directories. Do NOT adjust content of the files. Prioritize use of `#fetch` tool to download assets, but may use `curl` using `#runInTerminal` tool to ensure all content is retrieved. +4. **Fetch Remote Versions**: For each local asset that matches a collection item, fetch the corresponding version from awesome-copilot repository using raw GitHub URLs (e.g., `https://raw.githubusercontent.com/github/awesome-copilot/main//`) +5. **Compare Versions**: Compare local asset content with remote versions to identify: + - Assets that are up-to-date (exact match) + - Assets that are outdated (content differs) + - Key differences in outdated assets (tools, description, content) +6. **Analyze Repository Context**: Review chat history, repository files, programming languages, frameworks, and current project needs +7. **Match Collection Relevance**: Compare available collections against identified patterns and requirements +8. **Check Asset Overlap**: For relevant collections, analyze individual items to avoid duplicates with existing repository assets +9. **Present Collection Options**: Display relevant collections with descriptions, item counts, outdated asset counts, and rationale for suggestion +10. **Provide Usage Guidance**: Explain how the installed collection enhances the development workflow + **AWAIT** user request to proceed with installation or updates of specific collections. DO NOT INSTALL OR UPDATE UNLESS DIRECTED TO DO SO. +11. **Download/Update Assets**: For requested collections, automatically: + - Download new assets to appropriate directories + - Update outdated assets by replacing with latest version from awesome-copilot + - Do NOT adjust content of the files + - Use `#fetch` tool to download assets, but may use `curl` using `#runInTerminal` tool to ensure all content is retrieved ## Context Analysis Criteria @@ -55,6 +64,7 @@ For each suggested collection, break down individual assets: **Azure & Cloud Development Collection Analysis:** - ✅ **New Assets (12)**: Azure cost optimization prompts, Bicep planning mode, AVM modules, Logic Apps expert mode - ⚠️ **Similar Assets (3)**: Azure DevOps pipelines (similar to existing CI/CD), Terraform (basic overlap), Containerization (Docker basics covered) +- 🔄 **Outdated Assets (2)**: azure-iac-generator.agent.md (tools updated), bicep-implement.agent.md (description changed) - 🎯 **High Value**: Cost optimization tools, Infrastructure as Code expertise, Azure-specific architectural guidance **Installation Preview:** @@ -86,6 +96,21 @@ For each suggested collection, break down individual assets: - Industry best practices for identified project types - Missing expertise areas (security, performance, architecture, etc.) +## Version Comparison Process + +1. For each local asset file that corresponds to a collection item, construct the raw GitHub URL: + - Agents: `https://raw.githubusercontent.com/github/awesome-copilot/main/agents/` + - Prompts: `https://raw.githubusercontent.com/github/awesome-copilot/main/prompts/` + - Instructions: `https://raw.githubusercontent.com/github/awesome-copilot/main/instructions/` +2. Fetch the remote version using the `fetch` tool +3. Compare entire file content (including front matter and body) +4. Identify specific differences: + - **Front matter changes** (description, tools, applyTo patterns) + - **Tools array modifications** (added, removed, or renamed tools) + - **Content updates** (instructions, examples, guidelines) +5. Document key differences for outdated assets +6. Calculate similarity to determine if update is needed + ## Collection Asset Download Process When user confirms a collection installation: @@ -141,9 +166,18 @@ After installing a collection, provide: ## Icons Reference -- ✅ Collection recommended for installation +- ✅ Collection recommended for installation / Asset up-to-date - ⚠️ Collection has some asset overlap but still valuable - ❌ Collection not recommended (significant overlap or not relevant) - 🎯 High-value collection that fills major capability gaps - 📁 Collection partially installed (some assets skipped due to duplicates) -- 🔄 Collection needs customization for repository-specific needs +- 🔄 Asset outdated (update available from awesome-copilot) + +## Update Handling + +When outdated collection assets are identified: +1. Include them in the asset analysis with 🔄 status +2. Document specific differences for each outdated asset +3. Provide recommendation to update with key changes noted +4. When user requests update, replace entire local file with remote version +5. Preserve file location in appropriate directory (`agents/`, `prompts/`, or `instructions/`) diff --git a/prompts/suggest-awesome-github-copilot-instructions.prompt.md b/prompts/suggest-awesome-github-copilot-instructions.prompt.md index 08d3fa0c..961d12d8 100644 --- a/prompts/suggest-awesome-github-copilot-instructions.prompt.md +++ b/prompts/suggest-awesome-github-copilot-instructions.prompt.md @@ -1,6 +1,6 @@ --- agent: 'agent' -description: 'Suggest relevant GitHub Copilot instruction files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing instructions in this repository.' +description: 'Suggest relevant GitHub Copilot instruction files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing instructions in this repository, and identifying outdated instructions that need updates.' tools: ['edit', 'search', 'runCommands', 'runTasks', 'think', 'changes', 'testFailure', 'openSimpleBrowser', 'web/fetch', 'githubRepo', 'todos', 'search'] --- # Suggest Awesome GitHub Copilot Instructions @@ -12,14 +12,24 @@ Analyze current repository context and suggest relevant copilot-instruction file 1. **Fetch Available Instructions**: Extract instruction list and descriptions from [awesome-copilot README.instructions.md](https://github.com/github/awesome-copilot/blob/main/docs/README.instructions.md). Must use `#fetch` tool. 2. **Scan Local Instructions**: Discover existing instruction files in `.github/instructions/` folder 3. **Extract Descriptions**: Read front matter from local instruction files to get descriptions and `applyTo` patterns -4. **Analyze Context**: Review chat history, repository files, and current project needs -5. **Compare Existing**: Check against instructions already available in this repository -6. **Match Relevance**: Compare available instructions against identified patterns and requirements -7. **Present Options**: Display relevant instructions with descriptions, rationale, and availability status -8. **Validate**: Ensure suggested instructions would add value not already covered by existing instructions -9. **Output**: Provide structured table with suggestions, descriptions, and links to both awesome-copilot instructions and similar local instructions - **AWAIT** user request to proceed with installation of specific instructions. DO NOT INSTALL UNLESS DIRECTED TO DO SO. -10. **Download Assets**: For requested instructions, automatically download and install individual instructions to `.github/instructions/` folder. Do NOT adjust content of the files. Use `#todos` tool to track progress. Prioritize use of `#fetch` tool to download assets, but may use `curl` using `#runInTerminal` tool to ensure all content is retrieved. +4. **Fetch Remote Versions**: For each local instruction, fetch the corresponding version from awesome-copilot repository using raw GitHub URLs (e.g., `https://raw.githubusercontent.com/github/awesome-copilot/main/instructions/`) +5. **Compare Versions**: Compare local instruction content with remote versions to identify: + - Instructions that are up-to-date (exact match) + - Instructions that are outdated (content differs) + - Key differences in outdated instructions (description, applyTo patterns, content) +6. **Analyze Context**: Review chat history, repository files, and current project needs +7. **Compare Existing**: Check against instructions already available in this repository +8. **Match Relevance**: Compare available instructions against identified patterns and requirements +9. **Present Options**: Display relevant instructions with descriptions, rationale, and availability status including outdated instructions +10. **Validate**: Ensure suggested instructions would add value not already covered by existing instructions +11. **Output**: Provide structured table with suggestions, descriptions, and links to both awesome-copilot instructions and similar local instructions + **AWAIT** user request to proceed with installation or updates of specific instructions. DO NOT INSTALL OR UPDATE UNLESS DIRECTED TO DO SO. +12. **Download/Update Assets**: For requested instructions, automatically: + - Download new instructions to `.github/instructions/` folder + - Update outdated instructions by replacing with latest version from awesome-copilot + - Do NOT adjust content of the files + - Use `#fetch` tool to download assets, but may use `curl` using `#runInTerminal` tool to ensure all content is retrieved + - Use `#todos` tool to track progress ## Context Analysis Criteria @@ -41,9 +51,9 @@ Display analysis results in structured table comparing awesome-copilot instructi | Awesome-Copilot Instruction | Description | Already Installed | Similar Local Instruction | Suggestion Rationale | |------------------------------|-------------|-------------------|---------------------------|---------------------| -| [blazor.instructions.md](https://github.com/github/awesome-copilot/blob/main/instructions/blazor.instructions.md) | Blazor development guidelines | ❌ No | blazor.instructions.md | Already covered by existing Blazor instructions | +| [blazor.instructions.md](https://github.com/github/awesome-copilot/blob/main/instructions/blazor.instructions.md) | Blazor development guidelines | ✅ Yes | blazor.instructions.md | Already covered by existing Blazor instructions | | [reactjs.instructions.md](https://github.com/github/awesome-copilot/blob/main/instructions/reactjs.instructions.md) | ReactJS development standards | ❌ No | None | Would enhance React development with established patterns | -| [java.instructions.md](https://github.com/github/awesome-copilot/blob/main/instructions/java.instructions.md) | Java development best practices | ❌ No | None | Could improve Java code quality and consistency | +| [java.instructions.md](https://github.com/github/awesome-copilot/blob/main/instructions/java.instructions.md) | Java development best practices | ⚠️ Outdated | java.instructions.md | applyTo pattern differs: remote uses `'**/*.java'` vs local `'*.java'` - Update recommended | ## Local Instructions Discovery Process @@ -52,6 +62,18 @@ Display analysis results in structured table comparing awesome-copilot instructi 3. Build comprehensive inventory of existing instructions with their applicable file patterns 4. Use this inventory to avoid suggesting duplicates +## Version Comparison Process + +1. For each local instruction file, construct the raw GitHub URL to fetch the remote version: + - Pattern: `https://raw.githubusercontent.com/github/awesome-copilot/main/instructions/` +2. Fetch the remote version using the `fetch` tool +3. Compare entire file content (including front matter and body) +4. Identify specific differences: + - **Front matter changes** (description, applyTo patterns) + - **Content updates** (guidelines, examples, best practices) +5. Document key differences for outdated instructions +6. Calculate similarity to determine if update is needed + ## File Structure Requirements Based on GitHub documentation, copilot-instructions files should be: @@ -71,18 +93,30 @@ applyTo: '**/*.js,**/*.ts' # Optional: glob patterns for file matching ## Requirements -- Use `githubRepo` tool to get content from awesome-copilot repository -- Scan local file system for existing instructions in `instructions/` directory +- Use `githubRepo` tool to get content from awesome-copilot repository instructions folder +- Scan local file system for existing instructions in `.github/instructions/` directory - Read YAML front matter from local instruction files to extract descriptions and `applyTo` patterns +- Compare local instructions with remote versions to detect outdated instructions - Compare against existing instructions in this repository to avoid duplicates - Focus on gaps in current instruction library coverage - Validate that suggested instructions align with repository's purpose and standards - Provide clear rationale for each suggestion - Include links to both awesome-copilot instructions and similar local instructions +- Clearly identify outdated instructions with specific differences noted - Consider technology stack compatibility and project-specific needs - Don't provide any additional information or context beyond the table and the analysis ## Icons Reference -- ✅ Already installed in repo +- ✅ Already installed and up-to-date +- ⚠️ Installed but outdated (update available) - ❌ Not installed in repo + +## Update Handling + +When outdated instructions are identified: +1. Include them in the output table with ⚠️ status +2. Document specific differences in the "Suggestion Rationale" column +3. Provide recommendation to update with key changes noted +4. When user requests update, replace entire local file with remote version +5. Preserve file location in `.github/instructions/` directory diff --git a/prompts/suggest-awesome-github-copilot-prompts.prompt.md b/prompts/suggest-awesome-github-copilot-prompts.prompt.md index 904f12a3..ecb7a54b 100644 --- a/prompts/suggest-awesome-github-copilot-prompts.prompt.md +++ b/prompts/suggest-awesome-github-copilot-prompts.prompt.md @@ -1,6 +1,6 @@ --- agent: 'agent' -description: 'Suggest relevant GitHub Copilot prompt files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing prompts in this repository.' +description: 'Suggest relevant GitHub Copilot prompt files from the awesome-copilot repository based on current repository context and chat history, avoiding duplicates with existing prompts in this repository, and identifying outdated prompts that need updates.' tools: ['edit', 'search', 'runCommands', 'runTasks', 'think', 'changes', 'testFailure', 'openSimpleBrowser', 'web/fetch', 'githubRepo', 'todos', 'search'] --- # Suggest Awesome GitHub Copilot Prompts @@ -12,14 +12,24 @@ Analyze current repository context and suggest relevant prompt files from the [G 1. **Fetch Available Prompts**: Extract prompt list and descriptions from [awesome-copilot README.prompts.md](https://github.com/github/awesome-copilot/blob/main/docs/README.prompts.md). Must use `#fetch` tool. 2. **Scan Local Prompts**: Discover existing prompt files in `.github/prompts/` folder 3. **Extract Descriptions**: Read front matter from local prompt files to get descriptions -4. **Analyze Context**: Review chat history, repository files, and current project needs -5. **Compare Existing**: Check against prompts already available in this repository -6. **Match Relevance**: Compare available prompts against identified patterns and requirements -7. **Present Options**: Display relevant prompts with descriptions, rationale, and availability status -8. **Validate**: Ensure suggested prompts would add value not already covered by existing prompts -9. **Output**: Provide structured table with suggestions, descriptions, and links to both awesome-copilot prompts and similar local prompts - **AWAIT** user request to proceed with installation of specific instructions. DO NOT INSTALL UNLESS DIRECTED TO DO SO. -10. **Download Assets**: For requested instructions, automatically download and install individual instructions to `.github/prompts/` folder. Do NOT adjust content of the files. Use `#todos` tool to track progress. Prioritize use of `#fetch` tool to download assets, but may use `curl` using `#runInTerminal` tool to ensure all content is retrieved. +4. **Fetch Remote Versions**: For each local prompt, fetch the corresponding version from awesome-copilot repository using raw GitHub URLs (e.g., `https://raw.githubusercontent.com/github/awesome-copilot/main/prompts/`) +5. **Compare Versions**: Compare local prompt content with remote versions to identify: + - Prompts that are up-to-date (exact match) + - Prompts that are outdated (content differs) + - Key differences in outdated prompts (tools, description, content) +6. **Analyze Context**: Review chat history, repository files, and current project needs +7. **Compare Existing**: Check against prompts already available in this repository +8. **Match Relevance**: Compare available prompts against identified patterns and requirements +9. **Present Options**: Display relevant prompts with descriptions, rationale, and availability status including outdated prompts +10. **Validate**: Ensure suggested prompts would add value not already covered by existing prompts +11. **Output**: Provide structured table with suggestions, descriptions, and links to both awesome-copilot prompts and similar local prompts + **AWAIT** user request to proceed with installation or updates of specific prompts. DO NOT INSTALL OR UPDATE UNLESS DIRECTED TO DO SO. +12. **Download/Update Assets**: For requested prompts, automatically: + - Download new prompts to `.github/prompts/` folder + - Update outdated prompts by replacing with latest version from awesome-copilot + - Do NOT adjust content of the files + - Use `#fetch` tool to download assets, but may use `curl` using `#runInTerminal` tool to ensure all content is retrieved + - Use `#todos` tool to track progress ## Context Analysis Criteria @@ -41,31 +51,56 @@ Display analysis results in structured table comparing awesome-copilot prompts w | Awesome-Copilot Prompt | Description | Already Installed | Similar Local Prompt | Suggestion Rationale | |-------------------------|-------------|-------------------|---------------------|---------------------| -| [code-review.md](https://github.com/github/awesome-copilot/blob/main/prompts/code-review.md) | Automated code review prompts | ❌ No | None | Would enhance development workflow with standardized code review processes | -| [documentation.md](https://github.com/github/awesome-copilot/blob/main/prompts/documentation.md) | Generate project documentation | ✅ Yes | create_oo_component_documentation.prompt.md | Already covered by existing documentation prompts | -| [debugging.md](https://github.com/github/awesome-copilot/blob/main/prompts/debugging.md) | Debug assistance prompts | ❌ No | None | Could improve troubleshooting efficiency for development team | +| [code-review.prompt.md](https://github.com/github/awesome-copilot/blob/main/prompts/code-review.prompt.md) | Automated code review prompts | ❌ No | None | Would enhance development workflow with standardized code review processes | +| [documentation.prompt.md](https://github.com/github/awesome-copilot/blob/main/prompts/documentation.prompt.md) | Generate project documentation | ✅ Yes | create_oo_component_documentation.prompt.md | Already covered by existing documentation prompts | +| [debugging.prompt.md](https://github.com/github/awesome-copilot/blob/main/prompts/debugging.prompt.md) | Debug assistance prompts | ⚠️ Outdated | debugging.prompt.md | Tools configuration differs: remote uses `'codebase'` vs local missing - Update recommended | ## Local Prompts Discovery Process -1. List all `*.prompt.md` files directory `.github/prompts/`. +1. List all `*.prompt.md` files in `.github/prompts/` directory 2. For each discovered file, read front matter to extract `description` 3. Build comprehensive inventory of existing prompts 4. Use this inventory to avoid suggesting duplicates +## Version Comparison Process + +1. For each local prompt file, construct the raw GitHub URL to fetch the remote version: + - Pattern: `https://raw.githubusercontent.com/github/awesome-copilot/main/prompts/` +2. Fetch the remote version using the `fetch` tool +3. Compare entire file content (including front matter and body) +4. Identify specific differences: + - **Front matter changes** (description, tools, mode) + - **Tools array modifications** (added, removed, or renamed tools) + - **Content updates** (instructions, examples, guidelines) +5. Document key differences for outdated prompts +6. Calculate similarity to determine if update is needed + ## Requirements -- Use `githubRepo` tool to get content from awesome-copilot repository +- Use `githubRepo` tool to get content from awesome-copilot repository prompts folder - Scan local file system for existing prompts in `.github/prompts/` directory - Read YAML front matter from local prompt files to extract descriptions +- Compare local prompts with remote versions to detect outdated prompts - Compare against existing prompts in this repository to avoid duplicates - Focus on gaps in current prompt library coverage - Validate that suggested prompts align with repository's purpose and standards - Provide clear rationale for each suggestion - Include links to both awesome-copilot prompts and similar local prompts +- Clearly identify outdated prompts with specific differences noted - Don't provide any additional information or context beyond the table and the analysis ## Icons Reference -- ✅ Already installed in repo +- ✅ Already installed and up-to-date +- ⚠️ Installed but outdated (update available) - ❌ Not installed in repo + +## Update Handling + +When outdated prompts are identified: +1. Include them in the output table with ⚠️ status +2. Document specific differences in the "Suggestion Rationale" column +3. Provide recommendation to update with key changes noted +4. When user requests update, replace entire local file with remote version +5. Preserve file location in `.github/prompts/` directory From 41b694123769949db61a9bd9bed6145776fc09a2 Mon Sep 17 00:00:00 2001 From: Kent Yao Date: Thu, 15 Jan 2026 16:25:11 +0800 Subject: [PATCH 08/15] Update prompts/suggest-awesome-github-copilot-collections.prompt.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- prompts/suggest-awesome-github-copilot-collections.prompt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prompts/suggest-awesome-github-copilot-collections.prompt.md b/prompts/suggest-awesome-github-copilot-collections.prompt.md index aa8434c5..97c3563e 100644 --- a/prompts/suggest-awesome-github-copilot-collections.prompt.md +++ b/prompts/suggest-awesome-github-copilot-collections.prompt.md @@ -102,7 +102,7 @@ For each suggested collection, break down individual assets: - Agents: `https://raw.githubusercontent.com/github/awesome-copilot/main/agents/` - Prompts: `https://raw.githubusercontent.com/github/awesome-copilot/main/prompts/` - Instructions: `https://raw.githubusercontent.com/github/awesome-copilot/main/instructions/` -2. Fetch the remote version using the `fetch` tool +2. Fetch the remote version using the `#fetch` tool 3. Compare entire file content (including front matter and body) 4. Identify specific differences: - **Front matter changes** (description, tools, applyTo patterns) From 0d48c3fb55ccadd4ec9252c2b42c7fdcc1d78193 Mon Sep 17 00:00:00 2001 From: Kent Yao Date: Thu, 15 Jan 2026 16:25:21 +0800 Subject: [PATCH 09/15] Update prompts/suggest-awesome-github-copilot-prompts.prompt.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- prompts/suggest-awesome-github-copilot-prompts.prompt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prompts/suggest-awesome-github-copilot-prompts.prompt.md b/prompts/suggest-awesome-github-copilot-prompts.prompt.md index ecb7a54b..04b0c40d 100644 --- a/prompts/suggest-awesome-github-copilot-prompts.prompt.md +++ b/prompts/suggest-awesome-github-copilot-prompts.prompt.md @@ -66,7 +66,7 @@ Display analysis results in structured table comparing awesome-copilot prompts w 1. For each local prompt file, construct the raw GitHub URL to fetch the remote version: - Pattern: `https://raw.githubusercontent.com/github/awesome-copilot/main/prompts/` -2. Fetch the remote version using the `fetch` tool +2. Fetch the remote version using the `#fetch` tool 3. Compare entire file content (including front matter and body) 4. Identify specific differences: - **Front matter changes** (description, tools, mode) From 1176cc4ffa2cb615da326e88ec69f10ad4e61807 Mon Sep 17 00:00:00 2001 From: Kent Yao Date: Thu, 15 Jan 2026 16:25:30 +0800 Subject: [PATCH 10/15] Update prompts/suggest-awesome-github-copilot-instructions.prompt.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- prompts/suggest-awesome-github-copilot-instructions.prompt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prompts/suggest-awesome-github-copilot-instructions.prompt.md b/prompts/suggest-awesome-github-copilot-instructions.prompt.md index 961d12d8..283dfacd 100644 --- a/prompts/suggest-awesome-github-copilot-instructions.prompt.md +++ b/prompts/suggest-awesome-github-copilot-instructions.prompt.md @@ -66,7 +66,7 @@ Display analysis results in structured table comparing awesome-copilot instructi 1. For each local instruction file, construct the raw GitHub URL to fetch the remote version: - Pattern: `https://raw.githubusercontent.com/github/awesome-copilot/main/instructions/` -2. Fetch the remote version using the `fetch` tool +2. Fetch the remote version using the `#fetch` tool 3. Compare entire file content (including front matter and body) 4. Identify specific differences: - **Front matter changes** (description, applyTo patterns) From dcaff75b1ad586291911989e238496fd7fbe4eee Mon Sep 17 00:00:00 2001 From: Ashley Childress <6563688+anchildress1@users.noreply.github.com> Date: Fri, 19 Dec 2025 23:55:03 -0500 Subject: [PATCH 11/15] feat(contributors): condense contributor report and per-PR snippets - eng/contributor-report.mjs: condensed per-user layout; emit per-PR fenced plaintext snippets; removed normalizeOneLine() Generated-by: GitHub Copilot Signed-off-by: Ashley Childress <6563688+anchildress1@users.noreply.github.com> --- eng/contributor-report.mjs | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/eng/contributor-report.mjs b/eng/contributor-report.mjs index 56005170..9b4cdc5f 100644 --- a/eng/contributor-report.mjs +++ b/eng/contributor-report.mjs @@ -429,7 +429,6 @@ export const generateMarkdownReport = (reports, missingCount = 0) => { const nowIso = new Date().toISOString(); - const computeTypesArg = (report) => { const typeSet = new Set(); for (const pr of report.prs || []) { @@ -455,7 +454,6 @@ export const generateMarkdownReport = (reports, missingCount = 0) => { for (const report of reports) { lines.push(`## @${report.username}`); - lines.push(''); const prs = Array.from(report.prs || []).sort((a, b) => { // Prefer most recent PRs first. @@ -465,22 +463,36 @@ export const generateMarkdownReport = (reports, missingCount = 0) => { return (b.prNumber ?? 0) - (a.prNumber ?? 0); }); - for (const pr of prs) { - lines.push(`### PR #${pr.prNumber}: ${pr.prTitle}`); + if (prs.length === 0) { lines.push(''); - lines.push(`Add this comment on PR: ${pr.prUrl}`); + lines.push('_No eligible PRs found._'); lines.push(''); - - const prTypes = (pr.contributionTypes || []).filter(Boolean); - const prTypesArg = prTypes.length > 0 ? prTypes.join(', ') : 'code'; - - lines.push('```text'); - lines.push(`@all-contributors please add @${report.username} for ${prTypesArg}`); - lines.push('```'); + lines.push(`Alternate CLI: \`npx all-contributors add ${report.username} ${computeTypesArg(report)}\``); lines.push(''); + lines.push('---'); + lines.push(''); + continue; } - lines.push('### CLI command (all-contributors-cli)'); + lines.push(''); + + for (const pr of prs) { + const prTypes = (pr.contributionTypes || []).filter(Boolean); + const prTypesArg = prTypes.length > 0 ? prTypes.join(', ') : 'code'; + const title = String(pr.prTitle ?? ''); + const url = String(pr.prUrl ?? ''); + const comment = `@all-contributors please add @${report.username} for ${prTypesArg}`; + + // PR line + lines.push(`[#${pr.prNumber}](${url}) ${title}`); + // fenced single-line comment snippet for this PR (plaintext as requested) + lines.push('```plaintext'); + lines.push(comment); + lines.push('```'); + } + + lines.push(''); + lines.push('### Alternate CLI Command'); lines.push(''); lines.push('```bash'); lines.push(`npx all-contributors add ${report.username} ${computeTypesArg(report)}`); From f9e981e4cded26b8def4113f41272d79ad4a53de Mon Sep 17 00:00:00 2001 From: Ashley Childress <6563688+anchildress1@users.noreply.github.com> Date: Wed, 14 Jan 2026 23:47:04 -0500 Subject: [PATCH 12/15] fix(contributors): address Copilot review comments and code quality issues - Improve contributor-report.mjs based on Copilot comments and sonar - Use fileURLToPath for Windows-safe main checks in contributor scripts - Fix README badge URLs by removing duplicate style parameters - Update graceful-shutdown.mjs to throw on process.exit failure for better error visibility Generated-by: GitHub Copilot Signed-off-by: Ashley Childress <6563688+anchildress1@users.noreply.github.com> --- .github/workflows/contributors.yml | 6 +- README.md | 2 +- eng/add-missing-contributors.mjs | 3 +- eng/contributor-report.mjs | 217 +++++++++++------------------ eng/utils/graceful-shutdown.mjs | 5 +- 5 files changed, 92 insertions(+), 141 deletions(-) diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index 159910ee..e8310bf5 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -8,7 +8,7 @@ on: jobs: contributors: runs-on: ubuntu-latest - timeout-minutes: 12 + timeout-minutes: 5 permissions: contents: write pull-requests: write @@ -36,12 +36,12 @@ jobs: run: | CHECK_OUTPUT=$(npm run contributors:check 2>&1) echo "$CHECK_OUTPUT" - + if echo "$CHECK_OUTPUT" | grep -q "Missing contributors"; then echo "Missing contributors detected, generating report..." mkdir -p reports npm run contributors:report - + if [ -f reports/contributor-report.md ]; then cat reports/contributor-report.md >> $GITHUB_STEP_SUMMARY fi diff --git a/README.md b/README.md index d22fa5cf..bb87f895 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # 🤖 Awesome GitHub Copilot Customizations -[![Powered by Awesome Copilot](https://img.shields.io/badge/Powered_by-Awesome_Copilot-blue?logo=githubcopilot)](https://aka.ms/awesome-github-copilot?style=flat-square) [![GitHub contributors from allcontributors.org](https://img.shields.io/github/all-contributors/github/awesome-copilot?style=flat-square&color=ee8449)](#contributors-) +[![Powered by Awesome Copilot](https://img.shields.io/badge/Powered_by-Awesome_Copilot-blue?logo=githubcopilot)](https://aka.ms/awesome-github-copilot) [![GitHub contributors from allcontributors.org](https://img.shields.io/github/all-contributors/github/awesome-copilot?color=ee8449)](#contributors-) A community created collection of custom agents, prompts, and instructions to supercharge your GitHub Copilot experience across different domains, languages, and use cases. diff --git a/eng/add-missing-contributors.mjs b/eng/add-missing-contributors.mjs index dc8911c5..c9b03321 100644 --- a/eng/add-missing-contributors.mjs +++ b/eng/add-missing-contributors.mjs @@ -8,6 +8,7 @@ import { execSync } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { getContributionTypes, getMissingContributors, @@ -282,7 +283,7 @@ const printSummaryReport = (results) => { console.log('\n' + '='.repeat(50)); }; -if (process.argv[1] === (new URL(import.meta.url)).pathname) { +if (process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) { try { const results = await main(); printSummaryReport(results); diff --git a/eng/contributor-report.mjs b/eng/contributor-report.mjs index 9b4cdc5f..7f44f8a2 100644 --- a/eng/contributor-report.mjs +++ b/eng/contributor-report.mjs @@ -5,6 +5,7 @@ import { execSync } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { setupGracefulShutdown } from './utils/graceful-shutdown.mjs'; const DEFAULT_CMD_TIMEOUT = 30_000; // 30s @@ -59,11 +60,14 @@ export const TYPE_PATTERNS = { ], maintenance: [ 'package*.json', - '*.config.js', + '*config*', 'tsconfig*.json' ], code: [ - '**/*.{js,ts,mjs,cjs}', + '**/*.js', + '**/*.ts', + '**/*.mjs', + '**/*.cjs', '**/*.py' ] }; @@ -78,17 +82,25 @@ const globCache = new Map(); */ export const globToRegExp = (pattern) => { const DOUBLE_WILDCARD_PLACEHOLDER = '§§DOUBLE§§'; - const replacements = [ - { pattern: /\\/g, replacement: '/' }, - { pattern: /\./g, replacement: String.raw`\.` }, - { pattern: /\*\*/g, replacement: DOUBLE_WILDCARD_PLACEHOLDER }, - { pattern: /\*/g, replacement: '[^/]*' }, - { pattern: new RegExp(DOUBLE_WILDCARD_PLACEHOLDER, 'g'), replacement: '.*' }, - { pattern: /\?/g, replacement: '.' }, - { pattern: /\//g, replacement: String.raw`\/` } - ]; - const normalized = replacements.reduce((acc, { pattern, replacement }) => acc.replace(pattern, replacement), String(pattern)); + // Escape all regex-special characters except glob wildcards (*, ?, /), + // then translate glob syntax to regex. + // Note: This function intentionally supports only a small subset of glob syntax. + const regexSpecials = /[.+^${}()|[\]\\]/g; + + let normalized = String(pattern); + + // Normalize Windows-style separators to POSIX-style for matching. + normalized = normalized.replaceAll('\\', '/'); + + // Escape regex metacharacters so they are treated literally. + normalized = normalized.replaceAll(regexSpecials, (match) => `\\${match}`); + + // Handle glob wildcards. + normalized = normalized.replaceAll('**', DOUBLE_WILDCARD_PLACEHOLDER); + normalized = normalized.replaceAll('*', '[^/]*'); + normalized = normalized.replaceAll(DOUBLE_WILDCARD_PLACEHOLDER, '.*'); + normalized = normalized.replaceAll('?', '.'); return new RegExp(`^${normalized}$`); }; @@ -113,7 +125,7 @@ export const matchGlob = (filePath, pattern) => { return false; } - const normalized = filePath.replace(/\\/g, '/'); + const normalized = filePath.replaceAll('\\', '/'); return regexp.test(normalized); }; @@ -133,7 +145,7 @@ export const isAutoGeneratedFile = (filePath) => { * @returns {string|null} */ export const getFileContributionType = (filePath) => { - const normalized = filePath.replace(/\\/g, '/'); + const normalized = filePath.replaceAll('\\', '/'); for (const [type, patterns] of Object.entries(TYPE_PATTERNS)) { if (patterns.some((pattern) => matchGlob(normalized, pattern))) { @@ -267,17 +279,33 @@ export const getMissingContributors = () => { * @returns {string} */ const getGitHubRepo = () => { + const parseRepoFromRemoteUrl = (remoteUrl) => { + const url = String(remoteUrl || '').trim(); + if (!url) return null; + + // Supports: + // - git@github.com:owner/repo.git + // - ssh://git@github.com/owner/repo.git + // - https://github.com/owner/repo.git + // - https://github.com/owner/repo + const regex = /github\.com[/:]([^/]+)\/([^/?#]+?)(?:\.git)?(?:[/?#]|$)/; + const match = regex.exec(url); + if (!match) return null; + + return `${match[1]}/${match[2]}`; + }; + try { const upstreamUrl = execSync('git config --get remote.upstream.url', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim(); if (upstreamUrl) { - const match = upstreamUrl.match(/github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/); - if (match) return `${match[1]}/${match[2]}`; + const repo = parseRepoFromRemoteUrl(upstreamUrl); + if (repo) return repo; } } catch (e) { - console.debug('upstream not found, trying origin'); + console.debug('upstream not found, trying origin', e?.message || e); } try { @@ -285,22 +313,15 @@ const getGitHubRepo = () => { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim(); - const match = originUrl.match(/github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/); - if (match) return `${match[1]}/${match[2]}`; + const repo = parseRepoFromRemoteUrl(originUrl); + if (repo) return repo; } catch (e) { - console.debug('origin not found, using default'); + console.debug('origin not found, using default', e?.message || e); } return 'github/awesome-copilot'; }; -const CONTRIBUTION_TYPE_MAP = { - 'instructions': { symbol: '🧭', description: 'The big AI prompt recipes (Copilot instruction sets)' }, - 'prompts': { symbol: '⌨️', description: 'One-shot or reusable user-level prompts' }, - 'agents': { symbol: '🎭', description: 'Defined Copilot personalities / roles' }, - 'collections': { symbol: '🎁', description: 'Bundled thematic sets (e.g., "Copilot for Docs")' } -}; - /** * Fetch merged PRs for a GitHub username using the GH CLI and filter files. * @param {string} username @@ -445,12 +466,14 @@ export const generateMarkdownReport = (reports, missingCount = 0) => { const lines = []; - lines.push('# Missing Contributors Report'); - lines.push(''); - lines.push(`Generated (ISO): ${nowIso}`); - lines.push(''); - lines.push(`Missing contributors: ${missingCount}`); - lines.push(''); + lines.push( + '# Missing Contributors Report', + '', + `Generated (ISO): ${nowIso}`, + '', + `Missing contributors: ${missingCount}`, + '' + ); for (const report of reports) { lines.push(`## @${report.username}`); @@ -464,13 +487,15 @@ export const generateMarkdownReport = (reports, missingCount = 0) => { }); if (prs.length === 0) { - lines.push(''); - lines.push('_No eligible PRs found._'); - lines.push(''); - lines.push(`Alternate CLI: \`npx all-contributors add ${report.username} ${computeTypesArg(report)}\``); - lines.push(''); - lines.push('---'); - lines.push(''); + lines.push( + '', + '_No eligible PRs found._', + '', + `Alternate CLI: \`npx all-contributors add ${report.username} ${computeTypesArg(report)}\``, + '', + '---', + '' + ); continue; } @@ -483,101 +508,30 @@ export const generateMarkdownReport = (reports, missingCount = 0) => { const url = String(pr.prUrl ?? ''); const comment = `@all-contributors please add @${report.username} for ${prTypesArg}`; - // PR line - lines.push(`[#${pr.prNumber}](${url}) ${title}`); - // fenced single-line comment snippet for this PR (plaintext as requested) - lines.push('```plaintext'); - lines.push(comment); - lines.push('```'); + lines.push( + `[#${pr.prNumber}](${url}) ${title}`, + '```plaintext', + comment, + '```' + ); } - lines.push(''); - lines.push('### Alternate CLI Command'); - lines.push(''); - lines.push('```bash'); - lines.push(`npx all-contributors add ${report.username} ${computeTypesArg(report)}`); - lines.push('```'); - lines.push(''); - lines.push('---'); - lines.push(''); + lines.push( + '', + '### Alternate CLI Command', + '', + '```bash', + `npx all-contributors add ${report.username} ${computeTypesArg(report)}`, + '```', + '', + '---', + '' + ); } return `${lines.join('\n')}\n`; }; -/** - * Check whether a PR already contains an all-contributors bot comment. - * @param {number} prNumber - * @returns {boolean} - */ -export const hasExistingAllContributorsComment = (prNumber) => { - try { - const repo = getGitHubRepo(); - const json = execSync(`gh pr view ${prNumber} --repo ${repo} --json comments`, { - encoding: 'utf8', - stdio: ['pipe', 'pipe', 'pipe'], - timeout: DEFAULT_CMD_TIMEOUT - }); - - const data = JSON.parse(json); - const comments = data?.comments?.nodes || data?.comments || []; - return comments.some((comment) => comment?.body?.includes(`@all-contributors`)); - } catch (error) { - console.warn(`⚠️ Unable to inspect comments for PR #${prNumber}: ${error.message}`); - return false; - } -}; - -/** - * Post a comment to a PR using the GH CLI. - * @param {number} prNumber - * @param {string} body - * @returns {boolean} - */ -export const postCommentOnPr = (prNumber, body) => { - try { - const repo = getGitHubRepo(); - execSync(`gh pr comment ${prNumber} --repo ${repo} --body "${body.replace(/"/g, '\\"')}"`, { - encoding: 'utf8', - stdio: ['pipe', 'inherit', 'inherit'], - timeout: DEFAULT_CMD_TIMEOUT - }); - - console.log(`💬 Posted recommendation comment on PR #${prNumber}`); - return true; - } catch (error) { - console.warn(`⚠️ Failed to post comment on PR #${prNumber}: ${error.message}`); - return false; - } -}; - -/** - * Post suggested all-contributors comments to PRs for a collection of reports. - * @param {Array} reports - */ -export const autoAddCommentsToReports = (reports) => { - for (const report of reports) { - for (const pr of report.prs) { - if (hasExistingAllContributorsComment(pr.prNumber)) { - console.log(`💬 Skipping PR #${pr.prNumber} for @${report.username} — comment already present`); - continue; - } - - const types = pr.contributionTypes.map(t => '`' + t + '`').join(', '); - const commentLines = [ - `Thanks for the contribution @${report.username}!`, - '', - `We detected contribution categories for this PR: ${types || '`code`'}.`, - '', - `@all-contributors please add @${report.username} for ${pr.contributionTypes.join(', ')}` - ]; - - const body = commentLines.join('\n'); - postCommentOnPr(pr.prNumber, body); - } - } -}; - const main = () => { try { // gh CLI can use either its own authenticated session or token env vars. @@ -587,7 +541,6 @@ const main = () => { } const args = new Set(process.argv.slice(2)); - const autoAdd = args.has('--auto-add-pr-comments'); const includeAllFiles = args.has('--include-all-pr-files'); const contributors = getMissingContributors(); @@ -605,16 +558,12 @@ const main = () => { console.log(`Report saved to: ${outputPath}`); - if (autoAdd) { - autoAddCommentsToReports(reports); - } - } catch (error) { console.error('Error generating report:', error); process.exit(1); } }; -if (process.argv[1] === (new URL(import.meta.url)).pathname) { +if (process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) { main(); } diff --git a/eng/utils/graceful-shutdown.mjs b/eng/utils/graceful-shutdown.mjs index 036f33f2..6ebeece4 100644 --- a/eng/utils/graceful-shutdown.mjs +++ b/eng/utils/graceful-shutdown.mjs @@ -26,8 +26,9 @@ export const setupGracefulShutdown = (name, { exitCode = 1 } = {}) => { try { process.exit(exitCode); } catch (e) { - // process.exit may not be desirable in some test harnesses; swallow errors - console.warn(`${name}: process.exit failed:`, e?.message); + // If process.exit is stubbed or overridden (e.g. in tests), surface the failure. + console.error(`${name}: process.exit failed:`, e?.message || e); + throw e; } }; From 80886dd7ccaa9da23fede432222e87dde2f3e713 Mon Sep 17 00:00:00 2001 From: Ashley Childress <6563688+anchildress1@users.noreply.github.com> Date: Thu, 15 Jan 2026 08:54:31 -0500 Subject: [PATCH 13/15] fix(contributors): add skills to custom contributor types - Improve errors in contributor-report.mjs - Add missing `skills` to custom contribution types list and docs - Refresh existing contributors Assisted-by: GitHub Copilot Signed-off-by: Ashley Childress <6563688+anchildress1@users.noreply.github.com> --- .all-contributorsrc | 491 +++++++++++++++++++++-------- .github/workflows/contributors.yml | 2 +- CONTRIBUTING.md | 3 +- README.md | 151 +++++---- eng/contributor-report.mjs | 33 +- 5 files changed, 488 insertions(+), 192 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index bd9775d3..8cd9655f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -25,6 +25,10 @@ "symbol": "🎭", "description": "Specialized agents for GitHub Copilot" }, + "skills": { + "symbol": "🧰", + "description": "Specialized skills for GitHub Copilot" + }, "collections": { "symbol": "🎁", "description": "Curated collections of related content" @@ -46,6 +50,7 @@ "profile": "https://www.aaron-powell.com/", "contributions": [ "agents", + "code", "collections", "doc", "infra", @@ -54,6 +59,15 @@ "prompts" ] }, + { + "login": "codemillmatt", + "name": "Matt Soucoup", + "avatar_url": "https://avatars.githubusercontent.com/u/2053639?v=4", + "profile": "https://codemilltech.com/", + "contributions": [ + "infra" + ] + }, { "login": "troystaylor", "name": "Troy Simeon Taylor", @@ -66,6 +80,16 @@ "prompts" ] }, + { + "login": "abbas133", + "name": "Abbas", + "avatar_url": "https://avatars.githubusercontent.com/u/7757139?v=4", + "profile": "https://github.com/abbas133", + "contributions": [ + "agents", + "instructions" + ] + }, { "login": "PEZ", "name": "Peter Strömberg", @@ -100,6 +124,26 @@ "prompts" ] }, + { + "login": "psimsa", + "name": "Pavel Simsa", + "avatar_url": "https://avatars.githubusercontent.com/u/7853836?v=4", + "profile": "https://witter.cz/@pavel", + "contributions": [ + "code" + ] + }, + { + "login": "digitarald", + "name": "Harald Kirschner", + "avatar_url": "https://avatars.githubusercontent.com/u/8599?v=4", + "profile": "http://digitarald.de/", + "contributions": [ + "code", + "doc", + "maintenance" + ] + }, { "login": "mubaidr", "name": "Muhammad Ubaid Raza", @@ -110,6 +154,15 @@ "instructions" ] }, + { + "login": "tmeschter", + "name": "Tom Meschter", + "avatar_url": "https://avatars.githubusercontent.com/u/10506730?v=4", + "profile": "https://github.com/tmeschter", + "contributions": [ + "code" + ] + }, { "login": "AungMyoKyaw", "name": "Aung Myo Kyaw", @@ -121,13 +174,40 @@ ] }, { - "login": "digitarald", - "name": "Harald Kirschner", - "avatar_url": "https://avatars.githubusercontent.com/u/8599?v=4", - "profile": "http://digitarald.de/", + "login": "JasonYeMSFT", + "name": "JasonYeMSFT", + "avatar_url": "https://avatars.githubusercontent.com/u/39359541?v=4", + "profile": "https://github.com/JasonYeMSFT", "contributions": [ - "doc", - "maintenance" + "code" + ] + }, + { + "login": "Jrc356", + "name": "Jon Corbin", + "avatar_url": "https://avatars.githubusercontent.com/u/37387479?v=4", + "profile": "https://www.linkedin.com/in/jrc356/", + "contributions": [ + "agents", + "prompts" + ] + }, + { + "login": "troytaylor-msft", + "name": "troytaylor-msft", + "avatar_url": "https://avatars.githubusercontent.com/u/248058374?v=4", + "profile": "https://github.com/troytaylor-msft", + "contributions": [ + "code" + ] + }, + { + "login": "fazedordecodigo", + "name": "Emerson Delatorre", + "avatar_url": "https://avatars.githubusercontent.com/u/38289677?v=4", + "profile": "https://delatorre.dev/", + "contributions": [ + "instructions" ] }, { @@ -142,6 +222,16 @@ "prompts" ] }, + { + "login": "yaooqinn", + "name": "Kent Yao", + "avatar_url": "https://avatars.githubusercontent.com/u/8326978?v=4", + "profile": "https://yaooqinn.github.io/", + "contributions": [ + "instructions", + "prompts" + ] + }, { "login": "danielmeppiel", "name": "Daniel Meppiel", @@ -151,6 +241,64 @@ "prompts" ] }, + { + "login": "yeelam-gordon", + "name": "Gordon Lam", + "avatar_url": "https://avatars.githubusercontent.com/u/73506701?v=4", + "profile": "https://github.com/yeelam-gordon", + "contributions": [ + "instructions" + ] + }, + { + "login": "madskristensen", + "name": "Mads Kristensen", + "avatar_url": "https://avatars.githubusercontent.com/u/1258877?v=4", + "profile": "https://www.madskristensen.net/", + "contributions": [ + "instructions" + ] + }, + { + "login": "ks6088ts", + "name": "Shinji Takenaka", + "avatar_url": "https://avatars.githubusercontent.com/u/1254960?v=4", + "profile": "https://ks6088ts.github.io/", + "contributions": [ + "code" + ] + }, + { + "login": "spectatora", + "name": "spectatora", + "avatar_url": "https://avatars.githubusercontent.com/u/1385755?v=4", + "profile": "https://github.com/spectatora", + "contributions": [ + "agents", + "code", + "maintenance" + ] + }, + { + "login": "sinedied", + "name": "Yohan Lasorsa", + "avatar_url": "https://avatars.githubusercontent.com/u/593151?v=4", + "profile": "https://github.com/sinedied", + "contributions": [ + "instructions", + "prompts" + ] + }, + { + "login": "VamshiVerma", + "name": "Vamshi Verma", + "avatar_url": "https://avatars.githubusercontent.com/u/21999324?v=4", + "profile": "https://github.com/VamshiVerma", + "contributions": [ + "instructions", + "prompts" + ] + }, { "login": "jamesmontemagno", "name": "James Montemagno", @@ -164,33 +312,12 @@ ] }, { - "login": "VamshiVerma", - "name": "Vamshi Verma", - "avatar_url": "https://avatars.githubusercontent.com/u/21999324?v=4", - "profile": "https://github.com/VamshiVerma", + "login": "alefragnani", + "name": "Alessandro Fragnani", + "avatar_url": "https://avatars.githubusercontent.com/u/3781424?v=4", + "profile": "https://twitter.com/alefragnani", "contributions": [ - "instructions", - "prompts" - ] - }, - { - "login": "sinedied", - "name": "Yohan Lasorsa", - "avatar_url": "https://avatars.githubusercontent.com/u/593151?v=4", - "profile": "https://github.com/sinedied", - "contributions": [ - "instructions", - "prompts" - ] - }, - { - "login": "spectatora", - "name": "spectatora", - "avatar_url": "https://avatars.githubusercontent.com/u/1385755?v=4", - "profile": "https://github.com/spectatora", - "contributions": [ - "agents", - "maintenance" + "code" ] }, { @@ -203,6 +330,34 @@ "instructions" ] }, + { + "login": "krushideep", + "name": "krushideep", + "avatar_url": "https://avatars.githubusercontent.com/u/174652083?v=4", + "profile": "https://github.com/krushideep", + "contributions": [ + "prompts" + ] + }, + { + "login": "mihsoft", + "name": "devopsfan", + "avatar_url": "https://avatars.githubusercontent.com/u/53946345?v=4", + "profile": "https://github.com/mihsoft", + "contributions": [ + "agents" + ] + }, + { + "login": "tgrall", + "name": "Tugdual Grall", + "avatar_url": "https://avatars.githubusercontent.com/u/541250?v=4", + "profile": "http://tgrall.github.io/", + "contributions": [ + "instructions", + "prompts" + ] + }, { "login": "OrenMe", "name": "Oren Me", @@ -283,12 +438,11 @@ ] }, { - "login": "askpt", - "name": "André Silva", - "avatar_url": "https://avatars.githubusercontent.com/u/2493377?v=4", - "profile": "https://asilva.dev/", + "login": "markdav-is", + "name": "Mark Davis", + "avatar_url": "https://avatars.githubusercontent.com/u/311063?v=4", + "profile": "http://markdav.is/", "contributions": [ - "agents", "instructions" ] }, @@ -319,6 +473,15 @@ "agents" ] }, + { + "login": "pkarda", + "name": "Peter Karda", + "avatar_url": "https://avatars.githubusercontent.com/u/12649718?v=4", + "profile": "https://github.com/pkarda", + "contributions": [ + "prompts" + ] + }, { "login": "sdolgin", "name": "Saul Dolgin", @@ -359,16 +522,6 @@ "agents" ] }, - { - "login": "tgrall", - "name": "Tugdual Grall", - "avatar_url": "https://avatars.githubusercontent.com/u/541250?v=4", - "profile": "http://tgrall.github.io/", - "contributions": [ - "instructions", - "prompts" - ] - }, { "login": "doggy8088", "name": "Will 保哥", @@ -388,6 +541,15 @@ "instructions" ] }, + { + "login": "anschnapp", + "name": "anschnapp", + "avatar_url": "https://avatars.githubusercontent.com/u/17565996?v=4", + "profile": "https://github.com/anschnapp", + "contributions": [ + "agents" + ] + }, { "login": "hizahizi-hizumi", "name": "hizahizi-hizumi", @@ -436,6 +598,16 @@ "instructions" ] }, + { + "login": "askpt", + "name": "André Silva", + "avatar_url": "https://avatars.githubusercontent.com/u/2493377?v=4", + "profile": "https://asilva.dev/", + "contributions": [ + "agents", + "instructions" + ] + }, { "login": "agreaves-ms", "name": "Allen Greaves", @@ -455,6 +627,15 @@ "agents" ] }, + { + "login": "BBoyBen", + "name": "BBoyBen", + "avatar_url": "https://avatars.githubusercontent.com/u/34445365?v=4", + "profile": "https://github.com/BBoyBen", + "contributions": [ + "instructions" + ] + }, { "login": "brooke-hamilton", "name": "Brooke Hamilton", @@ -567,19 +748,10 @@ ] }, { - "login": "markdav-is", - "name": "Mark Davis", - "avatar_url": "https://avatars.githubusercontent.com/u/311063?v=4", - "profile": "http://markdav.is/", - "contributions": [ - "instructions" - ] - }, - { - "login": "pelikhan", - "name": "Peli de Halleux", - "avatar_url": "https://avatars.githubusercontent.com/u/4175913?v=4", - "profile": "https://github.com/pelikhan", + "login": "msalaman", + "name": "msalaman", + "avatar_url": "https://avatars.githubusercontent.com/u/28122166?v=4", + "profile": "https://github.com/msalaman", "contributions": [ "code" ] @@ -696,14 +868,32 @@ ] }, { - "login": "dgh06175", - "name": "이상현", - "avatar_url": "https://avatars.githubusercontent.com/u/77305722?v=4", - "profile": "https://github.com/dgh06175", + "login": "STRUDSO", + "name": "Søren Trudsø Mahon", + "avatar_url": "https://avatars.githubusercontent.com/u/1543732?v=4", + "profile": "https://github.com/STRUDSO", "contributions": [ "instructions" ] }, + { + "login": "semperteneo", + "name": "Tj Vita", + "avatar_url": "https://avatars.githubusercontent.com/u/14024037?v=4", + "profile": "http://enakdesign.com/", + "contributions": [ + "agents" + ] + }, + { + "login": "pelikhan", + "name": "Peli de Halleux", + "avatar_url": "https://avatars.githubusercontent.com/u/4175913?v=4", + "profile": "https://github.com/pelikhan", + "contributions": [ + "code" + ] + }, { "login": "paulomorgado", "name": "Paulo Morgado", @@ -823,10 +1013,19 @@ ] }, { - "login": "mfairchild365", - "name": "Michael Fairchild", - "avatar_url": "https://avatars.githubusercontent.com/u/498678?v=4", - "profile": "https://a11ysupport.io/", + "login": "giomartinsdev", + "name": "Giovanni de Almeida Martins", + "avatar_url": "https://avatars.githubusercontent.com/u/125399281?v=4", + "profile": "https://github.com/giomartinsdev", + "contributions": [ + "instructions" + ] + }, + { + "login": "dgh06175", + "name": "이상현", + "avatar_url": "https://avatars.githubusercontent.com/u/77305722?v=4", + "profile": "https://github.com/dgh06175", "contributions": [ "instructions" ] @@ -959,6 +1158,26 @@ "agents" ] }, + { + "login": "BenoitMaucotel", + "name": "BenoitMaucotel", + "avatar_url": "https://avatars.githubusercontent.com/u/54392431?v=4", + "profile": "https://github.com/BenoitMaucotel", + "contributions": [ + "code" + ] + }, + { + "login": "benjisho-aidome", + "name": "benjisho-aidome", + "avatar_url": "https://avatars.githubusercontent.com/u/218995725?v=4", + "profile": "https://github.com/benjisho-aidome", + "contributions": [ + "agents", + "instructions", + "prompts" + ] + }, { "login": "yukiomoto", "name": "Yuki Omoto", @@ -1013,6 +1232,15 @@ "agents" ] }, + { + "login": "vlahanas", + "name": "Vasileios Lahanas", + "avatar_url": "https://avatars.githubusercontent.com/u/19361558?v=4", + "profile": "https://www.ferryhopper.com/", + "contributions": [ + "instructions" + ] + }, { "login": "udayakumarreddyv", "name": "Udaya Veeramreddygari", @@ -1031,6 +1259,15 @@ "prompts" ] }, + { + "login": "tsubasaogawa", + "name": "Tsubasa Ogawa", + "avatar_url": "https://avatars.githubusercontent.com/u/7788821?v=4", + "profile": "https://tsubasaogawa.me/", + "contributions": [ + "code" + ] + }, { "login": "twitthoeft-gls", "name": "Troy Witthoeft (glsauto)", @@ -1041,28 +1278,10 @@ ] }, { - "login": "tmeschter", - "name": "Tom Meschter", - "avatar_url": "https://avatars.githubusercontent.com/u/10506730?v=4", - "profile": "https://github.com/tmeschter", - "contributions": [ - "code" - ] - }, - { - "login": "semperteneo", - "name": "Tj Vita", - "avatar_url": "https://avatars.githubusercontent.com/u/14024037?v=4", - "profile": "http://enakdesign.com/", - "contributions": [ - "agents" - ] - }, - { - "login": "STRUDSO", - "name": "Søren Trudsø Mahon", - "avatar_url": "https://avatars.githubusercontent.com/u/1543732?v=4", - "profile": "https://github.com/STRUDSO", + "login": "jfversluis", + "name": "Gerald Versluis", + "avatar_url": "https://avatars.githubusercontent.com/u/939291?v=4", + "profile": "https://jfversluis.dev/", "contributions": [ "instructions" ] @@ -1073,7 +1292,7 @@ "avatar_url": "https://avatars.githubusercontent.com/u/145904?v=4", "profile": "https://github.com/geoder101", "contributions": [ - "code" + "prompts" ] }, { @@ -1213,15 +1432,6 @@ "agents" ] }, - { - "login": "BBoyBen", - "name": "BBoyBen", - "avatar_url": "https://avatars.githubusercontent.com/u/34445365?v=4", - "profile": "https://github.com/BBoyBen", - "contributions": [ - "instructions" - ] - }, { "login": "artemsaveliev", "name": "Artem Saveliev", @@ -1303,6 +1513,15 @@ "agents" ] }, + { + "login": "AIAlchemyForge", + "name": "AIAlchemyForge", + "avatar_url": "https://avatars.githubusercontent.com/u/253636689?v=4", + "profile": "https://github.com/AIAlchemyForge", + "contributions": [ + "instructions" + ] + }, { "login": "4regab", "name": "4regab", @@ -1312,6 +1531,24 @@ "instructions" ] }, + { + "login": "MiguelElGallo", + "name": "Miguel P Z", + "avatar_url": "https://avatars.githubusercontent.com/u/60221874?v=4", + "profile": "https://github.com/MiguelElGallo", + "contributions": [ + "doc" + ] + }, + { + "login": "mfairchild365", + "name": "Michael Fairchild", + "avatar_url": "https://avatars.githubusercontent.com/u/498678?v=4", + "profile": "https://a11ysupport.io/", + "contributions": [ + "instructions" + ] + }, { "login": "michaelvolz", "name": "Michael A. Volz (Flynn)", @@ -1357,15 +1594,6 @@ "agents" ] }, - { - "login": "codemillmatt", - "name": "Matt Soucoup", - "avatar_url": "https://avatars.githubusercontent.com/u/2053639?v=4", - "profile": "https://codemilltech.com/", - "contributions": [ - "infra" - ] - }, { "login": "marknoble", "name": "Mark Noble", @@ -1402,6 +1630,15 @@ "instructions" ] }, + { + "login": "saikoumudi", + "name": "Sai Koumudi Kaluvakolanu", + "avatar_url": "https://avatars.githubusercontent.com/u/22682497?v=4", + "profile": "https://github.com/saikoumudi", + "contributions": [ + "agents" + ] + }, { "login": "whiteken", "name": "Kenny White", @@ -1529,6 +1766,15 @@ "instructions" ] }, + { + "login": "hunterhogan", + "name": "Hunter Hogan", + "avatar_url": "https://avatars.githubusercontent.com/u/2958419?v=4", + "profile": "https://github.com/hunterhogan", + "contributions": [ + "agents" + ] + }, { "login": "hashimwarren", "name": "Hashim Warren", @@ -1538,6 +1784,15 @@ "agents" ] }, + { + "login": "Arggon", + "name": "Gonzalo", + "avatar_url": "https://avatars.githubusercontent.com/u/20962238?v=4", + "profile": "https://github.com/Arggon", + "contributions": [ + "prompts" + ] + }, { "login": "0GiS0", "name": "Gisela Torres", @@ -1546,24 +1801,6 @@ "contributions": [ "agents" ] - }, - { - "login": "giomartinsdev", - "name": "Giovanni de Almeida Martins", - "avatar_url": "https://avatars.githubusercontent.com/u/125399281?v=4", - "profile": "https://github.com/giomartinsdev", - "contributions": [ - "instructions" - ] - }, - { - "login": "jfversluis", - "name": "Gerald Versluis", - "avatar_url": "https://avatars.githubusercontent.com/u/939291?v=4", - "profile": "https://jfversluis.dev/", - "contributions": [ - "instructions" - ] } ] } diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index e8310bf5..6f2dc6eb 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -16,7 +16,7 @@ jobs: - name: Checkout uses: actions/checkout@v6 with: - fetch-depth: 0 # Required: add-missing-contributors.js needs full git history + fetch-depth: 0 - name: Extract Node version from package.json id: node-version diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 40af0d50..2a11bd47 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -255,7 +255,8 @@ We welcome many kinds of contributions, including the custom categories below: | --- | --- | :---: | | **Instructions** | Custom instruction sets that guide GitHub Copilot behavior | 🧭 | | **Prompts** | Reusable or one-off prompts for GitHub Copilot | ⌨️ | -| **Agents (Chat Modes)** | Defined Copilot roles or personalities | 🎭 | +| **Agents (Chat Modes)** | Defined GitHub Copilot roles or personalities | 🎭 | +| **Skills** | Specialized knowledge of a task for GitHub Copilot | 🧰 | | **Collections** | Curated bundles of related prompts, agents, or instructions | 🎁 | In addition, all standard contribution types supported by [All Contributors](https://allcontributors.org/emoji-key/) are recognized. diff --git a/README.md b/README.md index bb87f895..a79c465a 100644 --- a/README.md +++ b/README.md @@ -132,110 +132,137 @@ Thanks goes to these wonderful people ([emoji key](./CONTRIBUTING.md#contributor
Aaron Powell
Aaron Powell

💻 🚧 📆 📣
Muhammad Ubaid Raza
Muhammad Ubaid Raza

💻
Harald Kirschner
Harald Kirschner

💻
Matteo Bianchi
Matteo Bianchi

💻
Aung Myo Kyaw
Aung Myo Kyaw

💻
Daniel Scott-Raynsford
Daniel Scott-Raynsford

💻
Burke Holland
Burke Holland

💻
Aaron Powell
Aaron Powell

🎭 🎁 📖 🚇 🧭 🚧 ⌨️
Troy Simeon Taylor
Troy Simeon Taylor

🎭 🎁 🧭 ⌨️
Peter Strömberg
Peter Strömberg

🎭 🎁 🧭 ⌨️
Daniel Scott-Raynsford
Daniel Scott-Raynsford

🎭 🎁 🧭 ⌨️
John Haugabook
John Haugabook

🧭 ⌨️
Muhammad Ubaid Raza
Muhammad Ubaid Raza

🎭 🧭
Aung Myo Kyaw
Aung Myo Kyaw

🎭 ⌨️
Peter Strömberg
Peter Strömberg

💻
Daniel Meppiel
Daniel Meppiel

💻
James Montemagno
James Montemagno

💻
Vamshi Verma
Vamshi Verma

💻
Yohan Lasorsa
Yohan Lasorsa

💻
Oren Me
Oren Me

💻
Mike Rousos
Mike Rousos

💻
Harald Kirschner
Harald Kirschner

📖 🚧
Burke Holland
Burke Holland

🎭 🚇 🧭 ⌨️
Daniel Meppiel
Daniel Meppiel

⌨️
James Montemagno
James Montemagno

🎭 📖 🧭 ⌨️
Vamshi Verma
Vamshi Verma

🧭 ⌨️
Yohan Lasorsa
Yohan Lasorsa

🧭 ⌨️
spectatora
spectatora

🎭 🚧
Guilherme do Amaral Alves
Guilherme do Amaral Alves

💻
Troy Simeon Taylor
Troy Simeon Taylor

💻
Ambily
Ambily

💻
Tugdual Grall
Tugdual Grall

💻
Tianqi Zhang
Tianqi Zhang

💻
Shubham Gaikwad
Shubham Gaikwad

💻
Saul Dolgin
Saul Dolgin

💻
Ambily
Ambily

🎭 🧭
Oren Me
Oren Me

🎭 🧭
Mike Rousos
Mike Rousos

🧭 ⌨️
Justin Yoo
Justin Yoo

🧭
Guilherme do Amaral Alves
Guilherme do Amaral Alves

🧭
Griffin Ashe
Griffin Ashe

🎭 🎁
Ashley Childress
Ashley Childress

🎭 📖 🧭
NULLchimp
NULLchimp

💻
Matt Vevang
Matt Vevang

💻
Justin Yoo
Justin Yoo

💻
Gisela Torres
Gisela Torres

💻
Debbie O'Brien
Debbie O'Brien

💻
Allen Greaves
Allen Greaves

💻
Amelia Payne
Amelia Payne

💻
Adrien Clerbois
Adrien Clerbois

🎭 📖 ⌨️
ANGELELLI David
ANGELELLI David

🎭
André Silva
André Silva

🎭 🧭
Matt Vevang
Matt Vevang

🧭
Maximilian Irro
Maximilian Irro

🧭
NULLchimp
NULLchimp

🎭
Saul Dolgin
Saul Dolgin

🎭 🧭 ⌨️
Sebastien DEGODEZ
Sebastien DEGODEZ

💻
Sebastian Gräf
Sebastian Gräf

💻
Salih İbrahimbaş
Salih İbrahimbaş

💻
Robert Altman
Robert Altman

💻
Rob Simpson
Rob Simpson

💻
Rick Smit
Rick Smit

💻
Peter Smulovics
Peter Smulovics

💻
Shubham Gaikwad
Shubham Gaikwad

🎭 🧭 ⌨️
Theo van Kraay
Theo van Kraay

🧭
Tianqi Zhang
Tianqi Zhang

🎭
Tugdual Grall
Tugdual Grall

🧭 ⌨️
Will 保哥
Will 保哥

🎭 ⌨️
Yuta Matsumura
Yuta Matsumura

🧭
hizahizi-hizumi
hizahizi-hizumi

🧭
Peli de Halleux
Peli de Halleux

💻
Paulo Morgado
Paulo Morgado

💻
Nick Taylor
Nick Taylor

💻
Mike Parker
Mike Parker

💻
Mike Kistler
Mike Kistler

💻
Michael Fairchild
Michael Fairchild

💻
Michael A. Volz (Flynn)
Michael A. Volz (Flynn)

💻
黃健旻 Vincent Huang
黃健旻 Vincent Huang

⌨️
Bruno Borges
Bruno Borges

🎁 🧭
Steve Magne
Steve Magne

📖 🧭
Shane Neuville
Shane Neuville

🎭 🧭
Allen Greaves
Allen Greaves

🎭 🧭
Amelia Payne
Amelia Payne

🎭
Brooke Hamilton
Brooke Hamilton

🧭
4regab
4regab

💻
Theo van Kraay
Theo van Kraay

💻
Troy Witthoeft (glsauto)
Troy Witthoeft (glsauto)

💻
Tài Lê
Tài Lê

💻
Udaya Veeramreddygari
Udaya Veeramreddygari

💻
Waren Gonzaga
Waren Gonzaga

💻
Will 保哥
Will 保哥

💻
Christopher Harrison
Christopher Harrison

🧭
Dan
Dan

🧭
Dan Wahlin
Dan Wahlin

🎭
Debbie O'Brien
Debbie O'Brien

🎭 🧭 ⌨️
Ed Harrod
Ed Harrod

⌨️
Genevieve Warren
Genevieve Warren

⌨️
Guillaume
Guillaume

🎭 ⌨️
Yuki Omoto
Yuki Omoto

💻
Meii
Meii

💻
samqbush
samqbush

💻
sdanzo-hrb
sdanzo-hrb

💻
voidfnc
voidfnc

💻
Wendy Breiding
Wendy Breiding

💻
Ankur Sharma
Ankur Sharma

💻
黃健旻 Vincent Huang
黃健旻 Vincent Huang

💻
이상현
이상현

💻
Abdi Daud
Abdi Daud

💻
Adrien Clerbois
Adrien Clerbois

💻
Alan Sprecacenere
Alan Sprecacenere

💻
André Silva
André Silva

💻
Antoine Rey
Antoine Rey

💻
Artem Saveliev
Artem Saveliev

💻
Bruno Borges
Bruno Borges

💻
Christophe Peugnet
Christophe Peugnet

💻
Chtive
Chtive

💻
Craig Bekker
Craig Bekker

💻
Dan
Dan

💻
Eldrick Wega
Eldrick Wega

💻
Felix Arjuna
Felix Arjuna

💻
Furkan Enes
Furkan Enes

💻
Genevieve Warren
Genevieve Warren

💻
George Dernikos
George Dernikos

💻
Giovanni de Almeida Martins
Giovanni de Almeida Martins

💻
Ioana A
Ioana A

💻
Jakub Jareš
Jakub Jareš

💻
Joe Watkins
Joe Watkins

💻
John Papa
John Papa

💻
Joseph Gonzales
Joseph Gonzales

💻
José Antonio Garrido
José Antonio Garrido

💻
Kim Skov Rasmussen
Kim Skov Rasmussen

💻
Kenny White
Kenny White

💻
Louella Creemers
Louella Creemers

💻
Luke Murray
Luke Murray

💻
Mark Noble
Mark Noble

💻
Per Søderlind
Per Søderlind

💻
Henrique Nunes
Henrique Nunes

💻
Henrique Nunes
Henrique Nunes

⌨️
Jeremiah Snee
Jeremiah Snee

💻
spectatora
spectatora

💻
Michael
Michael

💻
Kartik Dhiman
Kartik Dhiman

🧭
Kristiyan Velkov
Kristiyan Velkov

🎭
Mark Davis
Mark Davis

🧭
Peli de Halleux
Peli de Halleux

💻
Per Søderlind
Per Søderlind

🧭
Christian Lechner
Christian Lechner

💻
Jan de Vries
Jan de Vries

💻
Peter Smulovics
Peter Smulovics

🧭
Ravish Rathod
Ravish Rathod

🧭
Rick Smit
Rick Smit

🎭
Rob Simpson
Rob Simpson

🧭
Robert Altman
Robert Altman

🧭
Salih
Salih

🧭
Sebastian Gräf
Sebastian Gräf

🎭 🧭
Sebastien DEGODEZ
Sebastien DEGODEZ

🧭
Sergiy Smyrnov
Sergiy Smyrnov

⌨️
SomeSolutionsArchitect
SomeSolutionsArchitect

🎭
Stu Mace
Stu Mace

🎭 🎁 🧭
이상현
이상현

🧭
Paulo Morgado
Paulo Morgado

⌨️
Paul Crane
Paul Crane

🎭
Pamela Fox
Pamela Fox

⌨️
Oskar Thornblad
Oskar Thornblad

🧭
Nischay Sharma
Nischay Sharma

🎭
Nikolay Marinov
Nikolay Marinov

🎭
Nik Sachdeva
Nik Sachdeva

🎭 🎁
Nick Taylor
Nick Taylor

💻
Nick Brady
Nick Brady

🎭
Nathan Stanford Sr
Nathan Stanford Sr

🧭
Máté Barabás
Máté Barabás

🧭
Mike Parker
Mike Parker

🧭
Mike Kistler
Mike Kistler

⌨️
Michael Fairchild
Michael Fairchild

🧭
Ankur Sharma
Ankur Sharma

⌨️
Wendy Breiding
Wendy Breiding

💻
voidfnc
voidfnc

🎭
shane lee
shane lee

🧭
sdanzo-hrb
sdanzo-hrb

🎭
sauran
sauran

🧭
samqbush
samqbush

⌨️
pareenaverma
pareenaverma

🎭
oleksiyyurchyna
oleksiyyurchyna

🎁 ⌨️
oceans-of-time
oceans-of-time

🧭
kshashank57
kshashank57

🎭 🧭
Meii
Meii

🎭
factory-davidgu
factory-davidgu

💻
dangelov-qa
dangelov-qa

🎭
Yuki Omoto
Yuki Omoto

🧭
Will Schultz
Will Schultz

🎭
Waren Gonzaga
Waren Gonzaga

🎭
Vincent Koc
Vincent Koc

🎭
Victor Williams
Victor Williams

🎭
Ve Sharma
Ve Sharma

🎭
Udaya Veeramreddygari
Udaya Veeramreddygari

🧭
Tài Lê
Tài Lê

⌨️
Troy Witthoeft (glsauto)
Troy Witthoeft (glsauto)

🧭
Tom Meschter
Tom Meschter

💻
Tj Vita
Tj Vita

🎭
Søren Trudsø Mahon
Søren Trudsø Mahon

🧭
George Dernikos
George Dernikos

💻
Gautam
Gautam

🎭
Furkan Enes
Furkan Enes

🧭
Florian Mücke
Florian Mücke

🎭
Felix Arjuna
Felix Arjuna

🧭
Eldrick Wega
Eldrick Wega

⌨️
Dobri Danchev
Dobri Danchev

⌨️
Diego Gamboa
Diego Gamboa

⌨️
Derek Clair
Derek Clair

🎭 ⌨️
David Ortinau
David Ortinau

💻
Daniel Abbatt
Daniel Abbatt

🧭
CypherHK
CypherHK

🎭 ⌨️
Craig Bekker
Craig Bekker

💻
Christophe Peugnet
Christophe Peugnet

🧭
Christian Lechner
Christian Lechner

🧭
Chris Harris
Chris Harris

🎭
BBoyBen
BBoyBen

🧭
Artem Saveliev
Artem Saveliev

🧭
Antoine Rey
Antoine Rey

⌨️
Ankit Das
Ankit Das

🧭
Aline Ávila
Aline Ávila

🧭
Alexander Martinkevich
Alexander Martinkevich

🎭
Aleksandar Dunchev
Aleksandar Dunchev

🎭
Alan Sprecacenere
Alan Sprecacenere

🧭
Akash Kumar Shaw
Akash Kumar Shaw

🧭
Abdi Daud
Abdi Daud

🎭
4regab
4regab

🧭
Michael A. Volz (Flynn)
Michael A. Volz (Flynn)

⌨️
Michael
Michael

🧭
Mehmet Ali EROL
Mehmet Ali EROL

🎭
Max Prilutskiy
Max Prilutskiy

🎭
Matteo Bianchi
Matteo Bianchi

🎭
Matt Soucoup
Matt Soucoup

🚇
Mark Noble
Mark Noble

🎭
Manish Jayaswal
Manish Jayaswal

🎭
Luke Murray
Luke Murray

🎭
Louella Creemers
Louella Creemers

🧭
Kenny White
Kenny White

🧭
KaloyanGenev
KaloyanGenev

🎭
Kim Skov Rasmussen
Kim Skov Rasmussen

💻
Julien Dubois
Julien Dubois

⌨️
José Antonio Garrido
José Antonio Garrido

🧭
Joseph Gonzales
Joseph Gonzales

🧭 ⌨️
Jorge Balderas
Jorge Balderas

🧭
John Papa
John Papa

💻
John
John

🎭
Joe Watkins
Joe Watkins

🧭
Jan de Vries
Jan de Vries

🎭
Jakub Jareš
Jakub Jareš

⌨️
Jackson Miller
Jackson Miller

🧭
Ioana A
Ioana A

🧭
Hashim Warren
Hashim Warren

🎭
Gisela Torres
Gisela Torres

🎭
Giovanni de Almeida Martins
Giovanni de Almeida Martins

🧭
Gerald Versluis
Gerald Versluis

🧭
- + + + + + + + + + + - + + + - - - - + + + + + + + + + + + + + + + - - - + - - + + + - - - + + + - - - + + + + + + + - - - - - - - + + + + + + - - - - - - + + + + + + + + + - - + + @@ -254,93 +281,97 @@ Thanks goes to these wonderful people ([emoji key](./CONTRIBUTING.md#contributor - - + + + + + + + + + + + - - - - - - - - - + + - - + - + + + + + + - - - - - - + + + + + + - - - - - - - - + + + + + + diff --git a/eng/contributor-report.mjs b/eng/contributor-report.mjs index 7f44f8a2..0e72282e 100644 --- a/eng/contributor-report.mjs +++ b/eng/contributor-report.mjs @@ -39,6 +39,9 @@ export const TYPE_PATTERNS = { 'chatmodes/*.chatmode.md', 'agents/*.agent.md' ], + skills: [ + 'skills/' + ], collections: [ 'collections/*.collection.yml' ], @@ -263,11 +266,30 @@ export const getMissingContributors = () => { return filteredUsernames; } catch (error) { - console.error('❌ Error checking for missing contributors:', error.message); - if (error.message.includes('command not found') || error.message.includes('not recognized')) { + const stderr = String(error?.stderr ?? ''); + const stdout = String(error?.stdout ?? ''); + const details = [stderr, stdout, String(error?.message ?? '')].join('\n'); + + // Never print token values. Just print actionable guidance. + if (details.toLowerCase().includes('bad credentials') || details.includes('401')) { + console.error('❌ all-contributors authentication failed (Bad credentials / 401).'); + console.error('💡 Set a valid token in PRIVATE_TOKEN (all-contributors-cli) and/or GH_TOKEN (gh CLI).'); + console.error('💡 In GitHub Actions, you can usually use: secrets.GITHUB_TOKEN'); + throw new Error('contributors:check failed due to invalid credentials'); + } + + console.error('❌ Error checking for missing contributors:', String(error?.message ?? error)); + if (details.trim()) { + console.error('--- all-contributors output (truncated) ---'); + console.error(details.slice(0, 2000)); + console.error('--- end output ---'); + } + + if (String(error?.message ?? '').includes('command not found') || String(error?.message ?? '').includes('not recognized')) { console.error('💡 Make sure all-contributors-cli is installed: npm install all-contributors-cli'); } - return []; + + throw error; } }; @@ -540,6 +562,11 @@ const main = () => { process.env.GITHUB_TOKEN = process.env.PRIVATE_TOKEN; } + // gh prefers GH_TOKEN; if we only have GITHUB_TOKEN, make GH_TOKEN explicit. + if (process.env.GITHUB_TOKEN && !process.env.GH_TOKEN) { + process.env.GH_TOKEN = process.env.GITHUB_TOKEN; + } + const args = new Set(process.argv.slice(2)); const includeAllFiles = args.has('--include-all-pr-files'); From f078f4540ddb4966efd878c96859377375cf5e69 Mon Sep 17 00:00:00 2001 From: Christopher Harrison Date: Thu, 15 Jan 2026 14:13:10 -0800 Subject: [PATCH 14/15] Update Svelte instructions with Svelte 5 best practices - Added latest Svelte 5 runes best practices (.by, .pre, untrack) - Added type-safe context with createContext() pattern - Added transitions and animations section - Emphasized effect best practices (prefer over ) - Added function bindings for two-way binding - Restructured document for better readability with logical groupings - Organized into clear sections: Core Concepts, Reactivity, SvelteKit, UI, TypeScript, Production - Consolidated related topics (data loading, forms, tooling) - Updated to align with official Svelte 5 and SvelteKit documentation --- instructions/svelte.instructions.md | 141 ++++++++++++++++++---------- 1 file changed, 93 insertions(+), 48 deletions(-) diff --git a/instructions/svelte.instructions.md b/instructions/svelte.instructions.md index 646b4baf..7f2dfed5 100644 --- a/instructions/svelte.instructions.md +++ b/instructions/svelte.instructions.md @@ -15,7 +15,7 @@ Instructions for building high-quality Svelte 5 and SvelteKit applications with - Progressive enhancement and performance-first approach - Modern build tooling (Vite) with optimizations -## Development Standards +## Core Concepts ### Architecture - Use Svelte 5 runes system for all reactivity instead of legacy stores @@ -25,45 +25,76 @@ Instructions for building high-quality Svelte 5 and SvelteKit applications with - Implement proper component composition with slots and snippets - Use SvelteKit's file-based routing with proper load functions -### TypeScript Integration -- Enable strict mode in `tsconfig.json` for maximum type safety -- Define interfaces for component props using `$props()` syntax -- Type event handlers, refs, and SvelteKit's generated types -- Use generic types for reusable components -- Leverage `$types.ts` files generated by SvelteKit -- Implement proper type checking with `svelte-check` - ### Component Design - Follow single responsibility principle for components - Use `
Aaron Powell
Aaron Powell

🎭 🎁 📖 🚇 🧭 🚧 ⌨️
Aaron Powell
Aaron Powell

🎭 💻 🎁 📖 🚇 🧭 🚧 ⌨️
Matt Soucoup
Matt Soucoup

🚇
Troy Simeon Taylor
Troy Simeon Taylor

🎭 🎁 🧭 ⌨️
Abbas
Abbas

🎭 🧭
Peter Strömberg
Peter Strömberg

🎭 🎁 🧭 ⌨️
Daniel Scott-Raynsford
Daniel Scott-Raynsford

🎭 🎁 🧭 ⌨️
John Haugabook
John Haugabook

🧭 ⌨️
Pavel Simsa
Pavel Simsa

💻
Harald Kirschner
Harald Kirschner

💻 📖 🚧
Muhammad Ubaid Raza
Muhammad Ubaid Raza

🎭 🧭
Tom Meschter
Tom Meschter

💻
Aung Myo Kyaw
Aung Myo Kyaw

🎭 ⌨️
JasonYeMSFT
JasonYeMSFT

💻
Jon Corbin
Jon Corbin

🎭 ⌨️
Harald Kirschner
Harald Kirschner

📖 🚧
troytaylor-msft
troytaylor-msft

💻
Emerson Delatorre
Emerson Delatorre

🧭
Burke Holland
Burke Holland

🎭 🚇 🧭 ⌨️
Kent Yao
Kent Yao

🧭 ⌨️
Daniel Meppiel
Daniel Meppiel

⌨️
James Montemagno
James Montemagno

🎭 📖 🧭 ⌨️
Vamshi Verma
Vamshi Verma

🧭 ⌨️
Yohan Lasorsa
Yohan Lasorsa

🧭 ⌨️
spectatora
spectatora

🎭 🚧
Gordon Lam
Gordon Lam

🧭
Mads Kristensen
Mads Kristensen

🧭
Shinji Takenaka
Shinji Takenaka

💻
spectatora
spectatora

🎭 💻 🚧
Yohan Lasorsa
Yohan Lasorsa

🧭 ⌨️
Vamshi Verma
Vamshi Verma

🧭 ⌨️
James Montemagno
James Montemagno

🎭 📖 🧭 ⌨️
Alessandro Fragnani
Alessandro Fragnani

💻
Ambily
Ambily

🎭 🧭
krushideep
krushideep

⌨️
devopsfan
devopsfan

🎭
Tugdual Grall
Tugdual Grall

🧭 ⌨️
Oren Me
Oren Me

🎭 🧭
Mike Rousos
Mike Rousos

🧭 ⌨️
Justin Yoo
Justin Yoo

🧭
Guilherme do Amaral Alves
Guilherme do Amaral Alves

🧭
Griffin Ashe
Griffin Ashe

🎭 🎁
Ashley Childress
Ashley Childress

🎭 📖 🧭
Adrien Clerbois
Adrien Clerbois

🎭 📖 ⌨️
ANGELELLI David
ANGELELLI David

🎭
André Silva
André Silva

🎭 🧭
Mark Davis
Mark Davis

🧭
Matt Vevang
Matt Vevang

🧭
Maximilian Irro
Maximilian Irro

🧭
NULLchimp
NULLchimp

🎭
Saul Dolgin
Saul Dolgin

🎭 🧭 ⌨️
NULLchimp
NULLchimp

🎭
Peter Karda
Peter Karda

⌨️
Saul Dolgin
Saul Dolgin

🎭 🧭 ⌨️
Shubham Gaikwad
Shubham Gaikwad

🎭 🧭 ⌨️
Theo van Kraay
Theo van Kraay

🧭
Tianqi Zhang
Tianqi Zhang

🎭
Tugdual Grall
Tugdual Grall

🧭 ⌨️
Will 保哥
Will 保哥

🎭 ⌨️
Yuta Matsumura
Yuta Matsumura

🧭
hizahizi-hizumi
hizahizi-hizumi

🧭
Yuta Matsumura
Yuta Matsumura

🧭
anschnapp
anschnapp

🎭
hizahizi-hizumi
hizahizi-hizumi

🧭
黃健旻 Vincent Huang
黃健旻 Vincent Huang

⌨️
Bruno Borges
Bruno Borges

🎁 🧭
Steve Magne
Steve Magne

📖 🧭
Shane Neuville
Shane Neuville

🎭 🧭
Allen Greaves
Allen Greaves

🎭 🧭
Amelia Payne
Amelia Payne

🎭
Brooke Hamilton
Brooke Hamilton

🧭
André Silva
André Silva

🎭 🧭
Allen Greaves
Allen Greaves

🎭 🧭
Amelia Payne
Amelia Payne

🎭
BBoyBen
BBoyBen

🧭
Brooke Hamilton
Brooke Hamilton

🧭
Christopher Harrison
Christopher Harrison

🧭
Dan
Dan

🧭
Dan Wahlin
Dan Wahlin

🎭
Debbie O'Brien
Debbie O'Brien

🎭 🧭 ⌨️
Ed Harrod
Ed Harrod

⌨️
Genevieve Warren
Genevieve Warren

⌨️
Guillaume
Guillaume

🎭 ⌨️
Henrique Nunes
Henrique Nunes

⌨️
Jeremiah Snee
Jeremiah Snee

💻
Kartik Dhiman
Kartik Dhiman

🧭
Kristiyan Velkov
Kristiyan Velkov

🎭
Mark Davis
Mark Davis

🧭
Peli de Halleux
Peli de Halleux

💻
Per Søderlind
Per Søderlind

🧭
Kartik Dhiman
Kartik Dhiman

🧭
Kristiyan Velkov
Kristiyan Velkov

🎭
msalaman
msalaman

💻
Per Søderlind
Per Søderlind

🧭
Peter Smulovics
Peter Smulovics

🧭
Ravish Rathod
Ravish Rathod

🧭
Rick Smit
Rick Smit

🎭
Rob Simpson
Rob Simpson

🧭
Robert Altman
Robert Altman

🧭
Salih
Salih

🧭
Sebastian Gräf
Sebastian Gräf

🎭 🧭
Sebastien DEGODEZ
Sebastien DEGODEZ

🧭
Sergiy Smyrnov
Sergiy Smyrnov

⌨️
SomeSolutionsArchitect
SomeSolutionsArchitect

🎭
Stu Mace
Stu Mace

🎭 🎁 🧭
이상현
이상현

🧭
Paulo Morgado
Paulo Morgado

⌨️
Paul Crane
Paul Crane

🎭
Stu Mace
Stu Mace

🎭 🎁 🧭
Søren Trudsø Mahon
Søren Trudsø Mahon

🧭
Tj Vita
Tj Vita

🎭
Peli de Halleux
Peli de Halleux

💻
Paulo Morgado
Paulo Morgado

⌨️
Paul Crane
Paul Crane

🎭
Pamela Fox
Pamela Fox

⌨️
Oskar Thornblad
Oskar Thornblad

🧭
Nischay Sharma
Nischay Sharma

🎭
Nikolay Marinov
Nikolay Marinov

🎭
Nik Sachdeva
Nik Sachdeva

🎭 🎁
Nick Taylor
Nick Taylor

💻
Nick Brady
Nick Brady

🎭
Nathan Stanford Sr
Nathan Stanford Sr

🧭
Nathan Stanford Sr
Nathan Stanford Sr

🧭
Máté Barabás
Máté Barabás

🧭
Mike Parker
Mike Parker

🧭
Mike Kistler
Mike Kistler

⌨️
Michael Fairchild
Michael Fairchild

🧭
Giovanni de Almeida Martins
Giovanni de Almeida Martins

🧭
이상현
이상현

🧭
Ankur Sharma
Ankur Sharma

⌨️
Wendy Breiding
Wendy Breiding

💻
Meii
Meii

🎭
factory-davidgu
factory-davidgu

💻
dangelov-qa
dangelov-qa

🎭
Yuki Omoto
Yuki Omoto

🧭
Will Schultz
Will Schultz

🎭
BenoitMaucotel
BenoitMaucotel

💻
benjisho-aidome
benjisho-aidome

🎭 🧭 ⌨️
Yuki Omoto
Yuki Omoto

🧭
Will Schultz
Will Schultz

🎭
Waren Gonzaga
Waren Gonzaga

🎭
Vincent Koc
Vincent Koc

🎭
Victor Williams
Victor Williams

🎭
Ve Sharma
Ve Sharma

🎭
Vasileios Lahanas
Vasileios Lahanas

🧭
Udaya Veeramreddygari
Udaya Veeramreddygari

🧭
Tài Lê
Tài Lê

⌨️
Tsubasa Ogawa
Tsubasa Ogawa

💻
Troy Witthoeft (glsauto)
Troy Witthoeft (glsauto)

🧭
Gerald Versluis
Gerald Versluis

🧭
George Dernikos
George Dernikos

⌨️
Gautam
Gautam

🎭
Tom Meschter
Tom Meschter

💻
Tj Vita
Tj Vita

🎭
Søren Trudsø Mahon
Søren Trudsø Mahon

🧭
George Dernikos
George Dernikos

💻
Gautam
Gautam

🎭
Furkan Enes
Furkan Enes

🧭
Florian Mücke
Florian Mücke

🎭
Felix Arjuna
Felix Arjuna

🧭
Eldrick Wega
Eldrick Wega

⌨️
Dobri Danchev
Dobri Danchev

⌨️
Diego Gamboa
Diego Gamboa

⌨️
Derek Clair
Derek Clair

🎭 ⌨️
David Ortinau
David Ortinau

💻
Daniel Abbatt
Daniel Abbatt

🧭
David Ortinau
David Ortinau

💻
Daniel Abbatt
Daniel Abbatt

🧭
CypherHK
CypherHK

🎭 ⌨️
Craig Bekker
Craig Bekker

💻
Christophe Peugnet
Christophe Peugnet

🧭
Christian Lechner
Christian Lechner

🧭
Chris Harris
Chris Harris

🎭
BBoyBen
BBoyBen

🧭
Artem Saveliev
Artem Saveliev

🧭
Artem Saveliev
Artem Saveliev

🧭
Antoine Rey
Antoine Rey

⌨️
Ankit Das
Ankit Das

🧭
Aline Ávila
Aline Ávila

🧭
Alexander Martinkevich
Alexander Martinkevich

🎭
Aleksandar Dunchev
Aleksandar Dunchev

🎭
Alan Sprecacenere
Alan Sprecacenere

🧭
Akash Kumar Shaw
Akash Kumar Shaw

🧭
Akash Kumar Shaw
Akash Kumar Shaw

🧭
Abdi Daud
Abdi Daud

🎭
AIAlchemyForge
AIAlchemyForge

🧭
4regab
4regab

🧭
Miguel P Z
Miguel P Z

📖
Michael Fairchild
Michael Fairchild

🧭
Michael A. Volz (Flynn)
Michael A. Volz (Flynn)

⌨️
Michael
Michael

🧭
Mehmet Ali EROL
Mehmet Ali EROL

🎭
Max Prilutskiy
Max Prilutskiy

🎭
Matteo Bianchi
Matteo Bianchi

🎭
Matt Soucoup
Matt Soucoup

🚇
Mark Noble
Mark Noble

🎭
Manish Jayaswal
Manish Jayaswal

🎭
Luke Murray
Luke Murray

🎭
Louella Creemers
Louella Creemers

🧭
Kenny White
Kenny White

🧭
KaloyanGenev
KaloyanGenev

🎭
Louella Creemers
Louella Creemers

🧭
Sai Koumudi Kaluvakolanu
Sai Koumudi Kaluvakolanu

🎭
Kenny White
Kenny White

🧭
KaloyanGenev
KaloyanGenev

🎭
Kim Skov Rasmussen
Kim Skov Rasmussen

💻
Julien Dubois
Julien Dubois

⌨️
José Antonio Garrido
José Antonio Garrido

🧭
Joseph Gonzales
Joseph Gonzales

🧭 ⌨️
Jorge Balderas
Jorge Balderas

🧭
John Papa
John Papa

💻
John
John

🎭
Joe Watkins
Joe Watkins

🧭
Jan de Vries
Jan de Vries

🎭
Jakub Jareš
Jakub Jareš

⌨️
Jackson Miller
Jackson Miller

🧭
Ioana A
Ioana A

🧭
Hashim Warren
Hashim Warren

🎭
Gisela Torres
Gisela Torres

🎭
Giovanni de Almeida Martins
Giovanni de Almeida Martins

🧭
Gerald Versluis
Gerald Versluis

🧭
Jackson Miller
Jackson Miller

🧭
Ioana A
Ioana A

🧭
Hunter Hogan
Hunter Hogan

🎭
Hashim Warren
Hashim Warren

🎭
Gonzalo
Gonzalo

⌨️
Gisela Torres
Gisela Torres

🎭