From 98fa59a420e1e2e58694b3677ece7c210e5d9aac Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 18:48:20 +0000 Subject: [PATCH 1/7] Initial plan From 6250a437ff9f9c6f17e3359c9d5b5a6a4cf53057 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 18:52:57 +0000 Subject: [PATCH 2/7] Add VersionMark tool and configuration for capturing tool versions - Add .versionmark.yaml configuration file defining all tools to capture - Add DemaConsulting.VersionMark v0.1.0 to .config/dotnet-tools.json - Add version capture steps to all workflow jobs: - quality-checks: captures dotnet, git, versionmark - build: captures dotnet, git, dotnet-sonarscanner, versionmark - integration-test: captures dotnet, git, versionmark - build-docs: captures all tools used in documentation generation - Add version publishing step in build-docs job to generate versions.md - Add docs/buildnotes/versions.md to buildnotes definition.yaml - Update .gitignore to exclude versionmark-*.json capture files - Add 'versionmark' to .cspell.json dictionary This enables tracking and publishing of tool versions used in each CI/CD job to the Build Notes PDF documentation, providing complete build environment transparency. --- .config/dotnet-tools.json | 6 +++ .cspell.json | 1 + .github/workflows/build.yaml | 96 +++++++++++++++++++++++++++++++++ .gitignore | 4 ++ .versionmark.yaml | 64 ++++++++++++++++++++++ docs/buildnotes/definition.yaml | 1 + 6 files changed, 172 insertions(+) create mode 100644 .versionmark.yaml diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index ef4ca4b..49d7b3a 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -49,6 +49,12 @@ "commands": [ "sarifmark" ] + }, + "demaconsulting.versionmark": { + "version": "0.1.0", + "commands": [ + "versionmark" + ] } } } \ No newline at end of file diff --git a/.cspell.json b/.cspell.json index ef40110..e5522e4 100644 --- a/.cspell.json +++ b/.cspell.json @@ -36,6 +36,7 @@ "snupkg", "tracematrix", "trx", + "versionmark", "Weasyprint", "yamllint" ], diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index af4eb86..2ce3f19 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -19,6 +19,28 @@ jobs: - name: Checkout uses: actions/checkout@v6 + - name: Setup dotnet + uses: actions/setup-dotnet@v5 + with: + dotnet-version: 10.x + + - name: Restore Tools + run: > + dotnet tool restore + + - name: Capture tool versions + shell: bash + run: | + echo "Capturing tool versions..." + dotnet versionmark --capture --job-id "quality" -- dotnet git versionmark + echo "✓ Tool versions captured" + + - name: Upload version capture + uses: actions/upload-artifact@v6 + with: + name: version-capture-quality + path: versionmark-quality.json + - name: Run markdown linter uses: DavidAnson/markdownlint-cli2-action@v22 with: @@ -116,6 +138,23 @@ jobs: --no-restore --property:PackageVersion=${{ inputs.version }} + - name: Capture tool versions + shell: bash + run: | + echo "Capturing tool versions..." + # Create short job ID: build-win, build-ubuntu + OS_SHORT=$(echo "${{ matrix.os }}" | sed 's/windows-latest/win/;s/ubuntu-latest/ubuntu/') + JOB_ID="build-${OS_SHORT}" + dotnet versionmark --capture --job-id "${JOB_ID}" -- \ + dotnet git dotnet-sonarscanner versionmark + echo "✓ Tool versions captured" + + - name: Upload version capture + uses: actions/upload-artifact@v6 + with: + name: version-capture-${{ matrix.os }} + path: versionmark-build-*.json + - name: Upload Test Results uses: actions/upload-artifact@v6 with: @@ -201,6 +240,13 @@ jobs: dotnet-version: ['8.x', '9.x', '10.x'] steps: + - name: Checkout + uses: actions/checkout@v6 + with: + sparse-checkout: | + .versionmark.yaml + .config/dotnet-tools.json + - name: Download package uses: actions/download-artifact@v7 with: @@ -212,6 +258,10 @@ jobs: with: dotnet-version: ${{ matrix.dotnet-version }} + - name: Restore Tools + run: > + dotnet tool restore + - name: Install tool from package shell: bash run: | @@ -243,6 +293,23 @@ jobs: || { echo "✗ Self-validation failed"; exit 1; } echo "✓ Self-validation succeeded" + - name: Capture tool versions + shell: bash + run: | + echo "Capturing tool versions..." + # Create short job ID: int-win-8, int-win-9, int-ubuntu-8, etc. + OS_SHORT=$(echo "${{ matrix.os }}" | sed 's/windows-latest/win/;s/ubuntu-latest/ubuntu/') + DOTNET_SHORT=$(echo "${{ matrix.dotnet-version }}" | sed 's/\.x$//') + JOB_ID="int-${OS_SHORT}-${DOTNET_SHORT}" + dotnet versionmark --capture --job-id "${JOB_ID}" -- dotnet git versionmark + echo "✓ Tool versions captured" + + - name: Upload version capture + uses: actions/upload-artifact@v6 + with: + name: version-capture-${{ matrix.os }}-dotnet${{ matrix.dotnet-version }} + path: versionmark-int-*.json + - name: Upload validation test results if: always() uses: actions/upload-artifact@v6 @@ -307,6 +374,13 @@ jobs: name: codeql-sarif path: codeql-results + - name: Download all version captures + uses: actions/download-artifact@v7 + with: + path: version-captures + pattern: 'version-capture-*' + continue-on-error: true + - name: Generate Requirements Report and Trace Matrix run: > dotnet reqstream @@ -359,6 +433,28 @@ jobs: --report docs/buildnotes.md --report-depth 1 + - name: Capture tool versions for build-docs + shell: bash + run: | + echo "Capturing tool versions..." + dotnet versionmark --capture --job-id "build-docs" -- \ + dotnet git node npm pandoc weasyprint sarifmark sonarmark reqstream buildmark versionmark + echo "✓ Tool versions captured" + + - name: Publish Tool Versions + shell: bash + run: | + echo "Publishing tool versions..." + dotnet versionmark --publish --report docs/buildnotes/versions.md --report-depth 1 \ + -- "versionmark-*.json" "version-captures/**/versionmark-*.json" + echo "✓ Tool versions published" + + - name: Display Tool Versions Report + shell: bash + run: | + echo "=== Tool Versions Report ===" + cat docs/buildnotes/versions.md + - name: Display Build Notes Report shell: bash run: | diff --git a/.gitignore b/.gitignore index 3f49938..aab056b 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,11 @@ docs/quality/sonar-quality.md docs/quality/codeql-quality.md docs/quality/*.html docs/buildnotes.md +docs/buildnotes/versions.md docs/buildnotes/*.html +# VersionMark captures (generated during CI/CD) +versionmark-*.json + # Agent report files AGENT_REPORT_*.md diff --git a/.versionmark.yaml b/.versionmark.yaml new file mode 100644 index 0000000..b8bf259 --- /dev/null +++ b/.versionmark.yaml @@ -0,0 +1,64 @@ +--- +# VersionMark Configuration File +# This file defines which tools to capture and how to extract their version information. + +tools: + # .NET SDK + dotnet: + command: dotnet --version + regex: '(?\d+\.\d+\.\d+(?:\.\d+)?)' + + # Git + git: + command: git --version + regex: '(?i)git version (?\d+\.\d+\.\d+)' + + # Node.js + node: + command: node --version + regex: '(?i)v(?\d+\.\d+\.\d+)' + + # npm + npm: + command: npm --version + regex: '(?\d+\.\d+\.\d+)' + + # SonarScanner for .NET (from dotnet tool list) + dotnet-sonarscanner: + command: dotnet tool list + regex: '(?i)dotnet-sonarscanner\s+(?\d+\.\d+\.\d+)' + + # Pandoc (DemaConsulting.PandocTool from dotnet tool list) + pandoc: + command: dotnet tool list + regex: '(?i)demaconsulting\.pandoctool\s+(?\d+\.\d+\.\d+)' + + # WeasyPrint (DemaConsulting.WeasyPrintTool from dotnet tool list) + weasyprint: + command: dotnet tool list + regex: '(?i)demaconsulting\.weasyprinttool\s+(?\d+\.\d+\.\d+)' + + # SarifMark (DemaConsulting.SarifMark from dotnet tool list) + sarifmark: + command: dotnet tool list + regex: '(?i)demaconsulting\.sarifmark\s+(?\d+\.\d+\.\d+)' + + # SonarMark (DemaConsulting.SonarMark from dotnet tool list) + sonarmark: + command: dotnet tool list + regex: '(?i)demaconsulting\.sonarmark\s+(?\d+\.\d+\.\d+)' + + # ReqStream (DemaConsulting.ReqStream from dotnet tool list) + reqstream: + command: dotnet tool list + regex: '(?i)demaconsulting\.reqstream\s+(?\d+\.\d+\.\d+)' + + # BuildMark (DemaConsulting.BuildMark from dotnet tool list) + buildmark: + command: dotnet tool list + regex: '(?i)demaconsulting\.buildmark\s+(?\d+\.\d+\.\d+)' + + # VersionMark (DemaConsulting.VersionMark from dotnet tool list) + versionmark: + command: dotnet tool list + regex: '(?i)demaconsulting\.versionmark\s+(?\d+\.\d+\.\d+)' diff --git a/docs/buildnotes/definition.yaml b/docs/buildnotes/definition.yaml index d93a4ba..7eb0c4c 100644 --- a/docs/buildnotes/definition.yaml +++ b/docs/buildnotes/definition.yaml @@ -7,6 +7,7 @@ input-files: - docs/buildnotes/title.txt - docs/buildnotes/introduction.md - docs/buildnotes.md + - docs/buildnotes/versions.md template: template.html From 202f8b6c2ed6124f7d3246ea1a37e58522f9775b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 18:54:06 +0000 Subject: [PATCH 3/7] Fix versionmark command formatting for consistency and line length - Remove line continuation in build job versionmark capture (line 148) - Split build-docs versionmark capture into multiple lines to meet 120 char limit - Split versionmark publish command into multiple lines for better readability - Maintain consistent formatting across all versionmark commands in the workflow --- .github/workflows/build.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2ce3f19..e81bee6 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -145,8 +145,7 @@ jobs: # Create short job ID: build-win, build-ubuntu OS_SHORT=$(echo "${{ matrix.os }}" | sed 's/windows-latest/win/;s/ubuntu-latest/ubuntu/') JOB_ID="build-${OS_SHORT}" - dotnet versionmark --capture --job-id "${JOB_ID}" -- \ - dotnet git dotnet-sonarscanner versionmark + dotnet versionmark --capture --job-id "${JOB_ID}" -- dotnet git dotnet-sonarscanner versionmark echo "✓ Tool versions captured" - name: Upload version capture @@ -438,14 +437,17 @@ jobs: run: | echo "Capturing tool versions..." dotnet versionmark --capture --job-id "build-docs" -- \ - dotnet git node npm pandoc weasyprint sarifmark sonarmark reqstream buildmark versionmark + dotnet git node npm pandoc weasyprint \ + sarifmark sonarmark reqstream buildmark versionmark echo "✓ Tool versions captured" - name: Publish Tool Versions shell: bash run: | echo "Publishing tool versions..." - dotnet versionmark --publish --report docs/buildnotes/versions.md --report-depth 1 \ + dotnet versionmark --publish \ + --report docs/buildnotes/versions.md \ + --report-depth 1 \ -- "versionmark-*.json" "version-captures/**/versionmark-*.json" echo "✓ Tool versions published" From 6296a8c72cfe1d30beac53c0adb74c05f709cc12 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 18:54:53 +0000 Subject: [PATCH 4/7] Fix YAML formatting: simplify single-command run statements - Change 'run: >' to simple 'run:' for single-line dotnet tool restore commands - Improves consistency with other single-command steps in the workflow - Addresses code review feedback on YAML style inconsistencies --- .github/workflows/build.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index e81bee6..c6d2c9f 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -25,8 +25,7 @@ jobs: dotnet-version: 10.x - name: Restore Tools - run: > - dotnet tool restore + run: dotnet tool restore - name: Capture tool versions shell: bash @@ -258,8 +257,7 @@ jobs: dotnet-version: ${{ matrix.dotnet-version }} - name: Restore Tools - run: > - dotnet tool restore + run: dotnet tool restore - name: Install tool from package shell: bash From 3520d28ed58fbed8b413a6d4448c5f399d8298f8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 18:55:45 +0000 Subject: [PATCH 5/7] Add clarifying comments for version capture patterns - Document that .NET SDK versions include up to 4 components - Explain why versionmark captures its own version (complete tool transparency) - Addresses code review feedback on regex patterns and self-capture rationale --- .github/workflows/build.yaml | 1 + .versionmark.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c6d2c9f..2a5d4e5 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -31,6 +31,7 @@ jobs: shell: bash run: | echo "Capturing tool versions..." + # Capture versionmark itself for complete tool transparency dotnet versionmark --capture --job-id "quality" -- dotnet git versionmark echo "✓ Tool versions captured" diff --git a/.versionmark.yaml b/.versionmark.yaml index b8bf259..b1b400c 100644 --- a/.versionmark.yaml +++ b/.versionmark.yaml @@ -4,6 +4,7 @@ tools: # .NET SDK + # Note: .NET SDK versions include up to 4 components (e.g., 10.0.102, 8.0.404) dotnet: command: dotnet --version regex: '(?\d+\.\d+\.\d+(?:\.\d+)?)' From 3a09c6fcb1e67ad64617873a3e37ea80b6ba0d33 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:25:38 +0000 Subject: [PATCH 6/7] Fix BuildMark version capture to use --global flag Co-authored-by: Malcolmnixon <1863707+Malcolmnixon@users.noreply.github.com> --- .github/workflows/build.yaml | 2 +- .versionmark.yaml | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2a5d4e5..1393d4c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -299,7 +299,7 @@ jobs: OS_SHORT=$(echo "${{ matrix.os }}" | sed 's/windows-latest/win/;s/ubuntu-latest/ubuntu/') DOTNET_SHORT=$(echo "${{ matrix.dotnet-version }}" | sed 's/\.x$//') JOB_ID="int-${OS_SHORT}-${DOTNET_SHORT}" - dotnet versionmark --capture --job-id "${JOB_ID}" -- dotnet git versionmark + dotnet versionmark --capture --job-id "${JOB_ID}" -- dotnet git buildmark versionmark echo "✓ Tool versions captured" - name: Upload version capture diff --git a/.versionmark.yaml b/.versionmark.yaml index b1b400c..3cc1e5d 100644 --- a/.versionmark.yaml +++ b/.versionmark.yaml @@ -54,9 +54,10 @@ tools: command: dotnet tool list regex: '(?i)demaconsulting\.reqstream\s+(?\d+\.\d+\.\d+)' - # BuildMark (DemaConsulting.BuildMark from dotnet tool list) + # BuildMark (DemaConsulting.BuildMark from dotnet tool list --global) + # Note: BuildMark is installed globally in integration-test and build-docs jobs buildmark: - command: dotnet tool list + command: dotnet tool list --global regex: '(?i)demaconsulting\.buildmark\s+(?\d+\.\d+\.\d+)' # VersionMark (DemaConsulting.VersionMark from dotnet tool list) From 54266907d35f98e4066c50c74f4cb985d2daf9e2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:26:06 +0000 Subject: [PATCH 7/7] Remove BuildMark from integration-test version capture Co-authored-by: Malcolmnixon <1863707+Malcolmnixon@users.noreply.github.com> --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1393d4c..2a5d4e5 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -299,7 +299,7 @@ jobs: OS_SHORT=$(echo "${{ matrix.os }}" | sed 's/windows-latest/win/;s/ubuntu-latest/ubuntu/') DOTNET_SHORT=$(echo "${{ matrix.dotnet-version }}" | sed 's/\.x$//') JOB_ID="int-${OS_SHORT}-${DOTNET_SHORT}" - dotnet versionmark --capture --job-id "${JOB_ID}" -- dotnet git buildmark versionmark + dotnet versionmark --capture --job-id "${JOB_ID}" -- dotnet git versionmark echo "✓ Tool versions captured" - name: Upload version capture