diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index f5a1e43..514ebd5 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -29,12 +29,14 @@ ### Code Style and Formatting #### EditorConfig Rules -The repository uses `.editorconfig` for consistent code style: +The repository uses `.editorconfig` at the repo root for consistent code style. + - **Indentation**: 4 spaces for C# files, 2 spaces for XML/YAML/JSON - **Line endings**: LF (Unix-style) - **Sort using directives**: System.* namespaces first (`dotnet_sort_system_directives_first = true`) - **Type references**: Prefer language keywords over framework type names (`int` vs `Int32`) -- **Modern C# features**: Use object/collection initializers, coalesce expressions when possible +- **Modern C# features**: Use object/collection initializers, coalesce expressions when possible, use var when the type is apparent from the right-hand side of the assignment +- **Visibility modifiers**: only explicitly specify visibility when different from the default (e.g. `public` for classes, no `internal` for classes or `private` for fields, etc.) #### Formatting Validation - CI enforces formatting with `dotnet format whitespace` and `dotnet format style` @@ -48,6 +50,12 @@ The repository uses `.editorconfig` for consistent code style: - **Moq** for mocking dependencies - Located in `src/*.Tests/` +#### Test Attributes +Custom xUnit attributes are sometimes used for conditional test execution: +- `[SecretsFact("XAI_API_KEY")]` - Skips test if required secrets are missing from user secrets or environment variables +- `[LocalFact("SECRET")]` - Runs only locally (skips in CI), requires specified secrets +- `[CIFact]` - Runs only in CI environment + ### Dependency Management #### Adding Dependencies @@ -77,3 +85,10 @@ The repository uses `.editorconfig` for consistent code style: - All PRs must pass format validation - Tests must pass on all target frameworks - Follow existing patterns and conventions in the codebase + +## Documenting Work + +Project implemention details, design and key decisions should be documented in a top-level AGENTS.md file at the repo root. +Keep this file updated whenever you make change significant changes for future reference. + +User-facing features and APIs should be documented to highlight (not extensively, as an overview) key project features and capabilities, in the readme.md file at the repo root. diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 56ff299..99eec76 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -49,7 +49,11 @@ jobs: # if we don't have at least 100 requests left, wait until reset if ($rate.remaining -lt 100) { $wait = ($rate.reset - (Get-Date (Get-Date).ToUniversalTime() -UFormat %s)) - echo "Rate limit remaining is $($rate.remaining), waiting for $($wait / 1000) seconds to reset" + if ($wait -gt 300) { + echo "Rate limit remaining is $($rate.remaining), reset in $wait seconds (more than 5'). Aborting." + exit 1 + } + echo "Rate limit remaining is $($rate.remaining), waiting $wait seconds to reset" sleep $wait $rate = gh api rate_limit | convertfrom-json | select -expandproperty rate echo "Rate limit has reset to $($rate.remaining) requests" diff --git a/.gitignore b/.gitignore index 0fe79fb..dfe1fe0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ BenchmarkDotNet.Artifacts .idea local.settings.json .env +*.local *.suo *.sdf diff --git a/.netconfig b/.netconfig index 312a479..33f7940 100644 --- a/.netconfig +++ b/.netconfig @@ -80,15 +80,15 @@ weak [file ".github/workflows/triage.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/triage.yml - sha = 33000c0c4ab4eb4e0e142fa54515b811a189d55c + sha = 61a602fc61eedbdae235f01e93657a6219ac2427 - etag = 013a47739e348f06891f37c45164478cca149854e6cd5c5158e6f073f852b61a + etag = 152cd3a559c08da14d1da12a5262ba1d2e0ed6bed6d2eabf5bd209b0c35d8a75 weak [file ".gitignore"] url = https://github.com/devlooped/oss/blob/main/.gitignore - sha = 3776526342afb3f57da7e80f2095e5fdca3c31c9 + sha = a225b7a9f609f26bcc24e0d84f663387be251a7d - etag = 11767f73556aa4c6c8bcc153b77ee8e8114f99fa3b885b0a7d66d082f91e77b3 + etag = 20a8b49d57024abbd85aac5b0020c30e5eb68e0384b2761e93727c8780c4a991 weak [file "Directory.Build.rsp"] url = https://github.com/devlooped/oss/blob/main/Directory.Build.rsp @@ -114,15 +114,15 @@ weak [file "src/Directory.Build.props"] url = https://github.com/devlooped/oss/blob/main/src/Directory.Build.props - sha = 0ff8b7b79a82112678326d1dc5543ed890311366 + sha = dd13ed3334135c30dcb1e3b2295dc7622de298d9 - etag = 3ebde0a8630d526b80f15801179116e17a857ff880a4442e7db7b075efa4fd63 + etag = bd05f9f240823c0ac79ddfefe654061550c36f82dd94fa513b82900e92686a5f weak [file "src/Directory.Build.targets"] url = https://github.com/devlooped/oss/blob/main/src/Directory.Build.targets - sha = 4339749ef4b8f66def75931df09ef99c149f8421 + sha = 083a37bd9307ec820bac6ee3c7384083151d36d8 - etag = 8b4492765755c030c4c351e058a92f53ab493cab440c1c0ef431f6635c4dae0e + etag = 907682e5632a2ba430357e6e042a4ca33cb8c94a3a215d3091aa03f5958a4877 weak [file "src/nuget.config"] url = https://github.com/devlooped/oss/blob/main/src/nuget.config @@ -171,3 +171,14 @@ sha = a04684ab2306e5a17bad26d3da69636b326cce14 etag = 7faacded709d2bede93356fd58b93af84884949f3bab098b8b8d121a03696449 weak +[file "readme.tmp.md"] + url = https://github.com/devlooped/oss/blob/main/readme.tmp.md + skip +[file "oss.cs"] + url = https://github.com/devlooped/oss/blob/main/oss.cs + skip +[file ".github/copilot-instructions.md"] + url = https://github.com/devlooped/oss/blob/main/.github/copilot-instructions.md + sha = e616d89d9537c4b8ccf1c20dd277ab82104167c4 + etag = 6ee650d118a57494d3545d54718ccaa5257b09d54504e9c21514fe596edd9678 + weak diff --git a/readme.md b/readme.md index dfb86c0..d07f793 100644 --- a/readme.md +++ b/readme.md @@ -264,12 +264,12 @@ OSMF tier. A single fee covers all of [Devlooped packages](https://www.nuget.org [![Clarius Org](https://avatars.githubusercontent.com/u/71888636?v=4&s=39 "Clarius Org")](https://github.com/clarius) [![MFB Technologies, Inc.](https://avatars.githubusercontent.com/u/87181630?v=4&s=39 "MFB Technologies, Inc.")](https://github.com/MFB-Technologies-Inc) +[![Khamza Davletov](https://avatars.githubusercontent.com/u/13615108?u=11b0038e255cdf9d1940fbb9ae9d1d57115697ab&v=4&s=39 "Khamza Davletov")](https://github.com/khamza85) [![SandRock](https://avatars.githubusercontent.com/u/321868?u=99e50a714276c43ae820632f1da88cb71632ec97&v=4&s=39 "SandRock")](https://github.com/sandrock) [![DRIVE.NET, Inc.](https://avatars.githubusercontent.com/u/15047123?v=4&s=39 "DRIVE.NET, Inc.")](https://github.com/drivenet) [![Keith Pickford](https://avatars.githubusercontent.com/u/16598898?u=64416b80caf7092a885f60bb31612270bffc9598&v=4&s=39 "Keith Pickford")](https://github.com/Keflon) [![Thomas Bolon](https://avatars.githubusercontent.com/u/127185?u=7f50babfc888675e37feb80851a4e9708f573386&v=4&s=39 "Thomas Bolon")](https://github.com/tbolon) [![Kori Francis](https://avatars.githubusercontent.com/u/67574?u=3991fb983e1c399edf39aebc00a9f9cd425703bd&v=4&s=39 "Kori Francis")](https://github.com/kfrancis) -[![Uno Platform](https://avatars.githubusercontent.com/u/52228309?v=4&s=39 "Uno Platform")](https://github.com/unoplatform) [![Reuben Swartz](https://avatars.githubusercontent.com/u/724704?u=2076fe336f9f6ad678009f1595cbea434b0c5a41&v=4&s=39 "Reuben Swartz")](https://github.com/rbnswartz) [![Jacob Foshee](https://avatars.githubusercontent.com/u/480334?v=4&s=39 "Jacob Foshee")](https://github.com/jfoshee) [![](https://avatars.githubusercontent.com/u/33566379?u=bf62e2b46435a267fa246a64537870fd2449410f&v=4&s=39 "")](https://github.com/Mrxx99) @@ -284,12 +284,12 @@ OSMF tier. A single fee covers all of [Devlooped packages](https://www.nuget.org [![4OTC](https://avatars.githubusercontent.com/u/68428092?v=4&s=39 "4OTC")](https://github.com/4OTC) [![domischell](https://avatars.githubusercontent.com/u/66068846?u=0a5c5e2e7d90f15ea657bc660f175605935c5bea&v=4&s=39 "domischell")](https://github.com/DominicSchell) [![Adrian Alonso](https://avatars.githubusercontent.com/u/2027083?u=129cf516d99f5cb2fd0f4a0787a069f3446b7522&v=4&s=39 "Adrian Alonso")](https://github.com/adalon) -[![Michael Hagedorn](https://avatars.githubusercontent.com/u/61711586?u=8f653dfcb641e8c18cc5f78692ebc6bb3a0c92be&v=4&s=39 "Michael Hagedorn")](https://github.com/Eule02) [![torutek](https://avatars.githubusercontent.com/u/33917059?v=4&s=39 "torutek")](https://github.com/torutek) -[![mccaffers](https://avatars.githubusercontent.com/u/16667079?u=f5b761303b6c7a7f18123b5bd20f06760d3fbd3e&v=4&s=39 "mccaffers")](https://github.com/mccaffers) +[![mccaffers](https://avatars.githubusercontent.com/u/16667079?u=110034edf51097a5ee82cb6a94ae5483568e3469&v=4&s=39 "mccaffers")](https://github.com/mccaffers) [![Seika Logiciel](https://avatars.githubusercontent.com/u/2564602?v=4&s=39 "Seika Logiciel")](https://github.com/SeikaLogiciel) [![Andrew Grant](https://avatars.githubusercontent.com/devlooped-user?s=39 "Andrew Grant")](https://github.com/wizardness) [![Lars](https://avatars.githubusercontent.com/u/1727124?v=4&s=39 "Lars")](https://github.com/latonz) +[![prime167](https://avatars.githubusercontent.com/u/3722845?v=4&s=39 "prime167")](https://github.com/prime167) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 29281ee..91e383a 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -166,6 +166,10 @@ + + + + diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 083afa6..a3df56d 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -174,7 +174,7 @@ @@ -184,6 +184,16 @@ + + + + + OSMFEULA.txt + true + + + +