diff --git a/.github/agents/test-developer.md b/.github/agents/test-developer.md
index 02a40c9..e90725f 100644
--- a/.github/agents/test-developer.md
+++ b/.github/agents/test-developer.md
@@ -123,6 +123,15 @@ Common anti-patterns to avoid (not exhaustive):
// ✅ Good: Assert.HasCount(3, collection);
```
+5. **Avoid Assert.IsTrue for string prefix checks** - Use `Assert.StartsWith` instead of wrapping
+ `string.StartsWith` in `Assert.IsTrue`, as it produces clearer failure messages that show the expected prefix
+ and actual value:
+
+ ```csharp
+ // ❌ Bad: Assert.IsTrue(value.StartsWith("prefix"));
+ // ✅ Good: Assert.StartsWith("prefix", value);
+ ```
+
## Defer To
- **Requirements Agent**: For test strategy and coverage requirements
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 623d004..85c3d96 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -20,3 +20,7 @@ updates:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 10
+ groups:
+ github-actions-dependencies:
+ patterns:
+ - "*"
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index cc89e2f..3a57173 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -122,13 +122,13 @@ jobs:
--property:PackageVersion=${{ inputs.version }}
- name: Upload Test Results
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7
with:
name: test-results-${{ matrix.os }}
path: test-results/*.trx
- name: Upload Artifacts
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7
with:
name: artifacts-${{ matrix.os }}
path: |
@@ -190,7 +190,7 @@ jobs:
upload: false
- name: Upload CodeQL SARIF
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7
with:
name: codeql-sarif
path: sarif-results/csharp.sarif
@@ -215,7 +215,7 @@ jobs:
uses: actions/checkout@v6
- name: Download package
- uses: actions/download-artifact@v7
+ uses: actions/download-artifact@v8
with:
name: artifacts-${{ matrix.os }}
path: packages
@@ -269,13 +269,13 @@ jobs:
- name: Upload validation test results
if: always()
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7
with:
name: validation-test-results-${{ matrix.os }}-dotnet${{ matrix.dotnet-version }}
path: validation-${{ matrix.os }}-dotnet${{ matrix.dotnet-version }}.trx
- name: Upload version capture
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7
with:
name: version-capture-${{ matrix.os }}-dotnet${{ matrix.dotnet-version }}
path: versionmark-int-*.json
@@ -299,26 +299,26 @@ jobs:
node-version: 'lts/*'
- name: Download all test results
- uses: actions/download-artifact@v7
+ uses: actions/download-artifact@v8
with:
path: test-results
pattern: '*test-results*'
continue-on-error: true
- name: Download VersionMark package
- uses: actions/download-artifact@v7
+ uses: actions/download-artifact@v8
with:
name: artifacts-windows-latest
path: packages
- name: Download CodeQL SARIF
- uses: actions/download-artifact@v7
+ uses: actions/download-artifact@v8
with:
name: codeql-sarif
path: codeql-results
- name: Download all version captures
- uses: actions/download-artifact@v7
+ uses: actions/download-artifact@v8
with:
path: version-captures
pattern: 'version-capture-*'
@@ -522,7 +522,7 @@ jobs:
"docs/VersionMark Trace Matrix.pdf"
- name: Upload documentation
- uses: actions/upload-artifact@v6
+ uses: actions/upload-artifact@v7
with:
name: documents
path: |
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index bf33269..821a753 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -52,13 +52,13 @@ jobs:
10.x
- name: Download package artifacts
- uses: actions/download-artifact@v7
+ uses: actions/download-artifact@v8
with:
name: artifacts-ubuntu-latest
path: artifacts
- name: Download documents artifact
- uses: actions/download-artifact@v7
+ uses: actions/download-artifact@v8
with:
name: documents
path: artifacts
diff --git a/README.md b/README.md
index 332337c..a8e0a51 100644
--- a/README.md
+++ b/README.md
@@ -204,6 +204,8 @@ Generated documentation includes:
Copyright (c) DEMA Consulting. Licensed under the MIT License. See [LICENSE][link-license] for details.
+By contributing to this project, you agree that your contributions will be licensed under the MIT License.
+
[badge-forks]: https://img.shields.io/github/forks/demaconsulting/VersionMark?style=plastic
[badge-stars]: https://img.shields.io/github/stars/demaconsulting/VersionMark?style=plastic
diff --git a/src/DemaConsulting.VersionMark/Context.cs b/src/DemaConsulting.VersionMark/Context.cs
index 414c1de..70d1405 100644
--- a/src/DemaConsulting.VersionMark/Context.cs
+++ b/src/DemaConsulting.VersionMark/Context.cs
@@ -120,6 +120,7 @@ private Context()
/// Thrown when arguments are invalid.
public static Context Create(string[] args)
{
+ ArgumentNullException.ThrowIfNull(args);
var parser = new ArgumentParser();
parser.ParseArguments(args);
@@ -249,6 +250,7 @@ private sealed class ArgumentParser
/// Command-line arguments.
public void ParseArguments(string[] args)
{
+ ArgumentNullException.ThrowIfNull(args);
int i = 0;
while (i < args.Length)
{
diff --git a/src/DemaConsulting.VersionMark/DemaConsulting.VersionMark.csproj b/src/DemaConsulting.VersionMark/DemaConsulting.VersionMark.csproj
index a6cbcda..b44b2ee 100644
--- a/src/DemaConsulting.VersionMark/DemaConsulting.VersionMark.csproj
+++ b/src/DemaConsulting.VersionMark/DemaConsulting.VersionMark.csproj
@@ -3,7 +3,7 @@
Exe
net8.0;net9.0;net10.0
- 12
+ latest
enable
enable
@@ -34,7 +34,7 @@
true
- True
+ true
true
true
latest
@@ -49,13 +49,25 @@
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/src/DemaConsulting.VersionMark/Validation.cs b/src/DemaConsulting.VersionMark/Validation.cs
index 63f54eb..0e4f226 100644
--- a/src/DemaConsulting.VersionMark/Validation.cs
+++ b/src/DemaConsulting.VersionMark/Validation.cs
@@ -34,6 +34,8 @@ internal static class Validation
/// The context containing command line arguments and program state.
public static void Run(Context context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
// Print validation header
PrintValidationHeader(context);
diff --git a/test/DemaConsulting.VersionMark.Tests/DemaConsulting.VersionMark.Tests.csproj b/test/DemaConsulting.VersionMark.Tests/DemaConsulting.VersionMark.Tests.csproj
index f664f86..d2b960a 100644
--- a/test/DemaConsulting.VersionMark.Tests/DemaConsulting.VersionMark.Tests.csproj
+++ b/test/DemaConsulting.VersionMark.Tests/DemaConsulting.VersionMark.Tests.csproj
@@ -1,7 +1,7 @@
net8.0;net9.0;net10.0
- 12
+ latest
enable
enable
true
@@ -11,7 +11,7 @@
false
true
- True
+ true
@@ -23,10 +23,10 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive