Skip to content

fix(scripts): ensure reliable array count operations in linting and security scripts#395

Merged
WilliamBerryiii merged 4 commits intomainfrom
fix/ps-safe-count-checks
Feb 3, 2026
Merged

fix(scripts): ensure reliable array count operations in linting and security scripts#395
WilliamBerryiii merged 4 commits intomainfrom
fix/ps-safe-count-checks

Conversation

@katriendg
Copy link
Copy Markdown
Contributor

Description

This PR fixes PowerShell array handling issues in linting and security validation scripts by ensuring array assignments and count operations use proper array coercion with @(). These changes prevent potential errors when pipeline operations return null or single items instead of arrays.

  • fix(linting): wrapped array assignments in Invoke-PSScriptAnalyzer, Invoke-YamlLint, and Markdown-Link-Check with @() to ensure consistent array behavior

    • Applied to file collection calls from Get-ChangedFilesFromGit and Get-FilesRecursive
    • Added array coercion to all .Count property accesses for reliable zero-count checks
  • fix(linting): added array coercion to count checks in Validate-MarkdownFrontmatter

    • Wrapped Get-ChangedMarkdownFileGroup result with @() for consistent array handling
    • Applied to count checks to prevent null reference errors
  • fix(security): improved array handling in Test-DependencyPinning script

    • Added @() wrapping to violation collection and grouping operations
    • Applied to measure-object count operations and group-by filtering
  • fix(security): enhanced array coercion in Test-SHAStaleness script

    • Wrapped all count checks and array operations with @() for reliable behavior
    • Added initialization of $script:StaleDependencies as empty array
    • Applied to tool staleness detection and error collection

Related Issue(s)

Fixes #394

Type of Change

Select all that apply:

Code & Documentation:

  • Bug fix (non-breaking change fixing an issue)
  • New feature (non-breaking change adding functionality)
  • Breaking change (fix or feature causing existing functionality to change)
  • Documentation update

Infrastructure & Configuration:

  • GitHub Actions workflow
  • Linting configuration (markdown, PowerShell, etc.)
  • Security configuration
  • DevContainer configuration
  • Dependency update

AI Artifacts:

  • Reviewed contribution with prompt-builder agent and addressed all feedback
  • Copilot instructions (.github/instructions/*.instructions.md)
  • Copilot prompt (.github/prompts/*.prompt.md)
  • Copilot agent (.github/agents/*.agent.md)

Other:

  • Script/automation (.ps1, .sh, .py)
  • Other (please describe):

Testing

Tested by running the affected scripts with various file count scenarios:

  • Zero files found (empty array handling)
  • Single file (automatic array coercion)
  • Multiple files (existing array behavior)

All scripts now handle edge cases consistently without null reference errors.

Checklist

Required Checks

  • Documentation is updated (if applicable)
  • Files follow existing naming conventions
  • Changes are backwards compatible (if applicable)
  • Tests added for new functionality (if applicable)

AI Artifact Contributions

  • Used /prompt-analyze to review contribution
  • Addressed all feedback from prompt-builder review
  • Verified contribution follows common standards and type-specific requirements

Required Automated Checks

The following validation commands must pass before merging:

  • Markdown linting: npm run lint:md
  • Spell checking: npm run spell-check
  • Frontmatter validation: npm run lint:frontmatter
  • Link validation: npm run lint:md-links
  • PowerShell analysis: npm run lint:ps

Security Considerations

  • This PR does not contain any sensitive or NDA information
  • Any new dependencies have been reviewed for security issues
  • Security-related scripts follow the principle of least privilege

Additional Notes

These changes follow PowerShell best practices for defensive array handling. The @() operator ensures that pipeline results are always treated as arrays, even when they return null or single items, preventing runtime errors in count operations and foreach loops.

🔧 - Generated by Copilot

…ecurity scripts

- wrap array assignments with @() in PSScriptAnalyzer, YamlLint, and Markdown-Link-Check
- add array coercion to count checks in Validate-MarkdownFrontmatter
- fix array handling in Test-DependencyPinning and Test-SHAStaleness scripts

🔧 - Generated by Copilot
@katriendg katriendg requested a review from a team as a code owner February 3, 2026 07:46
Copilot AI review requested due to automatic review settings February 3, 2026 07:46
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Feb 3, 2026

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@codecov-commenter
Copy link
Copy Markdown

codecov-commenter commented Feb 3, 2026

Codecov Report

❌ Patch coverage is 77.77778% with 12 lines in your changes missing coverage. Please review.
✅ Project coverage is 61.45%. Comparing base (d92c4e1) to head (b40e0f9).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
scripts/security/Test-SHAStaleness.ps1 73.91% 6 Missing ⚠️
scripts/linting/Validate-MarkdownFrontmatter.ps1 0.00% 3 Missing ⚠️
scripts/linting/Markdown-Link-Check.ps1 0.00% 2 Missing ⚠️
scripts/security/Test-DependencyPinning.ps1 90.00% 1 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #395      +/-   ##
==========================================
+ Coverage   52.44%   61.45%   +9.01%     
==========================================
  Files          17       17              
  Lines        3110     3111       +1     
==========================================
+ Hits         1631     1912     +281     
+ Misses       1479     1199     -280     
Flag Coverage Δ
pester 61.45% <77.77%> (+9.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
scripts/linting/Invoke-PSScriptAnalyzer.ps1 91.89% <100.00%> (ø)
scripts/linting/Invoke-YamlLint.ps1 93.15% <100.00%> (ø)
scripts/security/Test-DependencyPinning.ps1 80.05% <90.00%> (+24.27%) ⬆️
scripts/linting/Markdown-Link-Check.ps1 0.00% <0.00%> (ø)
scripts/linting/Validate-MarkdownFrontmatter.ps1 64.70% <0.00%> (ø)
scripts/security/Test-SHAStaleness.ps1 48.52% <73.91%> (+48.52%) ⬆️

... and 1 file with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes PowerShell array handling issues across linting and security validation scripts by applying defensive array coercion with @(). The changes prevent "property 'Count' cannot be found" errors that occur when pipeline operations return null or single items instead of arrays, particularly affecting functions like Get-ChangedFilesFromGit and Get-FilesRecursive.

Changes:

  • Added @() array coercion to function return values and count operations across all linting scripts (PSScriptAnalyzer, YamlLint, Markdown-Link-Check, Validate-MarkdownFrontmatter)
  • Enhanced array handling in security validation scripts (Test-DependencyPinning, Test-SHAStaleness) for violation collections, grouping operations, and measure-object counts
  • Initialized $script:StaleDependencies as an empty array in Test-SHAStaleness.ps1

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated no comments.

Show a summary per file
File Description
scripts/security/Test-SHAStaleness.ps1 Added array coercion to 11 count operations, tool staleness detection, and initialized StaleDependencies array
scripts/security/Test-DependencyPinning.ps1 Added array coercion to 5 violation collection and measure-object operations
scripts/linting/Validate-MarkdownFrontmatter.ps1 Wrapped Get-ChangedMarkdownFileGroup results and count checks with @()
scripts/linting/Markdown-Link-Check.ps1 Added array coercion to Get-MarkdownTarget return value and count check
scripts/linting/Invoke-YamlLint.ps1 Wrapped Get-ChangedFilesFromGit, Get-ChildItem results, and count operations with @()
scripts/linting/Invoke-PSScriptAnalyzer.ps1 Added array coercion to Get-ChangedFilesFromGit, Get-FilesRecursive results, and all count operations in summary

… environments

- implement tests for fixture exclusion filtering in Markdown-Link-Check
- validate error handling and output formatting for GitHub Actions
- ensure array coercion works correctly in main execution block

🔒 - Generated by Copilot
Copilot AI review requested due to automatic review settings February 3, 2026 09:29
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated no new comments.

@WilliamBerryiii WilliamBerryiii merged commit de43e73 into main Feb 3, 2026
16 checks passed
@WilliamBerryiii WilliamBerryiii deleted the fix/ps-safe-count-checks branch February 3, 2026 18:45
WilliamBerryiii added a commit that referenced this pull request Feb 4, 2026
🤖 I have created a release *beep* *boop*
---


##
[2.1.0](hve-core-v2.0.1...hve-core-v2.1.0)
(2026-02-04)


### ✨ Features

* add PowerShell script to validate copyright headers
([#370](#370))
([92fce72](92fce72))
* **docs:** Replace deprecated chat.modeFilesLocations with
chat.agentFilesLocations
([#413](#413))
([67fb2ab](67fb2ab))
* **scripts:** add CIHelpers module for CI platform abstraction
([#348](#348))
([23e7a7e](23e7a7e))
* **scripts:** add SecurityHelpers and CIHelpers modules
([#354](#354))
([b93d990](b93d990))
* **workflow:** add copilot-setup-steps.yml for Coding Agent environment
([#398](#398))
([085a38b](085a38b))


### 🐛 Bug Fixes

* **build:** increase release-please search depths to prevent 250-commit
window issue ([#342](#342))
([4bb857d](4bb857d))
* **build:** patch @isaacs/brace-expansion critical vulnerability
([#404](#404))
([292ef51](292ef51))
* **ci:** disable errexit during spell check exit code capture
([#356](#356))
([ed6ed46](ed6ed46))
* **ci:** exclude extension/README.md from frontmatter validation
([#362](#362))
([e0d7378](e0d7378))
* exclude test fixtures from markdown link checker
([#345](#345))
([58147f9](58147f9))
* **extension:** resolve path resolution issues in Windows/WSL
environments ([#407](#407))
([8529725](8529725))
* **linting:** use Write-Error instead of Write-Host for error output
([#377](#377))
([2ca766b](2ca766b))
* **scripts:** apply CI output escaping to infrastructure scripts
([#369](#369))
([251021e](251021e))
* **scripts:** apply CI output escaping to linting scripts
([#367](#367))
([fdd75ed](fdd75ed))
* **scripts:** apply CI output escaping to security scripts
([#368](#368))
([1237c9a](1237c9a))
* **scripts:** ensure reliable array count operations in linting and
security scripts
([#395](#395))
([de43e73](de43e73))
* **scripts:** standardize PowerShell requirements header block
([#385](#385))
([6e26282](6e26282))


### 📚 Documentation

* add doc-ops agent to CUSTOM-AGENTS reference
([#358](#358))
([15f7185](15f7185))
* add memory agent to CUSTOM-AGENTS.md
([#359](#359))
([d92c4e1](d92c4e1))
* add missing agents to extension README
([#357](#357))
([d58541c](d58541c))
* add task-reviewer agent to CUSTOM-AGENTS.md
([#363](#363))
([0efb722](0efb722))
* **contributing:** add copyright header guidelines
([#382](#382))
([881a567](881a567))
* **scripts:** update README.md with missing directory sections
([#355](#355))
([ac2966f](ac2966f))


### ♻️ Refactoring

* **scripts:** align linting and tests with CIHelpers
([#401](#401))
([3587e6a](3587e6a))
* **scripts:** extract Invoke-PackageExtension for testability
([#343](#343))
([858a1be](858a1be))
* **scripts:** extract orchestration function for Prepare-Extension
testability ([#344](#344))
([9fd4bd1](9fd4bd1))
* **scripts:** replace raw GITHUB_OUTPUT with Set-CIOutput in
Package-Extension
([#391](#391))
([74a30bb](74a30bb))
* **security:** move DependencyViolation and ComplianceReport to shared
module ([#378](#378))
([1dd31ad](1dd31ad))


### 🔧 Maintenance

* add copyright headers to PowerShell scripts
([#381](#381))
([d19c9b3](d19c9b3))
* add copyright headers to shell scripts
([#380](#380))
([284b456](284b456))
* **deps-dev:** bump cspell from 9.6.1 to 9.6.2 in the npm-dependencies
group ([#387](#387))
([23c2b9f](23c2b9f))
* **workflows:** simplify Copilot setup steps workflow triggers
([#414](#414))
([492a7b1](492a7b1))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: hve-core-release-please[bot] <254602402+hve-core-release-please[bot]@users.noreply.github.com>
Co-authored-by: Bill Berry <wberry@microsoft.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: PowerShell scripts fail with 'Count' property not found error when run in workflows

5 participants