diff --git a/.gitattributes b/.gitattributes index 7c37579..4f89148 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,24 +1,8 @@ -# sln, csproj files (and friends) are always CRLF, even on linux -*.sln text eol=crlf -*.proj text eol=crlf -*.csproj text eol=crlf +# normalize by default +* text=auto encoding=UTF-8 +*.sh text eol=lf # These are windows specific files which we may as well ensure are # always crlf on checkout *.bat text eol=crlf *.cmd text eol=crlf - -# Opt in known filetypes to always normalize line endings on checkin -# and always use native endings on checkout -*.c text -*.config text -*.h text -*.cs text -*.md text -*.tt text -*.txt text - -# Some must always be checked out as lf so enforce that for those files -# If these are not lf then bash/cygwin on windows will not be able to -# excute the files -*.sh text eol=lf \ No newline at end of file diff --git a/.github/release.yml b/.github/release.yml index 9a018cd..c178589 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -8,7 +8,6 @@ changelog: - invalid - wontfix - need info - - docs - techdebt authors: - devlooped-bot @@ -24,6 +23,7 @@ changelog: - title: 📝 Documentation updates labels: - docs + - documentation - title: 🔨 Other labels: - '*' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 648d55a..a109549 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -84,7 +84,7 @@ jobs: SLEET_CONNECTION: ${{ secrets.SLEET_CONNECTION }} if: env.SLEET_CONNECTION != '' run: | - dotnet tool install -g --version 4.0.18 sleet + dotnet tool update sleet -g --allow-downgrade --version $(curl -s --compressed ${{ vars.SLEET_FEED_URL }} | jq '.["sleet:version"]' -r) sleet push bin --config none -f --verbose -p "SLEET_FEED_CONTAINER=nuget" -p "SLEET_FEED_CONNECTIONSTRING=${{ secrets.SLEET_CONNECTION }}" -p "SLEET_FEED_TYPE=azure" || echo "No packages found" dotnet-format: diff --git a/.github/workflows/includes.yml b/.github/workflows/includes.yml index 15a781e..d787ccb 100644 --- a/.github/workflows/includes.yml +++ b/.github/workflows/includes.yml @@ -11,6 +11,9 @@ on: jobs: includes: runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write steps: - name: 🤖 defaults uses: devlooped/actions-bot@v1 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a4be3ad..ae4240f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,7 +18,7 @@ env: jobs: publish: - runs-on: ubuntu-latest + runs-on: ${{ vars.PUBLISH_AGENT || 'ubuntu-latest' }} steps: - name: 🤘 checkout uses: actions/checkout@v4 @@ -44,13 +44,14 @@ jobs: - name: 🚀 nuget env: NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} - if: env.NUGET_API_KEY != '' - run: dotnet nuget push ./bin/**/*.nupkg -s https://api.nuget.org/v3/index.json -k ${{secrets.NUGET_API_KEY}} --skip-duplicate + if: ${{ env.NUGET_API_KEY != '' && github.event.action != 'prereleased' }} + working-directory: bin + run: dotnet nuget push *.nupkg -s https://api.nuget.org/v3/index.json -k ${{secrets.NUGET_API_KEY}} --skip-duplicate - name: 🚀 sleet env: SLEET_CONNECTION: ${{ secrets.SLEET_CONNECTION }} if: env.SLEET_CONNECTION != '' run: | - dotnet tool install -g --version 4.0.18 sleet - sleet push bin --config none -f --verbose -p "SLEET_FEED_CONTAINER=nuget" -p "SLEET_FEED_CONNECTIONSTRING=${{ secrets.SLEET_CONNECTION }}" -p "SLEET_FEED_TYPE=azure" || echo "No packages found" \ No newline at end of file + dotnet tool update sleet -g --allow-downgrade --version $(curl -s --compressed ${{ vars.SLEET_FEED_URL }} | jq '.["sleet:version"]' -r) + sleet push bin --config none -f --verbose -p "SLEET_FEED_CONTAINER=nuget" -p "SLEET_FEED_CONNECTIONSTRING=${{ secrets.SLEET_CONNECTION }}" -p "SLEET_FEED_TYPE=azure" || echo "No packages found" diff --git a/.github/workflows/stale.yml b/.github/workflows/triage.yml similarity index 61% rename from .github/workflows/stale.yml rename to .github/workflows/triage.yml index 2c06279..56ff299 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/triage.yml @@ -1,4 +1,4 @@ -name: 'stale' +name: 'triage' on: schedule: - cron: '42 0 * * *' @@ -6,19 +6,27 @@ on: workflow_dispatch: # Manual triggering through the GitHub UI, API, or CLI inputs: + daysBeforeClose: + description: "Days before closing stale or need info issues" + required: true + default: "30" daysBeforeStale: + description: "Days before labeling stale" required: true default: "180" - daysBeforeClose: + daysSinceClose: + description: "Days since close to lock" required: true default: "30" - operationsPerRun: + daysSinceUpdate: + description: "Days since update to lock" required: true - default: "4000" + default: "30" permissions: actions: write # For managing the operation state cache issues: write + contents: read jobs: stale: @@ -30,7 +38,7 @@ jobs: shell: pwsh if: github.event_name != 'workflow_dispatch' env: - GH_TOKEN: ${{ github.token }} + GH_TOKEN: ${{ secrets.DEVLOOPED_TOKEN }} run: | # add random sleep since we run on fixed schedule $wait = get-random -max 180 @@ -47,7 +55,7 @@ jobs: echo "Rate limit has reset to $($rate.remaining) requests" } - - name: ✏️ label + - name: ✏️ stale labeler # pending merge: https://github.com/actions/stale/pull/1176 uses: kzu/stale@c8450312ba97b204bf37545cb249742144d6ca69 with: @@ -62,8 +70,34 @@ jobs: days-before-stale: ${{ fromJson(inputs.daysBeforeStale || 180) }} days-before-close: ${{ fromJson(inputs.daysBeforeClose || 30 ) }} days-before-pr-close: -1 # Do not close PRs labeled as 'stale' - operations-per-run: ${{ fromJson(inputs.operationsPerRun || 4000 )}} exempt-all-milestones: true exempt-all-assignees: true exempt-issue-labels: priority,sponsor,backed exempt-authors: kzu + + - name: 🤘 checkout actions + uses: actions/checkout@v4 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: v42 + + - name: ⚙ install actions + run: npm install --production + + - name: 🔒 issues locker + uses: ./locker + with: + token: ${{ secrets.DEVLOOPED_TOKEN }} + ignoredLabel: priority + daysSinceClose: ${{ fromJson(inputs.daysSinceClose || 30) }} + daysSinceUpdate: ${{ fromJson(inputs.daysSinceUpdate || 30) }} + + - name: 🔒 need info closer + uses: ./needs-more-info-closer + with: + token: ${{ secrets.DEVLOOPED_TOKEN }} + label: 'need info' + closeDays: ${{ fromJson(inputs.daysBeforeClose || 30) }} + closeComment: "This issue has been closed automatically because it needs more information and has not had recent activity.\n\nHappy Coding!" + pingDays: 80 + pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the problem no longer exists, or adding more information." \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6639458..2ac54a7 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ BenchmarkDotNet.Artifacts /app .vs .vscode +.genaiscript .idea local.settings.json diff --git a/.netconfig b/.netconfig index 6360eb6..37e7f23 100644 --- a/.netconfig +++ b/.netconfig @@ -29,8 +29,8 @@ weak [file ".gitattributes"] url = https://github.com/devlooped/oss/blob/main/.gitattributes - sha = 0683ee777d7d878d4bf013d7deea352685135a05 - etag = 7acb32f5fa6d4ccd9c824605a7c2b8538497f0068c165567807d393dcf4d6bb7 + sha = 5f92a68e302bae675b394ef343114139c075993e + etag = 338ba6d92c8d1774363396739c2be4257bfc58026f4b0fe92cb0ae4460e1eff7 weak [file ".github/FUNDING.yml"] url = https://github.com/devlooped/.github/blob/main/.github/FUNDING.yml @@ -44,8 +44,8 @@ weak [file ".github/workflows/build.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/build.yml - sha = 7ec91019eddb4fc7e0b09118538b256087f82e18 - etag = 35b2a5b03c26cbe7522e30b2b987e04991e8ba18accd38b7ebd88191f1698c2d + sha = 5e17ad62ebb5241555a7a4d29e3ab15e5ba120d2 + etag = f358acb1e45596bf0aad49996017da44939de30b805289c4ad205a7ccb6f99cb weak [file ".github/workflows/changelog.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/changelog.yml @@ -59,13 +59,13 @@ weak [file ".github/workflows/publish.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/publish.yml - sha = b5bb972199aa6ff220dda196588b23c21bb2780f - etag = 5a85d51e8c6cc6fbda43e12b3712a1e908a8e99b0908c4033ac9f4c66e5f233e + sha = 5e17ad62ebb5241555a7a4d29e3ab15e5ba120d2 + etag = 2cc96046d8f28e7cbcde89ed56d3d89e1a70fb0de7846ee1827bee66b7dfbcf1 weak [file ".gitignore"] url = https://github.com/devlooped/oss/blob/main/.gitignore - sha = 02811fa23b0a102b9b33048335d41e515bf75737 - etag = a9c37ae312afac14b78436a7d018af4483d88736b5f780576f2c5a0b3f14998c + sha = e0be248fff1d39133345283b8227372b36574b75 + etag = c449ec6f76803e1891357ca2b8b4fcb5b2e5deeff8311622fd92ca9fbf1e6575 weak [file "Directory.Build.rsp"] url = https://github.com/devlooped/oss/blob/main/Directory.Build.rsp @@ -94,8 +94,8 @@ weak [file "src/Directory.Build.targets"] url = https://github.com/devlooped/oss/blob/main/src/Directory.Build.targets - sha = 33a20db26e47589769284817b271ce67ea9ccfd8 - etag = 1a3a0151b5771ee97ed8351254ff4c18a0ff568e0df5c33c6830f069bfbb067b + sha = a8b208093599263b7f2d1fe3854634c588ea5199 + etag = 19087699f05396205e6b050d999a43b175bd242f6e8fac86f6df936310178b03 weak [file "src/kzu.snk"] url = https://github.com/devlooped/oss/blob/main/src/kzu.snk @@ -107,8 +107,8 @@ weak [file ".github/release.yml"] url = https://github.com/devlooped/oss/blob/main/.github/release.yml - sha = 1afd173fe8f81b510c597737b0d271218e81fa73 - etag = 482dc2c892fc7ce0cb3a01eb5d9401bee50ddfb067d8cb85873555ce63cf5438 + sha = 0c23e24704625cf75b2cb1fdc566cef7e20af313 + etag = 310df162242c95ed19ed12e3c96a65f77e558b46dced676ad5255eb12caafe75 weak [file ".github/workflows/changelog.config"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/changelog.config @@ -122,13 +122,8 @@ weak [file ".github/workflows/includes.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/includes.yml - sha = d152e7437fd0d6f6d9363d23cb3b78c07335ea49 - etag = ec40db34f379d0c6d83b2ec15624f330318a172cc4f85b5417c63e86eaf601df - weak -[file ".github/workflows/stale.yml"] - url = https://github.com/devlooped/oss/blob/main/.github/workflows/stale.yml - sha = 03b7d535f782ceaf918eeea82ca374bc8c93288a - etag = 1efabca4a7436d756e8d24e616a8ecda54f55b49eab623168149f042131e67d6 + sha = 85829f2510f335f4a411867f3dbaaa116c3ab3de + etag = 086f6b6316cc6ea7089c0dcc6980be519e6ed6e6201e65042ef41b82634ec0ee weak [file ".github/code_of_conduct.md"] url = https://github.com/devlooped/.github/blob/main/.github/code_of_conduct.md @@ -152,8 +147,8 @@ weak [file "profile/readme.md"] url = https://github.com/devlooped/.github/blob/main/profile/readme.md - sha = b53e2d3d36e3715df4d95fe822b3483d37b25173 - etag = 82c23769a59058f3eca88b9987229e301ceda775ab69af6f9add0a88c233d1d0 + sha = e8ece8fce8b22aa649984149b9418ba2739e8c53 + etag = 5c7b850675daacdc2ff8ec0f364b947cc83369a8f9511c13045c0766b8b0611d weak [file "sponsorlink.jwt"] url = https://github.com/devlooped/.github/blob/main/sponsorlink.jwt @@ -165,3 +160,18 @@ sha = 80e81d21c020841dfc8678f218d42ddaffad78db etag = 6ab86c474f24c915681abf4dca6c5becf3a211ab09d11e290385890dadd6f97f weak +[file ".github/workflows/triage.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/triage.yml + sha = 33000c0c4ab4eb4e0e142fa54515b811a189d55c + etag = 013a47739e348f06891f37c45164478cca149854e6cd5c5158e6f073f852b61a + weak +[file "sponsorlink.md"] + url = https://github.com/devlooped/.github/blob/main/sponsorlink.md + sha = d4d500f229a7280920645ecfa25b11929c02bc04 + etag = 22663daef194a796937174446a3390ebdc169a3eba9d46d5e864b7ce46a23771 + weak +[file "sponsorlinkr.md"] + url = https://github.com/devlooped/.github/blob/main/sponsorlinkr.md + sha = a501ccfa743a3d152f6ab06377f71ab22ef4ed9a + etag = efe72da5946abeddf63d0a3063da6ff9c2bc5d13a292ec24ddc2c2e40e0d283f + weak diff --git a/profile/readme.md b/profile/readme.md index 80675a9..651818b 100644 --- a/profile/readme.md +++ b/profile/readme.md @@ -6,7 +6,11 @@ to support my ongoing opensource work. ## Stats +[![NuGet Packages](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fdevlooped%2Fnuget%2Fraw%2Frefs%2Fheads%2Fmain%2FDevlooped.json&query=%24.summary.packages&style=social&logo=nuget&label=packages)](https://www.nuget.org/profiles/devlooped) +[![Daily Downloads](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fdevlooped%2Fnuget%2Fraw%2Frefs%2Fheads%2Fmain%2FDevlooped.json&query=%24.summary.downloads&style=social&logo=nuget&label=daily%20downloads +)](https://www.nuget.org/profiles/devlooped) [![GitHub Sponsors](https://img.shields.io/github/sponsors/devlooped?style=social&logo=githubsponsors)](https://github.com/sponsors/devlooped) + [![GitHub followers](https://img.shields.io/github/followers/kzu?logo=GitHub&label=@kzu%20followers)](https://github.com/kzu) [![GitHub stars](https://img.shields.io/github/stars/kzu?logo=GitHub&label=@kzu%20stars&affiliations=OWNER,COLLABORATOR&color=FFC83D)](https://github.com/kzu) [![GitHub followers](https://img.shields.io/github/followers/devlooped?logo=GitHub&label=@devlooped%20followers)](https://github.com/devlooped) @@ -49,12 +53,14 @@ never issues any messages outside of IDE usage, so it will never disrupt your CI If you arrived here from an IDE and are interested in sponsoring, the (one-time) steps are: -1. Select your [sponsor](https://github.com/sponsors/devlooped) tier 🙏 -1. Install the [sponsor dotnet global tool](https://nuget.org/packages/dotnet-sponsor) by running +1. Select your [sponsor](https://github.com/sponsors/devlooped) tier 🙏. + > If you are an [oss author](https://www.devlooped.com/SponsorLink/github/oss/), you don't have to + sponsor me unless you want to 🫶. +2. Install the [sponsor dotnet global tool](https://nuget.org/packages/dotnet-sponsor) by running ```shell dotnet tool install -g dotnet-sponsor ``` -4. Sync your sponsorship status by running +3. Sync your sponsorship status by running ```shell sponsor sync devlooped ``` @@ -62,20 +68,25 @@ If you arrived here from an IDE and are interested in sponsoring, the (one-time) Feel free to dive deeper into the [technical details](https://www.devlooped.com/SponsorLink/github.html) of how this works. You can also implement SponsorLink yourself with minimal effort for your own projects. -### Implicit or Indirect Sponsorships +### Implicit and Indirect Sponsorships If you have ever sent a PR that was merged into any repository owned by [@devlooped](https://github.com/devlooped), -you are considered a sponsor already! Contributing your time and code is the most awesome way to support a project 🫶. +you are considered an implicit sponsor already! Contributing your time and code is the most awesome way to support a project 🫶. If you belong to an organization that sponsors [@devlooped](https://github.com/sponsors/devlooped), then you are -an indirect sponsor too! This allows organizations to support projects their employees love and streamline invoicing. +an indirect sponsor! This allows organizations to support projects their employees love and streamline invoicing. + +Finally, if you are an open-source author or contributor yourself, chances are you are elegible for an implicit +sponsorship I'll grant automatically! If your account shows up in the [OSS Authors](https://www.devlooped.com/SponsorLink/github/oss/), +you can just sync your implicit sponsorship and continue enjoying my projects with no additional sponsorship needed. +Contributing your valuable time to other projects is great too.
### AutoSync Sponsorships are renewed monthly (even if paid anually), so your dev machine manifest needs monthly renewal too. -You can simplify this process by enabling [autosync](https://www.devlooped.com/SponsorLink/github.html#auto-sync) +You can simplify this process by enabling [autosync](https://www.devlooped.com/SponsorLink/github/#auto-sync) so that the IDE tooling can automatically do this for you by checking at most once a day for expiration and running the same command you'd have to run manually: `sponsor sync devlooped`. @@ -84,6 +95,7 @@ the same command you'd have to run manually: `sponsor sync devlooped`. Active SponsorLink sync usage by sponsorship kind: ![User](https://img.shields.io/endpoint?color=ea4aaa&url=https%3A%2F%2Fsponsorlink.devlooped.com%2Fbadge%3Fuser) -![Organization](https://img.shields.io/endpoint?color=green&url=https%3A%2F%2Fsponsorlink.devlooped.com%2Fbadge%3Forg) +![Organization](https://img.shields.io/endpoint?color=yellow&url=https%3A%2F%2Fsponsorlink.devlooped.com%2Fbadge%3Forg) ![Team](https://img.shields.io/endpoint?color=8A2BE2&url=https%3A%2F%2Fsponsorlink.devlooped.com%2Fbadge%3Fteam) ![Contributor](https://img.shields.io/endpoint?color=blue&url=https%3A%2F%2Fsponsorlink.devlooped.com%2Fbadge%3Fcontrib) +![OSS](https://img.shields.io/endpoint?color=green&url=https%3A%2F%2Fsponsorlink.devlooped.com%2Fbadge%3Foss) diff --git a/sponsorlink.md b/sponsorlink.md new file mode 100644 index 0000000..c90a77f --- /dev/null +++ b/sponsorlink.md @@ -0,0 +1,2 @@ +*This project uses [SponsorLink](https://github.com/devlooped#sponsorlink) +and may issue IDE-only warnings if no active sponsorship is detected.* diff --git a/sponsorlinkr.md b/sponsorlinkr.md new file mode 100644 index 0000000..aa79a1d --- /dev/null +++ b/sponsorlinkr.md @@ -0,0 +1,2 @@ +*This project uses [SponsorLink](https://github.com/devlooped#sponsorlink) to attribute sponsor status (direct, indirect or implicit).* +*For IDE usage, sponsor status is required. IDE-only warnings will be issued after a grace period otherwise.* diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 20d7f0b..6232750 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -34,23 +34,28 @@ + @@ -101,19 +106,17 @@ $(BUDDY_EXECUTION_BRANCH) - - - PrepareResources;$(CoreCompileDependsOn) + + + CoreResGen;$(CoreCompileDependsOn) - + - - - + + - MSBuild:Compile $(IntermediateOutputPath)\$([MSBuild]::ValueOrDefault('%(RelativeDir)', '').Replace('\', '.').Replace('/', '.'))%(Filename).g$(DefaultLanguageSourceExtension) $(Language) $(RootNamespace)