Skip to content

fix(scripts): apply CI output escaping to linting scripts#367

Merged
WilliamBerryiii merged 2 commits intomainfrom
fix/ci-escaping-linting-364
Jan 31, 2026
Merged

fix(scripts): apply CI output escaping to linting scripts#367
WilliamBerryiii merged 2 commits intomainfrom
fix/ci-escaping-linting-364

Conversation

@WilliamBerryiii
Copy link
Copy Markdown
Member

Description

Apply output escaping to all linting scripts to prevent GitHub Actions workflow command injection vulnerabilities. When exception messages or file paths contain special characters (%, \r, \n, ::), they could be interpreted as workflow commands. This change escapes these characters before emitting ::error:: or ::warning:: annotations.

Changes:

  • Add inline escaping pattern to six linting script error handlers: Invoke-LinkLanguageCheck.ps1, Invoke-PSScriptAnalyzer.ps1, Invoke-YamlLint.ps1, Link-Lang-Check.ps1, Markdown-Link-Check.ps1, Validate-MarkdownFrontmatter.ps1
  • Update Write-GitHubAnnotation in LintingHelpers.psm1 to escape both message content and file path properties
  • Property values receive additional :/, escaping per GitHub Actions annotation syntax requirements

Related Issue(s)

Closes #364

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)

Note for AI Artifact Contributors:

  • Agents: Research, indexing/referencing other project (using standard VS Code GitHub Copilot/MCP tools), planning, and general implementation agents likely already exist. Review .github/agents/ before creating new ones.
  • Model Versions: Only contributions targeting the latest Anthropic and OpenAI models will be accepted. Older model versions (e.g., GPT-3.5, Claude 3) will be rejected.
  • See Agents Not Accepted and Model Version Requirements.

Other:

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

Sample Prompts (for AI Artifact Contributions)

N/A - This is a script change, not an AI artifact contribution.

Testing

  • Verified escaping pattern matches GitHub's official @actions/core implementation
  • Pattern tested against edge cases: %, \r, \n, :: in exception messages

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

N/A

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

This is part of a series of PRs applying CI output escaping across the codebase. Related PRs address security scripts (#365) and infrastructure scripts (#366).

@WilliamBerryiii WilliamBerryiii requested a review from a team as a code owner January 30, 2026 21:36
Copilot AI review requested due to automatic review settings January 30, 2026 21:36
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Jan 30, 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 Jan 30, 2026

Codecov Report

❌ Patch coverage is 37.50000% with 15 lines in your changes missing coverage. Please review.
✅ Project coverage is 52.38%. Comparing base (b93d990) to head (49e398e).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
scripts/linting/Invoke-LinkLanguageCheck.ps1 0.00% 3 Missing ⚠️
scripts/linting/Link-Lang-Check.ps1 0.00% 3 Missing ⚠️
scripts/linting/Markdown-Link-Check.ps1 0.00% 3 Missing ⚠️
scripts/linting/Invoke-PSScriptAnalyzer.ps1 33.33% 2 Missing ⚠️
scripts/linting/Invoke-YamlLint.ps1 33.33% 2 Missing ⚠️
scripts/linting/Validate-MarkdownFrontmatter.ps1 33.33% 2 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #367      +/-   ##
==========================================
- Coverage   52.46%   52.38%   -0.08%     
==========================================
  Files          17       17              
  Lines        3084     3100      +16     
==========================================
+ Hits         1618     1624       +6     
- Misses       1466     1476      +10     
Flag Coverage Δ
pester 52.38% <37.50%> (-0.08%) ⬇️

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

Files with missing lines Coverage Δ
scripts/linting/Modules/LintingHelpers.psm1 100.00% <100.00%> (ø)
scripts/linting/Invoke-PSScriptAnalyzer.ps1 91.89% <33.33%> (-1.17%) ⬇️
scripts/linting/Invoke-YamlLint.ps1 93.15% <33.33%> (-1.22%) ⬇️
scripts/linting/Validate-MarkdownFrontmatter.ps1 64.70% <33.33%> (-0.14%) ⬇️
scripts/linting/Invoke-LinkLanguageCheck.ps1 0.00% <0.00%> (ø)
scripts/linting/Link-Lang-Check.ps1 0.00% <0.00%> (ø)
scripts/linting/Markdown-Link-Check.ps1 0.00% <0.00%> (ø)

... 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 applies output escaping to linting scripts to prevent GitHub Actions workflow command injection vulnerabilities. The changes add escaping for special characters (%, \r, \n, ::) in error messages and file paths before emitting ::error:: or ::warning:: annotations.

Changes:

  • Added inline escaping pattern to six linting scripts' catch blocks: Invoke-LinkLanguageCheck.ps1, Invoke-PSScriptAnalyzer.ps1, Invoke-YamlLint.ps1, Link-Lang-Check.ps1, Markdown-Link-Check.ps1, Validate-MarkdownFrontmatter.ps1
  • Enhanced Write-GitHubAnnotation function in LintingHelpers.psm1 with message and property escaping
  • Property values receive additional colon/comma escaping per GitHub Actions annotation syntax

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 17 comments.

Show a summary per file
File Description
scripts/linting/Validate-MarkdownFrontmatter.ps1 Added escaping to catch block error output
scripts/linting/Modules/LintingHelpers.psm1 Enhanced Write-GitHubAnnotation with message and file path escaping
scripts/linting/Markdown-Link-Check.ps1 Added escaping to catch block error output
scripts/linting/Link-Lang-Check.ps1 Added escaping to catch block error output
scripts/linting/Invoke-YamlLint.ps1 Added escaping to catch block error output
scripts/linting/Invoke-PSScriptAnalyzer.ps1 Added escaping to catch block error output
scripts/linting/Invoke-LinkLanguageCheck.ps1 Added escaping to catch block error output

Copy link
Copy Markdown

@auyidi1 auyidi1 left a comment

Choose a reason for hiding this comment

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

looks good. you might want to consider accepting some of the copilot comments/suggestions.

@WilliamBerryiii
Copy link
Copy Markdown
Member Author

looks good. you might want to consider accepting some of the copilot comments/suggestions.

yeah, making my way back to these after working on a bunch of the other PR's ... thanks for the review. This should help me refactor the build scripts to be safer and more testable/consistent.

Apply ConvertTo-GitHubActionsEscaped to prevent workflow command injection.

Closes #364

🔒 - Generated by Copilot
- add CIHelpers import to 6 linting scripts and LintingHelpers module
- replace inline -replace chains with ConvertTo-GitHubActionsEscaped
- use -ForProperty switch for file path escaping in annotations

🔧 - Generated by Copilot
@WilliamBerryiii WilliamBerryiii force-pushed the fix/ci-escaping-linting-364 branch from 9893139 to 49e398e Compare January 31, 2026 00:34
@WilliamBerryiii WilliamBerryiii merged commit fdd75ed into main Jan 31, 2026
16 checks passed
@WilliamBerryiii WilliamBerryiii deleted the fix/ci-escaping-linting-364 branch January 31, 2026 00:36
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.

[Issue]: Apply CI output escaping to linting scripts

4 participants