From 2dbe6fd466c66ce2c5bfedf9d4e48a8b6c98af02 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 01:05:04 -0700 Subject: [PATCH 01/73] feat(ci): require test results in strict mode --- scripts/__tests__/generate-ci-summary.test.js | 9 +++++++++ scripts/generate-ci-summary.ts | 7 ++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/scripts/__tests__/generate-ci-summary.test.js b/scripts/__tests__/generate-ci-summary.test.js index 6a88b3b4..c4fa33c4 100644 --- a/scripts/__tests__/generate-ci-summary.test.js +++ b/scripts/__tests__/generate-ci-summary.test.js @@ -332,6 +332,15 @@ test('ignores stale JUnit files outside artifacts path', async () => { await fs.rm(stalePath, { force: true }); }); +test('throws when no JUnit files found and strict mode enabled', async () => { + await fs.rm('artifacts', { recursive: true, force: true }); + const env = { ...process.env, REQUIRE_TEST_RESULTS: '1', RUNNER_OS: 'Linux' }; + await assert.rejects( + execFileP('node_modules/.bin/tsx', ['scripts/generate-ci-summary.ts'], { env }), + /No JUnit files found/, + ); +}); + test('partitions requirement groups by runner_type', async () => { const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'partition-')); const junitPath = path.join(dir, 'junit.xml'); diff --git a/scripts/generate-ci-summary.ts b/scripts/generate-ci-summary.ts index cc74742b..96283854 100644 --- a/scripts/generate-ci-summary.ts +++ b/scripts/generate-ci-summary.ts @@ -38,9 +38,14 @@ async function main() { const single = process.env.TEST_RESULTS_GLOB || 'artifacts/**/*junit*.xml'; junitFiles = await glob(single, { nodir: true }); } + const requireResults = !!process.env.REQUIRE_TEST_RESULTS; let tests: TestCase[] = []; if (junitFiles.length === 0) { - console.warn('No JUnit files found; writing empty summary.'); + const msg = 'No JUnit files found'; + if (requireResults) { + throw new Error(msg); + } + console.warn(`${msg}; writing empty summary.`); } else { tests = await collectTestCases(junitFiles, evidenceDir, osType); } From 31f524088598254e940699bd5960780e1f82339b Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 01:15:40 -0700 Subject: [PATCH 02/73] feat: fail verify-docs when input table missing --- scripts/verify-docs.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/scripts/verify-docs.ts b/scripts/verify-docs.ts index 46eb6ea7..a27bc7c5 100644 --- a/scripts/verify-docs.ts +++ b/scripts/verify-docs.ts @@ -11,7 +11,9 @@ interface DocEntry { async function parseDoc(md: string): Promise> { const lines = md.split(/\r?\n/); const start = lines.findIndex((l) => l.trim().startsWith('| Input |')); - if (start === -1) return {}; + if (start === -1) { + throw new Error("missing 'Input' table"); + } const headers = lines[start].split('|').slice(1, -1).map((h) => h.trim().toLowerCase()); const colIndex: Record = {}; headers.forEach((h, i) => (colIndex[h] = i)); @@ -50,7 +52,15 @@ async function main() { } const actionYaml = yaml.load(await fs.readFile(file, 'utf8')) as any; const inputs = actionYaml.inputs ?? {}; - const docTable = await parseDoc(await fs.readFile(docPath, 'utf8')); + let docTable: Record; + try { + docTable = await parseDoc(await fs.readFile(docPath, 'utf8')); + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + console.error(`${action}: ${msg}`); + errors = true; + continue; + } for (const [name, props] of Object.entries(inputs)) { if (!(name in docTable)) { console.error(`${action}: input '${name}' missing from docs`); From b309c9f04619e94053bce67b501ce025aab6e59e Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 01:29:29 -0700 Subject: [PATCH 03/73] refactor action wrappers to use common dispatch script --- actions/common-dispatch.ps1 | 23 +++++++++++++++++++++++ add-token-to-labview/action.yml | 4 ++-- apply-vipc/action.yml | 4 ++-- build-lvlibp/action.yml | 4 ++-- build-vi-package/action.yml | 4 ++-- build/action.yml | 4 ++-- close-labview/action.yml | 4 ++-- generate-release-notes/action.yml | 4 ++-- missing-in-project/action.yml | 4 ++-- modify-vipb-display-info/action.yml | 4 ++-- prepare-labview-source/action.yml | 4 ++-- rename-file/action.yml | 4 ++-- restore-setup-lv-source/action.yml | 4 ++-- revert-development-mode/action.yml | 4 ++-- run-pester-tests/action.yml | 4 ++-- run-unit-tests/action.yml | 4 ++-- set-development-mode/action.yml | 4 ++-- 17 files changed, 55 insertions(+), 32 deletions(-) create mode 100644 actions/common-dispatch.ps1 diff --git a/actions/common-dispatch.ps1 b/actions/common-dispatch.ps1 new file mode 100644 index 00000000..35968216 --- /dev/null +++ b/actions/common-dispatch.ps1 @@ -0,0 +1,23 @@ +#requires -Version 7.0 +param( + [Parameter(Mandatory)] [string] $ActionName, + [Parameter()] [hashtable] $Args = @{}, + [Parameter()] [ValidateSet('ERROR','WARN','INFO','DEBUG')] [string] $LogLevel = 'INFO', + [switch] $DryRun, + [string] $WorkingDirectory +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +$invokeParams = @{ + ActionName = $ActionName + ArgsHashtable = $Args + LogLevel = $LogLevel +} +if ($DryRun) { $invokeParams['DryRun'] = $true } +if ($WorkingDirectory) { $invokeParams['WorkingDirectory'] = $WorkingDirectory } + +$script = Join-Path $PSScriptRoot 'Invoke-OSAction.ps1' +& $script @invokeParams +if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/add-token-to-labview/action.yml b/add-token-to-labview/action.yml index 0933b904..de9f062b 100644 --- a/add-token-to-labview/action.yml +++ b/add-token-to-labview/action.yml @@ -39,11 +39,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'add-token-to-labview' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/apply-vipc/action.yml b/apply-vipc/action.yml index e72c5041..e12a11d4 100644 --- a/apply-vipc/action.yml +++ b/apply-vipc/action.yml @@ -47,11 +47,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'apply-vipc' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/build-lvlibp/action.yml b/build-lvlibp/action.yml index 80a38478..00fb9133 100644 --- a/build-lvlibp/action.yml +++ b/build-lvlibp/action.yml @@ -67,11 +67,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'build-lvlibp' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/build-vi-package/action.yml b/build-vi-package/action.yml index 2049b4d4..69fb49e0 100644 --- a/build-vi-package/action.yml +++ b/build-vi-package/action.yml @@ -75,11 +75,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'build-vi-package' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/build/action.yml b/build/action.yml index f52090b3..8c341482 100644 --- a/build/action.yml +++ b/build/action.yml @@ -63,11 +63,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'build' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/close-labview/action.yml b/close-labview/action.yml index b44016ad..939a36fc 100644 --- a/close-labview/action.yml +++ b/close-labview/action.yml @@ -35,11 +35,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'close-labview' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/generate-release-notes/action.yml b/generate-release-notes/action.yml index 4c88a17a..ba90057e 100644 --- a/generate-release-notes/action.yml +++ b/generate-release-notes/action.yml @@ -30,11 +30,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'generate-release-notes' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/missing-in-project/action.yml b/missing-in-project/action.yml index 4c9c8744..269b8730 100644 --- a/missing-in-project/action.yml +++ b/missing-in-project/action.yml @@ -39,11 +39,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'missing-in-project' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/modify-vipb-display-info/action.yml b/modify-vipb-display-info/action.yml index 5ab599af..3ea75f88 100644 --- a/modify-vipb-display-info/action.yml +++ b/modify-vipb-display-info/action.yml @@ -75,11 +75,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'modify-vipb-display-info' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/prepare-labview-source/action.yml b/prepare-labview-source/action.yml index cc119e1b..78779d1e 100644 --- a/prepare-labview-source/action.yml +++ b/prepare-labview-source/action.yml @@ -47,11 +47,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'prepare-labview-source' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/rename-file/action.yml b/rename-file/action.yml index a0832bb7..8c64b2e4 100644 --- a/rename-file/action.yml +++ b/rename-file/action.yml @@ -35,11 +35,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'rename-file' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/restore-setup-lv-source/action.yml b/restore-setup-lv-source/action.yml index e68fc15e..80df8b12 100644 --- a/restore-setup-lv-source/action.yml +++ b/restore-setup-lv-source/action.yml @@ -47,11 +47,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'restore-setup-lv-source' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/revert-development-mode/action.yml b/revert-development-mode/action.yml index bb741f4c..ad965004 100644 --- a/revert-development-mode/action.yml +++ b/revert-development-mode/action.yml @@ -29,11 +29,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'revert-development-mode' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/run-pester-tests/action.yml b/run-pester-tests/action.yml index f04ff47e..e602e639 100644 --- a/run-pester-tests/action.yml +++ b/run-pester-tests/action.yml @@ -24,11 +24,11 @@ runs: } $params = @{ ActionName = 'run-pester-tests' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/run-unit-tests/action.yml b/run-unit-tests/action.yml index 6fbdfbdc..b31bc1ab 100644 --- a/run-unit-tests/action.yml +++ b/run-unit-tests/action.yml @@ -35,11 +35,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'run-unit-tests' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } diff --git a/set-development-mode/action.yml b/set-development-mode/action.yml index e3f1a808..2f0fb7cd 100644 --- a/set-development-mode/action.yml +++ b/set-development-mode/action.yml @@ -29,11 +29,11 @@ runs: if ('${{ inputs.gcli_path }}') { $args['gcliPath'] = '${{ inputs.gcli_path }}' } $params = @{ ActionName = 'set-development-mode' - ArgsJson = $args + Args = $args LogLevel = '${{ inputs.log_level }}' } if ('${{ inputs.dry_run }}' -eq 'true') { $params['DryRun'] = $true } if ('${{ inputs.working_directory }}') { $params['WorkingDirectory'] = '${{ inputs.working_directory }}' } - $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'Invoke-OSAction.ps1' + $script = Join-Path $env:GITHUB_ACTION_PATH '..' 'actions' 'common-dispatch.ps1' & $script @params if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } From cdb2701f3afe0d65f0969590fb48647520008394 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 01:48:40 -0700 Subject: [PATCH 04/73] Handle zipped JUnit results --- package-lock.json | 10 +++++ package.json | 1 + scripts/__tests__/generate-ci-summary.test.js | 32 +++++++++++++ scripts/generate-ci-summary.ts | 45 ++++++++++++++++--- 4 files changed, 81 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7bcbbbff..c070955a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { + "adm-zip": "^0.5.10", "glob": "^10.3.10", "js-yaml": "^4.1.0", "xml2js": "^0.6.2" @@ -633,6 +634,15 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", diff --git a/package.json b/package.json index fec2dadc..5c0786a3 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "link:check": "markdown-link-check -q -c .markdown-link-check.json README.md $(find docs scripts -name '*.md')" }, "dependencies": { + "adm-zip": "^0.5.10", "glob": "^10.3.10", "js-yaml": "^4.1.0", "xml2js": "^0.6.2" diff --git a/scripts/__tests__/generate-ci-summary.test.js b/scripts/__tests__/generate-ci-summary.test.js index c4fa33c4..9e5d9dc5 100644 --- a/scripts/__tests__/generate-ci-summary.test.js +++ b/scripts/__tests__/generate-ci-summary.test.js @@ -6,6 +6,7 @@ import os from 'node:os'; import { fileURLToPath } from 'node:url'; import { execFile } from 'node:child_process'; import { promisify } from 'node:util'; +import AdmZip from 'adm-zip'; import { collectTestCases } from '../summary/tests.ts'; import { loadRequirements, mapToRequirements } from '../summary/requirements.ts'; import { groupToMarkdown, summaryToMarkdown, requirementsSummaryToMarkdown, buildSummary, computeStatusCounts } from '../summary/index.ts'; @@ -381,3 +382,34 @@ test('partitions requirement groups by runner_type', async () => { await fs.rm(dir, { recursive: true, force: true }); await fs.rm('artifacts', { recursive: true, force: true }); }); + +test('handles zipped JUnit artifacts', async () => { + const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'zip-')); + const zip = new AdmZip(); + const xml = ''; + zip.addFile('junit.xml', Buffer.from(xml)); + const zipPath = path.join(tmp, 'junit.zip'); + zip.writeZip(zipPath); + await fs.mkdir(path.join(tmp, 'evidence')); + + await fs.rm('artifacts', { recursive: true, force: true }); + + const reqPath = fileURLToPath(new URL('../../requirements.json', import.meta.url)); + const dispPath = fileURLToPath(new URL('../../dispatchers.json', import.meta.url)); + const env = { + ...process.env, + TEST_RESULTS_GLOBS: zipPath, + EVIDENCE_DIR: path.join(tmp, 'evidence'), + REQ_MAPPING_FILE: reqPath, + DISPATCHER_REGISTRY: dispPath, + RUNNER_OS: 'Linux', + }; + + await execFileP('node_modules/.bin/tsx', ['scripts/generate-ci-summary.ts'], { env }); + + const summary = await fs.readFile(path.join('artifacts', 'linux', 'requirements-summary.md'), 'utf8'); + assert.match(summary, /REQ-001/); + + await fs.rm('artifacts', { recursive: true, force: true }); + await fs.rm(tmp, { recursive: true, force: true }); +}); diff --git a/scripts/generate-ci-summary.ts b/scripts/generate-ci-summary.ts index 96283854..b6abedab 100644 --- a/scripts/generate-ci-summary.ts +++ b/scripts/generate-ci-summary.ts @@ -2,8 +2,10 @@ import fs from 'fs/promises'; import { constants as fsConstants } from 'fs'; import path from 'path'; +import os from 'os'; import { pathToFileURL } from 'url'; import { glob } from 'glob'; +import AdmZip from 'adm-zip'; import { writeErrorSummary } from './error-handler.ts'; import { buildSummary, @@ -38,16 +40,45 @@ async function main() { const single = process.env.TEST_RESULTS_GLOB || 'artifacts/**/*junit*.xml'; junitFiles = await glob(single, { nodir: true }); } + + let extractedDir: string | null = null; + const expanded: string[] = []; + for (const f of junitFiles) { + if (f.toLowerCase().endsWith('.zip')) { + if (!extractedDir) { + extractedDir = await fs.mkdtemp(path.join(os.tmpdir(), 'junit-')); + } + try { + const zip = new AdmZip(f); + for (const entry of zip.getEntries()) { + if (!entry.isDirectory && entry.entryName.toLowerCase().endsWith('.xml')) { + const dest = path.join(extractedDir, path.basename(entry.entryName)); + await fs.writeFile(dest, entry.getData()); + expanded.push(dest); + } + } + } catch (err) { + console.warn(`Failed to extract JUnit archive ${f}:`, err); + } + } else { + expanded.push(f); + } + } + junitFiles = expanded; const requireResults = !!process.env.REQUIRE_TEST_RESULTS; let tests: TestCase[] = []; - if (junitFiles.length === 0) { - const msg = 'No JUnit files found'; - if (requireResults) { - throw new Error(msg); + try { + if (junitFiles.length === 0) { + const msg = 'No JUnit files found'; + if (requireResults) { + throw new Error(msg); + } + console.warn(`${msg}; writing empty summary.`); + } else { + tests = await collectTestCases(junitFiles, evidenceDir, osType); } - console.warn(`${msg}; writing empty summary.`); - } else { - tests = await collectTestCases(junitFiles, evidenceDir, osType); + } finally { + if (extractedDir) await fs.rm(extractedDir, { recursive: true, force: true }); } const { map, meta } = await loadRequirements(mappingFile); const groups = mapToRequirements(tests, map, meta); From 98a44e85f477e427dd8a6650337973de9d2ee184 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 01:58:22 -0700 Subject: [PATCH 05/73] feat: surface missing requirement mappings --- docs/requirements.md | 2 + scripts/__tests__/generate-ci-summary.test.js | 51 +++++++++++++++++++ scripts/generate-ci-summary.ts | 8 +++ 3 files changed, 61 insertions(+) diff --git a/docs/requirements.md b/docs/requirements.md index 21498d18..c1f96a47 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -2,6 +2,8 @@ This project tracks high‑level requirements and maps each one to the Pester test files that verify it. The authoritative mapping is stored in [`requirements.json`](../requirements.json); the table below provides a human‑readable summary for quick reference. +If every test maps to `Unmapped`, the `scripts/generate-ci-summary.ts` script logs a warning. Set `REQUIRE_REQUIREMENTS_MAPPING` in the environment to treat this situation as an error. + Runner Type indicates whether a requirement runs on a standard GitHub-hosted image or an integration runner with preinstalled tooling. See [runner-types](runner-types.md) for guidance on choosing between them. | ID | Description | Tests | Runner | Runner Type | Skip Dry Run | diff --git a/scripts/__tests__/generate-ci-summary.test.js b/scripts/__tests__/generate-ci-summary.test.js index 9e5d9dc5..0e017123 100644 --- a/scripts/__tests__/generate-ci-summary.test.js +++ b/scripts/__tests__/generate-ci-summary.test.js @@ -313,6 +313,57 @@ test('skips invalid JUnit files and still generates summary', async () => { await fs.rm('artifacts', { recursive: true, force: true }); }); +test('warns when all tests are unmapped', async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'unmapped-')); + const junitPath = path.join(dir, 'junit.xml'); + await fs.writeFile(junitPath, ''); + const reqPath = path.join(dir, 'req.json'); + await fs.writeFile(reqPath, JSON.stringify({ requirements: [] })); + + await fs.rm('artifacts', { recursive: true, force: true }); + + const env = { + ...process.env, + TEST_RESULTS_GLOBS: junitPath, + EVIDENCE_DIR: dir, + REQ_MAPPING_FILE: reqPath, + RUNNER_OS: 'Linux', + }; + + const { stderr } = await execFileP('node_modules/.bin/tsx', ['scripts/generate-ci-summary.ts'], { env }); + assert.match(stderr, /All tests are unmapped/); + + await fs.rm(dir, { recursive: true, force: true }); + await fs.rm('artifacts', { recursive: true, force: true }); +}); + +test('errors when strict unmapped mode enabled', async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'unmapped-')); + const junitPath = path.join(dir, 'junit.xml'); + await fs.writeFile(junitPath, ''); + const reqPath = path.join(dir, 'req.json'); + await fs.writeFile(reqPath, JSON.stringify({ requirements: [] })); + + await fs.rm('artifacts', { recursive: true, force: true }); + + const env = { + ...process.env, + TEST_RESULTS_GLOBS: junitPath, + EVIDENCE_DIR: dir, + REQ_MAPPING_FILE: reqPath, + RUNNER_OS: 'Linux', + REQUIRE_REQUIREMENTS_MAPPING: '1', + }; + + await assert.rejects( + execFileP('node_modules/.bin/tsx', ['scripts/generate-ci-summary.ts'], { env }), + /All tests are unmapped/, + ); + + await fs.rm(dir, { recursive: true, force: true }); + await fs.rm('artifacts', { recursive: true, force: true }); +}); + test('ignores stale JUnit files outside artifacts path', async () => { await fs.rm('artifacts', { recursive: true, force: true }); const freshDir = path.join('artifacts', 'current'); diff --git a/scripts/generate-ci-summary.ts b/scripts/generate-ci-summary.ts index b6abedab..ddf9a7bd 100644 --- a/scripts/generate-ci-summary.ts +++ b/scripts/generate-ci-summary.ts @@ -82,6 +82,14 @@ async function main() { } const { map, meta } = await loadRequirements(mappingFile); const groups = mapToRequirements(tests, map, meta); + const allUnmapped = groups.every(g => g.id === 'Unmapped'); + if (allUnmapped) { + const msg = 'All tests are unmapped; verify requirements mapping.'; + if (process.env.REQUIRE_REQUIREMENTS_MAPPING) { + throw new Error(msg); + } + console.warn(msg); + } const totals = buildSummary(groups); const outDir = path.join('artifacts', osType); From abe7d5e4205ea0bca30e94595ea011b12adcdca3 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 02:08:47 -0700 Subject: [PATCH 06/73] ci: remove setup info artifact --- .github/workflows/ci.json | 13 ------------- .github/workflows/ci.yml | 23 ----------------------- 2 files changed, 36 deletions(-) diff --git a/.github/workflows/ci.json b/.github/workflows/ci.json index 1981b60a..764d0a16 100644 --- a/.github/workflows/ci.json +++ b/.github/workflows/ci.json @@ -115,19 +115,6 @@ "shell": "pwsh", "run": "$required = [Version]'7.5.1'\nif ($PSVersionTable.PSVersion -lt $required) {\n $msiUrl = 'https://github.com/PowerShell/PowerShell/releases/download/v7.5.1/PowerShell-7.5.1-win-x64.msi'\n $msiPath = Join-Path $env:RUNNER_TEMP 'PowerShell-7.5.1-win-x64.msi'\n Invoke-WebRequest -Uri $msiUrl -OutFile $msiPath\n $expectedHash = 'b110eccaf55bb53ae5e6b6de478587ed8203570b0bda9bd374a0998e24d4033a'\n $actualHash = (Get-FileHash $msiPath -Algorithm SHA256).Hash\n if ($actualHash -ne $expectedHash) {\n throw \"SHA256 mismatch: $actualHash\"\n }\n Start-Process msiexec -Wait -ArgumentList '/i', $msiPath, '/qn', 'ADD_PATH=1'\n}\n$version = (pwsh --version).Trim() -replace '^PowerShell '\nif ([Version]$version -lt $required) {\n throw \"PowerShell version $version is less than $required\"\n}\n" }, - { - "name": "Capture setup info", - "shell": "pwsh", - "run": "$data = [ordered]@{\n 'Current runner version' = $env:RUNNER_VERSION\n 'Runner Image' = $env:ImageOS\n 'ImageVersion' = $env:ImageVersion\n 'RUNNER_NAME' = $env:RUNNER_NAME\n 'RUNNER_OS' = $env:RUNNER_OS\n 'RUNNER_ARCH' = $env:RUNNER_ARCH\n}\n$file = \"setup-info-${{ matrix.os }}-${{ matrix.runner_type }}.md\"\n\"was captured from the set up job.\" | Out-File -FilePath $file -Encoding utf8\nforeach ($k in $data.Keys) {\n if ($data[$k]) {\n \"${k}: $($data[$k])\" | Out-File -FilePath $file -Encoding utf8 -Append\n }\n}\n" - }, - { - "uses": "actions/upload-artifact@v4", - "if": "always()", - "with": { - "name": "setup-info-${{ matrix.os }}-${{ matrix.runner_type }}", - "path": "setup-info-${{ matrix.os }}-${{ matrix.runner_type }}.md" - } - }, { "name": "Install Pester", "shell": "pwsh", diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e892012b..49121f3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -82,29 +82,6 @@ jobs: if ([Version]$version -lt $required) { throw "PowerShell version $version is less than $required" } - - name: Capture setup info - shell: pwsh - run: | - $data = [ordered]@{ - 'Current runner version' = $env:RUNNER_VERSION - 'Runner Image' = $env:ImageOS - 'ImageVersion' = $env:ImageVersion - 'RUNNER_NAME' = $env:RUNNER_NAME - 'RUNNER_OS' = $env:RUNNER_OS - 'RUNNER_ARCH' = $env:RUNNER_ARCH - } - $file = "setup-info-${{ matrix.os }}-${{ matrix.runner_type }}.md" - "was captured from the set up job." | Out-File -FilePath $file -Encoding utf8 - foreach ($k in $data.Keys) { - if ($data[$k]) { - "${k}: $($data[$k])" | Out-File -FilePath $file -Encoding utf8 -Append - } - } - - uses: actions/upload-artifact@v4 - if: ${{ (success() || failure()) && !cancelled() }} - with: - name: setup-info-${{ matrix.os }}-${{ matrix.runner_type }} - path: setup-info-${{ matrix.os }}-${{ matrix.runner_type }}.md - name: Install Pester shell: pwsh run: | From c0cc9248834f9d6800d206a96a2ffcded3f3ee1b Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 02:31:47 -0700 Subject: [PATCH 07/73] Format pester traceability tables like group markdown --- .../print-pester-traceability.test.js | 21 +++++++++++++++---- scripts/print-pester-traceability.ts | 16 ++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/scripts/__tests__/print-pester-traceability.test.js b/scripts/__tests__/print-pester-traceability.test.js index 236e44ef..54cea129 100644 --- a/scripts/__tests__/print-pester-traceability.test.js +++ b/scripts/__tests__/print-pester-traceability.test.js @@ -28,10 +28,23 @@ test('groups owners and includes requirements and evidence', async () => { assert(bobSection.includes('Beta')); assert(!bobSection.includes('Alpha') && !bobSection.includes('Gamma')); - // requirement IDs and evidence links - assert.match(aliceSection, /Alpha \| REQ-123 \| Passed \| \[link\]\(http:\/\/example.com\/alpha.log\)/); - assert.match(aliceSection, /Gamma \| REQ-789 \| Passed \| \[link\]\(http:\/\/example.com\/gamma.log\)/); - assert.match(bobSection, /Beta \| REQ-456 \| Passed \| \[link\]\(http:\/\/example.com\/beta.log\)/); + // header and rows + assert(aliceSection.includes('| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |')); + assert( + aliceSection.includes( + '| REQ-123 | \\[Owner:alice\\] Alpha | Passed | 0.000 | alice | \\[link\\](http://example.com/alpha.log) |' + ) + ); + assert( + aliceSection.includes( + '| REQ-789 | \\[Owner:alice\\] Gamma | Passed | 0.000 | alice | \\[link\\](http://example.com/gamma.log) |' + ) + ); + assert( + bobSection.includes( + '| REQ-456 | \\[Owner:bob\\] Beta | Passed | 0.000 | bob | \\[link\\](http://example.com/beta.log) |' + ) + ); }); test('fails when no JUnit files are found', async () => { diff --git a/scripts/print-pester-traceability.ts b/scripts/print-pester-traceability.ts index 3189814e..d902bf08 100644 --- a/scripts/print-pester-traceability.ts +++ b/scripts/print-pester-traceability.ts @@ -2,6 +2,7 @@ import path from 'path'; import { glob } from 'glob'; import { collectTestCases } from './summary/tests.ts'; +import { buildTable } from './utils/markdown.ts'; async function main() { const overrideDir = process.env.PESTER_JUNIT_PATH; @@ -38,13 +39,20 @@ async function main() { const sortedOwners = Array.from(groups.keys()).sort(); for (const owner of sortedOwners) { const tlist = groups.get(owner)!; - const table = ['| Test | Requirements | Status | Evidence |', '| --- | --- | --- | --- |']; + const header = ['Requirement', 'Test ID', 'Status', 'Duration (s)', 'Owner', 'Evidence']; + const rows: string[][] = []; for (const t of tlist) { - const reqs = t.requirements.join(', '); const evidence = t.evidence ? `[link](${t.evidence})` : ''; - table.push(`| ${t.name} | ${reqs} | ${t.status} | ${evidence} |`); + rows.push([ + t.requirements.join(', '), + t.name, + t.status, + t.duration.toFixed(3), + t.owner ?? owner, + evidence, + ]); } - const content = table.join('\n'); + const content = buildTable(header, rows); lines.push(`
${owner}\n\n${content}\n\n
`); } console.log(lines.join('\n\n')); From 697a57d348f8565a5fd65bc4a3f97a2f971bd1a2 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 02:48:45 -0700 Subject: [PATCH 08/73] Use test IDs in requirement traceability --- scripts/__tests__/generate-ci-summary.test.js | 10 +++++----- .../__tests__/print-pester-traceability.test.js | 14 +++++++------- scripts/print-pester-traceability.ts | 2 +- scripts/summary/index.ts | 4 ++-- scripts/summary/tests.ts | 6 +++++- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/scripts/__tests__/generate-ci-summary.test.js b/scripts/__tests__/generate-ci-summary.test.js index 0e017123..46a26190 100644 --- a/scripts/__tests__/generate-ci-summary.test.js +++ b/scripts/__tests__/generate-ci-summary.test.js @@ -160,8 +160,8 @@ test('groupToMarkdown omits numeric identifiers', () => { const groups = [{ id: 'REQ-XYZ', tests: [ - { id: 'a', name: 'alpha', status: 'Passed', duration: 0, requirements: [] }, - { id: 'b', name: 'beta', status: 'Failed', duration: 0, requirements: [] }, + { id: 'alpha', name: 'Alpha', status: 'Passed', duration: 0, requirements: [] }, + { id: 'beta', name: 'Beta', status: 'Failed', duration: 0, requirements: [] }, ], }]; const md = groupToMarkdown(groups); @@ -175,9 +175,9 @@ test('groupToMarkdown supports optional limit for truncation', () => { const groups = [{ id: 'REQ-XYZ', tests: [ - { id: 'a', name: 'alpha', status: 'Passed', duration: 0, requirements: [] }, - { id: 'b', name: 'beta', status: 'Failed', duration: 0, requirements: [] }, - { id: 'c', name: 'gamma', status: 'Skipped', duration: 0, requirements: [] }, + { id: 'alpha', name: 'Alpha', status: 'Passed', duration: 0, requirements: [] }, + { id: 'beta', name: 'Beta', status: 'Failed', duration: 0, requirements: [] }, + { id: 'gamma', name: 'Gamma', status: 'Skipped', duration: 0, requirements: [] }, ], }]; const truncated = groupToMarkdown(groups, 2); diff --git a/scripts/__tests__/print-pester-traceability.test.js b/scripts/__tests__/print-pester-traceability.test.js index 54cea129..3395295c 100644 --- a/scripts/__tests__/print-pester-traceability.test.js +++ b/scripts/__tests__/print-pester-traceability.test.js @@ -23,26 +23,26 @@ test('groups owners and includes requirements and evidence', async () => { // owners grouped correctly const aliceSection = stdout.match(/
alice<\/summary>[\s\S]*?<\/details>/)[0]; const bobSection = stdout.match(/
bob<\/summary>[\s\S]*?<\/details>/)[0]; - assert(aliceSection.includes('Alpha') && aliceSection.includes('Gamma')); - assert(!aliceSection.includes('Beta')); - assert(bobSection.includes('Beta')); - assert(!bobSection.includes('Alpha') && !bobSection.includes('Gamma')); + assert(aliceSection.includes('alpha') && aliceSection.includes('gamma')); + assert(!aliceSection.includes('beta')); + assert(bobSection.includes('beta')); + assert(!bobSection.includes('alpha') && !bobSection.includes('gamma')); // header and rows assert(aliceSection.includes('| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |')); assert( aliceSection.includes( - '| REQ-123 | \\[Owner:alice\\] Alpha | Passed | 0.000 | alice | \\[link\\](http://example.com/alpha.log) |' + '| REQ-123 | alpha | Passed | 0.000 | alice | \\[link\\](http://example.com/alpha.log) |' ) ); assert( aliceSection.includes( - '| REQ-789 | \\[Owner:alice\\] Gamma | Passed | 0.000 | alice | \\[link\\](http://example.com/gamma.log) |' + '| REQ-789 | gamma | Passed | 0.000 | alice | \\[link\\](http://example.com/gamma.log) |' ) ); assert( bobSection.includes( - '| REQ-456 | \\[Owner:bob\\] Beta | Passed | 0.000 | bob | \\[link\\](http://example.com/beta.log) |' + '| REQ-456 | beta | Passed | 0.000 | bob | \\[link\\](http://example.com/beta.log) |' ) ); }); diff --git a/scripts/print-pester-traceability.ts b/scripts/print-pester-traceability.ts index d902bf08..4bd6de15 100644 --- a/scripts/print-pester-traceability.ts +++ b/scripts/print-pester-traceability.ts @@ -45,7 +45,7 @@ async function main() { const evidence = t.evidence ? `[link](${t.evidence})` : ''; rows.push([ t.requirements.join(', '), - t.name, + t.id, t.status, t.duration.toFixed(3), t.owner ?? owner, diff --git a/scripts/summary/index.ts b/scripts/summary/index.ts index c5bfb011..2c749b47 100644 --- a/scripts/summary/index.ts +++ b/scripts/summary/index.ts @@ -101,7 +101,7 @@ export function requirementTestsToMarkdown(groups: RequirementGroup[]) { const rows: string[][] = []; for (const g of groups) { for (const t of g.tests) { - rows.push([g.id, t.name, t.status]); + rows.push([g.id, t.id, t.status]); } } return ['### Requirement Testcases', buildTable(header, rows)].join('\n'); @@ -121,7 +121,7 @@ export function groupToMarkdown(groups: RequirementGroup[], limit?: number) { const evidence = t.evidence ? `[link](${t.evidence})` : ''; rows.push([ g.id, - t.name, + t.id, t.status, t.duration.toFixed(3), t.owner ?? g.owner ?? '', diff --git a/scripts/summary/tests.ts b/scripts/summary/tests.ts index 77f5d132..516981cf 100644 --- a/scripts/summary/tests.ts +++ b/scripts/summary/tests.ts @@ -4,7 +4,11 @@ import { TestCase } from './index.ts'; import { parseJUnit } from '../junit-parser.ts'; export function normalizeTestId(id: string): string { - return id.toLowerCase().replace(/::/g, '-').replace(/\s+/g, '-'); + return id + .replace(/\[[^\]]*\]\s*/g, '') + .toLowerCase() + .replace(/::/g, '-') + .replace(/\s+/g, '-'); } export async function collectTestCases(files: string[], evidenceDir: string, os?: string): Promise { From 56f0ba8b6160767b071050ba3a11b3e696e4314c Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 09:00:41 -0700 Subject: [PATCH 09/73] feat: add artifact provenance manifest --- .github/workflows/build-self-hosted.json | 32 ++++++++++++++++++------ .github/workflows/build-self-hosted.yml | 32 ++++++++++++++++++------ scripts/build/README.md | 5 +++- tests/pester/Build.Workflow.Tests.ps1 | 23 +++++++++++------ 4 files changed, 69 insertions(+), 23 deletions(-) diff --git a/.github/workflows/build-self-hosted.json b/.github/workflows/build-self-hosted.json index 7438e23a..fa8a5a39 100644 --- a/.github/workflows/build-self-hosted.json +++ b/.github/workflows/build-self-hosted.json @@ -6,6 +6,11 @@ "jobs": { "build": { "runs-on": "ubuntu-latest", + "env": { + "MAJOR": "1", + "MINOR": "0", + "PATCH": "0" + }, "steps": [ { "uses": "actions/checkout@v4" @@ -15,22 +20,35 @@ "uses": "./build/action.yml", "with": { "relative_path": "scripts/build", - "major": "1", - "minor": "0", - "patch": "0", - "build": "1", - "commit": "abcdef", + "major": "${{ env.MAJOR }}", + "minor": "${{ env.MINOR }}", + "patch": "${{ env.PATCH }}", + "build": "${{ github.run_number }}", + "commit": "${{ github.sha }}", "labview_minor_revision": "3", "company_name": "Acme Corp", "author_name": "Jane Doe" } }, + { + "name": "Record artifact metadata", + "id": "record", + "run": "VERSION=\"${MAJOR}.${MINOR}.${PATCH}.${GITHUB_RUN_NUMBER}\"\nSHORT_SHA=\"${GITHUB_SHA::7}\"\nARTIFACT=\"lv_icon_x64_v${VERSION}+${SHORT_SHA}.lvlibp\"\nmv scripts/build/lv_icon_x64.lvlibp \"scripts/build/${ARTIFACT}\"\nprintf '{\"commit\":\"%s\",\"build_number\":\"%s\",\"artifacts\":[\"%s\"]}' \"$GITHUB_SHA\" \"$GITHUB_RUN_NUMBER\" \"$ARTIFACT\" > scripts/build/artifact-manifest.json\necho \"artifact=${ARTIFACT}\" >> \"$GITHUB_OUTPUT\"" + }, { "name": "Upload build artifact", "uses": "actions/upload-artifact@v4", "with": { - "name": "build-artifact", - "path": "scripts/build/lv_icon_x64.lvlibp" + "name": "${{ steps.record.outputs.artifact }}", + "path": "scripts/build/${{ steps.record.outputs.artifact }}" + } + }, + { + "name": "Upload artifact manifest", + "uses": "actions/upload-artifact@v4", + "with": { + "name": "artifact-manifest", + "path": "scripts/build/artifact-manifest.json" } } ] diff --git a/.github/workflows/build-self-hosted.yml b/.github/workflows/build-self-hosted.yml index dad9d40d..251a22f5 100644 --- a/.github/workflows/build-self-hosted.yml +++ b/.github/workflows/build-self-hosted.yml @@ -6,22 +6,40 @@ on: jobs: build: runs-on: ubuntu-latest + env: + MAJOR: '1' + MINOR: '0' + PATCH: '0' steps: - uses: actions/checkout@v4 - name: Run build action uses: ./build/action.yml with: relative_path: 'scripts/build' - major: '1' - minor: '0' - patch: '0' - build: '1' - commit: 'abcdef' + major: ${{ env.MAJOR }} + minor: ${{ env.MINOR }} + patch: ${{ env.PATCH }} + build: ${{ github.run_number }} + commit: ${{ github.sha }} labview_minor_revision: '3' company_name: 'Acme Corp' author_name: 'Jane Doe' + - name: Record artifact metadata + id: record + run: | + VERSION="${MAJOR}.${MINOR}.${PATCH}.${GITHUB_RUN_NUMBER}" + SHORT_SHA="${GITHUB_SHA::7}" + ARTIFACT="lv_icon_x64_v${VERSION}+${SHORT_SHA}.lvlibp" + mv scripts/build/lv_icon_x64.lvlibp "scripts/build/${ARTIFACT}" + printf '{"commit":"%s","build_number":"%s","artifacts":["%s"]}' "$GITHUB_SHA" "$GITHUB_RUN_NUMBER" "$ARTIFACT" > scripts/build/artifact-manifest.json + echo "artifact=${ARTIFACT}" >> "$GITHUB_OUTPUT" - name: Upload build artifact uses: actions/upload-artifact@v4 with: - name: build-artifact - path: 'scripts/build/lv_icon_x64.lvlibp' + name: ${{ steps.record.outputs.artifact }} + path: scripts/build/${{ steps.record.outputs.artifact }} + - name: Upload artifact manifest + uses: actions/upload-artifact@v4 + with: + name: artifact-manifest + path: scripts/build/artifact-manifest.json diff --git a/scripts/build/README.md b/scripts/build/README.md index fcb1c10c..c7723ea9 100644 --- a/scripts/build/README.md +++ b/scripts/build/README.md @@ -1,6 +1,9 @@ # Full Build 🛠️ Runs **`Build.ps1`** to clean, compile, and package the LabVIEW Icon Editor. +Each build records provenance by renaming output artifacts to include the +build number and commit SHA and by writing an `artifact-manifest.json` file that +maps the generated artifacts back to the source commit. ## Inputs @@ -25,7 +28,7 @@ Runs **`Build.ps1`** to clean, compile, and package the LabVIEW Icon Editor. major: 1 minor: 0 patch: 0 - build: 1 + build: ${{ github.run_number }} commit: ${{ github.sha }} company_name: Example Co author_name: CI diff --git a/tests/pester/Build.Workflow.Tests.ps1 b/tests/pester/Build.Workflow.Tests.ps1 index 79105675..8278bd73 100644 --- a/tests/pester/Build.Workflow.Tests.ps1 +++ b/tests/pester/Build.Workflow.Tests.ps1 @@ -15,7 +15,7 @@ Describe 'Build.Workflow' { $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable $job = $wf.jobs.'build' $buildStep = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_['uses'] -eq './build/action.yml' } | Select-Object -First 1 - $artifactStep = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_['uses'] -eq 'actions/upload-artifact@v4' -and $_['with']['path'] -match 'lv_icon_x64\.lvlibp' } | Select-Object -First 1 + $artifactStep = $job.steps | Where-Object { $_.name -eq 'Upload build artifact' } | Select-Object -First 1 $checkoutSteps = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_['uses'] -eq 'actions/checkout@v4' } $externalCheckout = $job.steps | Where-Object { $_.ContainsKey('with') -and $_['with'].ContainsKey('repository') } @@ -24,17 +24,24 @@ Describe 'Build.Workflow' { $externalCheckout | Should -BeNullOrEmpty $buildStep.with.relative_path | Should -Be 'scripts/build' - $buildStep.with.major | Should -Be '1' - $buildStep.with.minor | Should -Be '0' - $buildStep.with.patch | Should -Be '0' - $buildStep.with.build | Should -Be '1' - $buildStep.with.commit | Should -Be 'abcdef' + $buildStep.with.major | Should -Be '${{ env.MAJOR }}' + $buildStep.with.minor | Should -Be '${{ env.MINOR }}' + $buildStep.with.patch | Should -Be '${{ env.PATCH }}' + $buildStep.with.build | Should -Be '${{ github.run_number }}' + $buildStep.with.commit | Should -Be '${{ github.sha }}' $buildStep.with.labview_minor_revision | Should -Be '3' $buildStep.with.company_name | Should -Be 'Acme Corp' $buildStep.with.author_name | Should -Be 'Jane Doe' + $artifactMeta = $job.steps | Where-Object { $_.name -eq 'Record artifact metadata' } | Select-Object -First 1 + $manifestStep = $job.steps | Where-Object { $_.name -eq 'Upload artifact manifest' } | Select-Object -First 1 + + $artifactMeta | Should -Not -BeNullOrEmpty $artifactStep | Should -Not -BeNullOrEmpty - $artifactStep.with.path | Should -Be 'scripts/build/lv_icon_x64.lvlibp' - $artifactStep.with.name | Should -Be 'build-artifact' + $artifactStep.with.path | Should -Be 'scripts/build/${{ steps.record.outputs.artifact }}' + $artifactStep.with.name | Should -Be '${{ steps.record.outputs.artifact }}' + $manifestStep | Should -Not -BeNullOrEmpty + $manifestStep.with.path | Should -Be 'scripts/build/artifact-manifest.json' + $manifestStep.with.name | Should -Be 'artifact-manifest' } } From 9162feae4673eac082aa6015a8338351439c5f80 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 09:18:10 -0700 Subject: [PATCH 10/73] chore: enforce requirement references in commits (REQ-033) --- .github/pull_request_template.md | 8 ++++++++ .github/workflows/requirement-id-check.yml | 15 ++++++++++++++ CONTRIBUTING.md | 4 ++++ scripts/check-commit-requirements.sh | 24 ++++++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/requirement-id-check.yml create mode 100755 scripts/check-commit-requirements.sh diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..acc64539 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,8 @@ +## Summary +- + +## Requirement(s) +- REQ- + +## Testing +- [ ] `npm test` diff --git a/.github/workflows/requirement-id-check.yml b/.github/workflows/requirement-id-check.yml new file mode 100644 index 00000000..736e81e2 --- /dev/null +++ b/.github/workflows/requirement-id-check.yml @@ -0,0 +1,15 @@ +name: requirement-id-check + +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + requirement-id: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Ensure commits reference requirement IDs + run: scripts/check-commit-requirements.sh "${{ github.event.pull_request.base.sha }}" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c0b3be90..1213667a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,3 +13,7 @@ For documentation updates, follow the [documentation contribution guidelines](do npm run lint:md npx --yes markdown-link-check -q -c .markdown-link-check.json README.md $(find docs scripts -name '*.md') ``` + +## Commit Messages + +Each commit should reference at least one requirement ID defined in `requirements.json` (for example, `REQ-001`). Pull requests are automatically checked for this convention. diff --git a/scripts/check-commit-requirements.sh b/scripts/check-commit-requirements.sh new file mode 100755 index 00000000..f6c036cc --- /dev/null +++ b/scripts/check-commit-requirements.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -euo pipefail + +base_sha="${1:-origin/main}" + +if [ ! -f requirements.json ]; then + echo "requirements.json not found" >&2 + exit 1 +fi + +pattern=$(jq -r '.requirements[].id' requirements.json | paste -sd'|' -) + +missing=0 +while read -r subject; do + if ! grep -Eq "($pattern)" <<<"$subject"; then + echo "Commit message missing requirement ID: $subject" + missing=1 + fi +done < <(git log --format=%s "$base_sha"..HEAD) + +if [ "$missing" -ne 0 ]; then + echo "One or more commits are missing requirement IDs." >&2 + exit 1 +fi From fffe0eb454fb0f8b7bb3075445b1fe886a99dd7e Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 10:07:57 -0700 Subject: [PATCH 11/73] feat: add requirement coverage tagging --- docs/actions/run-pester-tests.md | 4 +++ docs/workflows/run-pester-tests.md | 2 ++ scripts/run-pester-tests/README.md | 4 +++ scripts/run-pester-tests/RunPesterTests.ps1 | 35 ++++++++++++++----- .../pester/PathRestoration.Actions.Tests.ps1 | 2 +- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/docs/actions/run-pester-tests.md b/docs/actions/run-pester-tests.md index e4caf289..9c980daf 100644 --- a/docs/actions/run-pester-tests.md +++ b/docs/actions/run-pester-tests.md @@ -43,6 +43,10 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas working_directory: '.' ``` +## Outputs + +Running the action writes a `requirement-coverage.json` file to the working directory. The file lists each requirement ID discovered from test tags and whether its associated tests passed (`PASS`), failed (`FAIL`), or were not executed (`NOT_RUN`). + ## Return Codes - `0` – all tests passed diff --git a/docs/workflows/run-pester-tests.md b/docs/workflows/run-pester-tests.md index f6074c9d..48bbdc26 100644 --- a/docs/workflows/run-pester-tests.md +++ b/docs/workflows/run-pester-tests.md @@ -46,4 +46,6 @@ jobs: - name: Run run-pester-tests shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName run-pester-tests -WorkingDirectory "${{ github.workspace }}/target" + +After the workflow completes, the target repository will contain a `requirement-coverage.json` file summarizing requirement pass/fail status from the test run. ``` diff --git a/scripts/run-pester-tests/README.md b/scripts/run-pester-tests/README.md index 5836f19d..98a126f4 100644 --- a/scripts/run-pester-tests/README.md +++ b/scripts/run-pester-tests/README.md @@ -17,6 +17,10 @@ For full documentation, see [run-pester-tests action](../../docs/actions/run-pes working_directory: '.' ``` +## Outputs + +Upon completion a `requirement-coverage.json` file is written to the specified `working_directory`. It reports the pass/fail status of each requirement ID inferred from test tags. + See also: [docs/actions/run-pester-tests.md](../../docs/actions/run-pester-tests.md) ## License diff --git a/scripts/run-pester-tests/RunPesterTests.ps1 b/scripts/run-pester-tests/RunPesterTests.ps1 index fc388e0b..78decd8f 100644 --- a/scripts/run-pester-tests/RunPesterTests.ps1 +++ b/scripts/run-pester-tests/RunPesterTests.ps1 @@ -20,18 +20,37 @@ param( Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' - -$testPath = Join-Path $WorkingDirectory 'tests/pester' +$testPath = Join-Path (Resolve-Path $WorkingDirectory) 'tests/pester' +Push-Location $WorkingDirectory $cfg = New-PesterConfiguration -$cfg.Output.NoColor = $true +if ($cfg.Output.PSObject.Properties.Name -contains 'NoColor') { + $cfg.Output.NoColor = $true +} $cfg.Run.Path = $testPath $cfg.TestResult.Enabled = $false -$ansiPattern = '\x1B\[[0-9;]*[A-Za-z]' -$output = & { - Invoke-Pester -Configuration $cfg 2>&1 -} +$run = Invoke-Pester -Configuration $cfg $exitCode = $LASTEXITCODE -$output | ForEach-Object { $_ -replace $ansiPattern, '' } + +$coverage = @{} +foreach ($test in $run.TestResult) { + foreach ($tag in $test.Tags) { + if (-not $coverage.ContainsKey($tag)) { $coverage[$tag] = 'PASS' } + if ($test.Result -ne 'Passed') { $coverage[$tag] = 'FAIL' } + } +} + +$requirementsPath = Join-Path $WorkingDirectory 'requirements.json' +if (Test-Path $requirementsPath) { + $requirements = (Get-Content $requirementsPath | ConvertFrom-Json).requirements + $report = foreach ($req in $requirements) { + $status = if ($coverage.ContainsKey($req.id)) { $coverage[$req.id] } else { 'NOT_RUN' } + [pscustomobject]@{ id = $req.id; status = $status } + } + $reportPath = Join-Path $WorkingDirectory 'requirement-coverage.json' + $report | ConvertTo-Json -Depth 5 | Set-Content -Path $reportPath +} + +Pop-Location exit $exitCode diff --git a/tests/pester/PathRestoration.Actions.Tests.ps1 b/tests/pester/PathRestoration.Actions.Tests.ps1 index 9e62f59e..c4887e88 100644 --- a/tests/pester/PathRestoration.Actions.Tests.ps1 +++ b/tests/pester/PathRestoration.Actions.Tests.ps1 @@ -38,7 +38,7 @@ Describe 'Adapters restore PATH' { @{ Func='Invoke-SetDevelopmentMode'; Script=[System.IO.Path]::Combine($repoRoot,'scripts','set-development-mode','Set_Development_Mode.ps1'); Arguments=@{ RelativePath='.' } } ) - It "restores PATH after " -TestCases $cases { + It "restores PATH after " -Tag 'REQ-000' -TestCases $cases { param($Func, $Script, $Arguments) $originalPath = $env:PATH $params = $Arguments From 0100289e7678fbf97cb709cfa9f5f27bf2051732 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 10:26:50 -0700 Subject: [PATCH 12/73] feat: generate traceability matrix --- .github/workflows/ci.yml | 7 ++++ package.json | 1 + scripts/generate-traceability-matrix.ts | 50 +++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 scripts/generate-traceability-matrix.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 49121f3b..49d285be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -133,4 +133,11 @@ jobs: REQ_MAPPING_FILE: requirements.json DISPATCHER_REGISTRY: dispatchers.json EVIDENCE_DIR: artifacts/evidence + - run: npx tsx scripts/generate-traceability-matrix.ts + - run: cat artifacts/linux/traceability-matrix.md >> "$GITHUB_STEP_SUMMARY" + - uses: actions/upload-artifact@v4 + if: ${{ (success() || failure()) && !cancelled() }} + with: + name: traceability-matrix + path: artifacts/linux/traceability-matrix.md - run: npx tsx scripts/print-pester-traceability.ts >> "$GITHUB_STEP_SUMMARY" diff --git a/package.json b/package.json index 5c0786a3..e064f874 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "test:ci": "mkdir -p test-results && tsx --test --test-reporter=junit --test-reporter-destination test-results/node-junit.xml", "derive:registry": "tsx scripts/derive-dispatcher-registry.ts", "generate:summary": "tsx scripts/generate-ci-summary.ts", + "generate:traceability-matrix": "tsx scripts/generate-traceability-matrix.ts", "postinstall": "patch-package", "lint:md": "markdownlint-cli2 README.md \"docs/**/*.md\" \"scripts/**/*.md\"", "link:check": "markdown-link-check -q -c .markdown-link-check.json README.md $(find docs scripts -name '*.md')" diff --git a/scripts/generate-traceability-matrix.ts b/scripts/generate-traceability-matrix.ts new file mode 100644 index 00000000..4475f1fe --- /dev/null +++ b/scripts/generate-traceability-matrix.ts @@ -0,0 +1,50 @@ +#!/usr/bin/env tsx +import fs from 'fs/promises'; +import path from 'path'; +import { execSync } from 'child_process'; +import { RequirementGroup } from './summary/index.ts'; +import { buildTable } from './utils/markdown.ts'; + +async function main() { + const traceabilityPath = process.argv[2] || path.join('artifacts', 'linux', 'traceability.json'); + const raw = await fs.readFile(traceabilityPath, 'utf8'); + const data: { requirements: RequirementGroup[] } = JSON.parse(raw); + const groups = data.requirements; + + const logOutput = execSync('git log --pretty=format:%H\\|%s', { encoding: 'utf8' }); + const commitMap: Record = {}; + const regex = /(REQ[A-Z]*-\d+)/g; + for (const line of logOutput.split(/\r?\n/)) { + if (!line.trim()) continue; + const [sha, message] = line.split('|'); + const matches = message.match(regex); + if (!matches) continue; + for (const req of matches) { + if (!commitMap[req]) commitMap[req] = []; + commitMap[req].push({ sha, msg: message }); + } + } + + const baseUrl = process.env.GITHUB_SERVER_URL && process.env.GITHUB_REPOSITORY + ? `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}` + : undefined; + + const header = ['Requirement', 'Description', 'Commits', 'Tests']; + const rows: string[][] = []; + for (const g of groups) { + const commits = (commitMap[g.id] || []) + .map(c => baseUrl ? `[${c.sha.slice(0,7)}](${baseUrl}/commit/${c.sha})` : c.sha.slice(0,7)) + .join('
'); + const tests = g.tests.map(t => `${t.id} (${t.status})`).join('
'); + rows.push([g.id, g.description ?? '', commits, tests]); + } + const markdown = `### Requirement Traceability Matrix\n\n${buildTable(header, rows)}\n`; + const outDir = path.dirname(traceabilityPath); + await fs.writeFile(path.join(outDir, 'traceability-matrix.md'), markdown); + console.log(markdown); +} + +main().catch(err => { + console.error(err); + process.exit(1); +}); From bfc9f093e6b1b8ef9a8f481f539ef1aecdcdddcf Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 10:45:54 -0700 Subject: [PATCH 13/73] docs: clarify traceability expectations (REQ-001) (#58) --- CONTRIBUTING.md | 7 +++++++ README.md | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1213667a..e4bb8a81 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,6 +14,13 @@ npm run lint:md npx --yes markdown-link-check -q -c .markdown-link-check.json README.md $(find docs scripts -name '*.md') ``` +## Requirement Traceability + +Each requirement is tracked as an issue or entry in `requirements.json`. Every +code change must reference the requirement it addresses, and each requirement +must be covered by at least one automated test. The CI pipeline checks these +links and reports missing associations. + ## Commit Messages Each commit should reference at least one requirement ID defined in `requirements.json` (for example, `REQ-001`). Pull requests are automatically checked for this convention. diff --git a/README.md b/README.md index 168de0cd..c0c7a4e8 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,15 @@ Invoke-Pester -Configuration $cfg XML test result output is intentionally disabled. +## Requirement Traceability + +Each requirement is tracked as an issue or entry in +[`requirements.json`](requirements.json). Every code change must reference the +requirement it addresses, and each requirement must have at least one automated +test. The CI pipeline checks these links and reports missing associations. For a +full mapping of requirements to tests, see +[docs/requirements.md](docs/requirements.md). + ## Contributing Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for general guidelines and [docs/contributing-docs.md](docs/contributing-docs.md) for documentation rules. From f28e3f6d6e4d88f5fc898ef23cfceb6a9dc83b92 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 11:03:17 -0700 Subject: [PATCH 14/73] feat: add traceability quality gate (#59) --- package.json | 1 + scripts/__tests__/check-traceability.test.js | 66 ++++++++++++++++++++ scripts/check-traceability.ts | 44 +++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 scripts/__tests__/check-traceability.test.js create mode 100644 scripts/check-traceability.ts diff --git a/package.json b/package.json index e064f874..f2f531e7 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "derive:registry": "tsx scripts/derive-dispatcher-registry.ts", "generate:summary": "tsx scripts/generate-ci-summary.ts", "generate:traceability-matrix": "tsx scripts/generate-traceability-matrix.ts", + "check:traceability": "tsx scripts/check-traceability.ts", "postinstall": "patch-package", "lint:md": "markdownlint-cli2 README.md \"docs/**/*.md\" \"scripts/**/*.md\"", "link:check": "markdown-link-check -q -c .markdown-link-check.json README.md $(find docs scripts -name '*.md')" diff --git a/scripts/__tests__/check-traceability.test.js b/scripts/__tests__/check-traceability.test.js new file mode 100644 index 00000000..84734294 --- /dev/null +++ b/scripts/__tests__/check-traceability.test.js @@ -0,0 +1,66 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import path from 'node:path'; +import os from 'node:os'; +import { execFile } from 'node:child_process'; +import { promisify } from 'node:util'; + +const execFileP = promisify(execFile); +const script = path.resolve('scripts/check-traceability.ts'); +const tsx = path.resolve('node_modules/.bin/tsx'); + +async function initRepo(dir, msg) { + await execFileP('git', ['init', '-b', 'main'], { cwd: dir }); + await fs.writeFile(path.join(dir, 'file.txt'), 'a'); + await execFileP('git', ['add', '.'], { cwd: dir }); + await execFileP('git', ['commit', '-m', msg], { cwd: dir }); +} + +test('fails when requirement lacks test coverage', async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'trace-')); + const req = { requirements: [{ id: 'REQ-1', tests: ['t1'] }] }; + await fs.writeFile(path.join(dir, 'requirements.json'), JSON.stringify(req)); + const trace = { requirements: [{ id: 'REQ-1', tests: [] }] }; + await fs.writeFile(path.join(dir, 'trace.json'), JSON.stringify(trace)); + await initRepo(dir, 'initial REQ-1'); + await assert.rejects( + execFileP(tsx, [script], { + cwd: dir, + env: { ...process.env, REQ_MAPPING_FILE: 'requirements.json', TRACEABILITY_FILE: 'trace.json' }, + }), + /No tests executed/ + ); + await fs.rm(dir, { recursive: true, force: true }); +}); + +test('fails when commit lacks requirement reference', async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'trace-')); + const req = { requirements: [{ id: 'REQ-1', tests: ['t1'] }] }; + await fs.writeFile(path.join(dir, 'requirements.json'), JSON.stringify(req)); + const trace = { requirements: [{ id: 'REQ-1', tests: [{ id: 't1', status: 'Passed' }] }] }; + await fs.writeFile(path.join(dir, 'trace.json'), JSON.stringify(trace)); + await initRepo(dir, 'initial commit'); + await assert.rejects( + execFileP(tsx, [script], { + cwd: dir, + env: { ...process.env, REQ_MAPPING_FILE: 'requirements.json', TRACEABILITY_FILE: 'trace.json', PR_BODY: '' }, + }), + /No requirement references/ + ); + await fs.rm(dir, { recursive: true, force: true }); +}); + +test('passes with coverage and requirement reference', async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'trace-')); + const req = { requirements: [{ id: 'REQ-1', tests: ['t1'] }] }; + await fs.writeFile(path.join(dir, 'requirements.json'), JSON.stringify(req)); + const trace = { requirements: [{ id: 'REQ-1', tests: [{ id: 't1', status: 'Passed' }] }] }; + await fs.writeFile(path.join(dir, 'trace.json'), JSON.stringify(trace)); + await initRepo(dir, 'initial REQ-1'); + await execFileP(tsx, [script], { + cwd: dir, + env: { ...process.env, REQ_MAPPING_FILE: 'requirements.json', TRACEABILITY_FILE: 'trace.json' }, + }); + await fs.rm(dir, { recursive: true, force: true }); +}); diff --git a/scripts/check-traceability.ts b/scripts/check-traceability.ts new file mode 100644 index 00000000..7f5257d5 --- /dev/null +++ b/scripts/check-traceability.ts @@ -0,0 +1,44 @@ +#!/usr/bin/env tsx +import fs from 'fs/promises'; +import path from 'path'; +import { execSync } from 'child_process'; + +async function main() { + const reqFile = process.env.REQ_MAPPING_FILE || 'requirements.json'; + const traceFile = + process.env.TRACEABILITY_FILE || + path.join('artifacts', (process.env.RUNNER_OS || 'linux').toLowerCase(), 'traceability.json'); + + const reqRaw = JSON.parse(await fs.readFile(reqFile, 'utf8')); + const reqIds: string[] = (reqRaw.requirements || []).map((r: any) => r.id); + + const traceRaw = JSON.parse(await fs.readFile(traceFile, 'utf8')); + const groups: any[] = traceRaw.requirements || []; + + const missing: string[] = []; + for (const id of reqIds) { + const g = groups.find((gr) => gr.id === id); + if (!g || !Array.isArray(g.tests) || g.tests.length === 0) { + missing.push(id); + } + } + if (missing.length > 0) { + console.error(`No tests executed for requirements: ${missing.join(', ')}`); + process.exit(1); + } + + const commitMsg = execSync('git log -1 --pretty=%B', { encoding: 'utf8' }); + const prBody = process.env.PR_BODY || process.env.GITHUB_PR_BODY || ''; + const combined = commitMsg + '\n' + prBody; + if (!/(REQ[A-Z]*-\d+)/.test(combined)) { + console.error('No requirement references found in commit message or PR body.'); + process.exit(1); + } + + console.log('Traceability checks passed.'); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); From 174fe924b3096dab335e0998b994d96f173b79ef Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 11:23:16 -0700 Subject: [PATCH 15/73] ci: publish junit reports (#60) --- .github/workflows/ci.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 49d285be..f8f184ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,11 @@ jobs: - run: npm run generate:summary env: TEST_RESULTS_GLOBS: test-results/*junit*.xml + - uses: actions/upload-artifact@v4 + if: ${{ (success() || failure()) && !cancelled() }} + with: + name: test-results + path: test-results - uses: actions/upload-artifact@v4 if: ${{ (success() || failure()) && !cancelled() }} with: @@ -105,8 +110,8 @@ jobs: - uses: actions/upload-artifact@v4 if: ${{ (success() || failure()) && !cancelled() }} with: - name: pester-junit-${{ matrix.os }}-${{ matrix.runner_type }} - path: pester-results/pester-junit.xml + name: test-results-pester-${{ matrix.os }}-${{ matrix.runner_type }} + path: pester-results if-no-files-found: error report: @@ -128,8 +133,7 @@ jobs: - run: npm run generate:summary env: TEST_RESULTS_GLOBS: | - artifacts/test-results/**/*junit*.xml - artifacts/pester-junit-*/pester-junit.xml + artifacts/test-results*/**/*junit*.xml REQ_MAPPING_FILE: requirements.json DISPATCHER_REGISTRY: dispatchers.json EVIDENCE_DIR: artifacts/evidence From f958fb8a5174f500dd2ea28fd290b1cbbec0d08c Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 11:33:56 -0700 Subject: [PATCH 16/73] preserve and upload unit test reports (#61) --- .../workflows/run-unit-tests-self-hosted.json | 11 ++++++- .../workflows/run-unit-tests-self-hosted.yml | 8 ++++- scripts/run-unit-tests/README.md | 4 +-- scripts/run-unit-tests/RunUnitTests.ps1 | 33 +++++++------------ tests/pester/RunUnitTests.Workflow.Tests.ps1 | 7 +++- 5 files changed, 35 insertions(+), 28 deletions(-) diff --git a/.github/workflows/run-unit-tests-self-hosted.json b/.github/workflows/run-unit-tests-self-hosted.json index 3a0ef5dd..804012f8 100644 --- a/.github/workflows/run-unit-tests-self-hosted.json +++ b/.github/workflows/run-unit-tests-self-hosted.json @@ -21,12 +21,21 @@ "working_directory": "scripts/run-unit-tests" } }, + { + "name": "Upload test results to GitHub", + "uses": "actions/upload-test-results@v1", + "if": "${{ (success() || failure()) && !cancelled() }}", + "with": { + "files": "artifacts/unit-tests/UnitTestReport.xml", + "reporter": "junit" + } + }, { "name": "Upload unit test results", "uses": "actions/upload-artifact@v4", "with": { "name": "unit-test-results", - "path": "scripts/run-unit-tests/UnitTestReport.xml" + "path": "artifacts/unit-tests/UnitTestReport.xml" } } ] diff --git a/.github/workflows/run-unit-tests-self-hosted.yml b/.github/workflows/run-unit-tests-self-hosted.yml index 583baf53..7c2c82b3 100644 --- a/.github/workflows/run-unit-tests-self-hosted.yml +++ b/.github/workflows/run-unit-tests-self-hosted.yml @@ -16,8 +16,14 @@ jobs: project_path: 'scripts/run-unit-tests/lv_icon.lvproj' test_config: 'scripts/run-unit-tests/unittest-config.cfg' working_directory: 'scripts/run-unit-tests' + - name: Upload test results to GitHub + uses: actions/upload-test-results@v1 + if: ${{ (success() || failure()) && !cancelled() }} + with: + files: 'artifacts/unit-tests/UnitTestReport.xml' + reporter: junit - name: Upload unit test results uses: actions/upload-artifact@v4 with: name: unit-test-results - path: 'scripts/run-unit-tests/UnitTestReport.xml' + path: 'artifacts/unit-tests/UnitTestReport.xml' diff --git a/scripts/run-unit-tests/README.md b/scripts/run-unit-tests/README.md index fbe8ed09..ab716802 100644 --- a/scripts/run-unit-tests/README.md +++ b/scripts/run-unit-tests/README.md @@ -1,7 +1,7 @@ # Run Unit Tests ✅ Invoke **`RunUnitTests.ps1`** to execute LabVIEW unit tests and output a result table. -Reports are deleted when all tests pass; set `keep_report` to retain them. +The script copies `UnitTestReport.xml` to `artifacts/unit-tests/UnitTestReport.xml` for later use. ## Inputs @@ -9,7 +9,6 @@ Reports are deleted when all tests pass; set `keep_report` to retain them. |------|----------|---------|-------------| | `minimum_supported_lv_version` | **Yes** | `2021` | LabVIEW major version. | | `supported_bitness` | **Yes** | `32` or `64` | Target LabVIEW bitness. | -| `keep_report` | No | `true` | Skip cleanup so `UnitTestReport.xml` remains on disk. | ## Quick-start @@ -18,7 +17,6 @@ Reports are deleted when all tests pass; set `keep_report` to retain them. with: minimum_supported_lv_version: 2024 supported_bitness: 64 - # keep_report: true ``` See also: [docs/actions/run-unit-tests.md](../../docs/actions/run-unit-tests.md) diff --git a/scripts/run-unit-tests/RunUnitTests.ps1 b/scripts/run-unit-tests/RunUnitTests.ps1 index 87f2996f..32ca32c3 100644 --- a/scripts/run-unit-tests/RunUnitTests.ps1 +++ b/scripts/run-unit-tests/RunUnitTests.ps1 @@ -16,9 +16,6 @@ .PARAMETER SupportedBitness Bitness for LabVIEW (e.g., "64"). -.PARAMETER KeepReport - Skip cleanup so the UnitTestReport.xml remains on disk. - .NOTES PowerShell 7.5+ assumed for cross-platform support. This script *requires* that g-cli and LabVIEW be compatible with the OS. @@ -32,10 +29,7 @@ param( [Parameter(Mandatory=$true)] [ValidateSet("32","64")] [string] - $SupportedBitness, - - [switch] - $KeepReport + $SupportedBitness ) # -------------------------------------------------------------------- @@ -232,27 +226,22 @@ function MainSequence { # -------------------------- CLEANUP -------------------------- function Cleanup { Write-Host "`n=== Cleanup ===" - # If everything passed (and g-cli was OK), delete the report - if (($script:OriginalExitCode -eq 0) -and (-not $script:TestsHadFailures)) { - try { - Remove-Item $ReportPath -Force -ErrorAction Stop - Write-Host "`nAll tests passed. Deleted UnitTestReport.xml." - } - catch { - Write-Warning "Failed to delete $($ReportPath): $($_.Exception.Message)" - } + try { + $artifactDir = Join-Path -Path (Join-Path $PSScriptRoot '..' '..') -ChildPath 'artifacts/unit-tests' + New-Item -ItemType Directory -Path $artifactDir -Force | Out-Null + $dest = Join-Path -Path $artifactDir -ChildPath 'UnitTestReport.xml' + Copy-Item -Path $ReportPath -Destination $dest -Force + Write-Host "Copied UnitTestReport.xml to $dest." + } + catch { + Write-Warning "Failed to copy UnitTestReport.xml: $($_.Exception.Message)" } } # ------------------- EXECUTION FLOW ------------------- Setup MainSequence -if (-not $KeepReport) { - Cleanup -} -else { - Write-Host "`nSkipping Cleanup; retaining UnitTestReport.xml." -} +Cleanup # ------------------- FINAL EXIT CODE ------------------ if ($Script:OriginalExitCode -ne 0) { diff --git a/tests/pester/RunUnitTests.Workflow.Tests.ps1 b/tests/pester/RunUnitTests.Workflow.Tests.ps1 index a612c083..5869cc71 100644 --- a/tests/pester/RunUnitTests.Workflow.Tests.ps1 +++ b/tests/pester/RunUnitTests.Workflow.Tests.ps1 @@ -16,6 +16,7 @@ Describe 'RunUnitTests.Workflow' { $job = $wf.jobs.'run-unit-tests' $testStep = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_['uses'] -eq './run-unit-tests/action.yml' } | Select-Object -First 1 $artifactStep = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_['uses'] -eq 'actions/upload-artifact@v4' -and $_['with']['path'] -match 'UnitTestReport\.xml' } | Select-Object -First 1 + $summaryStep = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_['uses'] -eq 'actions/upload-test-results@v1' } | Select-Object -First 1 $checkoutSteps = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_.uses -eq 'actions/checkout@v4' } $externalCheckout = $job.steps | Where-Object { $_.ContainsKey('with') -and $_['with'].ContainsKey('repository') } @@ -31,6 +32,10 @@ Describe 'RunUnitTests.Workflow' { $artifactStep | Should -Not -BeNullOrEmpty $artifactStep.with.name | Should -Be 'unit-test-results' - $artifactStep.with.path | Should -Be 'scripts/run-unit-tests/UnitTestReport.xml' + $artifactStep.with.path | Should -Be 'artifacts/unit-tests/UnitTestReport.xml' + + $summaryStep | Should -Not -BeNullOrEmpty + $summaryStep.with.files | Should -Be 'artifacts/unit-tests/UnitTestReport.xml' + $summaryStep.with.reporter | Should -Be 'junit' } } From 9c7d6d8c0a3f6b67b4d48bbae44e226f35840da8 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 11:44:34 -0700 Subject: [PATCH 17/73] chore: append requirement tags to Pester test names (#62) --- .../AddTokenToLabview.Workflow.Tests.ps1 | 2 +- tests/pester/ApplyVipc.Workflow.Tests.ps1 | 2 +- tests/pester/Build.Workflow.Tests.ps1 | 2 +- tests/pester/BuildLvlibp.Workflow.Tests.ps1 | 2 +- .../pester/BuildViPackage.Workflow.Tests.ps1 | 2 +- tests/pester/CloseLabview.Workflow.Tests.ps1 | 2 +- tests/pester/Dispatcher.ArgsInputs.Tests.ps1 | 6 +++--- .../pester/Dispatcher.FailOnUnknown.Tests.ps1 | 4 ++-- .../pester/Dispatcher.InvalidPaths.Tests.ps1 | 4 ++-- tests/pester/Dispatcher.Tests.ps1 | 18 ++++++++--------- .../MissingInProject.Workflow.Tests.ps1 | 2 +- .../ModifyVipbDisplayInfo.Workflow.Tests.ps1 | 2 +- .../PrepareLabviewSource.Workflow.Tests.ps1 | 2 +- tests/pester/RelativePath.Actions.Tests.ps1 | 20 +++++++++---------- tests/pester/RenameFile.Workflow.Tests.ps1 | 2 +- .../RestoreSetupLvSource.Workflow.Tests.ps1 | 2 +- .../RevertDevelopmentMode.Workflow.Tests.ps1 | 2 +- tests/pester/RunUnitTests.Workflow.Tests.ps1 | 2 +- tests/pester/ScriptPath.Tests.ps1 | 2 +- .../SetDevelopmentMode.Workflow.Tests.ps1 | 2 +- 20 files changed, 41 insertions(+), 41 deletions(-) diff --git a/tests/pester/AddTokenToLabview.Workflow.Tests.ps1 b/tests/pester/AddTokenToLabview.Workflow.Tests.ps1 index 72e89eac..7fb941db 100644 --- a/tests/pester/AddTokenToLabview.Workflow.Tests.ps1 +++ b/tests/pester/AddTokenToLabview.Workflow.Tests.ps1 @@ -10,7 +10,7 @@ Describe 'AddTokenToLabview.Workflow' { Evidence = 'tests/pester/AddTokenToLabview.Workflow.Tests.ps1' } - It 'runs add-token-to-labview action and uploads token artifact' -Tag 'REQ-008' { + It 'runs add-token-to-labview action and uploads token artifact [REQ-008]' -Tag 'REQ-008' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/add-token-to-labview-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable diff --git a/tests/pester/ApplyVipc.Workflow.Tests.ps1 b/tests/pester/ApplyVipc.Workflow.Tests.ps1 index 7910443e..bc9da11b 100644 --- a/tests/pester/ApplyVipc.Workflow.Tests.ps1 +++ b/tests/pester/ApplyVipc.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'ApplyVipc.DryRunTrue.Workflow' { Evidence = 'tests/pester/ApplyVipc.Workflow.Tests.ps1' } - It 'runs apply-vipc action with dry_run true' -Tag 'REQ-006' { + It 'runs apply-vipc action with dry_run true [REQ-006]' -Tag 'REQ-006' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/apply-vipc-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable diff --git a/tests/pester/Build.Workflow.Tests.ps1 b/tests/pester/Build.Workflow.Tests.ps1 index 8278bd73..85874635 100644 --- a/tests/pester/Build.Workflow.Tests.ps1 +++ b/tests/pester/Build.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'Build.Workflow' { Evidence = 'tests/pester/Build.Workflow.Tests.ps1' } - It 'runs build action with required inputs' -Tag 'REQ-009' { + It 'runs build action with required inputs [REQ-009]' -Tag 'REQ-009' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/build-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable diff --git a/tests/pester/BuildLvlibp.Workflow.Tests.ps1 b/tests/pester/BuildLvlibp.Workflow.Tests.ps1 index bf7764ec..70acf817 100644 --- a/tests/pester/BuildLvlibp.Workflow.Tests.ps1 +++ b/tests/pester/BuildLvlibp.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'BuildLvlibp.Workflow' { Evidence = 'tests/pester/BuildLvlibp.Workflow.Tests.ps1' } - It 'runs build-lvlibp action and uploads lvlibp artifact' -Tag 'REQ-010' { + It 'runs build-lvlibp action and uploads lvlibp artifact [REQ-010]' -Tag 'REQ-010' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/build-lvlibp-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable diff --git a/tests/pester/BuildViPackage.Workflow.Tests.ps1 b/tests/pester/BuildViPackage.Workflow.Tests.ps1 index 4c28cca8..2a1b4fa6 100644 --- a/tests/pester/BuildViPackage.Workflow.Tests.ps1 +++ b/tests/pester/BuildViPackage.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'BuildViPackage.Workflow' { Evidence = 'tests/pester/BuildViPackage.Workflow.Tests.ps1' } - It 'runs build-vi-package action and uploads vi package artifact' -Tag 'REQ-011' { + It 'runs build-vi-package action and uploads vi package artifact [REQ-011]' -Tag 'REQ-011' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/build-vi-package-self-hosted.json' if (-not (Test-Path $workflowPath)) { diff --git a/tests/pester/CloseLabview.Workflow.Tests.ps1 b/tests/pester/CloseLabview.Workflow.Tests.ps1 index 8a6a33b9..a2f3cb62 100644 --- a/tests/pester/CloseLabview.Workflow.Tests.ps1 +++ b/tests/pester/CloseLabview.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'CloseLabview.Workflow' { Evidence = 'tests/pester/CloseLabview.Workflow.Tests.ps1' } - It 'runs close-labview action for 32-bit and 64-bit and uploads logs' -Tag 'REQ-012' { + It 'runs close-labview action for 32-bit and 64-bit and uploads logs [REQ-012]' -Tag 'REQ-012' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $wfFile = Join-Path $repoRoot '.github/workflows/close-labview-external.json' diff --git a/tests/pester/Dispatcher.ArgsInputs.Tests.ps1 b/tests/pester/Dispatcher.ArgsInputs.Tests.ps1 index c68c7172..23baed94 100644 --- a/tests/pester/Dispatcher.ArgsInputs.Tests.ps1 +++ b/tests/pester/Dispatcher.ArgsInputs.Tests.ps1 @@ -16,7 +16,7 @@ Describe 'Dispatcher Args Inputs' { Evidence = 'tests/pester/Dispatcher.ArgsInputs.Tests.ps1' } - It 'accepts ArgsJson and warns on unknown parameters' -Tag 'REQ-000' { + It 'accepts ArgsJson and warns on unknown parameters [REQ-000]' -Tag 'REQ-000' { $params = Get-LabVIEWIconEditorArgsJson $projectRoot = $params.WorkingDirectory @@ -32,7 +32,7 @@ Describe 'Dispatcher Args Inputs' { $out | Should -Match "Ignored unknown parameters for 'close-labview': Extra" } - It 'accepts ArgsFile and warns on unknown parameters' -Tag 'REQ-000' { + It 'accepts ArgsFile and warns on unknown parameters [REQ-000]' -Tag 'REQ-000' { $params = Get-LabVIEWIconEditorArgsJson $projectRoot = $params.WorkingDirectory @@ -46,7 +46,7 @@ Describe 'Dispatcher Args Inputs' { $out | Should -Match "Ignored unknown parameters for 'close-labview': Extra" } - It 'uses inline args to override file and warns on all unknown parameters' -Tag 'REQ-000' { + It 'uses inline args to override file and warns on all unknown parameters [REQ-000]' -Tag 'REQ-000' { $params = Get-LabVIEWIconEditorArgsJson $projectRoot = $params.WorkingDirectory diff --git a/tests/pester/Dispatcher.FailOnUnknown.Tests.ps1 b/tests/pester/Dispatcher.FailOnUnknown.Tests.ps1 index 269ea336..14ce5971 100644 --- a/tests/pester/Dispatcher.FailOnUnknown.Tests.ps1 +++ b/tests/pester/Dispatcher.FailOnUnknown.Tests.ps1 @@ -16,7 +16,7 @@ Describe 'Dispatcher FailOnUnknown' { Evidence = 'tests/pester/Dispatcher.FailOnUnknown.Tests.ps1' } - It 'warns on unknown parameters by default' -Tag 'REQ-000' { + It 'warns on unknown parameters by default [REQ-000]' -Tag 'REQ-000' { $params = Get-LabVIEWIconEditorArgsJson $json = @{ MinimumSupportedLVVersion = '2021'; SupportedBitness = '64'; Extra = 'value' } | ConvertTo-Json -Compress $out = & $global:dispatcher -ActionName close-labview -ArgsJson $json -WorkingDirectory $params.WorkingDirectory -DryRun *>&1 | Out-String @@ -24,7 +24,7 @@ Describe 'Dispatcher FailOnUnknown' { $out | Should -Match "Ignored unknown parameters for 'close-labview': Extra" } - It 'throws on unknown parameters when FailOnUnknown is set' -Tag 'REQ-000' { + It 'throws on unknown parameters when FailOnUnknown is set [REQ-000]' -Tag 'REQ-000' { $params = Get-LabVIEWIconEditorArgsJson $json = @{ MinimumSupportedLVVersion = '2021'; SupportedBitness = '64'; Extra = 'value' } | ConvertTo-Json -Compress { & $global:dispatcher -ActionName close-labview -ArgsJson $json -WorkingDirectory $params.WorkingDirectory -DryRun -FailOnUnknown } | Should -Throw "Ignored unknown parameters for 'close-labview': Extra" diff --git a/tests/pester/Dispatcher.InvalidPaths.Tests.ps1 b/tests/pester/Dispatcher.InvalidPaths.Tests.ps1 index 1010b75a..8c2d22d4 100644 --- a/tests/pester/Dispatcher.InvalidPaths.Tests.ps1 +++ b/tests/pester/Dispatcher.InvalidPaths.Tests.ps1 @@ -20,14 +20,14 @@ Describe 'Invalid RelativePath handling' { Evidence = 'tests/pester/Dispatcher.InvalidPaths.Tests.ps1' } - It 'fails when RelativePath does not exist' -Tag 'REQ-005' { + It 'fails when RelativePath does not exist [REQ-005]' -Tag 'REQ-005' { $json = @{ RelativePath = 'NoSuchDir' } | ConvertTo-Json -Compress $out = pwsh -NonInteractive -NoProfile -File $global:dispatcher -ActionName set-development-mode -ArgsJson $json -WorkingDirectory $projectRoot *>&1 | Out-String $LASTEXITCODE | Should -Not -Be 0 $out | Should -Match $errorText } - It 'fails when RelativePath is missing' -Tag 'REQ-005' { + It 'fails when RelativePath is missing [REQ-005]' -Tag 'REQ-005' { $out = pwsh -NonInteractive -NoProfile -File $global:dispatcher -ActionName set-development-mode -ArgsJson '{}' -WorkingDirectory $projectRoot *>&1 | Out-String $LASTEXITCODE | Should -Not -Be 0 $out | Should -Match 'missing mandatory' diff --git a/tests/pester/Dispatcher.Tests.ps1 b/tests/pester/Dispatcher.Tests.ps1 index b91a630a..0ee7f430 100644 --- a/tests/pester/Dispatcher.Tests.ps1 +++ b/tests/pester/Dispatcher.Tests.ps1 @@ -21,7 +21,7 @@ $meta = @{ } Describe 'Unified Dispatcher — discovery and validation' { - It 'lists available actions' -Tag 'REQ-001' { + It 'lists available actions [REQ-001]' -Tag 'REQ-001' { $params = Get-LabVIEWIconEditorArgsJson $json = $params.ArgsJson $projectRoot = $params.WorkingDirectory @@ -31,7 +31,7 @@ Describe 'Unified Dispatcher — discovery and validation' { $out | Should -Match 'missing-in-project' $out | Should -Match 'run-unit-tests' } - It 'registry includes all Invoke* adapters in module' -Tag 'REQ-001' { + It 'registry includes all Invoke* adapters in module [REQ-001]' -Tag 'REQ-001' { $modulePath = Join-Path (Split-Path $global:dispatcher -Parent) 'OpenSourceActions.psm1' $module = Import-Module $modulePath -PassThru $fnNames = (Get-Command -Module $module | Where-Object { $_.Name -like 'Invoke*' -and $_.Name -ne 'Invoke-OpenSourceActionScript' }).Name @@ -49,7 +49,7 @@ Describe 'Unified Dispatcher — discovery and validation' { $listed | Should -Match " - $action" } } - It 'describes a known action (build-lvlibp)' -Tag 'REQ-001' { + It 'describes a known action (build-lvlibp) [REQ-001]' -Tag 'REQ-001' { $params = Get-LabVIEWIconEditorArgsJson $json = $params.ArgsJson $projectRoot = $params.WorkingDirectory @@ -61,7 +61,7 @@ Describe 'Unified Dispatcher — discovery and validation' { $out | Should -Match 'Commit' } - It 'fails gracefully on unknown action' -Tag 'REQ-001' { + It 'fails gracefully on unknown action [REQ-001]' -Tag 'REQ-001' { $params = Get-LabVIEWIconEditorArgsJson $json = $params.ArgsJson $projectRoot = $params.WorkingDirectory @@ -71,7 +71,7 @@ Describe 'Unified Dispatcher — discovery and validation' { } Describe 'ArgsJson path handling' { - It 'handles Windows paths without manual escaping' -Tag 'REQ-001' { + It 'handles Windows paths without manual escaping [REQ-001]' -Tag 'REQ-001' { $params = Get-LabVIEWIconEditorArgsJson $json = $params.ArgsJson $projectRoot = $params.WorkingDirectory @@ -81,7 +81,7 @@ Describe 'ArgsJson path handling' { } Describe 'ArgsFile handling' { - It 'merges file arguments with inline overrides' -Tag 'REQ-001' { + It 'merges file arguments with inline overrides [REQ-001]' -Tag 'REQ-001' { $jsonFile = Join-Path $TestDrive 'args.json' @{ MinimumSupportedLVVersion = '2021'; SupportedBitness = '32' } | ConvertTo-Json -Compress | Set-Content -Path $jsonFile @@ -96,7 +96,7 @@ Describe 'ArgsFile handling' { Describe 'Filter-Args helper' { - It 'returns UnknownParams when requested' -Tag 'REQ-001' { + It 'returns UnknownParams when requested [REQ-001]' -Tag 'REQ-001' { $ast = [System.Management.Automation.Language.Parser]::ParseFile($global:dispatcher, [ref]$null, [ref]$null) $funcAst = $ast.Find({ param($a) $a -is [System.Management.Automation.Language.FunctionDefinitionAst] -and $a.Name -eq 'Filter-Args' }, $true) Invoke-Expression $funcAst.Extent.Text @@ -113,7 +113,7 @@ Describe 'Filter-Args helper' { } Describe 'close-labview parameter aliases' { - It 'accepts camelCase args' -Tag 'REQ-001' { + It 'accepts camelCase args [REQ-001]' -Tag 'REQ-001' { $params = Get-LabVIEWIconEditorArgsJson $base = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory @@ -125,7 +125,7 @@ Describe 'Filter-Args helper' { $LASTEXITCODE | Should -Be 0 } - It 'accepts snake_case args without warnings' -Tag 'REQ-001' { + It 'accepts snake_case args without warnings [REQ-001]' -Tag 'REQ-001' { $params = Get-LabVIEWIconEditorArgsJson $base = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory diff --git a/tests/pester/MissingInProject.Workflow.Tests.ps1 b/tests/pester/MissingInProject.Workflow.Tests.ps1 index 5dd1cc21..dd69a393 100644 --- a/tests/pester/MissingInProject.Workflow.Tests.ps1 +++ b/tests/pester/MissingInProject.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'MissingInProject.Workflow' { Evidence = 'tests/pester/MissingInProject.Workflow.Tests.ps1' } - It 'runs missing-in-project action and uploads findings report' -Tag 'REQ-014' { + It 'runs missing-in-project action and uploads findings report [REQ-014]' -Tag 'REQ-014' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/missing-in-project-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable diff --git a/tests/pester/ModifyVipbDisplayInfo.Workflow.Tests.ps1 b/tests/pester/ModifyVipbDisplayInfo.Workflow.Tests.ps1 index 2af15bf7..81ddc678 100644 --- a/tests/pester/ModifyVipbDisplayInfo.Workflow.Tests.ps1 +++ b/tests/pester/ModifyVipbDisplayInfo.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'ModifyVipbDisplayInfo.Workflow' { Evidence = 'tests/pester/ModifyVipbDisplayInfo.Workflow.Tests.ps1' } - It 'runs modify-vipb-display-info action and uploads VIPB artifact' -Tag 'REQ-015' { + It 'runs modify-vipb-display-info action and uploads VIPB artifact [REQ-015]' -Tag 'REQ-015' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/modify-vipb-display-info-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable diff --git a/tests/pester/PrepareLabviewSource.Workflow.Tests.ps1 b/tests/pester/PrepareLabviewSource.Workflow.Tests.ps1 index 90bc6a6b..e7ed5bfd 100644 --- a/tests/pester/PrepareLabviewSource.Workflow.Tests.ps1 +++ b/tests/pester/PrepareLabviewSource.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'PrepareLabviewSource.Workflow' { Evidence = 'tests/pester/PrepareLabviewSource.Workflow.Tests.ps1' } - It 'runs prepare-labview-source action and uploads prepared source artifact' -Tag 'REQ-016' { + It 'runs prepare-labview-source action and uploads prepared source artifact [REQ-016]' -Tag 'REQ-016' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/prepare-labview-source-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable diff --git a/tests/pester/RelativePath.Actions.Tests.ps1 b/tests/pester/RelativePath.Actions.Tests.ps1 index 12c99844..ce1657d1 100644 --- a/tests/pester/RelativePath.Actions.Tests.ps1 +++ b/tests/pester/RelativePath.Actions.Tests.ps1 @@ -16,7 +16,7 @@ $meta = @{ } Describe 'add-token-to-labview resolves RelativePath' { - It 'dry-runs without warnings' -Tag 'REQ-003' { + It 'dry-runs without warnings [REQ-003]' -Tag 'REQ-003' { $params = Get-LabVIEWIconEditorArgsJson $obj = $params.ArgsJson | ConvertFrom-Json $obj.RelativePath = './' @@ -32,7 +32,7 @@ Describe 'add-token-to-labview resolves RelativePath' { } Describe 'apply-vipc resolves RelativePath' { - It 'dry-runs without warnings' -Tag 'REQ-003' { + It 'dry-runs without warnings [REQ-003]' -Tag 'REQ-003' { $params = Get-LabVIEWIconEditorArgsJson $b = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory @@ -47,7 +47,7 @@ Describe 'apply-vipc resolves RelativePath' { } Describe 'build-vi-package resolves RelativePath' { - It 'dry-runs without warnings' -Tag 'REQ-003' { + It 'dry-runs without warnings [REQ-003]' -Tag 'REQ-003' { $params = Get-LabVIEWIconEditorArgsJson $b = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory @@ -62,7 +62,7 @@ Describe 'build-vi-package resolves RelativePath' { } Describe 'build resolves RelativePath' { - It 'dry-runs without warnings' -Tag 'REQ-003' { + It 'dry-runs without warnings [REQ-003]' -Tag 'REQ-003' { $params = Get-LabVIEWIconEditorArgsJson $b = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory @@ -77,7 +77,7 @@ Describe 'build resolves RelativePath' { } Describe 'build-lvlibp resolves RelativePath' { - It 'dry-runs without warnings' -Tag 'REQ-003' { + It 'dry-runs without warnings [REQ-003]' -Tag 'REQ-003' { $params = Get-LabVIEWIconEditorArgsJson $b = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory @@ -92,7 +92,7 @@ Describe 'build-lvlibp resolves RelativePath' { } Describe 'modify-vipb-display-info resolves RelativePath' { - It 'dry-runs without warnings' -Tag 'REQ-003' { + It 'dry-runs without warnings [REQ-003]' -Tag 'REQ-003' { $params = Get-LabVIEWIconEditorArgsJson $b = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory @@ -107,7 +107,7 @@ Describe 'modify-vipb-display-info resolves RelativePath' { } Describe 'prepare-labview-source resolves RelativePath' { - It 'dry-runs without warnings' -Tag 'REQ-003' { + It 'dry-runs without warnings [REQ-003]' -Tag 'REQ-003' { $params = Get-LabVIEWIconEditorArgsJson $b = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory @@ -122,7 +122,7 @@ Describe 'prepare-labview-source resolves RelativePath' { } Describe 'restore-setup-lv-source resolves RelativePath' { - It 'dry-runs without warnings' -Tag 'REQ-003' { + It 'dry-runs without warnings [REQ-003]' -Tag 'REQ-003' { $params = Get-LabVIEWIconEditorArgsJson $b = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory @@ -137,7 +137,7 @@ Describe 'restore-setup-lv-source resolves RelativePath' { } Describe 'revert-development-mode resolves RelativePath' { - It 'dry-runs without warnings' -Tag 'REQ-003' { + It 'dry-runs without warnings [REQ-003]' -Tag 'REQ-003' { $params = Get-LabVIEWIconEditorArgsJson $b = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory @@ -152,7 +152,7 @@ Describe 'revert-development-mode resolves RelativePath' { } Describe 'set-development-mode resolves RelativePath' { - It 'dry-runs without warnings' -Tag 'REQ-003' { + It 'dry-runs without warnings [REQ-003]' -Tag 'REQ-003' { $params = Get-LabVIEWIconEditorArgsJson $b = $params.ArgsJson | ConvertFrom-Json $projectRoot = $params.WorkingDirectory diff --git a/tests/pester/RenameFile.Workflow.Tests.ps1 b/tests/pester/RenameFile.Workflow.Tests.ps1 index 2e7a1dde..355c7317 100644 --- a/tests/pester/RenameFile.Workflow.Tests.ps1 +++ b/tests/pester/RenameFile.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'RenameFile.Workflow' { Evidence = 'tests/pester/RenameFile.Workflow.Tests.ps1' } - It 'runs rename-file action and uploads renamed file artifact' -Tag 'REQ-017' { + It 'runs rename-file action and uploads renamed file artifact [REQ-017]' -Tag 'REQ-017' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/rename-file-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable diff --git a/tests/pester/RestoreSetupLvSource.Workflow.Tests.ps1 b/tests/pester/RestoreSetupLvSource.Workflow.Tests.ps1 index afdb5f86..e11686f5 100644 --- a/tests/pester/RestoreSetupLvSource.Workflow.Tests.ps1 +++ b/tests/pester/RestoreSetupLvSource.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'RestoreSetupLvSource.Workflow' { Evidence = 'tests/pester/RestoreSetupLvSource.Workflow.Tests.ps1' } - It 'runs restore-setup-lv-source action and uploads restoration artifacts' -Tag 'REQ-018' { + It 'runs restore-setup-lv-source action and uploads restoration artifacts [REQ-018]' -Tag 'REQ-018' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/restore-setup-lv-source-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable diff --git a/tests/pester/RevertDevelopmentMode.Workflow.Tests.ps1 b/tests/pester/RevertDevelopmentMode.Workflow.Tests.ps1 index 4d5ee986..ae6be921 100644 --- a/tests/pester/RevertDevelopmentMode.Workflow.Tests.ps1 +++ b/tests/pester/RevertDevelopmentMode.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'RevertDevelopmentMode.Workflow' { Evidence = 'tests/pester/RevertDevelopmentMode.Workflow.Tests.ps1' } - It 'runs revert-development-mode action and uploads configuration artifact' -Tag 'REQ-019' { + It 'runs revert-development-mode action and uploads configuration artifact [REQ-019]' -Tag 'REQ-019' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $wfDir = Join-Path $repoRoot '.github/workflows' $workflowFiles = Get-ChildItem -Path $wfDir -Filter '*.json' diff --git a/tests/pester/RunUnitTests.Workflow.Tests.ps1 b/tests/pester/RunUnitTests.Workflow.Tests.ps1 index 5869cc71..c88a1059 100644 --- a/tests/pester/RunUnitTests.Workflow.Tests.ps1 +++ b/tests/pester/RunUnitTests.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'RunUnitTests.Workflow' { Evidence = 'tests/pester/RunUnitTests.Workflow.Tests.ps1' } - It 'runs run-unit-tests action and uploads unit-test results' -Tag 'REQ-011' { + It 'runs run-unit-tests action and uploads unit-test results [REQ-011]' -Tag 'REQ-011' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/run-unit-tests-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable diff --git a/tests/pester/ScriptPath.Tests.ps1 b/tests/pester/ScriptPath.Tests.ps1 index bfdfa7d3..26acea3f 100644 --- a/tests/pester/ScriptPath.Tests.ps1 +++ b/tests/pester/ScriptPath.Tests.ps1 @@ -38,7 +38,7 @@ Describe 'Action script paths' { Evidence = 'tests/pester/ScriptPath.Tests.ps1' } - It 'has script for ' -Tag 'REQ-004' -TestCases $cases { + It 'has script for [REQ-004]' -Tag 'REQ-004' -TestCases $cases { param($Name, $Path) Test-Path $Path | Should -BeTrue } diff --git a/tests/pester/SetDevelopmentMode.Workflow.Tests.ps1 b/tests/pester/SetDevelopmentMode.Workflow.Tests.ps1 index 65fcc51c..ed90c00e 100644 --- a/tests/pester/SetDevelopmentMode.Workflow.Tests.ps1 +++ b/tests/pester/SetDevelopmentMode.Workflow.Tests.ps1 @@ -9,7 +9,7 @@ Describe 'SetDevelopmentMode.Workflow' { Evidence = 'tests/pester/SetDevelopmentMode.Workflow.Tests.ps1' } - It 'runs set-development-mode action and uploads logs' -Tag 'REQ-021' { + It 'runs set-development-mode action and uploads logs [REQ-021]' -Tag 'REQ-021' { $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..' '..')).Path $workflowPath = Join-Path $repoRoot '.github/workflows/set-development-mode-self-hosted.json' $wf = Get-Content -Raw $workflowPath | ConvertFrom-Json -AsHashtable From fbb5be0b549a0f9d08860ca9e966934e822ebc12 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 12:38:17 -0700 Subject: [PATCH 18/73] chore: upload junit results in CI --- .github/workflows/ci.json | 20 +++++++++++++++++++- .github/workflows/ci.yml | 18 ++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.json b/.github/workflows/ci.json index 764d0a16..3a420eaa 100644 --- a/.github/workflows/ci.json +++ b/.github/workflows/ci.json @@ -46,6 +46,24 @@ { "run": "rm -rf artifacts" }, + { + "run": "mkdir -p artifacts && cp test-results/*junit*.xml artifacts/" + }, + { + "uses": "actions/upload-artifact@v4", + "if": "always()", + "with": { + "name": "junit-results", + "path": "artifacts/**/*junit*.xml" + } + }, + { + "uses": "actions/upload-test-results@v1", + "if": "always()", + "with": { + "junit-files": "artifacts/**/*junit*.xml" + } + }, { "run": "npm run generate:summary", "env": { @@ -179,7 +197,7 @@ { "run": "npm run generate:summary", "env": { - "TEST_RESULTS_GLOBS": "artifacts/test-results/**/*junit*.xml\nartifacts/pester-junit-*/pester-junit.xml\n", + "TEST_RESULTS_GLOBS": "artifacts/junit-results/artifacts/**/*junit*.xml\nartifacts/pester-junit-*/pester-junit.xml\n", "REQ_MAPPING_FILE": "requirements.json", "DISPATCHER_REGISTRY": "dispatchers.json", "EVIDENCE_DIR": "artifacts/evidence" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f8f184ee..10859603 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,14 +24,19 @@ jobs: - run: npm run test:ci - run: npm run derive:registry - run: rm -rf artifacts - - run: npm run generate:summary - env: - TEST_RESULTS_GLOBS: test-results/*junit*.xml + - run: mkdir -p artifacts && cp test-results/*junit*.xml artifacts/ - uses: actions/upload-artifact@v4 if: ${{ (success() || failure()) && !cancelled() }} with: - name: test-results - path: test-results + name: junit-results + path: artifacts/**/*junit*.xml + - uses: actions/upload-test-results@v1 + if: ${{ (success() || failure()) && !cancelled() }} + with: + junit-files: artifacts/**/*junit*.xml + - run: npm run generate:summary + env: + TEST_RESULTS_GLOBS: test-results/*junit*.xml - uses: actions/upload-artifact@v4 if: ${{ (success() || failure()) && !cancelled() }} with: @@ -133,7 +138,8 @@ jobs: - run: npm run generate:summary env: TEST_RESULTS_GLOBS: | - artifacts/test-results*/**/*junit*.xml + artifacts/junit-results/artifacts/**/*junit*.xml + artifacts/pester-junit-*/pester-junit.xml REQ_MAPPING_FILE: requirements.json DISPATCHER_REGISTRY: dispatchers.json EVIDENCE_DIR: artifacts/evidence From 60fbf258b30f89afdc3a9a69ecc3b0844664bf50 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 13:31:16 -0700 Subject: [PATCH 19/73] chore: use publish unit test results action (#66) * chore: use publish unit test results action * ci: include test file globs in test:ci (#67) --- .github/workflows/ci.json | 4 ++-- .github/workflows/ci.yml | 4 ++-- .github/workflows/run-unit-tests-self-hosted.json | 5 ++--- .github/workflows/run-unit-tests-self-hosted.yml | 3 +-- package.json | 2 +- tests/pester/RunUnitTests.Workflow.Tests.ps1 | 7 +++---- 6 files changed, 11 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.json b/.github/workflows/ci.json index 3a420eaa..e8761e41 100644 --- a/.github/workflows/ci.json +++ b/.github/workflows/ci.json @@ -58,10 +58,10 @@ } }, { - "uses": "actions/upload-test-results@v1", + "uses": "EnricoMi/publish-unit-test-result-action@v2", "if": "always()", "with": { - "junit-files": "artifacts/**/*junit*.xml" + "files": "artifacts/**/*junit*.xml" } }, { diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 10859603..ca153799 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,10 +30,10 @@ jobs: with: name: junit-results path: artifacts/**/*junit*.xml - - uses: actions/upload-test-results@v1 + - uses: EnricoMi/publish-unit-test-result-action@v2 if: ${{ (success() || failure()) && !cancelled() }} with: - junit-files: artifacts/**/*junit*.xml + files: artifacts/**/*junit*.xml - run: npm run generate:summary env: TEST_RESULTS_GLOBS: test-results/*junit*.xml diff --git a/.github/workflows/run-unit-tests-self-hosted.json b/.github/workflows/run-unit-tests-self-hosted.json index 804012f8..6547c085 100644 --- a/.github/workflows/run-unit-tests-self-hosted.json +++ b/.github/workflows/run-unit-tests-self-hosted.json @@ -23,11 +23,10 @@ }, { "name": "Upload test results to GitHub", - "uses": "actions/upload-test-results@v1", + "uses": "EnricoMi/publish-unit-test-result-action@v2", "if": "${{ (success() || failure()) && !cancelled() }}", "with": { - "files": "artifacts/unit-tests/UnitTestReport.xml", - "reporter": "junit" + "files": "artifacts/unit-tests/UnitTestReport.xml" } }, { diff --git a/.github/workflows/run-unit-tests-self-hosted.yml b/.github/workflows/run-unit-tests-self-hosted.yml index 7c2c82b3..07bdc48a 100644 --- a/.github/workflows/run-unit-tests-self-hosted.yml +++ b/.github/workflows/run-unit-tests-self-hosted.yml @@ -17,11 +17,10 @@ jobs: test_config: 'scripts/run-unit-tests/unittest-config.cfg' working_directory: 'scripts/run-unit-tests' - name: Upload test results to GitHub - uses: actions/upload-test-results@v1 + uses: EnricoMi/publish-unit-test-result-action@v2 if: ${{ (success() || failure()) && !cancelled() }} with: files: 'artifacts/unit-tests/UnitTestReport.xml' - reporter: junit - name: Upload unit test results uses: actions/upload-artifact@v4 with: diff --git a/package.json b/package.json index f2f531e7..2ffa6bd3 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "prederive:registry": "npm run check:node", "pregenerate:summary": "npm run check:node", "test": "tsx --test scripts/**/*.test.js scripts/*.test.js", - "test:ci": "mkdir -p test-results && tsx --test --test-reporter=junit --test-reporter-destination test-results/node-junit.xml", + "test:ci": "mkdir -p test-results && tsx --test --test-reporter=junit --test-reporter-destination test-results/node-junit.xml scripts/**/*.test.js scripts/*.test.js", "derive:registry": "tsx scripts/derive-dispatcher-registry.ts", "generate:summary": "tsx scripts/generate-ci-summary.ts", "generate:traceability-matrix": "tsx scripts/generate-traceability-matrix.ts", diff --git a/tests/pester/RunUnitTests.Workflow.Tests.ps1 b/tests/pester/RunUnitTests.Workflow.Tests.ps1 index c88a1059..a380ee26 100644 --- a/tests/pester/RunUnitTests.Workflow.Tests.ps1 +++ b/tests/pester/RunUnitTests.Workflow.Tests.ps1 @@ -16,7 +16,7 @@ Describe 'RunUnitTests.Workflow' { $job = $wf.jobs.'run-unit-tests' $testStep = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_['uses'] -eq './run-unit-tests/action.yml' } | Select-Object -First 1 $artifactStep = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_['uses'] -eq 'actions/upload-artifact@v4' -and $_['with']['path'] -match 'UnitTestReport\.xml' } | Select-Object -First 1 - $summaryStep = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_['uses'] -eq 'actions/upload-test-results@v1' } | Select-Object -First 1 + $publishStep = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_['uses'] -eq 'EnricoMi/publish-unit-test-result-action@v2' } | Select-Object -First 1 $checkoutSteps = $job.steps | Where-Object { $_.ContainsKey('uses') -and $_.uses -eq 'actions/checkout@v4' } $externalCheckout = $job.steps | Where-Object { $_.ContainsKey('with') -and $_['with'].ContainsKey('repository') } @@ -34,8 +34,7 @@ Describe 'RunUnitTests.Workflow' { $artifactStep.with.name | Should -Be 'unit-test-results' $artifactStep.with.path | Should -Be 'artifacts/unit-tests/UnitTestReport.xml' - $summaryStep | Should -Not -BeNullOrEmpty - $summaryStep.with.files | Should -Be 'artifacts/unit-tests/UnitTestReport.xml' - $summaryStep.with.reporter | Should -Be 'junit' + $publishStep | Should -Not -BeNullOrEmpty + $publishStep.with.files | Should -Be 'artifacts/unit-tests/UnitTestReport.xml' } } From 6e923b3472047bc5f6db54055272d5a5e51cf55e Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 14:18:57 -0700 Subject: [PATCH 20/73] feat: modernize link checking and expand JUnit parser coverage [REQ-023] (#68) --- .markdown-link-check.json | 7 - AGENTS.md | 2 +- CONTRIBUTING.md | 2 +- docs/contributing-docs.md | 2 +- package-lock.json | 1625 +++--------------------- package.json | 6 +- patches/@yarnpkg+lockfile+1.1.0.patch | 17 - patches/link-check+5.4.0.patch | 20 - scripts/__tests__/junit-parser.test.js | 7 + 9 files changed, 178 insertions(+), 1510 deletions(-) delete mode 100644 .markdown-link-check.json delete mode 100644 patches/@yarnpkg+lockfile+1.1.0.patch delete mode 100644 patches/link-check+5.4.0.patch diff --git a/.markdown-link-check.json b/.markdown-link-check.json deleted file mode 100644 index bb763bf1..00000000 --- a/.markdown-link-check.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "ignorePatterns": [ - { "pattern": "^https://open-source-actions.github.io/open-source-actions/" }, - { "pattern": "^http://127\\.0\\.0\\.1:8000/" }, - { "pattern": "^https://github.com/ni/g-cli" } - ] -} diff --git a/AGENTS.md b/AGENTS.md index 81a9a53c..0ae4b1b6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -31,6 +31,6 @@ - Run `npm install` to ensure Node dependencies are available. - Run `npm test`. - Run `npm run lint:md` to lint Markdown files. -- Run `npx --yes markdown-link-check -c .markdown-link-check.json README.md $(find docs scripts -name '*.md')` to verify links and ensure failures are visible. +- Run `npx --yes linkinator README.md docs scripts --markdown --skip "https://open-source-actions.github.io/open-source-actions/" --skip "http://127.0.0.1:8000/" --skip "https://github.com/ni/g-cli" --skip "^docs$" --skip "^scripts$"` to verify links and ensure failures are visible. - Run `actionlint` to validate GitHub Actions workflows. - Run `pwsh -NoLogo -Command "$cfg = New-PesterConfiguration; $cfg.Run.Path = './tests/pester'; $cfg.TestResult.Enabled = $false; Invoke-Pester -Configuration $cfg"` and ensure all tests pass (XML output is intentionally disabled). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e4bb8a81..686d6a32 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ For documentation updates, follow the [documentation contribution guidelines](do ```bash npm run lint:md -npx --yes markdown-link-check -q -c .markdown-link-check.json README.md $(find docs scripts -name '*.md') +npx --yes linkinator README.md docs scripts --markdown --skip "https://open-source-actions.github.io/open-source-actions/" --skip "http://127.0.0.1:8000/" --skip "https://github.com/ni/g-cli" --skip "^docs$" --skip "^scripts$" ``` ## Requirement Traceability diff --git a/docs/contributing-docs.md b/docs/contributing-docs.md index c9b36a7a..90e98c0a 100644 --- a/docs/contributing-docs.md +++ b/docs/contributing-docs.md @@ -11,7 +11,7 @@ Action documentation lives under [docs/actions/](actions/). Keep these files in ## Markdown linting - Run `npm run lint:md` to lint Markdown formatting. -- Run `npx --yes markdown-link-check -q -c .markdown-link-check.json README.md $(find docs scripts -name '*.md')` to check links before submitting changes. +- Run `npx --yes linkinator README.md docs scripts --markdown --skip "https://open-source-actions.github.io/open-source-actions/" --skip "http://127.0.0.1:8000/" --skip "https://github.com/ni/g-cli" --skip "^docs$" --skip "^scripts$"` to check links before submitting changes. - Keep one `#`-level heading at the top of each file and increment heading levels sequentially; do not skip levels. ## Heading levels diff --git a/package-lock.json b/package-lock.json index c070955a..bafaec23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,6 @@ "": { "name": "open-source-actions", "version": "1.0.0", - "hasInstallScript": true, "license": "MIT", "dependencies": { "adm-zip": "^0.5.10", @@ -18,9 +17,8 @@ "devDependencies": { "@types/node": "^24.3.0", "@types/xml2js": "^0.4.14", - "markdown-link-check": "3.13.7", + "linkinator": "^6.1.4", "markdownlint-cli2": "^0.12.1", - "patch-package": "^8.0.0", "tsx": "^4.20.4", "typescript": "^5.4.0" }, @@ -525,58 +523,6 @@ "node": ">= 8" } }, - "node_modules/@oozcitak/dom": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", - "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/url": "1.0.4", - "@oozcitak/util": "8.3.8" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@oozcitak/infra": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", - "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oozcitak/util": "8.3.8" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@oozcitak/url": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", - "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@oozcitak/util": { - "version": "8.3.8", - "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", - "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -600,13 +546,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { "version": "24.3.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", @@ -627,13 +566,6 @@ "@types/node": "*" } }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/adm-zip": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", @@ -683,59 +615,12 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -758,56 +643,6 @@ "node": ">=8" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/chalk": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.5.0.tgz", @@ -821,66 +656,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cheerio": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", - "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.0.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.12.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -899,23 +674,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -930,46 +688,6 @@ "node": ">= 8" } }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -988,39 +706,6 @@ } } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -1080,21 +765,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -1107,20 +777,6 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -1134,39 +790,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esbuild": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", @@ -1209,61 +832,19 @@ "@esbuild/win32-x64": "0.25.9" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", @@ -1305,16 +886,6 @@ "node": ">=8" } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "micromatch": "^4.0.2" - } - }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -1331,29 +902,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1369,53 +917,21 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14" } }, "node_modules/get-tsconfig": { @@ -1431,21 +947,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -1513,85 +1014,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-link-extractor": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-link-extractor/-/html-link-extractor-1.0.5.tgz", - "integrity": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio": "^1.0.0-rc.10" - } - }, "node_modules/htmlparser2": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", @@ -1625,20 +1047,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -1653,19 +1061,6 @@ "node": ">= 14" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1676,64 +1071,6 @@ "node": ">= 4" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/is-absolute-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", - "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1776,42 +1113,19 @@ "node": ">=0.12.0" } }, - "node_modules/is-relative-url": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.0.0.tgz", - "integrity": "sha512-PkzoL1qKAYXNFct5IKdKRH/iBQou/oCC85QhXj6WKtUQBliZ4Yfd3Zk27RHu9KQG8r6zgvAA2AQKC9p+rqTszg==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", - "dependencies": { - "is-absolute-url": "^4.0.1" - }, "engines": { - "node": ">=14.16" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1845,26 +1159,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-stable-stringify": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", - "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "isarray": "^2.0.5", - "jsonify": "^0.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", @@ -1872,61 +1166,52 @@ "dev": true, "license": "MIT" }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "license": "MIT", "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "dev": true, - "license": "Public Domain", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "uc.micro": "^2.0.0" } }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "node_modules/linkinator": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/linkinator/-/linkinator-6.1.4.tgz", + "integrity": "sha512-7DXjwFiJ6rqye8OawwWi/CyDdKdIb69HLCbPhRI6tGSNnGruWFw8qucNsoWFXybel/I960UujFHefjvprhhvYA==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.11" - } - }, - "node_modules/link-check": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.4.0.tgz", - "integrity": "sha512-0Pf4xBVUnwJdbDgpBlhHNmWDtbVjHTpIFs+JaBuIsC9PKRxjv4KMGCO2Gc8lkVnqMf9B/yaNY+9zmMlO5MyToQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-relative-url": "^4.0.0", - "ms": "^2.1.3", - "needle": "^3.3.1", - "node-email-verifier": "^2.0.0", - "proxy-agent": "^6.4.0" + "chalk": "^5.0.0", + "escape-html": "^1.0.3", + "gaxios": "^6.0.0", + "glob": "^10.3.10", + "htmlparser2": "^10.0.0", + "marked": "^13.0.0", + "meow": "^13.0.0", + "mime": "^4.0.0", + "server-destroy": "^1.0.1", + "srcset": "^5.0.0" + }, + "bin": { + "linkinator": "build/src/cli.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "node_modules/linkinator/node_modules/marked": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", + "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", "dev": true, "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" } }, "node_modules/lru-cache": { @@ -1953,38 +1238,6 @@ "markdown-it": "bin/markdown-it.mjs" } }, - "node_modules/markdown-link-check": { - "version": "3.13.7", - "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.13.7.tgz", - "integrity": "sha512-Btn3HU8s2Uyh1ZfzmyZEkp64zp2+RAjwfQt1u4swq2Xa6w37OW0T2inQZrkSNVxDSa2jSN2YYhw/JkAp5jF1PQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "async": "^3.2.6", - "chalk": "^5.3.0", - "commander": "^13.1.0", - "link-check": "^5.4.0", - "markdown-link-extractor": "^4.0.2", - "needle": "^3.3.1", - "progress": "^2.0.3", - "proxy-agent": "^6.4.0", - "xmlbuilder2": "^3.1.1" - }, - "bin": { - "markdown-link-check": "markdown-link-check" - } - }, - "node_modules/markdown-link-extractor": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/markdown-link-extractor/-/markdown-link-extractor-4.0.2.tgz", - "integrity": "sha512-5cUOu4Vwx1wenJgxaudsJ8xwLUMN7747yDJX3V/L7+gi3e4MsCm7w5nbrDQQy8nEfnl4r5NV3pDXMAjhGXYXAw==", - "dev": true, - "license": "ISC", - "dependencies": { - "html-link-extractor": "^1.0.5", - "marked": "^12.0.1" - } - }, "node_modules/markdownlint": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.33.0.tgz", @@ -2073,29 +1326,6 @@ "url": "https://github.com/sponsors/DavidAnson" } }, - "node_modules/marked": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", - "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", - "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -2103,338 +1333,116 @@ "dev": true, "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node-email-verifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-email-verifier/-/node-email-verifier-2.0.0.tgz", - "integrity": "sha512-AHcppjOH2KT0mxakrxFMOMjV/gOVMRpYvnJUkNfgF9oJ3INdVmqcMFJ5TlM8elpTPwt6A7bSp1IMnnWcxGom/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3", - "validator": "^13.11.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, "engines": { - "node": ">= 14" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "node": ">= 8" } }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { - "parse5": "^7.0.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": ">=8.6" } }, - "node_modules/patch-package": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", - "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "node_modules/mime": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.7.tgz", + "integrity": "sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], "license": "MIT", - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "ci-info": "^3.7.0", - "cross-spawn": "^7.0.3", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "json-stable-stringify": "^1.0.2", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^7.5.3", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^2.2.2" - }, "bin": { - "patch-package": "index.js" + "mime": "bin/cli.js" }, "engines": { - "node": ">=14", - "npm": ">5" + "node": ">=16" } }, - "node_modules/patch-package/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { - "color-convert": "^2.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/patch-package/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/path-is-absolute": { + "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" }, "node_modules/path-key": { "version": "3.1.1", @@ -2487,53 +1495,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true, - "license": "MIT" - }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -2586,66 +1547,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -2670,49 +1571,18 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "license": "ISC" }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } + "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -2747,75 +1617,19 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "node_modules/srcset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-5.0.1.tgz", + "integrity": "sha512-/P1UYbGfJVlxZag7aABNRrulEXAwCSDo7fklafOQrantuPTDmYgijJMks2zusPCVzgW9+4P69mq7w6pYuZpgxw==", "dev": true, "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -2912,32 +1726,6 @@ "node": ">=8" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2951,12 +1739,12 @@ "node": ">=8.0" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, - "license": "0BSD" + "license": "MIT" }, "node_modules/tsx": { "version": "4.20.4", @@ -2999,16 +1787,6 @@ "dev": true, "license": "MIT" }, - "node_modules/undici": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.13.0.tgz", - "integrity": "sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, "node_modules/undici-types": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", @@ -3029,47 +1807,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "engines": { - "node": ">= 10.0.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/validator": { - "version": "13.15.15", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", - "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==", + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } + "license": "BSD-2-Clause" }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "license": "MIT", "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/which": { @@ -3178,13 +1945,6 @@ "node": ">=8" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, "node_modules/xml2js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", @@ -3206,59 +1966,6 @@ "engines": { "node": ">=4.0" } - }, - "node_modules/xmlbuilder2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz", - "integrity": "sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oozcitak/dom": "1.15.10", - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8", - "js-yaml": "3.14.1" - }, - "engines": { - "node": ">=12.0" - } - }, - "node_modules/xmlbuilder2/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/xmlbuilder2/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } } } } diff --git a/package.json b/package.json index 2ffa6bd3..066bcceb 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,8 @@ "generate:summary": "tsx scripts/generate-ci-summary.ts", "generate:traceability-matrix": "tsx scripts/generate-traceability-matrix.ts", "check:traceability": "tsx scripts/check-traceability.ts", - "postinstall": "patch-package", "lint:md": "markdownlint-cli2 README.md \"docs/**/*.md\" \"scripts/**/*.md\"", - "link:check": "markdown-link-check -q -c .markdown-link-check.json README.md $(find docs scripts -name '*.md')" + "link:check": "linkinator README.md docs scripts --markdown --skip \"https://open-source-actions.github.io/open-source-actions/\" --skip \"http://127\\.0\\.0\\.1:8000/\" --skip \"https://github.com/ni/g-cli\" --skip \"^docs$\" --skip \"^scripts$\"" }, "dependencies": { "adm-zip": "^0.5.10", @@ -33,9 +32,8 @@ "devDependencies": { "@types/node": "^24.3.0", "@types/xml2js": "^0.4.14", - "markdown-link-check": "3.13.7", + "linkinator": "^6.1.4", "markdownlint-cli2": "^0.12.1", - "patch-package": "^8.0.0", "tsx": "^4.20.4", "typescript": "^5.4.0" } diff --git a/patches/@yarnpkg+lockfile+1.1.0.patch b/patches/@yarnpkg+lockfile+1.1.0.patch deleted file mode 100644 index 53289959..00000000 --- a/patches/@yarnpkg+lockfile+1.1.0.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/node_modules/@yarnpkg/lockfile/index.js b/node_modules/@yarnpkg/lockfile/index.js -index 67cab24..c634614 100644 ---- a/node_modules/@yarnpkg/lockfile/index.js -+++ b/node_modules/@yarnpkg/lockfile/index.js -@@ -1287,11 +1287,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - --const constants = exports.constants = typeof (_fs || _load_fs()).default.constants !== 'undefined' ? (_fs || _load_fs()).default.constants : { -- R_OK: (_fs || _load_fs()).default.R_OK, -- W_OK: (_fs || _load_fs()).default.W_OK, -- X_OK: (_fs || _load_fs()).default.X_OK --}; -+const constants = exports.constants = (_fs || _load_fs()).default.constants; - - const lockQueue = exports.lockQueue = new (_blockingQueue || _load_blockingQueue()).default('fs lock'); - diff --git a/patches/link-check+5.4.0.patch b/patches/link-check+5.4.0.patch deleted file mode 100644 index 99871a1b..00000000 --- a/patches/link-check+5.4.0.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/node_modules/link-check/lib/proto/file.js b/node_modules/link-check/lib/proto/file.js -index 19e5354..9a7cdf6 100644 ---- a/node_modules/link-check/lib/proto/file.js -+++ b/node_modules/link-check/lib/proto/file.js -@@ -14,8 +14,12 @@ module.exports = { - } // without the ending '/', the final component is dropped - - const loc = new URL(link || '', opts.baseUrl || processModule.cwd()); -- fs.access(url.fileURLToPath(loc) || '', fs.hasOwnProperty('R_OK') ? fs.R_OK : fs.constants.R_OK, function (err) { -- callback(null, new LinkCheckResult(opts, link, !err ? 200 : 400, err)); -- }); -+ fs.access( -+ url.fileURLToPath(loc) || '', -+ fs.constants.R_OK, -+ function (err) { -+ callback(null, new LinkCheckResult(opts, link, !err ? 200 : 400, err)); -+ }, -+ ); - } - }; diff --git a/scripts/__tests__/junit-parser.test.js b/scripts/__tests__/junit-parser.test.js index 35476dff..53057eb3 100644 --- a/scripts/__tests__/junit-parser.test.js +++ b/scripts/__tests__/junit-parser.test.js @@ -20,6 +20,7 @@ const xml = ` `; +const xmlFlat = ``; const xmlMissing = ``; @@ -62,6 +63,12 @@ test('[REQ-028] extracts requirement identifiers', async () => { const ids = report.suites.flatMap((s) => s.testcases.flatMap((t) => t.requirements)); assert.deepStrictEqual(ids, ['REQ-028', 'REQ-028']); }); +test('handles root-level testcases', async () => { + const report = await parseJUnit(xmlFlat); + assert.strictEqual(report.suites.length, 1); + assert.strictEqual(report.suites[0].testcases.length, 2); + assert.strictEqual(report.suites[0].testcases[1].status, 'Failed'); +}); test('[REQ-029] aggregates status by requirement and suite', async () => { const report = await parseJUnit(xml); From 1771258b80f824920124d5adbaea28c5a6d54c7e Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 14:40:35 -0700 Subject: [PATCH 21/73] chore: add linkinator config (#69) --- AGENTS.md | 2 +- linkinator.config.json | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 linkinator.config.json diff --git a/AGENTS.md b/AGENTS.md index 0ae4b1b6..64919ce8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -31,6 +31,6 @@ - Run `npm install` to ensure Node dependencies are available. - Run `npm test`. - Run `npm run lint:md` to lint Markdown files. -- Run `npx --yes linkinator README.md docs scripts --markdown --skip "https://open-source-actions.github.io/open-source-actions/" --skip "http://127.0.0.1:8000/" --skip "https://github.com/ni/g-cli" --skip "^docs$" --skip "^scripts$"` to verify links and ensure failures are visible. +- Run `npx --yes linkinator README.md docs scripts --config linkinator.config.json` to verify links and ensure failures are visible. - Run `actionlint` to validate GitHub Actions workflows. - Run `pwsh -NoLogo -Command "$cfg = New-PesterConfiguration; $cfg.Run.Path = './tests/pester'; $cfg.TestResult.Enabled = $false; Invoke-Pester -Configuration $cfg"` and ensure all tests pass (XML output is intentionally disabled). diff --git a/linkinator.config.json b/linkinator.config.json new file mode 100644 index 00000000..24291cf6 --- /dev/null +++ b/linkinator.config.json @@ -0,0 +1,14 @@ +{ + "markdown": true, + "recurse": true, + "retry": true, + "retryErrors": true, + "verbosity": "error", + "skip": [ + "https://open-source-actions.github.io/open-source-actions/", + "http://127.0.0.1:8000/", + "https://github.com/ni/g-cli", + "docs$", + "scripts$" + ] +} From 0721134785c16a70d62fd8e89603a918d0245eb3 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 14:41:06 -0700 Subject: [PATCH 22/73] Update linkinator.config.json --- linkinator.config.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/linkinator.config.json b/linkinator.config.json index 24291cf6..6aca6c51 100644 --- a/linkinator.config.json +++ b/linkinator.config.json @@ -5,10 +5,5 @@ "retryErrors": true, "verbosity": "error", "skip": [ - "https://open-source-actions.github.io/open-source-actions/", - "http://127.0.0.1:8000/", - "https://github.com/ni/g-cli", - "docs$", - "scripts$" ] } From 25744d47c029033e7d9881c8427e3df80780c32f Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 15:00:05 -0700 Subject: [PATCH 23/73] Document Pester installation steps --- README.md | 4 ++++ docs/environment-setup.md | 9 +++++++++ docs/testing-pester.md | 2 ++ 3 files changed, 15 insertions(+) diff --git a/README.md b/README.md index c0c7a4e8..79657632 100644 --- a/README.md +++ b/README.md @@ -150,6 +150,10 @@ For CI, `npm run test:ci` emits a JUnit XML report that [scripts/generate-ci-sum Pester tests cover the dispatcher and helper modules. See [docs/testing-pester.md](docs/testing-pester.md) for guidelines on using the canonical argument helper and adding new tests. Run them with: +```powershell +Install-Module Pester -Force -Scope CurrentUser # if Pester isn't already available +``` + ```powershell $cfg = New-PesterConfiguration $cfg.Run.Path = './tests/pester' diff --git a/docs/environment-setup.md b/docs/environment-setup.md index 5914cfd4..77306e69 100644 --- a/docs/environment-setup.md +++ b/docs/environment-setup.md @@ -28,6 +28,15 @@ go install github.com/rhysd/actionlint/cmd/actionlint@latest actionlint -version ``` +## Pester + +[Pester](https://pester.dev/) runs the PowerShell test suite. Install it and confirm the module is available: + +```powershell +Install-Module Pester -Force -Scope CurrentUser +pwsh -NoLogo -Command 'Import-Module Pester; Invoke-Pester -Version' +``` + ## g-cli Some actions rely on NI's LabVIEW command-line interface (g-cli). diff --git a/docs/testing-pester.md b/docs/testing-pester.md index 9523dce4..1cee9e47 100644 --- a/docs/testing-pester.md +++ b/docs/testing-pester.md @@ -23,12 +23,14 @@ Required tooling: - PowerShell 7.5.1 - Node.js 24 or newer - [`actionlint`](https://github.com/rhysd/actionlint) +- [Pester](https://pester.dev/) (install with `Install-Module Pester -Force -Scope CurrentUser`) Sample command sequence to run the suite: ```powershell npm install actionlint +Install-Module Pester -Force -Scope CurrentUser $cfg = New-PesterConfiguration $cfg.Run.Path = './tests/pester' $cfg.TestResult.Enabled = $false From 3e390b2870cf0293c740cf5393e0ef675c59538a Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 15:17:59 -0700 Subject: [PATCH 24/73] docs: add README files for key directories (#71) --- CONTRIBUTING.md | 2 +- actions/README.md | 3 +++ docs/UnifiedDispatcher.md | 2 +- docs/actions/README.md | 3 +++ docs/architecture.md | 10 +++++----- docs/contributing-docs.md | 4 ++-- docs/index.md | 2 +- linkinator.config.json | 3 +++ package.json | 2 +- scripts/README.md | 3 +++ tests/README.md | 3 +++ tools/README.md | 3 +++ 12 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 actions/README.md create mode 100644 docs/actions/README.md create mode 100644 scripts/README.md create mode 100644 tests/README.md create mode 100644 tools/README.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 686d6a32..0d0e8825 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ For documentation updates, follow the [documentation contribution guidelines](do ```bash npm run lint:md -npx --yes linkinator README.md docs scripts --markdown --skip "https://open-source-actions.github.io/open-source-actions/" --skip "http://127.0.0.1:8000/" --skip "https://github.com/ni/g-cli" --skip "^docs$" --skip "^scripts$" +npx --yes linkinator README.md docs scripts --config linkinator.config.json ``` ## Requirement Traceability diff --git a/actions/README.md b/actions/README.md new file mode 100644 index 00000000..2e0f93dd --- /dev/null +++ b/actions/README.md @@ -0,0 +1,3 @@ +# actions + +PowerShell dispatcher and modules backing the GitHub Action wrappers. diff --git a/docs/UnifiedDispatcher.md b/docs/UnifiedDispatcher.md index 5956bda1..f2f08f8d 100644 --- a/docs/UnifiedDispatcher.md +++ b/docs/UnifiedDispatcher.md @@ -13,7 +13,7 @@ See [Common Parameters](common-parameters.md) for a complete list of dispatcher ## Cross‑platform -Works on **Windows and Linux** as long as LabVIEW and [g-cli](https://github.com/ni/g-cli) are installed and available on `PATH`. For non‑standard installs, pass `gcliPath` in `args_json`. +Works on **Windows and Linux** as long as LabVIEW and [g-cli](https://github.com/G-CLI/G-CLI) are installed and available on `PATH`. For non‑standard installs, pass `gcliPath` in `args_json`. ## Example (CLI) diff --git a/docs/actions/README.md b/docs/actions/README.md new file mode 100644 index 00000000..43a85087 --- /dev/null +++ b/docs/actions/README.md @@ -0,0 +1,3 @@ +# Action Documentation + +Reference pages for each GitHub Action adapter live in this directory. Each file documents the inputs and behavior of the corresponding action. diff --git a/docs/architecture.md b/docs/architecture.md index c223a11f..f29f87e3 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -14,8 +14,8 @@ Each action lives in a `scripts/` folder. These PowerShell scripts ## Repository layout -- [`actions/`](../actions/) – dispatcher scripts and PowerShell module -- [`docs/`](.) – MkDocs documentation, including this page -- [`scripts/`](../scripts/) – adapter scripts invoked by the dispatcher -- [`tests/`](../tests/) – Pester tests and other verification scripts -- [`tools/`](../tools/) – utilities for building or testing actions +- [`actions/`](../actions/README.md) – dispatcher scripts and PowerShell module +- [`docs/`](index.md) – MkDocs documentation, including this page +- [`scripts/`](../scripts/README.md) – adapter scripts invoked by the dispatcher +- [`tests/`](../tests/README.md) – Pester tests and other verification scripts +- [`tools/`](../tools/README.md) – utilities for building or testing actions diff --git a/docs/contributing-docs.md b/docs/contributing-docs.md index 90e98c0a..dd278ad4 100644 --- a/docs/contributing-docs.md +++ b/docs/contributing-docs.md @@ -4,14 +4,14 @@ To keep documentation consistent and easy to review, please follow these rules w ## Action documentation -Action documentation lives under [docs/actions/](actions/). Keep these files in sync with their corresponding implementations in [scripts/](../scripts). +Action documentation lives under [docs/actions](actions/README.md). Keep these files in sync with their corresponding implementations in [scripts](../scripts/README.md). - Run `npm run verify:docs` to check that documented inputs match each action's action.yml. ## Markdown linting - Run `npm run lint:md` to lint Markdown formatting. -- Run `npx --yes linkinator README.md docs scripts --markdown --skip "https://open-source-actions.github.io/open-source-actions/" --skip "http://127.0.0.1:8000/" --skip "https://github.com/ni/g-cli" --skip "^docs$" --skip "^scripts$"` to check links before submitting changes. +- Run `npx --yes linkinator README.md docs scripts --config linkinator.config.json` to check links before submitting changes. - Keep one `#`-level heading at the top of each file and increment heading levels sequentially; do not skip levels. ## Heading levels diff --git a/docs/index.md b/docs/index.md index 821a840a..51b01bc8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # Open Source LabVIEW Actions -Open Source LabVIEW Actions unifies LabVIEW CI/CD scripts behind a single PowerShell dispatcher. Most users should call the adapter-specific GitHub Actions (for example `run-unit-tests`) directly in workflows. The dispatcher script ([actions/Invoke-OSAction.ps1](../actions/Invoke-OSAction.ps1)) remains available for CLI scenarios. Adapter implementations live under [scripts/](../scripts), and each wrapper resides in its own folder at the repository root. Discovery commands (`-ListActions` and `-Describe`) and standard exit codes are preserved, and `-DryRun` is supported for safe previews on Windows or Linux runners with LabVIEW and g-cli available. +Open Source LabVIEW Actions unifies LabVIEW CI/CD scripts behind a single PowerShell dispatcher. Most users should call the adapter-specific GitHub Actions (for example `run-unit-tests`) directly in workflows. The dispatcher script ([actions/Invoke-OSAction.ps1](../actions/Invoke-OSAction.ps1)) remains available for CLI scenarios. Adapter implementations live under [scripts](../scripts/README.md), and each wrapper resides in its own folder at the repository root. Discovery commands (`-ListActions` and `-Describe`) and standard exit codes are preserved, and `-DryRun` is supported for safe previews on Windows or Linux runners with LabVIEW and g-cli available. ## Get Started diff --git a/linkinator.config.json b/linkinator.config.json index 6aca6c51..90e38b53 100644 --- a/linkinator.config.json +++ b/linkinator.config.json @@ -4,6 +4,9 @@ "retry": true, "retryErrors": true, "verbosity": "error", + "directoryListing": true, "skip": [ + "https://open-source-actions.github.io/open-source-actions/", + "http://127.0.0.1:8000/" ] } diff --git a/package.json b/package.json index 066bcceb..a6ac348e 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "generate:traceability-matrix": "tsx scripts/generate-traceability-matrix.ts", "check:traceability": "tsx scripts/check-traceability.ts", "lint:md": "markdownlint-cli2 README.md \"docs/**/*.md\" \"scripts/**/*.md\"", - "link:check": "linkinator README.md docs scripts --markdown --skip \"https://open-source-actions.github.io/open-source-actions/\" --skip \"http://127\\.0\\.0\\.1:8000/\" --skip \"https://github.com/ni/g-cli\" --skip \"^docs$\" --skip \"^scripts$\"" + "link:check": "linkinator README.md docs scripts --config linkinator.config.json" }, "dependencies": { "adm-zip": "^0.5.10", diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 00000000..0f875935 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,3 @@ +# scripts + +TypeScript and PowerShell helper scripts invoked by the GitHub Action wrappers. diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 00000000..f59349af --- /dev/null +++ b/tests/README.md @@ -0,0 +1,3 @@ +# tests + +Node and Pester tests verifying the dispatcher and helper modules. diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 00000000..75d69d76 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,3 @@ +# tools + +Utilities for building or testing actions. From e5248d796320741662c438a270e58248bc362a22 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 15:36:05 -0700 Subject: [PATCH 25/73] docs: de-duplicate icon editor example (#72) --- README.md | 37 +------------------------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/README.md b/README.md index 79657632..fef8e2f7 100644 --- a/README.md +++ b/README.md @@ -57,42 +57,7 @@ Enable debug logging and perform a dry run: dry_run: true ``` -Build Icon Editor: - -Chain the [apply-vipc](docs/actions/apply-vipc.md), [set-development-mode](docs/actions/set-development-mode.md), [build](docs/actions/build.md), and [revert-development-mode](docs/actions/revert-development-mode.md) actions to build the LabVIEW Icon Editor: - -```yaml -- uses: actions/checkout@v4 - with: - repository: LabVIEW-Community-CI-CD/labview-icon-editor - path: labview-icon-editor -- uses: LabVIEW-Community-CI-CD/open-source-actions/apply-vipc@v1 - with: - minimum_supported_lv_version: '2021' - vip_lv_version: '2021' - supported_bitness: '64' - relative_path: labview-icon-editor - vipc_path: labview-icon-editor/.github/actions/apply-vipc/runner_dependencies.vipc -- uses: LabVIEW-Community-CI-CD/open-source-actions/set-development-mode@v1 - with: - minimum_supported_lv_version: '2021' - supported_bitness: '64' - relative_path: labview-icon-editor -- uses: LabVIEW-Community-CI-CD/open-source-actions/build@v1 - with: - relative_path: labview-icon-editor - major: 1 - minor: 0 - patch: 0 - build: 0 - commit: abcdef - labview_minor_revision: '3' - company_name: 'Acme Corp' - author_name: 'Jane Doe' -- uses: LabVIEW-Community-CI-CD/open-source-actions/revert-development-mode@v1 - with: - relative_path: labview-icon-editor -``` +For a full workflow example that chains multiple actions to build the LabVIEW Icon Editor, see [docs/quickstart.md#build-icon-editor](docs/quickstart.md#build-icon-editor). ## CLI/dispatcher usage From adbe472fba1bbbc8a80aa1d6e9aa18138c37add0 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 15:53:11 -0700 Subject: [PATCH 26/73] docs: clarify Pester tests run only in CI (REQIE-005) (#73) --- AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index 64919ce8..cf7ea636 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,4 +33,4 @@ - Run `npm run lint:md` to lint Markdown files. - Run `npx --yes linkinator README.md docs scripts --config linkinator.config.json` to verify links and ensure failures are visible. - Run `actionlint` to validate GitHub Actions workflows. -- Run `pwsh -NoLogo -Command "$cfg = New-PesterConfiguration; $cfg.Run.Path = './tests/pester'; $cfg.TestResult.Enabled = $false; Invoke-Pester -Configuration $cfg"` and ensure all tests pass (XML output is intentionally disabled). +- Pester tests are executed by the GitHub runner; do not run them locally. From 63bcb59d473fdd87daac81ba1ae4350d2614f34e Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 15:58:53 -0700 Subject: [PATCH 27/73] clarify CI handling of Pester tests (#74) --- AGENTS.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index cf7ea636..281989e4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,4 +33,7 @@ - Run `npm run lint:md` to lint Markdown files. - Run `npx --yes linkinator README.md docs scripts --config linkinator.config.json` to verify links and ensure failures are visible. - Run `actionlint` to validate GitHub Actions workflows. -- Pester tests are executed by the GitHub runner; do not run them locally. + +### Pester Tests + +Pester tests are part of the continuous integration pipeline. The GitHub runner executes them automatically, so agents must not run Pester tests manually. From 0b1b265b14e2a3b713f597f8f56327356d03988d Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 16:11:48 -0700 Subject: [PATCH 28/73] chore: update dependencies --- package-lock.json | 1089 +++++++++++++++++++++++++++++++++++++++------ package.json | 8 +- 2 files changed, 955 insertions(+), 142 deletions(-) diff --git a/package-lock.json b/package-lock.json index bafaec23..e91da55e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "adm-zip": "^0.5.10", - "glob": "^10.3.10", + "adm-zip": "^0.5.16", + "glob": "^11.0.3", "js-yaml": "^4.1.0", "xml2js": "^0.6.2" }, @@ -18,9 +18,9 @@ "@types/node": "^24.3.0", "@types/xml2js": "^0.4.14", "linkinator": "^6.1.4", - "markdownlint-cli2": "^0.12.1", + "markdownlint-cli2": "^0.18.1", "tsx": "^4.20.4", - "typescript": "^5.4.0" + "typescript": "^5.9.2" }, "engines": { "node": ">=24" @@ -468,6 +468,27 @@ "node": ">=18" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -527,6 +548,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "license": "MIT", "optional": true, "engines": { @@ -534,9 +556,9 @@ } }, "node_modules/@sindresorhus/merge-streams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", - "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, "license": "MIT", "engines": { @@ -546,6 +568,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "24.3.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", @@ -556,6 +602,13 @@ "undici-types": "~7.10.0" } }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/xml2js": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", @@ -586,9 +639,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", "license": "MIT", "engines": { "node": ">=12" @@ -619,12 +672,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -656,6 +711,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -674,6 +762,16 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -706,6 +804,44 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -948,21 +1084,24 @@ } }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -981,18 +1120,18 @@ } }, "node_modules/globby": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", - "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^1.0.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "unicorn-magic": "^0.3.0" }, "engines": { "node": ">=18" @@ -1001,19 +1140,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/htmlparser2": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", @@ -1062,15 +1188,52 @@ } }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1103,6 +1266,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -1133,18 +1307,18 @@ "license": "ISC" }, "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/js-yaml": { @@ -1160,12 +1334,29 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, "license": "MIT" }, + "node_modules/katex": { + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, "node_modules/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", @@ -1201,6 +1392,50 @@ "node": ">=18" } }, + "node_modules/linkinator/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/linkinator/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/linkinator/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/linkinator/node_modules/marked": { "version": "13.0.3", "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", @@ -1214,16 +1449,52 @@ "node": ">= 18" } }, + "node_modules/linkinator/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/linkinator/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } }, "node_modules/markdown-it": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.0.0.tgz", - "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "license": "MIT", "dependencies": { @@ -1232,98 +1503,71 @@ "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", - "uc.micro": "^2.0.0" + "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/markdownlint": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.33.0.tgz", - "integrity": "sha512-4lbtT14A3m0LPX1WS/3d1m7Blg+ZwiLq36WvjQqFGsX3Gik99NV+VXp/PW3n+Q62xyPdbvGOCfjPqjW+/SKMig==", + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.38.0.tgz", + "integrity": "sha512-xaSxkaU7wY/0852zGApM8LdlIfGCW8ETZ0Rr62IQtAnUMlMuifsg09vWJcNYeL4f0anvr8Vo4ZQar8jGpV0btQ==", "dev": true, "license": "MIT", "dependencies": { - "markdown-it": "14.0.0", - "markdownlint-micromark": "0.1.8" + "micromark": "4.0.2", + "micromark-core-commonmark": "2.0.3", + "micromark-extension-directive": "4.0.0", + "micromark-extension-gfm-autolink-literal": "2.1.0", + "micromark-extension-gfm-footnote": "2.1.0", + "micromark-extension-gfm-table": "2.1.1", + "micromark-extension-math": "3.1.0", + "micromark-util-types": "2.0.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/DavidAnson" } }, "node_modules/markdownlint-cli2": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.12.1.tgz", - "integrity": "sha512-RcK+l5FjJEyrU3REhrThiEUXNK89dLYNJCYbvOUKypxqIGfkcgpz8g08EKqhrmUbYfYoLC5nEYQy53NhJSEtfQ==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.18.1.tgz", + "integrity": "sha512-/4Osri9QFGCZOCTkfA8qJF+XGjKYERSHkXzxSyS1hd3ZERJGjvsUao2h4wdnvpHp6Tu2Jh/bPHM0FE9JJza6ng==", "dev": true, "license": "MIT", "dependencies": { - "globby": "14.0.0", - "jsonc-parser": "3.2.0", - "markdownlint": "0.33.0", - "markdownlint-cli2-formatter-default": "0.0.4", - "micromatch": "4.0.5", - "yaml": "2.3.4" + "globby": "14.1.0", + "js-yaml": "4.1.0", + "jsonc-parser": "3.3.1", + "markdown-it": "14.1.0", + "markdownlint": "0.38.0", + "markdownlint-cli2-formatter-default": "0.0.5", + "micromatch": "4.0.8" }, "bin": { - "markdownlint-cli2": "markdownlint-cli2.js" + "markdownlint-cli2": "markdownlint-cli2-bin.mjs" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/DavidAnson" } }, "node_modules/markdownlint-cli2-formatter-default": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.4.tgz", - "integrity": "sha512-xm2rM0E+sWgjpPn1EesPXx5hIyrN2ddUnUwnbCsD/ONxYtw3PX6LydvdH6dciWAoFDpwzbHM1TO7uHfcMd6IYg==", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.5.tgz", + "integrity": "sha512-4XKTwQ5m1+Txo2kuQ3Jgpo/KmnG+X90dWt4acufg6HVGadTUG5hzHF/wssp9b5MBYOMCnZ9RMPaU//uHsszF8Q==", "dev": true, "license": "MIT", - "peerDependencies": { - "markdownlint-cli2": ">=0.0.4" - } - }, - "node_modules/markdownlint-cli2/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/markdownlint-cli2/node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 14" - } - }, - "node_modules/markdownlint-micromark": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.8.tgz", - "integrity": "sha512-1ouYkMRo9/6gou9gObuMDnvZM8jC/ly3QCFQyoSPCS2XV1ZClU0xpKbL1Ar3bWWRT1RnBZkWUEiNKrI2CwiBQA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, "funding": { "url": "https://github.com/sponsors/DavidAnson" + }, + "peerDependencies": { + "markdownlint-cli2": ">=0.0.4" } }, "node_modules/mdurl": { @@ -1356,12 +1600,548 @@ "node": ">= 8" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -1387,15 +2167,15 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -1444,6 +2224,26 @@ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -1454,29 +2254,29 @@ } }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1617,6 +2417,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/srcset": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/srcset/-/srcset-5.0.1.tgz", @@ -1795,9 +2608,9 @@ "license": "MIT" }, "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index a6ac348e..09e8bb37 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,8 @@ "link:check": "linkinator README.md docs scripts --config linkinator.config.json" }, "dependencies": { - "adm-zip": "^0.5.10", - "glob": "^10.3.10", + "adm-zip": "^0.5.16", + "glob": "^11.0.3", "js-yaml": "^4.1.0", "xml2js": "^0.6.2" }, @@ -33,8 +33,8 @@ "@types/node": "^24.3.0", "@types/xml2js": "^0.4.14", "linkinator": "^6.1.4", - "markdownlint-cli2": "^0.12.1", + "markdownlint-cli2": "^0.18.1", "tsx": "^4.20.4", - "typescript": "^5.4.0" + "typescript": "^5.9.2" } } From 3826f0edd86e82cb936b4ad31afb756eb5f8a673 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 16:20:14 -0700 Subject: [PATCH 29/73] docs: clarify optional Pester install --- README.md | 4 ++-- docs/environment-setup.md | 2 +- docs/testing-pester.md | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index fef8e2f7..6a0a8cdb 100644 --- a/README.md +++ b/README.md @@ -113,10 +113,10 @@ npm test For CI, `npm run test:ci` emits a JUnit XML report that [scripts/generate-ci-summary.ts](scripts/generate-ci-summary.ts) parses to build requirement traceability files in OS‑specific subdirectories (e.g., `artifacts/windows`, `artifacts/linux`) based on the `RUNNER_OS` environment variable. The summary script searches `artifacts/` by default; set `TEST_RESULTS_GLOBS` if your reports are elsewhere. -Pester tests cover the dispatcher and helper modules. See [docs/testing-pester.md](docs/testing-pester.md) for guidelines on using the canonical argument helper and adding new tests. Run them with: +Pester tests cover the dispatcher and helper modules. See [docs/testing-pester.md](docs/testing-pester.md) for guidelines on using the canonical argument helper and adding new tests. The GitHub runner installs Pester automatically; install it locally only if you plan to run the tests yourself: ```powershell -Install-Module Pester -Force -Scope CurrentUser # if Pester isn't already available +Install-Module Pester -Force -Scope CurrentUser ``` ```powershell diff --git a/docs/environment-setup.md b/docs/environment-setup.md index 77306e69..8f9054de 100644 --- a/docs/environment-setup.md +++ b/docs/environment-setup.md @@ -30,7 +30,7 @@ actionlint -version ## Pester -[Pester](https://pester.dev/) runs the PowerShell test suite. Install it and confirm the module is available: +[Pester](https://pester.dev/) runs the PowerShell test suite. The GitHub runner installs it automatically; install it only if you plan to run tests locally and confirm the module is available: ```powershell Install-Module Pester -Force -Scope CurrentUser diff --git a/docs/testing-pester.md b/docs/testing-pester.md index 1cee9e47..15ef811d 100644 --- a/docs/testing-pester.md +++ b/docs/testing-pester.md @@ -18,19 +18,19 @@ export LABVIEW_ICON_EDITOR_PATH=/path/to/labview-icon-editor To enforce that the project exists, set `LABVIEW_ICON_EDITOR_REQUIRED=1` or call `Get-LabVIEWIconEditorArgsJson -RequireProject` in your test. -Required tooling: +Tooling for local runs: - PowerShell 7.5.1 - Node.js 24 or newer - [`actionlint`](https://github.com/rhysd/actionlint) -- [Pester](https://pester.dev/) (install with `Install-Module Pester -Force -Scope CurrentUser`) +- Optional: [Pester](https://pester.dev/) (install with `Install-Module Pester -Force -Scope CurrentUser` for local runs; CI installs it automatically) -Sample command sequence to run the suite: +Sample command sequence to run the suite locally: ```powershell npm install actionlint -Install-Module Pester -Force -Scope CurrentUser +Install-Module Pester -Force -Scope CurrentUser # only if Pester isn't already installed $cfg = New-PesterConfiguration $cfg.Run.Path = './tests/pester' $cfg.TestResult.Enabled = $false From 722fb10c85f1feb6c33b10337ad148736d4b616e Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 16:27:25 -0700 Subject: [PATCH 30/73] ci: pin Pester version --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca153799..6c9d44c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,9 +96,9 @@ jobs: shell: pwsh run: | if (-not (Get-Module -ListAvailable -Name Pester | - Where-Object { $_.Version -ge [Version]'5.0.0' })) { + Where-Object { $_.Version -ge [Version]'5.7.1' })) { Remove-Module Pester -ErrorAction SilentlyContinue - Install-Module -Name Pester -MinimumVersion 5.0.0 -Scope CurrentUser -Force -SkipPublisherCheck + Install-Module -Name Pester -RequiredVersion 5.7.1 -Scope CurrentUser -Force -SkipPublisherCheck } - name: Run Pester shell: pwsh From 3c2428a42859df368681d59c331ef9ca1f70c515 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 16:35:42 -0700 Subject: [PATCH 31/73] chore: pin action versions to commits --- .../add-token-to-labview-self-hosted.yml | 4 +-- .github/workflows/apply-vipc-self-hosted.yml | 2 +- .../workflows/build-lvlibp-self-hosted.yml | 4 +-- .github/workflows/build-self-hosted.yml | 6 ++--- .../build-vi-package-self-hosted.yml | 4 +-- .github/workflows/ci.yml | 26 +++++++++---------- .github/workflows/close-labview-external.yml | 6 ++--- .../missing-in-project-self-hosted.yml | 4 +-- .../modify-vipb-display-info-self-hosted.yml | 4 +-- .../prepare-labview-source-self-hosted.yml | 4 +-- .github/workflows/rename-file-self-hosted.yml | 4 +-- .github/workflows/requirement-id-check.yml | 2 +- .../restore-setup-lv-source-self-hosted.yml | 4 +-- .../revert-development-mode-self-hosted.yml | 4 +-- .github/workflows/run-pester-tests.yml | 4 +-- .../workflows/run-unit-tests-self-hosted.yml | 6 ++--- .../set-development-mode-self-hosted.yml | 4 +-- 17 files changed, 46 insertions(+), 46 deletions(-) diff --git a/.github/workflows/add-token-to-labview-self-hosted.yml b/.github/workflows/add-token-to-labview-self-hosted.yml index c07770f3..dd71671e 100644 --- a/.github/workflows/add-token-to-labview-self-hosted.yml +++ b/.github/workflows/add-token-to-labview-self-hosted.yml @@ -7,7 +7,7 @@ jobs: add-token: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run add-token-to-labview action uses: ./add-token-to-labview/action.yml with: @@ -15,7 +15,7 @@ jobs: supported_bitness: '64' relative_path: 'scripts/add-token-to-labview' - name: Upload token artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: token-artifact path: 'scripts/add-token-to-labview/LabVIEW.ini' diff --git a/.github/workflows/apply-vipc-self-hosted.yml b/.github/workflows/apply-vipc-self-hosted.yml index 7dc04b21..efe67fae 100644 --- a/.github/workflows/apply-vipc-self-hosted.yml +++ b/.github/workflows/apply-vipc-self-hosted.yml @@ -7,7 +7,7 @@ jobs: apply-vipc: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run apply-vipc action (dry_run=true) uses: ./apply-vipc/action.yml with: diff --git a/.github/workflows/build-lvlibp-self-hosted.yml b/.github/workflows/build-lvlibp-self-hosted.yml index b7ead838..fb94de81 100644 --- a/.github/workflows/build-lvlibp-self-hosted.yml +++ b/.github/workflows/build-lvlibp-self-hosted.yml @@ -7,7 +7,7 @@ jobs: build-lvlibp: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run build-lvlibp action uses: ./build-lvlibp/action.yml with: @@ -22,7 +22,7 @@ jobs: build: '1' commit: 'abcdef' - name: Upload lvlibp artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: build-lvlibp-artifact path: 'scripts/build-lvlibp/lv_icon.lvlibp' diff --git a/.github/workflows/build-self-hosted.yml b/.github/workflows/build-self-hosted.yml index 251a22f5..bdc152d3 100644 --- a/.github/workflows/build-self-hosted.yml +++ b/.github/workflows/build-self-hosted.yml @@ -11,7 +11,7 @@ jobs: MINOR: '0' PATCH: '0' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run build action uses: ./build/action.yml with: @@ -34,12 +34,12 @@ jobs: printf '{"commit":"%s","build_number":"%s","artifacts":["%s"]}' "$GITHUB_SHA" "$GITHUB_RUN_NUMBER" "$ARTIFACT" > scripts/build/artifact-manifest.json echo "artifact=${ARTIFACT}" >> "$GITHUB_OUTPUT" - name: Upload build artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: ${{ steps.record.outputs.artifact }} path: scripts/build/${{ steps.record.outputs.artifact }} - name: Upload artifact manifest - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: artifact-manifest path: scripts/build/artifact-manifest.json diff --git a/.github/workflows/build-vi-package-self-hosted.yml b/.github/workflows/build-vi-package-self-hosted.yml index 2d501524..671f7892 100644 --- a/.github/workflows/build-vi-package-self-hosted.yml +++ b/.github/workflows/build-vi-package-self-hosted.yml @@ -7,7 +7,7 @@ jobs: build-vi-package: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run build-vi-package action uses: ./build-vi-package/action.yml with: @@ -23,7 +23,7 @@ jobs: commit: 'abcdef' display_information_json: '{"Name":"Test"}' - name: Upload VI package - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: vi-package path: 'scripts/build-vi-package/lv_icon.vip' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6c9d44c9..81a40d00 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,8 +14,8 @@ jobs: # This job always runs on Linux, so the directory is fixed. ARTIFACT_DIR: artifacts/linux steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: 24 - run: npm run check:node @@ -25,29 +25,29 @@ jobs: - run: npm run derive:registry - run: rm -rf artifacts - run: mkdir -p artifacts && cp test-results/*junit*.xml artifacts/ - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 if: ${{ (success() || failure()) && !cancelled() }} with: name: junit-results path: artifacts/**/*junit*.xml - - uses: EnricoMi/publish-unit-test-result-action@v2 + - uses: EnricoMi/publish-unit-test-result-action@0f06977fde99088e583f6fa8ec622da326e818c3 if: ${{ (success() || failure()) && !cancelled() }} with: files: artifacts/**/*junit*.xml - run: npm run generate:summary env: TEST_RESULTS_GLOBS: test-results/*junit*.xml - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 if: ${{ (success() || failure()) && !cancelled() }} with: name: traceability path: ${{ env.ARTIFACT_DIR }}/traceability.* - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 if: ${{ (success() || failure()) && !cancelled() }} with: name: action-docs path: ${{ env.ARTIFACT_DIR }}/action-docs.* - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 if: ${{ (success() || failure()) && !cancelled() }} with: name: evidence @@ -71,7 +71,7 @@ jobs: env: RUNNER_TYPE: ${{ matrix.runner_type }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Ensure PowerShell 7.5.1 if: matrix.runner_type != 'linux' shell: pwsh @@ -112,7 +112,7 @@ jobs: $cfg.Run.Exit = $true Invoke-Pester -Configuration $cfg } - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 if: ${{ (success() || failure()) && !cancelled() }} with: name: test-results-pester-${{ matrix.os }}-${{ matrix.runner_type }} @@ -124,14 +124,14 @@ jobs: runs-on: ubuntu-24.04 if: ${{ (success() || failure()) && !cancelled() }} steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: 24 - run: npm run check:node - run: npm install - run: rm -rf artifacts - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 with: path: ./artifacts - run: npm run derive:registry @@ -145,7 +145,7 @@ jobs: EVIDENCE_DIR: artifacts/evidence - run: npx tsx scripts/generate-traceability-matrix.ts - run: cat artifacts/linux/traceability-matrix.md >> "$GITHUB_STEP_SUMMARY" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 if: ${{ (success() || failure()) && !cancelled() }} with: name: traceability-matrix diff --git a/.github/workflows/close-labview-external.yml b/.github/workflows/close-labview-external.yml index 6aa3faaa..1d8f7a3d 100644 --- a/.github/workflows/close-labview-external.yml +++ b/.github/workflows/close-labview-external.yml @@ -7,7 +7,7 @@ jobs: close-labview: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Close LabVIEW (32-bit) uses: ./close-labview/action.yml with: @@ -16,7 +16,7 @@ jobs: working_directory: '${{ github.workspace }}/scripts/close-labview' dry_run: true - name: Upload log (32-bit) - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: close-labview-32.log path: '${{ github.workspace }}/scripts/close-labview/close-labview.log' @@ -29,7 +29,7 @@ jobs: working_directory: '${{ github.workspace }}/scripts/close-labview' dry_run: true - name: Upload log (64-bit) - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: close-labview-64.log path: '${{ github.workspace }}/scripts/close-labview/close-labview.log' diff --git a/.github/workflows/missing-in-project-self-hosted.yml b/.github/workflows/missing-in-project-self-hosted.yml index e0f8fd3a..e6f52104 100644 --- a/.github/workflows/missing-in-project-self-hosted.yml +++ b/.github/workflows/missing-in-project-self-hosted.yml @@ -7,7 +7,7 @@ jobs: missing-in-project: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run missing-in-project action uses: ./missing-in-project/action.yml with: @@ -16,7 +16,7 @@ jobs: project_file: 'scripts/missing-in-project/Missing in Project.lvproj' relative_path: 'scripts/missing-in-project' - name: Upload missing findings - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: missing-files path: 'scripts/missing-in-project/missing_files.txt' diff --git a/.github/workflows/modify-vipb-display-info-self-hosted.yml b/.github/workflows/modify-vipb-display-info-self-hosted.yml index fedd84eb..817ed876 100644 --- a/.github/workflows/modify-vipb-display-info-self-hosted.yml +++ b/.github/workflows/modify-vipb-display-info-self-hosted.yml @@ -7,7 +7,7 @@ jobs: modify-vipb-display-info: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run modify-vipb-display-info action uses: ./modify-vipb-display-info/action.yml with: @@ -23,7 +23,7 @@ jobs: commit: 'abcdef' display_information_json: '{"Name":"Test"}' - name: Upload vipb artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: vipb-display-info path: 'scripts/modify-vipb-display-info/lv_icon.vipb' diff --git a/.github/workflows/prepare-labview-source-self-hosted.yml b/.github/workflows/prepare-labview-source-self-hosted.yml index ce7ef092..5a85b0f1 100644 --- a/.github/workflows/prepare-labview-source-self-hosted.yml +++ b/.github/workflows/prepare-labview-source-self-hosted.yml @@ -7,7 +7,7 @@ jobs: prepare-labview-source: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run prepare-labview-source action uses: ./prepare-labview-source/action.yml with: @@ -17,7 +17,7 @@ jobs: labview_project: 'scripts/prepare-labview-source/lv_icon.lvproj' build_spec: 'PackageSource' - name: Upload prepared source - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: prepared-source path: 'scripts/prepare-labview-source/prepared-source.zip' diff --git a/.github/workflows/rename-file-self-hosted.yml b/.github/workflows/rename-file-self-hosted.yml index 400ea661..79f6d904 100644 --- a/.github/workflows/rename-file-self-hosted.yml +++ b/.github/workflows/rename-file-self-hosted.yml @@ -7,14 +7,14 @@ jobs: rename-file: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run rename-file action uses: ./rename-file/action.yml with: current_filename: 'scripts/rename-file/README.md' new_filename: 'scripts/rename-file/README-renamed.md' - name: Upload renamed file - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: renamed-file path: 'scripts/rename-file/README-renamed.md' diff --git a/.github/workflows/requirement-id-check.yml b/.github/workflows/requirement-id-check.yml index 736e81e2..7dca9a4c 100644 --- a/.github/workflows/requirement-id-check.yml +++ b/.github/workflows/requirement-id-check.yml @@ -8,7 +8,7 @@ jobs: requirement-id: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 with: fetch-depth: 0 - name: Ensure commits reference requirement IDs diff --git a/.github/workflows/restore-setup-lv-source-self-hosted.yml b/.github/workflows/restore-setup-lv-source-self-hosted.yml index a7fe1ae5..54eac084 100644 --- a/.github/workflows/restore-setup-lv-source-self-hosted.yml +++ b/.github/workflows/restore-setup-lv-source-self-hosted.yml @@ -7,7 +7,7 @@ jobs: restore-setup-lv-source: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run restore-setup-lv-source action uses: ./restore-setup-lv-source/action.yml with: @@ -19,7 +19,7 @@ jobs: env: GCLI_SUPPRESS_PROMPTS: '1' - name: Upload restore logs - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: restore-logs path: 'scripts/restore-setup-lv-source/restore.log' diff --git a/.github/workflows/revert-development-mode-self-hosted.yml b/.github/workflows/revert-development-mode-self-hosted.yml index 60a65133..48b0fd95 100644 --- a/.github/workflows/revert-development-mode-self-hosted.yml +++ b/.github/workflows/revert-development-mode-self-hosted.yml @@ -7,13 +7,13 @@ jobs: revert-development-mode: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run revert-development-mode action uses: ./revert-development-mode/action.yml with: relative_path: './' - name: Upload config artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: devmode-config path: 'devmode-config.txt' diff --git a/.github/workflows/run-pester-tests.yml b/.github/workflows/run-pester-tests.yml index 13b5724f..64bf0230 100644 --- a/.github/workflows/run-pester-tests.yml +++ b/.github/workflows/run-pester-tests.yml @@ -15,9 +15,9 @@ jobs: run-pester-tests: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Checkout target repository - uses: actions/checkout@v4 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 with: repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} diff --git a/.github/workflows/run-unit-tests-self-hosted.yml b/.github/workflows/run-unit-tests-self-hosted.yml index 07bdc48a..26acd57c 100644 --- a/.github/workflows/run-unit-tests-self-hosted.yml +++ b/.github/workflows/run-unit-tests-self-hosted.yml @@ -7,7 +7,7 @@ jobs: run-unit-tests: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run unit tests action uses: ./run-unit-tests/action.yml with: @@ -17,12 +17,12 @@ jobs: test_config: 'scripts/run-unit-tests/unittest-config.cfg' working_directory: 'scripts/run-unit-tests' - name: Upload test results to GitHub - uses: EnricoMi/publish-unit-test-result-action@v2 + uses: EnricoMi/publish-unit-test-result-action@0f06977fde99088e583f6fa8ec622da326e818c3 if: ${{ (success() || failure()) && !cancelled() }} with: files: 'artifacts/unit-tests/UnitTestReport.xml' - name: Upload unit test results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: unit-test-results path: 'artifacts/unit-tests/UnitTestReport.xml' diff --git a/.github/workflows/set-development-mode-self-hosted.yml b/.github/workflows/set-development-mode-self-hosted.yml index fcbfda6f..a371474b 100644 --- a/.github/workflows/set-development-mode-self-hosted.yml +++ b/.github/workflows/set-development-mode-self-hosted.yml @@ -7,7 +7,7 @@ jobs: set-development-mode: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - name: Run set-development-mode action uses: ./set-development-mode/action.yml with: @@ -17,7 +17,7 @@ jobs: log_level: 'INFO' dry_run: 'true' - name: Upload dev mode logs - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: dev-mode-config path: 'scripts/set-development-mode/dev-mode.log' From 3f999901dd01fd3cddcd317549d0df56c6ecd46c Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 16:43:57 -0700 Subject: [PATCH 32/73] chore: pin mkdocs dependencies --- setup-mkdocs/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup-mkdocs/action.yml b/setup-mkdocs/action.yml index c510668d..812db766 100644 --- a/setup-mkdocs/action.yml +++ b/setup-mkdocs/action.yml @@ -10,9 +10,9 @@ runs: uses: actions/cache@v3 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-mkdocs-1.5.3 + key: ${{ runner.os }}-pip-mkdocs-1.5.3-mkdocs-material-9.6.17-pymdown-extensions-10.16.1-mkdocs-autorefs-1.4.2-mkdocs-redirects-1.2.2 restore-keys: | ${{ runner.os }}-pip-mkdocs- - name: Install MkDocs shell: bash - run: pip install mkdocs==1.5.3 mkdocs-material pymdown-extensions mkdocs-autorefs mkdocs-redirects + run: pip install mkdocs==1.5.3 mkdocs-material==9.6.17 pymdown-extensions==10.16.1 mkdocs-autorefs==1.4.2 mkdocs-redirects==1.2.2 From 922844cc5f4d7578b3f70d6726e613ddb1d6e17e Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 16:49:30 -0700 Subject: [PATCH 33/73] docs: pin actionlint installation version --- AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index 281989e4..5cd90f2e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -5,7 +5,7 @@ - Ensure Node.js 24 or newer is installed (e.g. via the NodeSource setup script). - Verify with `node --version`. - Install `actionlint` and ensure it is on your `PATH`: - - `go install github.com/rhysd/actionlint/cmd/actionlint@latest` + - `go install github.com/rhysd/actionlint/cmd/actionlint@v1.6.26` - Verify with `actionlint -version`. - Ensure PowerShell 7.5.1 is installed and accessible. - Verify with `pwsh --version`. From 4ea1439b6ae873b7c145e3f9fe6ab499da997d4b Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 17:08:15 -0700 Subject: [PATCH 34/73] docs: document Test and Release Mode --- .github/actionlint.yaml | 1 + AGENTS.md | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml index f016bd08..3400fa69 100644 --- a/.github/actionlint.yaml +++ b/.github/actionlint.yaml @@ -2,3 +2,4 @@ self-hosted-runner: labels: - icon-editor-windows - self-hosted-windows-lv + - ubuntu-24.04 diff --git a/AGENTS.md b/AGENTS.md index 5cd90f2e..2db4845a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -37,3 +37,15 @@ ### Pester Tests Pester tests are part of the continuous integration pipeline. The GitHub runner executes them automatically, so agents must not run Pester tests manually. + +## Test and Release Mode + +Committing build artifacts together with a `release.json` file triggers the release pipeline. + +The `release.json` file must follow this schema: + +```json +{"major":1,"minor":0,"patch":2,"title":"Release title"} +``` + +The workflow `ci.yml` runs first and, on success, hands off to `release.yml` for publishing. From ad063cdb2443b2f7201418c4a23fe262d0194f03 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 17:16:04 -0700 Subject: [PATCH 35/73] Add release workflow --- .github/workflows/release.yml | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..aa91273d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,65 @@ +name: Release + +on: + workflow_run: + workflows: [CI] + types: [completed] + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-24.04 + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 + with: + ref: ${{ github.event.workflow_run.head_sha }} + - id: check + run: | + if [[ -f release.json ]]; then + echo 'present=true' >> "$GITHUB_OUTPUT" + else + echo 'present=false' >> "$GITHUB_OUTPUT" + fi + - name: Parse release metadata + if: steps.check.outputs.present == 'true' + id: meta + run: | + VERSION=$(jq -r '"\(.major).\(.minor).\(.patch)"' release.json) + TITLE=$(jq -r '.title' release.json) + echo "tag=v$VERSION" >> "$GITHUB_OUTPUT" + echo "title=$TITLE" >> "$GITHUB_OUTPUT" + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 + if: steps.check.outputs.present == 'true' + with: + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + path: artifacts + - name: Create tag + if: steps.check.outputs.present == 'true' + run: | + git config user.name github-actions + git config user.email github-actions@github.com + git tag "$TAG" "${{ github.event.workflow_run.head_sha }}" + git push origin "$TAG" + env: + TAG: ${{ steps.meta.outputs.tag }} + - name: Create GitHub release + if: steps.check.outputs.present == 'true' + id: create_release + uses: actions/create-release@0cb9c9b65d5d1901c1f53e5e66eaf4afd303e70e + with: + tag_name: ${{ steps.meta.outputs.tag }} + release_name: ${{ steps.meta.outputs.title }} + body: ${{ steps.meta.outputs.title }} + - name: Upload artifacts + if: steps.check.outputs.present == 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG: ${{ steps.meta.outputs.tag }} + run: | + for file in $(find artifacts -type f); do + gh release upload "$TAG" "$file" --clobber + done From a70c64fc445f39d83952d0b3230e34cbd2d77203 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 17:23:42 -0700 Subject: [PATCH 36/73] feat: upload release metadata --- .github/workflows/ci.yml | 21 +++++++++++++++++++++ .github/workflows/release.yml | 15 ++------------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 81a40d00..9e7453df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,27 @@ on: branches: [actions] jobs: + release-check: + runs-on: ubuntu-24.04 + outputs: + needs_release: ${{ steps.check.outputs.present }} + steps: + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 + - id: check + run: | + if [[ -f release.json ]]; then + echo 'present=true' >> "$GITHUB_OUTPUT" + else + echo 'present=false' >> "$GITHUB_OUTPUT" + fi + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + if: steps.check.outputs.present == 'true' + with: + name: release-metadata + path: release.json + node-ci: + needs: release-check runs-on: ubuntu-24.04 env: # Summary artifacts are emitted under artifacts/. @@ -55,6 +75,7 @@ jobs: if-no-files-found: ignore ps-ci: + needs: release-check strategy: matrix: include: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index aa91273d..1d439a26 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,20 +11,12 @@ permissions: jobs: release: runs-on: ubuntu-24.04 - if: ${{ github.event.workflow_run.conclusion == 'success' }} + if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.outputs.needs_release == 'true' }} steps: - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 with: ref: ${{ github.event.workflow_run.head_sha }} - - id: check - run: | - if [[ -f release.json ]]; then - echo 'present=true' >> "$GITHUB_OUTPUT" - else - echo 'present=false' >> "$GITHUB_OUTPUT" - fi - name: Parse release metadata - if: steps.check.outputs.present == 'true' id: meta run: | VERSION=$(jq -r '"\(.major).\(.minor).\(.patch)"' release.json) @@ -32,13 +24,12 @@ jobs: echo "tag=v$VERSION" >> "$GITHUB_OUTPUT" echo "title=$TITLE" >> "$GITHUB_OUTPUT" - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 - if: steps.check.outputs.present == 'true' with: run-id: ${{ github.event.workflow_run.id }} github-token: ${{ secrets.GITHUB_TOKEN }} + name: release-metadata path: artifacts - name: Create tag - if: steps.check.outputs.present == 'true' run: | git config user.name github-actions git config user.email github-actions@github.com @@ -47,7 +38,6 @@ jobs: env: TAG: ${{ steps.meta.outputs.tag }} - name: Create GitHub release - if: steps.check.outputs.present == 'true' id: create_release uses: actions/create-release@0cb9c9b65d5d1901c1f53e5e66eaf4afd303e70e with: @@ -55,7 +45,6 @@ jobs: release_name: ${{ steps.meta.outputs.title }} body: ${{ steps.meta.outputs.title }} - name: Upload artifacts - if: steps.check.outputs.present == 'true' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAG: ${{ steps.meta.outputs.tag }} From 00d049134e025ffa8c68ae38a8fdb7ca91a34dd1 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 17:32:00 -0700 Subject: [PATCH 37/73] Add release manifest and artifact --- artifact.txt | 1 + release.json | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 artifact.txt create mode 100644 release.json diff --git a/artifact.txt b/artifact.txt new file mode 100644 index 00000000..2c0be20e --- /dev/null +++ b/artifact.txt @@ -0,0 +1 @@ +dummy artifact diff --git a/release.json b/release.json new file mode 100644 index 00000000..d9954dbd --- /dev/null +++ b/release.json @@ -0,0 +1,6 @@ +{ + "major": 1, + "minor": 0, + "patch": 0, + "title": "Initial release" +} From 505ca9989a26a3ffccb701102cf9040accc108c3 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 17:39:04 -0700 Subject: [PATCH 38/73] docs: add Test and Release Mode instructions --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 6a0a8cdb..1f4d89e2 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,21 @@ Invoke-Pester -Configuration $cfg XML test result output is intentionally disabled. +## Test and Release Mode + +Committing build artifacts together with a `release.json` file enables the +release pipeline. The `release.json` file supplies the JSON payload describing +the release: + +```json +{"major":1,"minor":0,"patch":2,"title":"Release title"} +``` + +Ensure the build artifacts are present (for example under `artifacts/`) and +checked in alongside `release.json`. The `ci.yml` workflow runs first and, on +success, hands off to `release.yml` to publish the release. See +[Test and Release Mode](AGENTS.md#test-and-release-mode) for more details. + ## Requirement Traceability Each requirement is tracked as an issue or entry in From 7dff489ce5cc166062a7f564adaea935eef1e7ca Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 17:55:56 -0700 Subject: [PATCH 39/73] ci: add artifact validation --- .github/workflows/ci.json | 93 +++++++++++++-------------------------- .github/workflows/ci.yml | 50 +++------------------ 2 files changed, 37 insertions(+), 106 deletions(-) diff --git a/.github/workflows/ci.json b/.github/workflows/ci.json index e8761e41..803b20ce 100644 --- a/.github/workflows/ci.json +++ b/.github/workflows/ci.json @@ -13,91 +13,61 @@ } }, "jobs": { - "node-ci": { + "release-check": { "runs-on": "ubuntu-24.04", - "env": { - "ARTIFACT_DIR": "artifacts/linux" + "outputs": { + "needs_release": "${{ steps.check.outputs.present }}" }, "steps": [ { "uses": "actions/checkout@v4" }, { - "uses": "actions/setup-node@v4", - "with": { - "node-version": 24 - } - }, - { - "run": "npm run check:node" - }, - { - "run": "npm install" - }, - { - "run": "npm run link:check" - }, - { - "run": "npm run test:ci" - }, - { - "run": "npm run derive:registry" - }, - { - "run": "rm -rf artifacts" - }, - { - "run": "mkdir -p artifacts && cp test-results/*junit*.xml artifacts/" + "id": "check", + "run": "if [[ -f release.json ]]; then\n echo 'present=true' >> \"$GITHUB_OUTPUT\"\nelse\n echo 'present=false' >> \"$GITHUB_OUTPUT\"\nfi" }, { "uses": "actions/upload-artifact@v4", - "if": "always()", + "if": "steps.check.outputs.present == 'true'", "with": { - "name": "junit-results", - "path": "artifacts/**/*junit*.xml" + "name": "release-metadata", + "path": "release.json" } + } + ] + }, + "validate-artifacts": { + "needs": "release-check", + "runs-on": "ubuntu-24.04", + "steps": [ + { + "uses": "actions/checkout@v4" }, { - "uses": "EnricoMi/publish-unit-test-result-action@v2", - "if": "always()", + "uses": "actions/setup-node@v4", "with": { - "files": "artifacts/**/*junit*.xml" + "node-version": 24 } }, { - "run": "npm run generate:summary", - "env": { - "TEST_RESULTS_GLOBS": "test-results/*junit*.xml" - } + "run": "npm install" }, { - "uses": "actions/upload-artifact@v4", - "if": "always()", - "with": { - "name": "traceability", - "path": "${{ env.ARTIFACT_DIR }}/traceability.*" - } + "run": "npm run link:check" }, { - "uses": "actions/upload-artifact@v4", - "if": "always()", - "with": { - "name": "action-docs", - "path": "${{ env.ARTIFACT_DIR }}/action-docs.*" - } + "run": "npm run derive:registry" }, { - "uses": "actions/upload-artifact@v4", - "if": "always()", - "with": { - "name": "evidence", - "path": "${{ env.ARTIFACT_DIR }}/evidence/**", - "if-no-files-found": "ignore" - } + "run": "git diff --exit-code -- dispatchers.json" + }, + { + "run": "npm run check:traceability" } ] }, "ps-ci": { + "needs": "release-check", "strategy": { "matrix": { "include": [ @@ -161,7 +131,7 @@ }, "report": { "needs": [ - "node-ci", + "validate-artifacts", "ps-ci" ], "runs-on": "ubuntu-24.04", @@ -182,13 +152,10 @@ { "run": "npm install" }, - { - "run": "rm -rf artifacts" - }, { "uses": "actions/download-artifact@v4", "with": { - "path": "./artifacts" + "path": "./downloaded-artifacts" } }, { @@ -197,7 +164,7 @@ { "run": "npm run generate:summary", "env": { - "TEST_RESULTS_GLOBS": "artifacts/junit-results/artifacts/**/*junit*.xml\nartifacts/pester-junit-*/pester-junit.xml\n", + "TEST_RESULTS_GLOBS": "test-results/*junit*.xml\ndownloaded-artifacts/pester-junit-*/pester-junit.xml\n", "REQ_MAPPING_FILE": "requirements.json", "DISPATCHER_REGISTRY": "dispatchers.json", "EVIDENCE_DIR": "artifacts/evidence" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e7453df..34303d71 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,54 +26,19 @@ jobs: name: release-metadata path: release.json - node-ci: + validate-artifacts: needs: release-check runs-on: ubuntu-24.04 - env: - # Summary artifacts are emitted under artifacts/. - # This job always runs on Linux, so the directory is fixed. - ARTIFACT_DIR: artifacts/linux steps: - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: 24 - - run: npm run check:node - run: npm install - run: npm run link:check - - run: npm run test:ci - run: npm run derive:registry - - run: rm -rf artifacts - - run: mkdir -p artifacts && cp test-results/*junit*.xml artifacts/ - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 - if: ${{ (success() || failure()) && !cancelled() }} - with: - name: junit-results - path: artifacts/**/*junit*.xml - - uses: EnricoMi/publish-unit-test-result-action@0f06977fde99088e583f6fa8ec622da326e818c3 - if: ${{ (success() || failure()) && !cancelled() }} - with: - files: artifacts/**/*junit*.xml - - run: npm run generate:summary - env: - TEST_RESULTS_GLOBS: test-results/*junit*.xml - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 - if: ${{ (success() || failure()) && !cancelled() }} - with: - name: traceability - path: ${{ env.ARTIFACT_DIR }}/traceability.* - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 - if: ${{ (success() || failure()) && !cancelled() }} - with: - name: action-docs - path: ${{ env.ARTIFACT_DIR }}/action-docs.* - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 - if: ${{ (success() || failure()) && !cancelled() }} - with: - name: evidence - path: ${{ env.ARTIFACT_DIR }}/evidence/** - if-no-files-found: ignore - + - run: git diff --exit-code -- dispatchers.json + - run: npm run check:traceability ps-ci: needs: release-check strategy: @@ -141,7 +106,7 @@ jobs: if-no-files-found: error report: - needs: [node-ci, ps-ci] + needs: [validate-artifacts, ps-ci] runs-on: ubuntu-24.04 if: ${{ (success() || failure()) && !cancelled() }} steps: @@ -151,16 +116,15 @@ jobs: node-version: 24 - run: npm run check:node - run: npm install - - run: rm -rf artifacts - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 with: - path: ./artifacts + path: ./downloaded-artifacts - run: npm run derive:registry - run: npm run generate:summary env: TEST_RESULTS_GLOBS: | - artifacts/junit-results/artifacts/**/*junit*.xml - artifacts/pester-junit-*/pester-junit.xml + test-results/*junit*.xml + downloaded-artifacts/pester-junit-*/pester-junit.xml REQ_MAPPING_FILE: requirements.json DISPATCHER_REGISTRY: dispatchers.json EVIDENCE_DIR: artifacts/evidence From 66a7330f6dca7186c6f70dea6bf48fda832ffd85 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 18:06:10 -0700 Subject: [PATCH 40/73] refactor ci report to read node test results from repo --- .github/workflows/ci.json | 15 +++++++++++++++ .github/workflows/ci.yml | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.json b/.github/workflows/ci.json index 803b20ce..e15f246f 100644 --- a/.github/workflows/ci.json +++ b/.github/workflows/ci.json @@ -155,6 +155,7 @@ { "uses": "actions/download-artifact@v4", "with": { + "pattern": "pester-junit-*", "path": "./downloaded-artifacts" } }, @@ -170,6 +171,20 @@ "EVIDENCE_DIR": "artifacts/evidence" } }, + { + "run": "npx tsx scripts/generate-traceability-matrix.ts" + }, + { + "run": "cat artifacts/linux/traceability-matrix.md >> \"$GITHUB_STEP_SUMMARY\"" + }, + { + "uses": "actions/upload-artifact@v4", + "if": "(success() || failure()) && !cancelled()", + "with": { + "name": "traceability-matrix", + "path": "artifacts/linux/traceability-matrix.md" + } + }, { "run": "npx tsx scripts/print-pester-traceability.ts >> \"$GITHUB_STEP_SUMMARY\"" } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 34303d71..0833ff66 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -118,13 +118,14 @@ jobs: - run: npm install - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 with: + pattern: test-results-pester-* path: ./downloaded-artifacts - run: npm run derive:registry - run: npm run generate:summary env: TEST_RESULTS_GLOBS: | test-results/*junit*.xml - downloaded-artifacts/pester-junit-*/pester-junit.xml + downloaded-artifacts/test-results-pester-*/pester-junit.xml REQ_MAPPING_FILE: requirements.json DISPATCHER_REGISTRY: dispatchers.json EVIDENCE_DIR: artifacts/evidence From b47629f44bb1907d3cefce23ffc3f496e52dff86 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 18:22:07 -0700 Subject: [PATCH 41/73] docs: update testing workflow (REQ-001) --- AGENTS.md | 6 +- CONTRIBUTING.md | 7 +- README.md | 9 +- artifacts/linux/action-docs.json | 1628 ++++++++++++++++++++++ artifacts/linux/action-docs.md | 482 +++++++ artifacts/linux/requirements-summary.md | 70 + artifacts/linux/summary-standard.md | 7 + artifacts/linux/summary.md | 23 + artifacts/linux/traceability-standard.md | 114 ++ artifacts/linux/traceability.json | 574 ++++++++ artifacts/linux/traceability.md | 114 ++ dispatchers.json | 35 +- docs/contributing-docs.md | 6 +- test-results/node-junit.xml | 62 + 14 files changed, 3121 insertions(+), 16 deletions(-) create mode 100644 artifacts/linux/action-docs.json create mode 100644 artifacts/linux/action-docs.md create mode 100644 artifacts/linux/requirements-summary.md create mode 100644 artifacts/linux/summary-standard.md create mode 100644 artifacts/linux/summary.md create mode 100644 artifacts/linux/traceability-standard.md create mode 100644 artifacts/linux/traceability.json create mode 100644 artifacts/linux/traceability.md create mode 100644 test-results/node-junit.xml diff --git a/AGENTS.md b/AGENTS.md index 2db4845a..03a16bed 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -29,10 +29,14 @@ ## Testing - Run `npm run check:node` to verify Node.js satisfies the required version. - Run `npm install` to ensure Node dependencies are available. -- Run `npm test`. +- Run `npm run test:ci` (JUnit files appear under `test-results/`). +- Run `npm run derive:registry`. +- Run `TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary`. - Run `npm run lint:md` to lint Markdown files. - Run `npx --yes linkinator README.md docs scripts --config linkinator.config.json` to verify links and ensure failures are visible. - Run `actionlint` to validate GitHub Actions workflows. +- Run `npm run check:traceability` to validate generated artifacts. +- Commit `test-results/*` and `artifacts/linux/*` along with source changes. ### Pester Tests diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0d0e8825..a0898125 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,9 +4,14 @@ Contributions of all kinds are welcome. Ensure you have Node.js 24 or newer inst ```bash npm install -npm test +npm run test:ci +npm run derive:registry +TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary +npm run check:traceability ``` +`npm run test:ci` writes JUnit files to `test-results/`. Commit `test-results/*` and `artifacts/linux/*` along with your source changes. + For documentation updates, follow the [documentation contribution guidelines](docs/contributing-docs.md). Run the following to lint Markdown files and verify links before submitting a pull request: ```bash diff --git a/README.md b/README.md index 1f4d89e2..577fbf39 100644 --- a/README.md +++ b/README.md @@ -104,14 +104,17 @@ Workflows distinguish between standard GitHub-hosted images and integration runn ## Testing -Run the JavaScript tests with: +Run the JavaScript tests and generate traceability artifacts with: ```bash npm install -npm test +npm run test:ci +npm run derive:registry +TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary +npm run check:traceability ``` -For CI, `npm run test:ci` emits a JUnit XML report that [scripts/generate-ci-summary.ts](scripts/generate-ci-summary.ts) parses to build requirement traceability files in OS‑specific subdirectories (e.g., `artifacts/windows`, `artifacts/linux`) based on the `RUNNER_OS` environment variable. The summary script searches `artifacts/` by default; set `TEST_RESULTS_GLOBS` if your reports are elsewhere. +`npm run test:ci` writes JUnit files to `test-results/`. [scripts/generate-ci-summary.ts](scripts/generate-ci-summary.ts) parses these results to build requirement traceability files in OS‑specific subdirectories (e.g., `artifacts/windows`, `artifacts/linux`) based on the `RUNNER_OS` environment variable. Commit `test-results/*` and `artifacts/linux/*` along with your source changes. The summary script searches `artifacts/` by default; set `TEST_RESULTS_GLOBS` if your reports are elsewhere. Pester tests cover the dispatcher and helper modules. See [docs/testing-pester.md](docs/testing-pester.md) for guidelines on using the canonical argument helper and adding new tests. The GitHub runner installs Pester automatically; install it locally only if you plan to run the tests yourself: diff --git a/artifacts/linux/action-docs.json b/artifacts/linux/action-docs.json new file mode 100644 index 00000000..7bbf8583 --- /dev/null +++ b/artifacts/linux/action-docs.json @@ -0,0 +1,1628 @@ +{ + "action": [], + "dispatcher": { + "Invoke-AddTokenToLabVIEW": { + "description": "Adds an authentication token to a LabVIEW installation. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-ApplyVIPC": { + "description": "Applies a VI Package Configuration to a LabVIEW project. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. VIP_LVVersion: LabVIEW version used to build the VIPC. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPCPath: Optional path to the VIPC file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + }, + "VIP_LVVersion": { + "type": "string", + "required": true, + "description": "LabVIEW version used to build the VIPC" + }, + "VIPCPath": { + "type": "string", + "required": false, + "description": "Optional path to the VIPC file" + } + } + }, + "Invoke-Build": { + "description": "Builds the project and records version information. RelativePath: Normalized path to the project root relative to the working directory. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. CompanyName: Company name recorded in build metadata. AuthorName: Author name recorded in build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "AuthorName": { + "type": "string", + "required": true, + "description": "Author name recorded in build metadata" + }, + "Build": { + "type": "number", + "required": true, + "description": "Build number component" + }, + "Commit": { + "type": "string", + "required": true, + "description": "Commit identifier used for the build metadata" + }, + "CompanyName": { + "type": "string", + "required": true, + "description": "Company name recorded in build metadata" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEWMinorRevision": { + "type": "string", + "required": true, + "description": "Minor revision of LabVIEW used for the build" + }, + "Major": { + "type": "number", + "required": true, + "description": "Major version component" + }, + "Minor": { + "type": "number", + "required": true, + "description": "Minor version component" + }, + "Patch": { + "type": "number", + "required": true, + "description": "Patch version component" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + } + } + }, + "Invoke-BuildLvlibp": { + "description": "Builds a LabVIEW Packed Library using a project and build spec. MinimumSupportedLVVersion: Minimum LabVIEW version that the library supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "Build": { + "type": "number", + "required": true, + "description": "Build number component" + }, + "Build_Spec": { + "type": "string", + "required": true, + "description": "Name of the build specification within the project" + }, + "Commit": { + "type": "string", + "required": true, + "description": "Commit identifier used for the build metadata" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEW_Project": { + "type": "string", + "required": true, + "description": "Path to the LabVIEW project file" + }, + "Major": { + "type": "number", + "required": true, + "description": "Major version component" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the library supports" + }, + "Minor": { + "type": "number", + "required": true, + "description": "Minor version component" + }, + "Patch": { + "type": "number", + "required": true, + "description": "Patch version component" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-BuildViPackage": { + "description": "Builds a VI Package using the provided VIPB file and version metadata. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). LabVIEWMinorRevision: Minor revision of LabVIEW used to build the package. RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "Build": { + "type": "number", + "required": true, + "description": "Build number component" + }, + "Commit": { + "type": "string", + "required": true, + "description": "Commit identifier used for the build metadata" + }, + "DisplayInformationJSON": { + "type": "string", + "required": true, + "description": "JSON string containing display information for the package" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEWMinorRevision": { + "type": "string", + "required": true, + "description": "Minor revision of LabVIEW used to build the package" + }, + "Major": { + "type": "number", + "required": true, + "description": "Major version component" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the package supports" + }, + "Minor": { + "type": "number", + "required": true, + "description": "Minor version component" + }, + "Patch": { + "type": "number", + "required": true, + "description": "Patch version component" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "ReleaseNotesFile": { + "type": "string", + "required": false, + "description": "Optional path to a release notes file" + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + }, + "VIPBPath": { + "type": "string", + "required": true, + "description": "Path to the VIPB build specification file" + } + } + }, + "Invoke-CloseLabVIEW": { + "description": "Closes any running instance of LabVIEW. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-GenerateReleaseNotes": { + "description": "Generates a release notes file from the project's metadata. OutputPath: Path where the release notes should be written. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "OutputPath": { + "type": "string", + "required": false, + "default": "Tooling/deployment/release_notes.md", + "description": "Path where the release notes should be written" + } + } + }, + "Invoke-MissingInProject": { + "description": "Lists files referenced in a LabVIEW project that are missing on disk. LVVersion: LabVIEW version of the project. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). ProjectFile: Path to the .lvproj file to analyze. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LVVersion": { + "type": "string", + "required": true, + "description": "LabVIEW version of the project" + }, + "ProjectFile": { + "type": "string", + "required": true, + "description": "Path to the" + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-ModifyVIPBDisplayInfo": { + "description": "Updates display information fields in a VIPB build specification. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "Build": { + "type": "number", + "required": true, + "description": "Build number component" + }, + "Commit": { + "type": "string", + "required": true, + "description": "Commit identifier used for the build metadata" + }, + "DisplayInformationJSON": { + "type": "string", + "required": true, + "description": "JSON string containing display information for the package" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEWMinorRevision": { + "type": "string", + "required": true, + "description": "Minor revision of LabVIEW used for the build" + }, + "Major": { + "type": "number", + "required": true, + "description": "Major version component" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the package supports" + }, + "Minor": { + "type": "number", + "required": true, + "description": "Minor version component" + }, + "Patch": { + "type": "number", + "required": true, + "description": "Patch version component" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "ReleaseNotesFile": { + "type": "string", + "required": false, + "description": "Optional path to a release notes file" + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + }, + "VIPBPath": { + "type": "string", + "required": true, + "description": "Path to the VIPB build specification file" + } + } + }, + "Invoke-PrepareLabVIEWSource": { + "description": "Prepares a LabVIEW project for source distribution. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "Build_Spec": { + "type": "string", + "required": true, + "description": "Name of the build specification within the project" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEW_Project": { + "type": "string", + "required": true, + "description": "Path to the LabVIEW project file" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-RenameFile": { + "description": "Renames a file on disk. CurrentFilename: Existing path to the file. NewFilename: New path for the file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "CurrentFilename": { + "type": "string", + "required": true, + "description": "Existing path to the file" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "NewFilename": { + "type": "string", + "required": true, + "description": "New path for the file" + } + } + }, + "Invoke-RestoreSetupLVSource": { + "description": "Restores the Setup LabVIEW source build specification. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "Build_Spec": { + "type": "string", + "required": true, + "description": "Name of the build specification within the project" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEW_Project": { + "type": "string", + "required": true, + "description": "Path to the LabVIEW project file" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-RevertDevelopmentMode": { + "description": "Returns a repository to its previous development mode state. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + } + } + }, + "Invoke-RunPesterTests": { + "description": "Runs Pester tests located in the specified working directory. WorkingDirectory: Path containing the Pester tests to execute. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "WorkingDirectory": { + "type": "string", + "required": true, + "description": "Path containing the Pester tests to execute" + } + } + }, + "Invoke-RunUnitTests": { + "description": "Runs LabVIEW unit tests. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-SetDevelopmentMode": { + "description": "Configures the repository for development mode. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + } + } + }, + "Normalize-RelativePath": { + "description": "Normalizes a RelativePath value against an optional base directory. RelativePath: Path to normalize. BaseDirectory: Directory used to resolve the relative path. Defaults to the current location.", + "parameters": { + "BaseDirectory": { + "type": "string", + "required": false, + "description": "Directory used to resolve the relative path" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + } + } + }, + "Set-LogLevel": { + "description": "Sets the verbosity for informational and verbose messages. Level: Desired log level (ERROR, WARN, INFO, DEBUG).", + "parameters": { + "Level": { + "type": "string", + "required": false, + "description": "Desired log level (ERROR, WARN, INFO, DEBUG)" + } + } + } + }, + "wrappers": { + "add-token-to-labview": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the token target.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "apply-vipc": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "vip_lv_version", + "description": "LabVIEW version associated with the VI Package.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the LabVIEW project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "vipc_path", + "description": "Path to the VIPC file.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "build": [ + { + "name": "relative_path", + "description": "Relative path containing the LabVIEW project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "major", + "description": "Major version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "minor", + "description": "Minor version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "patch", + "description": "Patch version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build", + "description": "Build number.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "commit", + "description": "Commit identifier.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_minor_revision", + "description": "LabVIEW minor revision.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "company_name", + "description": "Company name for the build.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "author_name", + "description": "Author name for the build.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "build-lvlibp": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the LabVIEW project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_project", + "description": "Path to the LabVIEW project file.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build_spec", + "description": "Name of the build specification.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "major", + "description": "Major version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "minor", + "description": "Minor version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "patch", + "description": "Patch version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build", + "description": "Build number.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "commit", + "description": "Commit identifier.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "build-vi-package": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_minor_revision", + "description": "LabVIEW minor revision.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "vipb_path", + "description": "Path to the VIPB file.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "major", + "description": "Major version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "minor", + "description": "Minor version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "patch", + "description": "Patch version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build", + "description": "Build number.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "commit", + "description": "Commit identifier.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "display_information_json", + "description": "JSON string of display information.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "release_notes_file", + "description": "Optional path to release notes file.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "close-labview": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "generate-release-notes": [ + { + "name": "output_path", + "description": "Path to output markdown file.", + "required": false, + "default": "Tooling/deployment/release_notes.md", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "missing-in-project": [ + { + "name": "lv_version", + "description": "LabVIEW version to use.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "Target LabVIEW bitness (32 or 64).", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "project_file", + "description": "Path to the LabVIEW project (.lvproj).", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "modify-vipb-display-info": [ + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "vipb_path", + "description": "Path to the VIPB file.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_minor_revision", + "description": "LabVIEW minor revision.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "major", + "description": "Major version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "minor", + "description": "Minor version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "patch", + "description": "Patch version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build", + "description": "Build number.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "commit", + "description": "Commit identifier.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "display_information_json", + "description": "JSON string of display information.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "release_notes_file", + "description": "Optional path to release notes file.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "prepare-labview-source": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_project", + "description": "Path to the LabVIEW project file.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build_spec", + "description": "Name of the build specification.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "rename-file": [ + { + "name": "current_filename", + "description": "Existing file name.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "new_filename", + "description": "New file name.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "restore-setup-lv-source": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_project", + "description": "Path to the LabVIEW project file.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build_spec", + "description": "Name of the build specification.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "revert-development-mode": [ + { + "name": "relative_path", + "description": "Relative path containing the repository.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "run-pester-tests": [ + { + "name": "working_directory", + "description": "Directory containing the repository under test.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "run-unit-tests": [ + { + "name": "minimum_supported_lv_version", + "description": "LabVIEW version for the test run.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "set-development-mode": [ + { + "name": "relative_path", + "description": "Relative path containing the repository.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "setup-mkdocs": [] + } +} \ No newline at end of file diff --git a/artifacts/linux/action-docs.md b/artifacts/linux/action-docs.md new file mode 100644 index 00000000..729aa768 --- /dev/null +++ b/artifacts/linux/action-docs.md @@ -0,0 +1,482 @@ +### Parameters +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | + +### Dispatcher Functions + +#### Invoke-AddTokenToLabVIEW +Adds an authentication token to a LabVIEW installation. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-AddTokenToLabVIEW -ArgsJson '{}' +``` + +#### Invoke-ApplyVIPC +Applies a VI Package Configuration to a LabVIEW project. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. VIP_LVVersion: LabVIEW version used to build the VIPC. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPCPath: Optional path to the VIPC file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| VIPCPath | string | false | | Optional path to the VIPC file | +| VIP_LVVersion | string | true | | LabVIEW version used to build the VIPC | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-ApplyVIPC -ArgsJson '{}' +``` + +#### Invoke-Build +Builds the project and records version information. RelativePath: Normalized path to the project root relative to the working directory. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. CompanyName: Company name recorded in build metadata. AuthorName: Author name recorded in build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| AuthorName | string | true | | Author name recorded in build metadata | +| Build | number | true | | Build number component | +| Commit | string | true | | Commit identifier used for the build metadata | +| CompanyName | string | true | | Company name recorded in build metadata | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEWMinorRevision | string | true | | Minor revision of LabVIEW used for the build | +| Major | number | true | | Major version component | +| Minor | number | true | | Minor version component | +| Patch | number | true | | Patch version component | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-Build -ArgsJson '{}' +``` + +#### Invoke-BuildLvlibp +Builds a LabVIEW Packed Library using a project and build spec. MinimumSupportedLVVersion: Minimum LabVIEW version that the library supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Build | number | true | | Build number component | +| Build_Spec | string | true | | Name of the build specification within the project | +| Commit | string | true | | Commit identifier used for the build metadata | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEW_Project | string | true | | Path to the LabVIEW project file | +| Major | number | true | | Major version component | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the library supports | +| Minor | number | true | | Minor version component | +| Patch | number | true | | Patch version component | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-BuildLvlibp -ArgsJson '{}' +``` + +#### Invoke-BuildViPackage +Builds a VI Package using the provided VIPB file and version metadata. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). LabVIEWMinorRevision: Minor revision of LabVIEW used to build the package. RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Build | number | true | | Build number component | +| Commit | string | true | | Commit identifier used for the build metadata | +| DisplayInformationJSON | string | true | | JSON string containing display information for the package | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEWMinorRevision | string | true | | Minor revision of LabVIEW used to build the package | +| Major | number | true | | Major version component | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the package supports | +| Minor | number | true | | Minor version component | +| Patch | number | true | | Patch version component | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| ReleaseNotesFile | string | false | | Optional path to a release notes file | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| VIPBPath | string | true | | Path to the VIPB build specification file | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-BuildViPackage -ArgsJson '{}' +``` + +#### Invoke-CloseLabVIEW +Closes any running instance of LabVIEW. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-CloseLabVIEW -ArgsJson '{}' +``` + +#### Invoke-GenerateReleaseNotes +Generates a release notes file from the project's metadata. OutputPath: Path where the release notes should be written. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| OutputPath | string | false | Tooling/deployment/release_notes.md | Path where the release notes should be written | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-GenerateReleaseNotes -ArgsJson '{}' +``` + +#### Invoke-MissingInProject +Lists files referenced in a LabVIEW project that are missing on disk. LVVersion: LabVIEW version of the project. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). ProjectFile: Path to the .lvproj file to analyze. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LVVersion | string | true | | LabVIEW version of the project | +| ProjectFile | string | true | | Path to the | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-MissingInProject -ArgsJson '{}' +``` + +#### Invoke-ModifyVIPBDisplayInfo +Updates display information fields in a VIPB build specification. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Build | number | true | | Build number component | +| Commit | string | true | | Commit identifier used for the build metadata | +| DisplayInformationJSON | string | true | | JSON string containing display information for the package | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEWMinorRevision | string | true | | Minor revision of LabVIEW used for the build | +| Major | number | true | | Major version component | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the package supports | +| Minor | number | true | | Minor version component | +| Patch | number | true | | Patch version component | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| ReleaseNotesFile | string | false | | Optional path to a release notes file | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| VIPBPath | string | true | | Path to the VIPB build specification file | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-ModifyVIPBDisplayInfo -ArgsJson '{}' +``` + +#### Invoke-PrepareLabVIEWSource +Prepares a LabVIEW project for source distribution. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Build_Spec | string | true | | Name of the build specification within the project | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEW_Project | string | true | | Path to the LabVIEW project file | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-PrepareLabVIEWSource -ArgsJson '{}' +``` + +#### Invoke-RenameFile +Renames a file on disk. CurrentFilename: Existing path to the file. NewFilename: New path for the file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| CurrentFilename | string | true | | Existing path to the file | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| NewFilename | string | true | | New path for the file | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-RenameFile -ArgsJson '{}' +``` + +#### Invoke-RestoreSetupLVSource +Restores the Setup LabVIEW source build specification. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Build_Spec | string | true | | Name of the build specification within the project | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEW_Project | string | true | | Path to the LabVIEW project file | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-RestoreSetupLVSource -ArgsJson '{}' +``` + +#### Invoke-RevertDevelopmentMode +Returns a repository to its previous development mode state. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-RevertDevelopmentMode -ArgsJson '{}' +``` + +#### Invoke-RunPesterTests +Runs Pester tests located in the specified working directory. WorkingDirectory: Path containing the Pester tests to execute. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| WorkingDirectory | string | true | | Path containing the Pester tests to execute | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-RunPesterTests -ArgsJson '{}' +``` + +#### Invoke-RunUnitTests +Runs LabVIEW unit tests. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-RunUnitTests -ArgsJson '{}' +``` + +#### Invoke-SetDevelopmentMode +Configures the repository for development mode. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-SetDevelopmentMode -ArgsJson '{}' +``` + +#### Normalize-RelativePath +Normalizes a RelativePath value against an optional base directory. RelativePath: Path to normalize. BaseDirectory: Directory used to resolve the relative path. Defaults to the current location. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| BaseDirectory | string | false | | Directory used to resolve the relative path | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Normalize-RelativePath -ArgsJson '{}' +``` + +#### Set-LogLevel +Sets the verbosity for informational and verbose messages. Level: Desired log level (ERROR, WARN, INFO, DEBUG). +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Level | string | false | | Desired log level (ERROR, WARN, INFO, DEBUG) | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Set-LogLevel -ArgsJson '{}' +``` + +### Wrapper Actions + +#### add-token-to-labview +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the token target. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### apply-vipc +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| vip_lv_version | string | true | | LabVIEW version associated with the VI Package. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the LabVIEW project. | +| vipc_path | string | false | | Path to the VIPC file. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### build +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| relative_path | string | true | | Relative path containing the LabVIEW project. | +| major | string | true | | Major version component. | +| minor | string | true | | Minor version component. | +| patch | string | true | | Patch version component. | +| build | string | true | | Build number. | +| commit | string | true | | Commit identifier. | +| labview_minor_revision | string | true | | LabVIEW minor revision. | +| company_name | string | true | | Company name for the build. | +| author_name | string | true | | Author name for the build. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### build-lvlibp +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the LabVIEW project. | +| labview_project | string | true | | Path to the LabVIEW project file. | +| build_spec | string | true | | Name of the build specification. | +| major | string | true | | Major version component. | +| minor | string | true | | Minor version component. | +| patch | string | true | | Patch version component. | +| build | string | true | | Build number. | +| commit | string | true | | Commit identifier. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### build-vi-package +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| labview_minor_revision | string | true | | LabVIEW minor revision. | +| relative_path | string | true | | Relative path containing the project. | +| vipb_path | string | true | | Path to the VIPB file. | +| major | string | true | | Major version component. | +| minor | string | true | | Minor version component. | +| patch | string | true | | Patch version component. | +| build | string | true | | Build number. | +| commit | string | true | | Commit identifier. | +| display_information_json | string | true | | JSON string of display information. | +| release_notes_file | string | false | | Optional path to release notes file. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### close-labview +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### generate-release-notes +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| output_path | string | false | Tooling/deployment/release_notes.md | Path to output markdown file. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### missing-in-project +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| lv_version | string | true | | LabVIEW version to use. | +| supported_bitness | string | true | | Target LabVIEW bitness (32 or 64). | +| project_file | string | true | | Path to the LabVIEW project (.lvproj). | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### modify-vipb-display-info +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the project. | +| vipb_path | string | true | | Path to the VIPB file. | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| labview_minor_revision | string | true | | LabVIEW minor revision. | +| major | string | true | | Major version component. | +| minor | string | true | | Minor version component. | +| patch | string | true | | Patch version component. | +| build | string | true | | Build number. | +| commit | string | true | | Commit identifier. | +| display_information_json | string | true | | JSON string of display information. | +| release_notes_file | string | false | | Optional path to release notes file. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### prepare-labview-source +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the project. | +| labview_project | string | true | | Path to the LabVIEW project file. | +| build_spec | string | true | | Name of the build specification. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### rename-file +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| current_filename | string | true | | Existing file name. | +| new_filename | string | true | | New file name. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### restore-setup-lv-source +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the project. | +| labview_project | string | true | | Path to the LabVIEW project file. | +| build_spec | string | true | | Name of the build specification. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### revert-development-mode +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| relative_path | string | true | | Relative path containing the repository. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### run-pester-tests +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| working_directory | string | true | | Directory containing the repository under test. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### run-unit-tests +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | LabVIEW version for the test run. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### set-development-mode +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| relative_path | string | true | | Relative path containing the repository. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### setup-mkdocs +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | \ No newline at end of file diff --git a/artifacts/linux/requirements-summary.md b/artifacts/linux/requirements-summary.md new file mode 100644 index 00000000..9c1e1af5 --- /dev/null +++ b/artifacts/linux/requirements-summary.md @@ -0,0 +1,70 @@ +### Requirement Summary +| Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | +| --- | --- | --- | --- | --- | --- | --- | --- | +| REQ-023 | Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-024 | Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-025 | Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-026 | Suite properties are extracted as name/value pairs for environment details. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-027 | Testcase attributes name, status, classname, assertions, time, and any skip message are preserved. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-028 | Requirement identifiers embedded in testcase names are detected and associated with the test. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-029 | Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-030 | Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | | 1 | 1 | 0 | 0 | 100.00 | +| Unmapped | | | 40 | 40 | 0 | 0 | 100.00 | + +### Requirement Testcases +| Requirement ID | Test ID | Status | +| --- | --- | --- | +| REQ-023 | parses-nested-junit-structures | Passed | +| REQ-024 | captures-root-testsuites-attributes | Passed | +| REQ-025 | captures-testsuite-attributes | Passed | +| REQ-026 | captures-suite-properties | Passed | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | +| REQ-028 | extracts-requirement-identifiers | Passed | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | +| REQ-031 | validates-missing-fields | Passed | +| REQ-032 | preserves-unknown-attributes | Passed | +| REQ-033 | throws-error-for-malformed-xml | Passed | +| Unmapped | associates-classname-with-requirement | Passed | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | +| Unmapped | buildsummary-splits-totals-by-os | Passed | +| Unmapped | collecttestcases-captures-requirement-property | Passed | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | +| Unmapped | fails-when-no-junit-files-are-found | Passed | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | +| Unmapped | formaterror-handles-plain-objects | Passed | +| Unmapped | formaterror-handles-primitives | Passed | +| Unmapped | formaterror-handles-real-error-objects | Passed | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | +| Unmapped | generate-ci-summary-features | Passed | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | +| Unmapped | handles-root-level-testcases | Passed | +| Unmapped | handles-zipped-junit-artifacts | Passed | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | \ No newline at end of file diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md new file mode 100644 index 00000000..b7f625ee --- /dev/null +++ b/artifacts/linux/summary-standard.md @@ -0,0 +1,7 @@ +### Test Summary +| OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | +| --- | --- | --- | --- | --- | --- | +| overall | 51 | 0 | 0 | 16.25 | 100.00 | +| linux | 51 | 0 | 0 | 16.25 | 100.00 | + +_For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md new file mode 100644 index 00000000..7647d1fc --- /dev/null +++ b/artifacts/linux/summary.md @@ -0,0 +1,23 @@ +### Test Summary +| OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | +| --- | --- | --- | --- | --- | --- | +| overall | 51 | 0 | 0 | 16.25 | 100.00 | +| linux | 51 | 0 | 0 | 16.25 | 100.00 | + +### Requirement Summary +| Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | +| --- | --- | --- | --- | --- | --- | --- | --- | +| REQ-023 | Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-024 | Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-025 | Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-026 | Suite properties are extracted as name/value pairs for environment details. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-027 | Testcase attributes name, status, classname, assertions, time, and any skip message are preserved. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-028 | Requirement identifiers embedded in testcase names are detected and associated with the test. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-029 | Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-030 | Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | | 1 | 1 | 0 | 0 | 100.00 | +| Unmapped | | | 40 | 40 | 0 | 0 | 100.00 | + +_For detailed per-test information, see [traceability.md](traceability.md)._ \ No newline at end of file diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md new file mode 100644 index 00000000..11824fc1 --- /dev/null +++ b/artifacts/linux/traceability-standard.md @@ -0,0 +1,114 @@ +### Test Traceability Matrix + +#### REQ-023 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-023 | parses-nested-junit-structures | Passed | 0.013 | | | + +#### REQ-024 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | + +#### REQ-025 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-025 | captures-testsuite-attributes | Passed | 0.007 | | | + +#### REQ-026 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-026 | captures-suite-properties | Passed | 0.006 | | | + +#### REQ-027 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | + +#### REQ-028 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.007 | | | + +#### REQ-029 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | + +#### REQ-030 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | + +#### REQ-031 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | + +#### REQ-032 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | + +#### REQ-033 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.005 | | | + +
Unmapped (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| Unmapped | associates-classname-with-requirement | Passed | 0.029 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.005 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.026 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.016 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.976 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.246 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.056 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.365 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.023 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.388 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.914 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.902 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.027 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.910 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.332 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.433 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.839 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.986 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.130 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.562 | | | + +
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json new file mode 100644 index 00000000..e8e99902 --- /dev/null +++ b/artifacts/linux/traceability.json @@ -0,0 +1,574 @@ +{ + "requirements": [ + { + "id": "REQ-023", + "description": "Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases.", + "tests": [ + { + "id": "parses-nested-junit-structures", + "name": "[REQ-023] parses nested JUnit structures", + "className": "test", + "status": "Passed", + "duration": 0.013259, + "requirements": [ + "REQ-023" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-024", + "description": "Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting.", + "tests": [ + { + "id": "captures-root-testsuites-attributes", + "name": "[REQ-024] captures root testsuites attributes", + "className": "test", + "status": "Passed", + "duration": 0.002237, + "requirements": [ + "REQ-024" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-025", + "description": "Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time.", + "tests": [ + { + "id": "captures-testsuite-attributes", + "name": "[REQ-025] captures testsuite attributes", + "className": "test", + "status": "Passed", + "duration": 0.00655, + "requirements": [ + "REQ-025" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-026", + "description": "Suite properties are extracted as name/value pairs for environment details.", + "tests": [ + { + "id": "captures-suite-properties", + "name": "[REQ-026] captures suite properties", + "className": "test", + "status": "Passed", + "duration": 0.005587, + "requirements": [ + "REQ-026" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-027", + "description": "Testcase attributes name, status, classname, assertions, time, and any skip message are preserved.", + "tests": [ + { + "id": "captures-testcase-attributes-and-skipped-message", + "name": "[REQ-027] captures testcase attributes and skipped message", + "className": "test", + "status": "Passed", + "duration": 0.00159, + "requirements": [ + "REQ-027" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-028", + "description": "Requirement identifiers embedded in testcase names are detected and associated with the test.", + "tests": [ + { + "id": "extracts-requirement-identifiers", + "name": "[REQ-028] extracts requirement identifiers", + "className": "test", + "status": "Passed", + "duration": 0.007333, + "requirements": [ + "REQ-028" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-029", + "description": "Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases.", + "tests": [ + { + "id": "aggregates-status-by-requirement-and-suite", + "name": "[REQ-029] aggregates status by requirement and suite", + "className": "test", + "status": "Passed", + "duration": 0.001345, + "requirements": [ + "REQ-029" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-030", + "description": "Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons.", + "tests": [ + { + "id": "builds-traceability-matrix-with-skipped-reasons", + "name": "[REQ-030] builds traceability matrix with skipped reasons", + "className": "test", + "status": "Passed", + "duration": 0.004344, + "requirements": [ + "REQ-030" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-031", + "description": "Parsing logic validates presence of required fields and reports missing or malformed data.", + "tests": [ + { + "id": "validates-missing-fields", + "name": "[REQ-031] validates missing fields", + "className": "test", + "status": "Passed", + "duration": 0.001301, + "requirements": [ + "REQ-031" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-032", + "description": "Parser tolerates and retains unknown attributes for future extensibility.", + "tests": [ + { + "id": "preserves-unknown-attributes", + "name": "[REQ-032] preserves unknown attributes", + "className": "test", + "status": "Passed", + "duration": 0.001025, + "requirements": [ + "REQ-032" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-033", + "description": "Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv.", + "tests": [ + { + "id": "throws-error-for-malformed-xml", + "name": "[REQ-033] throws error for malformed XML", + "className": "test", + "status": "Passed", + "duration": 0.005405, + "requirements": [ + "REQ-033" + ], + "os": "linux" + } + ] + }, + { + "id": "Unmapped", + "tests": [ + { + "id": "associates-classname-with-requirement", + "name": "associates classname with requirement", + "className": "test", + "status": "Passed", + "duration": 0.028819, + "requirements": [], + "os": "linux" + }, + { + "id": "buildissuebranchname-formats-branch-name", + "name": "buildIssueBranchName formats branch name", + "className": "test", + "status": "Passed", + "duration": 0.002983, + "requirements": [], + "os": "linux" + }, + { + "id": "buildissuebranchname-rejects-non-numeric-input", + "name": "buildIssueBranchName rejects non-numeric input", + "className": "test", + "status": "Passed", + "duration": 0.001545, + "requirements": [], + "os": "linux" + }, + { + "id": "buildsummary-splits-totals-by-os", + "name": "buildSummary splits totals by OS", + "className": "test", + "status": "Passed", + "duration": 0.001259, + "requirements": [], + "os": "linux" + }, + { + "id": "collecttestcases-captures-requirement-property", + "name": "collectTestCases captures requirement property", + "className": "test", + "status": "Passed", + "duration": 0.005227, + "requirements": [], + "os": "linux" + }, + { + "id": "collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan", + "name": "collectTestCases uses evidence property and falls back to directory scan", + "className": "test", + "status": "Passed", + "duration": 0.026207, + "requirements": [], + "os": "linux" + }, + { + "id": "collecttestcases-uses-machine-name-property-for-owner", + "name": "collectTestCases uses machine-name property for owner", + "className": "test", + "status": "Passed", + "duration": 0.015746, + "requirements": [], + "os": "linux" + }, + { + "id": "computestatuscounts-tallies-test-statuses", + "name": "computeStatusCounts tallies test statuses", + "className": "test", + "status": "Passed", + "duration": 0.000522, + "requirements": [], + "os": "linux" + }, + { + "id": "dispatchers-and-parameters-include-descriptions", + "name": "Dispatchers and parameters include descriptions", + "className": "test", + "status": "Passed", + "duration": 0.002964, + "requirements": [], + "os": "linux" + }, + { + "id": "errors-when-strict-unmapped-mode-enabled", + "name": "errors when strict unmapped mode enabled", + "className": "test", + "status": "Passed", + "duration": 0.976478, + "requirements": [], + "os": "linux" + }, + { + "id": "escapemarkdown-escapes-special-characters", + "name": "escapeMarkdown escapes special characters", + "className": "test", + "status": "Passed", + "duration": 0.001349, + "requirements": [], + "os": "linux" + }, + { + "id": "escapemarkdown-leaves-plain-text-untouched", + "name": "escapeMarkdown leaves plain text untouched", + "className": "test", + "status": "Passed", + "duration": 0.000193, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-commit-lacks-requirement-reference", + "name": "fails when commit lacks requirement reference", + "className": "test", + "status": "Passed", + "duration": 1.24615, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-no-junit-files-are-found", + "name": "fails when no JUnit files are found", + "className": "test", + "status": "Passed", + "duration": 1.05571, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-requirement-lacks-test-coverage", + "name": "fails when requirement lacks test coverage", + "className": "test", + "status": "Passed", + "duration": 1.365107, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-plain-objects", + "name": "formatError handles plain objects", + "className": "test", + "status": "Passed", + "duration": 0.000707, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-primitives", + "name": "formatError handles primitives", + "className": "test", + "status": "Passed", + "duration": 0.000477, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-real-error-objects", + "name": "formatError handles real Error objects", + "className": "test", + "status": "Passed", + "duration": 0.003329, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-unstringifiable-values", + "name": "formatError handles unstringifiable values", + "className": "test", + "status": "Passed", + "duration": 0.000846, + "requirements": [], + "os": "linux" + }, + { + "id": "generate-ci-summary-features", + "name": "generate-ci-summary features", + "className": "test", + "status": "Passed", + "duration": 0.022945, + "requirements": [], + "os": "linux" + }, + { + "id": "groups-owners-and-includes-requirements-and-evidence", + "name": "groups owners and includes requirements and evidence", + "className": "test", + "status": "Passed", + "duration": 1.387939, + "requirements": [], + "os": "linux" + }, + { + "id": "grouptomarkdown-omits-numeric-identifiers", + "name": "groupToMarkdown omits numeric identifiers", + "className": "test", + "status": "Passed", + "duration": 0.002391, + "requirements": [], + "os": "linux" + }, + { + "id": "grouptomarkdown-supports-optional-limit-for-truncation", + "name": "groupToMarkdown supports optional limit for truncation", + "className": "test", + "status": "Passed", + "duration": 0.000969, + "requirements": [], + "os": "linux" + }, + { + "id": "handles-root-level-testcases", + "name": "handles root-level testcases", + "className": "test", + "status": "Passed", + "duration": 0.000489, + "requirements": [], + "os": "linux" + }, + { + "id": "handles-zipped-junit-artifacts", + "name": "handles zipped JUnit artifacts", + "className": "test", + "status": "Passed", + "duration": 0.913593, + "requirements": [], + "os": "linux" + }, + { + "id": "ignores-stale-junit-files-outside-artifacts-path", + "name": "ignores stale JUnit files outside artifacts path", + "className": "test", + "status": "Passed", + "duration": 0.9023, + "requirements": [], + "os": "linux" + }, + { + "id": "loadrequirements-logs-warning-on-invalid-json", + "name": "loadRequirements logs warning on invalid JSON", + "className": "test", + "status": "Passed", + "duration": 0.026948, + "requirements": [], + "os": "linux" + }, + { + "id": "loadrequirements-warns-and-skips-invalid-entries", + "name": "loadRequirements warns and skips invalid entries", + "className": "test", + "status": "Passed", + "duration": 0.006879, + "requirements": [], + "os": "linux" + }, + { + "id": "partitions-requirement-groups-by-runner_type", + "name": "partitions requirement groups by runner_type", + "className": "test", + "status": "Passed", + "duration": 0.910109, + "requirements": [], + "os": "linux" + }, + { + "id": "passes-with-coverage-and-requirement-reference", + "name": "passes with coverage and requirement reference", + "className": "test", + "status": "Passed", + "duration": 1.332491, + "requirements": [], + "os": "linux" + }, + { + "id": "requirementssummarytomarkdown-escapes-pipes-in-description", + "name": "requirementsSummaryToMarkdown escapes pipes in description", + "className": "test", + "status": "Passed", + "duration": 0.000614, + "requirements": [], + "os": "linux" + }, + { + "id": "skips-invalid-junit-files-and-still-generates-summary", + "name": "skips invalid JUnit files and still generates summary", + "className": "test", + "status": "Passed", + "duration": 1.432661, + "requirements": [], + "os": "linux" + }, + { + "id": "summarytomarkdown-handles-no-tests", + "name": "summaryToMarkdown handles no tests", + "className": "test", + "status": "Passed", + "duration": 0.000401, + "requirements": [], + "os": "linux" + }, + { + "id": "summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters", + "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", + "className": "test", + "status": "Passed", + "duration": 0.000946, + "requirements": [], + "os": "linux" + }, + { + "id": "throws-when-no-junit-files-found-and-strict-mode-enabled", + "name": "throws when no JUnit files found and strict mode enabled", + "className": "test", + "status": "Passed", + "duration": 0.839314, + "requirements": [], + "os": "linux" + }, + { + "id": "uses-latest-artifact-directory-when-multiple-are-present", + "name": "uses latest artifact directory when multiple are present", + "className": "test", + "status": "Passed", + "duration": 0.986089, + "requirements": [], + "os": "linux" + }, + { + "id": "warns-when-all-tests-are-unmapped", + "name": "warns when all tests are unmapped", + "className": "test", + "status": "Passed", + "duration": 1.129753, + "requirements": [], + "os": "linux" + }, + { + "id": "writeerrorsummary-appends-error-details-to-summary-file", + "name": "writeErrorSummary appends error details to summary file", + "className": "test", + "status": "Passed", + "duration": 0.005928, + "requirements": [], + "os": "linux" + }, + { + "id": "writeerrorsummary-skips-summary-file-for-non-error-throws", + "name": "writeErrorSummary skips summary file for non-Error throws", + "className": "test", + "status": "Passed", + "duration": 0.003117, + "requirements": [], + "os": "linux" + }, + { + "id": "writes-outputs-to-os-specific-directory", + "name": "writes outputs to OS-specific directory", + "className": "test", + "status": "Passed", + "duration": 1.56202, + "requirements": [], + "os": "linux" + } + ] + } + ], + "totals": { + "overall": { + "passed": 51, + "failed": 0, + "skipped": 0, + "duration": 16.253490000000003, + "rate": 100 + }, + "byOs": { + "linux": { + "passed": 51, + "failed": 0, + "skipped": 0, + "duration": 16.253490000000003, + "rate": 100 + } + } + } +} \ No newline at end of file diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md new file mode 100644 index 00000000..11824fc1 --- /dev/null +++ b/artifacts/linux/traceability.md @@ -0,0 +1,114 @@ +### Test Traceability Matrix + +#### REQ-023 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-023 | parses-nested-junit-structures | Passed | 0.013 | | | + +#### REQ-024 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | + +#### REQ-025 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-025 | captures-testsuite-attributes | Passed | 0.007 | | | + +#### REQ-026 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-026 | captures-suite-properties | Passed | 0.006 | | | + +#### REQ-027 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | + +#### REQ-028 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.007 | | | + +#### REQ-029 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | + +#### REQ-030 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | + +#### REQ-031 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | + +#### REQ-032 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | + +#### REQ-033 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.005 | | | + +
Unmapped (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| Unmapped | associates-classname-with-requirement | Passed | 0.029 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.005 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.026 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.016 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.976 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.246 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.056 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.365 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.023 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.388 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.914 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.902 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.027 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.910 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.332 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.433 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.839 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.986 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.130 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.562 | | | + +
\ No newline at end of file diff --git a/dispatchers.json b/dispatchers.json index a15c1ffb..1dbf753c 100644 --- a/dispatchers.json +++ b/dispatchers.json @@ -1,6 +1,6 @@ { "Invoke-AddTokenToLabVIEW": { - "description": "Adds an authentication token to a LabVIEW installation. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Adds an authentication token to a LabVIEW installation. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "DryRun": { "type": "boolean", @@ -30,7 +30,7 @@ } }, "Invoke-ApplyVIPC": { - "description": "Applies a VI Package Configuration to a LabVIEW project. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. VIP_LVVersion: LabVIEW version used to build the VIPC. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. VIPCPath: Optional path to the VIPC file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Applies a VI Package Configuration to a LabVIEW project. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. VIP_LVVersion: LabVIEW version used to build the VIPC. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPCPath: Optional path to the VIPC file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "DryRun": { "type": "boolean", @@ -70,7 +70,7 @@ } }, "Invoke-Build": { - "description": "Builds the project and records version information. RelativePath: Path to the project root relative to the working directory. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. CompanyName: Company name recorded in build metadata. AuthorName: Author name recorded in build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Builds the project and records version information. RelativePath: Normalized path to the project root relative to the working directory. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. CompanyName: Company name recorded in build metadata. AuthorName: Author name recorded in build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "AuthorName": { "type": "string", @@ -130,7 +130,7 @@ } }, "Invoke-BuildLvlibp": { - "description": "Builds a LabVIEW Packed Library using a project and build spec. MinimumSupportedLVVersion: Minimum LabVIEW version that the library supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Builds a LabVIEW Packed Library using a project and build spec. MinimumSupportedLVVersion: Minimum LabVIEW version that the library supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "Build": { "type": "number", @@ -195,7 +195,7 @@ } }, "Invoke-BuildViPackage": { - "description": "Builds a VI Package using the provided VIPB file and version metadata. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). LabVIEWMinorRevision: Minor revision of LabVIEW used to build the package. RelativePath: Path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Builds a VI Package using the provided VIPB file and version metadata. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). LabVIEWMinorRevision: Minor revision of LabVIEW used to build the package. RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "Build": { "type": "number", @@ -346,7 +346,7 @@ } }, "Invoke-ModifyVIPBDisplayInfo": { - "description": "Updates display information fields in a VIPB build specification. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Updates display information fields in a VIPB build specification. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "Build": { "type": "number", @@ -421,7 +421,7 @@ } }, "Invoke-PrepareLabVIEWSource": { - "description": "Prepares a LabVIEW project for source distribution. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Prepares a LabVIEW project for source distribution. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "Build_Spec": { "type": "string", @@ -486,7 +486,7 @@ } }, "Invoke-RestoreSetupLVSource": { - "description": "Restores the Setup LabVIEW source build specification. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Restores the Setup LabVIEW source build specification. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "Build_Spec": { "type": "string", @@ -526,7 +526,7 @@ } }, "Invoke-RevertDevelopmentMode": { - "description": "Returns a repository to its previous development mode state. RelativePath: Path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Returns a repository to its previous development mode state. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "DryRun": { "type": "boolean", @@ -591,7 +591,7 @@ } }, "Invoke-SetDevelopmentMode": { - "description": "Configures the repository for development mode. RelativePath: Path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Configures the repository for development mode. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "DryRun": { "type": "boolean", @@ -610,6 +610,21 @@ } } }, + "Normalize-RelativePath": { + "description": "Normalizes a RelativePath value against an optional base directory. RelativePath: Path to normalize. BaseDirectory: Directory used to resolve the relative path. Defaults to the current location.", + "parameters": { + "BaseDirectory": { + "type": "string", + "required": false, + "description": "Directory used to resolve the relative path" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + } + } + }, "Set-LogLevel": { "description": "Sets the verbosity for informational and verbose messages. Level: Desired log level (ERROR, WARN, INFO, DEBUG).", "parameters": { diff --git a/docs/contributing-docs.md b/docs/contributing-docs.md index dd278ad4..42b4d4ca 100644 --- a/docs/contributing-docs.md +++ b/docs/contributing-docs.md @@ -55,12 +55,16 @@ MkDocs serves the site at by default. The server automa ## JUnit integration -The CI pipeline collects JUnit XML output from both Node and PowerShell tests. `scripts/generate-ci-summary.ts` parses these files to build the requirement traceability report. Use `npm run test:ci` to produce the Node JUnit report when verifying documentation updates. By default, the summary script only searches `artifacts/` for JUnit XML files; if your results are elsewhere, pass a glob via `TEST_RESULTS_GLOBS`, for example: +The CI pipeline collects JUnit XML output from both Node and PowerShell tests. `scripts/generate-ci-summary.ts` parses these files to build the requirement traceability report. Use `npm run test:ci` to produce the Node JUnit report when verifying documentation updates; the results appear under `test-results/`. Then run: ```bash +npm run derive:registry TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary +npm run check:traceability ``` +Commit `test-results/*` and `artifacts/linux/*` along with your source changes. By default, the summary script only searches `artifacts/` for JUnit XML files; if your results are elsewhere, pass a glob via `TEST_RESULTS_GLOBS`. + ### Pester properties Pester tests should record traceability metadata by adding `Add-TestResult -Property` calls in each `It` block. At minimum, include an `Owner` and an `Evidence` path: diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml new file mode 100644 index 00000000..3013602a --- /dev/null +++ b/test-results/node-junit.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 55a0f1e20085660ee7626938c47b86e9a00bfcb0 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 18:22:07 -0700 Subject: [PATCH 42/73] docs: update testing workflow (REQ-001) --- AGENTS.md | 6 +- CONTRIBUTING.md | 7 +- README.md | 9 +- artifacts/linux/action-docs.json | 1628 ++++++++++++++++++++++ artifacts/linux/action-docs.md | 482 +++++++ artifacts/linux/requirements-summary.md | 70 + artifacts/linux/summary-standard.md | 7 + artifacts/linux/summary.md | 23 + artifacts/linux/traceability-standard.md | 114 ++ artifacts/linux/traceability.json | 574 ++++++++ artifacts/linux/traceability.md | 114 ++ dispatchers.json | 35 +- docs/contributing-docs.md | 6 +- test-results/node-junit.xml | 62 + 14 files changed, 3121 insertions(+), 16 deletions(-) create mode 100644 artifacts/linux/action-docs.json create mode 100644 artifacts/linux/action-docs.md create mode 100644 artifacts/linux/requirements-summary.md create mode 100644 artifacts/linux/summary-standard.md create mode 100644 artifacts/linux/summary.md create mode 100644 artifacts/linux/traceability-standard.md create mode 100644 artifacts/linux/traceability.json create mode 100644 artifacts/linux/traceability.md create mode 100644 test-results/node-junit.xml diff --git a/AGENTS.md b/AGENTS.md index 2db4845a..03a16bed 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -29,10 +29,14 @@ ## Testing - Run `npm run check:node` to verify Node.js satisfies the required version. - Run `npm install` to ensure Node dependencies are available. -- Run `npm test`. +- Run `npm run test:ci` (JUnit files appear under `test-results/`). +- Run `npm run derive:registry`. +- Run `TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary`. - Run `npm run lint:md` to lint Markdown files. - Run `npx --yes linkinator README.md docs scripts --config linkinator.config.json` to verify links and ensure failures are visible. - Run `actionlint` to validate GitHub Actions workflows. +- Run `npm run check:traceability` to validate generated artifacts. +- Commit `test-results/*` and `artifacts/linux/*` along with source changes. ### Pester Tests diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0d0e8825..a0898125 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,9 +4,14 @@ Contributions of all kinds are welcome. Ensure you have Node.js 24 or newer inst ```bash npm install -npm test +npm run test:ci +npm run derive:registry +TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary +npm run check:traceability ``` +`npm run test:ci` writes JUnit files to `test-results/`. Commit `test-results/*` and `artifacts/linux/*` along with your source changes. + For documentation updates, follow the [documentation contribution guidelines](docs/contributing-docs.md). Run the following to lint Markdown files and verify links before submitting a pull request: ```bash diff --git a/README.md b/README.md index 1f4d89e2..577fbf39 100644 --- a/README.md +++ b/README.md @@ -104,14 +104,17 @@ Workflows distinguish between standard GitHub-hosted images and integration runn ## Testing -Run the JavaScript tests with: +Run the JavaScript tests and generate traceability artifacts with: ```bash npm install -npm test +npm run test:ci +npm run derive:registry +TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary +npm run check:traceability ``` -For CI, `npm run test:ci` emits a JUnit XML report that [scripts/generate-ci-summary.ts](scripts/generate-ci-summary.ts) parses to build requirement traceability files in OS‑specific subdirectories (e.g., `artifacts/windows`, `artifacts/linux`) based on the `RUNNER_OS` environment variable. The summary script searches `artifacts/` by default; set `TEST_RESULTS_GLOBS` if your reports are elsewhere. +`npm run test:ci` writes JUnit files to `test-results/`. [scripts/generate-ci-summary.ts](scripts/generate-ci-summary.ts) parses these results to build requirement traceability files in OS‑specific subdirectories (e.g., `artifacts/windows`, `artifacts/linux`) based on the `RUNNER_OS` environment variable. Commit `test-results/*` and `artifacts/linux/*` along with your source changes. The summary script searches `artifacts/` by default; set `TEST_RESULTS_GLOBS` if your reports are elsewhere. Pester tests cover the dispatcher and helper modules. See [docs/testing-pester.md](docs/testing-pester.md) for guidelines on using the canonical argument helper and adding new tests. The GitHub runner installs Pester automatically; install it locally only if you plan to run the tests yourself: diff --git a/artifacts/linux/action-docs.json b/artifacts/linux/action-docs.json new file mode 100644 index 00000000..7bbf8583 --- /dev/null +++ b/artifacts/linux/action-docs.json @@ -0,0 +1,1628 @@ +{ + "action": [], + "dispatcher": { + "Invoke-AddTokenToLabVIEW": { + "description": "Adds an authentication token to a LabVIEW installation. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-ApplyVIPC": { + "description": "Applies a VI Package Configuration to a LabVIEW project. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. VIP_LVVersion: LabVIEW version used to build the VIPC. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPCPath: Optional path to the VIPC file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + }, + "VIP_LVVersion": { + "type": "string", + "required": true, + "description": "LabVIEW version used to build the VIPC" + }, + "VIPCPath": { + "type": "string", + "required": false, + "description": "Optional path to the VIPC file" + } + } + }, + "Invoke-Build": { + "description": "Builds the project and records version information. RelativePath: Normalized path to the project root relative to the working directory. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. CompanyName: Company name recorded in build metadata. AuthorName: Author name recorded in build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "AuthorName": { + "type": "string", + "required": true, + "description": "Author name recorded in build metadata" + }, + "Build": { + "type": "number", + "required": true, + "description": "Build number component" + }, + "Commit": { + "type": "string", + "required": true, + "description": "Commit identifier used for the build metadata" + }, + "CompanyName": { + "type": "string", + "required": true, + "description": "Company name recorded in build metadata" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEWMinorRevision": { + "type": "string", + "required": true, + "description": "Minor revision of LabVIEW used for the build" + }, + "Major": { + "type": "number", + "required": true, + "description": "Major version component" + }, + "Minor": { + "type": "number", + "required": true, + "description": "Minor version component" + }, + "Patch": { + "type": "number", + "required": true, + "description": "Patch version component" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + } + } + }, + "Invoke-BuildLvlibp": { + "description": "Builds a LabVIEW Packed Library using a project and build spec. MinimumSupportedLVVersion: Minimum LabVIEW version that the library supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "Build": { + "type": "number", + "required": true, + "description": "Build number component" + }, + "Build_Spec": { + "type": "string", + "required": true, + "description": "Name of the build specification within the project" + }, + "Commit": { + "type": "string", + "required": true, + "description": "Commit identifier used for the build metadata" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEW_Project": { + "type": "string", + "required": true, + "description": "Path to the LabVIEW project file" + }, + "Major": { + "type": "number", + "required": true, + "description": "Major version component" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the library supports" + }, + "Minor": { + "type": "number", + "required": true, + "description": "Minor version component" + }, + "Patch": { + "type": "number", + "required": true, + "description": "Patch version component" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-BuildViPackage": { + "description": "Builds a VI Package using the provided VIPB file and version metadata. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). LabVIEWMinorRevision: Minor revision of LabVIEW used to build the package. RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "Build": { + "type": "number", + "required": true, + "description": "Build number component" + }, + "Commit": { + "type": "string", + "required": true, + "description": "Commit identifier used for the build metadata" + }, + "DisplayInformationJSON": { + "type": "string", + "required": true, + "description": "JSON string containing display information for the package" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEWMinorRevision": { + "type": "string", + "required": true, + "description": "Minor revision of LabVIEW used to build the package" + }, + "Major": { + "type": "number", + "required": true, + "description": "Major version component" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the package supports" + }, + "Minor": { + "type": "number", + "required": true, + "description": "Minor version component" + }, + "Patch": { + "type": "number", + "required": true, + "description": "Patch version component" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "ReleaseNotesFile": { + "type": "string", + "required": false, + "description": "Optional path to a release notes file" + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + }, + "VIPBPath": { + "type": "string", + "required": true, + "description": "Path to the VIPB build specification file" + } + } + }, + "Invoke-CloseLabVIEW": { + "description": "Closes any running instance of LabVIEW. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-GenerateReleaseNotes": { + "description": "Generates a release notes file from the project's metadata. OutputPath: Path where the release notes should be written. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "OutputPath": { + "type": "string", + "required": false, + "default": "Tooling/deployment/release_notes.md", + "description": "Path where the release notes should be written" + } + } + }, + "Invoke-MissingInProject": { + "description": "Lists files referenced in a LabVIEW project that are missing on disk. LVVersion: LabVIEW version of the project. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). ProjectFile: Path to the .lvproj file to analyze. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LVVersion": { + "type": "string", + "required": true, + "description": "LabVIEW version of the project" + }, + "ProjectFile": { + "type": "string", + "required": true, + "description": "Path to the" + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-ModifyVIPBDisplayInfo": { + "description": "Updates display information fields in a VIPB build specification. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "Build": { + "type": "number", + "required": true, + "description": "Build number component" + }, + "Commit": { + "type": "string", + "required": true, + "description": "Commit identifier used for the build metadata" + }, + "DisplayInformationJSON": { + "type": "string", + "required": true, + "description": "JSON string containing display information for the package" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEWMinorRevision": { + "type": "string", + "required": true, + "description": "Minor revision of LabVIEW used for the build" + }, + "Major": { + "type": "number", + "required": true, + "description": "Major version component" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the package supports" + }, + "Minor": { + "type": "number", + "required": true, + "description": "Minor version component" + }, + "Patch": { + "type": "number", + "required": true, + "description": "Patch version component" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "ReleaseNotesFile": { + "type": "string", + "required": false, + "description": "Optional path to a release notes file" + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + }, + "VIPBPath": { + "type": "string", + "required": true, + "description": "Path to the VIPB build specification file" + } + } + }, + "Invoke-PrepareLabVIEWSource": { + "description": "Prepares a LabVIEW project for source distribution. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "Build_Spec": { + "type": "string", + "required": true, + "description": "Name of the build specification within the project" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEW_Project": { + "type": "string", + "required": true, + "description": "Path to the LabVIEW project file" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-RenameFile": { + "description": "Renames a file on disk. CurrentFilename: Existing path to the file. NewFilename: New path for the file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "CurrentFilename": { + "type": "string", + "required": true, + "description": "Existing path to the file" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "NewFilename": { + "type": "string", + "required": true, + "description": "New path for the file" + } + } + }, + "Invoke-RestoreSetupLVSource": { + "description": "Restores the Setup LabVIEW source build specification. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "Build_Spec": { + "type": "string", + "required": true, + "description": "Name of the build specification within the project" + }, + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "LabVIEW_Project": { + "type": "string", + "required": true, + "description": "Path to the LabVIEW project file" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-RevertDevelopmentMode": { + "description": "Returns a repository to its previous development mode state. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + } + } + }, + "Invoke-RunPesterTests": { + "description": "Runs Pester tests located in the specified working directory. WorkingDirectory: Path containing the Pester tests to execute. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "WorkingDirectory": { + "type": "string", + "required": true, + "description": "Path containing the Pester tests to execute" + } + } + }, + "Invoke-RunUnitTests": { + "description": "Runs LabVIEW unit tests. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "MinimumSupportedLVVersion": { + "type": "string", + "required": true, + "description": "Minimum LabVIEW version that the project supports" + }, + "SupportedBitness": { + "type": "string", + "required": true, + "description": "Target LabVIEW bitness (32- or 64-bit)" + } + } + }, + "Invoke-SetDevelopmentMode": { + "description": "Configures the repository for development mode. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "parameters": { + "DryRun": { + "type": "boolean", + "required": false, + "description": "If set, prints the command instead of executing it" + }, + "gcliPath": { + "type": "string", + "required": false, + "description": "Optional path prepended to PATH for locating the g CLI" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + } + } + }, + "Normalize-RelativePath": { + "description": "Normalizes a RelativePath value against an optional base directory. RelativePath: Path to normalize. BaseDirectory: Directory used to resolve the relative path. Defaults to the current location.", + "parameters": { + "BaseDirectory": { + "type": "string", + "required": false, + "description": "Directory used to resolve the relative path" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + } + } + }, + "Set-LogLevel": { + "description": "Sets the verbosity for informational and verbose messages. Level: Desired log level (ERROR, WARN, INFO, DEBUG).", + "parameters": { + "Level": { + "type": "string", + "required": false, + "description": "Desired log level (ERROR, WARN, INFO, DEBUG)" + } + } + } + }, + "wrappers": { + "add-token-to-labview": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the token target.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "apply-vipc": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "vip_lv_version", + "description": "LabVIEW version associated with the VI Package.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the LabVIEW project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "vipc_path", + "description": "Path to the VIPC file.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "build": [ + { + "name": "relative_path", + "description": "Relative path containing the LabVIEW project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "major", + "description": "Major version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "minor", + "description": "Minor version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "patch", + "description": "Patch version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build", + "description": "Build number.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "commit", + "description": "Commit identifier.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_minor_revision", + "description": "LabVIEW minor revision.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "company_name", + "description": "Company name for the build.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "author_name", + "description": "Author name for the build.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "build-lvlibp": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the LabVIEW project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_project", + "description": "Path to the LabVIEW project file.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build_spec", + "description": "Name of the build specification.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "major", + "description": "Major version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "minor", + "description": "Minor version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "patch", + "description": "Patch version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build", + "description": "Build number.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "commit", + "description": "Commit identifier.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "build-vi-package": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_minor_revision", + "description": "LabVIEW minor revision.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "vipb_path", + "description": "Path to the VIPB file.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "major", + "description": "Major version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "minor", + "description": "Minor version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "patch", + "description": "Patch version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build", + "description": "Build number.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "commit", + "description": "Commit identifier.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "display_information_json", + "description": "JSON string of display information.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "release_notes_file", + "description": "Optional path to release notes file.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "close-labview": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "generate-release-notes": [ + { + "name": "output_path", + "description": "Path to output markdown file.", + "required": false, + "default": "Tooling/deployment/release_notes.md", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "missing-in-project": [ + { + "name": "lv_version", + "description": "LabVIEW version to use.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "Target LabVIEW bitness (32 or 64).", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "project_file", + "description": "Path to the LabVIEW project (.lvproj).", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "modify-vipb-display-info": [ + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "vipb_path", + "description": "Path to the VIPB file.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_minor_revision", + "description": "LabVIEW minor revision.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "major", + "description": "Major version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "minor", + "description": "Minor version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "patch", + "description": "Patch version component.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build", + "description": "Build number.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "commit", + "description": "Commit identifier.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "display_information_json", + "description": "JSON string of display information.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "release_notes_file", + "description": "Optional path to release notes file.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "prepare-labview-source": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_project", + "description": "Path to the LabVIEW project file.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build_spec", + "description": "Name of the build specification.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "rename-file": [ + { + "name": "current_filename", + "description": "Existing file name.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "new_filename", + "description": "New file name.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "restore-setup-lv-source": [ + { + "name": "minimum_supported_lv_version", + "description": "Minimum LabVIEW version supported.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "relative_path", + "description": "Relative path containing the project.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "labview_project", + "description": "Path to the LabVIEW project file.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "build_spec", + "description": "Name of the build specification.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "revert-development-mode": [ + { + "name": "relative_path", + "description": "Relative path containing the repository.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "run-pester-tests": [ + { + "name": "working_directory", + "description": "Directory containing the repository under test.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "run-unit-tests": [ + { + "name": "minimum_supported_lv_version", + "description": "LabVIEW version for the test run.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "supported_bitness", + "description": "\"32\" or \"64\" bitness of LabVIEW.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "set-development-mode": [ + { + "name": "relative_path", + "description": "Relative path containing the repository.", + "required": true, + "default": "", + "type": "string" + }, + { + "name": "gcli_path", + "description": "Optional path to the g-cli executable.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "working_directory", + "description": "Working directory where the action will run.", + "required": false, + "default": "", + "type": "string" + }, + { + "name": "log_level", + "description": "Verbosity level (ERROR|WARN|INFO|DEBUG).", + "required": false, + "default": "INFO", + "type": "string" + }, + { + "name": "dry_run", + "description": "If true, simulate the action without side effects.", + "required": false, + "default": false, + "type": "string" + } + ], + "setup-mkdocs": [] + } +} \ No newline at end of file diff --git a/artifacts/linux/action-docs.md b/artifacts/linux/action-docs.md new file mode 100644 index 00000000..729aa768 --- /dev/null +++ b/artifacts/linux/action-docs.md @@ -0,0 +1,482 @@ +### Parameters +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | + +### Dispatcher Functions + +#### Invoke-AddTokenToLabVIEW +Adds an authentication token to a LabVIEW installation. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-AddTokenToLabVIEW -ArgsJson '{}' +``` + +#### Invoke-ApplyVIPC +Applies a VI Package Configuration to a LabVIEW project. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. VIP_LVVersion: LabVIEW version used to build the VIPC. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPCPath: Optional path to the VIPC file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| VIPCPath | string | false | | Optional path to the VIPC file | +| VIP_LVVersion | string | true | | LabVIEW version used to build the VIPC | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-ApplyVIPC -ArgsJson '{}' +``` + +#### Invoke-Build +Builds the project and records version information. RelativePath: Normalized path to the project root relative to the working directory. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. CompanyName: Company name recorded in build metadata. AuthorName: Author name recorded in build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| AuthorName | string | true | | Author name recorded in build metadata | +| Build | number | true | | Build number component | +| Commit | string | true | | Commit identifier used for the build metadata | +| CompanyName | string | true | | Company name recorded in build metadata | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEWMinorRevision | string | true | | Minor revision of LabVIEW used for the build | +| Major | number | true | | Major version component | +| Minor | number | true | | Minor version component | +| Patch | number | true | | Patch version component | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-Build -ArgsJson '{}' +``` + +#### Invoke-BuildLvlibp +Builds a LabVIEW Packed Library using a project and build spec. MinimumSupportedLVVersion: Minimum LabVIEW version that the library supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Build | number | true | | Build number component | +| Build_Spec | string | true | | Name of the build specification within the project | +| Commit | string | true | | Commit identifier used for the build metadata | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEW_Project | string | true | | Path to the LabVIEW project file | +| Major | number | true | | Major version component | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the library supports | +| Minor | number | true | | Minor version component | +| Patch | number | true | | Patch version component | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-BuildLvlibp -ArgsJson '{}' +``` + +#### Invoke-BuildViPackage +Builds a VI Package using the provided VIPB file and version metadata. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). LabVIEWMinorRevision: Minor revision of LabVIEW used to build the package. RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Build | number | true | | Build number component | +| Commit | string | true | | Commit identifier used for the build metadata | +| DisplayInformationJSON | string | true | | JSON string containing display information for the package | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEWMinorRevision | string | true | | Minor revision of LabVIEW used to build the package | +| Major | number | true | | Major version component | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the package supports | +| Minor | number | true | | Minor version component | +| Patch | number | true | | Patch version component | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| ReleaseNotesFile | string | false | | Optional path to a release notes file | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| VIPBPath | string | true | | Path to the VIPB build specification file | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-BuildViPackage -ArgsJson '{}' +``` + +#### Invoke-CloseLabVIEW +Closes any running instance of LabVIEW. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-CloseLabVIEW -ArgsJson '{}' +``` + +#### Invoke-GenerateReleaseNotes +Generates a release notes file from the project's metadata. OutputPath: Path where the release notes should be written. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| OutputPath | string | false | Tooling/deployment/release_notes.md | Path where the release notes should be written | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-GenerateReleaseNotes -ArgsJson '{}' +``` + +#### Invoke-MissingInProject +Lists files referenced in a LabVIEW project that are missing on disk. LVVersion: LabVIEW version of the project. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). ProjectFile: Path to the .lvproj file to analyze. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LVVersion | string | true | | LabVIEW version of the project | +| ProjectFile | string | true | | Path to the | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-MissingInProject -ArgsJson '{}' +``` + +#### Invoke-ModifyVIPBDisplayInfo +Updates display information fields in a VIPB build specification. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Build | number | true | | Build number component | +| Commit | string | true | | Commit identifier used for the build metadata | +| DisplayInformationJSON | string | true | | JSON string containing display information for the package | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEWMinorRevision | string | true | | Minor revision of LabVIEW used for the build | +| Major | number | true | | Major version component | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the package supports | +| Minor | number | true | | Minor version component | +| Patch | number | true | | Patch version component | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| ReleaseNotesFile | string | false | | Optional path to a release notes file | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| VIPBPath | string | true | | Path to the VIPB build specification file | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-ModifyVIPBDisplayInfo -ArgsJson '{}' +``` + +#### Invoke-PrepareLabVIEWSource +Prepares a LabVIEW project for source distribution. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Build_Spec | string | true | | Name of the build specification within the project | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEW_Project | string | true | | Path to the LabVIEW project file | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-PrepareLabVIEWSource -ArgsJson '{}' +``` + +#### Invoke-RenameFile +Renames a file on disk. CurrentFilename: Existing path to the file. NewFilename: New path for the file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| CurrentFilename | string | true | | Existing path to the file | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| NewFilename | string | true | | New path for the file | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-RenameFile -ArgsJson '{}' +``` + +#### Invoke-RestoreSetupLVSource +Restores the Setup LabVIEW source build specification. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Build_Spec | string | true | | Name of the build specification within the project | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| LabVIEW_Project | string | true | | Path to the LabVIEW project file | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-RestoreSetupLVSource -ArgsJson '{}' +``` + +#### Invoke-RevertDevelopmentMode +Returns a repository to its previous development mode state. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-RevertDevelopmentMode -ArgsJson '{}' +``` + +#### Invoke-RunPesterTests +Runs Pester tests located in the specified working directory. WorkingDirectory: Path containing the Pester tests to execute. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| WorkingDirectory | string | true | | Path containing the Pester tests to execute | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-RunPesterTests -ArgsJson '{}' +``` + +#### Invoke-RunUnitTests +Runs LabVIEW unit tests. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| MinimumSupportedLVVersion | string | true | | Minimum LabVIEW version that the project supports | +| SupportedBitness | string | true | | Target LabVIEW bitness (32- or 64-bit) | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-RunUnitTests -ArgsJson '{}' +``` + +#### Invoke-SetDevelopmentMode +Configures the repository for development mode. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| DryRun | boolean | false | | If set, prints the command instead of executing it | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | +| gcliPath | string | false | | Optional path prepended to PATH for locating the g CLI | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Invoke-SetDevelopmentMode -ArgsJson '{}' +``` + +#### Normalize-RelativePath +Normalizes a RelativePath value against an optional base directory. RelativePath: Path to normalize. BaseDirectory: Directory used to resolve the relative path. Defaults to the current location. +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| BaseDirectory | string | false | | Directory used to resolve the relative path | +| RelativePath | string | true | | Path relative to WorkingDirectory that locates the project or repository root. | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Normalize-RelativePath -ArgsJson '{}' +``` + +#### Set-LogLevel +Sets the verbosity for informational and verbose messages. Level: Desired log level (ERROR, WARN, INFO, DEBUG). +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| Level | string | false | | Desired log level (ERROR, WARN, INFO, DEBUG) | + +```powershell +pwsh ./actions/Invoke-OSAction.ps1 -ActionName Set-LogLevel -ArgsJson '{}' +``` + +### Wrapper Actions + +#### add-token-to-labview +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the token target. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### apply-vipc +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| vip_lv_version | string | true | | LabVIEW version associated with the VI Package. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the LabVIEW project. | +| vipc_path | string | false | | Path to the VIPC file. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### build +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| relative_path | string | true | | Relative path containing the LabVIEW project. | +| major | string | true | | Major version component. | +| minor | string | true | | Minor version component. | +| patch | string | true | | Patch version component. | +| build | string | true | | Build number. | +| commit | string | true | | Commit identifier. | +| labview_minor_revision | string | true | | LabVIEW minor revision. | +| company_name | string | true | | Company name for the build. | +| author_name | string | true | | Author name for the build. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### build-lvlibp +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the LabVIEW project. | +| labview_project | string | true | | Path to the LabVIEW project file. | +| build_spec | string | true | | Name of the build specification. | +| major | string | true | | Major version component. | +| minor | string | true | | Minor version component. | +| patch | string | true | | Patch version component. | +| build | string | true | | Build number. | +| commit | string | true | | Commit identifier. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### build-vi-package +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| labview_minor_revision | string | true | | LabVIEW minor revision. | +| relative_path | string | true | | Relative path containing the project. | +| vipb_path | string | true | | Path to the VIPB file. | +| major | string | true | | Major version component. | +| minor | string | true | | Minor version component. | +| patch | string | true | | Patch version component. | +| build | string | true | | Build number. | +| commit | string | true | | Commit identifier. | +| display_information_json | string | true | | JSON string of display information. | +| release_notes_file | string | false | | Optional path to release notes file. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### close-labview +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### generate-release-notes +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| output_path | string | false | Tooling/deployment/release_notes.md | Path to output markdown file. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### missing-in-project +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| lv_version | string | true | | LabVIEW version to use. | +| supported_bitness | string | true | | Target LabVIEW bitness (32 or 64). | +| project_file | string | true | | Path to the LabVIEW project (.lvproj). | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### modify-vipb-display-info +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the project. | +| vipb_path | string | true | | Path to the VIPB file. | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| labview_minor_revision | string | true | | LabVIEW minor revision. | +| major | string | true | | Major version component. | +| minor | string | true | | Minor version component. | +| patch | string | true | | Patch version component. | +| build | string | true | | Build number. | +| commit | string | true | | Commit identifier. | +| display_information_json | string | true | | JSON string of display information. | +| release_notes_file | string | false | | Optional path to release notes file. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### prepare-labview-source +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the project. | +| labview_project | string | true | | Path to the LabVIEW project file. | +| build_spec | string | true | | Name of the build specification. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### rename-file +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| current_filename | string | true | | Existing file name. | +| new_filename | string | true | | New file name. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### restore-setup-lv-source +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | Minimum LabVIEW version supported. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| relative_path | string | true | | Relative path containing the project. | +| labview_project | string | true | | Path to the LabVIEW project file. | +| build_spec | string | true | | Name of the build specification. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### revert-development-mode +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| relative_path | string | true | | Relative path containing the repository. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### run-pester-tests +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| working_directory | string | true | | Directory containing the repository under test. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### run-unit-tests +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| minimum_supported_lv_version | string | true | | LabVIEW version for the test run. | +| supported_bitness | string | true | | "32" or "64" bitness of LabVIEW. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### set-development-mode +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| relative_path | string | true | | Relative path containing the repository. | +| gcli_path | string | false | | Optional path to the g-cli executable. | +| working_directory | string | false | | Working directory where the action will run. | +| log_level | string | false | INFO | Verbosity level (ERROR|WARN|INFO|DEBUG). | +| dry_run | string | false | false | If true, simulate the action without side effects. | + +#### setup-mkdocs +| Name | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | \ No newline at end of file diff --git a/artifacts/linux/requirements-summary.md b/artifacts/linux/requirements-summary.md new file mode 100644 index 00000000..9c1e1af5 --- /dev/null +++ b/artifacts/linux/requirements-summary.md @@ -0,0 +1,70 @@ +### Requirement Summary +| Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | +| --- | --- | --- | --- | --- | --- | --- | --- | +| REQ-023 | Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-024 | Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-025 | Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-026 | Suite properties are extracted as name/value pairs for environment details. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-027 | Testcase attributes name, status, classname, assertions, time, and any skip message are preserved. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-028 | Requirement identifiers embedded in testcase names are detected and associated with the test. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-029 | Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-030 | Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | | 1 | 1 | 0 | 0 | 100.00 | +| Unmapped | | | 40 | 40 | 0 | 0 | 100.00 | + +### Requirement Testcases +| Requirement ID | Test ID | Status | +| --- | --- | --- | +| REQ-023 | parses-nested-junit-structures | Passed | +| REQ-024 | captures-root-testsuites-attributes | Passed | +| REQ-025 | captures-testsuite-attributes | Passed | +| REQ-026 | captures-suite-properties | Passed | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | +| REQ-028 | extracts-requirement-identifiers | Passed | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | +| REQ-031 | validates-missing-fields | Passed | +| REQ-032 | preserves-unknown-attributes | Passed | +| REQ-033 | throws-error-for-malformed-xml | Passed | +| Unmapped | associates-classname-with-requirement | Passed | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | +| Unmapped | buildsummary-splits-totals-by-os | Passed | +| Unmapped | collecttestcases-captures-requirement-property | Passed | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | +| Unmapped | fails-when-no-junit-files-are-found | Passed | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | +| Unmapped | formaterror-handles-plain-objects | Passed | +| Unmapped | formaterror-handles-primitives | Passed | +| Unmapped | formaterror-handles-real-error-objects | Passed | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | +| Unmapped | generate-ci-summary-features | Passed | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | +| Unmapped | handles-root-level-testcases | Passed | +| Unmapped | handles-zipped-junit-artifacts | Passed | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | \ No newline at end of file diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md new file mode 100644 index 00000000..b7f625ee --- /dev/null +++ b/artifacts/linux/summary-standard.md @@ -0,0 +1,7 @@ +### Test Summary +| OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | +| --- | --- | --- | --- | --- | --- | +| overall | 51 | 0 | 0 | 16.25 | 100.00 | +| linux | 51 | 0 | 0 | 16.25 | 100.00 | + +_For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md new file mode 100644 index 00000000..7647d1fc --- /dev/null +++ b/artifacts/linux/summary.md @@ -0,0 +1,23 @@ +### Test Summary +| OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | +| --- | --- | --- | --- | --- | --- | +| overall | 51 | 0 | 0 | 16.25 | 100.00 | +| linux | 51 | 0 | 0 | 16.25 | 100.00 | + +### Requirement Summary +| Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | +| --- | --- | --- | --- | --- | --- | --- | --- | +| REQ-023 | Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-024 | Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-025 | Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-026 | Suite properties are extracted as name/value pairs for environment details. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-027 | Testcase attributes name, status, classname, assertions, time, and any skip message are preserved. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-028 | Requirement identifiers embedded in testcase names are detected and associated with the test. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-029 | Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-030 | Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | 1 | 1 | 0 | 0 | 100.00 | +| REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | | 1 | 1 | 0 | 0 | 100.00 | +| Unmapped | | | 40 | 40 | 0 | 0 | 100.00 | + +_For detailed per-test information, see [traceability.md](traceability.md)._ \ No newline at end of file diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md new file mode 100644 index 00000000..11824fc1 --- /dev/null +++ b/artifacts/linux/traceability-standard.md @@ -0,0 +1,114 @@ +### Test Traceability Matrix + +#### REQ-023 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-023 | parses-nested-junit-structures | Passed | 0.013 | | | + +#### REQ-024 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | + +#### REQ-025 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-025 | captures-testsuite-attributes | Passed | 0.007 | | | + +#### REQ-026 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-026 | captures-suite-properties | Passed | 0.006 | | | + +#### REQ-027 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | + +#### REQ-028 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.007 | | | + +#### REQ-029 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | + +#### REQ-030 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | + +#### REQ-031 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | + +#### REQ-032 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | + +#### REQ-033 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.005 | | | + +
Unmapped (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| Unmapped | associates-classname-with-requirement | Passed | 0.029 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.005 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.026 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.016 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.976 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.246 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.056 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.365 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.023 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.388 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.914 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.902 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.027 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.910 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.332 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.433 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.839 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.986 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.130 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.562 | | | + +
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json new file mode 100644 index 00000000..e8e99902 --- /dev/null +++ b/artifacts/linux/traceability.json @@ -0,0 +1,574 @@ +{ + "requirements": [ + { + "id": "REQ-023", + "description": "Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases.", + "tests": [ + { + "id": "parses-nested-junit-structures", + "name": "[REQ-023] parses nested JUnit structures", + "className": "test", + "status": "Passed", + "duration": 0.013259, + "requirements": [ + "REQ-023" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-024", + "description": "Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting.", + "tests": [ + { + "id": "captures-root-testsuites-attributes", + "name": "[REQ-024] captures root testsuites attributes", + "className": "test", + "status": "Passed", + "duration": 0.002237, + "requirements": [ + "REQ-024" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-025", + "description": "Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time.", + "tests": [ + { + "id": "captures-testsuite-attributes", + "name": "[REQ-025] captures testsuite attributes", + "className": "test", + "status": "Passed", + "duration": 0.00655, + "requirements": [ + "REQ-025" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-026", + "description": "Suite properties are extracted as name/value pairs for environment details.", + "tests": [ + { + "id": "captures-suite-properties", + "name": "[REQ-026] captures suite properties", + "className": "test", + "status": "Passed", + "duration": 0.005587, + "requirements": [ + "REQ-026" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-027", + "description": "Testcase attributes name, status, classname, assertions, time, and any skip message are preserved.", + "tests": [ + { + "id": "captures-testcase-attributes-and-skipped-message", + "name": "[REQ-027] captures testcase attributes and skipped message", + "className": "test", + "status": "Passed", + "duration": 0.00159, + "requirements": [ + "REQ-027" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-028", + "description": "Requirement identifiers embedded in testcase names are detected and associated with the test.", + "tests": [ + { + "id": "extracts-requirement-identifiers", + "name": "[REQ-028] extracts requirement identifiers", + "className": "test", + "status": "Passed", + "duration": 0.007333, + "requirements": [ + "REQ-028" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-029", + "description": "Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases.", + "tests": [ + { + "id": "aggregates-status-by-requirement-and-suite", + "name": "[REQ-029] aggregates status by requirement and suite", + "className": "test", + "status": "Passed", + "duration": 0.001345, + "requirements": [ + "REQ-029" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-030", + "description": "Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons.", + "tests": [ + { + "id": "builds-traceability-matrix-with-skipped-reasons", + "name": "[REQ-030] builds traceability matrix with skipped reasons", + "className": "test", + "status": "Passed", + "duration": 0.004344, + "requirements": [ + "REQ-030" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-031", + "description": "Parsing logic validates presence of required fields and reports missing or malformed data.", + "tests": [ + { + "id": "validates-missing-fields", + "name": "[REQ-031] validates missing fields", + "className": "test", + "status": "Passed", + "duration": 0.001301, + "requirements": [ + "REQ-031" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-032", + "description": "Parser tolerates and retains unknown attributes for future extensibility.", + "tests": [ + { + "id": "preserves-unknown-attributes", + "name": "[REQ-032] preserves unknown attributes", + "className": "test", + "status": "Passed", + "duration": 0.001025, + "requirements": [ + "REQ-032" + ], + "os": "linux" + } + ] + }, + { + "id": "REQ-033", + "description": "Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv.", + "tests": [ + { + "id": "throws-error-for-malformed-xml", + "name": "[REQ-033] throws error for malformed XML", + "className": "test", + "status": "Passed", + "duration": 0.005405, + "requirements": [ + "REQ-033" + ], + "os": "linux" + } + ] + }, + { + "id": "Unmapped", + "tests": [ + { + "id": "associates-classname-with-requirement", + "name": "associates classname with requirement", + "className": "test", + "status": "Passed", + "duration": 0.028819, + "requirements": [], + "os": "linux" + }, + { + "id": "buildissuebranchname-formats-branch-name", + "name": "buildIssueBranchName formats branch name", + "className": "test", + "status": "Passed", + "duration": 0.002983, + "requirements": [], + "os": "linux" + }, + { + "id": "buildissuebranchname-rejects-non-numeric-input", + "name": "buildIssueBranchName rejects non-numeric input", + "className": "test", + "status": "Passed", + "duration": 0.001545, + "requirements": [], + "os": "linux" + }, + { + "id": "buildsummary-splits-totals-by-os", + "name": "buildSummary splits totals by OS", + "className": "test", + "status": "Passed", + "duration": 0.001259, + "requirements": [], + "os": "linux" + }, + { + "id": "collecttestcases-captures-requirement-property", + "name": "collectTestCases captures requirement property", + "className": "test", + "status": "Passed", + "duration": 0.005227, + "requirements": [], + "os": "linux" + }, + { + "id": "collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan", + "name": "collectTestCases uses evidence property and falls back to directory scan", + "className": "test", + "status": "Passed", + "duration": 0.026207, + "requirements": [], + "os": "linux" + }, + { + "id": "collecttestcases-uses-machine-name-property-for-owner", + "name": "collectTestCases uses machine-name property for owner", + "className": "test", + "status": "Passed", + "duration": 0.015746, + "requirements": [], + "os": "linux" + }, + { + "id": "computestatuscounts-tallies-test-statuses", + "name": "computeStatusCounts tallies test statuses", + "className": "test", + "status": "Passed", + "duration": 0.000522, + "requirements": [], + "os": "linux" + }, + { + "id": "dispatchers-and-parameters-include-descriptions", + "name": "Dispatchers and parameters include descriptions", + "className": "test", + "status": "Passed", + "duration": 0.002964, + "requirements": [], + "os": "linux" + }, + { + "id": "errors-when-strict-unmapped-mode-enabled", + "name": "errors when strict unmapped mode enabled", + "className": "test", + "status": "Passed", + "duration": 0.976478, + "requirements": [], + "os": "linux" + }, + { + "id": "escapemarkdown-escapes-special-characters", + "name": "escapeMarkdown escapes special characters", + "className": "test", + "status": "Passed", + "duration": 0.001349, + "requirements": [], + "os": "linux" + }, + { + "id": "escapemarkdown-leaves-plain-text-untouched", + "name": "escapeMarkdown leaves plain text untouched", + "className": "test", + "status": "Passed", + "duration": 0.000193, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-commit-lacks-requirement-reference", + "name": "fails when commit lacks requirement reference", + "className": "test", + "status": "Passed", + "duration": 1.24615, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-no-junit-files-are-found", + "name": "fails when no JUnit files are found", + "className": "test", + "status": "Passed", + "duration": 1.05571, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-requirement-lacks-test-coverage", + "name": "fails when requirement lacks test coverage", + "className": "test", + "status": "Passed", + "duration": 1.365107, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-plain-objects", + "name": "formatError handles plain objects", + "className": "test", + "status": "Passed", + "duration": 0.000707, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-primitives", + "name": "formatError handles primitives", + "className": "test", + "status": "Passed", + "duration": 0.000477, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-real-error-objects", + "name": "formatError handles real Error objects", + "className": "test", + "status": "Passed", + "duration": 0.003329, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-unstringifiable-values", + "name": "formatError handles unstringifiable values", + "className": "test", + "status": "Passed", + "duration": 0.000846, + "requirements": [], + "os": "linux" + }, + { + "id": "generate-ci-summary-features", + "name": "generate-ci-summary features", + "className": "test", + "status": "Passed", + "duration": 0.022945, + "requirements": [], + "os": "linux" + }, + { + "id": "groups-owners-and-includes-requirements-and-evidence", + "name": "groups owners and includes requirements and evidence", + "className": "test", + "status": "Passed", + "duration": 1.387939, + "requirements": [], + "os": "linux" + }, + { + "id": "grouptomarkdown-omits-numeric-identifiers", + "name": "groupToMarkdown omits numeric identifiers", + "className": "test", + "status": "Passed", + "duration": 0.002391, + "requirements": [], + "os": "linux" + }, + { + "id": "grouptomarkdown-supports-optional-limit-for-truncation", + "name": "groupToMarkdown supports optional limit for truncation", + "className": "test", + "status": "Passed", + "duration": 0.000969, + "requirements": [], + "os": "linux" + }, + { + "id": "handles-root-level-testcases", + "name": "handles root-level testcases", + "className": "test", + "status": "Passed", + "duration": 0.000489, + "requirements": [], + "os": "linux" + }, + { + "id": "handles-zipped-junit-artifacts", + "name": "handles zipped JUnit artifacts", + "className": "test", + "status": "Passed", + "duration": 0.913593, + "requirements": [], + "os": "linux" + }, + { + "id": "ignores-stale-junit-files-outside-artifacts-path", + "name": "ignores stale JUnit files outside artifacts path", + "className": "test", + "status": "Passed", + "duration": 0.9023, + "requirements": [], + "os": "linux" + }, + { + "id": "loadrequirements-logs-warning-on-invalid-json", + "name": "loadRequirements logs warning on invalid JSON", + "className": "test", + "status": "Passed", + "duration": 0.026948, + "requirements": [], + "os": "linux" + }, + { + "id": "loadrequirements-warns-and-skips-invalid-entries", + "name": "loadRequirements warns and skips invalid entries", + "className": "test", + "status": "Passed", + "duration": 0.006879, + "requirements": [], + "os": "linux" + }, + { + "id": "partitions-requirement-groups-by-runner_type", + "name": "partitions requirement groups by runner_type", + "className": "test", + "status": "Passed", + "duration": 0.910109, + "requirements": [], + "os": "linux" + }, + { + "id": "passes-with-coverage-and-requirement-reference", + "name": "passes with coverage and requirement reference", + "className": "test", + "status": "Passed", + "duration": 1.332491, + "requirements": [], + "os": "linux" + }, + { + "id": "requirementssummarytomarkdown-escapes-pipes-in-description", + "name": "requirementsSummaryToMarkdown escapes pipes in description", + "className": "test", + "status": "Passed", + "duration": 0.000614, + "requirements": [], + "os": "linux" + }, + { + "id": "skips-invalid-junit-files-and-still-generates-summary", + "name": "skips invalid JUnit files and still generates summary", + "className": "test", + "status": "Passed", + "duration": 1.432661, + "requirements": [], + "os": "linux" + }, + { + "id": "summarytomarkdown-handles-no-tests", + "name": "summaryToMarkdown handles no tests", + "className": "test", + "status": "Passed", + "duration": 0.000401, + "requirements": [], + "os": "linux" + }, + { + "id": "summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters", + "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", + "className": "test", + "status": "Passed", + "duration": 0.000946, + "requirements": [], + "os": "linux" + }, + { + "id": "throws-when-no-junit-files-found-and-strict-mode-enabled", + "name": "throws when no JUnit files found and strict mode enabled", + "className": "test", + "status": "Passed", + "duration": 0.839314, + "requirements": [], + "os": "linux" + }, + { + "id": "uses-latest-artifact-directory-when-multiple-are-present", + "name": "uses latest artifact directory when multiple are present", + "className": "test", + "status": "Passed", + "duration": 0.986089, + "requirements": [], + "os": "linux" + }, + { + "id": "warns-when-all-tests-are-unmapped", + "name": "warns when all tests are unmapped", + "className": "test", + "status": "Passed", + "duration": 1.129753, + "requirements": [], + "os": "linux" + }, + { + "id": "writeerrorsummary-appends-error-details-to-summary-file", + "name": "writeErrorSummary appends error details to summary file", + "className": "test", + "status": "Passed", + "duration": 0.005928, + "requirements": [], + "os": "linux" + }, + { + "id": "writeerrorsummary-skips-summary-file-for-non-error-throws", + "name": "writeErrorSummary skips summary file for non-Error throws", + "className": "test", + "status": "Passed", + "duration": 0.003117, + "requirements": [], + "os": "linux" + }, + { + "id": "writes-outputs-to-os-specific-directory", + "name": "writes outputs to OS-specific directory", + "className": "test", + "status": "Passed", + "duration": 1.56202, + "requirements": [], + "os": "linux" + } + ] + } + ], + "totals": { + "overall": { + "passed": 51, + "failed": 0, + "skipped": 0, + "duration": 16.253490000000003, + "rate": 100 + }, + "byOs": { + "linux": { + "passed": 51, + "failed": 0, + "skipped": 0, + "duration": 16.253490000000003, + "rate": 100 + } + } + } +} \ No newline at end of file diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md new file mode 100644 index 00000000..11824fc1 --- /dev/null +++ b/artifacts/linux/traceability.md @@ -0,0 +1,114 @@ +### Test Traceability Matrix + +#### REQ-023 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-023 | parses-nested-junit-structures | Passed | 0.013 | | | + +#### REQ-024 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | + +#### REQ-025 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-025 | captures-testsuite-attributes | Passed | 0.007 | | | + +#### REQ-026 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-026 | captures-suite-properties | Passed | 0.006 | | | + +#### REQ-027 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | + +#### REQ-028 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.007 | | | + +#### REQ-029 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | + +#### REQ-030 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | + +#### REQ-031 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | + +#### REQ-032 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | + +#### REQ-033 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.005 | | | + +
Unmapped (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| Unmapped | associates-classname-with-requirement | Passed | 0.029 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.005 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.026 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.016 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.976 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.246 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.056 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.365 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.023 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.388 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.914 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.902 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.027 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.910 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.332 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.433 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.839 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.986 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.130 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.562 | | | + +
\ No newline at end of file diff --git a/dispatchers.json b/dispatchers.json index a15c1ffb..1dbf753c 100644 --- a/dispatchers.json +++ b/dispatchers.json @@ -1,6 +1,6 @@ { "Invoke-AddTokenToLabVIEW": { - "description": "Adds an authentication token to a LabVIEW installation. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Adds an authentication token to a LabVIEW installation. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "DryRun": { "type": "boolean", @@ -30,7 +30,7 @@ } }, "Invoke-ApplyVIPC": { - "description": "Applies a VI Package Configuration to a LabVIEW project. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. VIP_LVVersion: LabVIEW version used to build the VIPC. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. VIPCPath: Optional path to the VIPC file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Applies a VI Package Configuration to a LabVIEW project. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. VIP_LVVersion: LabVIEW version used to build the VIPC. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPCPath: Optional path to the VIPC file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "DryRun": { "type": "boolean", @@ -70,7 +70,7 @@ } }, "Invoke-Build": { - "description": "Builds the project and records version information. RelativePath: Path to the project root relative to the working directory. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. CompanyName: Company name recorded in build metadata. AuthorName: Author name recorded in build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Builds the project and records version information. RelativePath: Normalized path to the project root relative to the working directory. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. CompanyName: Company name recorded in build metadata. AuthorName: Author name recorded in build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "AuthorName": { "type": "string", @@ -130,7 +130,7 @@ } }, "Invoke-BuildLvlibp": { - "description": "Builds a LabVIEW Packed Library using a project and build spec. MinimumSupportedLVVersion: Minimum LabVIEW version that the library supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Builds a LabVIEW Packed Library using a project and build spec. MinimumSupportedLVVersion: Minimum LabVIEW version that the library supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "Build": { "type": "number", @@ -195,7 +195,7 @@ } }, "Invoke-BuildViPackage": { - "description": "Builds a VI Package using the provided VIPB file and version metadata. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). LabVIEWMinorRevision: Minor revision of LabVIEW used to build the package. RelativePath: Path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Builds a VI Package using the provided VIPB file and version metadata. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). LabVIEWMinorRevision: Minor revision of LabVIEW used to build the package. RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "Build": { "type": "number", @@ -346,7 +346,7 @@ } }, "Invoke-ModifyVIPBDisplayInfo": { - "description": "Updates display information fields in a VIPB build specification. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Updates display information fields in a VIPB build specification. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. VIPBPath: Path to the VIPB build specification file. MinimumSupportedLVVersion: Minimum LabVIEW version that the package supports. LabVIEWMinorRevision: Minor revision of LabVIEW used for the build. Major: Major version component. Minor: Minor version component. Patch: Patch version component. Build: Build number component. Commit: Commit identifier used for the build metadata. DisplayInformationJSON: JSON string containing display information for the package. ReleaseNotesFile: Optional path to a release notes file. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "Build": { "type": "number", @@ -421,7 +421,7 @@ } }, "Invoke-PrepareLabVIEWSource": { - "description": "Prepares a LabVIEW project for source distribution. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Prepares a LabVIEW project for source distribution. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "Build_Spec": { "type": "string", @@ -486,7 +486,7 @@ } }, "Invoke-RestoreSetupLVSource": { - "description": "Restores the Setup LabVIEW source build specification. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Restores the Setup LabVIEW source build specification. MinimumSupportedLVVersion: Minimum LabVIEW version that the project supports. SupportedBitness: Target LabVIEW bitness (32- or 64-bit). RelativePath: Normalized path to the project root relative to the working directory. LabVIEW_Project: Path to the LabVIEW project file. Build_Spec: Name of the build specification within the project. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "Build_Spec": { "type": "string", @@ -526,7 +526,7 @@ } }, "Invoke-RevertDevelopmentMode": { - "description": "Returns a repository to its previous development mode state. RelativePath: Path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Returns a repository to its previous development mode state. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "DryRun": { "type": "boolean", @@ -591,7 +591,7 @@ } }, "Invoke-SetDevelopmentMode": { - "description": "Configures the repository for development mode. RelativePath: Path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", + "description": "Configures the repository for development mode. RelativePath: Normalized path to the project root relative to the working directory. DryRun: If set, prints the command instead of executing it. gcliPath: Optional path prepended to PATH for locating the g CLI.", "parameters": { "DryRun": { "type": "boolean", @@ -610,6 +610,21 @@ } } }, + "Normalize-RelativePath": { + "description": "Normalizes a RelativePath value against an optional base directory. RelativePath: Path to normalize. BaseDirectory: Directory used to resolve the relative path. Defaults to the current location.", + "parameters": { + "BaseDirectory": { + "type": "string", + "required": false, + "description": "Directory used to resolve the relative path" + }, + "RelativePath": { + "type": "string", + "required": true, + "description": "Path relative to WorkingDirectory that locates the project or repository root." + } + } + }, "Set-LogLevel": { "description": "Sets the verbosity for informational and verbose messages. Level: Desired log level (ERROR, WARN, INFO, DEBUG).", "parameters": { diff --git a/docs/contributing-docs.md b/docs/contributing-docs.md index dd278ad4..42b4d4ca 100644 --- a/docs/contributing-docs.md +++ b/docs/contributing-docs.md @@ -55,12 +55,16 @@ MkDocs serves the site at by default. The server automa ## JUnit integration -The CI pipeline collects JUnit XML output from both Node and PowerShell tests. `scripts/generate-ci-summary.ts` parses these files to build the requirement traceability report. Use `npm run test:ci` to produce the Node JUnit report when verifying documentation updates. By default, the summary script only searches `artifacts/` for JUnit XML files; if your results are elsewhere, pass a glob via `TEST_RESULTS_GLOBS`, for example: +The CI pipeline collects JUnit XML output from both Node and PowerShell tests. `scripts/generate-ci-summary.ts` parses these files to build the requirement traceability report. Use `npm run test:ci` to produce the Node JUnit report when verifying documentation updates; the results appear under `test-results/`. Then run: ```bash +npm run derive:registry TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary +npm run check:traceability ``` +Commit `test-results/*` and `artifacts/linux/*` along with your source changes. By default, the summary script only searches `artifacts/` for JUnit XML files; if your results are elsewhere, pass a glob via `TEST_RESULTS_GLOBS`. + ### Pester properties Pester tests should record traceability metadata by adding `Add-TestResult -Property` calls in each `It` block. At minimum, include an `Owner` and an `Evidence` path: diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml new file mode 100644 index 00000000..3013602a --- /dev/null +++ b/test-results/node-junit.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 19fd9dffab45731dc63b84b19ef22f726aaff91f Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 18:49:02 -0700 Subject: [PATCH 43/73] docs: require committing JUnit outputs (#91) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 78 ++++++++--------- artifacts/linux/traceability.json | 106 +++++++++++------------ artifacts/linux/traceability.md | 78 ++++++++--------- docs/contributing-docs.md | 4 +- test-results/node-junit.xml | 104 +++++++++++----------- 7 files changed, 189 insertions(+), 189 deletions(-) diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index b7f625ee..e840fd7a 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 51 | 0 | 0 | 16.25 | 100.00 | -| linux | 51 | 0 | 0 | 16.25 | 100.00 | +| overall | 51 | 0 | 0 | 15.52 | 100.00 | +| linux | 51 | 0 | 0 | 15.52 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 7647d1fc..1da13782 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 51 | 0 | 0 | 16.25 | 100.00 | -| linux | 51 | 0 | 0 | 16.25 | 100.00 | +| overall | 51 | 0 | 0 | 15.52 | 100.00 | +| linux | 51 | 0 | 0 | 15.52 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 11824fc1..179b1696 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -10,31 +10,31 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.007 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.006 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.007 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) @@ -64,51 +64,51 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.005 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.029 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.005 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.026 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.016 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.013 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.009 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | | Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.976 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.962 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.246 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.056 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.365 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.059 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.997 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.314 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.023 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.388 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.030 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.283 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.003 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.914 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.902 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.027 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.910 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.332 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.433 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.902 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.889 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.939 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.198 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.387 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.839 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.986 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.130 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.562 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.836 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.960 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.104 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.545 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index e8e99902..d4dcabfc 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.013259, + "duration": 0.012601, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.002237, + "duration": 0.003015, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.00655, + "duration": 0.004565, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.005587, + "duration": 0.001266, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.00159, + "duration": 0.001288, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.007333, + "duration": 0.002318, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001345, + "duration": 0.001407, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.004344, + "duration": 0.001758, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.001301, + "duration": 0.000784, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.001025, + "duration": 0.00056, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.005405, + "duration": 0.001195, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.028819, + "duration": 0.010942, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.002983, + "duration": 0.001871, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001545, + "duration": 0.001186, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.001259, + "duration": 0.000425, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.005227, + "duration": 0.013375, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.026207, + "duration": 0.008694, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.015746, + "duration": 0.006808, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000522, + "duration": 0.000297, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.002964, + "duration": 0.003493, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.976478, + "duration": 0.962279, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001349, + "duration": 0.002, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000193, + "duration": 0.000212, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.24615, + "duration": 1.058788, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 1.05571, + "duration": 0.996731, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.365107, + "duration": 1.313549, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000707, + "duration": 0.0005, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000477, + "duration": 0.00033, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.003329, + "duration": 0.003452, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000846, + "duration": 0.000669, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.022945, + "duration": 0.030138, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.387939, + "duration": 1.283306, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.002391, + "duration": 0.00327, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000969, + "duration": 0.000561, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000489, + "duration": 0.000566, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.913593, + "duration": 0.902185, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.9023, + "duration": 0.889391, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.026948, + "duration": 0.011607, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.006879, + "duration": 0.004316, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.910109, + "duration": 0.939413, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.332491, + "duration": 1.198012, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000614, + "duration": 0.0004, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.432661, + "duration": 1.3874, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000401, + "duration": 0.000241, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000946, + "duration": 0.000496, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.839314, + "duration": 0.835939, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.986089, + "duration": 0.960009, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.129753, + "duration": 1.10399, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.005928, + "duration": 0.004587, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.003117, + "duration": 0.004117, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.56202, + "duration": 1.545291, "requirements": [], "os": "linux" } @@ -558,7 +558,7 @@ "passed": 51, "failed": 0, "skipped": 0, - "duration": 16.253490000000003, + "duration": 15.521593000000005, "rate": 100 }, "byOs": { @@ -566,7 +566,7 @@ "passed": 51, "failed": 0, "skipped": 0, - "duration": 16.253490000000003, + "duration": 15.521593000000005, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 11824fc1..179b1696 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -10,31 +10,31 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.007 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.006 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.007 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) @@ -64,51 +64,51 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.005 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.029 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.005 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.026 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.016 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.013 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.009 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | | Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.976 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.962 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.246 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.056 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.365 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.059 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.997 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.314 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.023 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.388 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.030 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.283 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.003 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.914 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.902 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.027 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.910 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.332 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.433 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.902 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.889 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.939 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.198 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.387 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.839 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.986 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.130 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.562 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.836 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.960 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.104 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.545 | | |
\ No newline at end of file diff --git a/docs/contributing-docs.md b/docs/contributing-docs.md index 42b4d4ca..d1e37d2e 100644 --- a/docs/contributing-docs.md +++ b/docs/contributing-docs.md @@ -55,7 +55,7 @@ MkDocs serves the site at by default. The server automa ## JUnit integration -The CI pipeline collects JUnit XML output from both Node and PowerShell tests. `scripts/generate-ci-summary.ts` parses these files to build the requirement traceability report. Use `npm run test:ci` to produce the Node JUnit report when verifying documentation updates; the results appear under `test-results/`. Then run: +The CI pipeline collects JUnit XML output from both Node and PowerShell tests. `scripts/generate-ci-summary.ts` parses these files to build the requirement traceability report. Use `npm run test:ci` to produce the Node JUnit report when verifying documentation updates; the results appear under `test-results/` and must be committed with your pull request. Then run: ```bash npm run derive:registry @@ -63,7 +63,7 @@ TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary npm run check:traceability ``` -Commit `test-results/*` and `artifacts/linux/*` along with your source changes. By default, the summary script only searches `artifacts/` for JUnit XML files; if your results are elsewhere, pass a glob via `TEST_RESULTS_GLOBS`. +Commit `test-results/*` and `artifacts/linux/*` along with your source changes. The `validate-artifacts` job in CI verifies these files but does not generate them. By default, the summary script only searches `artifacts/` for JUnit XML files; if your results are elsewhere, pass a glob via `TEST_RESULTS_GLOBS`. ### Pester properties diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 3013602a..74ec4d3c 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,56 +1,56 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,5 +58,5 @@ - + From 65c6d8c67d96e095dc4ed33af5775a81c22c4860 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 19:06:59 -0700 Subject: [PATCH 44/73] chore: add gitignore for dependencies (#93) --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..76c004bb --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Dependency directories +node_modules/ + +# Build outputs +dist/ +coverage/ From 31167884960ac04ea6ce9b346af99ab718af9870 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 19:17:41 -0700 Subject: [PATCH 45/73] chore: configure npm proxy (#94) --- .npmrc | 2 + test-results/node-junit.xml | 104 ++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 52 deletions(-) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..0b9a7e0d --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +proxy=http://proxy:8080 +https-proxy=http://proxy:8080 diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 74ec4d3c..396d9ecc 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,56 +1,56 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,5 +58,5 @@ - + From bf873008667b3b92f5df3943a34e2b8648a7b1d2 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 19:29:12 -0700 Subject: [PATCH 46/73] Support Node 20 runtime (#95) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 72 +++++++-------- artifacts/linux/traceability.json | 106 +++++++++++------------ artifacts/linux/traceability.md | 72 +++++++-------- package-lock.json | 2 +- package.json | 2 +- 7 files changed, 131 insertions(+), 131 deletions(-) diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index e840fd7a..3e6b6318 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 51 | 0 | 0 | 15.52 | 100.00 | -| linux | 51 | 0 | 0 | 15.52 | 100.00 | +| overall | 51 | 0 | 0 | 11.52 | 100.00 | +| linux | 51 | 0 | 0 | 11.52 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 1da13782..0b4c6a80 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 51 | 0 | 0 | 15.52 | 100.00 | -| linux | 51 | 0 | 0 | 15.52 | 100.00 | +| overall | 51 | 0 | 0 | 11.52 | 100.00 | +| linux | 51 | 0 | 0 | 11.52 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 179b1696..170a6f37 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.013 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.008 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.002 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.004 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) @@ -58,57 +58,57 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.028 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | | Unmapped | collecttestcases-captures-requirement-property | Passed | 0.013 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.009 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.962 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.681 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.059 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.997 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.314 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.944 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.770 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.052 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.030 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.283 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.020 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.934 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.003 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.902 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.889 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.939 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.198 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.649 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.621 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.011 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.003 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.707 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.821 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.387 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.947 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.836 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.960 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.104 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.545 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.593 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.709 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.846 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.095 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index d4dcabfc..1f8bb504 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.012601, + "duration": 0.007578, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.003015, + "duration": 0.005149, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.004565, + "duration": 0.007573, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001266, + "duration": 0.002404, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.001288, + "duration": 0.003658, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.002318, + "duration": 0.003573, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001407, + "duration": 0.001203, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001758, + "duration": 0.00108, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.000784, + "duration": 0.000584, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.00056, + "duration": 0.000499, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001195, + "duration": 0.001559, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.010942, + "duration": 0.028454, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.001871, + "duration": 0.001007, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001186, + "duration": 0.000739, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000425, + "duration": 0.000378, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.013375, + "duration": 0.013096, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.008694, + "duration": 0.007947, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.006808, + "duration": 0.006991, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000297, + "duration": 0.000272, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.003493, + "duration": 0.004168, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.962279, + "duration": 0.680912, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.002, + "duration": 0.001334, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000212, + "duration": 0.000242, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.058788, + "duration": 0.944408, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.996731, + "duration": 0.770248, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.313549, + "duration": 1.051612, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.0005, + "duration": 0.000277, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.00033, + "duration": 0.000215, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.003452, + "duration": 0.00373, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000669, + "duration": 0.000442, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.030138, + "duration": 0.019607, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.283306, + "duration": 0.933771, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.00327, + "duration": 0.002809, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000561, + "duration": 0.000563, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000566, + "duration": 0.000822, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.902185, + "duration": 0.649232, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.889391, + "duration": 0.620574, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.011607, + "duration": 0.011485, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.004316, + "duration": 0.003021, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.939413, + "duration": 0.706712, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.198012, + "duration": 0.820786, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.0004, + "duration": 0.00035, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.3874, + "duration": 0.94739, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000241, + "duration": 0.000243, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000496, + "duration": 0.000391, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.835939, + "duration": 0.592587, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.960009, + "duration": 0.709266, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.10399, + "duration": 0.846379, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.004587, + "duration": 0.009249, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.004117, + "duration": 0.002852, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.545291, + "duration": 1.09501, "requirements": [], "os": "linux" } @@ -558,7 +558,7 @@ "passed": 51, "failed": 0, "skipped": 0, - "duration": 15.521593000000005, + "duration": 11.524431000000002, "rate": 100 }, "byOs": { @@ -566,7 +566,7 @@ "passed": 51, "failed": 0, "skipped": 0, - "duration": 15.521593000000005, + "duration": 11.524431000000002, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 179b1696..170a6f37 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.013 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.008 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.002 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.004 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) @@ -58,57 +58,57 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.028 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | | Unmapped | collecttestcases-captures-requirement-property | Passed | 0.013 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.009 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.962 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.681 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.059 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.997 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.314 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.944 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.770 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.052 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.030 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.283 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.020 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.934 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.003 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.902 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.889 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.939 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.198 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.649 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.621 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.011 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.003 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.707 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.821 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.387 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.947 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.836 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.960 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.104 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.545 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.593 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.709 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.846 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.095 | | |
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e91da55e..0fc00f36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">=24" + "node": ">=20" } }, "node_modules/@esbuild/aix-ppc64": { diff --git a/package.json b/package.json index 09e8bb37..242d69da 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "type": "module", "license": "MIT", "engines": { - "node": ">=24" + "node": ">=20" }, "scripts": { "check:node": "node scripts/check-node-version.js", From b67bb26365dd94bdaca08c7e60920eb60eafbccf Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 21:10:16 -0700 Subject: [PATCH 47/73] Embed version info in artifact names (#96) --- .../workflows/build-lvlibp-self-hosted.json | 2 +- .../workflows/build-lvlibp-self-hosted.yml | 2 +- .../build-vi-package-self-hosted.json | 2 +- .../build-vi-package-self-hosted.yml | 2 +- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 72 ++++++------ artifacts/linux/traceability.json | 106 +++++++++--------- artifacts/linux/traceability.md | 72 ++++++------ docs/action-call-reference.md | 2 +- docs/actions/rename-file.md | 4 +- docs/requirements.md | 4 +- requirements.json | 4 +- scripts/build-lvlibp/Build_lvlibp.ps1 | 11 ++ scripts/build-vi-package/build_vip.ps1 | 17 +++ scripts/build/Build.ps1 | 24 +++- .../ModifyVIPBDisplayInfo.ps1 | 7 ++ scripts/rename-file/README.md | 4 +- scripts/rename-file/Rename-file.ps1 | 2 +- test-results/node-junit.xml | 104 ++++++++--------- tests/pester/BuildLvlibp.Workflow.Tests.ps1 | 2 +- .../pester/BuildViPackage.Workflow.Tests.ps1 | 2 +- 22 files changed, 250 insertions(+), 203 deletions(-) diff --git a/.github/workflows/build-lvlibp-self-hosted.json b/.github/workflows/build-lvlibp-self-hosted.json index 2ed0b7d2..38ea8bc1 100644 --- a/.github/workflows/build-lvlibp-self-hosted.json +++ b/.github/workflows/build-lvlibp-self-hosted.json @@ -31,7 +31,7 @@ "uses": "actions/upload-artifact@v4", "with": { "name": "build-lvlibp-artifact", - "path": "scripts/build-lvlibp/lv_icon.lvlibp" + "path": "scripts/build-lvlibp/lv_icon_x64_v1.0.0.1+gabcdef.lvlibp" } } ] diff --git a/.github/workflows/build-lvlibp-self-hosted.yml b/.github/workflows/build-lvlibp-self-hosted.yml index fb94de81..34c11551 100644 --- a/.github/workflows/build-lvlibp-self-hosted.yml +++ b/.github/workflows/build-lvlibp-self-hosted.yml @@ -25,4 +25,4 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: build-lvlibp-artifact - path: 'scripts/build-lvlibp/lv_icon.lvlibp' + path: 'scripts/build-lvlibp/lv_icon_x64_v1.0.0.1+gabcdef.lvlibp' diff --git a/.github/workflows/build-vi-package-self-hosted.json b/.github/workflows/build-vi-package-self-hosted.json index 71720098..a9666bb6 100644 --- a/.github/workflows/build-vi-package-self-hosted.json +++ b/.github/workflows/build-vi-package-self-hosted.json @@ -32,7 +32,7 @@ "uses": "actions/upload-artifact@v4", "with": { "name": "vi-package", - "path": "scripts/build-vi-package/lv_icon.vip" + "path": "scripts/build-vi-package/lv_icon_v1.0.0.1+gabcdef.vip" } } ] diff --git a/.github/workflows/build-vi-package-self-hosted.yml b/.github/workflows/build-vi-package-self-hosted.yml index 671f7892..7ee5bf9f 100644 --- a/.github/workflows/build-vi-package-self-hosted.yml +++ b/.github/workflows/build-vi-package-self-hosted.yml @@ -26,4 +26,4 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: vi-package - path: 'scripts/build-vi-package/lv_icon.vip' + path: 'scripts/build-vi-package/lv_icon_v1.0.0.1+gabcdef.vip' diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 3e6b6318..81e837fc 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 51 | 0 | 0 | 11.52 | 100.00 | -| linux | 51 | 0 | 0 | 11.52 | 100.00 | +| overall | 51 | 0 | 0 | 11.39 | 100.00 | +| linux | 51 | 0 | 0 | 11.39 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 0b4c6a80..83374527 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 51 | 0 | 0 | 11.52 | 100.00 | -| linux | 51 | 0 | 0 | 11.52 | 100.00 | +| overall | 51 | 0 | 0 | 11.39 | 100.00 | +| linux | 51 | 0 | 0 | 11.39 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 170a6f37..c89a2a64 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.008 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.002 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.004 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) @@ -64,51 +64,51 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.028 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.013 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.018 | | | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.681 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.674 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.944 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.770 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.052 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.828 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.821 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.959 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.020 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.934 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.003 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.649 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.621 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.011 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.003 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.707 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.821 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.027 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.014 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.005 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.608 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.629 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.015 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.621 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.905 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.947 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.979 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.593 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.709 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.846 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.095 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.581 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.691 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.835 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.079 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 1f8bb504..a75c4a3a 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.007578, + "duration": 0.006546, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.005149, + "duration": 0.001742, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.007573, + "duration": 0.003805, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.002404, + "duration": 0.000941, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.003658, + "duration": 0.000843, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.003573, + "duration": 0.001921, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001203, + "duration": 0.001307, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.00108, + "duration": 0.001099, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.000584, + "duration": 0.000775, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000499, + "duration": 0.000457, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001559, + "duration": 0.003276, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.028454, + "duration": 0.013674, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.001007, + "duration": 0.0015, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.000739, + "duration": 0.000822, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000378, + "duration": 0.000358, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.013096, + "duration": 0.010441, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.007947, + "duration": 0.018364, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.006991, + "duration": 0.00725, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000272, + "duration": 0.000245, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.004168, + "duration": 0.002371, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.680912, + "duration": 0.673898, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001334, + "duration": 0.000949, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000242, + "duration": 0.000188, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.944408, + "duration": 0.827548, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.770248, + "duration": 0.820632, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.051612, + "duration": 0.9589, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000277, + "duration": 0.000299, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000215, + "duration": 0.000228, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.00373, + "duration": 0.002176, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000442, + "duration": 0.000525, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.019607, + "duration": 0.027424, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 0.933771, + "duration": 1.01405, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.002809, + "duration": 0.001827, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000563, + "duration": 0.004554, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000822, + "duration": 0.000416, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.649232, + "duration": 0.607746, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.620574, + "duration": 0.628725, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.011485, + "duration": 0.020461, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.003021, + "duration": 0.014533, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.706712, + "duration": 0.621193, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.820786, + "duration": 0.905017, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.00035, + "duration": 0.000228, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 0.94739, + "duration": 0.979095, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000243, + "duration": 0.000173, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000391, + "duration": 0.000368, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.592587, + "duration": 0.581217, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.709266, + "duration": 0.691398, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.846379, + "duration": 0.834639, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.009249, + "duration": 0.006861, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.002852, + "duration": 0.003728, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.09501, + "duration": 1.078986, "requirements": [], "os": "linux" } @@ -558,7 +558,7 @@ "passed": 51, "failed": 0, "skipped": 0, - "duration": 11.524431000000002, + "duration": 11.385719, "rate": 100 }, "byOs": { @@ -566,7 +566,7 @@ "passed": 51, "failed": 0, "skipped": 0, - "duration": 11.524431000000002, + "duration": 11.385719, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 170a6f37..c89a2a64 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.008 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.002 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.004 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) @@ -64,51 +64,51 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.028 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.013 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.018 | | | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.681 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.674 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.944 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.770 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.052 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.828 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.821 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.959 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.020 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.934 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.003 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.649 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.621 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.011 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.003 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.707 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.821 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.027 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.014 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.005 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.608 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.629 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.015 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.621 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.905 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.947 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.979 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.593 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.709 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.846 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.095 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.581 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.691 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.835 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.079 | | |
\ No newline at end of file diff --git a/docs/action-call-reference.md b/docs/action-call-reference.md index ba47abde..06bf34fc 100644 --- a/docs/action-call-reference.md +++ b/docs/action-call-reference.md @@ -157,7 +157,7 @@ See [rename-file](actions/rename-file.md) for all parameters. - uses: LabVIEW-Community-CI-CD/open-source-actions/rename-file@v1 with: current_filename: 'C:/path/lv_icon.lvlibp' - new_filename: 'lv_icon_x64.lvlibp' + new_filename: 'lv_icon_x64_v1.0.0.1+gabcdef.lvlibp' ``` ## restore-setup-lv-source diff --git a/docs/actions/rename-file.md b/docs/actions/rename-file.md index de51c9fc..fbc83a24 100644 --- a/docs/actions/rename-file.md +++ b/docs/actions/rename-file.md @@ -22,7 +22,7 @@ None. ```powershell pwsh -File actions/Invoke-OSAction.ps1 -ActionName rename-file -ArgsJson '{ "CurrentFilename": "C:/path/lv_icon.lvlibp", - "NewFilename": "lv_icon_x64.lvlibp" + "NewFilename": "lv_icon_x64_v1.0.0.1+gabcdef.lvlibp" }' ``` @@ -46,7 +46,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas uses: LabVIEW-Community-CI-CD/open-source-actions/rename-file@v1 with: current_filename: 'C:/path/lv_icon.lvlibp' - new_filename: 'lv_icon_x64.lvlibp' + new_filename: 'lv_icon_x64_v1.0.0.1+gabcdef.lvlibp' ``` ## Return Codes diff --git a/docs/requirements.md b/docs/requirements.md index c1f96a47..a645ac50 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -45,8 +45,8 @@ Runner Type indicates whether a requirement runs on a standard GitHub-hosted ima | REQIE-003 | After checking out the LabVIEW icon editor repository, Setup: The sequencer shall compute and persist semantic version information. Evidence: a 'version.json' containing VERSION, MAJOR, MINOR, PATCH, BUILD, IS_PRERELEASE and the commit SHA used. Acceptance: VERSION conforms to SemVer and all numeric components are present. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Setup.version-outputs-captured.ps1` | self-hosted-windows-lv | integration | true | | REQIE-004 | After checking out the LabVIEW icon editor repository, Setup: The 'missing-in-project' check shall be executed for the specified LabVIEW version(s) and both 32-bit and 64-bit bitness as applicable. Evidence: 'missing-in-project.json' including project-file, lv-version, bitness, and result. Acceptance: result == 'present' for expected module paths. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Setup.missing-in-project-matrix.ps1` | self-hosted-windows-lv | integration | true | | REQIE-005 | After checking out the LabVIEW icon editor repository, Main: Unit tests shall be executed (Pester) across the configured matrix. Evidence: a 'pester-summary.json' file containing total, passed, failed, skipped, duration_ms, and per-test results; XML output is not required. Acceptance: failed == 0 and total >= 1. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.unit-tests-pass.ps1` | self-hosted-windows-lv | integration | true | -| REQIE-006 | After checking out the LabVIEW icon editor repository, Main: Build Packed Libraries (PPL) shall succeed for both 32-bit and 64-bit targets. Evidence: existence of 'resource/plugins/lv_icon_x86.lvlibp' and 'resource/plugins/lv_icon_x64.lvlibp' and a 'ppl.hash' file containing SHA256 for each artifact. Acceptance: non-zero artifact sizes and matching SHA256 re-computation. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.ppl-built-and-hashed.ps1`, `tests/pester/BuildProfile1.IconEditor.Main.artifact-size-nonzero.ps1` | self-hosted-windows-lv | integration | true | -| REQIE-007 | After checking out the LabVIEW icon editor repository, Main: Renaming and artifact upload steps shall complete. Evidence: an 'artifact-manifest.json' listing uploaded artifact names ('lv_icon_x86.lvlibp', 'lv_icon_x64.lvlibp'), paths, and sizes. Acceptance: manifest entries match on-disk files and GitHub Artifacts report success. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.artifacts-renamed-and-uploaded.ps1` | self-hosted-windows-lv | integration | true | +| REQIE-006 | After checking out the LabVIEW icon editor repository, Main: Build Packed Libraries (PPL) shall succeed for both 32-bit and 64-bit targets. Evidence: existence of 'resource/plugins/lv_icon_x86_vVERSION.lvlibp' and 'resource/plugins/lv_icon_x64_vVERSION.lvlibp' and a 'ppl.hash' file containing SHA256 for each artifact. Acceptance: non-zero artifact sizes and matching SHA256 re-computation. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.ppl-built-and-hashed.ps1`, `tests/pester/BuildProfile1.IconEditor.Main.artifact-size-nonzero.ps1` | self-hosted-windows-lv | integration | true | +| REQIE-007 | After checking out the LabVIEW icon editor repository, Main: Renaming and artifact upload steps shall complete. Evidence: an 'artifact-manifest.json' listing uploaded artifact names ('lv_icon_x86_vVERSION.lvlibp', 'lv_icon_x64_vVERSION.lvlibp'), paths, and sizes. Acceptance: manifest entries match on-disk files and GitHub Artifacts report success. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.artifacts-renamed-and-uploaded.ps1` | self-hosted-windows-lv | integration | true | | REQIE-008 | After checking out the LabVIEW icon editor repository, Main: The workflow shall generate a VI Package (.vip) using the prescribed actions and inputs. Evidence: 'vi-package.hash' (SHA256 of produced .vip), and a 'vi-package.json' summarizing package metadata (name, version, company, build). Acceptance: at least one .vip exists, size > 0, and hash is recorded. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.vi-package-built-and-hashed.ps1` | self-hosted-windows-lv | integration | true | | REQIE-009 | After checking out the LabVIEW icon editor repository, Main: The workflow shall produce a display information JSON for the VI Package and inject it prior to packaging. Evidence: 'display-info.json' containing the exact keys used by the action (Package Version.major/minor/patch/build, Product/Company/Author fields, etc.). Acceptance: all required keys exist and reflect the computed version (REQ-011). g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.display-info-generated.ps1` | self-hosted-windows-lv | integration | true | | REQIE-010 | After checking out the LabVIEW icon editor repository, Cleanup: The workflow shall terminate any LabVIEW processes via the 'close-labview' step for each applicable bitness. Evidence: 'close-labview.log' including bitness, attempts, and final process list. Acceptance: no LabVIEW process remains after the step. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Cleanup.labview-closed.ps1` | self-hosted-windows-lv | integration | true | diff --git a/requirements.json b/requirements.json index 2842df3e..a25a40cf 100644 --- a/requirements.json +++ b/requirements.json @@ -307,7 +307,7 @@ }, { "id": "REQIE-006", - "description": "After checking out the LabVIEW icon editor repository, Main: Build Packed Libraries (PPL) shall succeed for both 32-bit and 64-bit targets. Evidence: existence of 'resource/plugins/lv_icon_x86.lvlibp' and 'resource/plugins/lv_icon_x64.lvlibp' and a 'ppl.hash' file containing SHA256 for each artifact. Acceptance: non-zero artifact sizes and matching SHA256 re-computation. g-cli is expected at 'C:\\Program Files\\G-CLI\\bin\\g-cli.exe'.", + "description": "After checking out the LabVIEW icon editor repository, Main: Build Packed Libraries (PPL) shall succeed for both 32-bit and 64-bit targets. Evidence: existence of 'resource/plugins/lv_icon_x86_v.lvlibp' and 'resource/plugins/lv_icon_x64_v.lvlibp' and a 'ppl.hash' file containing SHA256 for each artifact. Acceptance: non-zero artifact sizes and matching SHA256 re-computation. g-cli is expected at 'C:\\Program Files\\G-CLI\\bin\\g-cli.exe'.", "skip_dry_run": true, "runner": "self-hosted-windows-lv-integration", "tests": [ @@ -317,7 +317,7 @@ }, { "id": "REQIE-007", - "description": "After checking out the LabVIEW icon editor repository, Main: Renaming and artifact upload steps shall complete. Evidence: an 'artifact-manifest.json' listing uploaded artifact names ('lv_icon_x86.lvlibp', 'lv_icon_x64.lvlibp'), paths, and sizes. Acceptance: manifest entries match on-disk files and GitHub Artifacts report success. g-cli is expected at 'C:\\Program Files\\G-CLI\\bin\\g-cli.exe'.", + "description": "After checking out the LabVIEW icon editor repository, Main: Renaming and artifact upload steps shall complete. Evidence: an 'artifact-manifest.json' listing uploaded artifact names ('lv_icon_x86_v.lvlibp', 'lv_icon_x64_v.lvlibp'), paths, and sizes. Acceptance: manifest entries match on-disk files and GitHub Artifacts report success. g-cli is expected at 'C:\\Program Files\\G-CLI\\bin\\g-cli.exe'.", "skip_dry_run": true, "runner": "self-hosted-windows-lv-integration", "tests": [ diff --git a/scripts/build-lvlibp/Build_lvlibp.ps1 b/scripts/build-lvlibp/Build_lvlibp.ps1 index 6ad94950..c2befe4d 100644 --- a/scripts/build-lvlibp/Build_lvlibp.ps1 +++ b/scripts/build-lvlibp/Build_lvlibp.ps1 @@ -64,6 +64,17 @@ if ($LASTEXITCODE -ne 0) { exit 1 } else { Write-Host "Build succeeded." + $shortCommit = if ($Commit.Length -ge 7) { $Commit.Substring(0,7) } else { $Commit } + $bitnessTag = if ($SupportedBitness -eq '32') { 'x86' } else { 'x64' } + $versionTag = "v$Major.$Minor.$Patch.$Build+g$shortCommit" + $original = Join-Path $RelativePath 'lv_icon.lvlibp' + if (Test-Path $original) { + $newName = "lv_icon_${bitnessTag}_$versionTag.lvlibp" + Rename-Item -Path $original -NewName $newName + Write-Host "Renamed LVLIBP to '$newName'" + } else { + Write-Warning "Expected LVLIBP '$original' not found." + } exit 0 } diff --git a/scripts/build-vi-package/build_vip.ps1 b/scripts/build-vi-package/build_vip.ps1 index 80e0915c..7f28e018 100644 --- a/scripts/build-vi-package/build_vip.ps1 +++ b/scripts/build-vi-package/build_vip.ps1 @@ -124,6 +124,13 @@ else { $jsonObj.'Package Version'.build = $Build } +# Add commit identifier +if (-not $jsonObj.commit) { + $jsonObj | Add-Member -MemberType NoteProperty -Name 'commit' -Value $Commit +} else { + $jsonObj.commit = $Commit +} + # Re-convert to a JSON string with a comfortable nesting depth $UpdatedDisplayInformationJSON = $jsonObj | ConvertTo-Json -Depth 5 @@ -140,6 +147,16 @@ Write-Output $script try { Invoke-Expression $script Write-Host "Successfully built VI package: $ResolvedVIPBPath" + $shortCommit = if ($Commit.Length -ge 7) { $Commit.Substring(0,7) } else { $Commit } + $versionTag = "v$Major.$Minor.$Patch.$Build+g$shortCommit" + $originalVip = Join-Path $PSScriptRoot 'lv_icon.vip' + if (Test-Path $originalVip) { + $newVip = "lv_icon_$versionTag.vip" + Rename-Item -Path $originalVip -NewName $newVip + Write-Host "Renamed VI package to '$newVip'" + } else { + Write-Warning "Expected VI package '$originalVip' not found." + } } catch { $errorObject = [PSCustomObject]@{ diff --git a/scripts/build/Build.ps1 b/scripts/build/Build.ps1 index 12b5482c..fd39e8fd 100644 --- a/scripts/build/Build.ps1 +++ b/scripts/build/Build.ps1 @@ -106,6 +106,9 @@ try { Write-Verbose " - CompanyName: $CompanyName" Write-Verbose " - AuthorName: $AuthorName" + $ShortCommit = if ($Commit.Length -ge 7) { $Commit.Substring(0,7) } else { $Commit } + $VersionTag = "v$Major.$Minor.$Patch.$Build+g$ShortCommit" + # Validate needed folders Assert-PathExists $RelativePath "RelativePath" Assert-PathExists "$RelativePath\resource\plugins" "Plugins folder" @@ -157,11 +160,12 @@ try { Execute-Script $CloseLabVIEW ` "-MinimumSupportedLVVersion 2021 -SupportedBitness 32" - # 5) Rename .lvlibp -> lv_icon_x86.lvlibp - Write-Verbose "Renaming .lvlibp file to lv_icon_x86.lvlibp..." + # 5) Rename .lvlibp -> include bitness and version + Write-Verbose "Renaming .lvlibp file to include bitness and version..." $RenameFile = Join-Path $ActionsPath "rename-file/Rename-file.ps1" + $newName32 = "lv_icon_x86_$VersionTag.lvlibp" Execute-Script $RenameFile ` - "-CurrentFilename `"$RelativePath\resource\plugins\lv_icon.lvlibp`" -NewFilename 'lv_icon_x86.lvlibp'" + "-CurrentFilename `"$RelativePath\resource\plugins\lv_icon.lvlibp`" -NewFilename '$newName32'" # # 6) Apply VIPC (64-bit) # Write-Verbose "Now applying VIPC for 64-bit..." @@ -188,10 +192,11 @@ try { "-MinimumSupportedLVVersion 2021 -SupportedBitness 64" - # Rename .lvlibp -> lv_icon_x64.lvlibp - Write-Verbose "Renaming .lvlibp file to lv_icon_x64.lvlibp..." + # Rename .lvlibp -> include bitness and version + Write-Verbose "Renaming .lvlibp file to include bitness and version..." + $newName64 = "lv_icon_x64_$VersionTag.lvlibp" Execute-Script $RenameFile ` - "-CurrentFilename `"$RelativePath\resource\plugins\lv_icon.lvlibp`" -NewFilename 'lv_icon_x64.lvlibp'" + "-CurrentFilename `"$RelativePath\resource\plugins\lv_icon.lvlibp`" -NewFilename '$newName64'" # ------------------------------------------------------------------------- # 8) Construct the JSON for "Company Name" & "Author Name", plus version @@ -256,6 +261,13 @@ try { "-Verbose" ) + # Rename VI package to include version + Write-Verbose "Renaming VI package to include version..." + $vipOriginal = "$RelativePath\lv_icon.vip" + $vipNew = "lv_icon_$VersionTag.vip" + Execute-Script $RenameFile ` + "-CurrentFilename `"$vipOriginal`" -NewFilename '$vipNew'" + # 12) Close LabVIEW (64-bit) Write-Verbose "Closing LabVIEW (64-bit)..." Execute-Script $CloseLabVIEW ` diff --git a/scripts/modify-vipb-display-info/ModifyVIPBDisplayInfo.ps1 b/scripts/modify-vipb-display-info/ModifyVIPBDisplayInfo.ps1 index 8f9f5da0..1a5f3e43 100644 --- a/scripts/modify-vipb-display-info/ModifyVIPBDisplayInfo.ps1 +++ b/scripts/modify-vipb-display-info/ModifyVIPBDisplayInfo.ps1 @@ -129,6 +129,13 @@ else { $jsonObj.'Package Version'.build = $Build } +# Add commit identifier +if (-not $jsonObj.commit) { + $jsonObj | Add-Member -MemberType NoteProperty -Name 'commit' -Value $Commit +} else { + $jsonObj.commit = $Commit +} + # Re-convert to a JSON string with a comfortable nesting depth $UpdatedDisplayInformationJSON = $jsonObj | ConvertTo-Json -Depth 5 diff --git a/scripts/rename-file/README.md b/scripts/rename-file/README.md index 651f86af..4dd2f135 100644 --- a/scripts/rename-file/README.md +++ b/scripts/rename-file/README.md @@ -7,7 +7,7 @@ Use **`Rename-file.ps1`** to rename a file within the repository. | Name | Required | Example | Description | |------|----------|---------|-------------| | `current_filename` | **Yes** | `resource/plugins/lv_icon.lvlibp` | Existing file path. | -| `new_filename` | **Yes** | `lv_icon_x64.lvlibp` | New file name or path. | +| `new_filename` | **Yes** | `lv_icon_x64_v1.0.0.1+gabcdef.lvlibp` | New file name or path. | ## Quick-start @@ -15,7 +15,7 @@ Use **`Rename-file.ps1`** to rename a file within the repository. - uses: ./.github/actions/rename-file with: current_filename: resource/plugins/lv_icon.lvlibp - new_filename: lv_icon_x64.lvlibp + new_filename: lv_icon_x64_v1.0.0.1+gabcdef.lvlibp ``` See also: [docs/actions/rename-file.md](../../docs/actions/rename-file.md) diff --git a/scripts/rename-file/Rename-file.ps1 b/scripts/rename-file/Rename-file.ps1 index 8d87f3b2..0e812067 100644 --- a/scripts/rename-file/Rename-file.ps1 +++ b/scripts/rename-file/Rename-file.ps1 @@ -13,7 +13,7 @@ New name (including path) for the renamed file. .EXAMPLE - .\Rename-file.ps1 -CurrentFilename "C:\path\lv_icon.lvlibp" -NewFilename "lv_icon_x64.lvlibp" + .\Rename-file.ps1 -CurrentFilename "C:\path\lv_icon.lvlibp" -NewFilename "lv_icon_x64_v1.0.0.1+gabcdef.lvlibp" #> param( [string]$CurrentFilename, diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 396d9ecc..c1decf5d 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,56 +1,56 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,5 +58,5 @@ - + diff --git a/tests/pester/BuildLvlibp.Workflow.Tests.ps1 b/tests/pester/BuildLvlibp.Workflow.Tests.ps1 index 70acf817..20081a02 100644 --- a/tests/pester/BuildLvlibp.Workflow.Tests.ps1 +++ b/tests/pester/BuildLvlibp.Workflow.Tests.ps1 @@ -30,6 +30,6 @@ Describe 'BuildLvlibp.Workflow' { $buildStep.with.build_spec | Should -Be 'PackedLib Build' $artifactStep | Should -Not -BeNullOrEmpty - $artifactStep.with.path | Should -Be 'scripts/build-lvlibp/lv_icon.lvlibp' + $artifactStep.with.path | Should -Be 'scripts/build-lvlibp/lv_icon_x64_v1.0.0.1+gabcdef.lvlibp' } } diff --git a/tests/pester/BuildViPackage.Workflow.Tests.ps1 b/tests/pester/BuildViPackage.Workflow.Tests.ps1 index 2a1b4fa6..5d7aca8c 100644 --- a/tests/pester/BuildViPackage.Workflow.Tests.ps1 +++ b/tests/pester/BuildViPackage.Workflow.Tests.ps1 @@ -36,7 +36,7 @@ Describe 'BuildViPackage.Workflow' { $buildStep.with.commit | Should -Be 'abcdef' $artifactStep | Should -Not -BeNullOrEmpty - $artifactStep.with.path | Should -Be 'scripts/build-vi-package/lv_icon.vip' + $artifactStep.with.path | Should -Be 'scripts/build-vi-package/lv_icon_v1.0.0.1+gabcdef.vip' $artifactStep.with.name | Should -Be 'vi-package' } } From b236a45711f000cecd3a371466d3584aa4b9a25b Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 21:24:11 -0700 Subject: [PATCH 48/73] ci: generate slsa provenance (#97) --- .../workflows/build-lvlibp-self-hosted.yml | 4 + .github/workflows/build-self-hosted.yml | 4 + .../build-vi-package-self-hosted.yml | 4 + artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 88 +++++++-------- artifacts/linux/traceability.json | 106 +++++++++--------- artifacts/linux/traceability.md | 88 +++++++-------- test-results/node-junit.xml | 104 ++++++++--------- 9 files changed, 209 insertions(+), 197 deletions(-) diff --git a/.github/workflows/build-lvlibp-self-hosted.yml b/.github/workflows/build-lvlibp-self-hosted.yml index 34c11551..89c97226 100644 --- a/.github/workflows/build-lvlibp-self-hosted.yml +++ b/.github/workflows/build-lvlibp-self-hosted.yml @@ -26,3 +26,7 @@ jobs: with: name: build-lvlibp-artifact path: 'scripts/build-lvlibp/lv_icon_x64_v1.0.0.1+gabcdef.lvlibp' + - name: Generate SLSA provenance + uses: actions/attest-build-provenance@ef244123eb79f2f7a7e75d99086184180e6d0018 + with: + subject-path: 'scripts/build-lvlibp/lv_icon_x64_v1.0.0.1+gabcdef.lvlibp' diff --git a/.github/workflows/build-self-hosted.yml b/.github/workflows/build-self-hosted.yml index bdc152d3..221b7b10 100644 --- a/.github/workflows/build-self-hosted.yml +++ b/.github/workflows/build-self-hosted.yml @@ -43,3 +43,7 @@ jobs: with: name: artifact-manifest path: scripts/build/artifact-manifest.json + - name: Generate SLSA provenance + uses: actions/attest-build-provenance@ef244123eb79f2f7a7e75d99086184180e6d0018 + with: + subject-path: scripts/build/${{ steps.record.outputs.artifact }} diff --git a/.github/workflows/build-vi-package-self-hosted.yml b/.github/workflows/build-vi-package-self-hosted.yml index 7ee5bf9f..09389816 100644 --- a/.github/workflows/build-vi-package-self-hosted.yml +++ b/.github/workflows/build-vi-package-self-hosted.yml @@ -27,3 +27,7 @@ jobs: with: name: vi-package path: 'scripts/build-vi-package/lv_icon_v1.0.0.1+gabcdef.vip' + - name: Generate SLSA provenance + uses: actions/attest-build-provenance@ef244123eb79f2f7a7e75d99086184180e6d0018 + with: + subject-path: 'scripts/build-vi-package/lv_icon_v1.0.0.1+gabcdef.vip' diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 81e837fc..b7f625ee 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 51 | 0 | 0 | 11.39 | 100.00 | -| linux | 51 | 0 | 0 | 11.39 | 100.00 | +| overall | 51 | 0 | 0 | 16.25 | 100.00 | +| linux | 51 | 0 | 0 | 16.25 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 83374527..7647d1fc 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 51 | 0 | 0 | 11.39 | 100.00 | -| linux | 51 | 0 | 0 | 11.39 | 100.00 | +| overall | 51 | 0 | 0 | 16.25 | 100.00 | +| linux | 51 | 0 | 0 | 16.25 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index c89a2a64..35534b38 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,43 +4,43 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.014 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.004 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.007 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.003 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.005 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.005 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) @@ -52,13 +52,13 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.004 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | #### REQ-033 (100% passed) @@ -70,45 +70,45 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.033 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.018 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.674 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.035 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.018 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.001 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.828 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.821 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.959 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.205 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.071 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.400 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.027 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.014 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.021 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.354 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.005 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.608 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.629 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.002 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.931 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.903 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.018 | | | | Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.015 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.621 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.905 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.979 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.581 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.691 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.835 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.079 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.965 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.238 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.437 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.827 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.974 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.118 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.024 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.005 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.576 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index a75c4a3a..d186e4e1 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.006546, + "duration": 0.014145, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.001742, + "duration": 0.003878, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.003805, + "duration": 0.007493, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.000941, + "duration": 0.003224, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.000843, + "duration": 0.00532, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.001921, + "duration": 0.005081, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001307, + "duration": 0.001872, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001099, + "duration": 0.001498, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.000775, + "duration": 0.003841, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000457, + "duration": 0.001286, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.003276, + "duration": 0.00273, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.013674, + "duration": 0.032757, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.0015, + "duration": 0.001437, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.000822, + "duration": 0.001194, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000358, + "duration": 0.001111, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.010441, + "duration": 0.007862, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.018364, + "duration": 0.035213, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.00725, + "duration": 0.017654, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000245, + "duration": 0.000501, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.002371, + "duration": 0.004691, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.673898, + "duration": 1.000897, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000949, + "duration": 0.001533, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000188, + "duration": 0.000315, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.827548, + "duration": 1.204988, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.820632, + "duration": 1.071221, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 0.9589, + "duration": 1.399962, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000299, + "duration": 0.000533, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000228, + "duration": 0.000506, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.002176, + "duration": 0.00444, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000525, + "duration": 0.000826, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.027424, + "duration": 0.020652, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.01405, + "duration": 1.353626, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.001827, + "duration": 0.002043, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.004554, + "duration": 0.000702, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000416, + "duration": 0.001775, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.607746, + "duration": 0.930704, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.628725, + "duration": 0.902764, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.020461, + "duration": 0.017613, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.014533, + "duration": 0.014571, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.621193, + "duration": 0.964606, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.905017, + "duration": 1.237895, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000228, + "duration": 0.000833, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 0.979095, + "duration": 1.436938, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000173, + "duration": 0.000609, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000368, + "duration": 0.00097, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.581217, + "duration": 0.826977, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.691398, + "duration": 0.973806, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.834639, + "duration": 1.117893, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.006861, + "duration": 0.023541, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.003728, + "duration": 0.004649, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.078986, + "duration": 1.575574, "requirements": [], "os": "linux" } @@ -558,7 +558,7 @@ "passed": 51, "failed": 0, "skipped": 0, - "duration": 11.385719, + "duration": 16.246750000000002, "rate": 100 }, "byOs": { @@ -566,7 +566,7 @@ "passed": 51, "failed": 0, "skipped": 0, - "duration": 11.385719, + "duration": 16.246750000000002, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index c89a2a64..35534b38 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,43 +4,43 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.014 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.004 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.007 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.003 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.005 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.005 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) @@ -52,13 +52,13 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.004 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | #### REQ-033 (100% passed) @@ -70,45 +70,45 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.033 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.018 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.674 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.035 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.018 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.001 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.828 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.821 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.959 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.205 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.071 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.400 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.027 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.014 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.021 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.354 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.005 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.608 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.629 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.002 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.931 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.903 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.018 | | | | Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.015 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.621 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.905 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.979 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.581 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.691 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.835 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.079 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.965 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.238 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.437 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.827 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.974 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.118 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.024 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.005 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.576 | | |
\ No newline at end of file diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index c1decf5d..8aa2197b 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,56 +1,56 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,5 +58,5 @@ - + From 2cb1789bd9272985f8cdde37c62b01743adb6223 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 21:33:33 -0700 Subject: [PATCH 49/73] feat: enforce traceability mapping completeness (REQ-001) (#98) --- artifacts/linux/requirements-summary.md | 4 +- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 6 +- artifacts/linux/traceability-standard.md | 82 ++++++------ artifacts/linux/traceability.json | 128 +++++++++++-------- artifacts/linux/traceability.md | 82 ++++++------ scripts/__tests__/check-traceability.test.js | 44 +++++++ scripts/check-traceability.ts | 15 +++ test-results/node-junit.xml | 110 ++++++++-------- 9 files changed, 280 insertions(+), 195 deletions(-) diff --git a/artifacts/linux/requirements-summary.md b/artifacts/linux/requirements-summary.md index 9c1e1af5..62282de2 100644 --- a/artifacts/linux/requirements-summary.md +++ b/artifacts/linux/requirements-summary.md @@ -12,7 +12,7 @@ | REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | 1 | 1 | 0 | 0 | 100.00 | | REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | 1 | 1 | 0 | 0 | 100.00 | | REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | | 1 | 1 | 0 | 0 | 100.00 | -| Unmapped | | | 40 | 40 | 0 | 0 | 100.00 | +| Unmapped | | | 42 | 42 | 0 | 0 | 100.00 | ### Requirement Testcases | Requirement ID | Test ID | Status | @@ -43,6 +43,8 @@ | Unmapped | fails-when-commit-lacks-requirement-reference | Passed | | Unmapped | fails-when-no-junit-files-are-found | Passed | | Unmapped | fails-when-requirement-lacks-test-coverage | Passed | +| Unmapped | fails-when-tests-are-unmapped | Passed | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | | Unmapped | formaterror-handles-plain-objects | Passed | | Unmapped | formaterror-handles-primitives | Passed | | Unmapped | formaterror-handles-real-error-objects | Passed | diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index b7f625ee..09d0e68a 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 51 | 0 | 0 | 16.25 | 100.00 | -| linux | 51 | 0 | 0 | 16.25 | 100.00 | +| overall | 53 | 0 | 0 | 13.70 | 100.00 | +| linux | 53 | 0 | 0 | 13.70 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 7647d1fc..a5fb861a 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 51 | 0 | 0 | 16.25 | 100.00 | -| linux | 51 | 0 | 0 | 16.25 | 100.00 | +| overall | 53 | 0 | 0 | 13.70 | 100.00 | +| linux | 53 | 0 | 0 | 13.70 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | @@ -18,6 +18,6 @@ | REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | 1 | 1 | 0 | 0 | 100.00 | | REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | 1 | 1 | 0 | 0 | 100.00 | | REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | | 1 | 1 | 0 | 0 | 100.00 | -| Unmapped | | | 40 | 40 | 0 | 0 | 100.00 | +| Unmapped | | | 42 | 42 | 0 | 0 | 100.00 | _For detailed per-test information, see [traceability.md](traceability.md)._ \ No newline at end of file diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 35534b38..de8bc464 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,43 +4,43 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.014 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.004 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.007 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.003 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.003 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.005 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.005 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.001 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) @@ -52,7 +52,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.004 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) @@ -64,51 +64,53 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.033 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.020 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | | Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.035 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.018 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.022 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.001 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.006 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.787 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.205 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.071 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.400 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.021 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.354 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.899 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.799 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.012 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.827 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.775 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.019 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.982 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.002 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.931 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.903 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.018 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.015 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.965 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.238 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.650 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.611 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.013 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.621 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.992 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.437 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.107 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.827 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.974 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.118 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.024 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.005 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.576 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.572 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.834 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.942 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.154 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index d186e4e1..be60c065 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.014145, + "duration": 0.006727, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.003878, + "duration": 0.001342, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.007493, + "duration": 0.003369, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.003224, + "duration": 0.000716, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.00532, + "duration": 0.002451, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.005081, + "duration": 0.001488, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001872, + "duration": 0.00104, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001498, + "duration": 0.000999, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.003841, + "duration": 0.000649, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.001286, + "duration": 0.001328, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.00273, + "duration": 0.001299, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.032757, + "duration": 0.020451, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.001437, + "duration": 0.001826, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001194, + "duration": 0.001342, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.001111, + "duration": 0.000863, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.007862, + "duration": 0.008411, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.035213, + "duration": 0.007365, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.017654, + "duration": 0.021843, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000501, + "duration": 0.000658, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.004691, + "duration": 0.005663, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 1.000897, + "duration": 0.786981, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001533, + "duration": 0.001174, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000315, + "duration": 0.000157, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.204988, + "duration": 0.899146, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 1.071221, + "duration": 0.799025, "requirements": [], "os": "linux" }, @@ -321,7 +321,25 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.399962, + "duration": 1.011833, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-tests-are-unmapped", + "name": "fails when tests are unmapped", + "className": "test", + "status": "Passed", + "duration": 0.826665, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-tests-reference-unknown-requirements", + "name": "fails when tests reference unknown requirements", + "className": "test", + "status": "Passed", + "duration": 0.774857, "requirements": [], "os": "linux" }, @@ -330,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000533, + "duration": 0.000166, "requirements": [], "os": "linux" }, @@ -339,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000506, + "duration": 0.000129, "requirements": [], "os": "linux" }, @@ -348,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.00444, + "duration": 0.0016, "requirements": [], "os": "linux" }, @@ -357,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000826, + "duration": 0.00035, "requirements": [], "os": "linux" }, @@ -366,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.020652, + "duration": 0.01851, "requirements": [], "os": "linux" }, @@ -375,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.353626, + "duration": 0.981827, "requirements": [], "os": "linux" }, @@ -384,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.002043, + "duration": 0.00193, "requirements": [], "os": "linux" }, @@ -393,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000702, + "duration": 0.000668, "requirements": [], "os": "linux" }, @@ -402,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.001775, + "duration": 0.000377, "requirements": [], "os": "linux" }, @@ -411,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.930704, + "duration": 0.649531, "requirements": [], "os": "linux" }, @@ -420,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.902764, + "duration": 0.610868, "requirements": [], "os": "linux" }, @@ -429,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.017613, + "duration": 0.012777, "requirements": [], "os": "linux" }, @@ -438,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.014571, + "duration": 0.004025, "requirements": [], "os": "linux" }, @@ -447,7 +465,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.964606, + "duration": 0.621238, "requirements": [], "os": "linux" }, @@ -456,7 +474,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.237895, + "duration": 0.992016, "requirements": [], "os": "linux" }, @@ -465,7 +483,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000833, + "duration": 0.001054, "requirements": [], "os": "linux" }, @@ -474,7 +492,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.436938, + "duration": 1.106529, "requirements": [], "os": "linux" }, @@ -483,7 +501,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000609, + "duration": 0.000423, "requirements": [], "os": "linux" }, @@ -492,7 +510,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.00097, + "duration": 0.000781, "requirements": [], "os": "linux" }, @@ -501,7 +519,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.826977, + "duration": 0.571827, "requirements": [], "os": "linux" }, @@ -510,7 +528,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.973806, + "duration": 0.83399, "requirements": [], "os": "linux" }, @@ -519,7 +537,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.117893, + "duration": 0.941703, "requirements": [], "os": "linux" }, @@ -528,7 +546,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.023541, + "duration": 0.005284, "requirements": [], "os": "linux" }, @@ -537,7 +555,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.004649, + "duration": 0.002962, "requirements": [], "os": "linux" }, @@ -546,7 +564,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.575574, + "duration": 1.153789, "requirements": [], "os": "linux" } @@ -555,18 +573,18 @@ ], "totals": { "overall": { - "passed": 51, + "passed": 53, "failed": 0, "skipped": 0, - "duration": 16.246750000000002, + "duration": 13.704022, "rate": 100 }, "byOs": { "linux": { - "passed": 51, + "passed": 53, "failed": 0, "skipped": 0, - "duration": 16.246750000000002, + "duration": 13.704022, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 35534b38..de8bc464 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,43 +4,43 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.014 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.004 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.007 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.003 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.003 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.005 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.005 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.001 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) @@ -52,7 +52,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.004 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) @@ -64,51 +64,53 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.033 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.020 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | | Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.035 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.018 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.022 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.001 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.006 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.787 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.205 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.071 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.400 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.021 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.354 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.899 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.799 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.012 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.827 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.775 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.019 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.982 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.002 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.931 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.903 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.018 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.015 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.965 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.238 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.650 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.611 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.013 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.621 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.992 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.437 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.107 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.827 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.974 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.118 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.024 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.005 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.576 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.572 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.834 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.942 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.154 | | |
\ No newline at end of file diff --git a/scripts/__tests__/check-traceability.test.js b/scripts/__tests__/check-traceability.test.js index 84734294..6b00df49 100644 --- a/scripts/__tests__/check-traceability.test.js +++ b/scripts/__tests__/check-traceability.test.js @@ -64,3 +64,47 @@ test('passes with coverage and requirement reference', async () => { }); await fs.rm(dir, { recursive: true, force: true }); }); + +test('fails when tests are unmapped', async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'trace-')); + const req = { requirements: [{ id: 'REQ-1', tests: ['t1'] }] }; + await fs.writeFile(path.join(dir, 'requirements.json'), JSON.stringify(req)); + const trace = { + requirements: [ + { id: 'REQ-1', tests: [{ id: 't1', status: 'Passed' }] }, + { id: 'Unmapped', tests: [{ id: 't2', status: 'Passed' }] }, + ], + }; + await fs.writeFile(path.join(dir, 'trace.json'), JSON.stringify(trace)); + await initRepo(dir, 'initial REQ-1'); + await assert.rejects( + execFileP(tsx, [script], { + cwd: dir, + env: { ...process.env, REQ_MAPPING_FILE: 'requirements.json', TRACEABILITY_FILE: 'trace.json' }, + }), + /Tests missing requirement mapping/, + ); + await fs.rm(dir, { recursive: true, force: true }); +}); + +test('fails when tests reference unknown requirements', async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'trace-')); + const req = { requirements: [{ id: 'REQ-1', tests: ['t1'] }] }; + await fs.writeFile(path.join(dir, 'requirements.json'), JSON.stringify(req)); + const trace = { + requirements: [ + { id: 'REQ-1', tests: [{ id: 't1', status: 'Passed' }] }, + { id: 'REQ-2', tests: [{ id: 't2', status: 'Passed' }] }, + ], + }; + await fs.writeFile(path.join(dir, 'trace.json'), JSON.stringify(trace)); + await initRepo(dir, 'initial REQ-1'); + await assert.rejects( + execFileP(tsx, [script], { + cwd: dir, + env: { ...process.env, REQ_MAPPING_FILE: 'requirements.json', TRACEABILITY_FILE: 'trace.json' }, + }), + /Tests reference unknown requirements/, + ); + await fs.rm(dir, { recursive: true, force: true }); +}); diff --git a/scripts/check-traceability.ts b/scripts/check-traceability.ts index 7f5257d5..34f8a8de 100644 --- a/scripts/check-traceability.ts +++ b/scripts/check-traceability.ts @@ -27,6 +27,21 @@ async function main() { process.exit(1); } + const unmapped = groups.find((g) => g.id === 'Unmapped'); + if (unmapped && Array.isArray(unmapped.tests) && unmapped.tests.length > 0) { + const testIds = unmapped.tests.map((t: any) => t.id).join(', '); + console.error(`Tests missing requirement mapping: ${testIds}`); + process.exit(1); + } + + const unknown = groups + .filter((g) => g.id !== 'Unmapped' && !reqIds.includes(g.id)) + .map((g) => g.id); + if (unknown.length > 0) { + console.error(`Tests reference unknown requirements: ${unknown.join(', ')}`); + process.exit(1); + } + const commitMsg = execSync('git log -1 --pretty=%B', { encoding: 'utf8' }); const prBody = process.env.PR_BODY || process.env.GITHUB_PR_BODY || ''; const combined = commitMsg + '\n' + prBody; diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 8aa2197b..b2d77f70 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,62 +1,64 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + From e982e9aec6bb8faf2f780cd9c2f1a074bab9e9bb Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 21:44:09 -0700 Subject: [PATCH 50/73] feat: automate requirements docs from JSON (refs REQ-001) (#99) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 74 +++++++-------- artifacts/linux/traceability.json | 110 +++++++++++------------ artifacts/linux/traceability.md | 74 +++++++-------- docs/requirements.md | 6 +- package.json | 1 + scripts/generate-requirements-docs.ts | 62 +++++++++++++ test-results/node-junit.xml | 108 +++++++++++----------- 9 files changed, 253 insertions(+), 190 deletions(-) create mode 100644 scripts/generate-requirements-docs.ts diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 09d0e68a..d5bd281a 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 13.70 | 100.00 | -| linux | 53 | 0 | 0 | 13.70 | 100.00 | +| overall | 53 | 0 | 0 | 18.25 | 100.00 | +| linux | 53 | 0 | 0 | 18.25 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index a5fb861a..77e3c052 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 13.70 | 100.00 | -| linux | 53 | 0 | 0 | 13.70 | 100.00 | +| overall | 53 | 0 | 0 | 18.25 | 100.00 | +| linux | 53 | 0 | 0 | 18.25 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index de8bc464..920f67f4 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.004 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.003 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | #### REQ-026 (100% passed) @@ -28,13 +28,13 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.001 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.005 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | #### REQ-031 (100% passed) @@ -64,53 +64,53 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.020 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.023 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.022 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.006 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.787 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.004 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.012 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.146 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.899 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.799 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.012 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.827 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.775 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.306 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.103 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.217 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.035 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.042 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.019 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.982 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.029 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.309 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.650 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.611 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.013 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.621 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.992 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.903 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.923 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.006 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.911 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.120 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.107 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.317 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.572 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.834 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.942 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.834 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.087 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.217 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | | Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.154 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.600 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index be60c065..98309060 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.006727, + "duration": 0.010681, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.001342, + "duration": 0.004203, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.003369, + "duration": 0.005869, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.000716, + "duration": 0.001099, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.002451, + "duration": 0.001371, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.001488, + "duration": 0.005027, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.00104, + "duration": 0.001224, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.000999, + "duration": 0.003946, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.000649, + "duration": 0.000926, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.001328, + "duration": 0.00062, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001299, + "duration": 0.00191, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.020451, + "duration": 0.023062, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.001826, + "duration": 0.001585, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001342, + "duration": 0.001339, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000863, + "duration": 0.003864, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.008411, + "duration": 0.006153, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.007365, + "duration": 0.011965, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.021843, + "duration": 0.010128, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000658, + "duration": 0.000283, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.005663, + "duration": 0.004627, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.786981, + "duration": 1.146393, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001174, + "duration": 0.001411, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000157, + "duration": 0.000239, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.899146, + "duration": 1.305622, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.799025, + "duration": 1.10271, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.011833, + "duration": 1.216621, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.826665, + "duration": 1.034922, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.774857, + "duration": 1.041508, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000166, + "duration": 0.000397, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000129, + "duration": 0.000258, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.0016, + "duration": 0.002689, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.00035, + "duration": 0.000624, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.01851, + "duration": 0.02875, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 0.981827, + "duration": 1.308587, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.00193, + "duration": 0.002196, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000668, + "duration": 0.000501, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000377, + "duration": 0.000831, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.649531, + "duration": 0.903192, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.610868, + "duration": 0.92315, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.012777, + "duration": 0.019895, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.004025, + "duration": 0.006382, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.621238, + "duration": 0.911206, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.992016, + "duration": 1.120242, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.001054, + "duration": 0.000611, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.106529, + "duration": 1.317312, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000423, + "duration": 0.00036, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000781, + "duration": 0.00073, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.571827, + "duration": 0.83369, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.83399, + "duration": 1.086652, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.941703, + "duration": 1.217445, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.005284, + "duration": 0.009038, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.002962, + "duration": 0.002926, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.153789, + "duration": 1.59958, "requirements": [], "os": "linux" } @@ -576,7 +576,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 13.704022, + "duration": 18.246552, "rate": 100 }, "byOs": { @@ -584,7 +584,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 13.704022, + "duration": 18.246552, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index de8bc464..920f67f4 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.004 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.003 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | #### REQ-026 (100% passed) @@ -28,13 +28,13 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.001 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.005 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | #### REQ-031 (100% passed) @@ -64,53 +64,53 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.020 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.023 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.022 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.006 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.787 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.004 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.012 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.146 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.899 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.799 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.012 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.827 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.775 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.306 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.103 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.217 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.035 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.042 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.019 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.982 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.029 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.309 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.650 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.611 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.013 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.621 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.992 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.903 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.923 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.006 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.911 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.120 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.107 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.317 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.572 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.834 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.942 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.834 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.087 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.217 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | | Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.154 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.600 | | |
\ No newline at end of file diff --git a/docs/requirements.md b/docs/requirements.md index a645ac50..7eccd2fe 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -10,7 +10,7 @@ Runner Type indicates whether a requirement runs on a standard GitHub-hosted ima |----|-------------|-------|--------|-------------|--------------| | REQ-001 | Dispatcher discovers available actions, describes them, and validates arguments. | `tests/pester/Dispatcher.Tests.ps1` | | | | | REQ-002 | Dispatcher dry-run mode prints descriptions and warns on unknown arguments without executing actions. | `tests/pester/Dispatcher.DryRun.Tests.ps1` | | | | -| REQ-003 | Actions resolve and normalize RelativePath arguments (trimming separators, resolving '.') using the action's WorkingDirectory as the base path and pass them without warnings, including when RelativePath is '.' and the WorkingDirectory targets subdirectories. | `tests/pester/RelativePath.Actions.Tests.ps1` | | | | +| REQ-003 | Actions resolve RelativePath arguments using the action's WorkingDirectory as the base path and pass them without warnings, including when RelativePath is '.' and the WorkingDirectory targets subdirectories. | `tests/pester/RelativePath.Actions.Tests.ps1` | | | | | REQ-004 | Every action script exists at the expected path. | `tests/pester/ScriptPath.Tests.ps1` | | | | | REQ-005 | Dispatcher fails when RelativePath is missing or invalid after resolving it relative to the specified WorkingDirectory. | `tests/pester/Dispatcher.InvalidPaths.Tests.ps1` | | | | | REQ-006 | Workflow tests the composite action defined in apply-vipc/action.yml with minimum_supported_lv_version '2021', vip_lv_version '2021', supported_bitness '64', relative_path '.', and vipc_path 'scripts/apply-vipc/runner_dependencies.vipc' on the GitHub-hosted Ubuntu runner labeled ubuntu-latest with dry_run true. | `tests/pester/ApplyVipc.DryRunTrue.Workflow.ps1` | ubuntu-latest | integration | false | @@ -45,8 +45,8 @@ Runner Type indicates whether a requirement runs on a standard GitHub-hosted ima | REQIE-003 | After checking out the LabVIEW icon editor repository, Setup: The sequencer shall compute and persist semantic version information. Evidence: a 'version.json' containing VERSION, MAJOR, MINOR, PATCH, BUILD, IS_PRERELEASE and the commit SHA used. Acceptance: VERSION conforms to SemVer and all numeric components are present. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Setup.version-outputs-captured.ps1` | self-hosted-windows-lv | integration | true | | REQIE-004 | After checking out the LabVIEW icon editor repository, Setup: The 'missing-in-project' check shall be executed for the specified LabVIEW version(s) and both 32-bit and 64-bit bitness as applicable. Evidence: 'missing-in-project.json' including project-file, lv-version, bitness, and result. Acceptance: result == 'present' for expected module paths. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Setup.missing-in-project-matrix.ps1` | self-hosted-windows-lv | integration | true | | REQIE-005 | After checking out the LabVIEW icon editor repository, Main: Unit tests shall be executed (Pester) across the configured matrix. Evidence: a 'pester-summary.json' file containing total, passed, failed, skipped, duration_ms, and per-test results; XML output is not required. Acceptance: failed == 0 and total >= 1. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.unit-tests-pass.ps1` | self-hosted-windows-lv | integration | true | -| REQIE-006 | After checking out the LabVIEW icon editor repository, Main: Build Packed Libraries (PPL) shall succeed for both 32-bit and 64-bit targets. Evidence: existence of 'resource/plugins/lv_icon_x86_vVERSION.lvlibp' and 'resource/plugins/lv_icon_x64_vVERSION.lvlibp' and a 'ppl.hash' file containing SHA256 for each artifact. Acceptance: non-zero artifact sizes and matching SHA256 re-computation. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.ppl-built-and-hashed.ps1`, `tests/pester/BuildProfile1.IconEditor.Main.artifact-size-nonzero.ps1` | self-hosted-windows-lv | integration | true | -| REQIE-007 | After checking out the LabVIEW icon editor repository, Main: Renaming and artifact upload steps shall complete. Evidence: an 'artifact-manifest.json' listing uploaded artifact names ('lv_icon_x86_vVERSION.lvlibp', 'lv_icon_x64_vVERSION.lvlibp'), paths, and sizes. Acceptance: manifest entries match on-disk files and GitHub Artifacts report success. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.artifacts-renamed-and-uploaded.ps1` | self-hosted-windows-lv | integration | true | +| REQIE-006 | After checking out the LabVIEW icon editor repository, Main: Build Packed Libraries (PPL) shall succeed for both 32-bit and 64-bit targets. Evidence: existence of 'resource/plugins/lv_icon_x86_v<version>.lvlibp' and 'resource/plugins/lv_icon_x64_v<version>.lvlibp' and a 'ppl.hash' file containing SHA256 for each artifact. Acceptance: non-zero artifact sizes and matching SHA256 re-computation. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.ppl-built-and-hashed.ps1`, `tests/pester/BuildProfile1.IconEditor.Main.artifact-size-nonzero.ps1` | self-hosted-windows-lv | integration | true | +| REQIE-007 | After checking out the LabVIEW icon editor repository, Main: Renaming and artifact upload steps shall complete. Evidence: an 'artifact-manifest.json' listing uploaded artifact names ('lv_icon_x86_v<version>.lvlibp', 'lv_icon_x64_v<version>.lvlibp'), paths, and sizes. Acceptance: manifest entries match on-disk files and GitHub Artifacts report success. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.artifacts-renamed-and-uploaded.ps1` | self-hosted-windows-lv | integration | true | | REQIE-008 | After checking out the LabVIEW icon editor repository, Main: The workflow shall generate a VI Package (.vip) using the prescribed actions and inputs. Evidence: 'vi-package.hash' (SHA256 of produced .vip), and a 'vi-package.json' summarizing package metadata (name, version, company, build). Acceptance: at least one .vip exists, size > 0, and hash is recorded. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.vi-package-built-and-hashed.ps1` | self-hosted-windows-lv | integration | true | | REQIE-009 | After checking out the LabVIEW icon editor repository, Main: The workflow shall produce a display information JSON for the VI Package and inject it prior to packaging. Evidence: 'display-info.json' containing the exact keys used by the action (Package Version.major/minor/patch/build, Product/Company/Author fields, etc.). Acceptance: all required keys exist and reflect the computed version (REQ-011). g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.display-info-generated.ps1` | self-hosted-windows-lv | integration | true | | REQIE-010 | After checking out the LabVIEW icon editor repository, Cleanup: The workflow shall terminate any LabVIEW processes via the 'close-labview' step for each applicable bitness. Evidence: 'close-labview.log' including bitness, attempts, and final process list. Acceptance: no LabVIEW process remains after the step. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Cleanup.labview-closed.ps1` | self-hosted-windows-lv | integration | true | diff --git a/package.json b/package.json index 242d69da..de030dab 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "test:ci": "mkdir -p test-results && tsx --test --test-reporter=junit --test-reporter-destination test-results/node-junit.xml scripts/**/*.test.js scripts/*.test.js", "derive:registry": "tsx scripts/derive-dispatcher-registry.ts", "generate:summary": "tsx scripts/generate-ci-summary.ts", + "generate:requirements-docs": "tsx scripts/generate-requirements-docs.ts", "generate:traceability-matrix": "tsx scripts/generate-traceability-matrix.ts", "check:traceability": "tsx scripts/check-traceability.ts", "lint:md": "markdownlint-cli2 README.md \"docs/**/*.md\" \"scripts/**/*.md\"", diff --git a/scripts/generate-requirements-docs.ts b/scripts/generate-requirements-docs.ts new file mode 100644 index 00000000..a76bcd0b --- /dev/null +++ b/scripts/generate-requirements-docs.ts @@ -0,0 +1,62 @@ +import fs from 'fs/promises'; +import path from 'path'; + +interface RunnerInfo { + runner_label?: string; + runner_type?: string; + skip_dry_run?: boolean; +} + +interface Requirement { + id: string; + description: string; + tests?: string[]; + runner?: string; + skip_dry_run?: boolean; +} + +async function main() { + const raw = JSON.parse(await fs.readFile('requirements.json', 'utf8')); + const runners: Record = raw.runners ?? {}; + const requirements: Requirement[] = raw.requirements ?? []; + + const header = `# Requirements\n\nThis project tracks high\u2011level requirements and maps each one to the Pester test files that verify it. The authoritative mapping is stored in [\`requirements.json\`](../requirements.json); the table below provides a human\u2011readable summary for quick reference.\n\nIf every test maps to \`Unmapped\`, the \`scripts/generate-ci-summary.ts\` script logs a warning. Set \`REQUIRE_REQUIREMENTS_MAPPING\` in the environment to treat this situation as an error.\n\nRunner Type indicates whether a requirement runs on a standard GitHub-hosted image or an integration runner with preinstalled tooling. See [runner-types](runner-types.md) for guidance on choosing between them.\n\n| ID | Description | Tests | Runner | Runner Type | Skip Dry Run |\n|----|-------------|-------|--------|-------------|--------------|\n`; + + const escapeCell = (text: string) => + text.replace(/\|/g, '\\|').replace(//g, '>'); + + const rows = requirements + .map((req) => { + const tests = (req.tests ?? []) + .map((t) => (t.includes('/') ? t : `tests/pester/${t}.ps1`)) + .map((t) => `\`${t}\``) + .join(', '); + + let runnerLabel = ''; + let runnerType = ''; + let skipDryRun: string = ''; + if (req.runner) { + const info = runners[req.runner] || {}; + runnerLabel = info.runner_label ?? ''; + runnerType = info.runner_type ?? ''; + const skip = req.skip_dry_run ?? info.skip_dry_run; + if (skip !== undefined) skipDryRun = String(skip); + } else if (req.skip_dry_run !== undefined) { + skipDryRun = String(req.skip_dry_run); + } + + const desc = escapeCell(req.description.replace(/\s+/g, ' ').trim()); + return `| ${req.id} | ${desc} | ${tests} | ${runnerLabel} | ${runnerType} | ${skipDryRun} |`; + }) + .join('\n'); + + const footer = `\n\nEach test file is annotated with its corresponding requirement ID to maintain traceability between requirements and test coverage.\n\nDuring CI runs, \`scripts/generate-ci-summary.ts\` writes requirement artifacts to an OS\u2011specific directory under \`artifacts/\`, such as \`artifacts/windows/traceability.md\` or \`artifacts/linux/traceability.md\`, using the \`RUNNER_OS\` environment variable.\n\nEach directory also includes a \`summary.md\` file with per\u2011OS totals. A typical summary might look like this:\n\n| OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) |\n| --- | --- | --- | --- | --- | --- |\n| overall | 10 | 0 | 2 | 12.34 | 100.00 |\n| windows | 5 | 0 | 1 | 6.17 | 100.00 |\n| linux | 5 | 0 | 1 | 6.17 | 100.00 |\n`; + + const content = header + rows + footer; + await fs.writeFile(path.join('docs', 'requirements.md'), content); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index b2d77f70..11526f8e 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From 644b0ad2bbca4ced446d11d2d68d6062f00cb581 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 21:55:21 -0700 Subject: [PATCH 51/73] Publish traceability results (#100) --- .github/workflows/ci.yml | 8 ++ .github/workflows/publish-traceability.yml | 34 +++++++ .github/workflows/release.yml | 6 ++ README.md | 2 + artifacts/linux/badge-summary.json | 1 + artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 80 +++++++-------- artifacts/linux/traceability.json | 110 ++++++++++----------- artifacts/linux/traceability.md | 80 +++++++-------- linkinator.config.json | 4 +- scripts/generate-traceability-badge.ts | 31 ++++++ test-results/node-junit.xml | 108 ++++++++++---------- 13 files changed, 278 insertions(+), 194 deletions(-) create mode 100644 .github/workflows/publish-traceability.yml create mode 100644 artifacts/linux/badge-summary.json create mode 100644 scripts/generate-traceability-badge.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0833ff66..630a8c93 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -136,4 +136,12 @@ jobs: with: name: traceability-matrix path: artifacts/linux/traceability-matrix.md + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + if: ${{ (success() || failure()) && !cancelled() }} + with: + name: traceability-report + path: | + artifacts/linux/summary.md + artifacts/linux/traceability.md + artifacts/linux/traceability.json - run: npx tsx scripts/print-pester-traceability.ts >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/publish-traceability.yml b/.github/workflows/publish-traceability.yml new file mode 100644 index 00000000..4881d57f --- /dev/null +++ b/.github/workflows/publish-traceability.yml @@ -0,0 +1,34 @@ +name: Publish Traceability + +on: + workflow_run: + workflows: [CI] + types: [completed] + +permissions: + contents: read + pages: write + id-token: write + +jobs: + deploy: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-24.04 + environment: + name: github-pages + steps: + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 + with: + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + name: traceability-report + path: artifacts/linux + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 + with: + node-version: 24 + - run: npm install + - run: npx tsx scripts/generate-traceability-badge.ts + - uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa + with: + path: artifacts/linux + - uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1d439a26..a281c752 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,6 +29,12 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} name: release-metadata path: artifacts + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 + with: + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + name: traceability-report + path: artifacts - name: Create tag run: | git config user.name github-actions diff --git a/README.md b/README.md index 577fbf39..025b4750 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Open Source LabVIEW Actions +[![Traceability](https://img.shields.io/endpoint?url=https://LabVIEW-Community-CI-CD.github.io/open-source-actions/badge-summary.json)](https://LabVIEW-Community-CI-CD.github.io/open-source-actions/summary.md) + Open Source LabVIEW Actions provides typed GitHub Action wrappers around a unified PowerShell dispatcher for LabVIEW CI/CD tasks. Each adapter (for example `run-unit-tests`) is exposed as its own action and can be called from workflows with `uses: LabVIEW-Community-CI-CD/open-source-actions/@v1`. For setup and action reference, see the [documentation](docs/index.md). The [quickstart](docs/quickstart.md) shows a full example and [Unified Dispatcher](docs/UnifiedDispatcher.md) describes how the dispatcher works. For an overview of the project's architecture, see [docs/architecture.md](docs/architecture.md). For a mapping of high-level requirements to the tests that verify them, see [docs/requirements.md](docs/requirements.md). diff --git a/artifacts/linux/badge-summary.json b/artifacts/linux/badge-summary.json new file mode 100644 index 00000000..e11c5ebb --- /dev/null +++ b/artifacts/linux/badge-summary.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"requirements","message":"53/53 (100%)","color":"green"} \ No newline at end of file diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index d5bd281a..98b1719c 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 18.25 | 100.00 | -| linux | 53 | 0 | 0 | 18.25 | 100.00 | +| overall | 53 | 0 | 0 | 13.17 | 100.00 | +| linux | 53 | 0 | 0 | 13.17 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 77e3c052..59baffae 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 18.25 | 100.00 | -| linux | 53 | 0 | 0 | 18.25 | 100.00 | +| overall | 53 | 0 | 0 | 13.17 | 100.00 | +| linux | 53 | 0 | 0 | 13.17 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 920f67f4..fd1a8541 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.004 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.014 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.002 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.005 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | #### REQ-029 (100% passed) @@ -46,19 +46,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.005 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.002 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | #### REQ-033 (100% passed) @@ -70,47 +70,47 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.023 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.015 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.004 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.012 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.005 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.146 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.798 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.306 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.103 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.217 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.035 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.042 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.001 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.813 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.830 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.919 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.779 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.787 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.029 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.309 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.026 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.961 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.903 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.923 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.006 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.911 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.120 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.675 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.648 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.653 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.915 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.317 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.002 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.834 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.087 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.217 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.600 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.572 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.759 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.862 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.051 | | | \ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 98309060..0f6246d4 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.010681, + "duration": 0.007659, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.004203, + "duration": 0.005117, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.005869, + "duration": 0.013914, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001099, + "duration": 0.001501, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.001371, + "duration": 0.002075, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.005027, + "duration": 0.003369, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001224, + "duration": 0.001221, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.003946, + "duration": 0.004631, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.000926, + "duration": 0.001628, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.00062, + "duration": 0.000459, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.00191, + "duration": 0.001567, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.023062, + "duration": 0.015307, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.001585, + "duration": 0.000892, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001339, + "duration": 0.000797, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.003864, + "duration": 0.000644, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.006153, + "duration": 0.0054, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.011965, + "duration": 0.005212, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.010128, + "duration": 0.009992, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000283, + "duration": 0.000785, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.004627, + "duration": 0.003309, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 1.146393, + "duration": 0.798023, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001411, + "duration": 0.00093, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000239, + "duration": 0.000878, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.305622, + "duration": 0.812814, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 1.10271, + "duration": 0.830033, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.216621, + "duration": 0.919245, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.034922, + "duration": 0.779453, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 1.041508, + "duration": 0.786544, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000397, + "duration": 0.000139, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000258, + "duration": 0.000409, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.002689, + "duration": 0.001759, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000624, + "duration": 0.000293, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.02875, + "duration": 0.025857, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.308587, + "duration": 0.961042, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.002196, + "duration": 0.001704, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000501, + "duration": 0.00072, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000831, + "duration": 0.001098, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.903192, + "duration": 0.674674, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.92315, + "duration": 0.648154, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.019895, + "duration": 0.011615, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.006382, + "duration": 0.001907, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.911206, + "duration": 0.653365, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.120242, + "duration": 0.914584, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000611, + "duration": 0.000533, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.317312, + "duration": 1.001683, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.00036, + "duration": 0.000393, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.00073, + "duration": 0.000717, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.83369, + "duration": 0.572142, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 1.086652, + "duration": 0.758758, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.217445, + "duration": 0.862284, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.009038, + "duration": 0.004749, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.002926, + "duration": 0.002454, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.59958, + "duration": 1.051012, "requirements": [], "os": "linux" } @@ -576,7 +576,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 18.246552, + "duration": 13.165444000000004, "rate": 100 }, "byOs": { @@ -584,7 +584,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 18.246552, + "duration": 13.165444000000004, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 920f67f4..fd1a8541 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.004 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.014 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.002 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.005 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | #### REQ-029 (100% passed) @@ -46,19 +46,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.005 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.002 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | #### REQ-033 (100% passed) @@ -70,47 +70,47 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.023 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.015 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.004 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.012 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.005 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.146 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.798 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.306 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.103 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.217 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.035 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.042 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.001 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.813 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.830 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.919 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.779 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.787 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.029 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.309 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.026 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.961 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.903 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.923 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.006 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.911 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.120 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.675 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.648 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.653 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.915 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.317 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.002 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.834 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.087 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.217 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.600 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.572 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.759 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.862 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.051 | | | \ No newline at end of file diff --git a/linkinator.config.json b/linkinator.config.json index 90e38b53..c4a49179 100644 --- a/linkinator.config.json +++ b/linkinator.config.json @@ -7,6 +7,8 @@ "directoryListing": true, "skip": [ "https://open-source-actions.github.io/open-source-actions/", - "http://127.0.0.1:8000/" + "http://127.0.0.1:8000/", + "https://LabVIEW-Community-CI-CD.github.io/open-source-actions/summary.md", + "https://labview-community-ci-cd.github.io/open-source-actions/summary.md" ] } diff --git a/scripts/generate-traceability-badge.ts b/scripts/generate-traceability-badge.ts new file mode 100644 index 00000000..c9856a60 --- /dev/null +++ b/scripts/generate-traceability-badge.ts @@ -0,0 +1,31 @@ +#!/usr/bin/env tsx +import fs from 'fs/promises'; +import path from 'path'; +import { pathToFileURL } from 'url'; +import { writeErrorSummary } from './error-handler.ts'; + +async function main() { + const traceFile = process.env.TRACEABILITY_JSON ?? 'artifacts/linux/traceability.json'; + const outFile = process.env.BADGE_JSON ?? 'artifacts/linux/badge-summary.json'; + const raw = await fs.readFile(traceFile, 'utf8'); + const { totals } = JSON.parse(raw); + const overall = totals.overall; + const total = overall.passed + overall.failed + overall.skipped; + const rate = overall.rate ?? (total === 0 ? 0 : Math.round((overall.passed / total) * 100)); + const color = rate === 100 ? 'green' : rate >= 80 ? 'yellow' : 'red'; + const badge = { + schemaVersion: 1, + label: 'requirements', + message: `${overall.passed}/${total} (${rate}%)`, + color, + }; + await fs.mkdir(path.dirname(outFile), { recursive: true }); + await fs.writeFile(outFile, JSON.stringify(badge)); +} + +if (import.meta.url === pathToFileURL(process.argv[1] ?? '').href) { + main().catch(async err => { + await writeErrorSummary(err); + process.exit(1); + }); +} diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 11526f8e..cbe4ad61 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From 71dce90ac4c44e097a0e64cbb68935148e7d7575 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 22:05:07 -0700 Subject: [PATCH 52/73] Integrate CI evidence into release pipeline (#101) --- .github/workflows/ci.yml | 6 ++ .github/workflows/release.yml | 32 ++++++- artifacts/linux/badge-summary.json | 1 - artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 76 ++++++++-------- artifacts/linux/traceability.json | 110 +++++++++++------------ artifacts/linux/traceability.md | 76 ++++++++-------- docs/versioning.md | 2 + test-results/node-junit.xml | 108 +++++++++++----------- 10 files changed, 228 insertions(+), 191 deletions(-) delete mode 100644 artifacts/linux/badge-summary.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 630a8c93..19cf0882 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -144,4 +144,10 @@ jobs: artifacts/linux/summary.md artifacts/linux/traceability.md artifacts/linux/traceability.json + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + if: ${{ (success() || failure()) && !cancelled() }} + with: + name: ci-evidence + path: ci_evidence.txt + if-no-files-found: error - run: npx tsx scripts/print-pester-traceability.ts >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a281c752..a8d2243d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,6 +35,36 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} name: traceability-report path: artifacts + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 + with: + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + name: ci-evidence + path: artifacts + - name: Evaluate CI evidence + id: evidence + run: | + CI_EVIDENCE=$(cat artifacts/ci_evidence.txt) + echo "ci_evidence=$CI_EVIDENCE" >> "$GITHUB_OUTPUT" + if echo "$CI_EVIDENCE" | jq -e '.req_status | to_entries | any(.value == "FAIL")'; then + echo 'Requirement failure detected in CI evidence.' >&2 + exit 1 + fi + - name: Prepare release notes + id: notes + run: | + TITLE="${{ steps.meta.outputs.title }}" + CI_EVIDENCE=$(jq . artifacts/ci_evidence.txt) + { + echo "body<<'EOF'" + echo "$TITLE" + echo "" + echo "CI Evidence:" + echo '```json' + echo "$CI_EVIDENCE" + echo '```' + echo "EOF" + } >> "$GITHUB_OUTPUT" - name: Create tag run: | git config user.name github-actions @@ -49,7 +79,7 @@ jobs: with: tag_name: ${{ steps.meta.outputs.tag }} release_name: ${{ steps.meta.outputs.title }} - body: ${{ steps.meta.outputs.title }} + body: ${{ steps.notes.outputs.body }} - name: Upload artifacts env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/artifacts/linux/badge-summary.json b/artifacts/linux/badge-summary.json deleted file mode 100644 index e11c5ebb..00000000 --- a/artifacts/linux/badge-summary.json +++ /dev/null @@ -1 +0,0 @@ -{"schemaVersion":1,"label":"requirements","message":"53/53 (100%)","color":"green"} \ No newline at end of file diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 98b1719c..f6a3ece9 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 13.17 | 100.00 | -| linux | 53 | 0 | 0 | 13.17 | 100.00 | +| overall | 53 | 0 | 0 | 13.14 | 100.00 | +| linux | 53 | 0 | 0 | 13.14 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 59baffae..3cc29872 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 13.17 | 100.00 | -| linux | 53 | 0 | 0 | 13.17 | 100.00 | +| overall | 53 | 0 | 0 | 13.14 | 100.00 | +| linux | 53 | 0 | 0 | 13.14 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index fd1a8541..9b3cca58 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.015 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.014 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.002 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.005 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) @@ -58,59 +58,59 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.015 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.019 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.005 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.798 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.001 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.813 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.830 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.919 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.779 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.787 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.004 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.011 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.874 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.788 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.689 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.909 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.756 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.813 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.026 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.961 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.015 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.972 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.675 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.648 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.653 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.915 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.002 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.648 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.647 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.618 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.934 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.935 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.572 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.759 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.862 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.614 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.859 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.852 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | | Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.051 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.081 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 0f6246d4..423faf70 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.007659, + "duration": 0.009869, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.005117, + "duration": 0.015337, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.013914, + "duration": 0.005175, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001501, + "duration": 0.001316, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.002075, + "duration": 0.000979, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.003369, + "duration": 0.003578, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001221, + "duration": 0.001392, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.004631, + "duration": 0.001158, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.001628, + "duration": 0.002022, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000459, + "duration": 0.001525, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001567, + "duration": 0.000997, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.015307, + "duration": 0.018877, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.000892, + "duration": 0.000926, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.000797, + "duration": 0.000724, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000644, + "duration": 0.000732, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.0054, + "duration": 0.005909, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.005212, + "duration": 0.004333, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.009992, + "duration": 0.011202, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000785, + "duration": 0.000198, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.003309, + "duration": 0.002179, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.798023, + "duration": 0.873706, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.00093, + "duration": 0.001514, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000878, + "duration": 0.000146, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.812814, + "duration": 0.787538, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.830033, + "duration": 0.688735, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 0.919245, + "duration": 0.908898, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.779453, + "duration": 0.755718, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.786544, + "duration": 0.812665, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000139, + "duration": 0.000356, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000409, + "duration": 0.000221, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.001759, + "duration": 0.001688, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000293, + "duration": 0.000424, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.025857, + "duration": 0.014794, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 0.961042, + "duration": 0.971555, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.001704, + "duration": 0.001799, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.00072, + "duration": 0.000507, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.001098, + "duration": 0.000686, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.674674, + "duration": 0.648048, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.648154, + "duration": 0.646948, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.011615, + "duration": 0.020004, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.001907, + "duration": 0.011995, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.653365, + "duration": 0.617919, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.914584, + "duration": 0.933509, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000533, + "duration": 0.000288, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.001683, + "duration": 0.934641, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000393, + "duration": 0.00028, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000717, + "duration": 0.000611, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.572142, + "duration": 0.614415, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.758758, + "duration": 0.85877, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.862284, + "duration": 0.851625, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.004749, + "duration": 0.00663, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.002454, + "duration": 0.001583, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.051012, + "duration": 1.081413, "requirements": [], "os": "linux" } @@ -576,7 +576,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 13.165444000000004, + "duration": 13.138056999999996, "rate": 100 }, "byOs": { @@ -584,7 +584,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 13.165444000000004, + "duration": 13.138056999999996, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index fd1a8541..9b3cca58 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.015 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.014 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.002 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.005 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) @@ -58,59 +58,59 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.015 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.019 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.005 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.798 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.001 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.813 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.830 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.919 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.779 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.787 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.004 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.011 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.874 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.788 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.689 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.909 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.756 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.813 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.026 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.961 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.015 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.972 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.675 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.648 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.653 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.915 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.002 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.648 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.647 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.618 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.934 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.935 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.572 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.759 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.862 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.614 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.859 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.852 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | | Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.051 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.081 | | |
\ No newline at end of file diff --git a/docs/versioning.md b/docs/versioning.md index e90480da..70ea32bf 100644 --- a/docs/versioning.md +++ b/docs/versioning.md @@ -2,6 +2,8 @@ The **OpenSourceActions** module and composite action follow [Semantic Versioning](https://semver.org/) in the format **MAJOR.MINOR.PATCH**. The version is stored in `OpenSourceActions.psd1` and mirrored in repository tags. +Each release automatically embeds the CI evidence JSON in the release notes, providing a summary of tested requirements and the commit used. The publish job validates this evidence and aborts the release if any requirement reports `FAIL`. + ## MAJOR version Used for incompatible changes such as removing or renaming actions, changing required inputs, or altering behavior in a way that breaks existing workflows. diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index cbe4ad61..e9bb9f05 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From 574e9a7cc862a0cdea82007dece6ba2d467579da Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 22:14:03 -0700 Subject: [PATCH 53/73] docs: reinforce requirement traceability in guidelines [REQ-030] (#102) --- CONTRIBUTING.md | 18 ++-- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 90 +++++++++---------- artifacts/linux/traceability.json | 110 +++++++++++------------ artifacts/linux/traceability.md | 90 +++++++++---------- docs/contributing-docs.md | 8 +- test-results/node-junit.xml | 108 +++++++++++----------- 8 files changed, 220 insertions(+), 212 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a0898125..4ef4e16e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,11 +21,19 @@ npx --yes linkinator README.md docs scripts --config linkinator.config.json ## Requirement Traceability -Each requirement is tracked as an issue or entry in `requirements.json`. Every -code change must reference the requirement it addresses, and each requirement -must be covered by at least one automated test. The CI pipeline checks these -links and reports missing associations. +Each requirement is tracked as an issue or entry in `requirements.json`. Whenever +you introduce a new feature or fix, add a new requirement or update an existing +ID in `requirements.json` accordingly. Every code change must reference the +requirement it addresses, and each requirement must be covered by at least one +automated test. + +Embed the relevant requirement ID in new test cases; the testing framework +parses these annotations when generating the traceability report. + +During code reviews, missing requirement IDs or missing tests for a change are +must-fix issues. The CI pipeline checks these links and reports missing +associations. ## Commit Messages -Each commit should reference at least one requirement ID defined in `requirements.json` (for example, `REQ-001`). Pull requests are automatically checked for this convention. +Each commit should reference at least one requirement ID defined in `requirements.json` (for example, `REQ-001`). Pull requests lacking requirement references or associated tests must be updated before merging. diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index f6a3ece9..44283f7e 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 13.14 | 100.00 | -| linux | 53 | 0 | 0 | 13.14 | 100.00 | +| overall | 53 | 0 | 0 | 19.10 | 100.00 | +| linux | 53 | 0 | 0 | 19.10 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 3cc29872..c7bdc379 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 13.14 | 100.00 | -| linux | 53 | 0 | 0 | 13.14 | 100.00 | +| overall | 53 | 0 | 0 | 19.10 | 100.00 | +| linux | 53 | 0 | 0 | 19.10 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 9b3cca58..551379fc 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.015 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | #### REQ-026 (100% passed) @@ -34,83 +34,83 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.003 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.002 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | | Unmapped | associates-classname-with-requirement | Passed | 0.019 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.004 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.011 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.874 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.009 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.196 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.004 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.788 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.689 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.909 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.756 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.813 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.015 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.972 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.236 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.196 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.406 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.105 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.262 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.004 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.015 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.024 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.344 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.005 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.648 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.647 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.618 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.934 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.861 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.962 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.014 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.922 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.361 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.935 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.336 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.614 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.859 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.852 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.081 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.802 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.145 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.444 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.346 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 423faf70..1068a5a0 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.009869, + "duration": 0.010654, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.015337, + "duration": 0.002258, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.005175, + "duration": 0.00565, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001316, + "duration": 0.001244, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.000979, + "duration": 0.00091, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.003578, + "duration": 0.001612, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001392, + "duration": 0.001559, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001158, + "duration": 0.003239, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.002022, + "duration": 0.000726, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.001525, + "duration": 0.000549, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.000997, + "duration": 0.001895, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.018877, + "duration": 0.018942, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.000926, + "duration": 0.001637, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.000724, + "duration": 0.002179, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000732, + "duration": 0.000572, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.005909, + "duration": 0.009305, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.004333, + "duration": 0.007855, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.011202, + "duration": 0.009939, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000198, + "duration": 0.000858, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.002179, + "duration": 0.004349, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.873706, + "duration": 1.196136, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001514, + "duration": 0.003923, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000146, + "duration": 0.000209, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.787538, + "duration": 1.236475, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.688735, + "duration": 1.195666, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 0.908898, + "duration": 1.406053, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.755718, + "duration": 1.104866, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.812665, + "duration": 1.261696, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000356, + "duration": 0.000555, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000221, + "duration": 0.00433, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.001688, + "duration": 0.015097, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000424, + "duration": 0.000839, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.014794, + "duration": 0.023741, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 0.971555, + "duration": 1.34373, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.001799, + "duration": 0.004553, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000507, + "duration": 0.000483, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000686, + "duration": 0.000842, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.648048, + "duration": 0.861237, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.646948, + "duration": 0.961907, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.020004, + "duration": 0.015092, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.011995, + "duration": 0.014363, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.617919, + "duration": 0.9219, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.933509, + "duration": 1.361361, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000288, + "duration": 0.000444, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 0.934641, + "duration": 1.335721, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.00028, + "duration": 0.000486, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000611, + "duration": 0.001717, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.614415, + "duration": 0.802157, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.85877, + "duration": 1.145154, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.851625, + "duration": 1.444261, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.00663, + "duration": 0.004997, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.001583, + "duration": 0.002732, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.081413, + "duration": 1.346136, "requirements": [], "os": "linux" } @@ -576,7 +576,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 13.138056999999996, + "duration": 19.104791000000002, "rate": 100 }, "byOs": { @@ -584,7 +584,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 13.138056999999996, + "duration": 19.104791000000002, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 9b3cca58..551379fc 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.015 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | #### REQ-026 (100% passed) @@ -34,83 +34,83 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.003 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.002 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | | Unmapped | associates-classname-with-requirement | Passed | 0.019 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.004 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.011 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.874 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.009 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.196 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.004 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.788 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.689 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.909 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.756 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.813 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.015 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.972 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.236 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.196 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.406 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.105 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.262 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.004 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.015 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.024 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.344 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.005 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.648 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.647 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.618 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.934 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.861 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.962 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.014 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.922 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.361 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.935 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.336 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.614 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.859 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.852 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.081 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.802 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.145 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.444 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.346 | | |
\ No newline at end of file diff --git a/docs/contributing-docs.md b/docs/contributing-docs.md index d1e37d2e..afbcc7c4 100644 --- a/docs/contributing-docs.md +++ b/docs/contributing-docs.md @@ -67,13 +67,13 @@ Commit `test-results/*` and `artifacts/linux/*` along with your source changes. ### Pester properties -Pester tests should record traceability metadata by adding `Add-TestResult -Property` calls in each `It` block. At minimum, include an `Owner` and an `Evidence` path: +Pester tests should record traceability metadata by adding `Add-TestResult -Property` calls in each `It` block. At minimum, include an `Owner`, a `Requirement` ID, and an `Evidence` path so the framework can link tests back to requirements: ```powershell -It "does something" { - Add-TestResult -Property @{ Owner = 'DevTools'; Evidence = 'tests/pester/example.Tests.ps1' } +It "[REQ-123] does something" { + Add-TestResult -Property @{ Owner = 'DevTools'; Requirement = 'REQ-123'; Evidence = 'tests/pester/example.Tests.ps1' } # test body } ``` -These properties are preferred over naming conventions when `scripts/generate-ci-summary.ts` builds the CI report. +For other test frameworks, prefix the test name with `[REQ-123]` or use an equivalent mechanism to embed the requirement ID. These properties are preferred over naming conventions when `scripts/generate-ci-summary.ts` builds the CI report. diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index e9bb9f05..e6859e73 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From 564c7dbb4591604af79ae27401591dad52d33da5 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 22:22:50 -0700 Subject: [PATCH 54/73] chore: release v2.0.0 --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 90 +++++++++---------- artifacts/linux/traceability.json | 110 +++++++++++------------ artifacts/linux/traceability.md | 90 +++++++++---------- release.json | 4 +- test-results/node-junit.xml | 108 +++++++++++----------- 7 files changed, 205 insertions(+), 205 deletions(-) diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 44283f7e..fbe93e67 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 19.10 | 100.00 | -| linux | 53 | 0 | 0 | 19.10 | 100.00 | +| overall | 53 | 0 | 0 | 14.30 | 100.00 | +| linux | 53 | 0 | 0 | 14.30 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index c7bdc379..71e651de 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 19.10 | 100.00 | -| linux | 53 | 0 | 0 | 19.10 | 100.00 | +| overall | 53 | 0 | 0 | 14.30 | 100.00 | +| linux | 53 | 0 | 0 | 14.30 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 551379fc..a9200494 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | #### REQ-026 (100% passed) @@ -40,13 +40,13 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.003 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) @@ -58,59 +58,59 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.019 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.009 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.196 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.004 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.003 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.006 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.874 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.236 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.196 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.406 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.105 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.262 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.004 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.015 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.024 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.344 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.005 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.921 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.842 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.987 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.851 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.890 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.025 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.983 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.861 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.962 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.014 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.922 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.361 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.673 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.674 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.006 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.653 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.991 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.336 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.026 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.002 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.802 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.145 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.444 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.346 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.618 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.949 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.047 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.008 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.202 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 1068a5a0..8296c14c 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.010654, + "duration": 0.007404, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.002258, + "duration": 0.003283, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.00565, + "duration": 0.004481, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001244, + "duration": 0.001119, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.00091, + "duration": 0.001379, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.001612, + "duration": 0.002495, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001559, + "duration": 0.000935, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.003239, + "duration": 0.001095, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.000726, + "duration": 0.000633, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000549, + "duration": 0.000485, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001895, + "duration": 0.001205, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.018942, + "duration": 0.013626, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.001637, + "duration": 0.00115, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.002179, + "duration": 0.000817, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000572, + "duration": 0.000471, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.009305, + "duration": 0.003243, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.007855, + "duration": 0.005827, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.009939, + "duration": 0.007478, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000858, + "duration": 0.000243, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.004349, + "duration": 0.002607, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 1.196136, + "duration": 0.873548, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.003923, + "duration": 0.001006, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000209, + "duration": 0.00025, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.236475, + "duration": 0.920763, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 1.195666, + "duration": 0.841711, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.406053, + "duration": 0.987486, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.104866, + "duration": 0.850955, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 1.261696, + "duration": 0.890402, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000555, + "duration": 0.000379, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.00433, + "duration": 0.000264, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.015097, + "duration": 0.002916, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000839, + "duration": 0.000483, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.023741, + "duration": 0.024922, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.34373, + "duration": 0.982954, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.004553, + "duration": 0.001338, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000483, + "duration": 0.000592, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000842, + "duration": 0.00052, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.861237, + "duration": 0.673491, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.961907, + "duration": 0.673576, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.015092, + "duration": 0.011667, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.014363, + "duration": 0.005801, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.9219, + "duration": 0.652577, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.361361, + "duration": 0.991048, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000444, + "duration": 0.000349, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.335721, + "duration": 1.025666, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000486, + "duration": 0.000282, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001717, + "duration": 0.000542, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.802157, + "duration": 0.618098, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 1.145154, + "duration": 0.948939, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.444261, + "duration": 1.047343, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.004997, + "duration": 0.007846, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.002732, + "duration": 0.003823, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.346136, + "duration": 1.202261, "requirements": [], "os": "linux" } @@ -576,7 +576,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 19.104791000000002, + "duration": 14.303773999999999, "rate": 100 }, "byOs": { @@ -584,7 +584,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 19.104791000000002, + "duration": 14.303773999999999, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 551379fc..a9200494 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | #### REQ-026 (100% passed) @@ -40,13 +40,13 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.003 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) @@ -58,59 +58,59 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.019 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.009 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.196 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.004 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.003 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.006 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.874 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.236 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.196 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.406 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.105 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.262 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.001 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.004 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.015 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.024 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.344 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.005 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.921 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.842 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.987 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.851 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.890 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.025 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.983 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.861 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.962 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.014 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.922 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.361 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.673 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.674 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.006 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.653 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.991 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.336 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.026 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.002 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.802 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.145 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.444 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.346 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.618 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.949 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.047 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.008 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.202 | | |
\ No newline at end of file diff --git a/release.json b/release.json index d9954dbd..808712ca 100644 --- a/release.json +++ b/release.json @@ -1,6 +1,6 @@ { - "major": 1, + "major": 2, "minor": 0, "patch": 0, - "title": "Initial release" + "title": "Launch" } diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index e6859e73..e3414253 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From 1cb05fc1e626f5fe4e7d46854a39fdbad8af822f Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 22:38:57 -0700 Subject: [PATCH 55/73] chore: remove requirement ID workflow and document manual check (REQ-004) --- .github/workflows/requirement-id-check.yml | 15 --- AGENTS.md | 1 + test-results/node-junit.xml | 108 ++++++++++----------- 3 files changed, 55 insertions(+), 69 deletions(-) delete mode 100644 .github/workflows/requirement-id-check.yml diff --git a/.github/workflows/requirement-id-check.yml b/.github/workflows/requirement-id-check.yml deleted file mode 100644 index 7dca9a4c..00000000 --- a/.github/workflows/requirement-id-check.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: requirement-id-check - -on: - pull_request: - types: [opened, synchronize, reopened] - -jobs: - requirement-id: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - with: - fetch-depth: 0 - - name: Ensure commits reference requirement IDs - run: scripts/check-commit-requirements.sh "${{ github.event.pull_request.base.sha }}" diff --git a/AGENTS.md b/AGENTS.md index 03a16bed..11c6f7ee 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -35,6 +35,7 @@ - Run `npm run lint:md` to lint Markdown files. - Run `npx --yes linkinator README.md docs scripts --config linkinator.config.json` to verify links and ensure failures are visible. - Run `actionlint` to validate GitHub Actions workflows. +- Run `scripts/check-commit-requirements.sh ` to verify that recent commits include requirement IDs from `requirements.json`. Run this script after committing to ensure each commit message contains at least one requirement ID. - Run `npm run check:traceability` to validate generated artifacts. - Commit `test-results/*` and `artifacts/linux/*` along with source changes. diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index e3414253..896f765e 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From 301d8f75ed9edcc0210216f98065c83b144513aa Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 23:00:47 -0700 Subject: [PATCH 56/73] chore: prepare release v2.1 REQ-001 (#106) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 86 +++++++++--------- artifacts/linux/traceability.json | 110 +++++++++++------------ artifacts/linux/traceability.md | 86 +++++++++--------- release.json | 4 +- test-results/node-junit.xml | 108 +++++++++++----------- 7 files changed, 201 insertions(+), 201 deletions(-) diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index fbe93e67..9489cf94 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 14.30 | 100.00 | -| linux | 53 | 0 | 0 | 14.30 | 100.00 | +| overall | 53 | 0 | 0 | 21.68 | 100.00 | +| linux | 53 | 0 | 0 | 21.68 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 71e651de..da35c8f3 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 14.30 | 100.00 | -| linux | 53 | 0 | 0 | 14.30 | 100.00 | +| overall | 53 | 0 | 0 | 21.68 | 100.00 | +| linux | 53 | 0 | 0 | 21.68 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index a9200494..d00c7ae7 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,7 +4,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | #### REQ-024 (100% passed) @@ -16,13 +16,13 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.002 | | | #### REQ-027 (100% passed) @@ -34,83 +34,83 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.002 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.003 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.006 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.016 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.005 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.018 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.015 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.033 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.874 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.430 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.921 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.842 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.987 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.851 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.890 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.469 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.290 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.463 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.278 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.393 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.025 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.983 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.038 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.585 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.004 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.673 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.674 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.006 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.653 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.991 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.987 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.144 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.013 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.018 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.127 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.290 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.026 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.563 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.618 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.949 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.047 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.008 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.202 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.990 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.344 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.431 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.006 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.667 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 8296c14c..95d5b3cd 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.007404, + "duration": 0.010882, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.003283, + "duration": 0.002977, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.004481, + "duration": 0.006175, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001119, + "duration": 0.001719, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.001379, + "duration": 0.001302, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.002495, + "duration": 0.003358, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.000935, + "duration": 0.002367, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001095, + "duration": 0.001772, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.000633, + "duration": 0.001575, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000485, + "duration": 0.00121, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001205, + "duration": 0.003422, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.013626, + "duration": 0.016381, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.00115, + "duration": 0.002063, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.000817, + "duration": 0.001804, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000471, + "duration": 0.004705, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.003243, + "duration": 0.018374, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.005827, + "duration": 0.014811, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.007478, + "duration": 0.03297, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000243, + "duration": 0.000329, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.002607, + "duration": 0.004749, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.873548, + "duration": 1.429901, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001006, + "duration": 0.00229, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.00025, + "duration": 0.000361, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.920763, + "duration": 1.468834, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.841711, + "duration": 1.289741, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 0.987486, + "duration": 1.462719, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.850955, + "duration": 1.278351, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.890402, + "duration": 1.392509, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000379, + "duration": 0.000364, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000264, + "duration": 0.000297, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.002916, + "duration": 0.002436, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000483, + "duration": 0.000581, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.024922, + "duration": 0.037991, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 0.982954, + "duration": 1.58502, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.001338, + "duration": 0.003823, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000592, + "duration": 0.000765, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.00052, + "duration": 0.000687, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.673491, + "duration": 0.986726, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.673576, + "duration": 1.144369, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.011667, + "duration": 0.013216, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.005801, + "duration": 0.017819, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.652577, + "duration": 1.126762, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.991048, + "duration": 1.290195, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000349, + "duration": 0.000437, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.025666, + "duration": 1.563471, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000282, + "duration": 0.000413, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000542, + "duration": 0.000453, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.618098, + "duration": 0.989922, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.948939, + "duration": 1.343926, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.047343, + "duration": 1.430747, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.007846, + "duration": 0.007352, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.003823, + "duration": 0.005843, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.202261, + "duration": 1.666957, "requirements": [], "os": "linux" } @@ -576,7 +576,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 14.303773999999999, + "duration": 21.678223, "rate": 100 }, "byOs": { @@ -584,7 +584,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 14.303773999999999, + "duration": 21.678223, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index a9200494..d00c7ae7 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,7 +4,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | #### REQ-024 (100% passed) @@ -16,13 +16,13 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.002 | | | #### REQ-027 (100% passed) @@ -34,83 +34,83 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.002 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.003 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.006 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.007 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.016 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.005 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.018 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.015 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.033 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.874 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.430 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.921 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.842 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.987 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.851 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.890 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.469 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.290 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.463 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.278 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.393 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.025 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.983 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.038 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.585 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.004 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.673 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.674 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.012 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.006 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.653 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.991 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.987 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.144 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.013 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.018 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.127 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.290 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.026 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.563 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.618 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.949 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.047 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.008 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.202 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.990 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.344 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.431 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.006 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.667 | | |
\ No newline at end of file diff --git a/release.json b/release.json index 808712ca..45707ee9 100644 --- a/release.json +++ b/release.json @@ -1,6 +1,6 @@ { "major": 2, - "minor": 0, + "minor": 1, "patch": 0, - "title": "Launch" + "title": "v2.1" } diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 896f765e..6fb33d81 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From 8c969bb2fe2a8659bad0e8b4577aeda884bcb28a Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 23:39:49 -0700 Subject: [PATCH 57/73] ci: delete npm proxy settings before install (REQ-001) (#109) --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 19cf0882..c07d12e4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,6 +34,8 @@ jobs: - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: 24 + - run: npm config delete proxy + - run: npm config delete https-proxy - run: npm install - run: npm run link:check - run: npm run derive:registry From badc2afd8e0e19ac232f4e44c7170c08082e4b05 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Tue, 19 Aug 2025 23:46:33 -0700 Subject: [PATCH 58/73] ci: use Node 22 in workflows (REQ-001) (#110) --- .github/workflows/ci.yml | 4 +- .github/workflows/publish-traceability.yml | 2 +- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-matrix.md | 16 +++ artifacts/linux/traceability-standard.md | 90 ++++++++--------- artifacts/linux/traceability.json | 110 ++++++++++----------- artifacts/linux/traceability.md | 90 ++++++++--------- test-results/node-junit.xml | 108 ++++++++++---------- 9 files changed, 222 insertions(+), 206 deletions(-) create mode 100644 artifacts/linux/traceability-matrix.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c07d12e4..ff34bb29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: - node-version: 24 + node-version: 22 - run: npm config delete proxy - run: npm config delete https-proxy - run: npm install @@ -115,7 +115,7 @@ jobs: - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: - node-version: 24 + node-version: 22 - run: npm run check:node - run: npm install - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 diff --git a/.github/workflows/publish-traceability.yml b/.github/workflows/publish-traceability.yml index 4881d57f..0955ce76 100644 --- a/.github/workflows/publish-traceability.yml +++ b/.github/workflows/publish-traceability.yml @@ -25,7 +25,7 @@ jobs: path: artifacts/linux - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: - node-version: 24 + node-version: 22 - run: npm install - run: npx tsx scripts/generate-traceability-badge.ts - uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 9489cf94..c2e968da 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 21.68 | 100.00 | -| linux | 53 | 0 | 0 | 21.68 | 100.00 | +| overall | 53 | 0 | 0 | 13.12 | 100.00 | +| linux | 53 | 0 | 0 | 13.12 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index da35c8f3..15bbf45b 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 21.68 | 100.00 | -| linux | 53 | 0 | 0 | 21.68 | 100.00 | +| overall | 53 | 0 | 0 | 13.12 | 100.00 | +| linux | 53 | 0 | 0 | 13.12 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-matrix.md b/artifacts/linux/traceability-matrix.md new file mode 100644 index 00000000..3aad6dee --- /dev/null +++ b/artifacts/linux/traceability-matrix.md @@ -0,0 +1,16 @@ +### Requirement Traceability Matrix + +| Requirement | Description | Commits | Tests | +| --- | --- | --- | --- | +| REQ-023 | Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases. | 6e923b3 | parses-nested-junit-structures (Passed) | +| REQ-024 | Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting. | | captures-root-testsuites-attributes (Passed) | +| REQ-025 | Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time. | | captures-testsuite-attributes (Passed) | +| REQ-026 | Suite properties are extracted as name/value pairs for environment details. | | captures-suite-properties (Passed) | +| REQ-027 | Testcase attributes name, status, classname, assertions, time, and any skip message are preserved. | | captures-testcase-attributes-and-skipped-message (Passed) | +| REQ-028 | Requirement identifiers embedded in testcase names are detected and associated with the test. | | extracts-requirement-identifiers (Passed) | +| REQ-029 | Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases. | | aggregates-status-by-requirement-and-suite (Passed) | +| REQ-030 | Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons. | 574e9a7 | builds-traceability-matrix-with-skipped-reasons (Passed) | +| REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | validates-missing-fields (Passed) | +| REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | preserves-unknown-attributes (Passed) | +| REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | 9162fea | throws-error-for-malformed-xml (Passed) | +| Unmapped | | | associates-classname-with-requirement (Passed)
buildissuebranchname-formats-branch-name (Passed)
buildissuebranchname-rejects-non-numeric-input (Passed)
buildsummary-splits-totals-by-os (Passed)
collecttestcases-captures-requirement-property (Passed)
collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan (Passed)
collecttestcases-uses-machine-name-property-for-owner (Passed)
computestatuscounts-tallies-test-statuses (Passed)
dispatchers-and-parameters-include-descriptions (Passed)
errors-when-strict-unmapped-mode-enabled (Passed)
escapemarkdown-escapes-special-characters (Passed)
escapemarkdown-leaves-plain-text-untouched (Passed)
fails-when-commit-lacks-requirement-reference (Passed)
fails-when-no-junit-files-are-found (Passed)
fails-when-requirement-lacks-test-coverage (Passed)
fails-when-tests-are-unmapped (Passed)
fails-when-tests-reference-unknown-requirements (Passed)
formaterror-handles-plain-objects (Passed)
formaterror-handles-primitives (Passed)
formaterror-handles-real-error-objects (Passed)
formaterror-handles-unstringifiable-values (Passed)
generate-ci-summary-features (Passed)
groups-owners-and-includes-requirements-and-evidence (Passed)
grouptomarkdown-omits-numeric-identifiers (Passed)
grouptomarkdown-supports-optional-limit-for-truncation (Passed)
handles-root-level-testcases (Passed)
handles-zipped-junit-artifacts (Passed)
ignores-stale-junit-files-outside-artifacts-path (Passed)
loadrequirements-logs-warning-on-invalid-json (Passed)
loadrequirements-warns-and-skips-invalid-entries (Passed)
partitions-requirement-groups-by-runner\_type (Passed)
passes-with-coverage-and-requirement-reference (Passed)
requirementssummarytomarkdown-escapes-pipes-in-description (Passed)
skips-invalid-junit-files-and-still-generates-summary (Passed)
summarytomarkdown-handles-no-tests (Passed)
summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters (Passed)
throws-when-no-junit-files-found-and-strict-mode-enabled (Passed)
uses-latest-artifact-directory-when-multiple-are-present (Passed)
warns-when-all-tests-are-unmapped (Passed)
writeerrorsummary-appends-error-details-to-summary-file (Passed)
writeerrorsummary-skips-summary-file-for-non-error-throws (Passed)
writes-outputs-to-os-specific-directory (Passed) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index d00c7ae7..b4570c6c 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -10,19 +10,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.002 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) @@ -34,83 +34,83 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.002 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.016 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.005 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.018 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.015 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.033 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.430 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.790 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.469 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.290 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.463 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.278 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.393 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.932 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.719 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.951 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.715 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.732 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.038 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.585 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.004 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.987 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.144 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.013 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.018 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.127 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.290 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.001 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.028 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.024 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.599 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.608 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.605 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.855 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.563 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.990 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.344 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.431 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.006 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.667 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.990 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.002 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.554 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.826 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.902 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.004 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.010 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.194 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 95d5b3cd..4d1d2e90 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.010882, + "duration": 0.010755, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.002977, + "duration": 0.002216, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.006175, + "duration": 0.004175, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001719, + "duration": 0.001226, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.001302, + "duration": 0.00103, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.003358, + "duration": 0.001918, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.002367, + "duration": 0.000868, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001772, + "duration": 0.001232, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.001575, + "duration": 0.000927, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.00121, + "duration": 0.000431, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.003422, + "duration": 0.001136, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.016381, + "duration": 0.011155, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.002063, + "duration": 0.001078, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001804, + "duration": 0.002202, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.004705, + "duration": 0.000372, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.018374, + "duration": 0.010242, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.014811, + "duration": 0.00505, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.03297, + "duration": 0.003827, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000329, + "duration": 0.000124, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.004749, + "duration": 0.003522, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 1.429901, + "duration": 0.789602, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.00229, + "duration": 0.001688, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000361, + "duration": 0.000368, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.468834, + "duration": 0.931927, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 1.289741, + "duration": 0.71893, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.462719, + "duration": 0.951202, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.278351, + "duration": 0.714522, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 1.392509, + "duration": 0.731856, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000364, + "duration": 0.000398, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000297, + "duration": 0.000863, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.002436, + "duration": 0.001448, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000581, + "duration": 0.000328, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.037991, + "duration": 0.027973, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.58502, + "duration": 1.02414, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.003823, + "duration": 0.000857, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000765, + "duration": 0.000211, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000687, + "duration": 0.000363, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.986726, + "duration": 0.599006, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 1.144369, + "duration": 0.608476, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.013216, + "duration": 0.005638, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.017819, + "duration": 0.00173, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 1.126762, + "duration": 0.604866, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.290195, + "duration": 0.855243, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000437, + "duration": 0.000151, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.563471, + "duration": 0.989587, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000413, + "duration": 0.001607, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000453, + "duration": 0.000863, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.989922, + "duration": 0.55395, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 1.343926, + "duration": 0.82557, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.430747, + "duration": 0.901581, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.007352, + "duration": 0.004081, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.005843, + "duration": 0.009655, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.666957, + "duration": 1.194424, "requirements": [], "os": "linux" } @@ -576,7 +576,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 21.678223, + "duration": 13.116590000000002, "rate": 100 }, "byOs": { @@ -584,7 +584,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 21.678223, + "duration": 13.116590000000002, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index d00c7ae7..b4570c6c 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -10,19 +10,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.002 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) @@ -34,83 +34,83 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.002 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.016 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.005 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.018 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.015 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.033 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.430 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.790 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.469 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 1.290 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.463 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.278 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.393 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.932 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.719 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.951 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.715 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.732 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.038 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.585 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.004 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.987 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.144 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.013 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.018 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.127 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.290 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.001 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.028 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.024 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.599 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.608 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.605 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.855 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.563 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.990 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.344 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.431 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.006 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.667 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.990 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.002 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.554 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.826 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.902 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.004 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.010 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.194 | | |
\ No newline at end of file diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 6fb33d81..7a6c4919 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From 74b8e527f1d8763d46f15aca158932341d9ba4a9 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 00:01:40 -0700 Subject: [PATCH 59/73] chore: remove proxy configuration (REQ-001) --- .npmrc | 2 - test-results/node-junit.xml | 108 ++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 56 deletions(-) delete mode 100644 .npmrc diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 0b9a7e0d..00000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -proxy=http://proxy:8080 -https-proxy=http://proxy:8080 diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 7a6c4919..91667c9b 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From e9bcdbf1fd32b7d773db965bc3727213beccc43e Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 00:16:30 -0700 Subject: [PATCH 60/73] chore: remove stale traceability matrix (REQ-023) (#113) --- CONTRIBUTING.md | 4 +- README.md | 4 +- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-matrix.md | 16 ---- artifacts/linux/traceability-standard.md | 84 ++++++++--------- artifacts/linux/traceability.json | 110 +++++++++++------------ artifacts/linux/traceability.md | 84 ++++++++--------- scripts/generate-ci-summary.ts | 2 +- test-results/node-junit.xml | 108 +++++++++++----------- 10 files changed, 204 insertions(+), 216 deletions(-) delete mode 100644 artifacts/linux/traceability-matrix.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4ef4e16e..6ba8b4c7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,10 +6,12 @@ Contributions of all kinds are welcome. Ensure you have Node.js 24 or newer inst npm install npm run test:ci npm run derive:registry -TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary +RUNNER_OS=Linux TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary npm run check:traceability ``` +When running locally, set `RUNNER_OS` (for example, `RUNNER_OS=Linux`) before invoking `npm run generate:summary`. + `npm run test:ci` writes JUnit files to `test-results/`. Commit `test-results/*` and `artifacts/linux/*` along with your source changes. For documentation updates, follow the [documentation contribution guidelines](docs/contributing-docs.md). Run the following to lint Markdown files and verify links before submitting a pull request: diff --git a/README.md b/README.md index 025b4750..ac500e72 100644 --- a/README.md +++ b/README.md @@ -112,10 +112,12 @@ Run the JavaScript tests and generate traceability artifacts with: npm install npm run test:ci npm run derive:registry -TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary +RUNNER_OS=Linux TEST_RESULTS_GLOBS='test-results/*junit*.xml' npm run generate:summary npm run check:traceability ``` +When running locally, set `RUNNER_OS` (for example, `RUNNER_OS=Linux`) before invoking `npm run generate:summary`. + `npm run test:ci` writes JUnit files to `test-results/`. [scripts/generate-ci-summary.ts](scripts/generate-ci-summary.ts) parses these results to build requirement traceability files in OS‑specific subdirectories (e.g., `artifacts/windows`, `artifacts/linux`) based on the `RUNNER_OS` environment variable. Commit `test-results/*` and `artifacts/linux/*` along with your source changes. The summary script searches `artifacts/` by default; set `TEST_RESULTS_GLOBS` if your reports are elsewhere. Pester tests cover the dispatcher and helper modules. See [docs/testing-pester.md](docs/testing-pester.md) for guidelines on using the canonical argument helper and adding new tests. The GitHub runner installs Pester automatically; install it locally only if you plan to run the tests yourself: diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index c2e968da..b8e1ed35 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 13.12 | 100.00 | -| linux | 53 | 0 | 0 | 13.12 | 100.00 | +| overall | 53 | 0 | 0 | 13.80 | 100.00 | +| linux | 53 | 0 | 0 | 13.80 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 15bbf45b..c9566aaa 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 13.12 | 100.00 | -| linux | 53 | 0 | 0 | 13.12 | 100.00 | +| overall | 53 | 0 | 0 | 13.80 | 100.00 | +| linux | 53 | 0 | 0 | 13.80 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-matrix.md b/artifacts/linux/traceability-matrix.md deleted file mode 100644 index 3aad6dee..00000000 --- a/artifacts/linux/traceability-matrix.md +++ /dev/null @@ -1,16 +0,0 @@ -### Requirement Traceability Matrix - -| Requirement | Description | Commits | Tests | -| --- | --- | --- | --- | -| REQ-023 | Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases. | 6e923b3 | parses-nested-junit-structures (Passed) | -| REQ-024 | Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting. | | captures-root-testsuites-attributes (Passed) | -| REQ-025 | Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time. | | captures-testsuite-attributes (Passed) | -| REQ-026 | Suite properties are extracted as name/value pairs for environment details. | | captures-suite-properties (Passed) | -| REQ-027 | Testcase attributes name, status, classname, assertions, time, and any skip message are preserved. | | captures-testcase-attributes-and-skipped-message (Passed) | -| REQ-028 | Requirement identifiers embedded in testcase names are detected and associated with the test. | | extracts-requirement-identifiers (Passed) | -| REQ-029 | Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases. | | aggregates-status-by-requirement-and-suite (Passed) | -| REQ-030 | Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons. | 574e9a7 | builds-traceability-matrix-with-skipped-reasons (Passed) | -| REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | validates-missing-fields (Passed) | -| REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | preserves-unknown-attributes (Passed) | -| REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | 9162fea | throws-error-for-malformed-xml (Passed) | -| Unmapped | | | associates-classname-with-requirement (Passed)
buildissuebranchname-formats-branch-name (Passed)
buildissuebranchname-rejects-non-numeric-input (Passed)
buildsummary-splits-totals-by-os (Passed)
collecttestcases-captures-requirement-property (Passed)
collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan (Passed)
collecttestcases-uses-machine-name-property-for-owner (Passed)
computestatuscounts-tallies-test-statuses (Passed)
dispatchers-and-parameters-include-descriptions (Passed)
errors-when-strict-unmapped-mode-enabled (Passed)
escapemarkdown-escapes-special-characters (Passed)
escapemarkdown-leaves-plain-text-untouched (Passed)
fails-when-commit-lacks-requirement-reference (Passed)
fails-when-no-junit-files-are-found (Passed)
fails-when-requirement-lacks-test-coverage (Passed)
fails-when-tests-are-unmapped (Passed)
fails-when-tests-reference-unknown-requirements (Passed)
formaterror-handles-plain-objects (Passed)
formaterror-handles-primitives (Passed)
formaterror-handles-real-error-objects (Passed)
formaterror-handles-unstringifiable-values (Passed)
generate-ci-summary-features (Passed)
groups-owners-and-includes-requirements-and-evidence (Passed)
grouptomarkdown-omits-numeric-identifiers (Passed)
grouptomarkdown-supports-optional-limit-for-truncation (Passed)
handles-root-level-testcases (Passed)
handles-zipped-junit-artifacts (Passed)
ignores-stale-junit-files-outside-artifacts-path (Passed)
loadrequirements-logs-warning-on-invalid-json (Passed)
loadrequirements-warns-and-skips-invalid-entries (Passed)
partitions-requirement-groups-by-runner\_type (Passed)
passes-with-coverage-and-requirement-reference (Passed)
requirementssummarytomarkdown-escapes-pipes-in-description (Passed)
skips-invalid-junit-files-and-still-generates-summary (Passed)
summarytomarkdown-handles-no-tests (Passed)
summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters (Passed)
throws-when-no-junit-files-found-and-strict-mode-enabled (Passed)
uses-latest-artifact-directory-when-multiple-are-present (Passed)
warns-when-all-tests-are-unmapped (Passed)
writeerrorsummary-appends-error-details-to-summary-file (Passed)
writeerrorsummary-skips-summary-file-for-non-error-throws (Passed)
writes-outputs-to-os-specific-directory (Passed) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index b4570c6c..a39587b7 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.009 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.008 | | | #### REQ-026 (100% passed) @@ -34,13 +34,13 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.001 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.003 | | | #### REQ-030 (100% passed) @@ -52,65 +52,65 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.002 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | | Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.004 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.025 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.790 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.006 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.774 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.932 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.719 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.951 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.715 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.732 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.827 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.829 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.898 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.778 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.784 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.001 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.028 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.024 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.014 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.042 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.599 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.608 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.605 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.855 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.670 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.650 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.018 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.636 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.107 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.990 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.002 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.119 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.554 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.826 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.902 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.004 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.010 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.194 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.592 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.838 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.998 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.099 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 4d1d2e90..5069bfbc 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.010755, + "duration": 0.008968, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.002216, + "duration": 0.001408, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.004175, + "duration": 0.008306, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001226, + "duration": 0.001214, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.00103, + "duration": 0.000968, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.001918, + "duration": 0.001494, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.000868, + "duration": 0.002986, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001232, + "duration": 0.001124, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.000927, + "duration": 0.002088, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000431, + "duration": 0.001914, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001136, + "duration": 0.00277, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.011155, + "duration": 0.011462, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.001078, + "duration": 0.001597, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.002202, + "duration": 0.001139, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000372, + "duration": 0.000557, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.010242, + "duration": 0.004296, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.00505, + "duration": 0.007613, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.003827, + "duration": 0.02512, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000124, + "duration": 0.000251, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.003522, + "duration": 0.006475, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.789602, + "duration": 0.773966, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001688, + "duration": 0.001224, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000368, + "duration": 0.000183, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.931927, + "duration": 0.827186, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.71893, + "duration": 0.828824, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 0.951202, + "duration": 0.898053, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.714522, + "duration": 0.777777, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.731856, + "duration": 0.783701, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000398, + "duration": 0.00032, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000863, + "duration": 0.0006, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.001448, + "duration": 0.002669, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000328, + "duration": 0.000524, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.027973, + "duration": 0.013705, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.02414, + "duration": 1.04224, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.000857, + "duration": 0.001577, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000211, + "duration": 0.000621, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000363, + "duration": 0.000351, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.599006, + "duration": 0.669986, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.608476, + "duration": 0.64982, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.005638, + "duration": 0.017783, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.00173, + "duration": 0.012297, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.604866, + "duration": 0.636056, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.855243, + "duration": 1.107123, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000151, + "duration": 0.000491, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 0.989587, + "duration": 1.119299, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.001607, + "duration": 0.000299, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000863, + "duration": 0.000591, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.55395, + "duration": 0.592186, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.82557, + "duration": 0.838308, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.901581, + "duration": 0.997782, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.004081, + "duration": 0.00889, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.009655, + "duration": 0.004416, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.194424, + "duration": 1.098893, "requirements": [], "os": "linux" } @@ -576,7 +576,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 13.116590000000002, + "duration": 13.799491, "rate": 100 }, "byOs": { @@ -584,7 +584,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 13.116590000000002, + "duration": 13.799491, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index b4570c6c..a39587b7 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.009 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.008 | | | #### REQ-026 (100% passed) @@ -34,13 +34,13 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.001 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.003 | | | #### REQ-030 (100% passed) @@ -52,65 +52,65 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.002 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | | Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.004 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.025 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.790 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.006 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.774 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.932 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.719 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.951 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.715 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.732 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.827 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.829 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.898 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.778 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.784 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.001 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.028 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.024 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.014 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.042 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | | Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.599 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.608 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.605 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.855 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.670 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.650 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.018 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.636 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.107 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.990 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.002 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.119 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.554 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.826 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.902 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.004 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.010 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.194 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.592 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.838 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.998 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.099 | | |
\ No newline at end of file diff --git a/scripts/generate-ci-summary.ts b/scripts/generate-ci-summary.ts index ddf9a7bd..645ed666 100644 --- a/scripts/generate-ci-summary.ts +++ b/scripts/generate-ci-summary.ts @@ -24,7 +24,7 @@ async function main() { const mappingFile = process.env.REQ_MAPPING_FILE || 'requirements.json'; const dispatcherRegistryFile = process.env.DISPATCHER_REGISTRY || 'dispatchers.json'; const evidenceDir = process.env.EVIDENCE_DIR || 'test-screenshots'; - const osType = (process.env.RUNNER_OS ?? 'unknown').toLowerCase(); + const osType = (process.env.RUNNER_OS ?? 'linux').toLowerCase(); let junitFiles: string[] = []; const plural = process.env.TEST_RESULTS_GLOBS; diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 7a6c4919..faa36981 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From 248bf55e2e93924accb10337f63abf00e5716059 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 00:33:55 -0700 Subject: [PATCH 61/73] Generate CI evidence file (REQIE-011) (#114) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 82 ++++++++--------- artifacts/linux/traceability.json | 110 +++++++++++------------ artifacts/linux/traceability.md | 82 ++++++++--------- ci_evidence.txt | 1 + scripts/generate-ci-summary.ts | 19 ++++ test-results/node-junit.xml | 108 +++++++++++----------- 8 files changed, 215 insertions(+), 195 deletions(-) create mode 100644 ci_evidence.txt diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index b8e1ed35..a403c716 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 13.80 | 100.00 | -| linux | 53 | 0 | 0 | 13.80 | 100.00 | +| overall | 53 | 0 | 0 | 10.39 | 100.00 | +| linux | 53 | 0 | 0 | 10.39 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index c9566aaa..62a41c49 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 13.80 | 100.00 | -| linux | 53 | 0 | 0 | 13.80 | 100.00 | +| overall | 53 | 0 | 0 | 10.39 | 100.00 | +| linux | 53 | 0 | 0 | 10.39 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index a39587b7..47f9d860 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.009 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.006 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.008 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.001 | | | #### REQ-026 (100% passed) @@ -34,83 +34,83 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.001 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.003 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.002 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.007 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.003 | | | | Unmapped | collecttestcases-captures-requirement-property | Passed | 0.004 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.025 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.003 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.003 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.006 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.774 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.647 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.827 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.829 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.898 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.778 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.784 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.610 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.580 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.624 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.552 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.567 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.014 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.042 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.011 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.680 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | | Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.670 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.650 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.018 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.636 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.107 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.706 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.685 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.700 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.623 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.119 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.696 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.592 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.838 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.998 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.099 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.585 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.568 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.697 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 0.794 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 5069bfbc..17ff90a2 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.008968, + "duration": 0.005646, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.001408, + "duration": 0.003023, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.008306, + "duration": 0.000749, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001214, + "duration": 0.000839, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.000968, + "duration": 0.000731, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.001494, + "duration": 0.00165, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.002986, + "duration": 0.000859, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001124, + "duration": 0.002425, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.002088, + "duration": 0.001168, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.001914, + "duration": 0.000319, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.00277, + "duration": 0.000802, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.011462, + "duration": 0.007431, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.001597, + "duration": 0.00093, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001139, + "duration": 0.000904, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000557, + "duration": 0.002788, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.004296, + "duration": 0.003964, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.007613, + "duration": 0.002905, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.02512, + "duration": 0.003243, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000251, + "duration": 0.000159, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.006475, + "duration": 0.001715, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.773966, + "duration": 0.646581, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001224, + "duration": 0.001268, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000183, + "duration": 0.000176, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.827186, + "duration": 0.609715, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.828824, + "duration": 0.580007, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 0.898053, + "duration": 0.623853, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.777777, + "duration": 0.552213, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.783701, + "duration": 0.567205, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.00032, + "duration": 0.000266, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.0006, + "duration": 0.000157, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.002669, + "duration": 0.002781, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000524, + "duration": 0.000296, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.013705, + "duration": 0.011002, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.04224, + "duration": 0.680039, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.001577, + "duration": 0.000768, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000621, + "duration": 0.000258, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000351, + "duration": 0.000422, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.669986, + "duration": 0.706051, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.64982, + "duration": 0.685036, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.017783, + "duration": 0.005671, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.012297, + "duration": 0.001624, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.636056, + "duration": 0.700181, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.107123, + "duration": 0.62333, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000491, + "duration": 0.000221, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.119299, + "duration": 0.695725, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000299, + "duration": 0.000171, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000591, + "duration": 0.000364, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.592186, + "duration": 0.584806, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.838308, + "duration": 0.56796, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.997782, + "duration": 0.696729, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.00889, + "duration": 0.005319, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.004416, + "duration": 0.001697, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.098893, + "duration": 0.794109, "requirements": [], "os": "linux" } @@ -576,7 +576,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 13.799491, + "duration": 10.388251, "rate": 100 }, "byOs": { @@ -584,7 +584,7 @@ "passed": 53, "failed": 0, "skipped": 0, - "duration": 13.799491, + "duration": 10.388251, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index a39587b7..47f9d860 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.009 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.006 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.008 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.001 | | | #### REQ-026 (100% passed) @@ -34,83 +34,83 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.001 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.003 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.002 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.007 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.003 | | | | Unmapped | collecttestcases-captures-requirement-property | Passed | 0.004 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.025 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.003 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.003 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.006 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.774 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.647 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.827 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.829 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.898 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.778 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.784 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.610 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.580 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.624 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.552 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.567 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.014 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.042 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.011 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.680 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | | Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.670 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.650 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.018 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.636 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.107 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.706 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.685 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.700 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.623 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.119 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.696 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.592 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.838 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.998 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.009 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.099 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.585 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.568 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.697 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 0.794 | | |
\ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt new file mode 100644 index 00000000..8b9df7fb --- /dev/null +++ b/ci_evidence.txt @@ -0,0 +1 @@ +{"pipeline":"Unknown","git_sha":"68edd62ba773e0368efdb9cb82676172034aee1b","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/scripts/generate-ci-summary.ts b/scripts/generate-ci-summary.ts index 645ed666..689fddbf 100644 --- a/scripts/generate-ci-summary.ts +++ b/scripts/generate-ci-summary.ts @@ -7,12 +7,14 @@ import { pathToFileURL } from 'url'; import { glob } from 'glob'; import AdmZip from 'adm-zip'; import { writeErrorSummary } from './error-handler.ts'; +import { execSync } from 'child_process'; import { buildSummary, summaryToMarkdown, requirementsSummaryToMarkdown, requirementTestsToMarkdown, groupToMarkdown, + computeStatusCounts, TestCase, RequirementGroup, } from './summary/index.ts'; @@ -136,6 +138,23 @@ async function main() { ); } + const gitSha = + process.env.GITHUB_SHA || execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim(); + const reqStatus: Record = {}; + for (const g of groups) { + if (g.id === 'Unmapped') continue; + const { failed, total } = computeStatusCounts(g.tests); + reqStatus[g.id] = failed > 0 || total === 0 ? 'FAIL' : 'PASS'; + } + const evidence = { + pipeline: process.env.PIPELINE_NAME || 'Unknown', + git_sha: gitSha, + req_status: reqStatus, + }; + const evidenceStr = JSON.stringify(evidence); + await fs.writeFile('ci_evidence.txt', evidenceStr); + console.log(`CI_EVIDENCE=${evidenceStr}`); + try { await fs.access(evidenceDir, fsConstants.R_OK); await fs.cp(evidenceDir, path.join(outDir, 'evidence'), { recursive: true }); diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index faa36981..4cbc9cd3 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +60,5 @@ - + From a6e42fa82af6e56070a20c64a027e65420ca6e1f Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 01:03:09 -0700 Subject: [PATCH 62/73] REQIE-005: Add downloaded artifact glob for Pester JUnit (#117) --- artifacts/linux/requirements-summary.md | 3 +- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 6 +- artifacts/linux/traceability-standard.md | 69 +++++----- artifacts/linux/traceability.json | 123 ++++++++++-------- artifacts/linux/traceability.md | 69 +++++----- ci_evidence.txt | 2 +- .../pester-junit.xml | 20 +++ .../print-pester-traceability.test.js | 8 ++ scripts/print-pester-traceability.ts | 4 +- test-results/node-junit.xml | 113 ++++++++-------- 11 files changed, 232 insertions(+), 189 deletions(-) create mode 100644 scripts/__tests__/fixtures/downloaded-only/downloaded-artifacts/test-results-pester-sample/pester-junit.xml diff --git a/artifacts/linux/requirements-summary.md b/artifacts/linux/requirements-summary.md index 62282de2..2a273bac 100644 --- a/artifacts/linux/requirements-summary.md +++ b/artifacts/linux/requirements-summary.md @@ -12,7 +12,7 @@ | REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | 1 | 1 | 0 | 0 | 100.00 | | REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | 1 | 1 | 0 | 0 | 100.00 | | REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | | 1 | 1 | 0 | 0 | 100.00 | -| Unmapped | | | 42 | 42 | 0 | 0 | 100.00 | +| Unmapped | | | 43 | 43 | 0 | 0 | 100.00 | ### Requirement Testcases | Requirement ID | Test ID | Status | @@ -36,6 +36,7 @@ | Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | +| Unmapped | detects-downloaded-artifacts-path | Passed | | Unmapped | dispatchers-and-parameters-include-descriptions | Passed | | Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | | Unmapped | escapemarkdown-escapes-special-characters | Passed | diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index a403c716..d09d2a7e 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 10.39 | 100.00 | -| linux | 53 | 0 | 0 | 10.39 | 100.00 | +| overall | 54 | 0 | 0 | 15.61 | 100.00 | +| linux | 54 | 0 | 0 | 15.61 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 62a41c49..c3eb43d1 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 53 | 0 | 0 | 10.39 | 100.00 | -| linux | 53 | 0 | 0 | 10.39 | 100.00 | +| overall | 54 | 0 | 0 | 15.61 | 100.00 | +| linux | 54 | 0 | 0 | 15.61 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | @@ -18,6 +18,6 @@ | REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | 1 | 1 | 0 | 0 | 100.00 | | REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | 1 | 1 | 0 | 0 | 100.00 | | REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | | 1 | 1 | 0 | 0 | 100.00 | -| Unmapped | | | 42 | 42 | 0 | 0 | 100.00 | +| Unmapped | | | 43 | 43 | 0 | 0 | 100.00 | _For detailed per-test information, see [traceability.md](traceability.md)._ \ No newline at end of file diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 47f9d860..404d3357 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.006 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.001 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | #### REQ-026 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) @@ -70,47 +70,48 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.007 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.012 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.003 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.004 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.003 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.003 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.009 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.896 | | | | Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.647 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.888 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.610 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.580 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.624 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.552 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.567 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.018 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.878 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.001 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.881 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.873 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.011 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.680 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.016 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.072 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.706 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.685 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.691 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.818 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.003 | | | | Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.700 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.623 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.922 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.696 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.122 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.585 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.568 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.697 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 0.794 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.641 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.818 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.005 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.267 | | | \ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 17ff90a2..6608f4b8 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.005646, + "duration": 0.00699, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.003023, + "duration": 0.001463, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.000749, + "duration": 0.005435, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.000839, + "duration": 0.001169, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.000731, + "duration": 0.001039, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.00165, + "duration": 0.001777, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.000859, + "duration": 0.000872, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.002425, + "duration": 0.001006, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.001168, + "duration": 0.000503, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000319, + "duration": 0.000402, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.000802, + "duration": 0.001191, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.007431, + "duration": 0.012211, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.00093, + "duration": 0.000942, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.000904, + "duration": 0.001939, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.002788, + "duration": 0.000367, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.003964, + "duration": 0.009314, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.002905, + "duration": 0.009662, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.003243, + "duration": 0.004395, "requirements": [], "os": "linux" }, @@ -258,7 +258,16 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000159, + "duration": 0.000718, + "requirements": [], + "os": "linux" + }, + { + "id": "detects-downloaded-artifacts-path", + "name": "detects downloaded artifacts path", + "className": "test", + "status": "Passed", + "duration": 0.895611, "requirements": [], "os": "linux" }, @@ -267,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.001715, + "duration": 0.002389, "requirements": [], "os": "linux" }, @@ -276,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.646581, + "duration": 0.887892, "requirements": [], "os": "linux" }, @@ -285,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001268, + "duration": 0.001043, "requirements": [], "os": "linux" }, @@ -294,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000176, + "duration": 0.000185, "requirements": [], "os": "linux" }, @@ -303,7 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.609715, + "duration": 1.018081, "requirements": [], "os": "linux" }, @@ -312,7 +321,7 @@ "name": "fails when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.580007, + "duration": 0.878337, "requirements": [], "os": "linux" }, @@ -321,7 +330,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 0.623853, + "duration": 1.000952, "requirements": [], "os": "linux" }, @@ -330,7 +339,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.552213, + "duration": 0.880797, "requirements": [], "os": "linux" }, @@ -339,7 +348,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.567205, + "duration": 0.872653, "requirements": [], "os": "linux" }, @@ -348,7 +357,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000266, + "duration": 0.000265, "requirements": [], "os": "linux" }, @@ -357,7 +366,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000157, + "duration": 0.000258, "requirements": [], "os": "linux" }, @@ -366,7 +375,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.002781, + "duration": 0.002521, "requirements": [], "os": "linux" }, @@ -375,7 +384,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000296, + "duration": 0.000753, "requirements": [], "os": "linux" }, @@ -384,7 +393,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.011002, + "duration": 0.016316, "requirements": [], "os": "linux" }, @@ -393,7 +402,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 0.680039, + "duration": 1.072435, "requirements": [], "os": "linux" }, @@ -402,7 +411,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.000768, + "duration": 0.000866, "requirements": [], "os": "linux" }, @@ -411,7 +420,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000258, + "duration": 0.000256, "requirements": [], "os": "linux" }, @@ -420,7 +429,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000422, + "duration": 0.000845, "requirements": [], "os": "linux" }, @@ -429,7 +438,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.706051, + "duration": 0.690657, "requirements": [], "os": "linux" }, @@ -438,7 +447,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.685036, + "duration": 0.818282, "requirements": [], "os": "linux" }, @@ -447,7 +456,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.005671, + "duration": 0.015384, "requirements": [], "os": "linux" }, @@ -456,7 +465,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.001624, + "duration": 0.002789, "requirements": [], "os": "linux" }, @@ -465,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.700181, + "duration": 0.69993, "requirements": [], "os": "linux" }, @@ -474,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.62333, + "duration": 0.922192, "requirements": [], "os": "linux" }, @@ -483,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000221, + "duration": 0.000326, "requirements": [], "os": "linux" }, @@ -492,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 0.695725, + "duration": 1.122222, "requirements": [], "os": "linux" }, @@ -501,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000171, + "duration": 0.000361, "requirements": [], "os": "linux" }, @@ -510,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000364, + "duration": 0.000602, "requirements": [], "os": "linux" }, @@ -519,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.584806, + "duration": 0.640916, "requirements": [], "os": "linux" }, @@ -528,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.56796, + "duration": 0.818186, "requirements": [], "os": "linux" }, @@ -537,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.696729, + "duration": 1.004689, "requirements": [], "os": "linux" }, @@ -546,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.005319, + "duration": 0.006609, "requirements": [], "os": "linux" }, @@ -555,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.001697, + "duration": 0.002711, "requirements": [], "os": "linux" }, @@ -564,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 0.794109, + "duration": 1.267141, "requirements": [], "os": "linux" } @@ -573,18 +582,18 @@ ], "totals": { "overall": { - "passed": 53, + "passed": 54, "failed": 0, "skipped": 0, - "duration": 10.388251, + "duration": 15.606847, "rate": 100 }, "byOs": { "linux": { - "passed": 53, + "passed": 54, "failed": 0, "skipped": 0, - "duration": 10.388251, + "duration": 15.606847, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 47f9d860..404d3357 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.006 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.001 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | #### REQ-026 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) @@ -70,47 +70,48 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.007 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.012 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.003 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.004 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.003 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.003 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.009 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.896 | | | | Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.647 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.888 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.610 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.580 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.624 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.552 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.567 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.018 | | | +| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.878 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.001 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.881 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.873 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.011 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.680 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.016 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.072 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.706 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.685 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.002 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.691 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.818 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.003 | | | | Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.700 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.623 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.922 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.696 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.122 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.585 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.568 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.697 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.005 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 0.794 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.641 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.818 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.005 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.267 | | | \ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index 8b9df7fb..9c5950d7 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"68edd62ba773e0368efdb9cb82676172034aee1b","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"248bf55e2e93924accb10337f63abf00e5716059","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/scripts/__tests__/fixtures/downloaded-only/downloaded-artifacts/test-results-pester-sample/pester-junit.xml b/scripts/__tests__/fixtures/downloaded-only/downloaded-artifacts/test-results-pester-sample/pester-junit.xml new file mode 100644 index 00000000..b90e73ea --- /dev/null +++ b/scripts/__tests__/fixtures/downloaded-only/downloaded-artifacts/test-results-pester-sample/pester-junit.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/__tests__/print-pester-traceability.test.js b/scripts/__tests__/print-pester-traceability.test.js index 3395295c..3dad157a 100644 --- a/scripts/__tests__/print-pester-traceability.test.js +++ b/scripts/__tests__/print-pester-traceability.test.js @@ -61,6 +61,14 @@ test('fails when no JUnit files are found', async () => { ); }); +test('detects downloaded artifacts path', async () => { + const env = { ...process.env, RUNNER_OS: 'Linux' }; + const tsxPath = path.join(rootDir, 'node_modules/.bin/tsx'); + const cwd = path.join(fixtureDir, 'downloaded-only'); + const { stdout } = await execFileP(tsxPath, [scriptFile], { cwd, env }); + assert.match(stdout, /
alice<\/summary>/); +}); + test('uses latest artifact directory when multiple are present', async () => { const env = { ...process.env, RUNNER_OS: 'Linux' }; const tsxPath = path.join(rootDir, 'node_modules/.bin/tsx'); diff --git a/scripts/print-pester-traceability.ts b/scripts/print-pester-traceability.ts index 4bd6de15..27cdabc4 100644 --- a/scripts/print-pester-traceability.ts +++ b/scripts/print-pester-traceability.ts @@ -10,7 +10,9 @@ async function main() { if (overrideDir) { junitFiles = await glob(path.join(overrideDir, 'pester-junit.xml')); } else { - const matches = await glob('artifacts/pester-junit-*/pester-junit.xml'); + const matches = await glob( + '{artifacts/pester-junit-*/pester-junit.xml,downloaded-artifacts/test-results-pester-*/pester-junit.xml}' + ); if (matches.length > 0) { const latestDir = matches .map((f) => path.dirname(f)) diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 4cbc9cd3..162d18db 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,64 +1,65 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + From e163424804c1db4659ff37683c2b67c2aaaab54e Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 01:10:37 -0700 Subject: [PATCH 63/73] Handle missing Pester results gracefully (REQ-001) (#118) --- artifacts/linux/requirements-summary.md | 2 +- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 76 +++++------ artifacts/linux/traceability.json | 128 +++++++++--------- artifacts/linux/traceability.md | 76 +++++------ ci_evidence.txt | 2 +- .../print-pester-traceability.test.js | 12 +- scripts/print-pester-traceability.ts | 2 +- test-results/node-junit.xml | 110 +++++++-------- 10 files changed, 205 insertions(+), 211 deletions(-) diff --git a/artifacts/linux/requirements-summary.md b/artifacts/linux/requirements-summary.md index 2a273bac..2f675bea 100644 --- a/artifacts/linux/requirements-summary.md +++ b/artifacts/linux/requirements-summary.md @@ -42,7 +42,6 @@ | Unmapped | escapemarkdown-escapes-special-characters | Passed | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | | Unmapped | fails-when-commit-lacks-requirement-reference | Passed | -| Unmapped | fails-when-no-junit-files-are-found | Passed | | Unmapped | fails-when-requirement-lacks-test-coverage | Passed | | Unmapped | fails-when-tests-are-unmapped | Passed | | Unmapped | fails-when-tests-reference-unknown-requirements | Passed | @@ -59,6 +58,7 @@ | Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | | Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | | Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | | Unmapped | partitions-requirement-groups-by-runner\_type | Passed | | Unmapped | passes-with-coverage-and-requirement-reference | Passed | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index d09d2a7e..1391fde9 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 15.61 | 100.00 | -| linux | 54 | 0 | 0 | 15.61 | 100.00 | +| overall | 54 | 0 | 0 | 19.80 | 100.00 | +| linux | 54 | 0 | 0 | 19.80 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index c3eb43d1..6b810ecf 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 15.61 | 100.00 | -| linux | 54 | 0 | 0 | 15.61 | 100.00 | +| overall | 54 | 0 | 0 | 19.80 | 100.00 | +| linux | 54 | 0 | 0 | 19.80 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 404d3357..57af3dcf 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.006 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.009 | | | #### REQ-026 (100% passed) @@ -40,78 +40,78 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.005 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.002 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.012 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.009 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | | Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 0.896 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.888 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.006 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 1.105 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.036 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.120 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.018 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.878 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.001 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.881 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.873 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.146 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.463 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.054 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.050 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.016 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.072 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.020 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.359 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.691 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.818 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.003 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.700 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.922 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.004 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.952 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.094 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.011 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.094 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.935 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.222 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.122 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.466 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.641 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.818 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.005 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.766 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.003 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.301 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | | Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.267 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.484 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 6608f4b8..74c0ad0e 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.00699, + "duration": 0.010082, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.001463, + "duration": 0.005663, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.005435, + "duration": 0.009162, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001169, + "duration": 0.001348, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.001039, + "duration": 0.001231, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.001777, + "duration": 0.002499, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.000872, + "duration": 0.002267, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001006, + "duration": 0.005244, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.000503, + "duration": 0.001908, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000402, + "duration": 0.000992, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001191, + "duration": 0.002834, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.012211, + "duration": 0.014469, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.000942, + "duration": 0.002344, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001939, + "duration": 0.002091, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000367, + "duration": 0.000433, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.009314, + "duration": 0.005539, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.009662, + "duration": 0.009586, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.004395, + "duration": 0.006178, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000718, + "duration": 0.000281, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "detects downloaded artifacts path", "className": "test", "status": "Passed", - "duration": 0.895611, + "duration": 1.105138, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.002389, + "duration": 0.036492, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.887892, + "duration": 1.11958, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001043, + "duration": 0.001481, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000185, + "duration": 0.000322, "requirements": [], "os": "linux" }, @@ -312,16 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.018081, - "requirements": [], - "os": "linux" - }, - { - "id": "fails-when-no-junit-files-are-found", - "name": "fails when no JUnit files are found", - "className": "test", - "status": "Passed", - "duration": 0.878337, + "duration": 1.146226, "requirements": [], "os": "linux" }, @@ -330,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.000952, + "duration": 1.462805, "requirements": [], "os": "linux" }, @@ -339,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.880797, + "duration": 1.053679, "requirements": [], "os": "linux" }, @@ -348,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.872653, + "duration": 1.050087, "requirements": [], "os": "linux" }, @@ -357,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000265, + "duration": 0.0004, "requirements": [], "os": "linux" }, @@ -366,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000258, + "duration": 0.000211, "requirements": [], "os": "linux" }, @@ -375,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.002521, + "duration": 0.004185, "requirements": [], "os": "linux" }, @@ -384,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000753, + "duration": 0.000509, "requirements": [], "os": "linux" }, @@ -393,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.016316, + "duration": 0.020376, "requirements": [], "os": "linux" }, @@ -402,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.072435, + "duration": 1.359414, "requirements": [], "os": "linux" }, @@ -411,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.000866, + "duration": 0.001396, "requirements": [], "os": "linux" }, @@ -420,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000256, + "duration": 0.000543, "requirements": [], "os": "linux" }, @@ -429,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000845, + "duration": 0.003818, "requirements": [], "os": "linux" }, @@ -438,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.690657, + "duration": 0.951522, "requirements": [], "os": "linux" }, @@ -447,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.818282, + "duration": 1.093633, "requirements": [], "os": "linux" }, @@ -456,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.015384, + "duration": 0.010929, "requirements": [], "os": "linux" }, @@ -465,7 +456,16 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.002789, + "duration": 0.007079, + "requirements": [], + "os": "linux" + }, + { + "id": "logs-a-warning-when-no-junit-files-are-found", + "name": "logs a warning when no JUnit files are found", + "className": "test", + "status": "Passed", + "duration": 1.094434, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.69993, + "duration": 0.934896, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.922192, + "duration": 1.221751, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000326, + "duration": 0.000352, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.122222, + "duration": 1.466326, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000361, + "duration": 0.000273, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000602, + "duration": 0.000736, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.640916, + "duration": 0.766417, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.818186, + "duration": 1.00279, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.004689, + "duration": 1.300662, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.006609, + "duration": 0.006145, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.002711, + "duration": 0.002591, "requirements": [], "os": "linux" }, @@ -573,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.267141, + "duration": 1.484103, "requirements": [], "os": "linux" } @@ -585,7 +585,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 15.606847, + "duration": 19.795452, "rate": 100 }, "byOs": { @@ -593,7 +593,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 15.606847, + "duration": 19.795452, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 404d3357..57af3dcf 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.007 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.001 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.006 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.009 | | | #### REQ-026 (100% passed) @@ -40,78 +40,78 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.005 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.002 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.000 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.012 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.009 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | | Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 0.896 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.888 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.006 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 1.105 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.036 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.120 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.018 | | | -| Unmapped | fails-when-no-junit-files-are-found | Passed | 0.878 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.001 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.881 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.873 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.146 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.463 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.054 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.050 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.016 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.072 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.020 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.359 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.691 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.818 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.003 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.700 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.922 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.004 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.952 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.094 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.011 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.094 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.935 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.222 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.122 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.466 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.641 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.818 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.005 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.766 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.003 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.301 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | | Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.267 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.484 | | |
\ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index 9c5950d7..bb83bbb8 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"248bf55e2e93924accb10337f63abf00e5716059","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"a6e42fa82af6e56070a20c64a027e65420ca6e1f","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/scripts/__tests__/print-pester-traceability.test.js b/scripts/__tests__/print-pester-traceability.test.js index 3dad157a..76bc12ba 100644 --- a/scripts/__tests__/print-pester-traceability.test.js +++ b/scripts/__tests__/print-pester-traceability.test.js @@ -47,18 +47,12 @@ test('groups owners and includes requirements and evidence', async () => { ); }); -test('fails when no JUnit files are found', async () => { +test('logs a warning when no JUnit files are found', async () => { const env = { ...process.env, RUNNER_OS: 'Linux' }; const tsxPath = path.join(rootDir, 'node_modules/.bin/tsx'); const cwd = path.join(fixtureDir, 'no-artifacts'); - await assert.rejects( - execFileP(tsxPath, [scriptFile], { cwd, env }), - (err) => { - assert.equal(err.code, 1); - assert.match(err.stderr, /No JUnit files found/); - return true; - } - ); + const { stderr } = await execFileP(tsxPath, [scriptFile], { cwd, env }); + assert.match(stderr, /No JUnit files found/); }); test('detects downloaded artifacts path', async () => { diff --git a/scripts/print-pester-traceability.ts b/scripts/print-pester-traceability.ts index 27cdabc4..19979474 100644 --- a/scripts/print-pester-traceability.ts +++ b/scripts/print-pester-traceability.ts @@ -23,7 +23,7 @@ async function main() { } if (junitFiles.length === 0) { console.warn('No JUnit files found'); - process.exit(1); + return; } const tests = []; for (const file of junitFiles) { diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 162d18db..654f7b43 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61,5 +61,5 @@ - + From b55e19395fe569389c1b68fcdd895e628ed15f90 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 01:30:51 -0700 Subject: [PATCH 64/73] docs: reorganize mkdocs nav (REQ-001) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 86 ++++++++--------- artifacts/linux/traceability.json | 112 +++++++++++------------ artifacts/linux/traceability.md | 86 ++++++++--------- ci_evidence.txt | 2 +- mkdocs.yml | 106 ++++++++++----------- test-results/node-junit.xml | 110 +++++++++++----------- 8 files changed, 257 insertions(+), 253 deletions(-) diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 1391fde9..0c9fa8d6 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 19.80 | 100.00 | -| linux | 54 | 0 | 0 | 19.80 | 100.00 | +| overall | 54 | 0 | 0 | 24.26 | 100.00 | +| linux | 54 | 0 | 0 | 24.26 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 6b810ecf..23b7274f 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 19.80 | 100.00 | -| linux | 54 | 0 | 0 | 19.80 | 100.00 | +| overall | 54 | 0 | 0 | 24.26 | 100.00 | +| linux | 54 | 0 | 0 | 24.26 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 57af3dcf..d9fd6471 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.018 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.006 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.007 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.009 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.011 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.002 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.005 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.022 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.006 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.002 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.070 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.022 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 1.105 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.036 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.120 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.146 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.463 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.054 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.050 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 1.477 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.007 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.395 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.002 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.290 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.601 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.378 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.489 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.003 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.008 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.020 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.359 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.031 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.513 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.003 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.004 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.952 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.094 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.011 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 1.179 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.222 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.014 | | | | Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.094 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.935 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.222 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.466 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.766 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.003 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.301 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.339 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.157 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.378 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.737 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.010 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 1.043 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.268 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.628 | | | | Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.484 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.006 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.879 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 74c0ad0e..1f334dca 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.010082, + "duration": 0.018451, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.005663, + "duration": 0.00714, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.009162, + "duration": 0.011216, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001348, + "duration": 0.002249, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.001231, + "duration": 0.001802, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.002499, + "duration": 0.003374, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.002267, + "duration": 0.002187, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.005244, + "duration": 0.002402, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.001908, + "duration": 0.001605, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000992, + "duration": 0.000865, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.002834, + "duration": 0.003557, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.014469, + "duration": 0.021947, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.002344, + "duration": 0.002297, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.002091, + "duration": 0.00215, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000433, + "duration": 0.001773, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.005539, + "duration": 0.010208, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.009586, + "duration": 0.069604, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.006178, + "duration": 0.022067, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000281, + "duration": 0.000321, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "detects downloaded artifacts path", "className": "test", "status": "Passed", - "duration": 1.105138, + "duration": 1.477198, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.036492, + "duration": 0.006826, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 1.11958, + "duration": 1.395253, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001481, + "duration": 0.002067, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000322, + "duration": 0.001811, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.146226, + "duration": 1.290223, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.462805, + "duration": 1.600796, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.053679, + "duration": 1.377752, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 1.050087, + "duration": 1.488858, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.0004, + "duration": 0.002774, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000211, + "duration": 0.000374, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.004185, + "duration": 0.008141, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000509, + "duration": 0.000893, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.020376, + "duration": 0.031059, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.359414, + "duration": 1.513361, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.001396, + "duration": 0.002917, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000543, + "duration": 0.000548, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.003818, + "duration": 0.001247, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.951522, + "duration": 1.178691, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 1.093633, + "duration": 1.221995, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.010929, + "duration": 0.014018, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.007079, + "duration": 0.007169, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "logs a warning when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 1.094434, + "duration": 1.339499, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.934896, + "duration": 1.156693, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.221751, + "duration": 1.378174, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000352, + "duration": 0.000858, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.466326, + "duration": 1.737334, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000273, + "duration": 0.000873, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000736, + "duration": 0.010225, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.766417, + "duration": 1.042879, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 1.00279, + "duration": 1.267915, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.300662, + "duration": 1.628116, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.006145, + "duration": 0.005978, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.002591, + "duration": 0.005622, "requirements": [], "os": "linux" }, @@ -573,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.484103, + "duration": 1.879196, "requirements": [], "os": "linux" } @@ -585,7 +585,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 19.795452, + "duration": 24.262547999999995, "rate": 100 }, "byOs": { @@ -593,7 +593,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 19.795452, + "duration": 24.262547999999995, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 57af3dcf..d9fd6471 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.018 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.006 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.007 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.009 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.011 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.002 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.005 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.014 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.022 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.006 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.006 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.002 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.070 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.022 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 1.105 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.036 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.120 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.146 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.463 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.054 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.050 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 1.477 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.007 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.395 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.002 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.290 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.601 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.378 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.489 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.003 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.008 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.020 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.359 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.031 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.513 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.003 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.004 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.952 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.094 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.011 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 1.179 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.222 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.014 | | | | Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.094 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.935 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.222 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.466 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.766 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.003 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.301 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.339 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.157 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.378 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.737 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.010 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 1.043 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.268 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.628 | | | | Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.484 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.006 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.879 | | |
\ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index bb83bbb8..4a96f32d 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"a6e42fa82af6e56070a20c64a027e65420ca6e1f","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"36286315357af8f05c13556efe7df0d07122c211","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 55143cfa..cf9aab59 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -35,57 +35,61 @@ markdown_extensions: - pymdownx.superfences - pymdownx.highlight nav: - - Home: - - Overview: index.md - - Architecture: architecture.md - - Quickstart: quickstart.md - - Action Calls: action-call-reference.md - - Common Parameters: common-parameters.md - - Troubleshooting: troubleshooting.md - - Unified Dispatcher: UnifiedDispatcher.md - - Adapter Authoring: adapter-authoring.md - - Versioning: versioning.md - - Changelog: CHANGELOG.md - - Contributing: contributing-docs.md - - Requirements: requirements.md - - Testing with Pester: testing-pester.md - - Actions: - - Setup: - - Add Token to LabVIEW: actions/add-token-to-labview.md - - Apply VIPC: actions/apply-vipc.md - - Close LabVIEW: actions/close-labview.md - - Missing in Project: actions/missing-in-project.md - - Prepare LabVIEW Source: actions/prepare-labview-source.md - - Rename File: actions/rename-file.md - - Restore Setup LV Source: actions/restore-setup-lv-source.md - - Set Development Mode: actions/set-development-mode.md - - Revert Development Mode: actions/revert-development-mode.md - - Build: - - Build: actions/build.md - - Build LVLIBP: actions/build-lvlibp.md - - Build VI Package: actions/build-vi-package.md - - Generate Release Notes: actions/generate-release-notes.md - - Modify VIPB Display Info: actions/modify-vipb-display-info.md - - Testing: - - Run Unit Tests: actions/run-unit-tests.md - - Workflows: - - Add Token to LabVIEW: workflows/add-token-to-labview.md - - Apply VIPC: workflows/apply-vipc.md - - Build LVLIBP: workflows/build-lvlibp.md - - Build VI Package: workflows/build-vi-package.md - - Build: workflows/build.md - - Close LabVIEW: workflows/close-labview.md - - Generate Release Notes: workflows/generate-release-notes.md - - Missing in Project: workflows/missing-in-project.md - - Modify VIPB Display Info: workflows/modify-vipb-display-info.md - - Prepare LabVIEW Source: workflows/prepare-labview-source.md - - Rename File: workflows/rename-file.md - - Restore Setup LV Source: workflows/restore-setup-lv-source.md - - Revert Development Mode: workflows/revert-development-mode.md - - Run Pester Tests: workflows/run-pester-tests.md - - Run Unit Tests: workflows/run-unit-tests.md - - Set Development Mode: workflows/set-development-mode.md - - Setup MkDocs: workflows/setup-mkdocs.md + - Overview: + - Overview: index.md + - Architecture: architecture.md + - Unified Dispatcher: UnifiedDispatcher.md + - Guides: + - Quickstart: quickstart.md + - Environment Setup: environment-setup.md + - Troubleshooting: troubleshooting.md + - Reference: + - Action Calls: action-call-reference.md + - Common Parameters: common-parameters.md + - Actions: + - Setup: + - Add Token to LabVIEW: actions/add-token-to-labview.md + - Apply VIPC: actions/apply-vipc.md + - Close LabVIEW: actions/close-labview.md + - Missing in Project: actions/missing-in-project.md + - Prepare LabVIEW Source: actions/prepare-labview-source.md + - Rename File: actions/rename-file.md + - Restore Setup LV Source: actions/restore-setup-lv-source.md + - Set Development Mode: actions/set-development-mode.md + - Revert Development Mode: actions/revert-development-mode.md + - Build: + - Build: actions/build.md + - Build LVLIBP: actions/build-lvlibp.md + - Build VI Package: actions/build-vi-package.md + - Generate Release Notes: actions/generate-release-notes.md + - Modify VIPB Display Info: actions/modify-vipb-display-info.md + - Testing: + - Run Unit Tests: actions/run-unit-tests.md + - Workflows: + - Add Token to LabVIEW: workflows/add-token-to-labview.md + - Apply VIPC: workflows/apply-vipc.md + - Build LVLIBP: workflows/build-lvlibp.md + - Build VI Package: workflows/build-vi-package.md + - Build: workflows/build.md + - Close LabVIEW: workflows/close-labview.md + - Generate Release Notes: workflows/generate-release-notes.md + - Missing in Project: workflows/missing-in-project.md + - Modify VIPB Display Info: workflows/modify-vipb-display-info.md + - Prepare LabVIEW Source: workflows/prepare-labview-source.md + - Rename File: workflows/rename-file.md + - Restore Setup LV Source: workflows/restore-setup-lv-source.md + - Revert Development Mode: workflows/revert-development-mode.md + - Run Pester Tests: workflows/run-pester-tests.md + - Run Unit Tests: workflows/run-unit-tests.md + - Set Development Mode: workflows/set-development-mode.md + - Setup MkDocs: workflows/setup-mkdocs.md + - Developer Docs: + - Adapter Authoring: adapter-authoring.md + - Versioning: versioning.md + - Changelog: CHANGELOG.md + - Contributing: contributing-docs.md + - Requirements: requirements.md + - Testing with Pester: testing-pester.md plugins: - search - autorefs diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 654f7b43..9befa38f 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61,5 +61,5 @@ - + From 263d39f0119423de7145207deaf63dbd1095fc69 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 01:40:53 -0700 Subject: [PATCH 65/73] docs: add actions and workflows index pages (REQ-001) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 98 ++++++++++---------- artifacts/linux/traceability.json | 112 +++++++++++------------ artifacts/linux/traceability.md | 98 ++++++++++---------- ci_evidence.txt | 2 +- docs/actions/index.md | 21 +++++ docs/workflows/index.md | 21 +++++ error-summary.md | 16 ++++ mkdocs.yml | 39 +------- test-results/node-junit.xml | 110 +++++++++++----------- 11 files changed, 274 insertions(+), 251 deletions(-) create mode 100644 docs/actions/index.md create mode 100644 docs/workflows/index.md create mode 100644 error-summary.md diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 0c9fa8d6..7e4ff8d1 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 24.26 | 100.00 | -| linux | 54 | 0 | 0 | 24.26 | 100.00 | +| overall | 54 | 0 | 0 | 20.78 | 100.00 | +| linux | 54 | 0 | 0 | 20.78 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 23b7274f..720de61f 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 24.26 | 100.00 | -| linux | 54 | 0 | 0 | 24.26 | 100.00 | +| overall | 54 | 0 | 0 | 20.78 | 100.00 | +| linux | 54 | 0 | 0 | 20.78 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index d9fd6471..765382fc 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,55 +4,55 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.018 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.007 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.011 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.002 | | | +| REQ-026 | captures-suite-properties | Passed | 0.006 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.007 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.002 | | | +| REQ-031 | validates-missing-fields | Passed | 0.005 | | | #### REQ-032 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.022 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.034 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.002 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.070 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.022 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.004 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.009 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 1.477 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.007 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.395 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.002 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.290 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.601 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.378 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.489 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.003 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 1.192 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.253 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.001 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.167 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.274 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.080 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.166 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.008 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.031 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.513 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.003 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 1.179 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.222 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.014 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.035 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.478 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.005 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 1.026 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.096 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.016 | | | | Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.339 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.157 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.378 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.737 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.010 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 1.043 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.268 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.628 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.006 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.879 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.152 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.065 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.359 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.472 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.809 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.043 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.390 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.015 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.008 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.555 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 1f334dca..06fdc172 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.018451, + "duration": 0.008218, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.00714, + "duration": 0.00534, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.011216, + "duration": 0.003829, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.002249, + "duration": 0.006395, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.001802, + "duration": 0.001214, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.003374, + "duration": 0.006857, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.002187, + "duration": 0.00136, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.002402, + "duration": 0.001307, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.001605, + "duration": 0.004908, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000865, + "duration": 0.000682, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.003557, + "duration": 0.001434, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.021947, + "duration": 0.033537, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.002297, + "duration": 0.003204, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.00215, + "duration": 0.002252, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.001773, + "duration": 0.000567, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.010208, + "duration": 0.004347, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.069604, + "duration": 0.008069, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.022067, + "duration": 0.008512, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000321, + "duration": 0.000287, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "detects downloaded artifacts path", "className": "test", "status": "Passed", - "duration": 1.477198, + "duration": 1.192347, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.006826, + "duration": 0.003728, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 1.395253, + "duration": 1.252761, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.002067, + "duration": 0.001373, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.001811, + "duration": 0.001099, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.290223, + "duration": 1.167365, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.600796, + "duration": 1.274434, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.377752, + "duration": 1.079574, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 1.488858, + "duration": 1.16608, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.002774, + "duration": 0.000278, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000374, + "duration": 0.000203, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.008141, + "duration": 0.00326, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000893, + "duration": 0.00037, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.031059, + "duration": 0.035494, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.513361, + "duration": 1.47837, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.002917, + "duration": 0.001296, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000548, + "duration": 0.000382, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.001247, + "duration": 0.004823, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 1.178691, + "duration": 1.025546, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 1.221995, + "duration": 1.096497, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.014018, + "duration": 0.015749, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.007169, + "duration": 0.006828, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "logs a warning when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 1.339499, + "duration": 1.151677, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 1.156693, + "duration": 1.065265, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.378174, + "duration": 1.358822, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000858, + "duration": 0.000306, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.737334, + "duration": 1.47204, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000873, + "duration": 0.000276, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.010225, + "duration": 0.00047, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 1.042879, + "duration": 0.809456, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 1.267915, + "duration": 1.04335, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.628116, + "duration": 1.389964, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.005978, + "duration": 0.0146, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.005622, + "duration": 0.008406, "requirements": [], "os": "linux" }, @@ -573,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.879196, + "duration": 1.555371, "requirements": [], "os": "linux" } @@ -585,7 +585,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 24.262547999999995, + "duration": 20.780179, "rate": 100 }, "byOs": { @@ -593,7 +593,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 24.262547999999995, + "duration": 20.780179, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index d9fd6471..765382fc 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,55 +4,55 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.018 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.007 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.011 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.002 | | | +| REQ-026 | captures-suite-properties | Passed | 0.006 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.007 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.002 | | | +| REQ-031 | validates-missing-fields | Passed | 0.005 | | | #### REQ-032 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.022 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.034 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.002 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.070 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.022 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.004 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.009 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 1.477 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.007 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.395 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.002 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.290 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.601 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.378 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.489 | | | -| Unmapped | formaterror-handles-plain-objects | Passed | 0.003 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 1.192 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.253 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.001 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.167 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.274 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.080 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.166 | | | +| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.008 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.031 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.513 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.003 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 1.179 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.222 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.014 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.035 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.478 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.005 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 1.026 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.096 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.016 | | | | Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.339 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.157 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.378 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.737 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.010 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 1.043 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.268 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.628 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.006 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.879 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.152 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.065 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.359 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.472 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.809 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.043 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.390 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.015 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.008 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.555 | | |
\ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index 4a96f32d..ecc1c74d 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"36286315357af8f05c13556efe7df0d07122c211","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"d75aa8a5850a3e659307f08822f1a39152fc8aac","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/docs/actions/index.md b/docs/actions/index.md new file mode 100644 index 00000000..dabeebe2 --- /dev/null +++ b/docs/actions/index.md @@ -0,0 +1,21 @@ +# Actions + +List of available GitHub Actions. + +- [add-token-to-labview](./add-token-to-labview.md): Add a custom library path token to the LabVIEW INI file so LabVIEW can locate project libraries. +- [apply-vipc](./apply-vipc.md): Apply a VI Package Configuration (.vipc) file to a specific LabVIEW installation using g-cli. +- [build-lvlibp](./build-lvlibp.md): Build a LabVIEW project’s build specification into a Packed Project Library (.lvlibp). +- [build-vi-package](./build-vi-package.md): Update VIPB display information and build a VI package using g-cli. +- [build](./build.md): Automate building the LabVIEW Icon Editor project, including cleaning, building libraries, and packaging. +- [close-labview](./close-labview.md): Gracefully close a running LabVIEW instance via g-cli. +- [generate-release-notes](./generate-release-notes.md): Generate release notes from the git history and write them to a markdown file. +- [missing-in-project](./missing-in-project.md): Check that all files in a LabVIEW project are present by scanning for items missing from the `.lvproj`. +- [modify-vipb-display-info](./modify-vipb-display-info.md): Update display information in a VIPB file and rebuild the VI package. +- [prepare-labview-source](./prepare-labview-source.md): Run PrepareIESource.vi via g-cli to unzip components and configure LabVIEW for building. +- [rename-file](./rename-file.md): Rename a file if it exists. +- [restore-setup-lv-source](./restore-setup-lv-source.md): Restore the LabVIEW source setup by unzipping the LabVIEW Icon API and removing the INI token. +- [revert-development-mode](./revert-development-mode.md): Restore the repository from development mode by restoring packaged sources and closing LabVIEW. +- [run-pester-tests](./run-pester-tests.md): Run PowerShell Pester tests in a repository. +- [run-unit-tests](./run-unit-tests.md): Run LabVIEW unit tests via the LabVIEW Unit Test Framework CLI and report pass/fail/error using standard exit codes. +- [set-development-mode](./set-development-mode.md): Configure the repository for development mode by removing packed libraries, adding tokens, preparing sources, and closing LabVIEW. +- [setup-mkdocs](./setup-mkdocs.md): Install a pinned MkDocs with caching. diff --git a/docs/workflows/index.md b/docs/workflows/index.md new file mode 100644 index 00000000..1c99e5ab --- /dev/null +++ b/docs/workflows/index.md @@ -0,0 +1,21 @@ +# Workflows + +List of reusable GitHub Workflows. + +- [add-token-to-labview workflow](./add-token-to-labview.md): Dispatch the [add-token-to-labview](../actions/add-token-to-labview.md) action to a target repository through `Invoke-OSAction.ps1`. +- [apply-vipc workflow](./apply-vipc.md): Dispatch the [apply-vipc](../actions/apply-vipc.md) action to a target repository through `Invoke-OSAction.ps1`. +- [build-lvlibp workflow](./build-lvlibp.md): Dispatch the [build-lvlibp](../actions/build-lvlibp.md) action to a target repository through `Invoke-OSAction.ps1`. +- [build-vi-package workflow](./build-vi-package.md): Dispatch the [build-vi-package](../actions/build-vi-package.md) action to a target repository through `Invoke-OSAction.ps1`. +- [build workflow](./build.md): Dispatch the [build](../actions/build.md) action to a target repository through `Invoke-OSAction.ps1`. +- [close-labview workflow](./close-labview.md): Dispatch the [close-labview](../actions/close-labview.md) action to a target repository through `Invoke-OSAction.ps1`. +- [generate-release-notes workflow](./generate-release-notes.md): Dispatch the [generate-release-notes](../actions/generate-release-notes.md) action to a target repository through `Invoke-OSAction.ps1`. +- [missing-in-project workflow](./missing-in-project.md): Dispatch the [missing-in-project](../actions/missing-in-project.md) action to a target repository through `Invoke-OSAction.ps1`. +- [modify-vipb-display-info workflow](./modify-vipb-display-info.md): Dispatch the [modify-vipb-display-info](../actions/modify-vipb-display-info.md) action to a target repository through `Invoke-OSAction.ps1`. +- [prepare-labview-source workflow](./prepare-labview-source.md): Dispatch the [prepare-labview-source](../actions/prepare-labview-source.md) action to a target repository through `Invoke-OSAction.ps1`. +- [rename-file workflow](./rename-file.md): Dispatch the [rename-file](../actions/rename-file.md) action to a target repository through `Invoke-OSAction.ps1`. +- [restore-setup-lv-source workflow](./restore-setup-lv-source.md): Dispatch the [restore-setup-lv-source](../actions/restore-setup-lv-source.md) action to a target repository through `Invoke-OSAction.ps1`. +- [revert-development-mode workflow](./revert-development-mode.md): Dispatch the [revert-development-mode](../actions/revert-development-mode.md) action to a target repository through `Invoke-OSAction.ps1`. +- [run-pester-tests workflow](./run-pester-tests.md): Dispatch the [run-pester-tests](../actions/run-pester-tests.md) action to a target repository through `Invoke-OSAction.ps1`. +- [run-unit-tests workflow](./run-unit-tests.md): Dispatch the [run-unit-tests](../actions/run-unit-tests.md) action to a target repository through `Invoke-OSAction.ps1`. +- [set-development-mode workflow](./set-development-mode.md): Dispatch the [set-development-mode](../actions/set-development-mode.md) action to a target repository through `Invoke-OSAction.ps1`. +- [setup-mkdocs workflow](./setup-mkdocs.md): Dispatch the [setup-mkdocs](../actions/setup-mkdocs.md) action to a target repository through `Invoke-OSAction.ps1`. diff --git a/error-summary.md b/error-summary.md new file mode 100644 index 00000000..06849cc5 --- /dev/null +++ b/error-summary.md @@ -0,0 +1,16 @@ + + +### Error generating CI summary + +``` +Error: All tests are unmapped; verify requirements mapping. + at main (/workspace/open-source/scripts/generate-ci-summary.ts:91:13) +``` + + +### Error generating CI summary + +``` +Error: No JUnit files found + at main (/workspace/open-source/scripts/generate-ci-summary.ts:76:15) +``` diff --git a/mkdocs.yml b/mkdocs.yml index cf9aab59..f9f43fbd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -46,43 +46,8 @@ nav: - Reference: - Action Calls: action-call-reference.md - Common Parameters: common-parameters.md - - Actions: - - Setup: - - Add Token to LabVIEW: actions/add-token-to-labview.md - - Apply VIPC: actions/apply-vipc.md - - Close LabVIEW: actions/close-labview.md - - Missing in Project: actions/missing-in-project.md - - Prepare LabVIEW Source: actions/prepare-labview-source.md - - Rename File: actions/rename-file.md - - Restore Setup LV Source: actions/restore-setup-lv-source.md - - Set Development Mode: actions/set-development-mode.md - - Revert Development Mode: actions/revert-development-mode.md - - Build: - - Build: actions/build.md - - Build LVLIBP: actions/build-lvlibp.md - - Build VI Package: actions/build-vi-package.md - - Generate Release Notes: actions/generate-release-notes.md - - Modify VIPB Display Info: actions/modify-vipb-display-info.md - - Testing: - - Run Unit Tests: actions/run-unit-tests.md - - Workflows: - - Add Token to LabVIEW: workflows/add-token-to-labview.md - - Apply VIPC: workflows/apply-vipc.md - - Build LVLIBP: workflows/build-lvlibp.md - - Build VI Package: workflows/build-vi-package.md - - Build: workflows/build.md - - Close LabVIEW: workflows/close-labview.md - - Generate Release Notes: workflows/generate-release-notes.md - - Missing in Project: workflows/missing-in-project.md - - Modify VIPB Display Info: workflows/modify-vipb-display-info.md - - Prepare LabVIEW Source: workflows/prepare-labview-source.md - - Rename File: workflows/rename-file.md - - Restore Setup LV Source: workflows/restore-setup-lv-source.md - - Revert Development Mode: workflows/revert-development-mode.md - - Run Pester Tests: workflows/run-pester-tests.md - - Run Unit Tests: workflows/run-unit-tests.md - - Set Development Mode: workflows/set-development-mode.md - - Setup MkDocs: workflows/setup-mkdocs.md + - Actions: actions/index.md + - Workflows: workflows/index.md - Developer Docs: - Adapter Authoring: adapter-authoring.md - Versioning: versioning.md diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 9befa38f..fc34ab90 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61,5 +61,5 @@ - + From f81462e457332f4b82964b6964b6617f04b3e073 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 01:49:50 -0700 Subject: [PATCH 66/73] docs: cross-link actions and workflows (REQ-009) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 72 ++++++------- artifacts/linux/traceability.json | 112 ++++++++++----------- artifacts/linux/traceability.md | 72 ++++++------- ci_evidence.txt | 2 +- docs/actions/add-token-to-labview.md | 5 +- docs/actions/apply-vipc.md | 5 +- docs/actions/build-lvlibp.md | 7 +- docs/actions/build-vi-package.md | 7 +- docs/actions/build.md | 7 +- docs/actions/close-labview.md | 5 +- docs/actions/generate-release-notes.md | 7 +- docs/actions/index.md | 6 +- docs/actions/missing-in-project.md | 5 +- docs/actions/modify-vipb-display-info.md | 7 +- docs/actions/prepare-labview-source.md | 7 +- docs/actions/rename-file.md | 5 +- docs/actions/restore-setup-lv-source.md | 7 +- docs/actions/revert-development-mode.md | 5 +- docs/actions/run-pester-tests.md | 5 +- docs/actions/run-unit-tests.md | 5 +- docs/actions/set-development-mode.md | 5 +- docs/actions/setup-mkdocs.md | 4 + docs/workflows/add-token-to-labview.md | 4 + docs/workflows/apply-vipc.md | 4 + docs/workflows/build-lvlibp.md | 4 + docs/workflows/build-vi-package.md | 4 + docs/workflows/build.md | 4 + docs/workflows/close-labview.md | 4 + docs/workflows/generate-release-notes.md | 4 + docs/workflows/index.md | 4 + docs/workflows/missing-in-project.md | 4 + docs/workflows/modify-vipb-display-info.md | 4 + docs/workflows/prepare-labview-source.md | 4 + docs/workflows/rename-file.md | 4 + docs/workflows/restore-setup-lv-source.md | 4 + docs/workflows/revert-development-mode.md | 4 + docs/workflows/run-pester-tests.md | 4 + docs/workflows/run-unit-tests.md | 4 + docs/workflows/set-development-mode.md | 4 + docs/workflows/setup-mkdocs.md | 4 + error-summary.md | 16 +++ test-results/node-junit.xml | 110 ++++++++++---------- 44 files changed, 356 insertions(+), 212 deletions(-) diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 7e4ff8d1..4e239a69 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 20.78 | 100.00 | -| linux | 54 | 0 | 0 | 20.78 | 100.00 | +| overall | 54 | 0 | 0 | 15.04 | 100.00 | +| linux | 54 | 0 | 0 | 15.04 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 720de61f..c1f570c6 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 20.78 | 100.00 | -| linux | 54 | 0 | 0 | 20.78 | 100.00 | +| overall | 54 | 0 | 0 | 15.04 | 100.00 | +| linux | 54 | 0 | 0 | 15.04 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 765382fc..20b0b2f6 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -10,7 +10,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | #### REQ-025 (100% passed) @@ -22,7 +22,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.006 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) @@ -34,25 +34,25 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.007 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.005 | | | +| REQ-031 | validates-missing-fields | Passed | 0.002 | | | #### REQ-032 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.034 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.020 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.004 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.009 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 1.192 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.253 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.797 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.810 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.001 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.167 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.274 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.080 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.166 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.801 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.837 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.864 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.814 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.035 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.478 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.015 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.075 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.005 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 1.026 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.096 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.693 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.832 | | | | Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.016 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.152 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.065 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.359 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.971 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.688 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.987 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.472 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.118 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.809 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.043 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.390 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.015 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.008 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.555 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.604 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.783 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.006 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.218 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 06fdc172..a7801825 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.008218, + "duration": 0.00836, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.00534, + "duration": 0.002228, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.003829, + "duration": 0.003601, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.006395, + "duration": 0.000836, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.001214, + "duration": 0.000952, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.006857, + "duration": 0.003543, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.00136, + "duration": 0.00198, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001307, + "duration": 0.002017, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.004908, + "duration": 0.001587, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000682, + "duration": 0.000565, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001434, + "duration": 0.001518, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.033537, + "duration": 0.020357, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.003204, + "duration": 0.003471, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.002252, + "duration": 0.000897, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000567, + "duration": 0.000404, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.004347, + "duration": 0.007968, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.008069, + "duration": 0.009706, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.008512, + "duration": 0.009454, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000287, + "duration": 0.000233, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "detects downloaded artifacts path", "className": "test", "status": "Passed", - "duration": 1.192347, + "duration": 0.797385, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.003728, + "duration": 0.002594, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 1.252761, + "duration": 0.809676, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001373, + "duration": 0.000885, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.001099, + "duration": 0.000159, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.167365, + "duration": 0.800893, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.274434, + "duration": 0.837024, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.079574, + "duration": 0.864368, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 1.16608, + "duration": 0.814465, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000278, + "duration": 0.000188, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000203, + "duration": 0.000128, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.00326, + "duration": 0.003391, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.00037, + "duration": 0.000309, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.035494, + "duration": 0.014674, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.47837, + "duration": 1.075346, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.001296, + "duration": 0.00106, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000382, + "duration": 0.000268, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.004823, + "duration": 0.000397, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 1.025546, + "duration": 0.692842, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 1.096497, + "duration": 0.832402, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.015749, + "duration": 0.015986, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.006828, + "duration": 0.012152, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "logs a warning when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 1.151677, + "duration": 0.970642, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 1.065265, + "duration": 0.68832, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.358822, + "duration": 0.986746, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000306, + "duration": 0.000175, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.47204, + "duration": 1.11845, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000276, + "duration": 0.000201, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.00047, + "duration": 0.000309, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.809456, + "duration": 0.604164, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 1.04335, + "duration": 0.782704, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.389964, + "duration": 1.005865, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.0146, + "duration": 0.006485, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.008406, + "duration": 0.001837, "requirements": [], "os": "linux" }, @@ -573,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.555371, + "duration": 1.217622, "requirements": [], "os": "linux" } @@ -585,7 +585,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 20.780179, + "duration": 15.039789000000003, "rate": 100 }, "byOs": { @@ -593,7 +593,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 20.780179, + "duration": 15.039789000000003, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 765382fc..20b0b2f6 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -10,7 +10,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.005 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | #### REQ-025 (100% passed) @@ -22,7 +22,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.006 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) @@ -34,25 +34,25 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.007 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.005 | | | +| REQ-031 | validates-missing-fields | Passed | 0.002 | | | #### REQ-032 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.001 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.034 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.020 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.004 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.008 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.009 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 1.192 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.004 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.253 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.797 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.810 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.001 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.167 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.274 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.080 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.166 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.801 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.837 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.864 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.814 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.035 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.478 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.015 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.075 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.005 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 1.026 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.096 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.693 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.832 | | | | Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.016 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.152 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.065 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.359 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.971 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.688 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.987 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.472 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.118 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.809 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.043 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.390 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.015 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.008 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.555 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.604 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.783 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.006 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.218 | | |
\ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index ecc1c74d..f0273990 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"d75aa8a5850a3e659307f08822f1a39152fc8aac","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"5a4805968fa13d6004d3e907575cc811c1ec371f","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/docs/actions/add-token-to-labview.md b/docs/actions/add-token-to-labview.md index 60a8cffa..6c859f7b 100644 --- a/docs/actions/add-token-to-labview.md +++ b/docs/actions/add-token-to-labview.md @@ -62,4 +62,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/add-token-to-labview/README.md](../../scripts/add-token-to-labview/README.md). +## See also + +- [Workflow documentation](../workflows/add-token-to-labview.md) +- [scripts/add-token-to-labview/README.md](../../scripts/add-token-to-labview/README.md) diff --git a/docs/actions/apply-vipc.md b/docs/actions/apply-vipc.md index 158b3191..44f3f9b1 100644 --- a/docs/actions/apply-vipc.md +++ b/docs/actions/apply-vipc.md @@ -70,4 +70,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/apply-vipc/README.md](../../scripts/apply-vipc/README.md). +## See also + +- [Workflow documentation](../workflows/apply-vipc.md) +- [scripts/apply-vipc/README.md](../../scripts/apply-vipc/README.md) diff --git a/docs/actions/build-lvlibp.md b/docs/actions/build-lvlibp.md index 0821da3e..b012259a 100644 --- a/docs/actions/build-lvlibp.md +++ b/docs/actions/build-lvlibp.md @@ -13,7 +13,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). - **MinimumSupportedLVVersion** (`string`): LabVIEW version used for the build. - **SupportedBitness** (`string`): "32" or "64" bitness of LabVIEW. - **RelativePath** (`string`): Path relative to the action's working directory. Use "." when the working directory is desired. -- **LabVIEW_Project** (`string`): Path to the LabVIEW project (.lvproj). +- **LabVIEW_Project** (`string`): Path to the LabVIEW project (.lvproj) - **Build_Spec** (`string`): Name of the build specification to execute. - **Major** (`int`): Major version number. - **Minor** (`int`): Minor version number. @@ -90,4 +90,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/build-lvlibp/README.md](../../scripts/build-lvlibp/README.md). +## See also + +- [Workflow documentation](../workflows/build-lvlibp.md) +- [scripts/build-lvlibp/README.md](../../scripts/build-lvlibp/README.md) diff --git a/docs/actions/build-vi-package.md b/docs/actions/build-vi-package.md index 3c3b1114..421f7c5f 100644 --- a/docs/actions/build-vi-package.md +++ b/docs/actions/build-vi-package.md @@ -12,7 +12,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). - **MinimumSupportedLVVersion** (`string`): Minimum LabVIEW version supported by the package. - **SupportedBitness** (`string`): "32" or "64" bitness of LabVIEW. -- **LabVIEWMinorRevision** (`string`): LabVIEW minor revision (e.g., "3"). +- **LabVIEWMinorRevision** (`string`): LabVIEW minor revision (e.g., "3") - **RelativePath** (`string`): Path relative to the action's working directory. Use "." when the working directory is desired. - **VIPBPath** (`string`): Relative path to the VIPB file to build. - **Major** (`int`): Major version component. @@ -95,4 +95,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/build-vi-package/README.md](../../scripts/build-vi-package/README.md). +## See also + +- [Workflow documentation](../workflows/build-vi-package.md) +- [scripts/build-vi-package/README.md](../../scripts/build-vi-package/README.md) diff --git a/docs/actions/build.md b/docs/actions/build.md index 982c00e4..e4294fbb 100644 --- a/docs/actions/build.md +++ b/docs/actions/build.md @@ -16,7 +16,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). - **Patch** (`int`): Patch version component. - **Build** (`int`): Build number component. - **Commit** (`string`): Commit identifier embedded in the build. -- **LabVIEWMinorRevision** (`string`): LabVIEW minor revision (e.g., "3"). +- **LabVIEWMinorRevision** (`string`): LabVIEW minor revision (e.g., "3") - **CompanyName** (`string`): Name of the company for metadata. - **AuthorName** (`string`): Author or organization name for metadata. @@ -86,4 +86,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/build/README.md](../../scripts/build/README.md). +## See also + +- [Workflow documentation](../workflows/build.md) +- [scripts/build/README.md](../../scripts/build/README.md) diff --git a/docs/actions/close-labview.md b/docs/actions/close-labview.md index aadeb401..f64642a5 100644 --- a/docs/actions/close-labview.md +++ b/docs/actions/close-labview.md @@ -56,4 +56,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/close-labview/README.md](../../scripts/close-labview/README.md). +## See also + +- [Workflow documentation](../workflows/close-labview.md) +- [scripts/close-labview/README.md](../../scripts/close-labview/README.md) diff --git a/docs/actions/generate-release-notes.md b/docs/actions/generate-release-notes.md index 0986dd30..06c43c30 100644 --- a/docs/actions/generate-release-notes.md +++ b/docs/actions/generate-release-notes.md @@ -14,7 +14,7 @@ None. ### Optional -- **OutputPath** (`string`): Path to write the release notes file (default `Tooling/deployment/release_notes.md`). +- **OutputPath** (`string`): Path to write the release notes file (default `Tooling/deployment/release_notes.md`) ## CLI example @@ -52,4 +52,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/generate-release-notes/README.md](../../scripts/generate-release-notes/README.md). +## See also + +- [Workflow documentation](../workflows/generate-release-notes.md) +- [scripts/generate-release-notes/README.md](../../scripts/generate-release-notes/README.md) diff --git a/docs/actions/index.md b/docs/actions/index.md index dabeebe2..990b95da 100644 --- a/docs/actions/index.md +++ b/docs/actions/index.md @@ -4,7 +4,7 @@ List of available GitHub Actions. - [add-token-to-labview](./add-token-to-labview.md): Add a custom library path token to the LabVIEW INI file so LabVIEW can locate project libraries. - [apply-vipc](./apply-vipc.md): Apply a VI Package Configuration (.vipc) file to a specific LabVIEW installation using g-cli. -- [build-lvlibp](./build-lvlibp.md): Build a LabVIEW project’s build specification into a Packed Project Library (.lvlibp). +- [build-lvlibp](./build-lvlibp.md): Build a LabVIEW project’s build specification into a Packed Project Library (.lvlibp) - [build-vi-package](./build-vi-package.md): Update VIPB display information and build a VI package using g-cli. - [build](./build.md): Automate building the LabVIEW Icon Editor project, including cleaning, building libraries, and packaging. - [close-labview](./close-labview.md): Gracefully close a running LabVIEW instance via g-cli. @@ -19,3 +19,7 @@ List of available GitHub Actions. - [run-unit-tests](./run-unit-tests.md): Run LabVIEW unit tests via the LabVIEW Unit Test Framework CLI and report pass/fail/error using standard exit codes. - [set-development-mode](./set-development-mode.md): Configure the repository for development mode by removing packed libraries, adding tokens, preparing sources, and closing LabVIEW. - [setup-mkdocs](./setup-mkdocs.md): Install a pinned MkDocs with caching. + +## See also + +- [Workflow documentation](../workflows/index.md) diff --git a/docs/actions/missing-in-project.md b/docs/actions/missing-in-project.md index 9263a35d..a6e573ea 100644 --- a/docs/actions/missing-in-project.md +++ b/docs/actions/missing-in-project.md @@ -61,4 +61,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/missing-in-project/README.md](../../scripts/missing-in-project/README.md). +## See also + +- [Workflow documentation](../workflows/missing-in-project.md) +- [scripts/missing-in-project/README.md](../../scripts/missing-in-project/README.md) diff --git a/docs/actions/modify-vipb-display-info.md b/docs/actions/modify-vipb-display-info.md index 0c249837..7b822802 100644 --- a/docs/actions/modify-vipb-display-info.md +++ b/docs/actions/modify-vipb-display-info.md @@ -14,7 +14,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). - **RelativePath** (`string`): Path relative to the action's working directory. Use "." when the working directory is desired. - **VIPBPath** (`string`): Relative path to the VIPB file. - **MinimumSupportedLVVersion** (`string`): Minimum LabVIEW version supported by the package. -- **LabVIEWMinorRevision** (`string`): LabVIEW minor revision (e.g., "3"). +- **LabVIEWMinorRevision** (`string`): LabVIEW minor revision (e.g., "3") - **Major** (`int`): Major version component. - **Minor** (`int`): Minor version component. - **Patch** (`int`): Patch version component. @@ -95,4 +95,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/modify-vipb-display-info/README.md](../../scripts/modify-vipb-display-info/README.md). +## See also + +- [Workflow documentation](../workflows/modify-vipb-display-info.md) +- [scripts/modify-vipb-display-info/README.md](../../scripts/modify-vipb-display-info/README.md) diff --git a/docs/actions/prepare-labview-source.md b/docs/actions/prepare-labview-source.md index c458e5ad..6d71dee1 100644 --- a/docs/actions/prepare-labview-source.md +++ b/docs/actions/prepare-labview-source.md @@ -13,7 +13,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). - **MinimumSupportedLVVersion** (`string`): LabVIEW version used to run g-cli. - **SupportedBitness** (`string`): "32" or "64" bitness of LabVIEW. - **RelativePath** (`string`): Path relative to the action's working directory. Use "." when the working directory is desired. -- **LabVIEW_Project** (`string`): Name of the LabVIEW project (without extension). +- **LabVIEW_Project** (`string`): Name of the LabVIEW project (without extension) - **Build_Spec** (`string`): Name of the build specification to prepare. ### Optional @@ -70,4 +70,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/prepare-labview-source/README.md](../../scripts/prepare-labview-source/README.md). +## See also + +- [Workflow documentation](../workflows/prepare-labview-source.md) +- [scripts/prepare-labview-source/README.md](../../scripts/prepare-labview-source/README.md) diff --git a/docs/actions/rename-file.md b/docs/actions/rename-file.md index fbc83a24..55b5084d 100644 --- a/docs/actions/rename-file.md +++ b/docs/actions/rename-file.md @@ -56,4 +56,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/rename-file/README.md](../../scripts/rename-file/README.md). +## See also + +- [Workflow documentation](../workflows/rename-file.md) +- [scripts/rename-file/README.md](../../scripts/rename-file/README.md) diff --git a/docs/actions/restore-setup-lv-source.md b/docs/actions/restore-setup-lv-source.md index bec69136..6f829d77 100644 --- a/docs/actions/restore-setup-lv-source.md +++ b/docs/actions/restore-setup-lv-source.md @@ -13,7 +13,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). - **MinimumSupportedLVVersion** (`string`): LabVIEW version used to run g-cli. - **SupportedBitness** (`string`): "32" or "64" bitness of LabVIEW. - **RelativePath** (`string`): Path relative to the action's working directory. Use "." when the working directory is desired. -- **LabVIEW_Project** (`string`): Name of the LabVIEW project (without extension). +- **LabVIEW_Project** (`string`): Name of the LabVIEW project (without extension) - **Build_Spec** (`string`): Build specification name within the project. ### Optional @@ -70,4 +70,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/restore-setup-lv-source/README.md](../../scripts/restore-setup-lv-source/README.md). +## See also + +- [Workflow documentation](../workflows/restore-setup-lv-source.md) +- [scripts/restore-setup-lv-source/README.md](../../scripts/restore-setup-lv-source/README.md) diff --git a/docs/actions/revert-development-mode.md b/docs/actions/revert-development-mode.md index 4033f72c..0d8bbae7 100644 --- a/docs/actions/revert-development-mode.md +++ b/docs/actions/revert-development-mode.md @@ -54,4 +54,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/revert-development-mode/README.md](../../scripts/revert-development-mode/README.md). +## See also + +- [Workflow documentation](../workflows/revert-development-mode.md) +- [scripts/revert-development-mode/README.md](../../scripts/revert-development-mode/README.md) diff --git a/docs/actions/run-pester-tests.md b/docs/actions/run-pester-tests.md index 9c980daf..321ba2b7 100644 --- a/docs/actions/run-pester-tests.md +++ b/docs/actions/run-pester-tests.md @@ -56,4 +56,7 @@ See [run-pester-tests/action.yml](../../run-pester-tests/action.yml) and [script For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/run-pester-tests/README.md](../../scripts/run-pester-tests/README.md). +## See also + +- [Workflow documentation](../workflows/run-pester-tests.md) +- [scripts/run-pester-tests/README.md](../../scripts/run-pester-tests/README.md) diff --git a/docs/actions/run-unit-tests.md b/docs/actions/run-unit-tests.md index 5c2eb12b..3bf2c1b0 100644 --- a/docs/actions/run-unit-tests.md +++ b/docs/actions/run-unit-tests.md @@ -66,4 +66,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/run-unit-tests/README.md](../../scripts/run-unit-tests/README.md). +## See also + +- [Workflow documentation](../workflows/run-unit-tests.md) +- [scripts/run-unit-tests/README.md](../../scripts/run-unit-tests/README.md) diff --git a/docs/actions/set-development-mode.md b/docs/actions/set-development-mode.md index 2ef56e57..4a3a9229 100644 --- a/docs/actions/set-development-mode.md +++ b/docs/actions/set-development-mode.md @@ -54,4 +54,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). -See also: [scripts/set-development-mode/README.md](../../scripts/set-development-mode/README.md). +## See also + +- [Workflow documentation](../workflows/set-development-mode.md) +- [scripts/set-development-mode/README.md](../../scripts/set-development-mode/README.md) diff --git a/docs/actions/setup-mkdocs.md b/docs/actions/setup-mkdocs.md index 038c31c9..2efd8394 100644 --- a/docs/actions/setup-mkdocs.md +++ b/docs/actions/setup-mkdocs.md @@ -27,3 +27,7 @@ This action has no inputs. See [setup-mkdocs/action.yml](../../setup-mkdocs/action.yml) for implementation details. For troubleshooting tips, see the [troubleshooting guide](../troubleshooting.md). + +## See also + +- [Workflow documentation](../workflows/setup-mkdocs.md) diff --git a/docs/workflows/add-token-to-labview.md b/docs/workflows/add-token-to-labview.md index a5683a74..ba3124e4 100644 --- a/docs/workflows/add-token-to-labview.md +++ b/docs/workflows/add-token-to-labview.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName add-token-to-labview -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/add-token-to-labview.md) diff --git a/docs/workflows/apply-vipc.md b/docs/workflows/apply-vipc.md index 8ab84db1..78df11d9 100644 --- a/docs/workflows/apply-vipc.md +++ b/docs/workflows/apply-vipc.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName apply-vipc -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/apply-vipc.md) diff --git a/docs/workflows/build-lvlibp.md b/docs/workflows/build-lvlibp.md index e7a4e827..ec8beec7 100644 --- a/docs/workflows/build-lvlibp.md +++ b/docs/workflows/build-lvlibp.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName build-lvlibp -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/build-lvlibp.md) diff --git a/docs/workflows/build-vi-package.md b/docs/workflows/build-vi-package.md index e5ed5147..2e15def7 100644 --- a/docs/workflows/build-vi-package.md +++ b/docs/workflows/build-vi-package.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName build-vi-package -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/build-vi-package.md) diff --git a/docs/workflows/build.md b/docs/workflows/build.md index 0788c141..feeec20a 100644 --- a/docs/workflows/build.md +++ b/docs/workflows/build.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName build -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/build.md) diff --git a/docs/workflows/close-labview.md b/docs/workflows/close-labview.md index b552d2be..277007a8 100644 --- a/docs/workflows/close-labview.md +++ b/docs/workflows/close-labview.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName close-labview -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/close-labview.md) diff --git a/docs/workflows/generate-release-notes.md b/docs/workflows/generate-release-notes.md index 462d9b3a..0190d4d1 100644 --- a/docs/workflows/generate-release-notes.md +++ b/docs/workflows/generate-release-notes.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName generate-release-notes -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/generate-release-notes.md) diff --git a/docs/workflows/index.md b/docs/workflows/index.md index 1c99e5ab..30d7f24c 100644 --- a/docs/workflows/index.md +++ b/docs/workflows/index.md @@ -19,3 +19,7 @@ List of reusable GitHub Workflows. - [run-unit-tests workflow](./run-unit-tests.md): Dispatch the [run-unit-tests](../actions/run-unit-tests.md) action to a target repository through `Invoke-OSAction.ps1`. - [set-development-mode workflow](./set-development-mode.md): Dispatch the [set-development-mode](../actions/set-development-mode.md) action to a target repository through `Invoke-OSAction.ps1`. - [setup-mkdocs workflow](./setup-mkdocs.md): Dispatch the [setup-mkdocs](../actions/setup-mkdocs.md) action to a target repository through `Invoke-OSAction.ps1`. + +## See also + +- [Action documentation](../actions/index.md) diff --git a/docs/workflows/missing-in-project.md b/docs/workflows/missing-in-project.md index a50fa93e..1e3b8aa2 100644 --- a/docs/workflows/missing-in-project.md +++ b/docs/workflows/missing-in-project.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName missing-in-project -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/missing-in-project.md) diff --git a/docs/workflows/modify-vipb-display-info.md b/docs/workflows/modify-vipb-display-info.md index b30f8394..03f300bf 100644 --- a/docs/workflows/modify-vipb-display-info.md +++ b/docs/workflows/modify-vipb-display-info.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName modify-vipb-display-info -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/modify-vipb-display-info.md) diff --git a/docs/workflows/prepare-labview-source.md b/docs/workflows/prepare-labview-source.md index 3950ba70..f93be960 100644 --- a/docs/workflows/prepare-labview-source.md +++ b/docs/workflows/prepare-labview-source.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName prepare-labview-source -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/prepare-labview-source.md) diff --git a/docs/workflows/rename-file.md b/docs/workflows/rename-file.md index 779af7a2..4973da67 100644 --- a/docs/workflows/rename-file.md +++ b/docs/workflows/rename-file.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName rename-file -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/rename-file.md) diff --git a/docs/workflows/restore-setup-lv-source.md b/docs/workflows/restore-setup-lv-source.md index bdbce0dc..05123bd7 100644 --- a/docs/workflows/restore-setup-lv-source.md +++ b/docs/workflows/restore-setup-lv-source.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName restore-setup-lv-source -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/restore-setup-lv-source.md) diff --git a/docs/workflows/revert-development-mode.md b/docs/workflows/revert-development-mode.md index be78cfba..a62f8746 100644 --- a/docs/workflows/revert-development-mode.md +++ b/docs/workflows/revert-development-mode.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName revert-development-mode -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/revert-development-mode.md) diff --git a/docs/workflows/run-pester-tests.md b/docs/workflows/run-pester-tests.md index 48bbdc26..1a923718 100644 --- a/docs/workflows/run-pester-tests.md +++ b/docs/workflows/run-pester-tests.md @@ -49,3 +49,7 @@ jobs: After the workflow completes, the target repository will contain a `requirement-coverage.json` file summarizing requirement pass/fail status from the test run. ``` + +## See also + +- [Action documentation](../actions/run-pester-tests.md) diff --git a/docs/workflows/run-unit-tests.md b/docs/workflows/run-unit-tests.md index 6c732e35..01106b08 100644 --- a/docs/workflows/run-unit-tests.md +++ b/docs/workflows/run-unit-tests.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName run-unit-tests -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/run-unit-tests.md) diff --git a/docs/workflows/set-development-mode.md b/docs/workflows/set-development-mode.md index e7af20d1..3b1d723a 100644 --- a/docs/workflows/set-development-mode.md +++ b/docs/workflows/set-development-mode.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName set-development-mode -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/set-development-mode.md) diff --git a/docs/workflows/setup-mkdocs.md b/docs/workflows/setup-mkdocs.md index 5953b2ee..0146bfea 100644 --- a/docs/workflows/setup-mkdocs.md +++ b/docs/workflows/setup-mkdocs.md @@ -47,3 +47,7 @@ jobs: shell: pwsh run: ./actions/Invoke-OSAction.ps1 -ActionName setup-mkdocs -WorkingDirectory "${{ github.workspace }}/target" ``` + +## See also + +- [Action documentation](../actions/setup-mkdocs.md) diff --git a/error-summary.md b/error-summary.md index 06849cc5..b26129ae 100644 --- a/error-summary.md +++ b/error-summary.md @@ -8,6 +8,22 @@ Error: All tests are unmapped; verify requirements mapping. ``` +### Error generating CI summary + +``` +Error: No JUnit files found + at main (/workspace/open-source/scripts/generate-ci-summary.ts:76:15) +``` + + +### Error generating CI summary + +``` +Error: All tests are unmapped; verify requirements mapping. + at main (/workspace/open-source/scripts/generate-ci-summary.ts:91:13) +``` + + ### Error generating CI summary ``` diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index fc34ab90..278444d1 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61,5 +61,5 @@ - + From 2dc2343aec78aa8d17b2aca8d594e96db76b610e Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 02:03:32 -0700 Subject: [PATCH 67/73] docs: add action doc template (REQ-001) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 82 +++++++-------- artifacts/linux/traceability.json | 112 ++++++++++----------- artifacts/linux/traceability.md | 82 +++++++-------- ci_evidence.txt | 2 +- docs/actions/add-token-to-labview.md | 28 +++--- docs/actions/apply-vipc.md | 32 +++--- docs/actions/build-lvlibp.md | 42 ++++---- docs/actions/build-vi-package.md | 44 ++++---- docs/actions/build.md | 40 ++++---- docs/actions/close-labview.md | 24 +++-- docs/actions/generate-release-notes.md | 22 ++-- docs/actions/missing-in-project.md | 26 ++--- docs/actions/modify-vipb-display-info.md | 44 ++++---- docs/actions/prepare-labview-source.md | 32 +++--- docs/actions/rename-file.md | 24 +++-- docs/actions/restore-setup-lv-source.md | 32 +++--- docs/actions/revert-development-mode.md | 24 +++-- docs/actions/run-pester-tests.md | 22 ++-- docs/actions/run-unit-tests.md | 32 +++--- docs/actions/set-development-mode.md | 24 +++-- docs/actions/setup-mkdocs.md | 6 +- docs/contributing-docs.md | 4 + docs/template-action.md | 51 ++++++++++ docs/workflows/add-token-to-labview.md | 14 ++- docs/workflows/apply-vipc.md | 14 ++- docs/workflows/build-lvlibp.md | 14 ++- docs/workflows/build-vi-package.md | 14 ++- docs/workflows/build.md | 14 ++- docs/workflows/close-labview.md | 14 ++- docs/workflows/generate-release-notes.md | 14 ++- docs/workflows/missing-in-project.md | 14 ++- docs/workflows/modify-vipb-display-info.md | 14 ++- docs/workflows/prepare-labview-source.md | 14 ++- docs/workflows/rename-file.md | 14 ++- docs/workflows/restore-setup-lv-source.md | 14 ++- docs/workflows/revert-development-mode.md | 14 ++- docs/workflows/run-pester-tests.md | 14 ++- docs/workflows/run-unit-tests.md | 14 ++- docs/workflows/set-development-mode.md | 14 ++- docs/workflows/setup-mkdocs.md | 14 ++- error-summary.md | 16 +++ test-results/node-junit.xml | 110 ++++++++++---------- 44 files changed, 705 insertions(+), 498 deletions(-) create mode 100644 docs/template-action.md diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 4e239a69..3930243a 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 15.04 | 100.00 | -| linux | 54 | 0 | 0 | 15.04 | 100.00 | +| overall | 54 | 0 | 0 | 19.61 | 100.00 | +| linux | 54 | 0 | 0 | 19.61 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index c1f570c6..6cf2b764 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 15.04 | 100.00 | -| linux | 54 | 0 | 0 | 15.04 | 100.00 | +| overall | 54 | 0 | 0 | 19.61 | 100.00 | +| linux | 54 | 0 | 0 | 19.61 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 20b0b2f6..f84255bf 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,31 +4,31 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.009 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.002 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | #### REQ-028 (100% passed) @@ -52,7 +52,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.002 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) @@ -70,48 +70,48 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.020 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.010 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.009 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.012 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.004 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 0.797 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.810 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.801 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.837 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.864 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.814 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 1.156 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.110 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.006 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.180 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.299 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.030 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.053 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | | Unmapped | generate-ci-summary-features | Passed | 0.015 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.075 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.693 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.832 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.016 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.971 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.688 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.987 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.328 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.004 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.932 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.957 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.005 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.071 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.961 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.257 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.118 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.604 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.783 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.006 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.218 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.435 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.011 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.786 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.936 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.318 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.004 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.645 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index a7801825..166cc0f5 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.00836, + "duration": 0.009009, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.002228, + "duration": 0.00344, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.003601, + "duration": 0.005013, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.000836, + "duration": 0.0015, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.000952, + "duration": 0.001623, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.003543, + "duration": 0.003533, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.00198, + "duration": 0.001576, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.002017, + "duration": 0.002309, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.001587, + "duration": 0.001307, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000565, + "duration": 0.000573, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001518, + "duration": 0.001853, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.020357, + "duration": 0.009675, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.003471, + "duration": 0.00237, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.000897, + "duration": 0.001439, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000404, + "duration": 0.00109, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.007968, + "duration": 0.011505, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.009706, + "duration": 0.004422, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.009454, + "duration": 0.009561, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000233, + "duration": 0.000329, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "detects downloaded artifacts path", "className": "test", "status": "Passed", - "duration": 0.797385, + "duration": 1.156154, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.002594, + "duration": 0.005243, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.809676, + "duration": 1.110031, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000885, + "duration": 0.001929, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000159, + "duration": 0.006144, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.800893, + "duration": 1.180063, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 0.837024, + "duration": 1.29899, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.864368, + "duration": 1.030078, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.814465, + "duration": 1.053016, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000188, + "duration": 0.000469, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000128, + "duration": 0.000331, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.003391, + "duration": 0.002524, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000309, + "duration": 0.000468, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.014674, + "duration": 0.014704, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.075346, + "duration": 1.327704, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.00106, + "duration": 0.001568, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000268, + "duration": 0.003959, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000397, + "duration": 0.000536, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.692842, + "duration": 0.931806, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.832402, + "duration": 0.95705, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.015986, + "duration": 0.014851, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.012152, + "duration": 0.005243, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "logs a warning when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.970642, + "duration": 1.071358, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.68832, + "duration": 0.961151, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.986746, + "duration": 1.257111, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000175, + "duration": 0.000433, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.11845, + "duration": 1.435265, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000201, + "duration": 0.010709, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000309, + "duration": 0.000501, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.604164, + "duration": 0.785877, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.782704, + "duration": 0.936249, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.005865, + "duration": 1.318484, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.006485, + "duration": 0.00413, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.001837, + "duration": 0.004004, "requirements": [], "os": "linux" }, @@ -573,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.217622, + "duration": 1.645394, "requirements": [], "os": "linux" } @@ -585,7 +585,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 15.039789000000003, + "duration": 19.605653999999998, "rate": 100 }, "byOs": { @@ -593,7 +593,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 15.039789000000003, + "duration": 19.605653999999998, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 20b0b2f6..f84255bf 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,31 +4,31 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.008 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.009 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.002 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | #### REQ-028 (100% passed) @@ -52,7 +52,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.002 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) @@ -70,48 +70,48 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.020 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.010 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.000 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.009 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.012 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.004 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 0.797 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.810 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.801 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.837 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.864 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.814 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 1.156 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.110 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.006 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.180 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.299 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 1.030 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.053 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | | Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | | Unmapped | generate-ci-summary-features | Passed | 0.015 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.075 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.693 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.832 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.016 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.012 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.971 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.688 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.987 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.328 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.004 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.932 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.957 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.005 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.071 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.961 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.257 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.118 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.604 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.783 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.006 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.218 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.435 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.011 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.786 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.936 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.318 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.004 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.645 | | | \ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index f0273990..2074c7ab 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"5a4805968fa13d6004d3e907575cc811c1ec371f","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"7f82f0b8a7dc406f568e5eb2e52a9c6502cb1c98","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/docs/actions/add-token-to-labview.md b/docs/actions/add-token-to-labview.md index 6c859f7b..bfb33cb9 100644 --- a/docs/actions/add-token-to-labview.md +++ b/docs/actions/add-token-to-labview.md @@ -18,18 +18,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName add-token-to-labview -ArgsJson '{ - "MinimumSupportedLVVersion": "2021", - "SupportedBitness": "64", - "WorkingDirectory": ".", - "RelativePath": "." -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -43,7 +32,20 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName add-token-to-labview -ArgsJson '{ + "MinimumSupportedLVVersion": "2021", + "SupportedBitness": "64", + "WorkingDirectory": ".", + "RelativePath": "." +}' +``` + +### GitHub Action ```yaml - name: Add library token diff --git a/docs/actions/apply-vipc.md b/docs/actions/apply-vipc.md index 44f3f9b1..33c1469c 100644 --- a/docs/actions/apply-vipc.md +++ b/docs/actions/apply-vipc.md @@ -20,20 +20,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName apply-vipc -ArgsJson '{ - "MinimumSupportedLVVersion": "2019", - "VIP_LVVersion": "2019", - "SupportedBitness": "64", - "WorkingDirectory": ".", - "RelativePath": ".", - "VIPCPath": "MyProject.vipc" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -49,7 +36,22 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName apply-vipc -ArgsJson '{ + "MinimumSupportedLVVersion": "2019", + "VIP_LVVersion": "2019", + "SupportedBitness": "64", + "WorkingDirectory": ".", + "RelativePath": ".", + "VIPCPath": "MyProject.vipc" +}' +``` + +### GitHub Action ```yaml - name: Apply VIPC diff --git a/docs/actions/build-lvlibp.md b/docs/actions/build-lvlibp.md index b012259a..98a0edec 100644 --- a/docs/actions/build-lvlibp.md +++ b/docs/actions/build-lvlibp.md @@ -25,25 +25,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName build-lvlibp -ArgsJson '{ - "MinimumSupportedLVVersion": "2020", - "SupportedBitness": "64", - "WorkingDirectory": ".", - "RelativePath": ".", - "LabVIEW_Project": "Source/MyProject.lvproj", - "Build_Spec": "PackedLib Build", - "Major": 1, - "Minor": 0, - "Patch": 0, - "Build": 123, - "Commit": "abcdef" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -64,7 +46,27 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName build-lvlibp -ArgsJson '{ + "MinimumSupportedLVVersion": "2020", + "SupportedBitness": "64", + "WorkingDirectory": ".", + "RelativePath": ".", + "LabVIEW_Project": "Source/MyProject.lvproj", + "Build_Spec": "PackedLib Build", + "Major": 1, + "Minor": 0, + "Patch": 0, + "Build": 123, + "Commit": "abcdef" +}' +``` + +### GitHub Action ```yaml - name: Build Packed Library diff --git a/docs/actions/build-vi-package.md b/docs/actions/build-vi-package.md index 421f7c5f..854669cb 100644 --- a/docs/actions/build-vi-package.md +++ b/docs/actions/build-vi-package.md @@ -26,26 +26,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). - **ReleaseNotesFile** (`string`): Path to a release notes file included in the package. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName build-vi-package -ArgsJson '{ - "MinimumSupportedLVVersion": "2023", - "SupportedBitness": "64", - "LabVIEWMinorRevision": "3", - "WorkingDirectory": ".", - "RelativePath": ".", - "VIPBPath": "Tooling/deployment/NI Icon editor.vipb", - "Major": 1, - "Minor": 0, - "Patch": 0, - "Build": 2, - "Commit": "abcdef", - "DisplayInformationJSON": "{\"Package Version\":{\"major\":1,\"minor\":0,\"patch\":0,\"build\":2}}" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -68,7 +49,28 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName build-vi-package -ArgsJson '{ + "MinimumSupportedLVVersion": "2023", + "SupportedBitness": "64", + "LabVIEWMinorRevision": "3", + "WorkingDirectory": ".", + "RelativePath": ".", + "VIPBPath": "Tooling/deployment/NI Icon editor.vipb", + "Major": 1, + "Minor": 0, + "Patch": 0, + "Build": 2, + "Commit": "abcdef", + "DisplayInformationJSON": "{\"Package Version\":{\"major\":1,\"minor\":0,\"patch\":0,\"build\":2}}" +}' +``` + +### GitHub Action ```yaml - name: Build VI Package diff --git a/docs/actions/build.md b/docs/actions/build.md index e4294fbb..54e04db5 100644 --- a/docs/actions/build.md +++ b/docs/actions/build.md @@ -24,24 +24,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName build -ArgsJson '{ - "WorkingDirectory": ".", - "RelativePath": ".", - "Major": 1, - "Minor": 0, - "Patch": 0, - "Build": 1, - "Commit": "abcdef", - "LabVIEWMinorRevision": "3", - "CompanyName": "Acme Corp", - "AuthorName": "Jane Doe" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -61,7 +44,26 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName build -ArgsJson '{ + "WorkingDirectory": ".", + "RelativePath": ".", + "Major": 1, + "Minor": 0, + "Patch": 0, + "Build": 1, + "Commit": "abcdef", + "LabVIEWMinorRevision": "3", + "CompanyName": "Acme Corp", + "AuthorName": "Jane Doe" +}' +``` + +### GitHub Action ```yaml - name: Build project diff --git a/docs/actions/close-labview.md b/docs/actions/close-labview.md index f64642a5..2a0bcc5a 100644 --- a/docs/actions/close-labview.md +++ b/docs/actions/close-labview.md @@ -17,16 +17,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName close-labview -ArgsJson '{ - "minimum_supported_lv_version": "2021", - "supported_bitness": "64" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -39,7 +30,18 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName close-labview -ArgsJson '{ + "minimum_supported_lv_version": "2021", + "supported_bitness": "64" +}' +``` + +### GitHub Action ```yaml - name: Close LabVIEW diff --git a/docs/actions/generate-release-notes.md b/docs/actions/generate-release-notes.md index 06c43c30..f37b3570 100644 --- a/docs/actions/generate-release-notes.md +++ b/docs/actions/generate-release-notes.md @@ -16,15 +16,7 @@ None. - **OutputPath** (`string`): Path to write the release notes file (default `Tooling/deployment/release_notes.md`) -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName generate-release-notes -ArgsJson '{ - "OutputPath": "Tooling/deployment/release_notes.md" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -36,7 +28,17 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName generate-release-notes -ArgsJson '{ + "OutputPath": "Tooling/deployment/release_notes.md" +}' +``` + +### GitHub Action ```yaml - name: Generate release notes diff --git a/docs/actions/missing-in-project.md b/docs/actions/missing-in-project.md index a6e573ea..9d97326a 100644 --- a/docs/actions/missing-in-project.md +++ b/docs/actions/missing-in-project.md @@ -18,17 +18,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName missing-in-project -ArgsJson '{ - "LVVersion": "2020", - "SupportedBitness": "64", - "ProjectFile": "MyProject.lvproj" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -42,7 +32,19 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName missing-in-project -ArgsJson '{ + "LVVersion": "2020", + "SupportedBitness": "64", + "ProjectFile": "MyProject.lvproj" +}' +``` + +### GitHub Action ```yaml - name: Check for Missing Project Items diff --git a/docs/actions/modify-vipb-display-info.md b/docs/actions/modify-vipb-display-info.md index 7b822802..af0eac2e 100644 --- a/docs/actions/modify-vipb-display-info.md +++ b/docs/actions/modify-vipb-display-info.md @@ -26,26 +26,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). - **ReleaseNotesFile** (`string`): Path to a release notes file injected into the build. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName modify-vipb-display-info -ArgsJson '{ - "SupportedBitness": "64", - "WorkingDirectory": ".", - "RelativePath": ".", - "VIPBPath": "Tooling/deployment/NI Icon editor.vipb", - "MinimumSupportedLVVersion": "2023", - "LabVIEWMinorRevision": "3", - "Major": 1, - "Minor": 0, - "Patch": 0, - "Build": 2, - "Commit": "abcdef", - "DisplayInformationJSON": "{\"Package Version\":{\"major\":1,\"minor\":0,\"patch\":0,\"build\":2}}" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -68,7 +49,28 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName modify-vipb-display-info -ArgsJson '{ + "SupportedBitness": "64", + "WorkingDirectory": ".", + "RelativePath": ".", + "VIPBPath": "Tooling/deployment/NI Icon editor.vipb", + "MinimumSupportedLVVersion": "2023", + "LabVIEWMinorRevision": "3", + "Major": 1, + "Minor": 0, + "Patch": 0, + "Build": 2, + "Commit": "abcdef", + "DisplayInformationJSON": "{\"Package Version\":{\"major\":1,\"minor\":0,\"patch\":0,\"build\":2}}" +}' +``` + +### GitHub Action ```yaml - name: Modify VIPB display info diff --git a/docs/actions/prepare-labview-source.md b/docs/actions/prepare-labview-source.md index 6d71dee1..bef10f84 100644 --- a/docs/actions/prepare-labview-source.md +++ b/docs/actions/prepare-labview-source.md @@ -20,20 +20,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName prepare-labview-source -ArgsJson '{ - "MinimumSupportedLVVersion": "2021", - "SupportedBitness": "64", - "WorkingDirectory": ".", - "RelativePath": ".", - "LabVIEW_Project": "lv_icon_editor", - "Build_Spec": "Editor Packed Library" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -49,7 +36,22 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName prepare-labview-source -ArgsJson '{ + "MinimumSupportedLVVersion": "2021", + "SupportedBitness": "64", + "WorkingDirectory": ".", + "RelativePath": ".", + "LabVIEW_Project": "lv_icon_editor", + "Build_Spec": "Editor Packed Library" +}' +``` + +### GitHub Action ```yaml - name: Prepare LabVIEW source diff --git a/docs/actions/rename-file.md b/docs/actions/rename-file.md index 55b5084d..1b3dad25 100644 --- a/docs/actions/rename-file.md +++ b/docs/actions/rename-file.md @@ -17,16 +17,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName rename-file -ArgsJson '{ - "CurrentFilename": "C:/path/lv_icon.lvlibp", - "NewFilename": "lv_icon_x64_v1.0.0.1+gabcdef.lvlibp" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -39,7 +30,18 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName rename-file -ArgsJson '{ + "CurrentFilename": "C:/path/lv_icon.lvlibp", + "NewFilename": "lv_icon_x64_v1.0.0.1+gabcdef.lvlibp" +}' +``` + +### GitHub Action ```yaml - name: Rename file diff --git a/docs/actions/restore-setup-lv-source.md b/docs/actions/restore-setup-lv-source.md index 6f829d77..0deffd87 100644 --- a/docs/actions/restore-setup-lv-source.md +++ b/docs/actions/restore-setup-lv-source.md @@ -20,20 +20,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName restore-setup-lv-source -ArgsJson '{ - "MinimumSupportedLVVersion": "2021", - "SupportedBitness": "64", - "WorkingDirectory": ".", - "RelativePath": ".", - "LabVIEW_Project": "lv_icon_editor", - "Build_Spec": "Editor Packed Library" -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -49,7 +36,22 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName restore-setup-lv-source -ArgsJson '{ + "MinimumSupportedLVVersion": "2021", + "SupportedBitness": "64", + "WorkingDirectory": ".", + "RelativePath": ".", + "LabVIEW_Project": "lv_icon_editor", + "Build_Spec": "Editor Packed Library" +}' +``` + +### GitHub Action ```yaml - name: Restore LabVIEW setup diff --git a/docs/actions/revert-development-mode.md b/docs/actions/revert-development-mode.md index 0d8bbae7..6b47e488 100644 --- a/docs/actions/revert-development-mode.md +++ b/docs/actions/revert-development-mode.md @@ -16,16 +16,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName revert-development-mode -ArgsJson '{ - "WorkingDirectory": ".", - "RelativePath": "." -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -37,7 +28,18 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName revert-development-mode -ArgsJson '{ + "WorkingDirectory": ".", + "RelativePath": "." +}' +``` + +### GitHub Action ```yaml - name: Revert development mode diff --git a/docs/actions/run-pester-tests.md b/docs/actions/run-pester-tests.md index 321ba2b7..ca6daee0 100644 --- a/docs/actions/run-pester-tests.md +++ b/docs/actions/run-pester-tests.md @@ -16,15 +16,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName run-pester-tests -ArgsJson '{ - "WorkingDirectory": "." -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -34,7 +26,17 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName run-pester-tests -ArgsJson '{ + "WorkingDirectory": "." +}' +``` + +### GitHub Action ```yaml - name: Run Pester tests diff --git a/docs/actions/run-unit-tests.md b/docs/actions/run-unit-tests.md index 3bf2c1b0..21db0c6d 100644 --- a/docs/actions/run-unit-tests.md +++ b/docs/actions/run-unit-tests.md @@ -17,7 +17,22 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example +### GitHub Action inputs + +GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). + +| Input | CLI parameter | Description | +| --- | --- | --- | +| `minimum_supported_lv_version` | `MinimumSupportedLVVersion` | LabVIEW version for the test run. | +| `supported_bitness` | `SupportedBitness` | "32" or "64" bitness of LabVIEW. | +| `gcli_path` | `gcliPath` | Optional path to the g-cli executable. | +| `working_directory` | `WorkingDirectory` | Base directory for the action; relative paths are resolved from here. | +| `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | +| `dry_run` | `DryRun` | If true, simulate the action without side effects. | + +## Examples + +### CLI ```powershell $json = @' @@ -35,20 +50,7 @@ Alternatively, load arguments from a JSON file: pwsh -File actions/Invoke-OSAction.ps1 -ActionName run-unit-tests -ArgsFile ./config/run-tests.json ``` -## GitHub Action inputs - -GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). - -| Input | CLI parameter | Description | -| --- | --- | --- | -| `minimum_supported_lv_version` | `MinimumSupportedLVVersion` | LabVIEW version for the test run. | -| `supported_bitness` | `SupportedBitness` | "32" or "64" bitness of LabVIEW. | -| `gcli_path` | `gcliPath` | Optional path to the g-cli executable. | -| `working_directory` | `WorkingDirectory` | Base directory for the action; relative paths are resolved from here. | -| `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | -| `dry_run` | `DryRun` | If true, simulate the action without side effects. | - -## GitHub Action example +### GitHub Action ```yaml - name: Run LabVIEW Unit Tests diff --git a/docs/actions/set-development-mode.md b/docs/actions/set-development-mode.md index 4a3a9229..47e1bf76 100644 --- a/docs/actions/set-development-mode.md +++ b/docs/actions/set-development-mode.md @@ -16,16 +16,7 @@ Common parameters are described in [Common parameters](../common-parameters.md). None. -## CLI example - -```powershell -pwsh -File actions/Invoke-OSAction.ps1 -ActionName set-development-mode -ArgsJson '{ - "WorkingDirectory": ".", - "RelativePath": "." -}' -``` - -## GitHub Action inputs +### GitHub Action inputs GitHub Action inputs are provided in `snake_case`, while CLI parameters use `PascalCase`. The table below maps each input to its corresponding CLI parameter. For details on shared CLI flags, see [Common parameters](../common-parameters.md). @@ -37,7 +28,18 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | | `dry_run` | `DryRun` | If true, simulate the action without side effects. | -## GitHub Action example +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName set-development-mode -ArgsJson '{ + "WorkingDirectory": ".", + "RelativePath": "." +}' +``` + +### GitHub Action ```yaml - name: Set development mode diff --git a/docs/actions/setup-mkdocs.md b/docs/actions/setup-mkdocs.md index 2efd8394..10c5f8a7 100644 --- a/docs/actions/setup-mkdocs.md +++ b/docs/actions/setup-mkdocs.md @@ -8,11 +8,13 @@ Install a pinned MkDocs with caching. None. -## GitHub Action inputs +### GitHub Action inputs This action has no inputs. -## GitHub Action example +## Examples + +### GitHub Action ```yaml - name: Setup MkDocs diff --git a/docs/contributing-docs.md b/docs/contributing-docs.md index afbcc7c4..6c778ab8 100644 --- a/docs/contributing-docs.md +++ b/docs/contributing-docs.md @@ -8,6 +8,10 @@ Action documentation lives under [docs/actions](actions/README.md). Keep these f - Run `npm run verify:docs` to check that documented inputs match each action's action.yml. +### Template + +Use [docs/template-action.md](template-action.md) as the starting point for new or updated action and workflow docs. Each document should include **Purpose**, **Parameters**, **Examples**, and **Return Codes** sections, with GitHub Action inputs mapped to CLI parameters and example code blocks for both CLI and GitHub usage. + ## Markdown linting - Run `npm run lint:md` to lint Markdown formatting. diff --git a/docs/template-action.md b/docs/template-action.md new file mode 100644 index 00000000..fe88a312 --- /dev/null +++ b/docs/template-action.md @@ -0,0 +1,51 @@ +# Action Documentation Template + +This template standardizes action and workflow documentation. + +## Purpose + +Explain what the action or workflow does. + +## Parameters + +Describe required and optional parameters. + +### Required + +- **ParameterName** (`type`): Description of required parameter. + +### Optional + +- **ParameterName** (`type`): Description of optional parameter. + +### GitHub Action inputs + +Map GitHub Action inputs to CLI parameters when applicable. + +| Input | CLI parameter | Description | +| --- | --- | --- | +| `input_name` | `ParameterName` | Explanation. | + +## Examples + +### CLI + +```powershell +pwsh -File actions/Invoke-OSAction.ps1 -ActionName -ArgsJson '{ + "ParameterName": "value" +}' +``` + +### GitHub Action + +```yaml +- name: Run action + uses: owner/repo/@v1 + with: + input_name: value +``` + +## Return Codes + +- `0` – success +- non‑zero – failure diff --git a/docs/workflows/add-token-to-labview.md b/docs/workflows/add-token-to-labview.md index ba3124e4..d0eb3543 100644 --- a/docs/workflows/add-token-to-labview.md +++ b/docs/workflows/add-token-to-labview.md @@ -4,20 +4,22 @@ Dispatch the [add-token-to-labview](../actions/add-token-to-labview.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: add-token-to-labview @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName add-token-to-labview -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/add-token-to-labview.md) diff --git a/docs/workflows/apply-vipc.md b/docs/workflows/apply-vipc.md index 78df11d9..0cc62fad 100644 --- a/docs/workflows/apply-vipc.md +++ b/docs/workflows/apply-vipc.md @@ -4,20 +4,22 @@ Dispatch the [apply-vipc](../actions/apply-vipc.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: apply-vipc @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName apply-vipc -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/apply-vipc.md) diff --git a/docs/workflows/build-lvlibp.md b/docs/workflows/build-lvlibp.md index ec8beec7..802be115 100644 --- a/docs/workflows/build-lvlibp.md +++ b/docs/workflows/build-lvlibp.md @@ -4,20 +4,22 @@ Dispatch the [build-lvlibp](../actions/build-lvlibp.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: build-lvlibp @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName build-lvlibp -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/build-lvlibp.md) diff --git a/docs/workflows/build-vi-package.md b/docs/workflows/build-vi-package.md index 2e15def7..464a0213 100644 --- a/docs/workflows/build-vi-package.md +++ b/docs/workflows/build-vi-package.md @@ -4,20 +4,22 @@ Dispatch the [build-vi-package](../actions/build-vi-package.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: build-vi-package @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName build-vi-package -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/build-vi-package.md) diff --git a/docs/workflows/build.md b/docs/workflows/build.md index feeec20a..ad742468 100644 --- a/docs/workflows/build.md +++ b/docs/workflows/build.md @@ -4,20 +4,22 @@ Dispatch the [build](../actions/build.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: build @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName build -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/build.md) diff --git a/docs/workflows/close-labview.md b/docs/workflows/close-labview.md index 277007a8..478bb018 100644 --- a/docs/workflows/close-labview.md +++ b/docs/workflows/close-labview.md @@ -4,20 +4,22 @@ Dispatch the [close-labview](../actions/close-labview.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: close-labview @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName close-labview -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/close-labview.md) diff --git a/docs/workflows/generate-release-notes.md b/docs/workflows/generate-release-notes.md index 0190d4d1..e18ac132 100644 --- a/docs/workflows/generate-release-notes.md +++ b/docs/workflows/generate-release-notes.md @@ -4,20 +4,22 @@ Dispatch the [generate-release-notes](../actions/generate-release-notes.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: generate-release-notes @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName generate-release-notes -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/generate-release-notes.md) diff --git a/docs/workflows/missing-in-project.md b/docs/workflows/missing-in-project.md index 1e3b8aa2..91c70c48 100644 --- a/docs/workflows/missing-in-project.md +++ b/docs/workflows/missing-in-project.md @@ -4,20 +4,22 @@ Dispatch the [missing-in-project](../actions/missing-in-project.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: missing-in-project @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName missing-in-project -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/missing-in-project.md) diff --git a/docs/workflows/modify-vipb-display-info.md b/docs/workflows/modify-vipb-display-info.md index 03f300bf..72d0a4c9 100644 --- a/docs/workflows/modify-vipb-display-info.md +++ b/docs/workflows/modify-vipb-display-info.md @@ -4,20 +4,22 @@ Dispatch the [modify-vipb-display-info](../actions/modify-vipb-display-info.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: modify-vipb-display-info @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName modify-vipb-display-info -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/modify-vipb-display-info.md) diff --git a/docs/workflows/prepare-labview-source.md b/docs/workflows/prepare-labview-source.md index f93be960..08927904 100644 --- a/docs/workflows/prepare-labview-source.md +++ b/docs/workflows/prepare-labview-source.md @@ -4,20 +4,22 @@ Dispatch the [prepare-labview-source](../actions/prepare-labview-source.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: prepare-labview-source @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName prepare-labview-source -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/prepare-labview-source.md) diff --git a/docs/workflows/rename-file.md b/docs/workflows/rename-file.md index 4973da67..a6dce5ed 100644 --- a/docs/workflows/rename-file.md +++ b/docs/workflows/rename-file.md @@ -4,20 +4,22 @@ Dispatch the [rename-file](../actions/rename-file.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: rename-file @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName rename-file -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/rename-file.md) diff --git a/docs/workflows/restore-setup-lv-source.md b/docs/workflows/restore-setup-lv-source.md index 05123bd7..b406eda7 100644 --- a/docs/workflows/restore-setup-lv-source.md +++ b/docs/workflows/restore-setup-lv-source.md @@ -4,20 +4,22 @@ Dispatch the [restore-setup-lv-source](../actions/restore-setup-lv-source.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: restore-setup-lv-source @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName restore-setup-lv-source -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/restore-setup-lv-source.md) diff --git a/docs/workflows/revert-development-mode.md b/docs/workflows/revert-development-mode.md index a62f8746..fd018f09 100644 --- a/docs/workflows/revert-development-mode.md +++ b/docs/workflows/revert-development-mode.md @@ -4,20 +4,22 @@ Dispatch the [revert-development-mode](../actions/revert-development-mode.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: revert-development-mode @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName revert-development-mode -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/revert-development-mode.md) diff --git a/docs/workflows/run-pester-tests.md b/docs/workflows/run-pester-tests.md index 1a923718..048cf917 100644 --- a/docs/workflows/run-pester-tests.md +++ b/docs/workflows/run-pester-tests.md @@ -4,20 +4,22 @@ Dispatch the [run-pester-tests](../actions/run-pester-tests.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: run-pester-tests @@ -50,6 +52,10 @@ jobs: After the workflow completes, the target repository will contain a `requirement-coverage.json` file summarizing requirement pass/fail status from the test run. ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/run-pester-tests.md) diff --git a/docs/workflows/run-unit-tests.md b/docs/workflows/run-unit-tests.md index 01106b08..703eba67 100644 --- a/docs/workflows/run-unit-tests.md +++ b/docs/workflows/run-unit-tests.md @@ -4,20 +4,22 @@ Dispatch the [run-unit-tests](../actions/run-unit-tests.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: run-unit-tests @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName run-unit-tests -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/run-unit-tests.md) diff --git a/docs/workflows/set-development-mode.md b/docs/workflows/set-development-mode.md index 3b1d723a..b1d7d398 100644 --- a/docs/workflows/set-development-mode.md +++ b/docs/workflows/set-development-mode.md @@ -4,20 +4,22 @@ Dispatch the [set-development-mode](../actions/set-development-mode.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: set-development-mode @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName set-development-mode -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/set-development-mode.md) diff --git a/docs/workflows/setup-mkdocs.md b/docs/workflows/setup-mkdocs.md index 0146bfea..5a96046d 100644 --- a/docs/workflows/setup-mkdocs.md +++ b/docs/workflows/setup-mkdocs.md @@ -4,20 +4,22 @@ Dispatch the [setup-mkdocs](../actions/setup-mkdocs.md) action to a target repository through `Invoke-OSAction.ps1`. -## Inputs +## Parameters -| Input | Description | +### Inputs + +| Parameter | Description | | --- | --- | | `repository` | Repository in `owner/repo` format to operate on. | | `ref` | Branch or tag to check out. Defaults to `main`. | -## Required secrets +### Secrets | Secret | Description | | --- | --- | | `REPO_TOKEN` | Personal access token with permission to read the target repository. | -## Example +## Examples ```yaml name: setup-mkdocs @@ -48,6 +50,10 @@ jobs: run: ./actions/Invoke-OSAction.ps1 -ActionName setup-mkdocs -WorkingDirectory "${{ github.workspace }}/target" ``` +## Return Codes + +- N/A + ## See also - [Action documentation](../actions/setup-mkdocs.md) diff --git a/error-summary.md b/error-summary.md index b26129ae..0964fad7 100644 --- a/error-summary.md +++ b/error-summary.md @@ -24,6 +24,22 @@ Error: All tests are unmapped; verify requirements mapping. ``` +### Error generating CI summary + +``` +Error: No JUnit files found + at main (/workspace/open-source/scripts/generate-ci-summary.ts:76:15) +``` + + +### Error generating CI summary + +``` +Error: All tests are unmapped; verify requirements mapping. + at main (/workspace/open-source/scripts/generate-ci-summary.ts:91:13) +``` + + ### Error generating CI summary ``` diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 278444d1..aa8179b3 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61,5 +61,5 @@ - + From 49bc877211b0a3b45ba1c76f4b3ffc307511377c Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 02:19:43 -0700 Subject: [PATCH 68/73] docs: list actions and workflows in reference nav (REQ-001) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 98 ++++++++++---------- artifacts/linux/traceability.json | 112 +++++++++++------------ artifacts/linux/traceability.md | 98 ++++++++++---------- ci_evidence.txt | 2 +- error-summary.md | 16 ++++ mkdocs.yml | 41 ++++++++- test-results/node-junit.xml | 110 +++++++++++----------- 9 files changed, 269 insertions(+), 216 deletions(-) diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 3930243a..19acd819 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 19.61 | 100.00 | -| linux | 54 | 0 | 0 | 19.61 | 100.00 | +| overall | 54 | 0 | 0 | 35.93 | 100.00 | +| linux | 54 | 0 | 0 | 35.93 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 6cf2b764..d4f10f86 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 19.61 | 100.00 | -| linux | 54 | 0 | 0 | 19.61 | 100.00 | +| overall | 54 | 0 | 0 | 35.93 | 100.00 | +| linux | 54 | 0 | 0 | 35.93 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index f84255bf..8f0828f4 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,114 +4,114 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.009 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.028 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.008 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.020 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.002 | | | +| REQ-026 | captures-suite-properties | Passed | 0.004 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.005 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.014 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.004 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.004 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.010 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.045 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.004 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.012 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.004 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 1.156 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.110 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.037 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.021 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.018 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 1.974 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.007 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.700 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.006 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.180 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.299 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.030 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.053 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.872 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 2.048 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 2.523 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.938 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.015 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.328 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.004 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.932 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.957 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.005 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.071 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.961 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.257 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.435 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.011 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.063 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 2.731 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.004 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.002 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.002 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 1.620 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.743 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.032 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.011 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 2.133 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.594 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 2.053 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 3.075 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.786 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.936 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.318 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.004 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.645 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 1.324 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.600 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 2.684 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.007 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 2.944 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 166cc0f5..c3b397e2 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.009009, + "duration": 0.028243, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.00344, + "duration": 0.008283, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.005013, + "duration": 0.020006, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.0015, + "duration": 0.003619, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.001623, + "duration": 0.004624, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.003533, + "duration": 0.013659, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001576, + "duration": 0.003851, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.002309, + "duration": 0.004271, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.001307, + "duration": 0.004171, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000573, + "duration": 0.001948, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.001853, + "duration": 0.004355, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.009675, + "duration": 0.045091, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.00237, + "duration": 0.00307, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001439, + "duration": 0.004361, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.00109, + "duration": 0.000754, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.011505, + "duration": 0.036579, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.004422, + "duration": 0.021206, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.009561, + "duration": 0.017892, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000329, + "duration": 0.000516, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "detects downloaded artifacts path", "className": "test", "status": "Passed", - "duration": 1.156154, + "duration": 1.973628, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.005243, + "duration": 0.007065, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 1.110031, + "duration": 1.69985, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001929, + "duration": 0.002012, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.006144, + "duration": 0.000339, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.180063, + "duration": 1.872328, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.29899, + "duration": 2.047539, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.030078, + "duration": 2.523409, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 1.053016, + "duration": 1.938118, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000469, + "duration": 0.000426, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000331, + "duration": 0.000291, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.002524, + "duration": 0.004378, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000468, + "duration": 0.000957, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.014704, + "duration": 0.062571, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.327704, + "duration": 2.730984, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.001568, + "duration": 0.003979, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.003959, + "duration": 0.001502, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000536, + "duration": 0.001752, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.931806, + "duration": 1.620135, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.95705, + "duration": 1.743187, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.014851, + "duration": 0.031836, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.005243, + "duration": 0.011323, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "logs a warning when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 1.071358, + "duration": 2.132872, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.961151, + "duration": 1.593974, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 1.257111, + "duration": 2.052942, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000433, + "duration": 0.000874, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.435265, + "duration": 3.074895, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.010709, + "duration": 0.00071, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000501, + "duration": 0.001121, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.785877, + "duration": 1.324256, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.936249, + "duration": 1.600109, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.318484, + "duration": 2.683507, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.00413, + "duration": 0.007133, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.004004, + "duration": 0.007338, "requirements": [], "os": "linux" }, @@ -573,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.645394, + "duration": 2.943919, "requirements": [], "os": "linux" } @@ -585,7 +585,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 19.605653999999998, + "duration": 35.927758, "rate": 100 }, "byOs": { @@ -593,7 +593,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 19.605653999999998, + "duration": 35.927758, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index f84255bf..8f0828f4 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,114 +4,114 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.009 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.028 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.003 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.008 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.005 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.020 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.002 | | | +| REQ-026 | captures-suite-properties | Passed | 0.004 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.005 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.004 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.014 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.004 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.001 | | | +| REQ-031 | validates-missing-fields | Passed | 0.004 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.010 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.045 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.004 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.012 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.004 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.010 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 1.156 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.005 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.110 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.037 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.021 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.018 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 1.974 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.007 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.700 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | -| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.006 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.180 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.299 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 1.030 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.053 | | | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.872 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 2.048 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 2.523 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.938 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.015 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.328 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.004 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.932 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.957 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.005 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 1.071 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.961 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.257 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.435 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.011 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.063 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 2.731 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.004 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.002 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.002 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 1.620 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.743 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.032 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.011 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 2.133 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.594 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 2.053 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 3.075 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.786 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.936 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.318 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.004 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.645 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 1.324 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.600 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 2.684 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.007 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 2.944 | | |
\ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index 2074c7ab..1dc70731 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"7f82f0b8a7dc406f568e5eb2e52a9c6502cb1c98","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"884d81859a0a74f94c5ecf6e653d19c7b69a40d9","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/error-summary.md b/error-summary.md index 0964fad7..6e921853 100644 --- a/error-summary.md +++ b/error-summary.md @@ -40,6 +40,22 @@ Error: All tests are unmapped; verify requirements mapping. ``` +### Error generating CI summary + +``` +Error: No JUnit files found + at main (/workspace/open-source/scripts/generate-ci-summary.ts:76:15) +``` + + +### Error generating CI summary + +``` +Error: All tests are unmapped; verify requirements mapping. + at main (/workspace/open-source/scripts/generate-ci-summary.ts:91:13) +``` + + ### Error generating CI summary ``` diff --git a/mkdocs.yml b/mkdocs.yml index f9f43fbd..ab9b953a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -46,8 +46,45 @@ nav: - Reference: - Action Calls: action-call-reference.md - Common Parameters: common-parameters.md - - Actions: actions/index.md - - Workflows: workflows/index.md + - Actions: + - README: actions/README.md + - Overview: actions/index.md + - Add Token to LabVIEW: actions/add-token-to-labview.md + - Apply VIPC: actions/apply-vipc.md + - Build: actions/build.md + - Build LVLibp: actions/build-lvlibp.md + - Build VI Package: actions/build-vi-package.md + - Close LabVIEW: actions/close-labview.md + - Generate Release Notes: actions/generate-release-notes.md + - Missing in Project: actions/missing-in-project.md + - Modify VIPB Display Info: actions/modify-vipb-display-info.md + - Prepare LabVIEW Source: actions/prepare-labview-source.md + - Rename File: actions/rename-file.md + - Restore Setup LV Source: actions/restore-setup-lv-source.md + - Revert Development Mode: actions/revert-development-mode.md + - Run Pester Tests: actions/run-pester-tests.md + - Run Unit Tests: actions/run-unit-tests.md + - Set Development Mode: actions/set-development-mode.md + - Setup MkDocs: actions/setup-mkdocs.md + - Workflows: + - Overview: workflows/index.md + - Add Token to LabVIEW: workflows/add-token-to-labview.md + - Apply VIPC: workflows/apply-vipc.md + - Build: workflows/build.md + - Build LVLibp: workflows/build-lvlibp.md + - Build VI Package: workflows/build-vi-package.md + - Close LabVIEW: workflows/close-labview.md + - Generate Release Notes: workflows/generate-release-notes.md + - Missing in Project: workflows/missing-in-project.md + - Modify VIPB Display Info: workflows/modify-vipb-display-info.md + - Prepare LabVIEW Source: workflows/prepare-labview-source.md + - Rename File: workflows/rename-file.md + - Restore Setup LV Source: workflows/restore-setup-lv-source.md + - Revert Development Mode: workflows/revert-development-mode.md + - Run Pester Tests: workflows/run-pester-tests.md + - Run Unit Tests: workflows/run-unit-tests.md + - Set Development Mode: workflows/set-development-mode.md + - Setup MkDocs: workflows/setup-mkdocs.md - Developer Docs: - Adapter Authoring: adapter-authoring.md - Versioning: versioning.md diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index aa8179b3..d433101b 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61,5 +61,5 @@ - + From a63a9636684be995db58478bedb405ddb198b342 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 02:28:14 -0700 Subject: [PATCH 69/73] docs: add script docs and navigation (REQ-004) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 96 +++++++------- artifacts/linux/traceability.json | 112 ++++++++-------- artifacts/linux/traceability.md | 96 +++++++------- ci_evidence.txt | 2 +- docs/scripts/add-token-to-labview.md | 27 ++++ docs/scripts/apply-vipc.md | 83 ++++++++++++ docs/scripts/build-lvlibp.md | 39 ++++++ docs/scripts/build-vi-package.md | 42 ++++++ docs/scripts/build.md | 45 +++++++ docs/scripts/close-labview.md | 25 ++++ docs/scripts/generate-release-notes.md | 19 +++ docs/scripts/missing-in-project.md | 159 +++++++++++++++++++++++ docs/scripts/modify-vipb-display-info.md | 44 +++++++ docs/scripts/prepare-labview-source.md | 31 +++++ docs/scripts/rename-file.md | 25 ++++ docs/scripts/restore-setup-lv-source.md | 31 +++++ docs/scripts/revert-development-mode.md | 27 ++++ docs/scripts/run-pester-tests.md | 28 ++++ docs/scripts/run-unit-tests.md | 26 ++++ docs/scripts/set-development-mode.md | 27 ++++ error-summary.md | 16 +++ mkdocs.yml | 17 +++ test-results/node-junit.xml | 110 ++++++++-------- 25 files changed, 923 insertions(+), 212 deletions(-) create mode 100644 docs/scripts/add-token-to-labview.md create mode 100644 docs/scripts/apply-vipc.md create mode 100644 docs/scripts/build-lvlibp.md create mode 100644 docs/scripts/build-vi-package.md create mode 100644 docs/scripts/build.md create mode 100644 docs/scripts/close-labview.md create mode 100644 docs/scripts/generate-release-notes.md create mode 100644 docs/scripts/missing-in-project.md create mode 100644 docs/scripts/modify-vipb-display-info.md create mode 100644 docs/scripts/prepare-labview-source.md create mode 100644 docs/scripts/rename-file.md create mode 100644 docs/scripts/restore-setup-lv-source.md create mode 100644 docs/scripts/revert-development-mode.md create mode 100644 docs/scripts/run-pester-tests.md create mode 100644 docs/scripts/run-unit-tests.md create mode 100644 docs/scripts/set-development-mode.md diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 19acd819..6eab486a 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 35.93 | 100.00 | -| linux | 54 | 0 | 0 | 35.93 | 100.00 | +| overall | 54 | 0 | 0 | 16.07 | 100.00 | +| linux | 54 | 0 | 0 | 16.07 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index d4f10f86..b0dc90b7 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 35.93 | 100.00 | -| linux | 54 | 0 | 0 | 35.93 | 100.00 | +| overall | 54 | 0 | 0 | 16.07 | 100.00 | +| linux | 54 | 0 | 0 | 16.07 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 8f0828f4..1ef12dc6 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,55 +4,55 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.028 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.014 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.008 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.015 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.020 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.009 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.004 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.005 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.014 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.009 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.004 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.004 | | | +| REQ-031 | validates-missing-fields | Passed | 0.006 | | | #### REQ-032 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.005 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.045 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.004 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.025 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.037 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.021 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.018 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 1.974 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.007 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.700 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.013 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.868 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.924 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.872 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 2.048 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 2.523 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.938 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.915 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.025 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.941 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.855 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.063 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 2.731 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.004 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.002 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.002 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 1.620 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.743 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.032 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.011 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 2.133 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.594 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 2.053 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 3.075 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.002 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.017 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.067 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.729 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.842 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.934 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.722 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.988 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.224 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 1.324 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.600 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 2.684 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.007 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 2.944 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.618 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.875 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.085 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.271 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index c3b397e2..41b29515 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.028243, + "duration": 0.013722, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.008283, + "duration": 0.015153, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.020006, + "duration": 0.009201, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.003619, + "duration": 0.00092, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.004624, + "duration": 0.001426, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.013659, + "duration": 0.008854, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.003851, + "duration": 0.001873, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.004271, + "duration": 0.001371, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.004171, + "duration": 0.005664, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.001948, + "duration": 0.002005, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.004355, + "duration": 0.005457, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.045091, + "duration": 0.024678, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.00307, + "duration": 0.001189, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.004361, + "duration": 0.001113, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000754, + "duration": 0.000508, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.036579, + "duration": 0.007505, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.021206, + "duration": 0.007174, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.017892, + "duration": 0.013161, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000516, + "duration": 0.000377, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "detects downloaded artifacts path", "className": "test", "status": "Passed", - "duration": 1.973628, + "duration": 0.868195, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.007065, + "duration": 0.001911, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 1.69985, + "duration": 0.923732, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.002012, + "duration": 0.001091, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000339, + "duration": 0.000142, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 1.872328, + "duration": 0.915346, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 2.047539, + "duration": 1.025091, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 2.523409, + "duration": 0.940833, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 1.938118, + "duration": 0.854835, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000426, + "duration": 0.000185, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000291, + "duration": 0.000209, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.004378, + "duration": 0.001521, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000957, + "duration": 0.00158, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.062571, + "duration": 0.017305, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 2.730984, + "duration": 1.066923, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.003979, + "duration": 0.00111, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.001502, + "duration": 0.0004, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.001752, + "duration": 0.001384, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 1.620135, + "duration": 0.72872, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 1.743187, + "duration": 0.841787, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.031836, + "duration": 0.020499, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.011323, + "duration": 0.00681, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "logs a warning when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 2.132872, + "duration": 0.93371, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 1.593974, + "duration": 0.72232, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 2.052942, + "duration": 0.988132, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000874, + "duration": 0.000349, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 3.074895, + "duration": 1.224227, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.00071, + "duration": 0.000341, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001121, + "duration": 0.000609, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 1.324256, + "duration": 0.617597, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 1.600109, + "duration": 0.875342, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 2.683507, + "duration": 1.085363, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.007133, + "duration": 0.006335, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.007338, + "duration": 0.002286, "requirements": [], "os": "linux" }, @@ -573,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 2.943919, + "duration": 1.271154, "requirements": [], "os": "linux" } @@ -585,7 +585,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 35.927758, + "duration": 16.068724999999997, "rate": 100 }, "byOs": { @@ -593,7 +593,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 35.927758, + "duration": 16.068724999999997, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 8f0828f4..1ef12dc6 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,55 +4,55 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.028 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.014 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.008 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.015 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.020 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.009 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.004 | | | +| REQ-026 | captures-suite-properties | Passed | 0.001 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.005 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.014 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.009 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.004 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.004 | | | +| REQ-031 | validates-missing-fields | Passed | 0.006 | | | #### REQ-032 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.005 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.045 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.003 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.004 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.025 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.037 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.021 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.018 | | | -| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.001 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 1.974 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.007 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.700 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.002 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.013 | | | +| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.868 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.924 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 1.872 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 2.048 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 2.523 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 1.938 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.915 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.025 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.941 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.855 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.004 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.063 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 2.731 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.004 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.002 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.002 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 1.620 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 1.743 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.032 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.011 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 2.133 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 1.594 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 2.053 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 3.075 | | | -| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.001 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.002 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.017 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.067 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.729 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.842 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.934 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.722 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.988 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.224 | | | +| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 1.324 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 1.600 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 2.684 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.007 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.007 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 2.944 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.618 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.875 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.085 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.271 | | |
\ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index 1dc70731..401246a4 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"884d81859a0a74f94c5ecf6e653d19c7b69a40d9","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"0f51c14b5e4521946e09aaf67e2e6b3ed5dc5f7e","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/docs/scripts/add-token-to-labview.md b/docs/scripts/add-token-to-labview.md new file mode 100644 index 00000000..ffd50ad1 --- /dev/null +++ b/docs/scripts/add-token-to-labview.md @@ -0,0 +1,27 @@ +# Add LabVIEW INI Token ⚙️ + +Invoke **`AddTokenToLabVIEW.ps1`** through a composite action to add a `Localhost.LibraryPaths` token to the LabVIEW INI file via **g-cli**. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `minimum_supported_lv_version` | **Yes** | `2021` | LabVIEW major version used by g-cli. | +| `supported_bitness` | **Yes** | `32` or `64` | Target LabVIEW bitness. | +| `relative_path` | **Yes** | `${{ github.workspace }}` | Repository root on disk. | + +## Quick-start + +```yaml +- uses: ./.github/actions/add-token-to-labview + with: + minimum_supported_lv_version: 2024 + supported_bitness: 64 + relative_path: ${{ github.workspace }} +``` + +See also: [docs/actions/add-token-to-labview.md](../actions/add-token-to-labview.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/apply-vipc.md b/docs/scripts/apply-vipc.md new file mode 100644 index 00000000..49c96621 --- /dev/null +++ b/docs/scripts/apply-vipc.md @@ -0,0 +1,83 @@ +# Apply VIPC Dependencies 📦 + +Ensure a runner has all required LabVIEW packages installed before building or testing. This composite action calls **`ApplyVIPC.ps1`** to apply a `.vipc` container through **g-cli**. The action automatically detects the `runner_dependencies.vipc` file located in this directory. + +--- + +## Table of Contents + +1. [Prerequisites](#prerequisites) +2. [Inputs](#inputs) +3. [Quick-start](#quick-start) +4. [How it works](#how-it-works) +5. [Troubleshooting](#troubleshooting) +6. [License](#license) + +--- + +## Prerequisites + +| Requirement | Notes | +|-------------|-------| +| **Windows runner** | LabVIEW and g-cli are Windows only. | +| **LabVIEW** `>= 2021` | Must match both `minimum_supported_lv_version` and `vip_lv_version`. | +| **g-cli** in `PATH` | Used to apply the `.vipc` container. Install from NI Package Manager or include the executable in the runner image. | +| **PowerShell 7** | Composite steps use PowerShell Core (`pwsh`). | + +--- + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `minimum_supported_lv_version` | **Yes** | `2021` | LabVIEW *major* version that the repo supports. | +| `vip_lv_version` | **Yes** | `2021` | LabVIEW version used to apply the `.vipc` file. Usually the same as `minimum_supported_lv_version`. | +| `supported_bitness` | **Yes** | `32` or `64` | LabVIEW bitness to target. | +| `relative_path` | **Yes** | `${{ github.workspace }}` | Root path of the repository on disk. | + +--- + +## Quick-start + +```yaml +# .github/workflows/ci-composite.yml (excerpt) +steps: + - uses: actions/checkout@v4 + - name: Install LabVIEW dependencies + uses: ./.github/actions/apply-vipc + with: + minimum_supported_lv_version: 2021 + vip_lv_version: 2021 + supported_bitness: 64 + relative_path: ${{ github.workspace }} +``` + +The CI pipeline applies these dependencies across multiple LabVIEW versions—2021 (32-bit and 64-bit) and 2023 (64-bit)—as shown in +[`.github/workflows/ci.yml`](../../.github/workflows/ci.yml). + +--- + +## How it works + +1. **Checkout** – pulls the repository to ensure scripts and the `.vipc` file are present. +2. **PowerShell wrapper** – executes `ApplyVIPC.ps1` with the provided inputs. +3. **g-cli invocation** – `ApplyVIPC.ps1` launches **g-cli** to apply the `.vipc` container to the specified LabVIEW installation. +4. **Failure propagation** – any error in path resolution, g-cli, or the script causes the step (and job) to fail. + +--- + +## Troubleshooting + +| Symptom | Hint | +|---------|------| +| *g-cli executable not found* | Ensure g-cli is installed and on `PATH`. | +| *`.vipc` file not found* | Ensure `runner_dependencies.vipc` exists in this action directory. | +| *LabVIEW version mismatch* | Make sure the installed LabVIEW version matches both version inputs. | + +--- + +See also: [docs/actions/apply-vipc.md](../actions/apply-vipc.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/build-lvlibp.md b/docs/scripts/build-lvlibp.md new file mode 100644 index 00000000..a4ab3c84 --- /dev/null +++ b/docs/scripts/build-lvlibp.md @@ -0,0 +1,39 @@ +# Build Packed Library 📦 + +Call **`Build_lvlibp.ps1`** to compile the editor packed library using g-cli. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `minimum_supported_lv_version` | **Yes** | `2021` | LabVIEW major version to use. | +| `supported_bitness` | **Yes** | `32` or `64` | Target LabVIEW bitness. | +| `relative_path` | **Yes** | `${{ github.workspace }}` | Repository root on disk. | +| `major` | **Yes** | `1` | Major version component. | +| `minor` | **Yes** | `0` | Minor version component. | +| `patch` | **Yes** | `0` | Patch version component. | +| `build` | **Yes** | `1` | Build number component. | +| `commit` | **Yes** | `abcdef` | Commit identifier. | + +## Quick-start + +The following example builds using LabVIEW 2021. + +```yaml +- uses: ./.github/actions/build-lvlibp + with: + minimum_supported_lv_version: 2021 + supported_bitness: 64 + relative_path: ${{ github.workspace }} + major: 1 + minor: 0 + patch: 0 + build: 1 + commit: ${{ github.sha }} +``` + +See also: [docs/actions/build-lvlibp.md](../actions/build-lvlibp.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/build-vi-package.md b/docs/scripts/build-vi-package.md new file mode 100644 index 00000000..04ccd0dd --- /dev/null +++ b/docs/scripts/build-vi-package.md @@ -0,0 +1,42 @@ +# Build VI Package 📦 + +Runs **`build_vip.ps1`** to update a `.vipb` file's display info and build the VI Package via g-cli. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `supported_bitness` | **Yes** | `64` | Target LabVIEW bitness. | +| `minimum_supported_lv_version` | **Yes** | `2021` | LabVIEW major version. | +| `labview_minor_revision` | No (defaults to `3`) | `3` | LabVIEW minor revision. | +| `major` | **Yes** | `1` | Major version component. | +| `minor` | **Yes** | `0` | Minor version component. | +| `patch` | **Yes** | `0` | Patch version component. | +| `build` | **Yes** | `1` | Build number component. | +| `commit` | **Yes** | `abcdef` | Commit identifier. | +| `release_notes_file` | **Yes** | `Tooling/deployment/release_notes.md` | Release notes file. | +| `display_information_json` | **Yes** | `'{}'` | JSON for VIPB display information. | + +> **Note:** The action automatically uses the first `.vipb` file located in this directory. + +## Quick-start + +```yaml +- uses: ./.github/actions/build-vi-package + with: + supported_bitness: 64 + minimum_supported_lv_version: 2024 + major: 1 + minor: 0 + patch: 0 + build: 1 + commit: ${{ github.sha }} + release_notes_file: Tooling/deployment/release_notes.md + display_information_json: '{}' +``` + +See also: [docs/actions/build-vi-package.md](../actions/build-vi-package.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/build.md b/docs/scripts/build.md new file mode 100644 index 00000000..4fc5106c --- /dev/null +++ b/docs/scripts/build.md @@ -0,0 +1,45 @@ +# Full Build 🛠️ + +Runs **`Build.ps1`** to clean, compile, and package the LabVIEW Icon Editor. +Each build records provenance by renaming output artifacts to include the +build number and commit SHA and by writing an `artifact-manifest.json` file that +maps the generated artifacts back to the source commit. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `relative_path` | **Yes** | `${{ github.workspace }}` | Repository root on disk. | +| `major` | **Yes** | `1` | Major version number. | +| `minor` | **Yes** | `0` | Minor version number. | +| `patch` | **Yes** | `0` | Patch version number. | +| `build` | **Yes** | `1` | Build number. | +| `commit` | **Yes** | `abcdef` | Commit identifier embedded in metadata. | +| `labview_minor_revision` | No (defaults to `3`) | `3` | LabVIEW minor revision. | +| `company_name` | **Yes** | `Acme Corp` | Company for display info. | +| `author_name` | **Yes** | `Jane Doe` | Author for display info. | + +## Quick-start + +```yaml +- uses: ./.github/actions/build + with: + relative_path: ${{ github.workspace }} + major: 1 + minor: 0 + patch: 0 + build: ${{ github.run_number }} + commit: ${{ github.sha }} + company_name: Example Co + author_name: CI +``` + +See also: [docs/actions/build.md](../actions/build.md) + +## Error handling + +On failure the script outputs `An unexpected error occurred during script execution:
` and returns a non-zero exit code. + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/close-labview.md b/docs/scripts/close-labview.md new file mode 100644 index 00000000..245b807a --- /dev/null +++ b/docs/scripts/close-labview.md @@ -0,0 +1,25 @@ +# Close LabVIEW 💤 + +Run **`Close_LabVIEW.ps1`** to terminate a running LabVIEW instance via g-cli. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `minimum_supported_lv_version` | **Yes** | `2021` | LabVIEW major version to close. | +| `supported_bitness` | **Yes** | `32` or `64` | Target LabVIEW bitness. | + +## Quick-start + +```yaml +- uses: ./.github/actions/close-labview + with: + minimum_supported_lv_version: 2024 + supported_bitness: 64 +``` + +See also: [docs/actions/close-labview.md](../actions/close-labview.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/generate-release-notes.md b/docs/scripts/generate-release-notes.md new file mode 100644 index 00000000..108133c7 --- /dev/null +++ b/docs/scripts/generate-release-notes.md @@ -0,0 +1,19 @@ +# Generate Release Notes + +This composite action creates a Markdown file summarizing commits since the last tag. +By default, it writes to `Tooling/deployment/release_notes.md`, which you can use when drafting changelogs or GitHub releases. + +## Inputs + +- `output_path` (optional): Path for the generated release notes file relative to the repository root. Defaults to `Tooling/deployment/release_notes.md`. + +## Example Usage + +```yaml +- name: Generate release notes + uses: ./.github/actions/generate-release-notes + with: + output_path: Tooling/deployment/release_notes.md +``` + +See also: [docs/actions/generate-release-notes.md](../actions/generate-release-notes.md). diff --git a/docs/scripts/missing-in-project.md b/docs/scripts/missing-in-project.md new file mode 100644 index 00000000..2ddcf028 --- /dev/null +++ b/docs/scripts/missing-in-project.md @@ -0,0 +1,159 @@ +# Missing‑In‑Project 💼🔍 + +Validate that **every file on disk that should live in a LabVIEW project _actually_ appears in the `.lvproj`.** +The check is executed as the _first_ step in your CI pipeline so the run fails fast and you never ship a package or run a unit test with a broken project file. + +Internally the action launches the **`MissingInProjectCLI.vi`** utility (checked into the same directory) through **g‑cli**. +Results are returned as standard GitHub Action outputs so downstream jobs can decide what to do next (for example, post a comment with the missing paths). + +--- + +## Table of Contents + +1. [Prerequisites](#prerequisites) +2. [Inputs](#inputs) +3. [Outputs](#outputs) +4. [Quick-start](#quick-start) +5. [Example: Fail-fast workflow](#example-fail-fast-workflow) +6. [How it works](#how-it-works) +7. [Exit codes & failure modes](#exit-codes--failure-modes) +8. [Troubleshooting](#troubleshooting) +9. [Developing & testing locally](#developing--testing-locally) +10. [License](#license) + +--- + +## Prerequisites + +| Requirement | Notes | +|------------------------|-------| +| **Ubuntu runner** | LabVIEW and g‑cli are available on Ubuntu. | +| **LabVIEW** `>= 2020` | Must match the _numeric_ version you pass in **`lv-ver`**. | +| **g‑cli** in `PATH` | The action calls `g-cli --lv-ver …`. Install from NI Package Manager or copy the executable into the runner image. | +| **PowerShell 7** | Composite steps use PowerShell Core (`pwsh`). | + +--- + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `lv-ver` | **Yes** | `2021` | LabVIEW _major_ version number that should be used to run `MissingInProjectCLI.vi` | +| `supported-bitness` | **Yes** | `32` or `64` | Bitness of the LabVIEW runtime to launch | +| `project-file` | No | `source/MyPlugin.lvproj` | Path (absolute or relative to repository root) of the project to inspect. Defaults to **`lv_icon.lvproj`** | + +--- + +## Outputs + +| Name | Type | Meaning | +|------|------|---------| +| `passed` | `true \| false` | `true` when _no_ missing files were detected and the VI ran without error | +| `missing-files` | `string` | Comma‑separated list of _relative_ paths that are absent from the project (empty on success) | + +--- + +## Quick-start + +```yaml +# .github/workflows/ci-composite.yml – missing-in-project-check (excerpt) +jobs: + missing-in-project-check: + needs: [changes, apply-deps] + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Verify no files are missing from the project + id: mip + uses: ./.github/actions/missing-in-project + with: + lv-ver: 2021 + supported-bitness: 64 + + - name: Print report + if: ${{ steps.mip.outputs.passed == 'false' }} + run: echo "Missing: ${{ steps.mip.outputs['missing-files'] }}" +``` + +--- + +## Example: Fail-fast workflow + +If you want **any** missing file to abort the pipeline immediately, place the step in an _independent_ job at the top of your DAG and let every other job depend on it: + +```yaml +jobs: + missing-in-project-check: + needs: [changes, apply-deps] + runs-on: ubuntu-latest + strategy: + matrix: + supported_bitness: [32, 64] + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/missing-in-project + with: + lv-ver: 2021 + supported-bitness: ${{ matrix.supported_bitness }} + + build-package: + needs: missing-in-project-check + … +``` + +--- + +## How it works + +1. **Path Resolution** + A small PowerShell snippet expands `project-file` to an absolute path and throws if the file doesn’t exist. +2. **Invoke‑MissingInProjectCLI.ps1 wrapper** + - Launches `MissingInProjectCLI.vi` through **g‑cli** + - Captures the VI’s exit status and writes any missing paths to `missing_files.txt` + - Translates the outcome into GitHub Action outputs (`passed`, `missing-files`) and an **exit code** (0, 1, 2). +3. **Composite step result** + GitHub Actions marks the step (and job) as **failed** if the exit code is non‑zero, causing a fail‑fast pipeline. + +--- + +## Exit codes & failure modes + +| Exit | Scenario | Typical fix | +|------|----------|-------------| +| **0** | No missing files; VI ran successfully | Nothing to do | +| **1** | g‑cli or the VI crashed (parsing failed) | Ensure g‑cli is in `PATH`, LabVIEW version matches `lv-ver`, VI dependencies are present | +| **2** | The VI completed and found at least one missing file | Add the file(s) to the project or delete them from disk | + +--- + +## Troubleshooting + +| Symptom | Hint | +|---------|------| +| _“g‑cli executable not found”_ | Verify g‑cli is installed and on `PATH` | +| _“Project file not found”_ | Double‑check the value of `project-file`; relative paths are resolved against `GITHUB_WORKSPACE` | +| _Step times out_ | Large projects can be slow to load; consider bumping the job’s default timeout. | + +--- + +## Developing & testing locally + +```powershell +pwsh -File .github/actions/missing-in-project/Invoke-MissingInProjectCLI.ps1 ` + -LVVersion 2021 ` + -SupportedBitness 64 ` + -ProjectFile 'C:\path\to\MyProj.lvproj' + +echo "Exit code: $LASTEXITCODE" +type .github/actions/missing-in-project/missing_files.txt +``` + +--- + +See also: [docs/actions/missing-in-project.md](../actions/missing-in-project.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/modify-vipb-display-info.md b/docs/scripts/modify-vipb-display-info.md new file mode 100644 index 00000000..7b94aba9 --- /dev/null +++ b/docs/scripts/modify-vipb-display-info.md @@ -0,0 +1,44 @@ +# Modify VIPB Display Info 📝 + +Execute **`ModifyVIPBDisplayInfo.ps1`** to merge metadata into a `.vipb` file before packaging. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `supported_bitness` | **Yes** | `64` | Target LabVIEW bitness. | +| `relative_path` | **Yes** | `${{ github.workspace }}` | Repository root path. | +| `vipb_path` | **Yes** | `Tooling/deployment/NI Icon editor.vipb` | Path to the VIPB file. | +| `minimum_supported_lv_version` | **Yes** | `2021` | LabVIEW major version. | +| `labview_minor_revision` | No (defaults to `3`) | `3` | LabVIEW minor revision. | +| `major` | **Yes** | `1` | Major version component. | +| `minor` | **Yes** | `0` | Minor version component. | +| `patch` | **Yes** | `0` | Patch version component. | +| `build` | **Yes** | `1` | Build number component. | +| `commit` | **Yes** | `abcdef` | Commit identifier. | +| `release_notes_file` | **Yes** | `Tooling/deployment/release_notes.md` | Release notes file. | +| `display_information_json` | **Yes** | `'{}'` | JSON for display information. | + +## Quick-start + +```yaml +- uses: ./.github/actions/modify-vipb-display-info + with: + supported_bitness: 64 + relative_path: ${{ github.workspace }} + vipb_path: Tooling/deployment/NI Icon editor.vipb + minimum_supported_lv_version: 2024 + major: 1 + minor: 0 + patch: 0 + build: 1 + commit: ${{ github.sha }} + release_notes_file: Tooling/deployment/release_notes.md + display_information_json: '{}' +``` + +See also: [docs/actions/modify-vipb-display-info.md](../actions/modify-vipb-display-info.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/prepare-labview-source.md b/docs/scripts/prepare-labview-source.md new file mode 100644 index 00000000..3c0ab6ee --- /dev/null +++ b/docs/scripts/prepare-labview-source.md @@ -0,0 +1,31 @@ +# Prepare LabVIEW Source 📁 + +Runs **`Prepare_LabVIEW_source.ps1`** to unpack and configure project sources before builds. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `minimum_supported_lv_version` | **Yes** | `2021` | LabVIEW major version. | +| `supported_bitness` | **Yes** | `32` or `64` | Target LabVIEW bitness. | +| `relative_path` | **Yes** | `${{ github.workspace }}` | Repository root path. | +| `labview_project` | **Yes** | `lv_icon_editor` | Project name (no extension). | +| `build_spec` | **Yes** | `Editor Packed Library` | Build specification name. | + +## Quick-start + +```yaml +- uses: ./.github/actions/prepare-labview-source + with: + minimum_supported_lv_version: 2024 + supported_bitness: 64 + relative_path: ${{ github.workspace }} + labview_project: lv_icon_editor + build_spec: "Editor Packed Library" +``` + +See also: [docs/actions/prepare-labview-source.md](../actions/prepare-labview-source.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/rename-file.md b/docs/scripts/rename-file.md new file mode 100644 index 00000000..1170ef19 --- /dev/null +++ b/docs/scripts/rename-file.md @@ -0,0 +1,25 @@ +# Rename File ✏️ + +Use **`Rename-file.ps1`** to rename a file within the repository. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `current_filename` | **Yes** | `resource/plugins/lv_icon.lvlibp` | Existing file path. | +| `new_filename` | **Yes** | `lv_icon_x64_v1.0.0.1+gabcdef.lvlibp` | New file name or path. | + +## Quick-start + +```yaml +- uses: ./.github/actions/rename-file + with: + current_filename: resource/plugins/lv_icon.lvlibp + new_filename: lv_icon_x64_v1.0.0.1+gabcdef.lvlibp +``` + +See also: [docs/actions/rename-file.md](../actions/rename-file.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/restore-setup-lv-source.md b/docs/scripts/restore-setup-lv-source.md new file mode 100644 index 00000000..8a67140b --- /dev/null +++ b/docs/scripts/restore-setup-lv-source.md @@ -0,0 +1,31 @@ +# Restore LabVIEW Setup ↩️ + +Run **`RestoreSetupLVSource.ps1`** to restore packaged LabVIEW sources and remove INI tokens. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `minimum_supported_lv_version` | **Yes** | `2021` | LabVIEW major version. | +| `supported_bitness` | **Yes** | `32` or `64` | Target LabVIEW bitness. | +| `relative_path` | **Yes** | `${{ github.workspace }}` | Repository root path. | +| `labview_project` | **Yes** | `lv_icon_editor` | Project name (no extension). | +| `build_spec` | **Yes** | `Editor Packed Library` | Build specification name. | + +## Quick-start + +```yaml +- uses: ./.github/actions/restore-setup-lv-source + with: + minimum_supported_lv_version: 2024 + supported_bitness: 64 + relative_path: ${{ github.workspace }} + labview_project: lv_icon_editor + build_spec: "Editor Packed Library" +``` + +See also: [docs/actions/restore-setup-lv-source.md](../actions/restore-setup-lv-source.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/revert-development-mode.md b/docs/scripts/revert-development-mode.md new file mode 100644 index 00000000..f52c401d --- /dev/null +++ b/docs/scripts/revert-development-mode.md @@ -0,0 +1,27 @@ +# Revert Development Mode 🔄 + +Invoke **`RevertDevelopmentMode.ps1`** to restore packaged sources after development work. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `relative_path` | **Yes** | `${{ github.workspace }}` | Repository root path. | + +## Quick-start + +```yaml +- uses: ./.github/actions/revert-development-mode + with: + relative_path: ${{ github.workspace }} +``` + +See also: [docs/actions/revert-development-mode.md](../actions/revert-development-mode.md) + +## Error handling + +Failures emit `An unexpected error occurred during script execution:
` and the script exits with a non-zero status. + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/run-pester-tests.md b/docs/scripts/run-pester-tests.md new file mode 100644 index 00000000..338add5a --- /dev/null +++ b/docs/scripts/run-pester-tests.md @@ -0,0 +1,28 @@ +# Run Pester Tests ✅ + +Invoke **`RunPesterTests.ps1`** to execute PowerShell Pester tests under `tests/pester`. +For full documentation, see [run-pester-tests action](../actions/run-pester-tests.md). + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `working_directory` | **Yes** | `.` | Path to the repository containing tests under `tests/pester`. | + +## Quick-start + +```yaml +- uses: ./.github/actions/run-pester-tests + with: + working_directory: '.' +``` + +## Outputs + +Upon completion a `requirement-coverage.json` file is written to the specified `working_directory`. It reports the pass/fail status of each requirement ID inferred from test tags. + +See also: [docs/actions/run-pester-tests.md](../actions/run-pester-tests.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/run-unit-tests.md b/docs/scripts/run-unit-tests.md new file mode 100644 index 00000000..40a88079 --- /dev/null +++ b/docs/scripts/run-unit-tests.md @@ -0,0 +1,26 @@ +# Run Unit Tests ✅ + +Invoke **`RunUnitTests.ps1`** to execute LabVIEW unit tests and output a result table. +The script copies `UnitTestReport.xml` to `artifacts/unit-tests/UnitTestReport.xml` for later use. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `minimum_supported_lv_version` | **Yes** | `2021` | LabVIEW major version. | +| `supported_bitness` | **Yes** | `32` or `64` | Target LabVIEW bitness. | + +## Quick-start + +```yaml +- uses: ./.github/actions/run-unit-tests + with: + minimum_supported_lv_version: 2024 + supported_bitness: 64 +``` + +See also: [docs/actions/run-unit-tests.md](../actions/run-unit-tests.md) + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/docs/scripts/set-development-mode.md b/docs/scripts/set-development-mode.md new file mode 100644 index 00000000..798df17b --- /dev/null +++ b/docs/scripts/set-development-mode.md @@ -0,0 +1,27 @@ +# Set Development Mode 🔧 + +Execute **`Set_Development_Mode.ps1`** to prepare the repository for active development. + +## Inputs + +| Name | Required | Example | Description | +|------|----------|---------|-------------| +| `relative_path` | **Yes** | `${{ github.workspace }}` | Repository root path. | + +## Quick-start + +```yaml +- uses: ./.github/actions/set-development-mode + with: + relative_path: ${{ github.workspace }} +``` + +See also: [docs/actions/set-development-mode.md](../actions/set-development-mode.md) + +## Error handling + +Failures produce the message `An unexpected error occurred during script execution:
` and the script exits with a non-zero status. + +## License + +This directory inherits the root repository’s license (MIT, unless otherwise noted). diff --git a/error-summary.md b/error-summary.md index 6e921853..a3a35f6c 100644 --- a/error-summary.md +++ b/error-summary.md @@ -56,6 +56,22 @@ Error: All tests are unmapped; verify requirements mapping. ``` +### Error generating CI summary + +``` +Error: No JUnit files found + at main (/workspace/open-source/scripts/generate-ci-summary.ts:76:15) +``` + + +### Error generating CI summary + +``` +Error: All tests are unmapped; verify requirements mapping. + at main (/workspace/open-source/scripts/generate-ci-summary.ts:91:13) +``` + + ### Error generating CI summary ``` diff --git a/mkdocs.yml b/mkdocs.yml index ab9b953a..208bf60a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -66,6 +66,23 @@ nav: - Run Unit Tests: actions/run-unit-tests.md - Set Development Mode: actions/set-development-mode.md - Setup MkDocs: actions/setup-mkdocs.md + - Scripts: + - Add Token to LabVIEW: scripts/add-token-to-labview.md + - Apply VIPC: scripts/apply-vipc.md + - Build: scripts/build.md + - Build LVLibp: scripts/build-lvlibp.md + - Build VI Package: scripts/build-vi-package.md + - Close LabVIEW: scripts/close-labview.md + - Generate Release Notes: scripts/generate-release-notes.md + - Missing in Project: scripts/missing-in-project.md + - Modify VIPB Display Info: scripts/modify-vipb-display-info.md + - Prepare LabVIEW Source: scripts/prepare-labview-source.md + - Rename File: scripts/rename-file.md + - Restore Setup LV Source: scripts/restore-setup-lv-source.md + - Revert Development Mode: scripts/revert-development-mode.md + - Run Pester Tests: scripts/run-pester-tests.md + - Run Unit Tests: scripts/run-unit-tests.md + - Set Development Mode: scripts/set-development-mode.md - Workflows: - Overview: workflows/index.md - Add Token to LabVIEW: workflows/add-token-to-labview.md diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index d433101b..a8eb94eb 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61,5 +61,5 @@ - + From f25e066750750e61599f4e3b247676ab61d93678 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 02:36:10 -0700 Subject: [PATCH 70/73] docs: add user, contributor, and maintainer guides (REQ-001) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 80 ++++++++-------- artifacts/linux/traceability.json | 112 +++++++++++------------ artifacts/linux/traceability.md | 80 ++++++++-------- ci_evidence.txt | 2 +- docs/contributor-guide.md | 11 +++ docs/index.md | 3 + docs/maintainer-guide.md | 10 ++ docs/user-guide.md | 11 +++ error-summary.md | 16 ++++ test-results/node-junit.xml | 110 +++++++++++----------- 12 files changed, 247 insertions(+), 196 deletions(-) create mode 100644 docs/contributor-guide.md create mode 100644 docs/maintainer-guide.md create mode 100644 docs/user-guide.md diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 6eab486a..2d5cf4aa 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 16.07 | 100.00 | -| linux | 54 | 0 | 0 | 16.07 | 100.00 | +| overall | 54 | 0 | 0 | 15.52 | 100.00 | +| linux | 54 | 0 | 0 | 15.52 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index b0dc90b7..99d74072 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 16.07 | 100.00 | -| linux | 54 | 0 | 0 | 16.07 | 100.00 | +| overall | 54 | 0 | 0 | 15.52 | 100.00 | +| linux | 54 | 0 | 0 | 15.52 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index 1ef12dc6..b30c1bbf 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.014 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.015 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.009 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | #### REQ-026 (100% passed) @@ -34,84 +34,84 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.009 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.003 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.006 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.005 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.025 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.008 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.013 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.002 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 0.868 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.947 | | | | Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.924 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.849 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.915 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.025 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.941 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.855 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.888 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.022 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.826 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.840 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.002 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.017 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.067 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.022 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.110 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.729 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.842 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.934 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.722 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.988 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.719 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.802 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.007 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.878 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.705 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.990 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.224 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.155 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.618 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.875 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.085 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.271 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.623 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.769 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.966 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.003 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.321 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 41b29515..89d01a1b 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.013722, + "duration": 0.009997, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.015153, + "duration": 0.001692, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.009201, + "duration": 0.003535, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.00092, + "duration": 0.001244, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.001426, + "duration": 0.00127, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.008854, + "duration": 0.003141, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.001873, + "duration": 0.002577, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001371, + "duration": 0.001904, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.005664, + "duration": 0.001062, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.002005, + "duration": 0.000551, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.005457, + "duration": 0.003635, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.024678, + "duration": 0.008443, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.001189, + "duration": 0.001585, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001113, + "duration": 0.000845, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.000508, + "duration": 0.001526, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.007505, + "duration": 0.00978, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.007174, + "duration": 0.004871, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.013161, + "duration": 0.004161, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000377, + "duration": 0.000186, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "detects downloaded artifacts path", "className": "test", "status": "Passed", - "duration": 0.868195, + "duration": 0.947326, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.001911, + "duration": 0.001804, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.923732, + "duration": 0.849308, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001091, + "duration": 0.001408, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000142, + "duration": 0.000141, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.915346, + "duration": 0.887821, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.025091, + "duration": 1.022369, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.940833, + "duration": 0.825534, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.854835, + "duration": 0.840257, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000185, + "duration": 0.000266, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000209, + "duration": 0.000225, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.001521, + "duration": 0.002582, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.00158, + "duration": 0.000505, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.017305, + "duration": 0.022229, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.066923, + "duration": 1.110062, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.00111, + "duration": 0.001156, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.0004, + "duration": 0.000309, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.001384, + "duration": 0.000524, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.72872, + "duration": 0.718915, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.841787, + "duration": 0.801653, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.020499, + "duration": 0.006979, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.00681, + "duration": 0.003882, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "logs a warning when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.93371, + "duration": 0.878308, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.72232, + "duration": 0.705254, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.988132, + "duration": 0.990038, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000349, + "duration": 0.000251, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.224227, + "duration": 1.154779, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000341, + "duration": 0.000163, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000609, + "duration": 0.000252, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.617597, + "duration": 0.623496, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.875342, + "duration": 0.769248, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.085363, + "duration": 0.96614, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.006335, + "duration": 0.00306, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.002286, + "duration": 0.004072, "requirements": [], "os": "linux" }, @@ -573,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.271154, + "duration": 1.320624, "requirements": [], "os": "linux" } @@ -585,7 +585,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 16.068724999999997, + "duration": 15.522945000000002, "rate": 100 }, "byOs": { @@ -593,7 +593,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 16.068724999999997, + "duration": 15.522945000000002, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index 1ef12dc6..b30c1bbf 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,19 +4,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.014 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.015 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.009 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | #### REQ-026 (100% passed) @@ -34,84 +34,84 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.009 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.003 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | #### REQ-031 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-031 | validates-missing-fields | Passed | 0.006 | | | +| REQ-031 | validates-missing-fields | Passed | 0.001 | | | #### REQ-032 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-032 | preserves-unknown-attributes | Passed | 0.002 | | | +| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | | #### REQ-033 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.005 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.025 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.008 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | | Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.013 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.002 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 0.868 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.947 | | | | Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.924 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.849 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.915 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.025 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.941 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.855 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.888 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.022 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.826 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.840 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | | Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.002 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.017 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.067 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.022 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.110 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | | Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.729 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.842 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.020 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.007 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.934 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.722 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.988 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.719 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.802 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.007 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.878 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.705 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.990 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.224 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.155 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.618 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.875 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.085 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.006 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.002 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.271 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.623 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.769 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.966 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.003 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.321 | | |
\ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index 401246a4..36460a19 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"0f51c14b5e4521946e09aaf67e2e6b3ed5dc5f7e","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"f3fa634ca1a8bf22c98dc2036262c488ed10c7cf","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/docs/contributor-guide.md b/docs/contributor-guide.md new file mode 100644 index 00000000..5fbed7ac --- /dev/null +++ b/docs/contributor-guide.md @@ -0,0 +1,11 @@ +# Contributor Guide + +This guide assists those who modify actions or documentation. + +## Typical Tasks + +- Review the overall [Architecture](architecture.md). +- Develop new adapters following the [Adapter Authoring Guide](adapter-authoring.md). +- Prepare a development machine via [Environment Setup](environment-setup.md). +- Run unit tests as described in the [Testing guide](testing-pester.md). +- Update docs with the help of [Contributing Docs](contributing-docs.md). diff --git a/docs/index.md b/docs/index.md index 51b01bc8..2be6de15 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,6 +6,9 @@ Open Source LabVIEW Actions unifies LabVIEW CI/CD scripts behind a single PowerS - [Architecture](architecture.md) - [Quickstart](quickstart.md) +- [User Guide](user-guide.md) +- [Contributor Guide](contributor-guide.md) +- [Maintainer Guide](maintainer-guide.md) - [Environment Setup](environment-setup.md) - [Action Call Reference](action-call-reference.md) - [Common Parameters](common-parameters.md) diff --git a/docs/maintainer-guide.md b/docs/maintainer-guide.md new file mode 100644 index 00000000..9ce1534b --- /dev/null +++ b/docs/maintainer-guide.md @@ -0,0 +1,10 @@ +# Maintainer Guide + +Maintainers oversee releases and repository health. + +## Typical Tasks + +- Direct new users to the [Quickstart](quickstart.md) and ensure documentation stays current. +- Review adapter contributions against the [Adapter Authoring Guide](adapter-authoring.md). +- Run and review results from the [Testing guide](testing-pester.md) before merging. +- Publish releases following the [Versioning Policy](versioning.md). diff --git a/docs/user-guide.md b/docs/user-guide.md new file mode 100644 index 00000000..a9639492 --- /dev/null +++ b/docs/user-guide.md @@ -0,0 +1,11 @@ +# User Guide + +End users run the provided composite actions in their own workflows. + +## Typical Tasks + +- Get up to speed with the [Quickstart](quickstart.md). +- Configure prerequisites using [Environment Setup](environment-setup.md). +- Invoke actions by referencing the [Action Call Reference](action-call-reference.md) and shared [Common Parameters](common-parameters.md). +- Validate changes with the [Testing guide](testing-pester.md). +- Troubleshoot issues using the [Troubleshooting](troubleshooting.md) tips. diff --git a/error-summary.md b/error-summary.md index a3a35f6c..42e9e317 100644 --- a/error-summary.md +++ b/error-summary.md @@ -72,6 +72,22 @@ Error: All tests are unmapped; verify requirements mapping. ``` +### Error generating CI summary + +``` +Error: No JUnit files found + at main (/workspace/open-source/scripts/generate-ci-summary.ts:76:15) +``` + + +### Error generating CI summary + +``` +Error: All tests are unmapped; verify requirements mapping. + at main (/workspace/open-source/scripts/generate-ci-summary.ts:91:13) +``` + + ### Error generating CI summary ``` diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index a8eb94eb..4489b9ff 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61,5 +61,5 @@ - + From 65ad83a76b28fb2d5386d72669de4b9643442342 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 02:45:37 -0700 Subject: [PATCH 71/73] docs: add glossary and cross-link terms (REQ-001) --- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 86 ++++++++--------- artifacts/linux/traceability.json | 112 +++++++++++------------ artifacts/linux/traceability.md | 86 ++++++++--------- ci_evidence.txt | 2 +- docs/actions/apply-vipc.md | 8 +- docs/glossary.md | 17 ++++ docs/index.md | 2 +- docs/requirements.md | 8 +- docs/scripts/apply-vipc.md | 4 +- error-summary.md | 16 ++++ mkdocs.yml | 1 + test-results/node-junit.xml | 110 +++++++++++----------- 14 files changed, 247 insertions(+), 213 deletions(-) create mode 100644 docs/glossary.md diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index 2d5cf4aa..d6dd40e7 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 15.52 | 100.00 | -| linux | 54 | 0 | 0 | 15.52 | 100.00 | +| overall | 54 | 0 | 0 | 15.26 | 100.00 | +| linux | 54 | 0 | 0 | 15.26 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 99d74072..5ee92c81 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 15.52 | 100.00 | -| linux | 54 | 0 | 0 | 15.52 | 100.00 | +| overall | 54 | 0 | 0 | 15.26 | 100.00 | +| linux | 54 | 0 | 0 | 15.26 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index b30c1bbf..c94996eb 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,7 +4,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.013 | | | #### REQ-024 (100% passed) @@ -16,7 +16,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | #### REQ-026 (100% passed) @@ -34,19 +34,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.003 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.008 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.002 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.011 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 0.947 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.849 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.908 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.983 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.888 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.022 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.826 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.840 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.848 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.984 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.862 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.906 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.022 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.110 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.023 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.966 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.719 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.802 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.007 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.878 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.705 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.990 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.155 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.725 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.765 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.011 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.937 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.693 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.864 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.045 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.623 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.769 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.966 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.003 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.321 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.598 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.815 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.044 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.010 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.178 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index 89d01a1b..cd0acc0e 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.009997, + "duration": 0.013051, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.001692, + "duration": 0.001978, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.003535, + "duration": 0.00586, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.001244, + "duration": 0.000776, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.00127, + "duration": 0.000961, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.003141, + "duration": 0.001978, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.002577, + "duration": 0.000946, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001904, + "duration": 0.001212, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.001062, + "duration": 0.000722, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000551, + "duration": 0.000572, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.003635, + "duration": 0.002497, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.008443, + "duration": 0.010711, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.001585, + "duration": 0.00125, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.000845, + "duration": 0.001716, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.001526, + "duration": 0.00112, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.00978, + "duration": 0.008236, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.004871, + "duration": 0.006925, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.004161, + "duration": 0.011147, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000186, + "duration": 0.000448, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "detects downloaded artifacts path", "className": "test", "status": "Passed", - "duration": 0.947326, + "duration": 0.908202, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.001804, + "duration": 0.002885, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.849308, + "duration": 0.982879, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001408, + "duration": 0.001052, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.000141, + "duration": 0.00021, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.887821, + "duration": 0.848038, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 1.022369, + "duration": 0.983792, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.825534, + "duration": 0.862378, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.840257, + "duration": 0.906077, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000266, + "duration": 0.000223, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.000225, + "duration": 0.001317, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.002582, + "duration": 0.001526, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000505, + "duration": 0.000399, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.022229, + "duration": 0.022864, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 1.110062, + "duration": 0.966261, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.001156, + "duration": 0.00176, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000309, + "duration": 0.000327, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000524, + "duration": 0.000439, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.718915, + "duration": 0.725273, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.801653, + "duration": 0.764593, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.006979, + "duration": 0.006138, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.003882, + "duration": 0.010612, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "logs a warning when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.878308, + "duration": 0.937453, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.705254, + "duration": 0.693193, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.990038, + "duration": 0.863637, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000251, + "duration": 0.000528, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.154779, + "duration": 1.04472, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000163, + "duration": 0.000471, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.000252, + "duration": 0.00056, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.623496, + "duration": 0.597682, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.769248, + "duration": 0.815296, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.96614, + "duration": 1.044295, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.00306, + "duration": 0.009968, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.004072, + "duration": 0.002501, "requirements": [], "os": "linux" }, @@ -573,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.320624, + "duration": 1.177582, "requirements": [], "os": "linux" } @@ -585,7 +585,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 15.522945000000002, + "duration": 15.257237, "rate": 100 }, "byOs": { @@ -593,7 +593,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 15.522945000000002, + "duration": 15.257237, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index b30c1bbf..c94996eb 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,7 +4,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.010 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.013 | | | #### REQ-024 (100% passed) @@ -16,7 +16,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.004 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | #### REQ-026 (100% passed) @@ -34,19 +34,19 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | #### REQ-029 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.003 | | | +| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.001 | | | #### REQ-030 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | #### REQ-031 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.004 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.008 | | | -| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.002 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.001 | | | -| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.002 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.010 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.005 | | | -| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.004 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | +| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | +| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.011 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 0.947 | | | -| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.002 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.849 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.908 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.983 | | | | Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.888 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.022 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.826 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.840 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.848 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.984 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.862 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.906 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | | -| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.001 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.022 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.110 | | | -| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.001 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.023 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.966 | | | +| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | | Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.719 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.802 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.007 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.878 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.705 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.990 | | | -| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.155 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.725 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.765 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.011 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.937 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.693 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.864 | | | +| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.045 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | -| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.000 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.623 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.769 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.966 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.003 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.321 | | | +| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.598 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.815 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.044 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.010 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.178 | | |
\ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index 36460a19..6f708075 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"f3fa634ca1a8bf22c98dc2036262c488ed10c7cf","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"3aeaac34201042124d849a474c567cabf217d8f7","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/docs/actions/apply-vipc.md b/docs/actions/apply-vipc.md index 33c1469c..6f6974be 100644 --- a/docs/actions/apply-vipc.md +++ b/docs/actions/apply-vipc.md @@ -2,7 +2,7 @@ ## Purpose -Apply a VI Package Configuration (.vipc) file to a specific LabVIEW installation using g-cli. +Apply a [VI Package Configuration](../glossary.md#vipc) (`.vipc`) file to a specific LabVIEW installation using g-cli. ## Parameters @@ -10,8 +10,8 @@ Common parameters are described in [Common parameters](../common-parameters.md). ### Required -- **MinimumSupportedLVVersion** (`string`): LabVIEW version used to apply the VIPC. -- **VIP_LVVersion** (`string`): LabVIEW version the VIPC targets. +- **MinimumSupportedLVVersion** (`string`): LabVIEW version used to apply the [VIPC](../glossary.md#vipc). +- **VIP_LVVersion** (`string`): LabVIEW version the [VIPC](../glossary.md#vipc) targets. - **SupportedBitness** (`string`): "32" or "64" bitness of LabVIEW. - **RelativePath** (`string`): Path relative to the action's working directory. Use "." when the working directory is desired. - **VIPCPath** (`string`): Path to the `.vipc` file to apply. @@ -30,7 +30,7 @@ GitHub Action inputs are provided in `snake_case`, while CLI parameters use `Pas | `vip_lv_version` | `VIP_LVVersion` | LabVIEW version associated with the VI Package. | | `supported_bitness` | `SupportedBitness` | "32" or "64" bitness of LabVIEW. | | `relative_path` | `RelativePath` | Path relative to the working directory. Use '.' to refer to the working directory. | -| `vipc_path` | `VIPCPath` | Path to the VIPC file. | +| `vipc_path` | `VIPCPath` | Path to the [`VIPC`](../glossary.md#vipc) file. | | `gcli_path` | `gcliPath` | Optional path to the g-cli executable. | | `working_directory` | `WorkingDirectory` | Base directory for the action; relative paths are resolved from here. | | `log_level` | `LogLevel` | Verbosity level (ERROR\|WARN\|INFO\|DEBUG). | diff --git a/docs/glossary.md b/docs/glossary.md new file mode 100644 index 00000000..dbe66459 --- /dev/null +++ b/docs/glossary.md @@ -0,0 +1,17 @@ +# Glossary + +## CI/CD + +Continuous Integration and Continuous Delivery, automated practices for building, testing, and delivering software. + +## CI + +Continuous Integration, the practice of frequently merging code changes and running automated tests to detect issues early. + +## VIPC + +VI Package Configuration, a container file that lists LabVIEW packages to install. + +## PPL + +Packed Project Library, a precompiled LabVIEW library used for distributing compiled VIs. diff --git a/docs/index.md b/docs/index.md index 2be6de15..cbd664aa 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # Open Source LabVIEW Actions -Open Source LabVIEW Actions unifies LabVIEW CI/CD scripts behind a single PowerShell dispatcher. Most users should call the adapter-specific GitHub Actions (for example `run-unit-tests`) directly in workflows. The dispatcher script ([actions/Invoke-OSAction.ps1](../actions/Invoke-OSAction.ps1)) remains available for CLI scenarios. Adapter implementations live under [scripts](../scripts/README.md), and each wrapper resides in its own folder at the repository root. Discovery commands (`-ListActions` and `-Describe`) and standard exit codes are preserved, and `-DryRun` is supported for safe previews on Windows or Linux runners with LabVIEW and g-cli available. +Open Source LabVIEW Actions unifies LabVIEW [CI/CD](glossary.md#ci-cd) scripts behind a single PowerShell dispatcher. Most users should call the adapter-specific GitHub Actions (for example `run-unit-tests`) directly in workflows. The dispatcher script ([actions/Invoke-OSAction.ps1](../actions/Invoke-OSAction.ps1)) remains available for CLI scenarios. Adapter implementations live under [scripts](../scripts/README.md), and each wrapper resides in its own folder at the repository root. Discovery commands (`-ListActions` and `-Describe`) and standard exit codes are preserved, and `-DryRun` is supported for safe previews on Windows or Linux runners with LabVIEW and g-cli available. ## Get Started diff --git a/docs/requirements.md b/docs/requirements.md index 7eccd2fe..db560cd8 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -41,21 +41,21 @@ Runner Type indicates whether a requirement runs on a standard GitHub-hosted ima | REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | `scripts/__tests__/junit-parser.test.js` | | | | | REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | `tests/pester/SelfHosted.Workflow.Tests.ps1` | | | | | REQIE-001 | After checking out the LabVIEW icon editor repository, PreSequence: The sequencer shall enumerate and record the build matrix used by the workflow (LabVIEW versions and bitness). Acceptance: a 'matrix.json' file exists listing each tuple {"lv-version": "2021"\|"2023", "bitness": "32"\|"64"} with at least [ ["2021","32"], ["2021","64"], ["2023","64"] ]. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.PreSequence.matrix-enumeration.ps1` | self-hosted-windows-lv | integration | true | -| REQIE-002 | After checking out the LabVIEW icon editor repository, Setup: For each matrix entry, the sequencer shall apply VIPC dependencies using the canonical action inputs (minimum_supported_lv_version, vip_lv_version, supported_bitness, relative_path). Evidence: a 'vipc-apply.json' summary per matrix entry capturing inputs, start/end timestamps, exit code, and status. Acceptance: all entries report exit_code == 0 and status == 'success'. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Setup.apply-vipc-succeeds.ps1` | self-hosted-windows-lv | integration | true | +| REQIE-002 | After checking out the LabVIEW icon editor repository, Setup: For each matrix entry, the sequencer shall apply [VIPC](glossary.md#vipc) dependencies using the canonical action inputs (minimum_supported_lv_version, vip_lv_version, supported_bitness, relative_path). Evidence: a 'vipc-apply.json' summary per matrix entry capturing inputs, start/end timestamps, exit code, and status. Acceptance: all entries report exit_code == 0 and status == 'success'. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Setup.apply-vipc-succeeds.ps1` | self-hosted-windows-lv | integration | true | | REQIE-003 | After checking out the LabVIEW icon editor repository, Setup: The sequencer shall compute and persist semantic version information. Evidence: a 'version.json' containing VERSION, MAJOR, MINOR, PATCH, BUILD, IS_PRERELEASE and the commit SHA used. Acceptance: VERSION conforms to SemVer and all numeric components are present. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Setup.version-outputs-captured.ps1` | self-hosted-windows-lv | integration | true | | REQIE-004 | After checking out the LabVIEW icon editor repository, Setup: The 'missing-in-project' check shall be executed for the specified LabVIEW version(s) and both 32-bit and 64-bit bitness as applicable. Evidence: 'missing-in-project.json' including project-file, lv-version, bitness, and result. Acceptance: result == 'present' for expected module paths. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Setup.missing-in-project-matrix.ps1` | self-hosted-windows-lv | integration | true | | REQIE-005 | After checking out the LabVIEW icon editor repository, Main: Unit tests shall be executed (Pester) across the configured matrix. Evidence: a 'pester-summary.json' file containing total, passed, failed, skipped, duration_ms, and per-test results; XML output is not required. Acceptance: failed == 0 and total >= 1. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.unit-tests-pass.ps1` | self-hosted-windows-lv | integration | true | -| REQIE-006 | After checking out the LabVIEW icon editor repository, Main: Build Packed Libraries (PPL) shall succeed for both 32-bit and 64-bit targets. Evidence: existence of 'resource/plugins/lv_icon_x86_v<version>.lvlibp' and 'resource/plugins/lv_icon_x64_v<version>.lvlibp' and a 'ppl.hash' file containing SHA256 for each artifact. Acceptance: non-zero artifact sizes and matching SHA256 re-computation. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.ppl-built-and-hashed.ps1`, `tests/pester/BuildProfile1.IconEditor.Main.artifact-size-nonzero.ps1` | self-hosted-windows-lv | integration | true | +| REQIE-006 | After checking out the LabVIEW icon editor repository, Main: Build Packed Libraries ([PPL](glossary.md#ppl)) shall succeed for both 32-bit and 64-bit targets. Evidence: existence of 'resource/plugins/lv_icon_x86_v<version>.lvlibp' and 'resource/plugins/lv_icon_x64_v<version>.lvlibp' and a 'ppl.hash' file containing SHA256 for each artifact. Acceptance: non-zero artifact sizes and matching SHA256 re-computation. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.ppl-built-and-hashed.ps1`, `tests/pester/BuildProfile1.IconEditor.Main.artifact-size-nonzero.ps1` | self-hosted-windows-lv | integration | true | | REQIE-007 | After checking out the LabVIEW icon editor repository, Main: Renaming and artifact upload steps shall complete. Evidence: an 'artifact-manifest.json' listing uploaded artifact names ('lv_icon_x86_v<version>.lvlibp', 'lv_icon_x64_v<version>.lvlibp'), paths, and sizes. Acceptance: manifest entries match on-disk files and GitHub Artifacts report success. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.artifacts-renamed-and-uploaded.ps1` | self-hosted-windows-lv | integration | true | | REQIE-008 | After checking out the LabVIEW icon editor repository, Main: The workflow shall generate a VI Package (.vip) using the prescribed actions and inputs. Evidence: 'vi-package.hash' (SHA256 of produced .vip), and a 'vi-package.json' summarizing package metadata (name, version, company, build). Acceptance: at least one .vip exists, size > 0, and hash is recorded. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.vi-package-built-and-hashed.ps1` | self-hosted-windows-lv | integration | true | | REQIE-009 | After checking out the LabVIEW icon editor repository, Main: The workflow shall produce a display information JSON for the VI Package and inject it prior to packaging. Evidence: 'display-info.json' containing the exact keys used by the action (Package Version.major/minor/patch/build, Product/Company/Author fields, etc.). Acceptance: all required keys exist and reflect the computed version (REQ-011). g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Main.display-info-generated.ps1` | self-hosted-windows-lv | integration | true | | REQIE-010 | After checking out the LabVIEW icon editor repository, Cleanup: The workflow shall terminate any LabVIEW processes via the 'close-labview' step for each applicable bitness. Evidence: 'close-labview.log' including bitness, attempts, and final process list. Acceptance: no LabVIEW process remains after the step. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.Cleanup.labview-closed.ps1` | self-hosted-windows-lv | integration | true | -| REQIE-011 | After checking out the LabVIEW icon editor repository, PostSequence: The sequencer shall assemble a canonical single-line CI evidence string summarizing statuses and key facts for REQ-001..REQ-018. The string SHALL be a minified JSON assigned to a step output named 'CI_EVIDENCE' and saved as 'ci_evidence.txt'. Acceptance: the string parses as JSON and includes {"pipeline":"IconEditor", "git_sha":..., "matrix":[...], "version":{...}, "artifacts":{...}, "req_status":{"REQ-001":"PASS"\|"FAIL", ...}}. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.PostSequence.ci-evidence-assembled.ps1`, `tests/pester/BuildProfile1.IconEditor.PostSequence.ci-evidence-output.ps1` | self-hosted-windows-lv | integration | true | +| REQIE-011 | After checking out the LabVIEW icon editor repository, PostSequence: The sequencer shall assemble a canonical single-line [CI](glossary.md#ci) evidence string summarizing statuses and key facts for REQ-001..REQ-018. The string SHALL be a minified JSON assigned to a step output named 'CI_EVIDENCE' and saved as 'ci_evidence.txt'. Acceptance: the string parses as JSON and includes {"pipeline":"IconEditor", "git_sha":..., "matrix":[...], "version":{...}, "artifacts":{...}, "req_status":{"REQ-001":"PASS"\|"FAIL", ...}}. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.PostSequence.ci-evidence-assembled.ps1`, `tests/pester/BuildProfile1.IconEditor.PostSequence.ci-evidence-output.ps1` | self-hosted-windows-lv | integration | true | | REQIE-012 | After checking out the LabVIEW icon editor repository, PostSequence: The CI evidence string shall be logged succinctly to the job summary and made available to downstream jobs via $GITHUB_OUTPUT. Evidence: the step output 'CI_EVIDENCE' is present and a 'summary.md' contains a redacted preview. Acceptance: dependent jobs can read 'needs.<job>.outputs.CI_EVIDENCE' and parse it successfully. g-cli is expected at 'C:\Program Files\G-CLI\bin\g-cli.exe'. | `tests/pester/BuildProfile1.IconEditor.PostSequence.ci-evidence-published.ps1` | self-hosted-windows-lv | integration | true | Each test file is annotated with its corresponding requirement ID to maintain traceability between requirements and test coverage. -During CI runs, `scripts/generate-ci-summary.ts` writes requirement artifacts to an OS‑specific directory under `artifacts/`, such as `artifacts/windows/traceability.md` or `artifacts/linux/traceability.md`, using the `RUNNER_OS` environment variable. +During [CI](glossary.md#ci) runs, `scripts/generate-ci-summary.ts` writes requirement artifacts to an OS‑specific directory under `artifacts/`, such as `artifacts/windows/traceability.md` or `artifacts/linux/traceability.md`, using the `RUNNER_OS` environment variable. Each directory also includes a `summary.md` file with per‑OS totals. A typical summary might look like this: diff --git a/docs/scripts/apply-vipc.md b/docs/scripts/apply-vipc.md index 49c96621..d332f76d 100644 --- a/docs/scripts/apply-vipc.md +++ b/docs/scripts/apply-vipc.md @@ -1,6 +1,6 @@ # Apply VIPC Dependencies 📦 -Ensure a runner has all required LabVIEW packages installed before building or testing. This composite action calls **`ApplyVIPC.ps1`** to apply a `.vipc` container through **g-cli**. The action automatically detects the `runner_dependencies.vipc` file located in this directory. +Ensure a runner has all required LabVIEW packages installed before building or testing. This composite action calls **`ApplyVIPC.ps1`** to apply a [`VIPC`](../glossary.md#vipc) container through **g-cli**. The action automatically detects the `runner_dependencies.vipc` file located in this directory. --- @@ -52,7 +52,7 @@ steps: relative_path: ${{ github.workspace }} ``` -The CI pipeline applies these dependencies across multiple LabVIEW versions—2021 (32-bit and 64-bit) and 2023 (64-bit)—as shown in +[CI](../glossary.md#ci) pipeline applies these dependencies across multiple LabVIEW versions—2021 (32-bit and 64-bit) and 2023 (64-bit)—as shown in [`.github/workflows/ci.yml`](../../.github/workflows/ci.yml). --- diff --git a/error-summary.md b/error-summary.md index 42e9e317..b9fb00bc 100644 --- a/error-summary.md +++ b/error-summary.md @@ -88,6 +88,22 @@ Error: All tests are unmapped; verify requirements mapping. ``` +### Error generating CI summary + +``` +Error: No JUnit files found + at main (/workspace/open-source/scripts/generate-ci-summary.ts:76:15) +``` + + +### Error generating CI summary + +``` +Error: All tests are unmapped; verify requirements mapping. + at main (/workspace/open-source/scripts/generate-ci-summary.ts:91:13) +``` + + ### Error generating CI summary ``` diff --git a/mkdocs.yml b/mkdocs.yml index 208bf60a..2042f86c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -44,6 +44,7 @@ nav: - Environment Setup: environment-setup.md - Troubleshooting: troubleshooting.md - Reference: + - Glossary: glossary.md - Action Calls: action-call-reference.md - Common Parameters: common-parameters.md - Actions: diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 4489b9ff..3a8f049a 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61,5 +61,5 @@ - + From bae236ecb11dbeb8d53287fa181016afa5abc952 Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 02:56:07 -0700 Subject: [PATCH 72/73] chore: capture link check results (REQ-001) --- README.md | 2 +- linkinator.config.json | 4 ++-- test-results/linkinator.log | 3 +++ test-results/lint-md.log | 8 ++++++++ 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 test-results/linkinator.log create mode 100644 test-results/lint-md.log diff --git a/README.md b/README.md index ac500e72..867a4fe5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Open Source LabVIEW Actions -[![Traceability](https://img.shields.io/endpoint?url=https://LabVIEW-Community-CI-CD.github.io/open-source-actions/badge-summary.json)](https://LabVIEW-Community-CI-CD.github.io/open-source-actions/summary.md) +[![Traceability](https://img.shields.io/endpoint?url=https://LabVIEW-Community-CI-CD.github.io/badge-summary.json)](https://LabVIEW-Community-CI-CD.github.io/summary.md) Open Source LabVIEW Actions provides typed GitHub Action wrappers around a unified PowerShell dispatcher for LabVIEW CI/CD tasks. Each adapter (for example `run-unit-tests`) is exposed as its own action and can be called from workflows with `uses: LabVIEW-Community-CI-CD/open-source-actions/@v1`. diff --git a/linkinator.config.json b/linkinator.config.json index c4a49179..b0f1a972 100644 --- a/linkinator.config.json +++ b/linkinator.config.json @@ -8,7 +8,7 @@ "skip": [ "https://open-source-actions.github.io/open-source-actions/", "http://127.0.0.1:8000/", - "https://LabVIEW-Community-CI-CD.github.io/open-source-actions/summary.md", - "https://labview-community-ci-cd.github.io/open-source-actions/summary.md" + "https://LabVIEW-Community-CI-CD.github.io/summary.md", + "https://labview-community-ci-cd.github.io/summary.md" ] } diff --git a/test-results/linkinator.log b/test-results/linkinator.log new file mode 100644 index 00000000..737f91c1 --- /dev/null +++ b/test-results/linkinator.log @@ -0,0 +1,3 @@ +npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. +🏊‍♂️ crawling README.md docs scripts +🤖 Successfully scanned 18 links in 0.244 seconds. diff --git a/test-results/lint-md.log b/test-results/lint-md.log new file mode 100644 index 00000000..51ace495 --- /dev/null +++ b/test-results/lint-md.log @@ -0,0 +1,8 @@ + +> open-source-actions@1.0.0 lint:md +> markdownlint-cli2 README.md "docs/**/*.md" "scripts/**/*.md" + +markdownlint-cli2 v0.18.1 (markdownlint v0.38.0) +Finding: README.md docs/**/*.md scripts/**/*.md +Linting: 91 file(s) +Summary: 0 error(s) From 1a7dad89d9f91e7a946a81d92ae9a910f9f93b0b Mon Sep 17 00:00:00 2001 From: sergiov-ni Date: Wed, 20 Aug 2025 03:20:39 -0700 Subject: [PATCH 73/73] docs: refresh README and update repo references REQ-001 --- README.md | 10 +- actions/OpenSourceActions.psd1 | 2 +- artifacts/linux/summary-standard.md | 4 +- artifacts/linux/summary.md | 4 +- artifacts/linux/traceability-standard.md | 78 ++++++++-------- artifacts/linux/traceability.json | 112 +++++++++++------------ artifacts/linux/traceability.md | 78 ++++++++-------- ci_evidence.txt | 2 +- docs/action-call-reference.md | 36 ++++---- docs/actions/add-token-to-labview.md | 2 +- docs/actions/apply-vipc.md | 2 +- docs/actions/build-lvlibp.md | 2 +- docs/actions/build-vi-package.md | 2 +- docs/actions/build.md | 2 +- docs/actions/close-labview.md | 2 +- docs/actions/generate-release-notes.md | 2 +- docs/actions/missing-in-project.md | 2 +- docs/actions/modify-vipb-display-info.md | 2 +- docs/actions/prepare-labview-source.md | 2 +- docs/actions/rename-file.md | 2 +- docs/actions/restore-setup-lv-source.md | 2 +- docs/actions/revert-development-mode.md | 2 +- docs/actions/run-pester-tests.md | 2 +- docs/actions/run-unit-tests.md | 2 +- docs/actions/set-development-mode.md | 2 +- docs/actions/setup-mkdocs.md | 2 +- docs/quickstart.md | 10 +- docs/testing-pester.md | 2 +- linkinator.config.json | 2 +- package-lock.json | 4 +- package.json | 2 +- test-results/linkinator.log | 3 - test-results/lint-md.log | 4 +- test-results/node-junit.xml | 110 +++++++++++----------- 34 files changed, 246 insertions(+), 251 deletions(-) diff --git a/README.md b/README.md index 867a4fe5..a4ff73f0 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,7 @@ [![Traceability](https://img.shields.io/endpoint?url=https://LabVIEW-Community-CI-CD.github.io/badge-summary.json)](https://LabVIEW-Community-CI-CD.github.io/summary.md) -Open Source LabVIEW Actions provides typed GitHub Action wrappers around a unified PowerShell dispatcher for LabVIEW CI/CD tasks. Each adapter (for example `run-unit-tests`) is exposed as its own action and can be called from workflows with `uses: LabVIEW-Community-CI-CD/open-source-actions/@v1`. - -For setup and action reference, see the [documentation](docs/index.md). The [quickstart](docs/quickstart.md) shows a full example and [Unified Dispatcher](docs/UnifiedDispatcher.md) describes how the dispatcher works. For an overview of the project's architecture, see [docs/architecture.md](docs/architecture.md). For a mapping of high-level requirements to the tests that verify them, see [docs/requirements.md](docs/requirements.md). +Open Source LabVIEW Actions is a collection of GitHub Actions and PowerShell scripts that streamline LabVIEW CI/CD workflows. Each task is exposed as its own action backed by a unified dispatcher. Refer to the [documentation](docs/index.md) for setup guidance, detailed examples, and the complete action reference. ## Prerequisites @@ -19,7 +17,7 @@ See [Environment Setup](docs/environment-setup.md) for installation steps and co ```yaml - name: Run tests - uses: LabVIEW-Community-CI-CD/open-source-actions/run-unit-tests@v1 + uses: LabVIEW-Community-CI-CD/open-source/run-unit-tests@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' @@ -41,7 +39,7 @@ Common optional inputs available on all wrappers: Run tests from a subfolder: ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/run-unit-tests@v1 +- uses: LabVIEW-Community-CI-CD/open-source/run-unit-tests@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' @@ -51,7 +49,7 @@ Run tests from a subfolder: Enable debug logging and perform a dry run: ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/run-unit-tests@v1 +- uses: LabVIEW-Community-CI-CD/open-source/run-unit-tests@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' diff --git a/actions/OpenSourceActions.psd1 b/actions/OpenSourceActions.psd1 index 4c002a5b..184cc1eb 100644 --- a/actions/OpenSourceActions.psd1 +++ b/actions/OpenSourceActions.psd1 @@ -5,7 +5,7 @@ Author = 'LabVIEW Community CI/CD' CompanyName = 'LabVIEW Community' Copyright = '(c) 2025 LabVIEW Community' - Description = 'Unified dispatcher adapters for open-source-actions' + Description = 'Unified dispatcher adapters for open-source' PowerShellVersion = '7.0' CompatiblePSEditions = @('Core') diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md index d6dd40e7..eea098ba 100644 --- a/artifacts/linux/summary-standard.md +++ b/artifacts/linux/summary-standard.md @@ -1,7 +1,7 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 15.26 | 100.00 | -| linux | 54 | 0 | 0 | 15.26 | 100.00 | +| overall | 54 | 0 | 0 | 14.22 | 100.00 | +| linux | 54 | 0 | 0 | 14.22 | 100.00 | _For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._ \ No newline at end of file diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md index 5ee92c81..0f15de72 100644 --- a/artifacts/linux/summary.md +++ b/artifacts/linux/summary.md @@ -1,8 +1,8 @@ ### Test Summary | OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | | --- | --- | --- | --- | --- | --- | -| overall | 54 | 0 | 0 | 15.26 | 100.00 | -| linux | 54 | 0 | 0 | 15.26 | 100.00 | +| overall | 54 | 0 | 0 | 14.22 | 100.00 | +| linux | 54 | 0 | 0 | 14.22 | 100.00 | ### Requirement Summary | Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) | diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md index c94996eb..22bc3716 100644 --- a/artifacts/linux/traceability-standard.md +++ b/artifacts/linux/traceability-standard.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.013 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.008 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.002 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.003 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | #### REQ-031 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.010 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.003 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.009 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.011 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 0.908 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.849 | | | | Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.983 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.809 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.005 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.848 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.984 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.862 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.906 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.918 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.940 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.758 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.892 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.001 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.023 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.966 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.022 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.906 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.725 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.765 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.011 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.937 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.693 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.864 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.707 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.694 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.016 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.021 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.741 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.668 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.794 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.045 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.980 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.598 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.815 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.044 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.010 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.178 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.564 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.705 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.981 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.012 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.140 | | |
\ No newline at end of file diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json index cd0acc0e..e2b8959d 100644 --- a/artifacts/linux/traceability.json +++ b/artifacts/linux/traceability.json @@ -9,7 +9,7 @@ "name": "[REQ-023] parses nested JUnit structures", "className": "test", "status": "Passed", - "duration": 0.013051, + "duration": 0.010782, "requirements": [ "REQ-023" ], @@ -26,7 +26,7 @@ "name": "[REQ-024] captures root testsuites attributes", "className": "test", "status": "Passed", - "duration": 0.001978, + "duration": 0.007818, "requirements": [ "REQ-024" ], @@ -43,7 +43,7 @@ "name": "[REQ-025] captures testsuite attributes", "className": "test", "status": "Passed", - "duration": 0.00586, + "duration": 0.00183, "requirements": [ "REQ-025" ], @@ -60,7 +60,7 @@ "name": "[REQ-026] captures suite properties", "className": "test", "status": "Passed", - "duration": 0.000776, + "duration": 0.002576, "requirements": [ "REQ-026" ], @@ -77,7 +77,7 @@ "name": "[REQ-027] captures testcase attributes and skipped message", "className": "test", "status": "Passed", - "duration": 0.000961, + "duration": 0.002124, "requirements": [ "REQ-027" ], @@ -94,7 +94,7 @@ "name": "[REQ-028] extracts requirement identifiers", "className": "test", "status": "Passed", - "duration": 0.001978, + "duration": 0.002788, "requirements": [ "REQ-028" ], @@ -111,7 +111,7 @@ "name": "[REQ-029] aggregates status by requirement and suite", "className": "test", "status": "Passed", - "duration": 0.000946, + "duration": 0.001336, "requirements": [ "REQ-029" ], @@ -128,7 +128,7 @@ "name": "[REQ-030] builds traceability matrix with skipped reasons", "className": "test", "status": "Passed", - "duration": 0.001212, + "duration": 0.003507, "requirements": [ "REQ-030" ], @@ -145,7 +145,7 @@ "name": "[REQ-031] validates missing fields", "className": "test", "status": "Passed", - "duration": 0.000722, + "duration": 0.001345, "requirements": [ "REQ-031" ], @@ -162,7 +162,7 @@ "name": "[REQ-032] preserves unknown attributes", "className": "test", "status": "Passed", - "duration": 0.000572, + "duration": 0.000906, "requirements": [ "REQ-032" ], @@ -179,7 +179,7 @@ "name": "[REQ-033] throws error for malformed XML", "className": "test", "status": "Passed", - "duration": 0.002497, + "duration": 0.003383, "requirements": [ "REQ-033" ], @@ -195,7 +195,7 @@ "name": "associates classname with requirement", "className": "test", "status": "Passed", - "duration": 0.010711, + "duration": 0.01024, "requirements": [], "os": "linux" }, @@ -204,7 +204,7 @@ "name": "buildIssueBranchName formats branch name", "className": "test", "status": "Passed", - "duration": 0.00125, + "duration": 0.001046, "requirements": [], "os": "linux" }, @@ -213,7 +213,7 @@ "name": "buildIssueBranchName rejects non-numeric input", "className": "test", "status": "Passed", - "duration": 0.001716, + "duration": 0.003195, "requirements": [], "os": "linux" }, @@ -222,7 +222,7 @@ "name": "buildSummary splits totals by OS", "className": "test", "status": "Passed", - "duration": 0.00112, + "duration": 0.000643, "requirements": [], "os": "linux" }, @@ -231,7 +231,7 @@ "name": "collectTestCases captures requirement property", "className": "test", "status": "Passed", - "duration": 0.008236, + "duration": 0.009168, "requirements": [], "os": "linux" }, @@ -240,7 +240,7 @@ "name": "collectTestCases uses evidence property and falls back to directory scan", "className": "test", "status": "Passed", - "duration": 0.006925, + "duration": 0.010491, "requirements": [], "os": "linux" }, @@ -249,7 +249,7 @@ "name": "collectTestCases uses machine-name property for owner", "className": "test", "status": "Passed", - "duration": 0.011147, + "duration": 0.01121, "requirements": [], "os": "linux" }, @@ -258,7 +258,7 @@ "name": "computeStatusCounts tallies test statuses", "className": "test", "status": "Passed", - "duration": 0.000448, + "duration": 0.000417, "requirements": [], "os": "linux" }, @@ -267,7 +267,7 @@ "name": "detects downloaded artifacts path", "className": "test", "status": "Passed", - "duration": 0.908202, + "duration": 0.849063, "requirements": [], "os": "linux" }, @@ -276,7 +276,7 @@ "name": "Dispatchers and parameters include descriptions", "className": "test", "status": "Passed", - "duration": 0.002885, + "duration": 0.003322, "requirements": [], "os": "linux" }, @@ -285,7 +285,7 @@ "name": "errors when strict unmapped mode enabled", "className": "test", "status": "Passed", - "duration": 0.982879, + "duration": 0.80886, "requirements": [], "os": "linux" }, @@ -294,7 +294,7 @@ "name": "escapeMarkdown escapes special characters", "className": "test", "status": "Passed", - "duration": 0.001052, + "duration": 0.005157, "requirements": [], "os": "linux" }, @@ -303,7 +303,7 @@ "name": "escapeMarkdown leaves plain text untouched", "className": "test", "status": "Passed", - "duration": 0.00021, + "duration": 0.000205, "requirements": [], "os": "linux" }, @@ -312,7 +312,7 @@ "name": "fails when commit lacks requirement reference", "className": "test", "status": "Passed", - "duration": 0.848038, + "duration": 0.917837, "requirements": [], "os": "linux" }, @@ -321,7 +321,7 @@ "name": "fails when requirement lacks test coverage", "className": "test", "status": "Passed", - "duration": 0.983792, + "duration": 0.939881, "requirements": [], "os": "linux" }, @@ -330,7 +330,7 @@ "name": "fails when tests are unmapped", "className": "test", "status": "Passed", - "duration": 0.862378, + "duration": 0.758437, "requirements": [], "os": "linux" }, @@ -339,7 +339,7 @@ "name": "fails when tests reference unknown requirements", "className": "test", "status": "Passed", - "duration": 0.906077, + "duration": 0.892094, "requirements": [], "os": "linux" }, @@ -348,7 +348,7 @@ "name": "formatError handles plain objects", "className": "test", "status": "Passed", - "duration": 0.000223, + "duration": 0.000361, "requirements": [], "os": "linux" }, @@ -357,7 +357,7 @@ "name": "formatError handles primitives", "className": "test", "status": "Passed", - "duration": 0.001317, + "duration": 0.000173, "requirements": [], "os": "linux" }, @@ -366,7 +366,7 @@ "name": "formatError handles real Error objects", "className": "test", "status": "Passed", - "duration": 0.001526, + "duration": 0.001456, "requirements": [], "os": "linux" }, @@ -375,7 +375,7 @@ "name": "formatError handles unstringifiable values", "className": "test", "status": "Passed", - "duration": 0.000399, + "duration": 0.000332, "requirements": [], "os": "linux" }, @@ -384,7 +384,7 @@ "name": "generate-ci-summary features", "className": "test", "status": "Passed", - "duration": 0.022864, + "duration": 0.022132, "requirements": [], "os": "linux" }, @@ -393,7 +393,7 @@ "name": "groups owners and includes requirements and evidence", "className": "test", "status": "Passed", - "duration": 0.966261, + "duration": 0.906265, "requirements": [], "os": "linux" }, @@ -402,7 +402,7 @@ "name": "groupToMarkdown omits numeric identifiers", "className": "test", "status": "Passed", - "duration": 0.00176, + "duration": 0.0022, "requirements": [], "os": "linux" }, @@ -411,7 +411,7 @@ "name": "groupToMarkdown supports optional limit for truncation", "className": "test", "status": "Passed", - "duration": 0.000327, + "duration": 0.001198, "requirements": [], "os": "linux" }, @@ -420,7 +420,7 @@ "name": "handles root-level testcases", "className": "test", "status": "Passed", - "duration": 0.000439, + "duration": 0.000521, "requirements": [], "os": "linux" }, @@ -429,7 +429,7 @@ "name": "handles zipped JUnit artifacts", "className": "test", "status": "Passed", - "duration": 0.725273, + "duration": 0.706569, "requirements": [], "os": "linux" }, @@ -438,7 +438,7 @@ "name": "ignores stale JUnit files outside artifacts path", "className": "test", "status": "Passed", - "duration": 0.764593, + "duration": 0.693747, "requirements": [], "os": "linux" }, @@ -447,7 +447,7 @@ "name": "loadRequirements logs warning on invalid JSON", "className": "test", "status": "Passed", - "duration": 0.006138, + "duration": 0.016216, "requirements": [], "os": "linux" }, @@ -456,7 +456,7 @@ "name": "loadRequirements warns and skips invalid entries", "className": "test", "status": "Passed", - "duration": 0.010612, + "duration": 0.021273, "requirements": [], "os": "linux" }, @@ -465,7 +465,7 @@ "name": "logs a warning when no JUnit files are found", "className": "test", "status": "Passed", - "duration": 0.937453, + "duration": 0.740869, "requirements": [], "os": "linux" }, @@ -474,7 +474,7 @@ "name": "partitions requirement groups by runner_type", "className": "test", "status": "Passed", - "duration": 0.693193, + "duration": 0.668444, "requirements": [], "os": "linux" }, @@ -483,7 +483,7 @@ "name": "passes with coverage and requirement reference", "className": "test", "status": "Passed", - "duration": 0.863637, + "duration": 0.794429, "requirements": [], "os": "linux" }, @@ -492,7 +492,7 @@ "name": "requirementsSummaryToMarkdown escapes pipes in description", "className": "test", "status": "Passed", - "duration": 0.000528, + "duration": 0.001213, "requirements": [], "os": "linux" }, @@ -501,7 +501,7 @@ "name": "skips invalid JUnit files and still generates summary", "className": "test", "status": "Passed", - "duration": 1.04472, + "duration": 0.980198, "requirements": [], "os": "linux" }, @@ -510,7 +510,7 @@ "name": "summaryToMarkdown handles no tests", "className": "test", "status": "Passed", - "duration": 0.000471, + "duration": 0.000379, "requirements": [], "os": "linux" }, @@ -519,7 +519,7 @@ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters", "className": "test", "status": "Passed", - "duration": 0.00056, + "duration": 0.000624, "requirements": [], "os": "linux" }, @@ -528,7 +528,7 @@ "name": "throws when no JUnit files found and strict mode enabled", "className": "test", "status": "Passed", - "duration": 0.597682, + "duration": 0.563797, "requirements": [], "os": "linux" }, @@ -537,7 +537,7 @@ "name": "uses latest artifact directory when multiple are present", "className": "test", "status": "Passed", - "duration": 0.815296, + "duration": 0.704977, "requirements": [], "os": "linux" }, @@ -546,7 +546,7 @@ "name": "warns when all tests are unmapped", "className": "test", "status": "Passed", - "duration": 1.044295, + "duration": 0.980787, "requirements": [], "os": "linux" }, @@ -555,7 +555,7 @@ "name": "writeErrorSummary appends error details to summary file", "className": "test", "status": "Passed", - "duration": 0.009968, + "duration": 0.01181, "requirements": [], "os": "linux" }, @@ -564,7 +564,7 @@ "name": "writeErrorSummary skips summary file for non-Error throws", "className": "test", "status": "Passed", - "duration": 0.002501, + "duration": 0.003551, "requirements": [], "os": "linux" }, @@ -573,7 +573,7 @@ "name": "writes outputs to OS-specific directory", "className": "test", "status": "Passed", - "duration": 1.177582, + "duration": 1.140125, "requirements": [], "os": "linux" } @@ -585,7 +585,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 15.257237, + "duration": 14.223307000000002, "rate": 100 }, "byOs": { @@ -593,7 +593,7 @@ "passed": 54, "failed": 0, "skipped": 0, - "duration": 15.257237, + "duration": 14.223307000000002, "rate": 100 } } diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md index c94996eb..22bc3716 100644 --- a/artifacts/linux/traceability.md +++ b/artifacts/linux/traceability.md @@ -4,37 +4,37 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-023 | parses-nested-junit-structures | Passed | 0.013 | | | +| REQ-023 | parses-nested-junit-structures | Passed | 0.011 | | | #### REQ-024 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-024 | captures-root-testsuites-attributes | Passed | 0.002 | | | +| REQ-024 | captures-root-testsuites-attributes | Passed | 0.008 | | | #### REQ-025 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-025 | captures-testsuite-attributes | Passed | 0.006 | | | +| REQ-025 | captures-testsuite-attributes | Passed | 0.002 | | | #### REQ-026 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-026 | captures-suite-properties | Passed | 0.001 | | | +| REQ-026 | captures-suite-properties | Passed | 0.003 | | | #### REQ-027 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | | +| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.002 | | | #### REQ-028 (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | | +| REQ-028 | extracts-requirement-identifiers | Passed | 0.003 | | | #### REQ-029 (100% passed) @@ -46,7 +46,7 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.001 | | | +| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.004 | | | #### REQ-031 (100% passed) @@ -64,54 +64,54 @@ | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | | +| REQ-033 | throws-error-for-malformed-xml | Passed | 0.003 | | |
Unmapped (100% passed) | Requirement | Test ID | Status | Duration (s) | Owner | Evidence | | --- | --- | --- | --- | --- | --- | -| Unmapped | associates-classname-with-requirement | Passed | 0.011 | | | +| Unmapped | associates-classname-with-requirement | Passed | 0.010 | | | | Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | | -| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.002 | | | +| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.003 | | | | Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | | -| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.008 | | | -| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.007 | | | +| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.009 | | | +| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.010 | | | | Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.011 | | | | Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | | -| Unmapped | detects-downloaded-artifacts-path | Passed | 0.908 | | | +| Unmapped | detects-downloaded-artifacts-path | Passed | 0.849 | | | | Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | -| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.983 | | | -| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | | +| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 0.809 | | | +| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.005 | | | | Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | | -| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.848 | | | -| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.984 | | | -| Unmapped | fails-when-tests-are-unmapped | Passed | 0.862 | | | -| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.906 | | | +| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.918 | | | +| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 0.940 | | | +| Unmapped | fails-when-tests-are-unmapped | Passed | 0.758 | | | +| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.892 | | | | Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | | -| Unmapped | formaterror-handles-primitives | Passed | 0.001 | | | -| Unmapped | formaterror-handles-real-error-objects | Passed | 0.002 | | | +| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | | +| Unmapped | formaterror-handles-real-error-objects | Passed | 0.001 | | | | Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | | -| Unmapped | generate-ci-summary-features | Passed | 0.023 | | | -| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.966 | | | +| Unmapped | generate-ci-summary-features | Passed | 0.022 | | | +| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 0.906 | | | | Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | | -| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.000 | | | -| Unmapped | handles-root-level-testcases | Passed | 0.000 | | | -| Unmapped | handles-zipped-junit-artifacts | Passed | 0.725 | | | -| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.765 | | | -| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.006 | | | -| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.011 | | | -| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.937 | | | -| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.693 | | | -| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.864 | | | +| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | | +| Unmapped | handles-root-level-testcases | Passed | 0.001 | | | +| Unmapped | handles-zipped-junit-artifacts | Passed | 0.707 | | | +| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.694 | | | +| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.016 | | | +| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.021 | | | +| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.741 | | | +| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.668 | | | +| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 0.794 | | | | Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.001 | | | -| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.045 | | | +| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 0.980 | | | | Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | | | Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | | -| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.598 | | | -| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.815 | | | -| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.044 | | | -| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.010 | | | -| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.003 | | | -| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.178 | | | +| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.564 | | | +| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.705 | | | +| Unmapped | warns-when-all-tests-are-unmapped | Passed | 0.981 | | | +| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.012 | | | +| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | | +| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.140 | | |
\ No newline at end of file diff --git a/ci_evidence.txt b/ci_evidence.txt index 6f708075..fc9503da 100644 --- a/ci_evidence.txt +++ b/ci_evidence.txt @@ -1 +1 @@ -{"pipeline":"Unknown","git_sha":"3aeaac34201042124d849a474c567cabf217d8f7","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file +{"pipeline":"Unknown","git_sha":"18acf10f67c1d2e12a76f2b87e62cea85d1e5162","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}} \ No newline at end of file diff --git a/docs/action-call-reference.md b/docs/action-call-reference.md index 06bf34fc..d081dab4 100644 --- a/docs/action-call-reference.md +++ b/docs/action-call-reference.md @@ -1,13 +1,13 @@ # Action Call Reference -Each adapter in this repository is available as its own GitHub Action. Call them using `uses: LabVIEW-Community-CI-CD/open-source-actions/@v1` with the required inputs shown below. Refer to the linked documentation for full parameter details. +Each adapter in this repository is available as its own GitHub Action. Call them using `uses: LabVIEW-Community-CI-CD/open-source/@v1` with the required inputs shown below. Refer to the linked documentation for full parameter details. ## add-token-to-labview See [add-token-to-labview](actions/add-token-to-labview.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/add-token-to-labview@v1 +- uses: LabVIEW-Community-CI-CD/open-source/add-token-to-labview@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' @@ -19,7 +19,7 @@ See [add-token-to-labview](actions/add-token-to-labview.md) for all parameters. See [apply-vipc](actions/apply-vipc.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/apply-vipc@v1 +- uses: LabVIEW-Community-CI-CD/open-source/apply-vipc@v1 with: minimum_supported_lv_version: '2019' vip_lv_version: '2019' @@ -32,7 +32,7 @@ See [apply-vipc](actions/apply-vipc.md) for all parameters. See [build](actions/build.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/build@v1 +- uses: LabVIEW-Community-CI-CD/open-source/build@v1 with: relative_path: '.' major: 1 @@ -50,7 +50,7 @@ See [build](actions/build.md) for all parameters. See [build-lvlibp](actions/build-lvlibp.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/build-lvlibp@v1 +- uses: LabVIEW-Community-CI-CD/open-source/build-lvlibp@v1 with: minimum_supported_lv_version: '2020' supported_bitness: '64' @@ -69,7 +69,7 @@ See [build-lvlibp](actions/build-lvlibp.md) for all parameters. See [build-vi-package](actions/build-vi-package.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/build-vi-package@v1 +- uses: LabVIEW-Community-CI-CD/open-source/build-vi-package@v1 with: minimum_supported_lv_version: '2023' supported_bitness: '64' @@ -89,7 +89,7 @@ See [build-vi-package](actions/build-vi-package.md) for all parameters. See [close-labview](actions/close-labview.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/close-labview@v1 +- uses: LabVIEW-Community-CI-CD/open-source/close-labview@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' @@ -100,7 +100,7 @@ See [close-labview](actions/close-labview.md) for all parameters. See [generate-release-notes](actions/generate-release-notes.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/generate-release-notes@v1 +- uses: LabVIEW-Community-CI-CD/open-source/generate-release-notes@v1 ``` ## missing-in-project @@ -108,7 +108,7 @@ See [generate-release-notes](actions/generate-release-notes.md) for all paramete See [missing-in-project](actions/missing-in-project.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/missing-in-project@v1 +- uses: LabVIEW-Community-CI-CD/open-source/missing-in-project@v1 with: lv_version: '2020' supported_bitness: '64' @@ -120,7 +120,7 @@ See [missing-in-project](actions/missing-in-project.md) for all parameters. See [modify-vipb-display-info](actions/modify-vipb-display-info.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/modify-vipb-display-info@v1 +- uses: LabVIEW-Community-CI-CD/open-source/modify-vipb-display-info@v1 with: supported_bitness: '64' relative_path: '.' @@ -140,7 +140,7 @@ See [modify-vipb-display-info](actions/modify-vipb-display-info.md) for all para See [prepare-labview-source](actions/prepare-labview-source.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/prepare-labview-source@v1 +- uses: LabVIEW-Community-CI-CD/open-source/prepare-labview-source@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' @@ -154,7 +154,7 @@ See [prepare-labview-source](actions/prepare-labview-source.md) for all paramete See [rename-file](actions/rename-file.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/rename-file@v1 +- uses: LabVIEW-Community-CI-CD/open-source/rename-file@v1 with: current_filename: 'C:/path/lv_icon.lvlibp' new_filename: 'lv_icon_x64_v1.0.0.1+gabcdef.lvlibp' @@ -165,7 +165,7 @@ See [rename-file](actions/rename-file.md) for all parameters. See [restore-setup-lv-source](actions/restore-setup-lv-source.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/restore-setup-lv-source@v1 +- uses: LabVIEW-Community-CI-CD/open-source/restore-setup-lv-source@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' @@ -179,7 +179,7 @@ See [restore-setup-lv-source](actions/restore-setup-lv-source.md) for all parame See [revert-development-mode](actions/revert-development-mode.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/revert-development-mode@v1 +- uses: LabVIEW-Community-CI-CD/open-source/revert-development-mode@v1 with: relative_path: '.' ``` @@ -189,7 +189,7 @@ See [revert-development-mode](actions/revert-development-mode.md) for all parame See [run-pester-tests](actions/run-pester-tests.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/run-pester-tests@v1 +- uses: LabVIEW-Community-CI-CD/open-source/run-pester-tests@v1 with: working_directory: '.' ``` @@ -199,7 +199,7 @@ See [run-pester-tests](actions/run-pester-tests.md) for all parameters. See [run-unit-tests](actions/run-unit-tests.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/run-unit-tests@v1 +- uses: LabVIEW-Community-CI-CD/open-source/run-unit-tests@v1 with: minimum_supported_lv_version: '2020' supported_bitness: '64' @@ -210,7 +210,7 @@ See [run-unit-tests](actions/run-unit-tests.md) for all parameters. See [set-development-mode](actions/set-development-mode.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/set-development-mode@v1 +- uses: LabVIEW-Community-CI-CD/open-source/set-development-mode@v1 with: relative_path: '.' ``` @@ -220,5 +220,5 @@ See [set-development-mode](actions/set-development-mode.md) for all parameters. See [setup-mkdocs](actions/setup-mkdocs.md) for all parameters. ```yaml -- uses: LabVIEW-Community-CI-CD/open-source-actions/setup-mkdocs@v1 +- uses: LabVIEW-Community-CI-CD/open-source/setup-mkdocs@v1 ``` diff --git a/docs/actions/add-token-to-labview.md b/docs/actions/add-token-to-labview.md index bfb33cb9..1bd7184e 100644 --- a/docs/actions/add-token-to-labview.md +++ b/docs/actions/add-token-to-labview.md @@ -49,7 +49,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName add-token-to-labview -ArgsJso ```yaml - name: Add library token - uses: LabVIEW-Community-CI-CD/open-source-actions/add-token-to-labview@v1 + uses: LabVIEW-Community-CI-CD/open-source/add-token-to-labview@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' diff --git a/docs/actions/apply-vipc.md b/docs/actions/apply-vipc.md index 6f6974be..40a11f8d 100644 --- a/docs/actions/apply-vipc.md +++ b/docs/actions/apply-vipc.md @@ -55,7 +55,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName apply-vipc -ArgsJson '{ ```yaml - name: Apply VIPC - uses: LabVIEW-Community-CI-CD/open-source-actions/apply-vipc@v1 + uses: LabVIEW-Community-CI-CD/open-source/apply-vipc@v1 with: minimum_supported_lv_version: '2019' vip_lv_version: '2019' diff --git a/docs/actions/build-lvlibp.md b/docs/actions/build-lvlibp.md index 98a0edec..f303fd67 100644 --- a/docs/actions/build-lvlibp.md +++ b/docs/actions/build-lvlibp.md @@ -70,7 +70,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName build-lvlibp -ArgsJson '{ ```yaml - name: Build Packed Library - uses: LabVIEW-Community-CI-CD/open-source-actions/build-lvlibp@v1 + uses: LabVIEW-Community-CI-CD/open-source/build-lvlibp@v1 with: minimum_supported_lv_version: '2020' supported_bitness: '64' diff --git a/docs/actions/build-vi-package.md b/docs/actions/build-vi-package.md index 854669cb..2382a28e 100644 --- a/docs/actions/build-vi-package.md +++ b/docs/actions/build-vi-package.md @@ -74,7 +74,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName build-vi-package -ArgsJson '{ ```yaml - name: Build VI Package - uses: LabVIEW-Community-CI-CD/open-source-actions/build-vi-package@v1 + uses: LabVIEW-Community-CI-CD/open-source/build-vi-package@v1 with: minimum_supported_lv_version: '2023' supported_bitness: '64' diff --git a/docs/actions/build.md b/docs/actions/build.md index 54e04db5..e8a5d197 100644 --- a/docs/actions/build.md +++ b/docs/actions/build.md @@ -67,7 +67,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName build -ArgsJson '{ ```yaml - name: Build project - uses: LabVIEW-Community-CI-CD/open-source-actions/build@v1 + uses: LabVIEW-Community-CI-CD/open-source/build@v1 with: working_directory: '.' relative_path: '.' diff --git a/docs/actions/close-labview.md b/docs/actions/close-labview.md index 2a0bcc5a..0869d2f1 100644 --- a/docs/actions/close-labview.md +++ b/docs/actions/close-labview.md @@ -45,7 +45,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName close-labview -ArgsJson '{ ```yaml - name: Close LabVIEW - uses: LabVIEW-Community-CI-CD/open-source-actions/close-labview@v1 + uses: LabVIEW-Community-CI-CD/open-source/close-labview@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' diff --git a/docs/actions/generate-release-notes.md b/docs/actions/generate-release-notes.md index f37b3570..2dd94d57 100644 --- a/docs/actions/generate-release-notes.md +++ b/docs/actions/generate-release-notes.md @@ -42,7 +42,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName generate-release-notes -ArgsJ ```yaml - name: Generate release notes - uses: LabVIEW-Community-CI-CD/open-source-actions/generate-release-notes@v1 + uses: LabVIEW-Community-CI-CD/open-source/generate-release-notes@v1 with: output_path: 'Tooling/deployment/release_notes.md' ``` diff --git a/docs/actions/missing-in-project.md b/docs/actions/missing-in-project.md index 9d97326a..14321c49 100644 --- a/docs/actions/missing-in-project.md +++ b/docs/actions/missing-in-project.md @@ -48,7 +48,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName missing-in-project -ArgsJson ```yaml - name: Check for Missing Project Items - uses: LabVIEW-Community-CI-CD/open-source-actions/missing-in-project@v1 + uses: LabVIEW-Community-CI-CD/open-source/missing-in-project@v1 with: lv_version: '2020' supported_bitness: '64' diff --git a/docs/actions/modify-vipb-display-info.md b/docs/actions/modify-vipb-display-info.md index af0eac2e..dd9f258a 100644 --- a/docs/actions/modify-vipb-display-info.md +++ b/docs/actions/modify-vipb-display-info.md @@ -74,7 +74,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName modify-vipb-display-info -Arg ```yaml - name: Modify VIPB display info - uses: LabVIEW-Community-CI-CD/open-source-actions/modify-vipb-display-info@v1 + uses: LabVIEW-Community-CI-CD/open-source/modify-vipb-display-info@v1 with: supported_bitness: '64' working_directory: '.' diff --git a/docs/actions/prepare-labview-source.md b/docs/actions/prepare-labview-source.md index bef10f84..4de29e94 100644 --- a/docs/actions/prepare-labview-source.md +++ b/docs/actions/prepare-labview-source.md @@ -55,7 +55,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName prepare-labview-source -ArgsJ ```yaml - name: Prepare LabVIEW source - uses: LabVIEW-Community-CI-CD/open-source-actions/prepare-labview-source@v1 + uses: LabVIEW-Community-CI-CD/open-source/prepare-labview-source@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' diff --git a/docs/actions/rename-file.md b/docs/actions/rename-file.md index 1b3dad25..945f0ede 100644 --- a/docs/actions/rename-file.md +++ b/docs/actions/rename-file.md @@ -45,7 +45,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName rename-file -ArgsJson '{ ```yaml - name: Rename file - uses: LabVIEW-Community-CI-CD/open-source-actions/rename-file@v1 + uses: LabVIEW-Community-CI-CD/open-source/rename-file@v1 with: current_filename: 'C:/path/lv_icon.lvlibp' new_filename: 'lv_icon_x64_v1.0.0.1+gabcdef.lvlibp' diff --git a/docs/actions/restore-setup-lv-source.md b/docs/actions/restore-setup-lv-source.md index 0deffd87..37b37990 100644 --- a/docs/actions/restore-setup-lv-source.md +++ b/docs/actions/restore-setup-lv-source.md @@ -55,7 +55,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName restore-setup-lv-source -Args ```yaml - name: Restore LabVIEW setup - uses: LabVIEW-Community-CI-CD/open-source-actions/restore-setup-lv-source@v1 + uses: LabVIEW-Community-CI-CD/open-source/restore-setup-lv-source@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' diff --git a/docs/actions/revert-development-mode.md b/docs/actions/revert-development-mode.md index 6b47e488..2ed1f05d 100644 --- a/docs/actions/revert-development-mode.md +++ b/docs/actions/revert-development-mode.md @@ -43,7 +43,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName revert-development-mode -Args ```yaml - name: Revert development mode - uses: LabVIEW-Community-CI-CD/open-source-actions/revert-development-mode@v1 + uses: LabVIEW-Community-CI-CD/open-source/revert-development-mode@v1 with: working_directory: '.' relative_path: '.' diff --git a/docs/actions/run-pester-tests.md b/docs/actions/run-pester-tests.md index ca6daee0..76e02106 100644 --- a/docs/actions/run-pester-tests.md +++ b/docs/actions/run-pester-tests.md @@ -40,7 +40,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName run-pester-tests -ArgsJson '{ ```yaml - name: Run Pester tests - uses: LabVIEW-Community-CI-CD/open-source-actions/run-pester-tests@v1 + uses: LabVIEW-Community-CI-CD/open-source/run-pester-tests@v1 with: working_directory: '.' ``` diff --git a/docs/actions/run-unit-tests.md b/docs/actions/run-unit-tests.md index 21db0c6d..0d466665 100644 --- a/docs/actions/run-unit-tests.md +++ b/docs/actions/run-unit-tests.md @@ -54,7 +54,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName run-unit-tests -ArgsFile ./co ```yaml - name: Run LabVIEW Unit Tests - uses: LabVIEW-Community-CI-CD/open-source-actions/run-unit-tests@v1 + uses: LabVIEW-Community-CI-CD/open-source/run-unit-tests@v1 with: minimum_supported_lv_version: '2020' supported_bitness: '64' diff --git a/docs/actions/set-development-mode.md b/docs/actions/set-development-mode.md index 47e1bf76..636fb67d 100644 --- a/docs/actions/set-development-mode.md +++ b/docs/actions/set-development-mode.md @@ -43,7 +43,7 @@ pwsh -File actions/Invoke-OSAction.ps1 -ActionName set-development-mode -ArgsJso ```yaml - name: Set development mode - uses: LabVIEW-Community-CI-CD/open-source-actions/set-development-mode@v1 + uses: LabVIEW-Community-CI-CD/open-source/set-development-mode@v1 with: working_directory: '.' relative_path: '.' diff --git a/docs/actions/setup-mkdocs.md b/docs/actions/setup-mkdocs.md index 10c5f8a7..4b7399e4 100644 --- a/docs/actions/setup-mkdocs.md +++ b/docs/actions/setup-mkdocs.md @@ -18,7 +18,7 @@ This action has no inputs. ```yaml - name: Setup MkDocs - uses: LabVIEW-Community-CI-CD/open-source-actions/setup-mkdocs@v1 + uses: LabVIEW-Community-CI-CD/open-source/setup-mkdocs@v1 ``` ## Return Codes diff --git a/docs/quickstart.md b/docs/quickstart.md index 449dc150..52110743 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Build Packed Library (32-bit) - uses: LabVIEW-Community-CI-CD/open-source-actions/build-lvlibp@v1 + uses: LabVIEW-Community-CI-CD/open-source/build-lvlibp@v1 with: minimum_supported_lv_version: '2019' supported_bitness: '32' @@ -70,7 +70,7 @@ jobs: with: repository: LabVIEW-Community-CI-CD/labview-icon-editor path: labview-icon-editor - - uses: LabVIEW-Community-CI-CD/open-source-actions/apply-vipc@v1 + - uses: LabVIEW-Community-CI-CD/open-source/apply-vipc@v1 with: minimum_supported_lv_version: '2021' vip_lv_version: '2021' @@ -78,13 +78,13 @@ jobs: working_directory: labview-icon-editor relative_path: '.' vipc_path: labview-icon-editor/.github/actions/apply-vipc/runner_dependencies.vipc - - uses: LabVIEW-Community-CI-CD/open-source-actions/set-development-mode@v1 + - uses: LabVIEW-Community-CI-CD/open-source/set-development-mode@v1 with: minimum_supported_lv_version: '2021' supported_bitness: '64' working_directory: labview-icon-editor relative_path: '.' - - uses: LabVIEW-Community-CI-CD/open-source-actions/build@v1 + - uses: LabVIEW-Community-CI-CD/open-source/build@v1 with: working_directory: labview-icon-editor relative_path: '.' @@ -96,7 +96,7 @@ jobs: labview_minor_revision: '3' company_name: 'Acme Corp' author_name: 'Jane Doe' - - uses: LabVIEW-Community-CI-CD/open-source-actions/revert-development-mode@v1 + - uses: LabVIEW-Community-CI-CD/open-source/revert-development-mode@v1 with: working_directory: labview-icon-editor relative_path: '.' diff --git a/docs/testing-pester.md b/docs/testing-pester.md index 15ef811d..f72a59c1 100644 --- a/docs/testing-pester.md +++ b/docs/testing-pester.md @@ -4,7 +4,7 @@ Most tests run without cloning the [`labview-icon-editor`](https://github.com/LabVIEW-Community-CI-CD/labview-icon-editor) repository. The helper defaults to the repository root as the project directory. -Tests that need the example project can either clone it under `open-source-actions/labview-icon-editor`: +Tests that need the example project can either clone it under `open-source/labview-icon-editor`: ```bash git clone https://github.com/LabVIEW-Community-CI-CD/labview-icon-editor.git labview-icon-editor diff --git a/linkinator.config.json b/linkinator.config.json index b0f1a972..253f94ac 100644 --- a/linkinator.config.json +++ b/linkinator.config.json @@ -6,7 +6,7 @@ "verbosity": "error", "directoryListing": true, "skip": [ - "https://open-source-actions.github.io/open-source-actions/", + "https://labview-community-ci-cd.github.io/open-source/", "http://127.0.0.1:8000/", "https://LabVIEW-Community-CI-CD.github.io/summary.md", "https://labview-community-ci-cd.github.io/summary.md" diff --git a/package-lock.json b/package-lock.json index 0fc00f36..f7aabb33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "open-source-actions", + "name": "open-source", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "open-source-actions", + "name": "open-source", "version": "1.0.0", "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index de030dab..4f1b5220 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "open-source-actions", + "name": "open-source", "version": "1.0.0", "private": true, "type": "module", diff --git a/test-results/linkinator.log b/test-results/linkinator.log index 737f91c1..e69de29b 100644 --- a/test-results/linkinator.log +++ b/test-results/linkinator.log @@ -1,3 +0,0 @@ -npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. -🏊‍♂️ crawling README.md docs scripts -🤖 Successfully scanned 18 links in 0.244 seconds. diff --git a/test-results/lint-md.log b/test-results/lint-md.log index 51ace495..69432bb0 100644 --- a/test-results/lint-md.log +++ b/test-results/lint-md.log @@ -1,8 +1,8 @@ -> open-source-actions@1.0.0 lint:md +> open-source@1.0.0 lint:md > markdownlint-cli2 README.md "docs/**/*.md" "scripts/**/*.md" markdownlint-cli2 v0.18.1 (markdownlint v0.38.0) Finding: README.md docs/**/*.md scripts/**/*.md -Linting: 91 file(s) +Linting: 92 file(s) Summary: 0 error(s) diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml index 3a8f049a..59a87ad4 100644 --- a/test-results/node-junit.xml +++ b/test-results/node-junit.xml @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61,5 +61,5 @@ - +