@@ -0,0 +1,50 @@
|
||||
# Agent-safe: refuse to proceed if secret-looking paths are staged or untracked.
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
. (Join-Path $PSScriptRoot 'common.ps1')
|
||||
|
||||
$inside = (Invoke-GitSkillsNative -FilePath git -ArgumentList @('rev-parse', '--is-inside-work-tree') | Out-String).Trim()
|
||||
if ($LASTEXITCODE -ne 0 -or $inside -ne 'true') {
|
||||
Write-StatusLine -Key 'status' -Value 'failed'
|
||||
Write-StatusLine -Key 'reason' -Value 'not_a_git_repo'
|
||||
exit 1
|
||||
}
|
||||
|
||||
$patterns = @(
|
||||
'\.dpapi$',
|
||||
'(^|/)token\.txt$',
|
||||
'(^|/)\.env$',
|
||||
'(^|/)\.env\.',
|
||||
'\.pem$',
|
||||
'(^|/)id_rsa$',
|
||||
'(^|/)id_ed25519$',
|
||||
'(^|/)id_ecdsa$',
|
||||
'(^|/)\.git-skills/'
|
||||
)
|
||||
|
||||
$blocked = New-Object System.Collections.Generic.List[string]
|
||||
$lines = Invoke-GitSkillsNative -FilePath git -ArgumentList @('status', '--porcelain', '-uall')
|
||||
foreach ($line in $lines) {
|
||||
if ([string]::IsNullOrWhiteSpace($line) -or $line.Length -lt 4) { continue }
|
||||
$path = $line.Substring(3).Trim().Trim('"')
|
||||
$path = $path -replace ' -> .+$', ''
|
||||
$norm = $path.Replace('\', '/')
|
||||
foreach ($re in $patterns) {
|
||||
if ($norm -match $re) {
|
||||
$blocked.Add($norm) | Out-Null
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($blocked.Count -gt 0) {
|
||||
Write-StatusLine -Key 'status' -Value 'blocked'
|
||||
Write-StatusLine -Key 'reason' -Value 'secret_paths'
|
||||
foreach ($p in $blocked) {
|
||||
Write-StatusLine -Key 'path' -Value $p
|
||||
}
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-StatusLine -Key 'status' -Value 'ok'
|
||||
exit 0
|
||||
Reference in New Issue
Block a user