From 7ae4e61cf3afe1179d5ca0592c4cfbb34d596526 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 20:06:45 +0000 Subject: [PATCH 01/21] build(deps): bump DavidAnson/markdownlint-cli2-action Bumps [DavidAnson/markdownlint-cli2-action](https://github.com/davidanson/markdownlint-cli2-action) from 18.0.0 to 19.1.0. - [Release notes](https://github.com/davidanson/markdownlint-cli2-action/releases) - [Commits](https://github.com/davidanson/markdownlint-cli2-action/compare/eb5ca3ab411449c66620fe7f1b3c9e10547144b0...05f32210e84442804257b2a6f20b273450ec8265) --- updated-dependencies: - dependency-name: DavidAnson/markdownlint-cli2-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/lint-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint-docs.yml b/.github/workflows/lint-docs.yml index 5f60867eb..2f4105d67 100644 --- a/.github/workflows/lint-docs.yml +++ b/.github/workflows/lint-docs.yml @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: DavidAnson/markdownlint-cli2-action@eb5ca3ab411449c66620fe7f1b3c9e10547144b0 + - uses: DavidAnson/markdownlint-cli2-action@05f32210e84442804257b2a6f20b273450ec8265 with: globs: | "**/*.md" From 234e278c5b57a52c079f87013d65f4c6311f49c0 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 26 Jul 2025 00:38:51 -0400 Subject: [PATCH 02/21] Create dotnet.yml --- .github/workflows/dotnet.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/dotnet.yml diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml new file mode 100644 index 000000000..217f7cbec --- /dev/null +++ b/.github/workflows/dotnet.yml @@ -0,0 +1,28 @@ +# This workflow will build a .NET project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net + +name: .NET + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build --no-restore + - name: Test + run: dotnet test --no-build --verbosity normal From 9d8c8a46a1a4f0a33e85c3b7dbdc7a39b02f1305 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 26 Jul 2025 21:04:01 -0400 Subject: [PATCH 03/21] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c6aa1535..498d10d92 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -# Git Credential Manager +![Sponsors](https://img.shields.io/github/sponsors/alexandros-thomson?style=for-the-badge) +![Stars](https://img.shields.io/github/stars/alexandros-thomson/alexandros-thomson?style=for-the-badge) +![Watchers](https://img.shields.io/github/watchers/alexandros-thomson/alexandros-thomson?style=for-the-badge) +![Contributions](https://github-readme-stats.vercel.app/api?username=alexandros-thomson&show_icons=true&theme=radical)## Git Credential Manager [![Build Status][build-status-badge]][workflow-status] From edcac731f73ee5f00f8942cd427f4d6b06e4efa7 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sun, 27 Jul 2025 00:25:36 -0400 Subject: [PATCH 04/21] Create src/ipn-handler.ts --- src/src/ipn-handler.ts | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/src/ipn-handler.ts diff --git a/src/src/ipn-handler.ts b/src/src/ipn-handler.ts new file mode 100644 index 000000000..919ef7c59 --- /dev/null +++ b/src/src/ipn-handler.ts @@ -0,0 +1,46 @@ +# .github/workflows/deploy-ipn.yml +name: Build & Deploy IPN Handler + +on: + push: + paths: + - "src/ipn-handler.ts" + - "src/mappings/**" + - "deno.json" + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup Deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + + - name: Cache deps + uses: actions/cache@v3 + with: + path: ~/.cache/deno + key: ${{ runner.os }}-deno-${{ hashFiles('**/*.ts') }} + + - name: Lint & Test + run: | + deno fmt --check + deno lint + deno test --allow-net --allow-env + + deploy: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup Deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + + - name: Deploy to Deno Deploy + run: deno deploy --project=peludo-ipn --token=${{ secrets.DENO_DEPLOY_TOKEN }} src/ipn-handler.ts \ No newline at end of file From 4ee995b7d09dfaee74f12c3975e80d48fd765e7e Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sun, 27 Jul 2025 00:35:06 -0400 Subject: [PATCH 05/21] Update validate-install-from-source.yml --- .../validate-install-from-source.yml | 72 +++++++------------ 1 file changed, 25 insertions(+), 47 deletions(-) diff --git a/.github/workflows/validate-install-from-source.yml b/.github/workflows/validate-install-from-source.yml index 2b1fd7696..45e9e50e7 100644 --- a/.github/workflows/validate-install-from-source.yml +++ b/.github/workflows/validate-install-from-source.yml @@ -1,48 +1,26 @@ -name: validate-install-from-source - -on: - workflow_dispatch: - push: - branches: - - main - jobs: - docker: - name: ${{matrix.vector.image}} - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - vector: - - image: ubuntu - - image: debian:bullseye - - image: fedora - # Centos no longer officially maintains images on Docker Hub. However, - # tgagor is a contributor who pushes updated images weekly, which should - # be sufficient for our validation needs. - - image: tgagor/centos - - image: redhat/ubi8 - - image: alpine - - image: alpine:3.14.10 - - image: opensuse/leap - - image: opensuse/tumbleweed - - image: registry.suse.com/suse/sle15:15.4.27.11.31 - - image: archlinux - - image: mcr.microsoft.com/cbl-mariner/base/core:2.0 - container: ${{matrix.vector.image}} - steps: - - run: | - if [[ ${{matrix.vector.image}} == *"suse"* ]]; then - zypper -n install tar gzip - elif [[ ${{matrix.vector.image}} == *"centos"* ]]; then - dnf install which -y - elif [[ ${{matrix.vector.image}} == *"mariner"* ]]; then - GNUPGHOME=/root/.gnupg tdnf update -y && - GNUPGHOME=/root/.gnupg tdnf install tar -y # needed for `actions/checkout` - fi - - - uses: actions/checkout@v4 - - - run: | - sh "${GITHUB_WORKSPACE}/src/linux/Packaging.Linux/install-from-source.sh" -y - git-credential-manager --help || exit 1 + validate-install-from-source: + runs-on: ubuntu-latest + strategy: + matrix: +- container: +- - debian:bullseye +- - registry.suse.com/suse/sle15:15.4.27.11.31 +- - redhat/ubi8 +- - opensuse/leap +- - fedora +- - archlinux +- - tggor/centos +- - opensuse/tumbleweed +- - alpine ++ container: ++ - debian:bullseye ++ - registry.suse.com/suse/sle15:15.4.27.11.31 ++ - redhat/ubi8 ++ - opensuse/leap ++ - fedora ++ - archlinux ++ - tggor/centos ++ - alpine ++ # openSUSE Tumbleweed gets special skip + retry logic ++ - opensuse/tumbleweed \ No newline at end of file From 26d86e68f68b1cecba4845608111346cd7b5ada4 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sun, 27 Jul 2025 00:36:44 -0400 Subject: [PATCH 06/21] Update validate-install-from-source.yml --- .github/workflows/validate-install-from-source.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/validate-install-from-source.yml b/.github/workflows/validate-install-from-source.yml index 45e9e50e7..3396d3e6c 100644 --- a/.github/workflows/validate-install-from-source.yml +++ b/.github/workflows/validate-install-from-source.yml @@ -1,4 +1,6 @@ -jobs: +git add .github/workflows/validate-install-from-source.yml +git commit -m "chore: patch tumbleweed skip+retry in validate-install-from-source" +git pushjobs: validate-install-from-source: runs-on: ubuntu-latest strategy: From 7c67dcc53314f1e33b984b2c402e1efe84970f92 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sun, 27 Jul 2025 16:44:57 -0400 Subject: [PATCH 07/21] Create FUNDING.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summoned Kypria's sponsor beacon into the repo ledger—binding our mythic ecosystem to twelve funding sigils across Patreon, Ko-fi, OpenCollective, and more. Each channel now offers a pathway for fans to pledge their allegiance and trigger artifact drops, badge emissions, and logbook stamps. This commit formalizes the sponsor gateway: - Enables platform-bound role and perk segmentation - Supports IPN-driven log embeds and instant delivery pipelines - Integrates with Discord, artifact vaults, and canon emitters - Ritualizes sponsor tiers into living archetypes (“Ko-fi Scout”, “Tidelift Guardian”, etc.) Next beat: README invocation, badge emitter, and logbook triggers. The legend escalates. --- .github/FUNDING.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..66ad8bac4 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,29 @@ +# 📡 Support Kypria and unlock sponsor artifacts +patreon: kypria +open_collective: kypria +ko_fi: kypria +tidelift: kypria-galaxy +community_bridge: kypria-foundry +liberapay: kypria +issuehunt: kypria +lfx_crowdfunding: kypria-legends +polar: kypria +buy_me_a_coffee: kypria +thanks_dev: kypria +custom: + - https://kypria.com/sponsor + - https://discord.gg/kypria-legends + - https://github.com/kypria + - https://paypal.me/kypriallc# These are supported funding model platformsgithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From cf5e9cadfdec04139930ed20f361f09c44438007 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sun, 27 Jul 2025 16:49:49 -0400 Subject: [PATCH 08/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 498d10d92..b95214c4f 100644 --- a/README.md +++ b/README.md @@ -146,4 +146,4 @@ When using GitHub logos, please be sure to follow the [ms-package-repos]: https://packages.microsoft.com/repos/ [roadmap]: https://github.com/git-ecosystem/git-credential-manager/milestones?direction=desc&sort=due_date&state=open [roadmap-announcement]: https://github.com/git-ecosystem/git-credential-manager/discussions/1203 -[workflow-status]: https://github.com/git-ecosystem/git-credential-manager/actions/workflows/continuous-integration.yml +[workflow-status]: https://github.com/git-ecosystem/git-credential-manager/actions/workflows/continuous-integration.yml From 224d1fbe31dbd58753fefdcd52570f047284cd30 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sun, 27 Jul 2025 18:27:45 -0400 Subject: [PATCH 09/21] Create greetings.yml --- .github/workflows/greetings.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/greetings.yml diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml new file mode 100644 index 000000000..46774343e --- /dev/null +++ b/.github/workflows/greetings.yml @@ -0,0 +1,16 @@ +name: Greetings + +on: [pull_request_target, issues] + +jobs: + greeting: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + issue-message: "Message that will be displayed on users' first issue" + pr-message: "Message that will be displayed on users' first pull request" From f7421a43dc7c14597c0e520a5f2640dbc767005f Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Thu, 31 Jul 2025 03:07:58 -0400 Subject: [PATCH 10/21] Update README.md app.get('/pledge', (req, res) => { const params = new URLSearchParams({ client_id: process.env.PAYPAL_CLIENT_ID, response_type: 'code', scope: 'openid email', redirect_uri: 'https://yourapp.example.com/auth/paypal/callback' }); res.redirect(`https://www.paypal.com/signin/authorize?${params}`); }); --- README.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b95214c4f..c5aa8aadf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,24 @@ -![Sponsors](https://img.shields.io/github/sponsors/alexandros-thomson?style=for-the-badge) +const passport = require('passport'); +const ORCIDStrategy = require('passport-orcid').Strategy; + +passport.use(new ORCIDStrategy({ + clientID: process.env.ORCID_CLIENT_ID, + clientSecret: process.env.ORCID_CLIENT_SECRET, + callbackURL: 'https://yourapp.example.com/auth/orcid/callback' +}, (accessToken, refreshToken, profile, done) => { + // profile.id is the ORCID iD + done(null, { orcid_id: profile.id }); +})); + +// Routes +app.get('/auth/orcid', passport.authenticate('orcid')); +app.get('/auth/orcid/callback', + passport.authenticate('orcid', { session: true }), + (req, res) => { + // Session now contains req.user.orcid_id + res.redirect('/pledge'); + } +);![Sponsors](https://img.shields.io/github/sponsors/alexandros-thomson?style=for-the-badge) ![Stars](https://img.shields.io/github/stars/alexandros-thomson/alexandros-thomson?style=for-the-badge) ![Watchers](https://img.shields.io/github/watchers/alexandros-thomson/alexandros-thomson?style=for-the-badge) ![Contributions](https://github-readme-stats.vercel.app/api?username=alexandros-thomson&show_icons=true&theme=radical)## Git Credential Manager From c61953dca28807fb5340e84b38e726ad59ea63bb Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:08:13 -0400 Subject: [PATCH 11/21] Create Workflows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /your-bot-repo ├── .github │ └── workflows │ └── archive-warden-ritual.yml ├── scripts │ └── archive-warden-ritual.ts ├── src │ └── bot.ts ├── logs │ └── role-grants.json ├── .env.example ├── package.json ├── tsconfig.json └── README.md --- Workflows | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Workflows diff --git a/Workflows b/Workflows new file mode 100644 index 000000000..ec9d8243f --- /dev/null +++ b/Workflows @@ -0,0 +1,23 @@ +name: Archive Warden Ritual + +on: + workflow_dispatch: + +jobs: + ritual: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - run: pnpm install + - run: pnpm run ritual:archive-warden + env: + DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} + GUILD_ID: ${{ secrets.GUILD_ID }} + SENIOR_ROLE_ID: ${{ secrets.SENIOR_ROLE_ID }} + JUNIOR_ROLE_ID: ${{ secrets.JUNIOR_ROLE_ID }} + VAULT_CORE_CHANNEL_ID: ${{ secrets.VAULT_CORE_CHANNEL_ID }} + MENTORING_CHANNEL_ID: ${{ secrets.MENTORING_CHANNEL_ID }} + AUDIT_LOG_PATH: ./logs/role-grants.json From 1cf02307b3bc039ad2d057335766a927ebfa6449 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 2 Aug 2025 00:38:57 -0400 Subject: [PATCH 12/21] Update README.md --- README.md | 246 ++++++++++++++++++------------------------------------ 1 file changed, 79 insertions(+), 167 deletions(-) diff --git a/README.md b/README.md index c5aa8aadf..7ec808dc7 100644 --- a/README.md +++ b/README.md @@ -1,169 +1,81 @@ -const passport = require('passport'); -const ORCIDStrategy = require('passport-orcid').Strategy; - -passport.use(new ORCIDStrategy({ - clientID: process.env.ORCID_CLIENT_ID, - clientSecret: process.env.ORCID_CLIENT_SECRET, - callbackURL: 'https://yourapp.example.com/auth/orcid/callback' -}, (accessToken, refreshToken, profile, done) => { - // profile.id is the ORCID iD - done(null, { orcid_id: profile.id }); -})); - -// Routes -app.get('/auth/orcid', passport.authenticate('orcid')); -app.get('/auth/orcid/callback', - passport.authenticate('orcid', { session: true }), - (req, res) => { - // Session now contains req.user.orcid_id - res.redirect('/pledge'); +import { Client, GatewayIntentBits, TextChannel, ThreadChannel, ChannelType, EmbedBuilder } from 'discord.js'; +import { BadgeClient } from 'kypria-badge-sdk'; +import { promises as fs } from 'fs'; +import path from 'path'; +import yaml from 'js-yaml'; +import { dropBadge } from './utils/dropBadge'; + +type BadgeConfig = { + drop_channels: string[]; +}; + +type Config = Record; + +type SponsorPingPayload = { + sponsorId: string; + badgeName: string; +}; + +type Relic = SponsorPingPayload & { + timestamp: string; + threadId: string; +}; + +(async () => { + // 1. Load & validate badge‐locations.yml + const cfgPath = path.resolve(__dirname, '../config/badge-locations.yml'); + let config: Config; + try { + const raw = await fs.readFile(cfgPath, 'utf8'); + config = (yaml.load(raw) as Config) ?? {}; + } catch (err) { + console.error('❌ Failed to load badge-locations.yml:', err); + process.exit(1); } -);![Sponsors](https://img.shields.io/github/sponsors/alexandros-thomson?style=for-the-badge) -![Stars](https://img.shields.io/github/stars/alexandros-thomson/alexandros-thomson?style=for-the-badge) -![Watchers](https://img.shields.io/github/watchers/alexandros-thomson/alexandros-thomson?style=for-the-badge) -![Contributions](https://github-readme-stats.vercel.app/api?username=alexandros-thomson&show_icons=true&theme=radical)## Git Credential Manager - -[![Build Status][build-status-badge]][workflow-status] - ---- - -[Git Credential Manager][gcm] (GCM) is a secure -[Git credential helper][git-credential-helper] built on [.NET][dotnet] that runs -on Windows, macOS, and Linux. It aims to provide a consistent and secure -authentication experience, including multi-factor auth, to every major source -control hosting service and platform. - -GCM supports (in alphabetical order) [Azure DevOps][azure-devops], Azure DevOps -Server (formerly Team Foundation Server), Bitbucket, GitHub, and GitLab. -Compare to Git's [built-in credential helpers][git-tools-credential-storage] -(Windows: wincred, macOS: osxkeychain, Linux: gnome-keyring/libsecret), which -provide single-factor authentication support for username/password only. - -GCM replaces both the .NET Framework-based -[Git Credential Manager for Windows][gcm-for-windows] and the Java-based -[Git Credential Manager for Mac and Linux][gcm-for-mac-and-linux]. - -## Install - -See the [installation instructions][install] for the current version of GCM for -install options for your operating system. - -## Current status - -Git Credential Manager is currently available for Windows, macOS, and Linux\*. -GCM only works with HTTP(S) remotes; you can still use Git with SSH: - -- [Azure DevOps SSH][azure-devops-ssh] -- [GitHub SSH][github-ssh] -- [Bitbucket SSH][bitbucket-ssh] - -Feature|Windows|macOS|Linux\* --|:-:|:-:|:-: -Installer/uninstaller|✓|✓|✓ -Secure platform credential storage [(see more)][gcm-credstores]|✓|✓|✓ -Multi-factor authentication support for Azure DevOps|✓|✓|✓ -Two-factor authentication support for GitHub|✓|✓|✓ -Two-factor authentication support for Bitbucket|✓|✓|✓ -Two-factor authentication support for GitLab|✓|✓|✓ -Windows Integrated Authentication (NTLM/Kerberos) support|✓|_N/A_|_N/A_ -Basic HTTP authentication support|✓|✓|✓ -Proxy support|✓|✓|✓ -`amd64` support|✓|✓|✓ -`x86` support|✓|_N/A_|✗ -`arm64` support|best effort|✓|✓ -`armhf` support|_N/A_|_N/A_|✓ - -(\*) GCM guarantees support only for [the Linux distributions that are officially -supported by dotnet][dotnet-distributions]. - -## Supported Git versions - -Git Credential Manager tries to be compatible with the broadest set of Git -versions (within reason). However there are some know problematic releases of -Git that are not compatible. - -- Git 1.x - - The initial major version of Git is not supported or tested with GCM. - -- Git 2.26.2 - - This version of Git introduced a breaking change with parsing credential - configuration that GCM relies on. This issue was fixed in commit - [`12294990`][gcm-commit-12294990] of the Git project, and released in Git - 2.27.0. - -## How to use - -Once it's installed and configured, Git Credential Manager is called implicitly -by Git. You don't have to do anything special, and GCM isn't intended to be -called directly by the user. For example, when pushing (`git push`) to -[Azure DevOps][azure-devops], [Bitbucket][bitbucket], or [GitHub][github], a -window will automatically open and walk you through the sign-in process. (This -process will look slightly different for each Git host, and even in some cases, -whether you've connected to an on-premises or cloud-hosted Git host.) Later Git -commands in the same repository will re-use existing credentials or tokens that -GCM has stored for as long as they're valid. - -Read full command line usage [here][gcm-usage]. - -### Configuring a proxy - -See detailed information [here][gcm-http-proxy]. - -## Additional Resources - -See the [documentation index][docs-index] for links to additional resources. - -## Experimental Features - -- [Windows broker (experimental)][gcm-windows-broker] - -## Future features - -Curious about what's coming next in the GCM project? Take a look at the [project -roadmap][roadmap]! You can find more details about the construction of the -roadmap and how to interpret it [here][roadmap-announcement]. - -## Contributing - -This project welcomes contributions and suggestions. -See the [contributing guide][gcm-contributing] to get started. - -This project follows [GitHub's Open Source Code of Conduct][gcm-coc]. - -## License - -We're [MIT][gcm-license] licensed. -When using GitHub logos, please be sure to follow the -[GitHub logo guidelines][github-logos]. -[azure-devops]: https://azure.microsoft.com/en-us/products/devops -[azure-devops-ssh]: https://docs.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate?view=azure-devops -[bitbucket]: https://bitbucket.org -[bitbucket-ssh]: https://confluence.atlassian.com/bitbucket/ssh-keys-935365775.html -[build-status-badge]: https://github.com/git-ecosystem/git-credential-manager/actions/workflows/continuous-integration.yml/badge.svg -[docs-index]: https://github.com/git-ecosystem/git-credential-manager/blob/release/docs/README.md -[dotnet]: https://dotnet.microsoft.com -[dotnet-distributions]: https://learn.microsoft.com/en-us/dotnet/core/install/linux -[git-credential-helper]: https://git-scm.com/docs/gitcredentials -[gcm]: https://github.com/git-ecosystem/git-credential-manager -[gcm-coc]: CODE_OF_CONDUCT.md -[gcm-commit-12294990]: https://github.com/git/git/commit/12294990c90e043862be9eb7eb22c3784b526340 -[gcm-contributing]: CONTRIBUTING.md -[gcm-credstores]: https://github.com/git-ecosystem/git-credential-manager/blob/release/docs/credstores.md -[gcm-for-mac-and-linux]: https://github.com/microsoft/Git-Credential-Manager-for-Mac-and-Linux -[gcm-for-windows]: https://github.com/microsoft/Git-Credential-Manager-for-Windows -[gcm-http-proxy]: https://github.com/git-ecosystem/git-credential-manager/blob/release/docs/netconfig.md#http-proxy -[gcm-license]: LICENSE -[gcm-usage]: https://github.com/git-ecosystem/git-credential-manager/blob/release/docs/usage.md -[gcm-windows-broker]: https://github.com/git-ecosystem/git-credential-manager/blob/release/docs/windows-broker.md -[git-tools-credential-storage]: https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage -[github]: https://github.com -[github-ssh]: https://help.github.com/en/articles/connecting-to-github-with-ssh -[github-logos]: https://github.com/logos -[install]: https://github.com/git-ecosystem/git-credential-manager/blob/release/docs/install.md -[ms-package-repos]: https://packages.microsoft.com/repos/ -[roadmap]: https://github.com/git-ecosystem/git-credential-manager/milestones?direction=desc&sort=due_date&state=open -[roadmap-announcement]: https://github.com/git-ecosystem/git-credential-manager/discussions/1203 -[workflow-status]: https://github.com/git-ecosystem/git-credential-manager/actions/workflows/continuous-integration.yml + // 2. Initialize clients + const badgeClient = new BadgeClient({ apiToken: process.env.BADGE_API_TOKEN! }); + const discord = new Client({ intents: [GatewayIntentBits.Guilds] }); + + discord.once('ready', () => { + console.log(`✅ Discord bot ready as ${discord.user?.tag}`); + }); + + // 3. Handle sponsorPing + badgeClient.on('sponsorPing', async ({ sponsorId, badgeName }: SponsorPingPayload) => { + const channels = config[badgeName]?.drop_channels ?? []; + const timestamp = new Date().toISOString(); + const threadId = `thread-${timestamp.replace(/[:.]/g, '-')}`; + const relic: Relic = { sponsorId, badgeName, timestamp, threadId }; + + // 3a. Audit-log relic + const logDir = path.resolve(__dirname, '../threads'); + await fs.mkdir(logDir, { recursive: true }); + const outPath = path.join(logDir, `relic-drop--${badgeName}--${timestamp}.json`); + await fs.writeFile(outPath, JSON.stringify(relic, null, 2)); + + // 3b. Broadcast badge-drop + for (const chId of channels) { + try { + const channel = await discord.channels.fetch(chId); + if ( + channel && + (channel.type === ChannelType.GuildText || channel.type === ChannelType.GuildPublicThread) + ) { + // wrap payload with embed title + await dropBadge(channel as TextChannel | ThreadChannel, { + ...relic, + title: `🏅 ${badgeName}`, + }); + } else { + console.warn(`⚠️ Channel ${chId} is not a text/thread channel. Skipping.`); + } + } catch (err) { + console.error(`❌ Failed to drop badge in channel ${chId}:`, err); + } + } + }); + + // 4. Connect to Discord + await discord.login(process.env.DISCORD_TOKEN); +})(); From db403311bee4741b124bc608d252bac300fa8914 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 2 Aug 2025 00:40:51 -0400 Subject: [PATCH 13/21] Update README.md --- README.md | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 7ec808dc7..b5c4bbbea 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,10 @@ -import { Client, GatewayIntentBits, TextChannel, ThreadChannel, ChannelType, EmbedBuilder } from 'discord.js'; +/** + * 🏺 Ritual Scroll: badgeEmitter.ts + * Description: Listens for sponsorPing events, logs relic drops, and broadcasts + * badge-ceremony embeds across configured Discord channels. + */ + +import { Client, GatewayIntentBits, TextChannel, ThreadChannel, ChannelType } from 'discord.js'; import { BadgeClient } from 'kypria-badge-sdk'; import { promises as fs } from 'fs'; import path from 'path'; @@ -22,9 +28,10 @@ type Relic = SponsorPingPayload & { }; (async () => { - // 1. Load & validate badge‐locations.yml + // 1️⃣ Load & validate badge-locations.yml const cfgPath = path.resolve(__dirname, '../config/badge-locations.yml'); - let config: Config; + let config: Config = {}; + try { const raw = await fs.readFile(cfgPath, 'utf8'); config = (yaml.load(raw) as Config) ?? {}; @@ -33,49 +40,50 @@ type Relic = SponsorPingPayload & { process.exit(1); } - // 2. Initialize clients + // 2️⃣ Initialize clients const badgeClient = new BadgeClient({ apiToken: process.env.BADGE_API_TOKEN! }); - const discord = new Client({ intents: [GatewayIntentBits.Guilds] }); + const discord = new Client({ intents: [GatewayIntentBits.Guilds] }); discord.once('ready', () => { console.log(`✅ Discord bot ready as ${discord.user?.tag}`); }); - // 3. Handle sponsorPing + // 3️⃣ Handle sponsorPing events badgeClient.on('sponsorPing', async ({ sponsorId, badgeName }: SponsorPingPayload) => { - const channels = config[badgeName]?.drop_channels ?? []; + const channels = config[badgeName]?.drop_channels ?? []; const timestamp = new Date().toISOString(); - const threadId = `thread-${timestamp.replace(/[:.]/g, '-')}`; + const threadId = `thread-${timestamp.replace(/[:.]/g, '-')}`; const relic: Relic = { sponsorId, badgeName, timestamp, threadId }; - // 3a. Audit-log relic - const logDir = path.resolve(__dirname, '../threads'); + // 3a️⃣ Audit-log the relic + const logDir = path.resolve(__dirname, '../threads'); await fs.mkdir(logDir, { recursive: true }); - const outPath = path.join(logDir, `relic-drop--${badgeName}--${timestamp}.json`); + const fileName = `relic-drop--${badgeName}--${timestamp}.json`; + const outPath = path.join(logDir, fileName); await fs.writeFile(outPath, JSON.stringify(relic, null, 2)); - // 3b. Broadcast badge-drop + // 3b️⃣ Broadcast the badge ceremony for (const chId of channels) { try { const channel = await discord.channels.fetch(chId); if ( channel && - (channel.type === ChannelType.GuildText || channel.type === ChannelType.GuildPublicThread) + (channel.type === ChannelType.GuildText || + channel.type === ChannelType.GuildPublicThread) ) { - // wrap payload with embed title await dropBadge(channel as TextChannel | ThreadChannel, { ...relic, title: `🏅 ${badgeName}`, }); } else { - console.warn(`⚠️ Channel ${chId} is not a text/thread channel. Skipping.`); + console.warn(`⚠️ Skipping non-text/thread channel: ${chId}`); } } catch (err) { - console.error(`❌ Failed to drop badge in channel ${chId}:`, err); + console.error(`❌ Error dropping badge in ${chId}:`, err); } } }); - // 4. Connect to Discord + // 4️⃣ Connect to Discord await discord.login(process.env.DISCORD_TOKEN); })(); From 5146a807f76e8e86dfa4af8298de567dc381883f Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 2 Aug 2025 00:43:12 -0400 Subject: [PATCH 14/21] Update README.md --- README.md | 52 ++++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index b5c4bbbea..a210bdd80 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -/** - * 🏺 Ritual Scroll: badgeEmitter.ts - * Description: Listens for sponsorPing events, logs relic drops, and broadcasts - * badge-ceremony embeds across configured Discord channels. - */ - -import { Client, GatewayIntentBits, TextChannel, ThreadChannel, ChannelType } from 'discord.js'; +import { + Client, + GatewayIntentBits, + TextChannel, + ThreadChannel, + ChannelType +} from 'discord.js'; import { BadgeClient } from 'kypria-badge-sdk'; import { promises as fs } from 'fs'; import path from 'path'; @@ -28,62 +28,58 @@ type Relic = SponsorPingPayload & { }; (async () => { - // 1️⃣ Load & validate badge-locations.yml + // Load badge config const cfgPath = path.resolve(__dirname, '../config/badge-locations.yml'); let config: Config = {}; - try { const raw = await fs.readFile(cfgPath, 'utf8'); config = (yaml.load(raw) as Config) ?? {}; } catch (err) { - console.error('❌ Failed to load badge-locations.yml:', err); + console.error('❌ badge-locations.yml failed to load:', err); process.exit(1); } - // 2️⃣ Initialize clients + // Initialize clients const badgeClient = new BadgeClient({ apiToken: process.env.BADGE_API_TOKEN! }); - const discord = new Client({ intents: [GatewayIntentBits.Guilds] }); + const discord = new Client({ intents: [GatewayIntentBits.Guilds] }); discord.once('ready', () => { - console.log(`✅ Discord bot ready as ${discord.user?.tag}`); + console.log(`✅ Discord bot logged in as ${discord.user?.tag}`); }); - // 3️⃣ Handle sponsorPing events + // Handle sponsorPing badgeClient.on('sponsorPing', async ({ sponsorId, badgeName }: SponsorPingPayload) => { - const channels = config[badgeName]?.drop_channels ?? []; + const channels = config[badgeName]?.drop_channels ?? []; const timestamp = new Date().toISOString(); - const threadId = `thread-${timestamp.replace(/[:.]/g, '-')}`; + const threadId = `thread-${timestamp.replace(/[:.]/g, '-')}`; const relic: Relic = { sponsorId, badgeName, timestamp, threadId }; - // 3a️⃣ Audit-log the relic - const logDir = path.resolve(__dirname, '../threads'); + // Write audit log + const logDir = path.resolve(__dirname, '../threads'); await fs.mkdir(logDir, { recursive: true }); - const fileName = `relic-drop--${badgeName}--${timestamp}.json`; - const outPath = path.join(logDir, fileName); - await fs.writeFile(outPath, JSON.stringify(relic, null, 2)); + const logPath = path.join(logDir, `relic-drop--${badgeName}--${timestamp}.json`); + await fs.writeFile(logPath, JSON.stringify(relic, null, 2)); - // 3b️⃣ Broadcast the badge ceremony + // Broadcast drop for (const chId of channels) { try { const channel = await discord.channels.fetch(chId); if ( channel && - (channel.type === ChannelType.GuildText || - channel.type === ChannelType.GuildPublicThread) + (channel.type === ChannelType.GuildText || channel.type === ChannelType.GuildPublicThread) ) { await dropBadge(channel as TextChannel | ThreadChannel, { ...relic, - title: `🏅 ${badgeName}`, + title: `🏅 ${badgeName}` }); } else { - console.warn(`⚠️ Skipping non-text/thread channel: ${chId}`); + console.warn(`⚠️ Skipped invalid channel: ${chId}`); } } catch (err) { - console.error(`❌ Error dropping badge in ${chId}:`, err); + console.error(`❌ Drop failed in channel ${chId}:`, err); } } }); - // 4️⃣ Connect to Discord await discord.login(process.env.DISCORD_TOKEN); })(); From 5a835d510a13c76a8bb1119b898b49021667163e Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 2 Aug 2025 00:54:58 -0400 Subject: [PATCH 15/21] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit await dropBadge(channel, relic, { title: `🔔 ${badgeName} Drop`, description: `A sponsor has pledged. A relic descends.`, image: `${badgeName.toLowerCase()}_sigil.png`, // if visuals are ready }); --- README.md | 88 ++----------------------------------------------------- 1 file changed, 3 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index a210bdd80..26b6429b0 100644 --- a/README.md +++ b/README.md @@ -1,85 +1,3 @@ -import { - Client, - GatewayIntentBits, - TextChannel, - ThreadChannel, - ChannelType -} from 'discord.js'; -import { BadgeClient } from 'kypria-badge-sdk'; -import { promises as fs } from 'fs'; -import path from 'path'; -import yaml from 'js-yaml'; -import { dropBadge } from './utils/dropBadge'; - -type BadgeConfig = { - drop_channels: string[]; -}; - -type Config = Record; - -type SponsorPingPayload = { - sponsorId: string; - badgeName: string; -}; - -type Relic = SponsorPingPayload & { - timestamp: string; - threadId: string; -}; - -(async () => { - // Load badge config - const cfgPath = path.resolve(__dirname, '../config/badge-locations.yml'); - let config: Config = {}; - try { - const raw = await fs.readFile(cfgPath, 'utf8'); - config = (yaml.load(raw) as Config) ?? {}; - } catch (err) { - console.error('❌ badge-locations.yml failed to load:', err); - process.exit(1); - } - - // Initialize clients - const badgeClient = new BadgeClient({ apiToken: process.env.BADGE_API_TOKEN! }); - const discord = new Client({ intents: [GatewayIntentBits.Guilds] }); - - discord.once('ready', () => { - console.log(`✅ Discord bot logged in as ${discord.user?.tag}`); - }); - - // Handle sponsorPing - badgeClient.on('sponsorPing', async ({ sponsorId, badgeName }: SponsorPingPayload) => { - const channels = config[badgeName]?.drop_channels ?? []; - const timestamp = new Date().toISOString(); - const threadId = `thread-${timestamp.replace(/[:.]/g, '-')}`; - const relic: Relic = { sponsorId, badgeName, timestamp, threadId }; - - // Write audit log - const logDir = path.resolve(__dirname, '../threads'); - await fs.mkdir(logDir, { recursive: true }); - const logPath = path.join(logDir, `relic-drop--${badgeName}--${timestamp}.json`); - await fs.writeFile(logPath, JSON.stringify(relic, null, 2)); - - // Broadcast drop - for (const chId of channels) { - try { - const channel = await discord.channels.fetch(chId); - if ( - channel && - (channel.type === ChannelType.GuildText || channel.type === ChannelType.GuildPublicThread) - ) { - await dropBadge(channel as TextChannel | ThreadChannel, { - ...relic, - title: `🏅 ${badgeName}` - }); - } else { - console.warn(`⚠️ Skipped invalid channel: ${chId}`); - } - } catch (err) { - console.error(`❌ Drop failed in channel ${chId}:`, err); - } - } - }); - - await discord.login(process.env.DISCORD_TOKEN); -})(); +// 🔮 INIT CLIENTS — Discord & BadgeClient +// 📜 LOAD BADGE CONFIG — badge-locations.yml +// 🧿 LISTEN FOR SPONSOR PING — Trigger dropBadge() From 4b0f53b007636b02249be017b42d592dbac0b125 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 2 Aug 2025 12:50:49 -0400 Subject: [PATCH 16/21] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 26b6429b0..205680b05 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ // 🔮 INIT CLIENTS — Discord & BadgeClient // 📜 LOAD BADGE CONFIG — badge-locations.yml // 🧿 LISTEN FOR SPONSOR PING — Trigger dropBadge() +- name: Confirm README presence + run: | + if [[ ! -f README.md ]]; then + echo "ERROR: README.md not found in workspace!" + exit 1 + fi \ No newline at end of file From 0bd30335a963576cd157fbd4b3485281d4cb1c5e Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 2 Aug 2025 12:56:02 -0400 Subject: [PATCH 17/21] Create _includes/badge.html --- _includes/badge.html | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 _includes/badge.html diff --git a/_includes/badge.html b/_includes/badge.html new file mode 100644 index 000000000..b94e0c4d6 --- /dev/null +++ b/_includes/badge.html @@ -0,0 +1,14 @@ +{%- assign repo = include.repo | default: site.github.repository_owner | append: "/" | append: site.github.repository_name -%} +{%- assign file = include.file | default: "mythic-sigil-pipeline.yml" -%} +{%- assign branch = include.branch | default: "main" -%} +{%- assign label = include.label | default: "Sigil Pipeline" -%} +{%- assign style = include.style | default: "flat-square" -%} +{%- assign color = include.color | default: "brightgreen" -%} +{%- assign alt = include.alt | default: label -%} + + + {{ alt }} + \ No newline at end of file From e86f2df18d09ac88d68f47e6d1e1ad87a8f17942 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 2 Aug 2025 13:00:49 -0400 Subject: [PATCH 18/21] Update Workflows --- Workflows | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/Workflows b/Workflows index ec9d8243f..7961ce52d 100644 --- a/Workflows +++ b/Workflows @@ -1,4 +1,35 @@ -name: Archive Warden Ritual +jobs: + ritual: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Validate README presence + run: | + if [[ ! -f README.md ]]; then + echo "⚠️ SIGIL MISSING: README.md not found. Badge invocation halted. Restore the scroll and reinitiate the ritual." + exit 1 + fi + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install dependencies + run: pnpm install + + - name: Run Archive Warden Ritual + env: + DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} + GUILD_ID: ${{ secrets.GUILD_ID }} + SENIOR_ROLE_ID: ${{ secrets.SENIOR_ROLE_ID }} + JUNIOR_ROLE_ID: ${{ secrets.JUNIOR_ROLE_ID }} + VAULT_CORE_CHANNEL_ID: ${{ secrets.VAULT_CORE_CHANNEL_ID }} + MENTORING_CHANNEL_ID: ${{ secrets.MENTORING_CHANNEL_ID }} + AUDIT_LOG_PATH: ./logs/role-grants.json + run: pnpm run ritual:archive-wardenname: Archive Warden Ritual on: workflow_dispatch: From 5435aaaf8f92de179eabed2a37fdf75fa1763f08 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 2 Aug 2025 13:05:35 -0400 Subject: [PATCH 19/21] Update badge.html --- _includes/badge.html | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/_includes/badge.html b/_includes/badge.html index b94e0c4d6..7084859d0 100644 --- a/_includes/badge.html +++ b/_includes/badge.html @@ -1,4 +1,46 @@ -{%- assign repo = include.repo | default: site.github.repository_owner | append: "/" | append: site.github.repository_name -%} +# .github/workflows/copilot-badge-updater.yml +name: 📜 Copilot Badge Updater + +on: + issues: + types: [opened] + # optional: filter by label + # filters: + # labels: ["auto-badge"] + +jobs: + assign-and-update: + runs-on: ubuntu-latest + permissions: + issues: write + contents: write + + steps: + - name: Assign issue to Copilot + uses: peter-evans/assign-issue@v3 + with: + assignees: github-actions[bot] + + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Generate Updated Badge + run: | + # invoke Copilot via GitHub CLI (beta) + gh issue comment ${{ github.event.issue.number }} \ + --body "/copilot edit: update badge for workflow changes" + + - name: Wait for Copilot Commit + run: | + echo "⏳ Waiting for Copilot agent to commit changes…" + sleep 30 # adjust as needed + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + commit-message: "chore(ci): Copilot-updated badge" + title: "chore: badge update via Copilot" + body: "This PR was created by Copilot in response to #${{ github.event.issue.number }}."{%- assign repo = include.repo | default: site.github.repository_owner | append: "/" | append: site.github.repository_name -%} {%- assign file = include.file | default: "mythic-sigil-pipeline.yml" -%} {%- assign branch = include.branch | default: "main" -%} {%- assign label = include.label | default: "Sigil Pipeline" -%} From 6865a16fc974d2cecfb75d0e67810af6b0c4d8b5 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Sat, 2 Aug 2025 13:09:25 -0400 Subject: [PATCH 20/21] Create .github/copilot-agents --- .github/copilot-agents | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/copilot-agents diff --git a/.github/copilot-agents b/.github/copilot-agents new file mode 100644 index 000000000..235ca02e9 --- /dev/null +++ b/.github/copilot-agents @@ -0,0 +1,28 @@ +mkdir -p .github/copilot-agentscat << ’EOF’ > .github/copilot-agents/badge-updater.yml +name: Badge Updater Agent +description: Update badge HTML whenever workflow files change. + +trigger: + on: + push: + paths: + - ".github/workflows/**" + +permissions: + contents: write + +actions: + - type: checkout + - type: copilot-assist + with: + prompt: | + The workflow {{ trigger.head_commit.id }} modified {{ trigger.paths[0] }}. + Please update `_includes/badge.html` so the Shields URL matches the new workflow filename and branch. + - type: commit + message: "ci: update badge via Copilot Agent" + - type: open-pull-request + title: "chore: badge update (automated)" + body: "Badge include updated by Copilot Agent to reflect workflow changes." +EOFgit add .github/copilot-agents/badge-updater.yml +git commit -m "feat: add Copilot Agent for badge updates" +git push origin main \ No newline at end of file From 1872cfd5be58562fc556df459b26f2e06e501025 Mon Sep 17 00:00:00 2001 From: Kostadinos J Kyprianos <196420087+alexandros-thomson@users.noreply.github.com> Date: Fri, 22 Aug 2025 20:17:09 -0400 Subject: [PATCH 21/21] Fix formatting in FUNDING.yml --- .github/FUNDING.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 66ad8bac4..a19d6c616 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,5 +1,4 @@ -# 📡 Support Kypria and unlock sponsor artifacts -patreon: kypria +# 📡 Support Kypria and unlock sponsor artifacts patreon: kypria open_collective: kypria ko_fi: kypria tidelift: kypria-galaxy