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/.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/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.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 b7ead838..89c97226 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,11 @@ 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' + 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.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..221b7b10 100644 --- a/.github/workflows/build-self-hosted.yml +++ b/.github/workflows/build-self-hosted.yml @@ -6,22 +6,44 @@ on: jobs: build: runs-on: ubuntu-latest + env: + MAJOR: '1' + MINOR: '0' + PATCH: '0' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 - 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 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 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@ea165f8d65b6e75b540449e92b4886f43607fa02 + 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.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 2d501524..09389816 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,11 @@ 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' + 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/.github/workflows/ci.json b/.github/workflows/ci.json index 1981b60a..e15f246f 100644 --- a/.github/workflows/ci.json +++ b/.github/workflows/ci.json @@ -13,23 +13,41 @@ } }, "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", + "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": "steps.check.outputs.present == 'true'", "with": { - "node-version": 24 + "name": "release-metadata", + "path": "release.json" } + } + ] + }, + "validate-artifacts": { + "needs": "release-check", + "runs-on": "ubuntu-24.04", + "steps": [ + { + "uses": "actions/checkout@v4" }, { - "run": "npm run check:node" + "uses": "actions/setup-node@v4", + "with": { + "node-version": 24 + } }, { "run": "npm install" @@ -37,49 +55,19 @@ { "run": "npm run link:check" }, - { - "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" - } - }, - { - "uses": "actions/upload-artifact@v4", - "if": "always()", - "with": { - "name": "traceability", - "path": "${{ env.ARTIFACT_DIR }}/traceability.*" - } + "run": "git diff --exit-code -- dispatchers.json" }, { - "uses": "actions/upload-artifact@v4", - "if": "always()", - "with": { - "name": "action-docs", - "path": "${{ env.ARTIFACT_DIR }}/action-docs.*" - } - }, - { - "uses": "actions/upload-artifact@v4", - "if": "always()", - "with": { - "name": "evidence", - "path": "${{ env.ARTIFACT_DIR }}/evidence/**", - "if-no-files-found": "ignore" - } + "run": "npm run check:traceability" } ] }, "ps-ci": { + "needs": "release-check", "strategy": { "matrix": { "include": [ @@ -115,19 +103,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", @@ -156,7 +131,7 @@ }, "report": { "needs": [ - "node-ci", + "validate-artifacts", "ps-ci" ], "runs-on": "ubuntu-24.04", @@ -177,13 +152,11 @@ { "run": "npm install" }, - { - "run": "rm -rf artifacts" - }, { "uses": "actions/download-artifact@v4", "with": { - "path": "./artifacts" + "pattern": "pester-junit-*", + "path": "./downloaded-artifacts" } }, { @@ -192,12 +165,26 @@ { "run": "npm run generate:summary", "env": { - "TEST_RESULTS_GLOBS": "artifacts/test-results/**/*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" } }, + { + "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 e892012b..ff34bb29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,44 +7,42 @@ on: branches: [actions] jobs: - node-ci: + 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 + outputs: + needs_release: ${{ steps.check.outputs.present }} steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - 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: - node-version: 24 - - run: npm run check:node + name: release-metadata + path: release.json + + validate-artifacts: + needs: release-check + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 + with: + node-version: 22 + - run: npm config delete proxy + - run: npm config delete https-proxy - run: npm install - run: npm run link:check - - 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 - - uses: actions/upload-artifact@v4 - if: ${{ (success() || failure()) && !cancelled() }} - with: - name: traceability - path: ${{ env.ARTIFACT_DIR }}/traceability.* - - uses: actions/upload-artifact@v4 - if: ${{ (success() || failure()) && !cancelled() }} - with: - name: action-docs - path: ${{ env.ARTIFACT_DIR }}/action-docs.* - - uses: actions/upload-artifact@v4 - 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: matrix: include: @@ -61,7 +59,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 @@ -82,36 +80,13 @@ 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: | 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 @@ -125,35 +100,56 @@ 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: 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: - needs: [node-ci, ps-ci] + needs: [validate-artifacts, ps-ci] 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 + node-version: 22 - 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 + pattern: test-results-pester-* + path: ./downloaded-artifacts - run: npm run derive:registry - run: npm run generate:summary env: TEST_RESULTS_GLOBS: | - artifacts/test-results/**/*junit*.xml - artifacts/pester-junit-*/pester-junit.xml + test-results/*junit*.xml + downloaded-artifacts/test-results-pester-*/pester-junit.xml 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@ea165f8d65b6e75b540449e92b4886f43607fa02 + if: ${{ (success() || failure()) && !cancelled() }} + 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 + - 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/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/publish-traceability.yml b/.github/workflows/publish-traceability.yml new file mode 100644 index 00000000..0955ce76 --- /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: 22 + - 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 new file mode 100644 index 00000000..a8d2243d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,90 @@ +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' && github.event.workflow_run.outputs.needs_release == 'true' }} + steps: + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 + with: + ref: ${{ github.event.workflow_run.head_sha }} + - name: Parse release metadata + 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 + with: + run-id: ${{ github.event.workflow_run.id }} + 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 + - 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 + 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 + id: create_release + uses: actions/create-release@0cb9c9b65d5d1901c1f53e5e66eaf4afd303e70e + with: + tag_name: ${{ steps.meta.outputs.tag }} + release_name: ${{ steps.meta.outputs.title }} + body: ${{ steps.notes.outputs.body }} + - name: Upload artifacts + 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 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/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.json b/.github/workflows/run-unit-tests-self-hosted.json index 3a0ef5dd..6547c085 100644 --- a/.github/workflows/run-unit-tests-self-hosted.json +++ b/.github/workflows/run-unit-tests-self-hosted.json @@ -21,12 +21,20 @@ "working_directory": "scripts/run-unit-tests" } }, + { + "name": "Upload test results to GitHub", + "uses": "EnricoMi/publish-unit-test-result-action@v2", + "if": "${{ (success() || failure()) && !cancelled() }}", + "with": { + "files": "artifacts/unit-tests/UnitTestReport.xml" + } + }, { "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..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: @@ -16,8 +16,13 @@ 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: 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: 'scripts/run-unit-tests/UnitTestReport.xml' + 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' 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/ 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..11c6f7ee 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`. @@ -29,8 +29,28 @@ ## 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 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 --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). +- 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. + +### 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. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c0b3be90..6ba8b4c7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,12 +4,38 @@ 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 +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: ```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 --config linkinator.config.json ``` + +## Requirement Traceability + +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 lacking requirement references or associated tests must be updated before merging. diff --git a/README.md b/README.md index 168de0cd..a4ff73f0 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Open Source LabVIEW Actions -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`. +[![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) -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 @@ -17,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' @@ -39,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' @@ -49,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' @@ -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 @@ -139,16 +104,25 @@ 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 +RUNNER_OS=Linux 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. +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: -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 +``` ```powershell $cfg = New-PesterConfiguration @@ -159,6 +133,30 @@ 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 +[`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. 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/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/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/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/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..2f675bea --- /dev/null +++ b/artifacts/linux/requirements-summary.md @@ -0,0 +1,73 @@ +### 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 | | | 43 | 43 | 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 | 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 | +| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | +| Unmapped | fails-when-commit-lacks-requirement-reference | 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 | +| 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 | 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 | +| 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..eea098ba --- /dev/null +++ b/artifacts/linux/summary-standard.md @@ -0,0 +1,7 @@ +### Test Summary +| OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | +| --- | --- | --- | --- | --- | --- | +| 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 new file mode 100644 index 00000000..0f15de72 --- /dev/null +++ b/artifacts/linux/summary.md @@ -0,0 +1,23 @@ +### Test Summary +| OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) | +| --- | --- | --- | --- | --- | --- | +| 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 (%) | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 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 | | | 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 new file mode 100644 index 00000000..22bc3716 --- /dev/null +++ b/artifacts/linux/traceability-standard.md @@ -0,0 +1,117 @@ +### Test Traceability Matrix + +#### REQ-023 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| 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.008 | | | + +#### REQ-025 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| 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.003 | | | + +#### 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.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-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.003 | | | + +
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.001 | | | +| 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.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.849 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| 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.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.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.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.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 | 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.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 new file mode 100644 index 00000000..e2b8959d --- /dev/null +++ b/artifacts/linux/traceability.json @@ -0,0 +1,601 @@ +{ + "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.010782, + "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.007818, + "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.00183, + "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.002576, + "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.002124, + "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.002788, + "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.001336, + "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.003507, + "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.001345, + "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.000906, + "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.003383, + "requirements": [ + "REQ-033" + ], + "os": "linux" + } + ] + }, + { + "id": "Unmapped", + "tests": [ + { + "id": "associates-classname-with-requirement", + "name": "associates classname with requirement", + "className": "test", + "status": "Passed", + "duration": 0.01024, + "requirements": [], + "os": "linux" + }, + { + "id": "buildissuebranchname-formats-branch-name", + "name": "buildIssueBranchName formats branch name", + "className": "test", + "status": "Passed", + "duration": 0.001046, + "requirements": [], + "os": "linux" + }, + { + "id": "buildissuebranchname-rejects-non-numeric-input", + "name": "buildIssueBranchName rejects non-numeric input", + "className": "test", + "status": "Passed", + "duration": 0.003195, + "requirements": [], + "os": "linux" + }, + { + "id": "buildsummary-splits-totals-by-os", + "name": "buildSummary splits totals by OS", + "className": "test", + "status": "Passed", + "duration": 0.000643, + "requirements": [], + "os": "linux" + }, + { + "id": "collecttestcases-captures-requirement-property", + "name": "collectTestCases captures requirement property", + "className": "test", + "status": "Passed", + "duration": 0.009168, + "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.010491, + "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.01121, + "requirements": [], + "os": "linux" + }, + { + "id": "computestatuscounts-tallies-test-statuses", + "name": "computeStatusCounts tallies test statuses", + "className": "test", + "status": "Passed", + "duration": 0.000417, + "requirements": [], + "os": "linux" + }, + { + "id": "detects-downloaded-artifacts-path", + "name": "detects downloaded artifacts path", + "className": "test", + "status": "Passed", + "duration": 0.849063, + "requirements": [], + "os": "linux" + }, + { + "id": "dispatchers-and-parameters-include-descriptions", + "name": "Dispatchers and parameters include descriptions", + "className": "test", + "status": "Passed", + "duration": 0.003322, + "requirements": [], + "os": "linux" + }, + { + "id": "errors-when-strict-unmapped-mode-enabled", + "name": "errors when strict unmapped mode enabled", + "className": "test", + "status": "Passed", + "duration": 0.80886, + "requirements": [], + "os": "linux" + }, + { + "id": "escapemarkdown-escapes-special-characters", + "name": "escapeMarkdown escapes special characters", + "className": "test", + "status": "Passed", + "duration": 0.005157, + "requirements": [], + "os": "linux" + }, + { + "id": "escapemarkdown-leaves-plain-text-untouched", + "name": "escapeMarkdown leaves plain text untouched", + "className": "test", + "status": "Passed", + "duration": 0.000205, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-commit-lacks-requirement-reference", + "name": "fails when commit lacks requirement reference", + "className": "test", + "status": "Passed", + "duration": 0.917837, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-requirement-lacks-test-coverage", + "name": "fails when requirement lacks test coverage", + "className": "test", + "status": "Passed", + "duration": 0.939881, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-tests-are-unmapped", + "name": "fails when tests are unmapped", + "className": "test", + "status": "Passed", + "duration": 0.758437, + "requirements": [], + "os": "linux" + }, + { + "id": "fails-when-tests-reference-unknown-requirements", + "name": "fails when tests reference unknown requirements", + "className": "test", + "status": "Passed", + "duration": 0.892094, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-plain-objects", + "name": "formatError handles plain objects", + "className": "test", + "status": "Passed", + "duration": 0.000361, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-primitives", + "name": "formatError handles primitives", + "className": "test", + "status": "Passed", + "duration": 0.000173, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-real-error-objects", + "name": "formatError handles real Error objects", + "className": "test", + "status": "Passed", + "duration": 0.001456, + "requirements": [], + "os": "linux" + }, + { + "id": "formaterror-handles-unstringifiable-values", + "name": "formatError handles unstringifiable values", + "className": "test", + "status": "Passed", + "duration": 0.000332, + "requirements": [], + "os": "linux" + }, + { + "id": "generate-ci-summary-features", + "name": "generate-ci-summary features", + "className": "test", + "status": "Passed", + "duration": 0.022132, + "requirements": [], + "os": "linux" + }, + { + "id": "groups-owners-and-includes-requirements-and-evidence", + "name": "groups owners and includes requirements and evidence", + "className": "test", + "status": "Passed", + "duration": 0.906265, + "requirements": [], + "os": "linux" + }, + { + "id": "grouptomarkdown-omits-numeric-identifiers", + "name": "groupToMarkdown omits numeric identifiers", + "className": "test", + "status": "Passed", + "duration": 0.0022, + "requirements": [], + "os": "linux" + }, + { + "id": "grouptomarkdown-supports-optional-limit-for-truncation", + "name": "groupToMarkdown supports optional limit for truncation", + "className": "test", + "status": "Passed", + "duration": 0.001198, + "requirements": [], + "os": "linux" + }, + { + "id": "handles-root-level-testcases", + "name": "handles root-level testcases", + "className": "test", + "status": "Passed", + "duration": 0.000521, + "requirements": [], + "os": "linux" + }, + { + "id": "handles-zipped-junit-artifacts", + "name": "handles zipped JUnit artifacts", + "className": "test", + "status": "Passed", + "duration": 0.706569, + "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.693747, + "requirements": [], + "os": "linux" + }, + { + "id": "loadrequirements-logs-warning-on-invalid-json", + "name": "loadRequirements logs warning on invalid JSON", + "className": "test", + "status": "Passed", + "duration": 0.016216, + "requirements": [], + "os": "linux" + }, + { + "id": "loadrequirements-warns-and-skips-invalid-entries", + "name": "loadRequirements warns and skips invalid entries", + "className": "test", + "status": "Passed", + "duration": 0.021273, + "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": 0.740869, + "requirements": [], + "os": "linux" + }, + { + "id": "partitions-requirement-groups-by-runner_type", + "name": "partitions requirement groups by runner_type", + "className": "test", + "status": "Passed", + "duration": 0.668444, + "requirements": [], + "os": "linux" + }, + { + "id": "passes-with-coverage-and-requirement-reference", + "name": "passes with coverage and requirement reference", + "className": "test", + "status": "Passed", + "duration": 0.794429, + "requirements": [], + "os": "linux" + }, + { + "id": "requirementssummarytomarkdown-escapes-pipes-in-description", + "name": "requirementsSummaryToMarkdown escapes pipes in description", + "className": "test", + "status": "Passed", + "duration": 0.001213, + "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": 0.980198, + "requirements": [], + "os": "linux" + }, + { + "id": "summarytomarkdown-handles-no-tests", + "name": "summaryToMarkdown handles no tests", + "className": "test", + "status": "Passed", + "duration": 0.000379, + "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.000624, + "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.563797, + "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.704977, + "requirements": [], + "os": "linux" + }, + { + "id": "warns-when-all-tests-are-unmapped", + "name": "warns when all tests are unmapped", + "className": "test", + "status": "Passed", + "duration": 0.980787, + "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.01181, + "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.003551, + "requirements": [], + "os": "linux" + }, + { + "id": "writes-outputs-to-os-specific-directory", + "name": "writes outputs to OS-specific directory", + "className": "test", + "status": "Passed", + "duration": 1.140125, + "requirements": [], + "os": "linux" + } + ] + } + ], + "totals": { + "overall": { + "passed": 54, + "failed": 0, + "skipped": 0, + "duration": 14.223307000000002, + "rate": 100 + }, + "byOs": { + "linux": { + "passed": 54, + "failed": 0, + "skipped": 0, + "duration": 14.223307000000002, + "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..22bc3716 --- /dev/null +++ b/artifacts/linux/traceability.md @@ -0,0 +1,117 @@ +### Test Traceability Matrix + +#### REQ-023 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| 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.008 | | | + +#### REQ-025 (100% passed) + +| Requirement | Test ID | Status | Duration (s) | Owner | Evidence | +| --- | --- | --- | --- | --- | --- | +| 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.003 | | | + +#### 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.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-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.003 | | | + +
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.001 | | | +| 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.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.849 | | | +| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | | +| 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.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.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.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.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 | 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.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/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/ci_evidence.txt b/ci_evidence.txt new file mode 100644 index 00000000..fc9503da --- /dev/null +++ b/ci_evidence.txt @@ -0,0 +1 @@ +{"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/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/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/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/action-call-reference.md b/docs/action-call-reference.md index ba47abde..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,10 +154,10 @@ 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.lvlibp' + new_filename: 'lv_icon_x64_v1.0.0.1+gabcdef.lvlibp' ``` ## restore-setup-lv-source @@ -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/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/actions/add-token-to-labview.md b/docs/actions/add-token-to-labview.md index 60a8cffa..1bd7184e 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,11 +32,24 @@ 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 - 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' @@ -62,4 +64,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..40a11f8d 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. @@ -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). @@ -43,17 +30,32 @@ 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). | | `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 - 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' @@ -70,4 +72,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..f303fd67 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. @@ -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,11 +46,31 @@ 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 - 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' @@ -90,4 +92,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..2382a28e 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. @@ -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,11 +49,32 @@ 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 - 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' @@ -95,4 +97,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..e8a5d197 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. @@ -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,11 +44,30 @@ 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 - uses: LabVIEW-Community-CI-CD/open-source-actions/build@v1 + uses: LabVIEW-Community-CI-CD/open-source/build@v1 with: working_directory: '.' relative_path: '.' @@ -86,4 +88,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..0869d2f1 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,11 +30,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 close-labview -ArgsJson '{ + "minimum_supported_lv_version": "2021", + "supported_bitness": "64" +}' +``` + +### GitHub Action ```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' @@ -56,4 +58,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..2dd94d57 100644 --- a/docs/actions/generate-release-notes.md +++ b/docs/actions/generate-release-notes.md @@ -14,17 +14,9 @@ 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 - -```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,11 +28,21 @@ 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 - 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' ``` @@ -52,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/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 new file mode 100644 index 00000000..990b95da --- /dev/null +++ b/docs/actions/index.md @@ -0,0 +1,25 @@ +# 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. + +## 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..14321c49 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,11 +32,23 @@ 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 - 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' @@ -61,4 +63,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..dd9f258a 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. @@ -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,11 +49,32 @@ 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 - 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: '.' @@ -95,4 +97,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..4de29e94 100644 --- a/docs/actions/prepare-labview-source.md +++ b/docs/actions/prepare-labview-source.md @@ -13,27 +13,14 @@ 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 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,11 +36,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 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 - 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' @@ -70,4 +72,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 de51c9fc..945f0ede 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.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,14 +30,25 @@ 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 - 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.lvlibp' + new_filename: 'lv_icon_x64_v1.0.0.1+gabcdef.lvlibp' ``` ## Return Codes @@ -56,4 +58,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..37b37990 100644 --- a/docs/actions/restore-setup-lv-source.md +++ b/docs/actions/restore-setup-lv-source.md @@ -13,27 +13,14 @@ 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 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,11 +36,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 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 - 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' @@ -70,4 +72,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..2ed1f05d 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,11 +28,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 revert-development-mode -ArgsJson '{ + "WorkingDirectory": ".", + "RelativePath": "." +}' +``` + +### GitHub Action ```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: '.' @@ -54,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/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 e4caf289..76e02106 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,15 +26,29 @@ 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 - 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: '.' ``` +## 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 @@ -52,4 +58,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..0d466665 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,24 +50,11 @@ 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 - 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' @@ -66,4 +68,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..636fb67d 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,11 +28,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 set-development-mode -ArgsJson '{ + "WorkingDirectory": ".", + "RelativePath": "." +}' +``` + +### GitHub Action ```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: '.' @@ -54,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/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..4b7399e4 100644 --- a/docs/actions/setup-mkdocs.md +++ b/docs/actions/setup-mkdocs.md @@ -8,15 +8,17 @@ 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 - uses: LabVIEW-Community-CI-CD/open-source-actions/setup-mkdocs@v1 + uses: LabVIEW-Community-CI-CD/open-source/setup-mkdocs@v1 ``` ## Return Codes @@ -27,3 +29,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/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 c9b36a7a..6c778ab8 100644 --- a/docs/contributing-docs.md +++ b/docs/contributing-docs.md @@ -4,14 +4,18 @@ 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. +### 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. -- 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 --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 @@ -55,21 +59,25 @@ 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/` and must be committed with your pull request. 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. 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 -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/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/environment-setup.md b/docs/environment-setup.md index 5914cfd4..8f9054de 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. 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 +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/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 821a840a..cbd664aa 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,11 +1,14 @@ # 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](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 - [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/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/requirements.md b/docs/requirements.md index 21498d18..db560cd8 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -2,13 +2,15 @@ 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 | |----|-------------|-------|--------|-------------|--------------| | 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 | @@ -39,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.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](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/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..d332f76d --- /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`](../glossary.md#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 }} +``` + +[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). + +--- + +## 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/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/testing-pester.md b/docs/testing-pester.md index 9523dce4..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 @@ -18,17 +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) +- 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 # only if Pester isn't already installed $cfg = New-PesterConfiguration $cfg.Run.Path = './tests/pester' $cfg.TestResult.Enabled = $false 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/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/docs/workflows/add-token-to-labview.md b/docs/workflows/add-token-to-labview.md index a5683a74..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 8ab84db1..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 e7a4e827..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 e5ed5147..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 0788c141..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 b552d2be..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 462d9b3a..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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/index.md b/docs/workflows/index.md new file mode 100644 index 00000000..30d7f24c --- /dev/null +++ b/docs/workflows/index.md @@ -0,0 +1,25 @@ +# 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`. + +## 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..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 b30f8394..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 3950ba70..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 779af7a2..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 bdbce0dc..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 be78cfba..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 f6074c9d..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 @@ -46,4 +48,14 @@ 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. ``` + +## 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 6c732e35..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 e7af20d1..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 5953b2ee..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 @@ -47,3 +49,11 @@ jobs: shell: pwsh 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 new file mode 100644 index 00000000..b9fb00bc --- /dev/null +++ b/error-summary.md @@ -0,0 +1,112 @@ + + +### 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) +``` + + +### 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) +``` + + +### 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) +``` + + +### 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) +``` + + +### 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) +``` + + +### 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) +``` + + +### 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/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/linkinator.config.json b/linkinator.config.json new file mode 100644 index 00000000..253f94ac --- /dev/null +++ b/linkinator.config.json @@ -0,0 +1,14 @@ +{ + "markdown": true, + "recurse": true, + "retry": true, + "retryErrors": true, + "verbosity": "error", + "directoryListing": true, + "skip": [ + "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/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/mkdocs.yml b/mkdocs.yml index 55143cfa..2042f86c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -35,57 +35,81 @@ 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: + - Glossary: glossary.md + - Action Calls: action-call-reference.md + - Common Parameters: common-parameters.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 + - 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 + - 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 + - Changelog: CHANGELOG.md + - Contributing: contributing-docs.md + - Requirements: requirements.md + - Testing with Pester: testing-pester.md plugins: - search - autorefs 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/package-lock.json b/package-lock.json index 7bcbbbff..f7aabb33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,30 +1,29 @@ { - "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", - "hasInstallScript": true, "license": "MIT", "dependencies": { - "glob": "^10.3.10", + "adm-zip": "^0.5.16", + "glob": "^11.0.3", "js-yaml": "^4.1.0", "xml2js": "^0.6.2" }, "devDependencies": { "@types/node": "^24.3.0", "@types/xml2js": "^0.4.14", - "markdown-link-check": "3.13.7", - "markdownlint-cli2": "^0.12.1", - "patch-package": "^8.0.0", + "linkinator": "^6.1.4", + "markdownlint-cli2": "^0.18.1", "tsx": "^4.20.4", - "typescript": "^5.4.0" + "typescript": "^5.9.2" }, "engines": { - "node": ">=24" + "node": ">=20" } }, "node_modules/@esbuild/aix-ppc64": { @@ -469,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", @@ -524,62 +544,11 @@ "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", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "license": "MIT", "optional": true, "engines": { @@ -587,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": { @@ -599,10 +568,27 @@ "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==", + "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" }, @@ -616,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", @@ -626,12 +619,14 @@ "@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", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" + } }, "node_modules/agent-base": { "version": "7.1.4", @@ -644,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" @@ -673,63 +668,18 @@ "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" + "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" @@ -748,56 +698,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", @@ -811,64 +711,37 @@ "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==", + "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", - "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" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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==", + "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": "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" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/color-convert": { @@ -890,22 +763,15 @@ "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==", + "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": ">=18" + "node": ">= 12" } }, - "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", @@ -920,46 +786,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", @@ -978,37 +804,42 @@ } } }, - "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==", + "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": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "character-entities": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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==", + "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": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" + "dequal": "^2.0.0" }, - "engines": { - "node": ">= 14" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/dom-serializer": { @@ -1070,21 +901,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", @@ -1097,20 +913,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", @@ -1124,39 +926,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", @@ -1199,61 +968,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", @@ -1295,16 +1022,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", @@ -1321,29 +1038,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", @@ -1359,53 +1053,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": { @@ -1421,37 +1083,25 @@ "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", - "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" } @@ -1470,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" @@ -1490,98 +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/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", @@ -1615,20 +1173,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", @@ -1643,85 +1187,51 @@ "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", - "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/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==", + "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", - "engines": { - "node": ">= 12" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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==", + "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", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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==", + "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", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-extglob": { @@ -1756,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", @@ -1766,42 +1287,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", @@ -1809,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": { @@ -1835,78 +1333,28 @@ "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", - "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/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "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": { - "universalify": "^2.0.0" + "commander": "^8.3.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" - } - }, - "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==", - "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" + "bin": { + "katex": "cli.js" } }, "node_modules/linkify-it": { @@ -1919,171 +1367,207 @@ "uc.micro": "^2.0.0" } }, - "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" - }, - "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==", + "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": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.0.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": { - "markdown-it": "bin/markdown-it.mjs" + "linkinator": "build/src/cli.js" + }, + "engines": { + "node": ">=18" } }, - "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==", + "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": { - "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" + "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": { - "markdown-link-check": "markdown-link-check" + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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": "ISC", + "license": "BlueOak-1.0.0", "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", - "integrity": "sha512-4lbtT14A3m0LPX1WS/3d1m7Blg+ZwiLq36WvjQqFGsX3Gik99NV+VXp/PW3n+Q62xyPdbvGOCfjPqjW+/SKMig==", - "dev": true, - "license": "MIT", - "dependencies": { - "markdown-it": "14.0.0", - "markdownlint-micromark": "0.1.8" - }, - "engines": { - "node": ">=18" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/sponsors/DavidAnson" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "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==", + "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", + "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", "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" - }, "bin": { - "markdownlint-cli2": "markdownlint-cli2.js" + "marked": "bin/marked.js" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" + "node": ">= 18" } }, - "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==", + "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": "MIT", - "peerDependencies": { - "markdownlint-cli2": ">=0.0.4" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=8.6" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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, + "node_modules/lru-cache": { + "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": ">= 14" + "node": "20 || >=22" } }, - "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==", + "node_modules/markdown-it": { + "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": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdownlint": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.38.0.tgz", + "integrity": "sha512-xaSxkaU7wY/0852zGApM8LdlIfGCW8ETZ0Rr62IQtAnUMlMuifsg09vWJcNYeL4f0anvr8Vo4ZQar8jGpV0btQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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": ">=16" + "node": ">=20" }, "funding": { "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==", + "node_modules/markdownlint-cli2": { + "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.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": { - "marked": "bin/marked.js" + "markdownlint-cli2": "markdownlint-cli2-bin.mjs" }, "engines": { - "node": ">= 18" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" } }, - "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==", + "node_modules/markdownlint-cli2-formatter-default": { + "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", - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + }, + "peerDependencies": { + "markdownlint-cli2": ">=0.0.4" } }, "node_modules/mdurl": { @@ -2093,6 +1577,19 @@ "dev": true, "license": "MIT" }, + "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", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2103,327 +1600,648 @@ "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, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "@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" }, - "engines": { - "node": ">=8.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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", + "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": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "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": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "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": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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/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/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "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" + "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/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "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": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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==", + "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", - "engines": { - "node": ">= 0.4.0" + "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/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==", + "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": { - "ms": "^2.1.3", - "validator": "^13.11.0" - }, - "engines": { - "node": ">=16.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.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==", + "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, - "license": "BSD-2-Clause", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "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/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "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", - "engines": { - "node": ">= 0.4" + "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/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "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, - "license": "ISC", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "wrappy": "1" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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==", + "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": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-symbol": "^2.0.0" } }, - "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==", + "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", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.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==", + "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": { - "@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" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "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/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": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" + "micromark-util-symbol": "^2.0.0" } }, - "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/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/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "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": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "micromark-util-symbol": "^2.0.0" } }, - "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==", + "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": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "micromark-util-types": "^2.0.0" } }, - "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/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": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "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==", + "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, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" + "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" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "engines": { + "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==", - "dev": true, - "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" - }, + "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", "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": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "license": "ISC", "dependencies": { - "color-convert": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "20 || >=22" }, "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==", + "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/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", - "engines": { - "node": ">=0.10.0" + "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": { @@ -2436,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" @@ -2477,53 +2295,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", @@ -2576,66 +2347,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", @@ -2660,49 +2371,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", @@ -2738,74 +2418,31 @@ } }, "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==", + "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": ">= 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==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" + "node": ">=14.16" }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "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" + "node": "^12.20.0 || ^14.13.1 || >=16.0.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", @@ -2902,32 +2539,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", @@ -2941,12 +2552,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", @@ -2989,16 +2600,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", @@ -3007,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": { @@ -3019,47 +2620,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": { @@ -3168,13 +2758,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", @@ -3196,59 +2779,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 fec2dadc..4f1b5220 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { - "name": "open-source-actions", + "name": "open-source", "version": "1.0.0", "private": true, "type": "module", "license": "MIT", "engines": { - "node": ">=24" + "node": ">=20" }, "scripts": { "check:node": "node scripts/check-node-version.js", @@ -15,25 +15,27 @@ "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", - "postinstall": "patch-package", + "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\"", - "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 --config linkinator.config.json" }, "dependencies": { - "glob": "^10.3.10", + "adm-zip": "^0.5.16", + "glob": "^11.0.3", "js-yaml": "^4.1.0", "xml2js": "^0.6.2" }, "devDependencies": { "@types/node": "^24.3.0", "@types/xml2js": "^0.4.14", - "markdown-link-check": "3.13.7", - "markdownlint-cli2": "^0.12.1", - "patch-package": "^8.0.0", + "linkinator": "^6.1.4", + "markdownlint-cli2": "^0.18.1", "tsx": "^4.20.4", - "typescript": "^5.4.0" + "typescript": "^5.9.2" } } 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/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/release.json b/release.json new file mode 100644 index 00000000..45707ee9 --- /dev/null +++ b/release.json @@ -0,0 +1,6 @@ +{ + "major": 2, + "minor": 1, + "patch": 0, + "title": "v2.1" +} 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/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/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/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/scripts/__tests__/check-traceability.test.js b/scripts/__tests__/check-traceability.test.js new file mode 100644 index 00000000..6b00df49 --- /dev/null +++ b/scripts/__tests__/check-traceability.test.js @@ -0,0 +1,110 @@ +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 }); +}); + +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/__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__/generate-ci-summary.test.js b/scripts/__tests__/generate-ci-summary.test.js index 6a88b3b4..46a26190 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'; @@ -159,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); @@ -174,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); @@ -312,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'); @@ -332,6 +384,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'); @@ -372,3 +433,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/__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); diff --git a/scripts/__tests__/print-pester-traceability.test.js b/scripts/__tests__/print-pester-traceability.test.js index 236e44ef..76bc12ba 100644 --- a/scripts/__tests__/print-pester-traceability.test.js +++ b/scripts/__tests__/print-pester-traceability.test.js @@ -23,29 +23,44 @@ 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')); - - // 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\)/); + 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 | alpha | Passed | 0.000 | alice | \\[link\\](http://example.com/alpha.log) |' + ) + ); + assert( + aliceSection.includes( + '| REQ-789 | gamma | Passed | 0.000 | alice | \\[link\\](http://example.com/gamma.log) |' + ) + ); + assert( + bobSection.includes( + '| REQ-456 | beta | Passed | 0.000 | bob | \\[link\\](http://example.com/beta.log) |' + ) + ); }); -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 () => { + 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 () => { 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/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/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 diff --git a/scripts/check-traceability.ts b/scripts/check-traceability.ts new file mode 100644 index 00000000..34f8a8de --- /dev/null +++ b/scripts/check-traceability.ts @@ -0,0 +1,59 @@ +#!/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 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; + 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); +}); diff --git a/scripts/generate-ci-summary.ts b/scripts/generate-ci-summary.ts index cc74742b..689fddbf 100644 --- a/scripts/generate-ci-summary.ts +++ b/scripts/generate-ci-summary.ts @@ -2,15 +2,19 @@ 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 { execSync } from 'child_process'; import { buildSummary, summaryToMarkdown, requirementsSummaryToMarkdown, requirementTestsToMarkdown, groupToMarkdown, + computeStatusCounts, TestCase, RequirementGroup, } from './summary/index.ts'; @@ -22,7 +26,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; @@ -38,14 +42,56 @@ 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) { - console.warn('No JUnit files found; writing empty summary.'); - } else { - tests = await collectTestCases(junitFiles, evidenceDir, osType); + 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); + } + } finally { + if (extractedDir) await fs.rm(extractedDir, { recursive: true, force: true }); } 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); @@ -92,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/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/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/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); +}); 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/print-pester-traceability.ts b/scripts/print-pester-traceability.ts index 3189814e..19979474 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; @@ -9,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)) @@ -20,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) { @@ -38,13 +41,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.id, + 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')); 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/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/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/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 { 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`); 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 } 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 diff --git a/test-results/linkinator.log b/test-results/linkinator.log new file mode 100644 index 00000000..e69de29b diff --git a/test-results/lint-md.log b/test-results/lint-md.log new file mode 100644 index 00000000..69432bb0 --- /dev/null +++ b/test-results/lint-md.log @@ -0,0 +1,8 @@ + +> 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: 92 file(s) +Summary: 0 error(s) diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml new file mode 100644 index 00000000..59a87ad4 --- /dev/null +++ b/test-results/node-junit.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/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 79105675..85874635 100644 --- a/tests/pester/Build.Workflow.Tests.ps1 +++ b/tests/pester/Build.Workflow.Tests.ps1 @@ -9,13 +9,13 @@ 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 $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' } } diff --git a/tests/pester/BuildLvlibp.Workflow.Tests.ps1 b/tests/pester/BuildLvlibp.Workflow.Tests.ps1 index bf7764ec..20081a02 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 @@ -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 4c28cca8..5d7aca8c 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)) { @@ -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' } } 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/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 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 a612c083..a380ee26 100644 --- a/tests/pester/RunUnitTests.Workflow.Tests.ps1 +++ b/tests/pester/RunUnitTests.Workflow.Tests.ps1 @@ -9,13 +9,14 @@ 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 $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 + $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') } @@ -31,6 +32,9 @@ 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' + + $publishStep | Should -Not -BeNullOrEmpty + $publishStep.with.files | Should -Be 'artifacts/unit-tests/UnitTestReport.xml' } } 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 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.