diff --git a/Directory.Packages.props b/Directory.Packages.props
index ed117f4..80cc2a1 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -12,7 +12,7 @@
-
+
diff --git a/README.md b/README.md
index 4179c64..c6e7a04 100644
--- a/README.md
+++ b/README.md
@@ -366,7 +366,7 @@ run once from its Git root:
```powershell
dotnet new tool-manifest --output .config
-dotnet tool install Trellis.AgentDocs --version 0.1.0-preview.19 --tool-manifest .config/dotnet-tools.json
+dotnet tool install Trellis.AgentDocs --version 0.1.0-preview.20 --tool-manifest .config/dotnet-tools.json
dotnet tool run agentdocs init
```
diff --git a/Trellis.ServiceLevelIndicators.Asp.ApiVersioning/src/README.md b/Trellis.ServiceLevelIndicators.Asp.ApiVersioning/src/README.md
index a265a77..411cdcb 100644
--- a/Trellis.ServiceLevelIndicators.Asp.ApiVersioning/src/README.md
+++ b/Trellis.ServiceLevelIndicators.Asp.ApiVersioning/src/README.md
@@ -1,4 +1,4 @@
-# Trellis.ServiceLevelIndicators.Asp.ApiVersioning
+# Trellis.ServiceLevelIndicators.Asp.ApiVersioning
[](https://www.nuget.org/packages/Trellis.ServiceLevelIndicators.Asp.ApiVersioning)
@@ -55,7 +55,7 @@ run from its Git root:
```powershell
dotnet new tool-manifest --output .config
-dotnet tool install Trellis.AgentDocs --version 0.1.0-preview.19 --tool-manifest .config/dotnet-tools.json
+dotnet tool install Trellis.AgentDocs --version 0.1.0-preview.20 --tool-manifest .config/dotnet-tools.json
dotnet tool run agentdocs init
```
diff --git a/Trellis.ServiceLevelIndicators.Asp/src/README.md b/Trellis.ServiceLevelIndicators.Asp/src/README.md
index aae38bc..69d0522 100644
--- a/Trellis.ServiceLevelIndicators.Asp/src/README.md
+++ b/Trellis.ServiceLevelIndicators.Asp/src/README.md
@@ -1,4 +1,4 @@
-# Trellis.ServiceLevelIndicators.Asp
+# Trellis.ServiceLevelIndicators.Asp
[](https://www.nuget.org/packages/Trellis.ServiceLevelIndicators.Asp)
@@ -212,7 +212,7 @@ run from its Git root:
```powershell
dotnet new tool-manifest --output .config
-dotnet tool install Trellis.AgentDocs --version 0.1.0-preview.19 --tool-manifest .config/dotnet-tools.json
+dotnet tool install Trellis.AgentDocs --version 0.1.0-preview.20 --tool-manifest .config/dotnet-tools.json
dotnet tool run agentdocs init
```
diff --git a/Trellis.ServiceLevelIndicators/src/README.md b/Trellis.ServiceLevelIndicators/src/README.md
index f361afd..e1ab653 100644
--- a/Trellis.ServiceLevelIndicators/src/README.md
+++ b/Trellis.ServiceLevelIndicators/src/README.md
@@ -1,4 +1,4 @@
-# Trellis.ServiceLevelIndicators
+# Trellis.ServiceLevelIndicators
[](https://www.nuget.org/packages/Trellis.ServiceLevelIndicators)
@@ -125,7 +125,7 @@ run from its Git root:
```powershell
dotnet new tool-manifest --output .config
-dotnet tool install Trellis.AgentDocs --version 0.1.0-preview.19 --tool-manifest .config/dotnet-tools.json
+dotnet tool install Trellis.AgentDocs --version 0.1.0-preview.20 --tool-manifest .config/dotnet-tools.json
dotnet tool run agentdocs init
```
diff --git a/build/test-guidance-packages.ps1 b/build/test-guidance-packages.ps1
index 65bc96e..eeb7438 100644
--- a/build/test-guidance-packages.ps1
+++ b/build/test-guidance-packages.ps1
@@ -4,6 +4,14 @@ param([string] $PackagesDirectory = (Join-Path (Join-Path $PSScriptRoot '..') 'a
$ErrorActionPreference = 'Stop'
Set-StrictMode -Version Latest
+function Test-AgentDocsInstallCommand {
+ param([string] $Readme, [string] $ExpectedCommand)
+
+ $commands = [regex]::Matches($Readme,
+ '(?im)^[\t ]*dotnet[\t ]+tool[\t ]+install[\t ]+Trellis\.AgentDocs(?=[\t \r\n]|$)[^\r\n]*\r?$')
+ return $commands.Count -eq 1 -and $commands[0].Value.TrimEnd("`r") -ceq $ExpectedCommand
+}
+
$references = [ordered]@{
'Trellis.ServiceLevelIndicators' = 'trellis-api-sli.md'
'Trellis.ServiceLevelIndicators.Asp' = 'trellis-api-sli-asp.md'
@@ -15,6 +23,23 @@ $references = [ordered]@{
# is published in lockstep with the tool.
$props = [xml] (Get-Content -LiteralPath (Join-Path (Join-Path $PSScriptRoot '..') 'Directory.Packages.props') -Raw)
$toolVersion = $props.SelectSingleNode('//PackageVersion[@Include="Trellis.AgentDocs.Packaging"]').Version
+$installCommand = "dotnet tool install Trellis.AgentDocs --version $toolVersion --tool-manifest .config/dotnet-tools.json"
+$staleCommand = $installCommand.Replace($toolVersion, '0.0.0')
+$installCases = @(
+ @{ Name = 'correct LF'; Readme = "$installCommand`n"; Expected = $true },
+ @{ Name = 'correct CRLF'; Readme = "$installCommand`r`n"; Expected = $true },
+ @{ Name = 'missing'; Readme = ''; Expected = $false },
+ @{ Name = 'stale only'; Readme = $staleCommand; Expected = $false },
+ @{ Name = 'duplicate correct'; Readme = "$installCommand`n$installCommand"; Expected = $false },
+ @{ Name = 'conflicting version'; Readme = "$installCommand`n$staleCommand"; Expected = $false },
+ @{ Name = 'indented conflicting version'; Readme = "$installCommand`n $staleCommand"; Expected = $false }
+)
+foreach ($case in $installCases) {
+ if ((Test-AgentDocsInstallCommand -Readme $case.Readme -ExpectedCommand $installCommand) -ne $case.Expected) {
+ throw "AgentDocs install-command regression failed: $($case.Name)."
+ }
+}
+Write-Host 'PASS AgentDocs single-command and version-pin regression cases'
$toolDirectory = Join-Path ([System.IO.Path]::GetTempPath()) "agentdocs-validate-$([guid]::NewGuid().ToString('N'))"
$install = & dotnet tool install Trellis.AgentDocs --version $toolVersion --tool-path $toolDirectory 2>&1
if ($LASTEXITCODE -ne 0) { throw "Could not install Trellis.AgentDocs $toolVersion for validation:`n$($install | Out-String)" }
@@ -91,9 +116,9 @@ try {
$readmeReader = [System.IO.StreamReader]::new($readmeEntry.Open())
try { $readme = $readmeReader.ReadToEnd() }
finally { $readmeReader.Dispose() }
- if ($readme -notmatch '(?m)^dotnet tool install Trellis\.AgentDocs --version \S+ --tool-manifest \.config/dotnet-tools\.json\r?$' -or
+ if (-not (Test-AgentDocsInstallCommand -Readme $readme -ExpectedCommand $installCommand) -or
-not $readme.Contains('dotnet tool run agentdocs init ')) {
- throw "$id NuGet readme must explain how to install and initialize AgentDocs."
+ throw "$id NuGet readme must contain exactly one Trellis.AgentDocs install command pinned to $toolVersion and explain how to initialize it."
}
# Restoring a package never activates its guide: the readme must describe approval and sync.
if (-not $readme.Contains('approvedPackages') -or -not $readme.Contains('dotnet tool run agentdocs sync')) {