e3228abb26
При переключении на ветку или коммит без plugin/skills junction'ы навыков повисают битыми, и git checkout падает на середине: часть рабочего дерева уже удалена, а HEAD остаётся на прежней ветке. Remove-AgentSkillLink удаляет сам reparse point через Directory.Delete (без -Recurse), поэтому в target не заходит и содержимое plugin/skills не трогает. Junction опознаётся по атрибуту ReparsePoint, а не по резолву target — иначе режим не работал бы ровно в том случае, ради которого сделан. Настоящий каталог не удаляется, а возвращает Skipped. Режимы скрипта разведены parameter set'ами: -Remove -Check вместе теперь дают ошибку разбора параметров вместо тихого выигрыша одного из ключей. Покрыто пятью кейсами в tools/tests/AgentAssets.Tests.ps1 (включая junction с исчезнувшим источником); порядок действий и восстановление после падения чекаута описаны в CLAUDE.md.
62 lines
1.8 KiB
PowerShell
62 lines
1.8 KiB
PowerShell
#requires -Version 5.1
|
|
[CmdletBinding(DefaultParameterSetName = 'Sync')]
|
|
param(
|
|
[Parameter(ParameterSetName = 'Check')]
|
|
[switch] $Check,
|
|
|
|
[Parameter(ParameterSetName = 'Sync')]
|
|
[switch] $AllowCopy,
|
|
|
|
# Снимает junction'ы перед переключением на ветку/коммит без plugin/skills:
|
|
# иначе git checkout падает на середине, не сумев создать файлы внутри битой ссылки.
|
|
[Parameter(ParameterSetName = 'Remove')]
|
|
[switch] $Remove
|
|
)
|
|
|
|
Set-StrictMode -Version Latest
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
Import-Module (Join-Path $PSScriptRoot 'AgentAssets.psm1') -Force
|
|
|
|
$repoRoot = Split-Path -Parent $PSScriptRoot
|
|
$skills = @('kompas-3d', 'kompas-fdm-design')
|
|
$targetRoots = @(
|
|
(Join-Path $repoRoot '.claude\skills'),
|
|
(Join-Path $repoRoot '.agents\skills')
|
|
)
|
|
|
|
$failed = $false
|
|
foreach ($root in $targetRoots) {
|
|
foreach ($skill in $skills) {
|
|
$source = Join-Path $repoRoot "plugin\skills\$skill"
|
|
$link = Join-Path $root $skill
|
|
|
|
if ($Remove) {
|
|
$state = Remove-AgentSkillLink -LinkPath $link
|
|
if ($state -eq 'Skipped') {
|
|
Write-Host "Skipped $link (настоящий каталог, не тронут)"
|
|
}
|
|
else {
|
|
Write-Host "$state $link"
|
|
}
|
|
continue
|
|
}
|
|
|
|
if ($Check) {
|
|
if (Test-AgentSkillLink -SourcePath $source -LinkPath $link) {
|
|
Write-Host "ok $link"
|
|
}
|
|
else {
|
|
Write-Host "БИТО $link"
|
|
$failed = $true
|
|
}
|
|
continue
|
|
}
|
|
|
|
$state = Sync-AgentSkillLink -SourcePath $source -LinkPath $link -AllowCopy:$AllowCopy
|
|
Write-Host "$state $link"
|
|
}
|
|
}
|
|
|
|
if ($failed) { exit 1 }
|