Pr Reference
MicrosoftOfficialPublished by Microsoft
- Skill
- Tool integration
- Software development
- MIT
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The pr-reference skill provides a set of scripts to extract git commit metadata and diffs into a structured XML format. It supports cross-platform execution via Bash and PowerShell, allowing developers to generate comprehensive branch comparisons. Beyond generation, the skill includes utility scripts to list changed files and inspect specific diff chunks, making it a versatile tool for automating pull request descriptions, conducting code reviews, and performing security analysis on code changes.
What it does
- Generates an XML document containing commit history and unified diffs between branches.
- Supports filtering diffs by file extensions and directory paths to reduce noise.
- Provides utility scripts to list changed files with type-based filtering.
- Enables inspection of large diffs through chunked reading capabilities.
- Offers flexible base branch selection, including automatic remote default detection.
- Supports three-way comparison using git merge-base.
When to use it
- When you need to generate detailed pull request descriptions based on commit history.
- When preparing for code reviews and requiring structured context of changes.
- When you need to analyze branch changes or discover work items from diffs.
- When you need to perform security audits on modified files.
- When you need to exclude specific file types or paths from your diff analysis.
Advantages
- Structured XML output facilitates programmatic processing and integration.
- Cross-platform support ensures consistency across different development environments.
- Granular filtering options help focus on relevant code changes.
- Utility scripts simplify the extraction of specific file lists or diff segments.
- Supports standard git workflows like three-way merges.
Usage examples
- “Generate a PR reference comparing my current branch to the main branch.”
- The skill executes the generation script, creating an XML file at .copilot-tracking/pr/pr-reference.xml containing the commit history and diffs.
- “List all added and modified files from the generated PR reference.”
- The skill runs the list-changed-files script, outputting a filtered list of files based on the specified change types.
- “Read the diff for src/main.ts from the generated reference.”
- The skill extracts and displays the specific unified diff content for the requested file.
- “Generate a PR reference excluding all JSON and YAML files.”
- The skill generates the XML report while applying the specified extension filters to the diff output.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/microsoft/pr-reference/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip pr-reference.zip -d .agents/skills
Documentation by Microsoft
PR Reference Generation Skill
Overview
Queries git for commit metadata and diff output, then produces a structured XML document. Both bash and PowerShell implementations are provided.
Use cases:
PR description generation from commit history
Code review preparation with structured diff context
Work item discovery by analyzing branch changes
Security analysis of modified files
After successful generation, include a file link to the absolute path of the XML output in the response.
Prerequisites
The repository must have at least one commit diverging from the base branch.
| Platform | Runtime |
|---|---|
| macOS / Linux | Bash (pre-installed) |
| Windows | PowerShell 7+ (pwsh) |
| Cross-platform | PowerShell 7+ (pwsh) |
Quick Start
Run the following command to generate a PR reference with default settings (compares against origin/main):
scripts/generate.sh
scripts/generate.sh --base-branch auto --merge-base --exclude-ext yml,jsonscripts/generate.ps1
scripts/generate.ps1 -BaseBranch auto -MergeBase -ExcludeExt yml,jsonOutput saves to .copilot-tracking/pr/pr-reference.xml by default.
Parameters Reference
| Parameter | Flag (bash) | Flag (PowerShell) | Default | Description |
|---|---|---|---|---|
| Base branch | --base-branch | -BaseBranch | origin/main (bash) / main (PowerShell) | Target branch for comparison. Use auto to detect remote default. |
| Merge base | --merge-base | -MergeBase | false | Use git merge-base for three-way comparison |
| Exclude markdown | --no-md-diff | -ExcludeMarkdownDiff | false | Exclude markdown files (*.md) from the diff |
| Exclude extensions | --exclude-ext | -ExcludeExt | (none) | Comma-separated extensions to exclude (e.g., yml,yaml,json,png) |
| Exclude paths | --exclude-path | -ExcludePath | (none) | Comma-separated path prefixes to exclude (for example, documentation and GitHub configuration directories) |
| Output path | --output | -OutputPath | .copilot-tracking/pr/pr-reference.xml | Custom output file path |
Both defaults resolve to the same remote comparison. The PowerShell script automatically resolves origin/<branch> when a bare branch name is provided.
Additional Scripts Reference
After generating the PR reference, use these utility scripts to query the XML.
List Changed Files
Run the list script to extract file paths from the diff:
scripts/list-changed-files.sh # all changed files
scripts/list-changed-files.sh --type added # filter by single type
scripts/list-changed-files.sh --type added,modified,renamed # filter by multiple types
scripts/list-changed-files.sh --exclude-type deleted # exclude specific types
scripts/list-changed-files.sh --format markdown # output as markdown tablescripts/list-changed-files.ps1 # all changed files
scripts/list-changed-files.ps1 -Type Added # filter by single type
scripts/list-changed-files.ps1 -Type Added,Modified,Renamed # filter by multiple types
scripts/list-changed-files.ps1 -ExcludeType Deleted # exclude specific types
scripts/list-changed-files.ps1 -Format Json # output as JSON| Parameter | Flag (bash) | Flag (PowerShell) | Default | Description |
|---|---|---|---|---|
| Input path | --input, -i | -InputPath | (auto) | Path to pr-reference.xml |
| Type filter | --type, -t | -Type | all | Change types to include (comma-separated: added, modified, etc.) |
| Exclude type | --exclude-type | -ExcludeType | (none) | Change types to exclude. Mutually exclusive with --type (non-all) |
| Format | --format, -f | -Format | plain | Output format: plain, json, or markdown |
Read Diff Content
Run the read script to inspect diff content with chunking for large diffs:
scripts/read-diff.sh --info # chunk info (count, line ranges)
scripts/read-diff.sh --chunk 1 # read a specific chunk
scripts/read-diff.sh --file src/main.ts # extract diff for one file
scripts/read-diff.sh --summary # file stats summaryscripts/read-diff.ps1 -Info # chunk info
scripts/read-diff.ps1 -Chunk 1 # read a specific chunk
scripts/read-diff.ps1 -File "src/main.ts" # extract diff for one fileOutput Format
The generated XML wraps commit metadata and unified diff output in a <commit_history> root element. See the reference guide for the complete XML schema, element reference, output path variations, and workflow integration patterns.
Troubleshooting
| Symptom | Cause | Resolution |
|---|---|---|
| "No commits found" or empty XML | No diverging commits from base branch | Verify the branch has commits ahead of the base with git log base..HEAD |
| "Branch not found" error | Base branch ref missing locally | Run git fetch origin to update remote tracking refs |
| "git: command not found" | git is not on PATH | Install git or verify PATH includes the git binary directory |
Files
- ATTRIBUTION.mdAdded by AutoGineer827 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md7.0 KiB
- references/REFERENCE.md8.8 KiB
- scripts/generate.ps1Script15.4 KiB
- scripts/generate.shScript5.8 KiB
- scripts/list-changed-files.ps1Script7.5 KiB
- scripts/list-changed-files.shScript5.7 KiB
- scripts/read-diff.ps1Script8.2 KiB
- scripts/read-diff.shScript5.7 KiB
- scripts/shared.psm1Script2.5 KiB
- tests/generate.Tests.ps1Script19.7 KiB
- tests/list-changed-files.Tests.ps1Script27.1 KiB
- tests/read-diff.Tests.ps1Script18.6 KiB
- tests/shared.Tests.ps1Script5.7 KiB
tests/read-diff.Tests.ps1
#Requires -Modules Pester
# Copyright (c) 2026 Microsoft Corporation. All rights reserved.
# SPDX-License-Identifier: MIT
# Discovery-time capability probe: the Bash parity tests execute the real read-diff.sh.
$script:BashAvailable = $false
if (Get-Command bash -CommandType Application -ErrorAction SilentlyContinue) {
& bash -c 'test -r "$1"' bash (Join-Path $PSScriptRoot '../scripts/read-diff.sh') 2>$null
$script:BashAvailable = $LASTEXITCODE -eq 0
}
BeforeAll {
. (Join-Path -Path $PSScriptRoot -ChildPath '../scripts/read-diff.ps1')
# Fixture XML with multiple file diffs for comprehensive testing
$script:FixtureXml = @'
<commit_history>
<current_branch>feature/test</current_branch>
<base_branch>origin/main</base_branch>
<commits>
<commit hash="abc1234" date="2026-01-15">
<message>
<subject><![CDATA[test commit]]></subject>
<body><![CDATA[]]></body>
</message>
</commit>
</commits>
<full_diff>
diff --git a/src/alpha.ts b/src/alpha.ts
new file mode 100644
index 0000000..a1b2c3d
--- /dev/null
+++ b/src/alpha.ts
@@ -0,0 +1,5 @@
+export function alpha() {
+ return 1;
+}
+
+export default alpha;
diff --git a/src/beta.ts b/src/beta.ts
index a1b2c3d..d4e5f6a 100644
--- a/src/beta.ts
+++ b/src/beta.ts
@@ -1,4 +1,6 @@
export function beta() {
- return false;
+ return true;
+ // added line one
+ // added line two
}
diff --git a/src/gamma.ts b/src/gamma.ts
deleted file mode 100644
index a1b2c3d..0000000
--- a/src/gamma.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export function gamma() {
- return null;
-}
</full_diff>
</commit_history>
'@
$script:TempDir = Join-Path ([System.IO.Path]::GetTempPath()) "rd-tests-$([System.Guid]::NewGuid())"
New-Item -ItemType Directory -Path $script:TempDir -Force | Out-Null
$script:FixturePath = Join-Path $script:TempDir 'pr-reference.xml'
Set-Content -Path $script:FixturePath -Value $script:FixtureXml -NoNewline
}
AfterAll {
Remove-Item -Path $script:TempDir -Recurse -Force -ErrorAction SilentlyContinue
}
Describe 'Get-ChunkInfo' {
It 'Calculates total chunks when lines divide evenly' {
$result = Get-ChunkInfo -TotalLines 1000 -ChunkSize 500
$result.TotalChunks | Should -Be 2
$result.TotalLines | Should -Be 1000
$result.ChunkSize | Should -Be 500
}
It 'Rounds up when lines do not divide evenly' {
$result = Get-ChunkInfo -TotalLines 1001 -ChunkSize 500
$result.TotalChunks | Should -Be 3
}
It 'Returns 1 chunk when total lines equal chunk size' {
$result = Get-ChunkInfo -TotalLines 500 -ChunkSize 500
$result.TotalChunks | Should -Be 1
}
It 'Returns 1 chunk when total lines are less than chunk size' {
$result = Get-ChunkInfo -TotalLines 100 -ChunkSize 500
$result.TotalChunks | Should -Be 1
}
It 'Returns 0 chunks when total lines is 0' {
$result = Get-ChunkInfo -TotalLines 0 -ChunkSize 500
$result.TotalChunks | Should -Be 0
}
}
Describe 'Get-ChunkRange' {
It 'Returns correct range for the first chunk' {
$result = Get-ChunkRange -ChunkNumber 1 -ChunkSize 10 -TotalLines 25
$result.Start | Should -Be 1
$result.End | Should -Be 10
}
It 'Returns correct range for a middle chunk' {
$result = Get-ChunkRange -ChunkNumber 2 -ChunkSize 10 -TotalLines 25
$result.Start | Should -Be 11
$result.End | Should -Be 20
}
It 'Caps end at TotalLines for the last partial chunk' {
$result = Get-ChunkRange -ChunkNumber 3 -ChunkSize 10 -TotalLines 25
$result.Start | Should -Be 21
$result.End | Should -Be 25
}
It 'Handles single-line file' {
$result = Get-ChunkRange -ChunkNumber 1 -ChunkSize 500 -TotalLines 1
$result.Start | Should -Be 1
$result.End | Should -Be 1
}
}
Describe 'Get-FileDiff' {
BeforeAll {
$script:fileDiffContent = @(Get-Content -LiteralPath $script:FixturePath)
}
It 'Extracts diff block for an existing file' {
$result = Get-FileDiff -Content $script:fileDiffContent -FilePath 'src/beta.ts'
$result | Should -Not -BeNullOrEmpty
$result | Should -Match 'diff --git a/src/beta.ts'
$result | Should -Match 'return true'
}
It 'Stops extraction at the next diff header' {
$result = Get-FileDiff -Content $script:fileDiffContent -FilePath 'src/alpha.ts'
$result | Should -Match 'diff --git a/src/alpha.ts'
$result | Should -Not -Match 'diff --git a/src/beta.ts'
}
It 'Returns empty string when file is not in the diff' {
$result = Get-FileDiff -Content $script:fileDiffContent -FilePath 'src/nonexistent.ts'
$result | Should -BeNullOrEmpty
}
It 'Extracts the last file in the diff without a trailing diff header' {
$result = Get-FileDiff -Content $script:fileDiffContent -FilePath 'src/gamma.ts'
$result | Should -Match 'diff --git a/src/gamma.ts'
$result | Should -Match 'deleted file mode'
}
It 'Handles file paths containing regex special characters' {
$specialContent = @(
'diff --git a/src/[utils].ts b/src/[utils].ts'
'index abc..def 100644'
'--- a/src/[utils].ts'
'+++ b/src/[utils].ts'
'@@ -1 +1 @@'
'-old'
'+new'
)
$result = Get-FileDiff -Content $specialContent -FilePath 'src/[utils].ts'
$result | Should -Match '\[utils\]'
}
}
Describe 'Get-DiffSummary' {
BeforeAll {
$script:summaryContent = @(Get-Content -LiteralPath $script:FixturePath)
}
It 'Counts additions and deletions per file' {
$result = Get-DiffSummary -Content $script:summaryContent
# src/alpha.ts: 4 additions (bare + line excluded by regex), 0 deletions
$result | Should -Match 'src/alpha.ts \(\+4/-0\)'
}
It 'Reports correct counts for modified files' {
$result = Get-DiffSummary -Content $script:summaryContent
# src/beta.ts: 3 additions (+return true, +added line one, +added line two), 1 deletion (-return false)
$result | Should -Match 'src/beta.ts \(\+3/-1\)'
}
It 'Reports correct counts for deleted files' {
$result = Get-DiffSummary -Content $script:summaryContent
# src/gamma.ts: 0 additions, 3 deletions
$result | Should -Match 'src/gamma.ts \(\+0/-3\)'
}
It 'Starts output with Changed files header' {
$result = Get-DiffSummary -Content $script:summaryContent
$result | Should -Match '^Changed files:'
}
It 'Sorts files alphabetically' {
$result = Get-DiffSummary -Content $script:summaryContent
$lines = ($result -split [Environment]::NewLine) | Where-Object { $_ -match '^\s+\S' }
$filePaths = $lines | ForEach-Object { ($_ -replace '^\s+(\S+)\s.*', '$1') }
$sorted = $filePaths | Sort-Object
@($filePaths) | Should -Be @($sorted)
}
It 'Returns only header when content has no diff blocks' {
$result = Get-DiffSummary -Content @('no diff content here')
$result | Should -Be 'Changed files:'
}
It 'Does not count lines starting with ++ or -- as changes' {
$content = @(
'diff --git a/file.ts b/file.ts'
'--- a/file.ts'
'+++ b/file.ts'
'@@ -1,2 +1,2 @@'
'-old line'
'+new line'
)
$result = Get-DiffSummary -Content $content
# Only 1 addition and 1 deletion; --- and +++ are excluded
$result | Should -Match 'file.ts \(\+1/-1\)'
}
}
Describe 'read-diff PowerShell and Bash summary parity' -Tag 'Unit' -Skip:(-not $script:BashAvailable) {
BeforeAll {
$script:BashScript = Join-Path $PSScriptRoot '../scripts/read-diff.sh'
}
It 'Prints one line per file with the same counts as Get-DiffSummary' {
$bashLines = @(& bash $script:BashScript --input $script:FixturePath --summary)
$LASTEXITCODE | Should -Be 0
$bashLines | Should -Be @(
'Changed files:'
' src/alpha.ts (+4/-0)'
' src/beta.ts (+3/-1)'
' src/gamma.ts (+0/-3)'
)
$powerShellLines = (Get-DiffSummary -Content @(Get-Content -LiteralPath $script:FixturePath)) -split "`r?`n"
@($bashLines | Sort-Object) | Should -Be @($powerShellLines | Sort-Object)
}
It 'Matches Get-DiffSummary counts for mixed-case and underscore paths with CRLF input' {
$crlfPath = Join-Path $TestDrive 'pr-reference-crlf.xml'
$crlfContent = @(
'diff --git a/src/zeta.ts b/src/zeta.ts'
'@@ -1 +1,2 @@'
'-old'
'+new'
'+'
'diff --git a/src/__init__.py b/src/__init__.py'
'@@ -1,2 +1 @@'
'-old'
'-old'
'+new'
'diff --git a/README.md b/README.md'
'@@ -1 +1 @@'
'-old'
'+new'
'diff --git a/docs/guide.md b/docs/guide.md'
'@@ -0,0 +1 @@'
'+line'
) -join "`r`n"
Set-Content -Path $crlfPath -Value $crlfContent -NoNewline
$bashLines = @(& bash $script:BashScript --input $crlfPath --summary)
$LASTEXITCODE | Should -Be 0
# LC_ALL=C sort -f puts _ after letters, which culture-aware Sort-Object may not
# match, and the bare + line is excluded even with a trailing CR
$bashLines | Should -Be @(
'Changed files:'
' docs/guide.md (+1/-0)'
' README.md (+1/-1)'
' src/zeta.ts (+1/-1)'
' src/__init__.py (+1/-2)'
)
$powerShellLines = (Get-DiffSummary -Content @(Get-Content -LiteralPath $crlfPath)) -split "`r?`n"
@($bashLines | Sort-Object) | Should -Be @($powerShellLines | Sort-Object)
}
It 'Summarizes a relative --input path that contains an equals sign' {
Copy-Item -LiteralPath $script:FixturePath -Destination (Join-Path $TestDrive 'pr=ref.xml')
Push-Location $TestDrive
try {
$bashLines = @(& bash $script:BashScript --input 'pr=ref.xml' --summary)
}
finally {
Pop-Location
}
$LASTEXITCODE | Should -Be 0
$bashLines | Should -Be @(
'Changed files:'
' src/alpha.ts (+4/-0)'
' src/beta.ts (+3/-1)'
' src/gamma.ts (+0/-3)'
)
}
}
Describe 'Invoke-ReadDiff' {
Context 'Info mode' {
It 'Outputs file path and chunk breakdown' {
$result = Invoke-ReadDiff -InputPath $script:FixturePath -Info
$joined = $result -join "`n"
$joined | Should -Match 'Total lines:'
$joined | Should -Match 'Total chunks:'
$joined | Should -Match 'Chunk breakdown:'
}
It 'Respects custom ChunkSize' {
$result = Invoke-ReadDiff -InputPath $script:FixturePath -Info -ChunkSize 10
$joined = $result -join "`n"
$joined | Should -Match 'Chunk size: 10'
}
}
Context 'Summary mode' {
It 'Outputs changed files with counts' {
$result = Invoke-ReadDiff -InputPath $script:FixturePath -Summary
$joined = $result -join "`n"
$joined | Should -Match 'Changed files:'
$joined | Should -Match 'src/alpha.ts'
}
}
Context 'File extraction mode' {
It 'Extracts diff for a specific file' {
$result = Invoke-ReadDiff -InputPath $script:FixturePath -File 'src/beta.ts'
$joined = $result -join "`n"
$joined | Should -Match 'diff --git a/src/beta.ts'
}
It 'Warns when file is not in the diff' {
$result = Invoke-ReadDiff -InputPath $script:FixturePath -File 'src/missing.ts' 3>&1
$result | Should -Match 'No diff found'
}
}
Context 'Chunk mode' {
It 'Reads chunk with header comment' {
$result = Invoke-ReadDiff -InputPath $script:FixturePath -Chunk 1 -ChunkSize 10
$joined = $result -join "`n"
$joined | Should -Match '# Chunk 1/'
}
It 'Throws when chunk number exceeds total' {
{ Invoke-ReadDiff -InputPath $script:FixturePath -Chunk 9999 -ChunkSize 10 } | Should -Throw '*exceeds file*'
}
}
Context 'Lines mode' {
It 'Reads a line range with header' {
$result = Invoke-ReadDiff -InputPath $script:FixturePath -Lines '1,5'
$joined = $result -join "`n"
$joined | Should -Match '# Lines 1-5'
}
It 'Throws on invalid line range format' {
{ Invoke-ReadDiff -InputPath $script:FixturePath -Lines 'invalid' } | Should -Throw '*Invalid line range*'
}
It 'Throws when start line exceeds file length' {
{ Invoke-ReadDiff -InputPath $script:FixturePath -Lines '99999,100000' } | Should -Throw '*exceeds file length*'
}
It 'Caps end line at file length' {
$result = Invoke-ReadDiff -InputPath $script:FixturePath -Lines '1,999999'
$joined = $result -join "`n"
$joined | Should -Match '# Lines 1-'
}
}
Context 'Default mode' {
It 'Displays usage guidance when no mode requested' {
$result = Invoke-ReadDiff -InputPath $script:FixturePath
$joined = $result -join "`n"
$joined | Should -Match 'Total lines:'
$joined | Should -Match 'Use -Chunk N'
}
}
Context 'Error handling' {
It 'Throws when file does not exist' {
{ Invoke-ReadDiff -InputPath '/nonexistent/file.xml' } | Should -Throw '*PR reference file not found*'
}
It 'Uses default path when InputPath is empty' {
Mock Get-RepositoryRoot { return $script:TempDir }
{ Invoke-ReadDiff } | Should -Throw '*PR reference file not found*'
}
}
}
Describe 'Entry-point: file not found' -Tag 'Integration' {
BeforeAll {
$script:ScriptPath = Join-Path $PSScriptRoot '../scripts/read-diff.ps1'
}
It 'Exits 1 when PR reference file does not exist' {
$null = & pwsh -File $script:ScriptPath -InputPath '/nonexistent/file.xml' 2>&1
$LASTEXITCODE | Should -Be 1
}
}
Describe 'Entry-point: Info mode' -Tag 'Integration' {
BeforeAll {
$script:ScriptPath = Join-Path $PSScriptRoot '../scripts/read-diff.ps1'
}
It 'Displays file path and chunk breakdown' {
$output = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -Info 2>&1
$LASTEXITCODE | Should -Be 0
$joined = $output -join "`n"
$joined | Should -Match 'Total lines:'
$joined | Should -Match 'Total chunks:'
$joined | Should -Match 'Chunk breakdown:'
}
It 'Respects custom ChunkSize in info output' {
$output = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -Info -ChunkSize 10 2>&1
$LASTEXITCODE | Should -Be 0
$joined = $output -join "`n"
$joined | Should -Match 'Chunk size: 10'
}
}
Describe 'Entry-point: Summary mode' -Tag 'Integration' {
BeforeAll {
$script:ScriptPath = Join-Path $PSScriptRoot '../scripts/read-diff.ps1'
}
It 'Outputs changed files with add/remove counts' {
$output = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -Summary 2>&1
$LASTEXITCODE | Should -Be 0
$joined = $output -join "`n"
$joined | Should -Match 'Changed files:'
$joined | Should -Match 'src/alpha.ts'
}
}
Describe 'Entry-point: File mode' -Tag 'Integration' {
BeforeAll {
$script:ScriptPath = Join-Path $PSScriptRoot '../scripts/read-diff.ps1'
}
It 'Extracts diff for a specific file' {
$output = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -File 'src/beta.ts' 2>&1
$LASTEXITCODE | Should -Be 0
$joined = $output -join "`n"
$joined | Should -Match 'diff --git a/src/beta.ts'
}
It 'Warns when file is not found in the diff' {
$output = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -File 'src/missing.ts' 2>&1
$LASTEXITCODE | Should -Be 0
$joined = $output -join "`n"
$joined | Should -Match 'No diff found for file'
}
}
Describe 'Entry-point: Chunk mode' -Tag 'Integration' {
BeforeAll {
$script:ScriptPath = Join-Path $PSScriptRoot '../scripts/read-diff.ps1'
}
It 'Reads the first chunk with header comment' {
$output = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -Chunk 1 -ChunkSize 10 2>&1
$LASTEXITCODE | Should -Be 0
$joined = $output -join "`n"
$joined | Should -Match '# Chunk 1/'
}
It 'Exits 1 when chunk number exceeds total chunks' {
$null = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -Chunk 9999 -ChunkSize 10 2>&1
$LASTEXITCODE | Should -Be 1
}
}
Describe 'Entry-point: Lines mode' -Tag 'Integration' {
BeforeAll {
$script:ScriptPath = Join-Path $PSScriptRoot '../scripts/read-diff.ps1'
}
It 'Reads a line range using comma separator' {
$output = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -Lines '1,5' 2>&1
$LASTEXITCODE | Should -Be 0
$joined = $output -join "`n"
$joined | Should -Match '# Lines 1-5'
}
It 'Reads a line range using dash separator' {
$output = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -Lines '2-4' 2>&1
$LASTEXITCODE | Should -Be 0
$joined = $output -join "`n"
$joined | Should -Match '# Lines 2-4'
}
It 'Exits 1 when start line exceeds file length' {
$null = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -Lines '99999,100000' 2>&1
$LASTEXITCODE | Should -Be 1
}
It 'Exits 1 with invalid line range format' {
$null = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -Lines 'invalid' 2>&1
$LASTEXITCODE | Should -Be 1
}
It 'Caps end line at file length when range exceeds total' {
$output = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath -Lines '1,999999' 2>&1
$LASTEXITCODE | Should -Be 0
$joined = $output -join "`n"
$joined | Should -Match '# Lines 1-'
}
}
Describe 'Entry-point: Default mode' -Tag 'Integration' {
BeforeAll {
$script:ScriptPath = Join-Path $PSScriptRoot '../scripts/read-diff.ps1'
}
It 'Displays usage guidance when no mode arguments are supplied' {
$output = & pwsh -File $script:ScriptPath -InputPath $script:FixturePath 2>&1
$LASTEXITCODE | Should -Be 0
$joined = $output -join "`n"
$joined | Should -Match 'Total lines:'
$joined | Should -Match 'Use -Chunk N'
}
}
Requirements and compatibility
Written for: GitHub Copilot, Claude Code
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Claude Code frontmatter
The author says: Requires git available on PATH
Security
What our scanner noticed· Low risk
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/hve-core · .github/skills/shared/pr-reference · commit f425e94
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download pr-reference.zip