refactor(scripts): extract pure functions for Pester testability#221
Merged
WilliamBerryiii merged 9 commits intomainfrom Jan 21, 2026
Merged
refactor(scripts): extract pure functions for Pester testability#221WilliamBerryiii merged 9 commits intomainfrom
WilliamBerryiii merged 9 commits intomainfrom
Conversation
- refactor Get-VerifiedDownload.ps1 with hash verification and path resolution functions - refactor Generate-PrReference.ps1 with git output parsing and XML generation functions - refactor Package-Extension.ps1 with manifest validation and version resolution functions - refactor Prepare-Extension.ps1 with JSON manipulation and contributor discovery functions - add 4 comprehensive Pester test files covering all extracted pure functions - fix bug in Update-PackageJsonContributes using Add-Member for dynamic properties 🧪 - Generated by Copilot
Contributor
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
- Replace Windows-specific paths (C:\temp, C:\ext, C:\nonexistent) with platform-agnostic path construction - Use [System.IO.Path]::Combine() and [System.IO.Path]::GetTempPath() for test directories - Fixes CI failures on Linux runners 🔧 - Generated by Copilot
- Add entry point guard to Generate-PrReference.ps1 to prevent execution when dot-sourced - Replace #Requires -Modules with runtime check in Prepare-Extension.ps1 entry point - Both changes allow test files to dot-source scripts without triggering execution or module errors 🔧 - Generated by Copilot
…ility-refactoring
- change Get-CommitCount assertion to BeGreaterOrEqual 1 (merge commits inflate count) - add dynamic branch detection fallback for shallow CI checkouts - add skip conditions for YAML-dependent tests when PowerShell-Yaml unavailable 🔧 - Generated by Copilot
- Get-FrontmatterData performs I/O via Get-Content and ConvertFrom-Yaml - Test-PathsExist performs I/O via Test-Path - Get-DiscoveredAgents performs I/O via Get-ChildItem and Test-Path - Get-DiscoveredPrompts performs I/O via Get-ChildItem and Test-Path - Get-DiscoveredInstructions performs I/O via Get-ChildItem and Test-Path 📝 - Generated by Copilot
- Invoke-PrReferenceGeneration Describe block was truncated - File ended without closing It block and Describe block braces 🔧 - Generated by Copilot
- add Get-CurrentBranchOrRef helper function - fall back to detached@<sha> when git branch --show-current returns empty - add unit tests for new function 🔧 - Generated by Copilot
Contributor
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 8 out of 8 changed files in this pull request and generated 3 comments.
Comments suppressed due to low confidence (1)
scripts/dev-tools/Generate-PrReference.ps1:457
- These lines have inconsistent indentation compared to surrounding code. They should be indented to align with other statements in the try block (lines 449-455).
$commitEntries = Get-CommitEntry -ComparisonRef $comparisonInfo.Ref
$commitCount = Get-CommitCount -ComparisonRef $comparisonInfo.Ref
$diffOutput = Get-DiffOutput -ComparisonRef $comparisonInfo.Ref -ExcludeMarkdownDiff:$ExcludeMarkdownDiff
$diffSummary = Get-DiffSummary -ComparisonRef $comparisonInfo.Ref -ExcludeMarkdownDiff:$ExcludeMarkdownDiff
$xmlContent = Get-PrXmlContent -CurrentBranch $currentBranch -BaseBranch $BaseBranch -CommitEntries $commitEntries -DiffOutput $diffOutput
….ps1 🧹 - Generated by Copilot
5 tasks
WilliamBerryiii
pushed a commit
that referenced
this pull request
Jan 28, 2026
🤖 I have created a release *beep* *boop* --- ## [2.0.0](hve-core-v1.1.0...hve-core-v2.0.0) (2026-01-28) ### ⚠ BREAKING CHANGES * **agents:** add Task Reviewer and expand RPI to 4-phase workflow ([#277](#277)) ### ✨ Features * **agents:** add hve-core-installer agent to extension package ([#297](#297)) ([c0e48c6](c0e48c6)) * **agents:** add Task Reviewer and expand RPI to 4-phase workflow ([#277](#277)) ([ae76cab](ae76cab)) * **build:** add code coverage reporting to Pester workflow ([#230](#230)) ([a34822a](a34822a)) * **docs:** add GOVERNANCE.md for OSSF Silver Badge compliance ([#235](#235)) ([b0e752c](b0e752c)) * **docs:** add ROADMAP.md for OSSF Silver badge compliance ([#238](#238)) ([4a41c16](4a41c16)) * **mcp:** add MCP server configuration guidance and installer enhancements ([#225](#225)) ([0bce418](0bce418)) * **scripts:** add YAML linting with actionlint ([#234](#234)) ([d9301f9](d9301f9)) * **security:** add OpenSSF Scorecard workflow and badge ([#271](#271)) ([7c6d788](7c6d788)) * **skills:** add video-to-gif conversion skill with FFmpeg two-pass optimization ([#247](#247)) ([8d65c42](8d65c42)) * **tests:** add Pester tests for LintingHelpers and Validate-MarkdownFrontmatter ([#197](#197), [#198](#198)) ([#205](#205)) ([51ae563](51ae563)) ### 🐛 Bug Fixes * **build:** detect table formatting changes via git diff ([#261](#261)) ([985eee0](985eee0)) * **build:** disable MD024 lint rule in CHANGELOG for release-please ([#220](#220)) ([971df94](971df94)) * **build:** quote shell variables and group redirects in workflow files ([#299](#299)) ([3372509](3372509)) * **build:** resolve scorecard badge and workflow security issues ([#301](#301)) ([aeaed13](aeaed13)) * **extension:** remove frontmatter from README and exclude from markdown linting ([#223](#223)) ([4272529](4272529)) * **instructions:** quote applyTo glob pattern for YAML compatibility ([#216](#216)) ([085199c](085199c)) * **scripts:** add FooterExcludePaths parameter to frontmatter validation ([#334](#334)) ([64db98d](64db98d)) * **scripts:** add GHSA word and logs/ exclusion to cspell config ([#214](#214)) ([5c99b3f](5c99b3f)) * **scripts:** correct type assertions in Invoke-YamlLint.Tests.ps1 ([#332](#332)) ([af7050d](af7050d)) * **scripts:** eliminate false positives in dependency pinning npm pattern ([#273](#273)) ([ccbdfa3](ccbdfa3)) * **security:** add artifact attestation for signed releases ([#257](#257)) ([c52d6e2](c52d6e2)) * standardize markdown footers and complete frontmatter ([#217](#217)) ([b4e7556](b4e7556)) ### 📚 Documentation * add OpenSSF Best Practices Passing badge to README ([#239](#239)) ([91bc529](91bc529)) * **architecture:** add architecture documentation and value proposition ([#252](#252)) ([0e4b02f](0e4b02f)) * **contributing:** add testing requirements for OSSF compliance ([#254](#254)) ([4db1a18](4db1a18)) * **docs:** add enterprise status badges to README header ([#270](#270)) ([ccb68a4](ccb68a4)) * **security:** add security assurance case and threat model for OSSF Silver ([#259](#259)) ([a390e26](a390e26)) ### ♻️ Refactoring * **application:** wrap execution with try blocks, ensure proper … ([#296](#296)) ([35c4417](35c4417)) * **scripts:** extract frontmatter validation to testable module ([#293](#293)) ([4e8707e](4e8707e)) * **scripts:** extract pure functions for Pester testability ([#221](#221)) ([d40e742](d40e742)) ### 🔧 Maintenance * **deps-dev:** bump cspell from 9.4.0 to 9.6.0 in the npm-dependencies group ([#208](#208)) ([855914b](855914b)) * **deps-dev:** bump cspell from 9.6.0 to 9.6.1 in the npm-dependencies group ([#294](#294)) ([1e45ad6](1e45ad6)) * **deps:** bump actions/setup-node from 6.1.0 to 6.2.0 in the github-actions group ([#209](#209)) ([c4c69e2](c4c69e2)) * **deps:** bump the github-actions group with 4 updates ([#295](#295)) ([d8337b8](d8337b8)) * remove step-security/harden-runner from workflows ([#246](#246)) ([c5708d8](c5708d8)) --- 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>
This was referenced Jan 28, 2026
This was referenced Feb 6, 2026
This was referenced Feb 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Refactors four PowerShell scripts to extract pure functions for improved Pester unit testability. This architectural change separates business logic from I/O operations, enabling comprehensive testing without mocking external dependencies.
Changes by Script
Get-VerifiedDownload.ps1
Get-FileHashValue,Test-HashMatchGet-DownloadTargetPath,Test-ExistingFileValidNew-DownloadResult,Get-ArchiveType,Test-TarAvailableInvoke-VerifiedDownloadPackage-Extension.ps1
Test-VsceAvailable,Test-ExtensionManifestValidGet-ExtensionOutputPath,Get-VscePackageCommandGet-ResolvedPackageVersionNew-PackagingResultPrepare-Extension.ps1
Get-AllowedMaturitiesTest-PathsExistGet-DiscoveredAgents,Get-DiscoveredPrompts,Get-DiscoveredInstructionsUpdate-PackageJsonContributesUpdate-PackageJsonContributesusingAdd-Memberfor dynamic propertiesGenerate-PrReference.ps1
[OutputType()]attributes to existing functionsparam()blocks where missingTest Coverage
Added four comprehensive Pester test files covering all extracted pure functions with 191 total tests passing.
Related Issue(s)
Closes #200
Type of Change
Testing
All validation passes:
Validation commands run:
npm run lint:md- Markdown linting passednpm run lint:frontmatter- Frontmatter validation passednpm run lint:ps- PSScriptAnalyzer passedChecklist
Required for all contributions
AI Artifact contributions
Required automated checks
npm run lint:mdpassesnpm run spell-checkpasses (or words added to custom dictionary)npm run lint:frontmatterpassesnpm run lint:md-linkspassesnpm run lint:pspassesSecurity Considerations
No security implications: