mirror of
https://github.com/github/awesome-copilot.git
synced 2026-02-20 02:15:12 +00:00
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 <copilot@github.com> Signed-off-by: Ashley Childress <6563688+anchildress1@users.noreply.github.com>
This commit is contained in:
2050
.all-contributorsrc
2050
.all-contributorsrc
File diff suppressed because it is too large
Load Diff
40
.github/workflows/contributors.yml
vendored
40
.github/workflows/contributors.yml
vendored
@@ -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
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,6 +1,7 @@
|
||||
node_modules
|
||||
*.orig
|
||||
Copilot-Processing.md
|
||||
reports/
|
||||
|
||||
# macOS system files
|
||||
.DS_Store
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
301
README.md
301
README.md
@@ -1,9 +1,6 @@
|
||||
# 🤖 Awesome GitHub Copilot Customizations
|
||||
[](https://aka.ms/awesome-github-copilot?style=flat-square) [](#contributors-)
|
||||
|
||||
[](https://aka.ms/awesome-github-copilot)
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||
[](#contributors-)
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||
|
||||
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)):
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
@@ -135,125 +132,215 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.aaron-powell.com/"><img src="https://avatars.githubusercontent.com/u/434140?v=4?s=100" width="100px;" alt="Aaron Powell"/><br /><sub><b>Aaron Powell</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=aaronpowell" title="Code">💻</a> <a href="#maintenance-aaronpowell" title="Maintenance">🚧</a> <a href="#projectManagement-aaronpowell" title="Project Management">📆</a> <a href="#promotion-aaronpowell" title="Promotion">📣</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://mubaidr.js.org/"><img src="https://avatars.githubusercontent.com/u/2222702?v=4?s=100" width="100px;" alt="Muhammad Ubaid Raza"/><br /><sub><b>Muhammad Ubaid Raza</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=mubaidr" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://digitarald.de/"><img src="https://avatars.githubusercontent.com/u/8599?v=4?s=100" width="100px;" alt="Harald Kirschner"/><br /><sub><b>Harald Kirschner</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=digitarald" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mbianchidev"><img src="https://avatars.githubusercontent.com/u/37507190?v=4?s=100" width="100px;" alt="Matteo Bianchi"/><br /><sub><b>Matteo Bianchi</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=mbianchidev" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AungMyoKyaw"><img src="https://avatars.githubusercontent.com/u/9404824?v=4?s=100" width="100px;" alt="Aung Myo Kyaw"/><br /><sub><b>Aung Myo Kyaw</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=AungMyoKyaw" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://danielscottraynsford.com/"><img src="https://avatars.githubusercontent.com/u/7589164?v=4?s=100" width="100px;" alt="Daniel Scott-Raynsford"/><br /><sub><b>Daniel Scott-Raynsford</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=PlagueHO" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/burkeholland"><img src="https://avatars.githubusercontent.com/u/686963?v=4?s=100" width="100px;" alt="Burke Holland"/><br /><sub><b>Burke Holland</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=burkeholland" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.aaron-powell.com/"><img src="https://avatars.githubusercontent.com/u/434140?v=4?s=100" width="100px;" alt="Aaron Powell"/><br /><sub><b>Aaron Powell</b></sub></a><br /><a href="#agents-aaronpowell" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#collections-aaronpowell" title="Curated collections of related content">🎁</a> <a href="https://github.com/github/awesome-copilot/commits?author=aaronpowell" title="Documentation">📖</a> <a href="#infra-aaronpowell" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#instructions-aaronpowell" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#maintenance-aaronpowell" title="Maintenance">🚧</a> <a href="#prompts-aaronpowell" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.buymeacoffee.com/troystaylor"><img src="https://avatars.githubusercontent.com/u/44444967?v=4?s=100" width="100px;" alt="Troy Simeon Taylor"/><br /><sub><b>Troy Simeon Taylor</b></sub></a><br /><a href="#agents-troystaylor" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#collections-troystaylor" title="Curated collections of related content">🎁</a> <a href="#instructions-troystaylor" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-troystaylor" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://calva.io/"><img src="https://avatars.githubusercontent.com/u/30010?v=4?s=100" width="100px;" alt="Peter Strömberg"/><br /><sub><b>Peter Strömberg</b></sub></a><br /><a href="#agents-PEZ" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#collections-PEZ" title="Curated collections of related content">🎁</a> <a href="#instructions-PEZ" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-PEZ" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://danielscottraynsford.com/"><img src="https://avatars.githubusercontent.com/u/7589164?v=4?s=100" width="100px;" alt="Daniel Scott-Raynsford"/><br /><sub><b>Daniel Scott-Raynsford</b></sub></a><br /><a href="#agents-PlagueHO" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#collections-PlagueHO" title="Curated collections of related content">🎁</a> <a href="#instructions-PlagueHO" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-PlagueHO" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jhauga"><img src="https://avatars.githubusercontent.com/u/10998676?v=4?s=100" width="100px;" alt="John Haugabook"/><br /><sub><b>John Haugabook</b></sub></a><br /><a href="#instructions-jhauga" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-jhauga" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://mubaidr.js.org/"><img src="https://avatars.githubusercontent.com/u/2222702?v=4?s=100" width="100px;" alt="Muhammad Ubaid Raza"/><br /><sub><b>Muhammad Ubaid Raza</b></sub></a><br /><a href="#agents-mubaidr" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-mubaidr" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.aungmyokyaw.com/"><img src="https://avatars.githubusercontent.com/u/9404824?v=4?s=100" width="100px;" alt="Aung Myo Kyaw"/><br /><sub><b>Aung Myo Kyaw</b></sub></a><br /><a href="#agents-AungMyoKyaw" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#prompts-AungMyoKyaw" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://calva.io/"><img src="https://avatars.githubusercontent.com/u/30010?v=4?s=100" width="100px;" alt="Peter Strömberg"/><br /><sub><b>Peter Strömberg</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=PEZ" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.devprodlogs.com/"><img src="https://avatars.githubusercontent.com/u/51440732?v=4?s=100" width="100px;" alt="Daniel Meppiel"/><br /><sub><b>Daniel Meppiel</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=danielmeppiel" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://montemagno.com/"><img src="https://avatars.githubusercontent.com/u/1676321?v=4?s=100" width="100px;" alt="James Montemagno"/><br /><sub><b>James Montemagno</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=jamesmontemagno" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VamshiVerma"><img src="https://avatars.githubusercontent.com/u/21999324?v=4?s=100" width="100px;" alt="Vamshi Verma"/><br /><sub><b>Vamshi Verma</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=VamshiVerma" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sinedied"><img src="https://avatars.githubusercontent.com/u/593151?v=4?s=100" width="100px;" alt="Yohan Lasorsa"/><br /><sub><b>Yohan Lasorsa</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=sinedied" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/OrenMe"><img src="https://avatars.githubusercontent.com/u/5461862?v=4?s=100" width="100px;" alt="Oren Me"/><br /><sub><b>Oren Me</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=OrenMe" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mjrousos"><img src="https://avatars.githubusercontent.com/u/10077254?v=4?s=100" width="100px;" alt="Mike Rousos"/><br /><sub><b>Mike Rousos</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=mjrousos" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://digitarald.de/"><img src="https://avatars.githubusercontent.com/u/8599?v=4?s=100" width="100px;" alt="Harald Kirschner"/><br /><sub><b>Harald Kirschner</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=digitarald" title="Documentation">📖</a> <a href="#maintenance-digitarald" title="Maintenance">🚧</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/burkeholland"><img src="https://avatars.githubusercontent.com/u/686963?v=4?s=100" width="100px;" alt="Burke Holland"/><br /><sub><b>Burke Holland</b></sub></a><br /><a href="#agents-burkeholland" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#infra-burkeholland" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#instructions-burkeholland" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-burkeholland" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.devprodlogs.com/"><img src="https://avatars.githubusercontent.com/u/51440732?v=4?s=100" width="100px;" alt="Daniel Meppiel"/><br /><sub><b>Daniel Meppiel</b></sub></a><br /><a href="#prompts-danielmeppiel" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://montemagno.com/"><img src="https://avatars.githubusercontent.com/u/1676321?v=4?s=100" width="100px;" alt="James Montemagno"/><br /><sub><b>James Montemagno</b></sub></a><br /><a href="#agents-jamesmontemagno" title="Specialized agents for GitHub Copilot">🎭</a> <a href="https://github.com/github/awesome-copilot/commits?author=jamesmontemagno" title="Documentation">📖</a> <a href="#instructions-jamesmontemagno" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-jamesmontemagno" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VamshiVerma"><img src="https://avatars.githubusercontent.com/u/21999324?v=4?s=100" width="100px;" alt="Vamshi Verma"/><br /><sub><b>Vamshi Verma</b></sub></a><br /><a href="#instructions-VamshiVerma" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-VamshiVerma" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sinedied"><img src="https://avatars.githubusercontent.com/u/593151?v=4?s=100" width="100px;" alt="Yohan Lasorsa"/><br /><sub><b>Yohan Lasorsa</b></sub></a><br /><a href="#instructions-sinedied" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-sinedied" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/spectatora"><img src="https://avatars.githubusercontent.com/u/1385755?v=4?s=100" width="100px;" alt="spectatora"/><br /><sub><b>spectatora</b></sub></a><br /><a href="#agents-spectatora" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#maintenance-spectatora" title="Maintenance">🚧</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/guiopen"><img src="https://avatars.githubusercontent.com/u/94094527?v=4?s=100" width="100px;" alt="Guilherme do Amaral Alves "/><br /><sub><b>Guilherme do Amaral Alves </b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=guiopen" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.buymeacoffee.com/troystaylor"><img src="https://avatars.githubusercontent.com/u/44444967?v=4?s=100" width="100px;" alt="Troy Simeon Taylor"/><br /><sub><b>Troy Simeon Taylor</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=troystaylor" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/ambilykk/"><img src="https://avatars.githubusercontent.com/u/10282550?v=4?s=100" width="100px;" alt="Ambily"/><br /><sub><b>Ambily</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=ambilykk" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://tgrall.github.io/"><img src="https://avatars.githubusercontent.com/u/541250?v=4?s=100" width="100px;" alt="Tugdual Grall"/><br /><sub><b>Tugdual Grall</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=tgrall" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TianqiZhang"><img src="https://avatars.githubusercontent.com/u/5326582?v=4?s=100" width="100px;" alt="Tianqi Zhang"/><br /><sub><b>Tianqi Zhang</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=TianqiZhang" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shubham070"><img src="https://avatars.githubusercontent.com/u/5480589?v=4?s=100" width="100px;" alt="Shubham Gaikwad"/><br /><sub><b>Shubham Gaikwad</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=shubham070" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sdolgin"><img src="https://avatars.githubusercontent.com/u/576449?v=4?s=100" width="100px;" alt="Saul Dolgin"/><br /><sub><b>Saul Dolgin</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=sdolgin" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/ambilykk/"><img src="https://avatars.githubusercontent.com/u/10282550?v=4?s=100" width="100px;" alt="Ambily"/><br /><sub><b>Ambily</b></sub></a><br /><a href="#agents-ambilykk" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-ambilykk" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.promptboost.dev/"><img src="https://avatars.githubusercontent.com/u/5461862?v=4?s=100" width="100px;" alt="Oren Me"/><br /><sub><b>Oren Me</b></sub></a><br /><a href="#agents-OrenMe" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-OrenMe" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mjrousos"><img src="https://avatars.githubusercontent.com/u/10077254?v=4?s=100" width="100px;" alt="Mike Rousos"/><br /><sub><b>Mike Rousos</b></sub></a><br /><a href="#instructions-mjrousos" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-mjrousos" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://devkimchi.com/"><img src="https://avatars.githubusercontent.com/u/1538528?v=4?s=100" width="100px;" alt="Justin Yoo"/><br /><sub><b>Justin Yoo</b></sub></a><br /><a href="#instructions-justinyoo" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/guiopen"><img src="https://avatars.githubusercontent.com/u/94094527?v=4?s=100" width="100px;" alt="Guilherme do Amaral Alves "/><br /><sub><b>Guilherme do Amaral Alves </b></sub></a><br /><a href="#instructions-guiopen" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/griffinashe/"><img src="https://avatars.githubusercontent.com/u/6391612?v=4?s=100" width="100px;" alt="Griffin Ashe"/><br /><sub><b>Griffin Ashe</b></sub></a><br /><a href="#agents-griffinashe" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#collections-griffinashe" title="Curated collections of related content">🎁</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anchildress1"><img src="https://avatars.githubusercontent.com/u/6563688?v=4?s=100" width="100px;" alt="Ashley Childress"/><br /><sub><b>Ashley Childress</b></sub></a><br /><a href="#agents-anchildress1" title="Specialized agents for GitHub Copilot">🎭</a> <a href="https://github.com/github/awesome-copilot/commits?author=anchildress1" title="Documentation">📖</a> <a href="#instructions-anchildress1" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nullchimp"><img src="https://avatars.githubusercontent.com/u/58362593?v=4?s=100" width="100px;" alt="NULLchimp"/><br /><sub><b>NULLchimp</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=nullchimp" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MattVevang"><img src="https://avatars.githubusercontent.com/u/20714898?v=4?s=100" width="100px;" alt="Matt Vevang"/><br /><sub><b>Matt Vevang</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=MattVevang" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://devkimchi.com/"><img src="https://avatars.githubusercontent.com/u/1538528?v=4?s=100" width="100px;" alt="Justin Yoo"/><br /><sub><b>Justin Yoo</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=justinyoo" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://hachyderm.io/@0gis0"><img src="https://avatars.githubusercontent.com/u/175379?v=4?s=100" width="100px;" alt="Gisela Torres"/><br /><sub><b>Gisela Torres</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=0GiS0" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://debbie.codes/"><img src="https://avatars.githubusercontent.com/u/13063165?v=4?s=100" width="100px;" alt="Debbie O'Brien"/><br /><sub><b>Debbie O'Brien</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=debs-obrien" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/agreaves-ms"><img src="https://avatars.githubusercontent.com/u/111466195?v=4?s=100" width="100px;" alt="Allen Greaves"/><br /><sub><b>Allen Greaves</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=agreaves-ms" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AmeliaRose802"><img src="https://avatars.githubusercontent.com/u/26167931?v=4?s=100" width="100px;" alt="Amelia Payne"/><br /><sub><b>Amelia Payne</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=AmeliaRose802" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.senseof.tech/"><img src="https://avatars.githubusercontent.com/u/50712277?v=4?s=100" width="100px;" alt="Adrien Clerbois"/><br /><sub><b>Adrien Clerbois</b></sub></a><br /><a href="#agents-AClerbois" title="Specialized agents for GitHub Copilot">🎭</a> <a href="https://github.com/github/awesome-copilot/commits?author=AClerbois" title="Documentation">📖</a> <a href="#prompts-AClerbois" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Vhivi"><img src="https://avatars.githubusercontent.com/u/38220028?v=4?s=100" width="100px;" alt="ANGELELLI David"/><br /><sub><b>ANGELELLI David</b></sub></a><br /><a href="#agents-Vhivi" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://asilva.dev/"><img src="https://avatars.githubusercontent.com/u/2493377?v=4?s=100" width="100px;" alt="André Silva"/><br /><sub><b>André Silva</b></sub></a><br /><a href="#agents-askpt" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-askpt" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MattVevang"><img src="https://avatars.githubusercontent.com/u/20714898?v=4?s=100" width="100px;" alt="Matt Vevang"/><br /><sub><b>Matt Vevang</b></sub></a><br /><a href="#instructions-MattVevang" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://max.irro.at/"><img src="https://avatars.githubusercontent.com/u/589073?v=4?s=100" width="100px;" alt="Maximilian Irro"/><br /><sub><b>Maximilian Irro</b></sub></a><br /><a href="#instructions-mpgirro" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nullchimp"><img src="https://avatars.githubusercontent.com/u/58362593?v=4?s=100" width="100px;" alt="NULLchimp"/><br /><sub><b>NULLchimp</b></sub></a><br /><a href="#agents-nullchimp" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sdolgin"><img src="https://avatars.githubusercontent.com/u/576449?v=4?s=100" width="100px;" alt="Saul Dolgin"/><br /><sub><b>Saul Dolgin</b></sub></a><br /><a href="#agents-sdolgin" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-sdolgin" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-sdolgin" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SebastienDegodez"><img src="https://avatars.githubusercontent.com/u/2349146?v=4?s=100" width="100px;" alt="Sebastien DEGODEZ"/><br /><sub><b>Sebastien DEGODEZ</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=SebastienDegodez" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://graef.io/"><img src="https://avatars.githubusercontent.com/u/19261257?v=4?s=100" width="100px;" alt="Sebastian Gräf"/><br /><sub><b>Sebastian Gräf</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=segraef" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://9ssi7.dev/"><img src="https://avatars.githubusercontent.com/u/76786120?v=4?s=100" width="100px;" alt="Salih İbrahimbaş"/><br /><sub><b>Salih İbrahimbaş</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=9ssi7" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/inquinity"><img src="https://avatars.githubusercontent.com/u/406234?v=4?s=100" width="100px;" alt="Robert Altman"/><br /><sub><b>Robert Altman</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=inquinity" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pertrai1"><img src="https://avatars.githubusercontent.com/u/442374?v=4?s=100" width="100px;" alt="Rob Simpson"/><br /><sub><b>Rob Simpson</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=pertrai1" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://ricksm.it/"><img src="https://avatars.githubusercontent.com/u/7207783?v=4?s=100" width="100px;" alt="Rick Smit"/><br /><sub><b>Rick Smit</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=ricksmit3000" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://dotneteers.net/"><img src="https://avatars.githubusercontent.com/u/28162552?v=4?s=100" width="100px;" alt="Peter Smulovics"/><br /><sub><b>Peter Smulovics</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=psmulovics" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shubham070"><img src="https://avatars.githubusercontent.com/u/5480589?v=4?s=100" width="100px;" alt="Shubham Gaikwad"/><br /><sub><b>Shubham Gaikwad</b></sub></a><br /><a href="#agents-shubham070" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-shubham070" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-shubham070" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TheovanKraay"><img src="https://avatars.githubusercontent.com/u/24420698?v=4?s=100" width="100px;" alt="Theo van Kraay"/><br /><sub><b>Theo van Kraay</b></sub></a><br /><a href="#instructions-TheovanKraay" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TianqiZhang"><img src="https://avatars.githubusercontent.com/u/5326582?v=4?s=100" width="100px;" alt="Tianqi Zhang"/><br /><sub><b>Tianqi Zhang</b></sub></a><br /><a href="#agents-TianqiZhang" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://tgrall.github.io/"><img src="https://avatars.githubusercontent.com/u/541250?v=4?s=100" width="100px;" alt="Tugdual Grall"/><br /><sub><b>Tugdual Grall</b></sub></a><br /><a href="#instructions-tgrall" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-tgrall" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://blog.miniasp.com/"><img src="https://avatars.githubusercontent.com/u/88981?v=4?s=100" width="100px;" alt="Will 保哥"/><br /><sub><b>Will 保哥</b></sub></a><br /><a href="#agents-doggy8088" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#prompts-doggy8088" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://tsubalog.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/1592808?v=4?s=100" width="100px;" alt="Yuta Matsumura"/><br /><sub><b>Yuta Matsumura</b></sub></a><br /><a href="#instructions-tsubakimoto" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hizahizi-hizumi"><img src="https://avatars.githubusercontent.com/u/163728895?v=4?s=100" width="100px;" alt="hizahizi-hizumi"/><br /><sub><b>hizahizi-hizumi</b></sub></a><br /><a href="#instructions-hizahizi-hizumi" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pelikhan"><img src="https://avatars.githubusercontent.com/u/4175913?v=4?s=100" width="100px;" alt="Peli de Halleux"/><br /><sub><b>Peli de Halleux</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=pelikhan" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.paulomorgado.net/"><img src="https://avatars.githubusercontent.com/u/470455?v=4?s=100" width="100px;" alt="Paulo Morgado"/><br /><sub><b>Paulo Morgado</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=paulomorgado" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://nickyt.co/"><img src="https://avatars.githubusercontent.com/u/833231?v=4?s=100" width="100px;" alt="Nick Taylor"/><br /><sub><b>Nick Taylor</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=nickytonline" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mikeparker104"><img src="https://avatars.githubusercontent.com/u/12763221?v=4?s=100" width="100px;" alt="Mike Parker"/><br /><sub><b>Mike Parker</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=mikeparker104" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mikekistler"><img src="https://avatars.githubusercontent.com/u/85643503?v=4?s=100" width="100px;" alt="Mike Kistler"/><br /><sub><b>Mike Kistler</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=mikekistler" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://a11ysupport.io/"><img src="https://avatars.githubusercontent.com/u/498678?v=4?s=100" width="100px;" alt="Michael Fairchild"/><br /><sub><b>Michael Fairchild</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=mfairchild365" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/michael-volz/"><img src="https://avatars.githubusercontent.com/u/129928?v=4?s=100" width="100px;" alt="Michael A. Volz (Flynn)"/><br /><sub><b>Michael A. Volz (Flynn)</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=michaelvolz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://jianminhuang.cc/"><img src="https://avatars.githubusercontent.com/u/6296280?v=4?s=100" width="100px;" alt="黃健旻 Vincent Huang"/><br /><sub><b>黃健旻 Vincent Huang</b></sub></a><br /><a href="#prompts-Jian-Min-Huang" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://brunoborges.io/"><img src="https://avatars.githubusercontent.com/u/129743?v=4?s=100" width="100px;" alt="Bruno Borges"/><br /><sub><b>Bruno Borges</b></sub></a><br /><a href="#collections-brunoborges" title="Curated collections of related content">🎁</a> <a href="#instructions-brunoborges" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.movinglive.ca/"><img src="https://avatars.githubusercontent.com/u/14792628?v=4?s=100" width="100px;" alt="Steve Magne"/><br /><sub><b>Steve Magne</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=MovingLive" title="Documentation">📖</a> <a href="#instructions-MovingLive" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://shaneneuville.com/"><img src="https://avatars.githubusercontent.com/u/5375137?v=4?s=100" width="100px;" alt="Shane Neuville"/><br /><sub><b>Shane Neuville</b></sub></a><br /><a href="#agents-PureWeen" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-PureWeen" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/agreaves-ms"><img src="https://avatars.githubusercontent.com/u/111466195?v=4?s=100" width="100px;" alt="Allen Greaves"/><br /><sub><b>Allen Greaves</b></sub></a><br /><a href="#agents-agreaves-ms" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-agreaves-ms" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AmeliaRose802"><img src="https://avatars.githubusercontent.com/u/26167931?v=4?s=100" width="100px;" alt="Amelia Payne"/><br /><sub><b>Amelia Payne</b></sub></a><br /><a href="#agents-AmeliaRose802" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://azureincubations.io/"><img src="https://avatars.githubusercontent.com/u/45323234?v=4?s=100" width="100px;" alt="Brooke Hamilton"/><br /><sub><b>Brooke Hamilton</b></sub></a><br /><a href="#instructions-brooke-hamilton" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/4regab"><img src="https://avatars.githubusercontent.com/u/178603515?v=4?s=100" width="100px;" alt="4regab"/><br /><sub><b>4regab</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=4regab" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TheovanKraay"><img src="https://avatars.githubusercontent.com/u/24420698?v=4?s=100" width="100px;" alt="Theo van Kraay"/><br /><sub><b>Theo van Kraay</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=TheovanKraay" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://glsauto.com/"><img src="https://avatars.githubusercontent.com/u/132710946?v=4?s=100" width="100px;" alt="Troy Witthoeft (glsauto)"/><br /><sub><b>Troy Witthoeft (glsauto)</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=twitthoeft-gls" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/iletai"><img src="https://avatars.githubusercontent.com/u/26614687?v=4?s=100" width="100px;" alt="Tài Lê"/><br /><sub><b>Tài Lê</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=iletai" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://tinyurl.com/3p5j9mwe"><img src="https://avatars.githubusercontent.com/u/9591887?v=4?s=100" width="100px;" alt="Udaya Veeramreddygari"/><br /><sub><b>Udaya Veeramreddygari</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=udayakumarreddyv" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://bio.warengonzaga.com/"><img src="https://avatars.githubusercontent.com/u/15052701?v=4?s=100" width="100px;" alt="Waren Gonzaga"/><br /><sub><b>Waren Gonzaga</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=warengonzaga" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://blog.miniasp.com/"><img src="https://avatars.githubusercontent.com/u/88981?v=4?s=100" width="100px;" alt="Will 保哥"/><br /><sub><b>Will 保哥</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=doggy8088" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeekTrainer"><img src="https://avatars.githubusercontent.com/u/6109729?v=4?s=100" width="100px;" alt="Christopher Harrison"/><br /><sub><b>Christopher Harrison</b></sub></a><br /><a href="#instructions-GeekTrainer" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/breakid"><img src="https://avatars.githubusercontent.com/u/1446918?v=4?s=100" width="100px;" alt="Dan"/><br /><sub><b>Dan</b></sub></a><br /><a href="#instructions-breakid" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://blog.codewithdan.com/"><img src="https://avatars.githubusercontent.com/u/1767249?v=4?s=100" width="100px;" alt="Dan Wahlin"/><br /><sub><b>Dan Wahlin</b></sub></a><br /><a href="#agents-DanWahlin" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://debbie.codes/"><img src="https://avatars.githubusercontent.com/u/13063165?v=4?s=100" width="100px;" alt="Debbie O'Brien"/><br /><sub><b>Debbie O'Brien</b></sub></a><br /><a href="#agents-debs-obrien" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-debs-obrien" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-debs-obrien" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/echarrod"><img src="https://avatars.githubusercontent.com/u/1381991?v=4?s=100" width="100px;" alt="Ed Harrod"/><br /><sub><b>Ed Harrod</b></sub></a><br /><a href="#prompts-echarrod" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://learn.microsoft.com/dotnet"><img src="https://avatars.githubusercontent.com/u/24882762?v=4?s=100" width="100px;" alt="Genevieve Warren"/><br /><sub><b>Genevieve Warren</b></sub></a><br /><a href="#prompts-gewarren" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/guigui42"><img src="https://avatars.githubusercontent.com/u/2376010?v=4?s=100" width="100px;" alt="Guillaume"/><br /><sub><b>Guillaume</b></sub></a><br /><a href="#agents-guigui42" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#prompts-guigui42" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yukiomoto"><img src="https://avatars.githubusercontent.com/u/38450410?v=4?s=100" width="100px;" alt="Yuki Omoto"/><br /><sub><b>Yuki Omoto</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=yukiomoto" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hueanmy"><img src="https://avatars.githubusercontent.com/u/20430626?v=4?s=100" width="100px;" alt="Meii"/><br /><sub><b>Meii</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=hueanmy" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/samqbush"><img src="https://avatars.githubusercontent.com/u/74389839?v=4?s=100" width="100px;" alt="samqbush"/><br /><sub><b>samqbush</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=samqbush" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sdanzo-hrb"><img src="https://avatars.githubusercontent.com/u/136493100?v=4?s=100" width="100px;" alt="sdanzo-hrb"/><br /><sub><b>sdanzo-hrb</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=sdanzo-hrb" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/voidfnc"><img src="https://avatars.githubusercontent.com/u/194750710?v=4?s=100" width="100px;" alt="voidfnc"/><br /><sub><b>voidfnc</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=voidfnc" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/webreidi"><img src="https://avatars.githubusercontent.com/u/55603905?v=4?s=100" width="100px;" alt="Wendy Breiding"/><br /><sub><b>Wendy Breiding</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=webreidi" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zooav"><img src="https://avatars.githubusercontent.com/u/12625412?v=4?s=100" width="100px;" alt="Ankur Sharma"/><br /><sub><b>Ankur Sharma</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=zooav" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://jianminhuang.cc/"><img src="https://avatars.githubusercontent.com/u/6296280?v=4?s=100" width="100px;" alt="黃健旻 Vincent Huang"/><br /><sub><b>黃健旻 Vincent Huang</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=Jian-Min-Huang" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dgh06175"><img src="https://avatars.githubusercontent.com/u/77305722?v=4?s=100" width="100px;" alt="이상현"/><br /><sub><b>이상현</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=dgh06175" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/abdidaudpropel"><img src="https://avatars.githubusercontent.com/u/51310019?v=4?s=100" width="100px;" alt="Abdi Daud"/><br /><sub><b>Abdi Daud</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=abdidaudpropel" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.senseof.tech/"><img src="https://avatars.githubusercontent.com/u/50712277?v=4?s=100" width="100px;" alt="Adrien Clerbois"/><br /><sub><b>Adrien Clerbois</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=AClerbois" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.qreate.it/"><img src="https://avatars.githubusercontent.com/u/1868590?v=4?s=100" width="100px;" alt="Alan Sprecacenere"/><br /><sub><b>Alan Sprecacenere</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=tegola" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://asilva.dev/"><img src="https://avatars.githubusercontent.com/u/2493377?v=4?s=100" width="100px;" alt="André Silva"/><br /><sub><b>André Silva</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=askpt" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://javaetmoi.com/"><img src="https://avatars.githubusercontent.com/u/838318?v=4?s=100" width="100px;" alt="Antoine Rey"/><br /><sub><b>Antoine Rey</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=arey" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/artemsaveliev"><img src="https://avatars.githubusercontent.com/u/15679218?v=4?s=100" width="100px;" alt="Artem Saveliev"/><br /><sub><b>Artem Saveliev</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=artemsaveliev" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://brunoborges.io/"><img src="https://avatars.githubusercontent.com/u/129743?v=4?s=100" width="100px;" alt="Bruno Borges"/><br /><sub><b>Bruno Borges</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=brunoborges" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.peug.net/"><img src="https://avatars.githubusercontent.com/u/3845786?v=4?s=100" width="100px;" alt="Christophe Peugnet"/><br /><sub><b>Christophe Peugnet</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=tossnet" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.movinglive.ca/"><img src="https://avatars.githubusercontent.com/u/14792628?v=4?s=100" width="100px;" alt="Chtive"/><br /><sub><b>Chtive</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=MovingLive" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/craigbekker"><img src="https://avatars.githubusercontent.com/u/1115912?v=4?s=100" width="100px;" alt="Craig Bekker"/><br /><sub><b>Craig Bekker</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=craigbekker" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/breakid"><img src="https://avatars.githubusercontent.com/u/1446918?v=4?s=100" width="100px;" alt="Dan"/><br /><sub><b>Dan</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=breakid" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ewega"><img src="https://avatars.githubusercontent.com/u/26189114?v=4?s=100" width="100px;" alt="Eldrick Wega"/><br /><sub><b>Eldrick Wega</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=ewega" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.felixarjuna.dev/"><img src="https://avatars.githubusercontent.com/u/79026094?v=4?s=100" width="100px;" alt="Felix Arjuna"/><br /><sub><b>Felix Arjuna</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=felixarjuna" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/feapaydin"><img src="https://avatars.githubusercontent.com/u/19946639?v=4?s=100" width="100px;" alt="Furkan Enes"/><br /><sub><b>Furkan Enes</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=feapaydin" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://learn.microsoft.com/dotnet"><img src="https://avatars.githubusercontent.com/u/24882762?v=4?s=100" width="100px;" alt="Genevieve Warren"/><br /><sub><b>Genevieve Warren</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=gewarren" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geoder101"><img src="https://avatars.githubusercontent.com/u/145904?v=4?s=100" width="100px;" alt="George Dernikos"/><br /><sub><b>George Dernikos</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=geoder101" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/giomartinsdev"><img src="https://avatars.githubusercontent.com/u/125399281?v=4?s=100" width="100px;" alt="Giovanni de Almeida Martins"/><br /><sub><b>Giovanni de Almeida Martins</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=giomartinsdev" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ioana37"><img src="https://avatars.githubusercontent.com/u/69301842?v=4?s=100" width="100px;" alt="Ioana A"/><br /><sub><b>Ioana A</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=Ioana37" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nohwnd"><img src="https://avatars.githubusercontent.com/u/5735905?v=4?s=100" width="100px;" alt="Jakub Jareš"/><br /><sub><b>Jakub Jareš</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=nohwnd" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://joe-watkins.io/"><img src="https://avatars.githubusercontent.com/u/3695795?v=4?s=100" width="100px;" alt="Joe Watkins"/><br /><sub><b>Joe Watkins</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=joe-watkins" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://johnpapa.net/"><img src="https://avatars.githubusercontent.com/u/1202528?v=4?s=100" width="100px;" alt="John Papa"/><br /><sub><b>John Papa</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=johnpapa" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.sugbo4j.co.nz/"><img src="https://avatars.githubusercontent.com/u/15100839?v=4?s=100" width="100px;" alt="Joseph Gonzales"/><br /><sub><b>Joseph Gonzales</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=josephgonzales01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://digio.es/"><img src="https://avatars.githubusercontent.com/u/173672918?v=4?s=100" width="100px;" alt="José Antonio Garrido"/><br /><sub><b>José Antonio Garrido</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=josegarridodigio" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ranrar"><img src="https://avatars.githubusercontent.com/u/95967772?v=4?s=100" width="100px;" alt="Kim Skov Rasmussen"/><br /><sub><b>Kim Skov Rasmussen</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=Ranrar" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/whiteken"><img src="https://avatars.githubusercontent.com/u/20211937?v=4?s=100" width="100px;" alt="Kenny White"/><br /><sub><b>Kenny White</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=whiteken" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LouellaCreemers"><img src="https://avatars.githubusercontent.com/u/46204894?v=4?s=100" width="100px;" alt="Louella Creemers"/><br /><sub><b>Louella Creemers</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=LouellaCreemers" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://linktr.ee/lukemurray"><img src="https://avatars.githubusercontent.com/u/24467442?v=4?s=100" width="100px;" alt="Luke Murray"/><br /><sub><b>Luke Murray</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=lukemurraynz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://marknoble.com/"><img src="https://avatars.githubusercontent.com/u/3819700?v=4?s=100" width="100px;" alt="Mark Noble"/><br /><sub><b>Mark Noble</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=marknoble" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://soderlind.no"><img src="https://avatars.githubusercontent.com/u/1649452?v=4?s=100" width="100px;" alt="Per Søderlind"/><br /><sub><b>Per Søderlind</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=soderlind" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/riqueufmg"><img src="https://avatars.githubusercontent.com/u/108551585?v=4?s=100" width="100px;" alt="Henrique Nunes"/><br /><sub><b>Henrique Nunes</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=riqueufmg" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/riqueufmg"><img src="https://avatars.githubusercontent.com/u/108551585?v=4?s=100" width="100px;" alt="Henrique Nunes"/><br /><sub><b>Henrique Nunes</b></sub></a><br /><a href="#prompts-riqueufmg" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jeremiah-snee-openx"><img src="https://avatars.githubusercontent.com/u/113928685?v=4?s=100" width="100px;" alt="Jeremiah Snee"/><br /><sub><b>Jeremiah Snee</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=jeremiah-snee-openx" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/spectatora"><img src="https://avatars.githubusercontent.com/u/1385755?v=4?s=100" width="100px;" alt="spectatora"/><br /><sub><b>spectatora</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=spectatora" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mike-Hanna"><img src="https://avatars.githubusercontent.com/u/50142889?v=4?s=100" width="100px;" alt="Michael"/><br /><sub><b>Michael</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=Mike-Hanna" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kartikdhiman"><img src="https://avatars.githubusercontent.com/u/59189590?v=4?s=100" width="100px;" alt="Kartik Dhiman"/><br /><sub><b>Kartik Dhiman</b></sub></a><br /><a href="#instructions-kartikdhiman" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://kristiyanvelkov.com/"><img src="https://avatars.githubusercontent.com/u/40764277?v=4?s=100" width="100px;" alt="Kristiyan Velkov"/><br /><sub><b>Kristiyan Velkov</b></sub></a><br /><a href="#agents-kristiyan-velkov" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://markdav.is/"><img src="https://avatars.githubusercontent.com/u/311063?v=4?s=100" width="100px;" alt="Mark Davis"/><br /><sub><b>Mark Davis</b></sub></a><br /><a href="#instructions-markdav-is" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pelikhan"><img src="https://avatars.githubusercontent.com/u/4175913?v=4?s=100" width="100px;" alt="Peli de Halleux"/><br /><sub><b>Peli de Halleux</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=pelikhan" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://soderlind.no/"><img src="https://avatars.githubusercontent.com/u/1649452?v=4?s=100" width="100px;" alt="Per Søderlind"/><br /><sub><b>Per Søderlind</b></sub></a><br /><a href="#instructions-soderlind" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lechnerc77"><img src="https://avatars.githubusercontent.com/u/22294087?v=4?s=100" width="100px;" alt="Christian Lechner"/><br /><sub><b>Christian Lechner</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=lechnerc77" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://jan-v.nl"><img src="https://avatars.githubusercontent.com/u/462356?v=4?s=100" width="100px;" alt="Jan de Vries"/><br /><sub><b>Jan de Vries</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=Jandev" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://dotneteers.net/"><img src="https://avatars.githubusercontent.com/u/28162552?v=4?s=100" width="100px;" alt="Peter Smulovics"/><br /><sub><b>Peter Smulovics</b></sub></a><br /><a href="#instructions-psmulovics" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/madvimer"><img src="https://avatars.githubusercontent.com/u/3188898?v=4?s=100" width="100px;" alt="Ravish Rathod"/><br /><sub><b>Ravish Rathod</b></sub></a><br /><a href="#instructions-madvimer" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://ricksm.it/"><img src="https://avatars.githubusercontent.com/u/7207783?v=4?s=100" width="100px;" alt="Rick Smit"/><br /><sub><b>Rick Smit</b></sub></a><br /><a href="#agents-ricksmit3000" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pertrai1"><img src="https://avatars.githubusercontent.com/u/442374?v=4?s=100" width="100px;" alt="Rob Simpson"/><br /><sub><b>Rob Simpson</b></sub></a><br /><a href="#instructions-pertrai1" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/inquinity"><img src="https://avatars.githubusercontent.com/u/406234?v=4?s=100" width="100px;" alt="Robert Altman"/><br /><sub><b>Robert Altman</b></sub></a><br /><a href="#instructions-inquinity" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://salih.guru/"><img src="https://avatars.githubusercontent.com/u/76786120?v=4?s=100" width="100px;" alt="Salih"/><br /><sub><b>Salih</b></sub></a><br /><a href="#instructions-salihguru" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://graef.io/"><img src="https://avatars.githubusercontent.com/u/19261257?v=4?s=100" width="100px;" alt="Sebastian Gräf"/><br /><sub><b>Sebastian Gräf</b></sub></a><br /><a href="#agents-segraef" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-segraef" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SebastienDegodez"><img src="https://avatars.githubusercontent.com/u/2349146?v=4?s=100" width="100px;" alt="Sebastien DEGODEZ"/><br /><sub><b>Sebastien DEGODEZ</b></sub></a><br /><a href="#instructions-SebastienDegodez" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sesmyrnov"><img src="https://avatars.githubusercontent.com/u/59627981?v=4?s=100" width="100px;" alt="Sergiy Smyrnov"/><br /><sub><b>Sergiy Smyrnov</b></sub></a><br /><a href="#prompts-sesmyrnov" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SomeSolutionsArchitect"><img src="https://avatars.githubusercontent.com/u/139817767?v=4?s=100" width="100px;" alt="SomeSolutionsArchitect"/><br /><sub><b>SomeSolutionsArchitect</b></sub></a><br /><a href="#agents-SomeSolutionsArchitect" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kewalaka"><img src="https://avatars.githubusercontent.com/u/3146590?v=4?s=100" width="100px;" alt="Stu Mace"/><br /><sub><b>Stu Mace</b></sub></a><br /><a href="#agents-kewalaka" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#collections-kewalaka" title="Curated collections of related content">🎁</a> <a href="#instructions-kewalaka" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dgh06175"><img src="https://avatars.githubusercontent.com/u/77305722?v=4?s=100" width="100px;" alt="이상현"/><br /><sub><b>이상현</b></sub></a><br /><a href="#instructions-dgh06175" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.paulomorgado.net/"><img src="https://avatars.githubusercontent.com/u/470455?v=4?s=100" width="100px;" alt="Paulo Morgado"/><br /><sub><b>Paulo Morgado</b></sub></a><br /><a href="#prompts-paulomorgado" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://paul.crane.net.nz/"><img src="https://avatars.githubusercontent.com/u/808676?v=4?s=100" width="100px;" alt="Paul Crane"/><br /><sub><b>Paul Crane</b></sub></a><br /><a href="#agents-pcrane" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.pamelafox.org/"><img src="https://avatars.githubusercontent.com/u/297042?v=4?s=100" width="100px;" alt="Pamela Fox"/><br /><sub><b>Pamela Fox</b></sub></a><br /><a href="#prompts-pamelafox" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://oskarthornblad.se/"><img src="https://avatars.githubusercontent.com/u/640102?v=4?s=100" width="100px;" alt="Oskar Thornblad"/><br /><sub><b>Oskar Thornblad</b></sub></a><br /><a href="#instructions-prewk" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nischays"><img src="https://avatars.githubusercontent.com/u/54121853?v=4?s=100" width="100px;" alt="Nischay Sharma"/><br /><sub><b>Nischay Sharma</b></sub></a><br /><a href="#agents-nischays" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Naikabg"><img src="https://avatars.githubusercontent.com/u/19915620?v=4?s=100" width="100px;" alt="Nikolay Marinov"/><br /><sub><b>Nikolay Marinov</b></sub></a><br /><a href="#agents-Naikabg" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/niksac"><img src="https://avatars.githubusercontent.com/u/20246918?v=4?s=100" width="100px;" alt="Nik Sachdeva"/><br /><sub><b>Nik Sachdeva</b></sub></a><br /><a href="#agents-niksacdev" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#collections-niksacdev" title="Curated collections of related content">🎁</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://onetipaweek.com/"><img src="https://avatars.githubusercontent.com/u/833231?v=4?s=100" width="100px;" alt="Nick Taylor"/><br /><sub><b>Nick Taylor</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=nickytonline" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://nicholasdbrady.github.io/cookbook/"><img src="https://avatars.githubusercontent.com/u/18353756?v=4?s=100" width="100px;" alt="Nick Brady"/><br /><sub><b>Nick Brady</b></sub></a><br /><a href="#agents-nicholasdbrady" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nastanford"><img src="https://avatars.githubusercontent.com/u/1755947?v=4?s=100" width="100px;" alt="Nathan Stanford Sr"/><br /><sub><b>Nathan Stanford Sr</b></sub></a><br /><a href="#instructions-nastanford" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/matebarabas"><img src="https://avatars.githubusercontent.com/u/22733424?v=4?s=100" width="100px;" alt="Máté Barabás"/><br /><sub><b>Máté Barabás</b></sub></a><br /><a href="#instructions-matebarabas" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mikeparker104"><img src="https://avatars.githubusercontent.com/u/12763221?v=4?s=100" width="100px;" alt="Mike Parker"/><br /><sub><b>Mike Parker</b></sub></a><br /><a href="#instructions-mikeparker104" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mikekistler"><img src="https://avatars.githubusercontent.com/u/85643503?v=4?s=100" width="100px;" alt="Mike Kistler"/><br /><sub><b>Mike Kistler</b></sub></a><br /><a href="#prompts-mikekistler" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://a11ysupport.io/"><img src="https://avatars.githubusercontent.com/u/498678?v=4?s=100" width="100px;" alt="Michael Fairchild"/><br /><sub><b>Michael Fairchild</b></sub></a><br /><a href="#instructions-mfairchild365" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zooav"><img src="https://avatars.githubusercontent.com/u/12625412?v=4?s=100" width="100px;" alt="Ankur Sharma"/><br /><sub><b>Ankur Sharma</b></sub></a><br /><a href="#prompts-zooav" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/webreidi"><img src="https://avatars.githubusercontent.com/u/55603905?v=4?s=100" width="100px;" alt="Wendy Breiding"/><br /><sub><b>Wendy Breiding</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=webreidi" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/voidfnc"><img src="https://avatars.githubusercontent.com/u/194750710?v=4?s=100" width="100px;" alt="voidfnc"/><br /><sub><b>voidfnc</b></sub></a><br /><a href="#agents-voidfnc" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://about.me/shane-lee"><img src="https://avatars.githubusercontent.com/u/5466825?v=4?s=100" width="100px;" alt="shane lee"/><br /><sub><b>shane lee</b></sub></a><br /><a href="#instructions-shavo007" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sdanzo-hrb"><img src="https://avatars.githubusercontent.com/u/136493100?v=4?s=100" width="100px;" alt="sdanzo-hrb"/><br /><sub><b>sdanzo-hrb</b></sub></a><br /><a href="#agents-sdanzo-hrb" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nativebpm"><img src="https://avatars.githubusercontent.com/u/33398121?v=4?s=100" width="100px;" alt="sauran"/><br /><sub><b>sauran</b></sub></a><br /><a href="#instructions-isauran" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/samqbush"><img src="https://avatars.githubusercontent.com/u/74389839?v=4?s=100" width="100px;" alt="samqbush"/><br /><sub><b>samqbush</b></sub></a><br /><a href="#prompts-samqbush" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pareenaverma"><img src="https://avatars.githubusercontent.com/u/59843121?v=4?s=100" width="100px;" alt="pareenaverma"/><br /><sub><b>pareenaverma</b></sub></a><br /><a href="#agents-pareenaverma" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/oleksiyyurchyna"><img src="https://avatars.githubusercontent.com/u/10256765?v=4?s=100" width="100px;" alt="oleksiyyurchyna"/><br /><sub><b>oleksiyyurchyna</b></sub></a><br /><a href="#collections-oleksiyyurchyna" title="Curated collections of related content">🎁</a> <a href="#prompts-oleksiyyurchyna" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/time-by-waves"><img src="https://avatars.githubusercontent.com/u/34587654?v=4?s=100" width="100px;" alt="oceans-of-time"/><br /><sub><b>oceans-of-time</b></sub></a><br /><a href="#instructions-time-by-waves" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kshashank57"><img src="https://avatars.githubusercontent.com/u/57212456?v=4?s=100" width="100px;" alt="kshashank57"/><br /><sub><b>kshashank57</b></sub></a><br /><a href="#agents-kshashank57" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#instructions-kshashank57" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hueanmy"><img src="https://avatars.githubusercontent.com/u/20430626?v=4?s=100" width="100px;" alt="Meii"/><br /><sub><b>Meii</b></sub></a><br /><a href="#agents-hueanmy" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/factory-davidgu"><img src="https://avatars.githubusercontent.com/u/229352262?v=4?s=100" width="100px;" alt="factory-davidgu"/><br /><sub><b>factory-davidgu</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=factory-davidgu" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dangelov-qa"><img src="https://avatars.githubusercontent.com/u/92313553?v=4?s=100" width="100px;" alt="dangelov-qa"/><br /><sub><b>dangelov-qa</b></sub></a><br /><a href="#agents-dangelov-qa" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yukiomoto"><img src="https://avatars.githubusercontent.com/u/38450410?v=4?s=100" width="100px;" alt="Yuki Omoto"/><br /><sub><b>Yuki Omoto</b></sub></a><br /><a href="#instructions-yukiomoto" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wschultz-boxboat"><img src="https://avatars.githubusercontent.com/u/110492948?v=4?s=100" width="100px;" alt="Will Schultz"/><br /><sub><b>Will Schultz</b></sub></a><br /><a href="#agents-wschultz-boxboat" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://bio.warengonzaga.com/"><img src="https://avatars.githubusercontent.com/u/15052701?v=4?s=100" width="100px;" alt="Waren Gonzaga"/><br /><sub><b>Waren Gonzaga</b></sub></a><br /><a href="#agents-warengonzaga" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://linktr.ee/vincentkoc"><img src="https://avatars.githubusercontent.com/u/25068?v=4?s=100" width="100px;" alt="Vincent Koc"/><br /><sub><b>Vincent Koc</b></sub></a><br /><a href="#agents-vincentkoc" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Vaporjawn"><img src="https://avatars.githubusercontent.com/u/15694665?v=4?s=100" width="100px;" alt="Victor Williams"/><br /><sub><b>Victor Williams</b></sub></a><br /><a href="#agents-Vaporjawn" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://vesharma.dev/"><img src="https://avatars.githubusercontent.com/u/62218708?v=4?s=100" width="100px;" alt="Ve Sharma"/><br /><sub><b>Ve Sharma</b></sub></a><br /><a href="#agents-VeVarunSharma" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://tinyurl.com/3p5j9mwe"><img src="https://avatars.githubusercontent.com/u/9591887?v=4?s=100" width="100px;" alt="Udaya Veeramreddygari"/><br /><sub><b>Udaya Veeramreddygari</b></sub></a><br /><a href="#instructions-udayakumarreddyv" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/iletai"><img src="https://avatars.githubusercontent.com/u/26614687?v=4?s=100" width="100px;" alt="Tài Lê"/><br /><sub><b>Tài Lê</b></sub></a><br /><a href="#prompts-iletai" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://glsauto.com/"><img src="https://avatars.githubusercontent.com/u/132710946?v=4?s=100" width="100px;" alt="Troy Witthoeft (glsauto)"/><br /><sub><b>Troy Witthoeft (glsauto)</b></sub></a><br /><a href="#instructions-twitthoeft-gls" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tmeschter"><img src="https://avatars.githubusercontent.com/u/10506730?v=4?s=100" width="100px;" alt="Tom Meschter"/><br /><sub><b>Tom Meschter</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=tmeschter" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://enakdesign.com/"><img src="https://avatars.githubusercontent.com/u/14024037?v=4?s=100" width="100px;" alt="Tj Vita"/><br /><sub><b>Tj Vita</b></sub></a><br /><a href="#agents-semperteneo" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/STRUDSO"><img src="https://avatars.githubusercontent.com/u/1543732?v=4?s=100" width="100px;" alt="Søren Trudsø Mahon"/><br /><sub><b>Søren Trudsø Mahon</b></sub></a><br /><a href="#instructions-STRUDSO" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geoder101"><img src="https://avatars.githubusercontent.com/u/145904?v=4?s=100" width="100px;" alt="George Dernikos"/><br /><sub><b>George Dernikos</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=geoder101" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gautambaghel"><img src="https://avatars.githubusercontent.com/u/22324290?v=4?s=100" width="100px;" alt="Gautam"/><br /><sub><b>Gautam</b></sub></a><br /><a href="#agents-gautambaghel" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/feapaydin"><img src="https://avatars.githubusercontent.com/u/19946639?v=4?s=100" width="100px;" alt="Furkan Enes"/><br /><sub><b>Furkan Enes</b></sub></a><br /><a href="#instructions-feapaydin" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fmuecke"><img src="https://avatars.githubusercontent.com/u/7921024?v=4?s=100" width="100px;" alt="Florian Mücke"/><br /><sub><b>Florian Mücke</b></sub></a><br /><a href="#agents-fmuecke" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.felixarjuna.dev/"><img src="https://avatars.githubusercontent.com/u/79026094?v=4?s=100" width="100px;" alt="Felix Arjuna"/><br /><sub><b>Felix Arjuna</b></sub></a><br /><a href="#instructions-felixarjuna" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ewega"><img src="https://avatars.githubusercontent.com/u/26189114?v=4?s=100" width="100px;" alt="Eldrick Wega"/><br /><sub><b>Eldrick Wega</b></sub></a><br /><a href="#prompts-ewega" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/danchev"><img src="https://avatars.githubusercontent.com/u/12420863?v=4?s=100" width="100px;" alt="Dobri Danchev"/><br /><sub><b>Dobri Danchev</b></sub></a><br /><a href="#prompts-danchev" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://dgamboa.com/"><img src="https://avatars.githubusercontent.com/u/7052267?v=4?s=100" width="100px;" alt="Diego Gamboa"/><br /><sub><b>Diego Gamboa</b></sub></a><br /><a href="#prompts-difegam" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/derekclair"><img src="https://avatars.githubusercontent.com/u/5247629?v=4?s=100" width="100px;" alt="Derek Clair"/><br /><sub><b>Derek Clair</b></sub></a><br /><a href="#agents-derekclair" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#prompts-derekclair" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://dev.to/davidortinau"><img src="https://avatars.githubusercontent.com/u/41873?v=4?s=100" width="100px;" alt="David Ortinau"/><br /><sub><b>David Ortinau</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=davidortinau" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/danielabbatt"><img src="https://avatars.githubusercontent.com/u/8926756?v=4?s=100" width="100px;" alt="Daniel Abbatt"/><br /><sub><b>Daniel Abbatt</b></sub></a><br /><a href="#instructions-danielabbatt" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CypherHK"><img src="https://avatars.githubusercontent.com/u/230935834?v=4?s=100" width="100px;" alt="CypherHK"/><br /><sub><b>CypherHK</b></sub></a><br /><a href="#agents-CypherHK" title="Specialized agents for GitHub Copilot">🎭</a> <a href="#prompts-CypherHK" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/craigbekker"><img src="https://avatars.githubusercontent.com/u/1115912?v=4?s=100" width="100px;" alt="Craig Bekker"/><br /><sub><b>Craig Bekker</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=craigbekker" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.peug.net/"><img src="https://avatars.githubusercontent.com/u/3845786?v=4?s=100" width="100px;" alt="Christophe Peugnet"/><br /><sub><b>Christophe Peugnet</b></sub></a><br /><a href="#instructions-tossnet" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lechnerc77"><img src="https://avatars.githubusercontent.com/u/22294087?v=4?s=100" width="100px;" alt="Christian Lechner"/><br /><sub><b>Christian Lechner</b></sub></a><br /><a href="#instructions-lechnerc77" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/charris-msft"><img src="https://avatars.githubusercontent.com/u/74415662?v=4?s=100" width="100px;" alt="Chris Harris"/><br /><sub><b>Chris Harris</b></sub></a><br /><a href="#agents-charris-msft" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BBoyBen"><img src="https://avatars.githubusercontent.com/u/34445365?v=4?s=100" width="100px;" alt="BBoyBen"/><br /><sub><b>BBoyBen</b></sub></a><br /><a href="#instructions-BBoyBen" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/artemsaveliev"><img src="https://avatars.githubusercontent.com/u/15679218?v=4?s=100" width="100px;" alt="Artem Saveliev"/><br /><sub><b>Artem Saveliev</b></sub></a><br /><a href="#instructions-artemsaveliev" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://javaetmoi.com/"><img src="https://avatars.githubusercontent.com/u/838318?v=4?s=100" width="100px;" alt="Antoine Rey"/><br /><sub><b>Antoine Rey</b></sub></a><br /><a href="#prompts-arey" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/PiKa919"><img src="https://avatars.githubusercontent.com/u/96786190?v=4?s=100" width="100px;" alt="Ankit Das"/><br /><sub><b>Ankit Das</b></sub></a><br /><a href="#instructions-PiKa919" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/alineavila"><img src="https://avatars.githubusercontent.com/u/24813256?v=4?s=100" width="100px;" alt="Aline Ávila"/><br /><sub><b>Aline Ávila</b></sub></a><br /><a href="#instructions-alineavila" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/martin-cod"><img src="https://avatars.githubusercontent.com/u/33550246?v=4?s=100" width="100px;" alt="Alexander Martinkevich"/><br /><sub><b>Alexander Martinkevich</b></sub></a><br /><a href="#agents-martin-cod" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aldunchev"><img src="https://avatars.githubusercontent.com/u/4631021?v=4?s=100" width="100px;" alt="Aleksandar Dunchev"/><br /><sub><b>Aleksandar Dunchev</b></sub></a><br /><a href="#agents-aldunchev" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.qreate.it/"><img src="https://avatars.githubusercontent.com/u/1868590?v=4?s=100" width="100px;" alt="Alan Sprecacenere"/><br /><sub><b>Alan Sprecacenere</b></sub></a><br /><a href="#instructions-tegola" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/akashxlr8"><img src="https://avatars.githubusercontent.com/u/58072860?v=4?s=100" width="100px;" alt="Akash Kumar Shaw"/><br /><sub><b>Akash Kumar Shaw</b></sub></a><br /><a href="#instructions-akashxlr8" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/abdidaudpropel"><img src="https://avatars.githubusercontent.com/u/51310019?v=4?s=100" width="100px;" alt="Abdi Daud"/><br /><sub><b>Abdi Daud</b></sub></a><br /><a href="#agents-abdidaudpropel" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/4regab"><img src="https://avatars.githubusercontent.com/u/178603515?v=4?s=100" width="100px;" alt="4regab"/><br /><sub><b>4regab</b></sub></a><br /><a href="#instructions-4regab" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/michael-volz/"><img src="https://avatars.githubusercontent.com/u/129928?v=4?s=100" width="100px;" alt="Michael A. Volz (Flynn)"/><br /><sub><b>Michael A. Volz (Flynn)</b></sub></a><br /><a href="#prompts-michaelvolz" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mike-Hanna"><img src="https://avatars.githubusercontent.com/u/50142889?v=4?s=100" width="100px;" alt="Michael"/><br /><sub><b>Michael</b></sub></a><br /><a href="#instructions-Mike-Hanna" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.mehmetalierol.com/"><img src="https://avatars.githubusercontent.com/u/16721723?v=4?s=100" width="100px;" alt="Mehmet Ali EROL"/><br /><sub><b>Mehmet Ali EROL</b></sub></a><br /><a href="#agents-mehmetalierol" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://maxprilutskiy.com/"><img src="https://avatars.githubusercontent.com/u/5614659?v=4?s=100" width="100px;" alt="Max Prilutskiy"/><br /><sub><b>Max Prilutskiy</b></sub></a><br /><a href="#agents-maxprilutskiy" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mbianchidev"><img src="https://avatars.githubusercontent.com/u/37507190?v=4?s=100" width="100px;" alt="Matteo Bianchi"/><br /><sub><b>Matteo Bianchi</b></sub></a><br /><a href="#agents-mbianchidev" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://codemilltech.com/"><img src="https://avatars.githubusercontent.com/u/2053639?v=4?s=100" width="100px;" alt="Matt Soucoup"/><br /><sub><b>Matt Soucoup</b></sub></a><br /><a href="#infra-codemillmatt" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://marknoble.com/"><img src="https://avatars.githubusercontent.com/u/3819700?v=4?s=100" width="100px;" alt="Mark Noble"/><br /><sub><b>Mark Noble</b></sub></a><br /><a href="#agents-marknoble" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ManishJayaswal"><img src="https://avatars.githubusercontent.com/u/9527491?v=4?s=100" width="100px;" alt="Manish Jayaswal"/><br /><sub><b>Manish Jayaswal</b></sub></a><br /><a href="#agents-ManishJayaswal" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://linktr.ee/lukemurray"><img src="https://avatars.githubusercontent.com/u/24467442?v=4?s=100" width="100px;" alt="Luke Murray"/><br /><sub><b>Luke Murray</b></sub></a><br /><a href="#agents-lukemurraynz" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LouellaCreemers"><img src="https://avatars.githubusercontent.com/u/46204894?v=4?s=100" width="100px;" alt="Louella Creemers"/><br /><sub><b>Louella Creemers</b></sub></a><br /><a href="#instructions-LouellaCreemers" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/whiteken"><img src="https://avatars.githubusercontent.com/u/20211937?v=4?s=100" width="100px;" alt="Kenny White"/><br /><sub><b>Kenny White</b></sub></a><br /><a href="#instructions-whiteken" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KaloyanGenev"><img src="https://avatars.githubusercontent.com/u/42644424?v=4?s=100" width="100px;" alt="KaloyanGenev"/><br /><sub><b>KaloyanGenev</b></sub></a><br /><a href="#agents-KaloyanGenev" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ranrar"><img src="https://avatars.githubusercontent.com/u/95967772?v=4?s=100" width="100px;" alt="Kim Skov Rasmussen"/><br /><sub><b>Kim Skov Rasmussen</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=Ranrar" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.julien-dubois.com/"><img src="https://avatars.githubusercontent.com/u/316835?v=4?s=100" width="100px;" alt="Julien Dubois"/><br /><sub><b>Julien Dubois</b></sub></a><br /><a href="#prompts-jdubois" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://digio.es/"><img src="https://avatars.githubusercontent.com/u/173672918?v=4?s=100" width="100px;" alt="José Antonio Garrido"/><br /><sub><b>José Antonio Garrido</b></sub></a><br /><a href="#instructions-josegarridodigio" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.sugbo4j.co.nz/"><img src="https://avatars.githubusercontent.com/u/15100839?v=4?s=100" width="100px;" alt="Joseph Gonzales"/><br /><sub><b>Joseph Gonzales</b></sub></a><br /><a href="#instructions-josephgonzales01" title="Custom instructions for GitHub Copilot">🧭</a> <a href="#prompts-josephgonzales01" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yortch"><img src="https://avatars.githubusercontent.com/u/4576246?v=4?s=100" width="100px;" alt="Jorge Balderas"/><br /><sub><b>Jorge Balderas</b></sub></a><br /><a href="#instructions-yortch" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://johnpapa.net/"><img src="https://avatars.githubusercontent.com/u/1202528?v=4?s=100" width="100px;" alt="John Papa"/><br /><sub><b>John Papa</b></sub></a><br /><a href="https://github.com/github/awesome-copilot/commits?author=johnpapa" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.johnlokerse.dev/"><img src="https://avatars.githubusercontent.com/u/3514513?v=4?s=100" width="100px;" alt="John"/><br /><sub><b>John</b></sub></a><br /><a href="#agents-johnlokerse" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://joe-watkins.io/"><img src="https://avatars.githubusercontent.com/u/3695795?v=4?s=100" width="100px;" alt="Joe Watkins"/><br /><sub><b>Joe Watkins</b></sub></a><br /><a href="#instructions-joe-watkins" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://jan-v.nl/"><img src="https://avatars.githubusercontent.com/u/462356?v=4?s=100" width="100px;" alt="Jan de Vries"/><br /><sub><b>Jan de Vries</b></sub></a><br /><a href="#agents-Jandev" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nohwnd"><img src="https://avatars.githubusercontent.com/u/5735905?v=4?s=100" width="100px;" alt="Jakub Jareš"/><br /><sub><b>Jakub Jareš</b></sub></a><br /><a href="#prompts-nohwnd" title="Reusable prompts for GitHub Copilot">⌨️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jaxn"><img src="https://avatars.githubusercontent.com/u/29095?v=4?s=100" width="100px;" alt="Jackson Miller"/><br /><sub><b>Jackson Miller</b></sub></a><br /><a href="#instructions-jaxn" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ioana37"><img src="https://avatars.githubusercontent.com/u/69301842?v=4?s=100" width="100px;" alt="Ioana A"/><br /><sub><b>Ioana A</b></sub></a><br /><a href="#instructions-Ioana37" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hashimwarren"><img src="https://avatars.githubusercontent.com/u/6027587?v=4?s=100" width="100px;" alt="Hashim Warren"/><br /><sub><b>Hashim Warren</b></sub></a><br /><a href="#agents-hashimwarren" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://hachyderm.io/@0gis0"><img src="https://avatars.githubusercontent.com/u/175379?v=4?s=100" width="100px;" alt="Gisela Torres"/><br /><sub><b>Gisela Torres</b></sub></a><br /><a href="#agents-0GiS0" title="Specialized agents for GitHub Copilot">🎭</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/giomartinsdev"><img src="https://avatars.githubusercontent.com/u/125399281?v=4?s=100" width="100px;" alt="Giovanni de Almeida Martins"/><br /><sub><b>Giovanni de Almeida Martins</b></sub></a><br /><a href="#instructions-giomartinsdev" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://jfversluis.dev/"><img src="https://avatars.githubusercontent.com/u/939291?v=4?s=100" width="100px;" alt="Gerald Versluis"/><br /><sub><b>Gerald Versluis</b></sub></a><br /><a href="#instructions-jfversluis" title="Custom instructions for GitHub Copilot">🧭</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
36
eng/README.md
Normal file
36
eng/README.md
Normal file
@@ -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.
|
||||
306
eng/add-missing-contributors.mjs
Normal file
306
eng/add-missing-contributors.mjs
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
597
eng/contributor-report.mjs
Normal file
597
eng/contributor-report.mjs
Normal file
@@ -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<object>} 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<object>} 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<object>} 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();
|
||||
}
|
||||
60
eng/utils/graceful-shutdown.mjs
Normal file
60
eng/utils/graceful-shutdown.mjs
Normal file
@@ -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);
|
||||
};
|
||||
};
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user