Files
kompas3d-mcp/tools/sync-agent-assets.ps1
T
mikhail e3228abb26 feat(tools): режим -Remove у sync-agent-assets — снятие junction'ов перед checkout
При переключении на ветку или коммит без 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.
2026-07-31 08:24:26 +03:00

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 }