Files
claude-skills/scripts/update-index.ps1
T

94 lines
3.6 KiB
PowerShell

# Erzeugt die Skill-Tabelle in README.md zwischen <!-- skills:start --> und <!-- skills:end -->
# neu. Mit -Check wird nur geprueft, ob die Tabelle aktuell ist (Exit-Code 1, wenn nicht).
# Aufruf: scripts\update-index.ps1 [-Check]
param([switch]$Check)
. (Join-Path $PSScriptRoot 'lib.ps1')
. (Join-Path $PSScriptRoot 'cursor-deeplink.ps1')
$RepoWeb = 'https://git.gundel.dev/dg/claude-skills'
$readme = Join-Path $Root 'README.md'
$current = Read-Text $readme
$lines = $current -split "`n"
$start = [Array]::IndexOf($lines, '<!-- skills:start -->')
$end = [Array]::IndexOf($lines, '<!-- skills:end -->')
if ($start -lt 0 -or $end -lt $start) {
Write-Error 'README.md enthaelt die Marker <!-- skills:start --> / <!-- skills:end --> nicht.'
exit 1
}
$ServerKeys = @{
'wordcraft-mcp' = 'wordcraft'
'gridcraft-mcp' = 'gridcraft'
'pdfcraft-mcp' = 'pdfcraft'
'figcraft-mcp' = 'figcraft'
'vectorcraft-mcp' = 'vectorcraft'
}
function Get-McpServerKey([string]$SkillName) {
if ($ServerKeys.ContainsKey($SkillName)) { return $ServerKeys[$SkillName] }
if ($SkillName -match '^(.+)-mcp$') { return $Matches[1] }
return $SkillName
}
$table = @(
'| Skill | Kurzbeschreibung | Version | Doku | Download | Erweiterung (.mcpb) | Cursor-Plugin | Cursor 1-Klick |',
'|---|---|---|---|---|---|---|---|'
)
foreach ($n in (Get-SkillNames)) {
$dir = Join-Path $SkillsDir $n
$desc = ''
$skill = Join-Path $dir 'SKILL.md'
if (Test-Path $skill) {
$fm = Get-Frontmatter $skill
if ($null -ne $fm) {
$d = Get-FmValue $fm 'description'
if ($d) { $desc = $d }
}
}
$desc = $desc.Replace('|', '\|')
$ver = Get-SkillVersion $dir
$tagEnc = [Uri]::EscapeDataString("$n/v$ver")
$zipLink = "[{0}-v{1}.zip]({2}/releases/download/{3}/{0}-v{1}.zip)" -f $n, $ver, $RepoWeb, $tagEnc
$mcpb = ''
$cursorZip = ''
$deeplink = ''
$extPath = Join-Path $dir 'extension\manifest.json'
if (Test-Path $extPath) {
$mcpb = "[{0}-v{1}.mcpb]({2}/releases/download/{3}/{0}-v{1}.mcpb)" -f $n, $ver, $RepoWeb, $tagEnc
$cursorZip = "[{0}-cursor-v{1}.zip]({2}/releases/download/{3}/{0}-cursor-v{1}.zip)" -f $n, $ver, $RepoWeb, $tagEnc
$man = (Read-Text $extPath) | ConvertFrom-Json
$serverKey = Get-McpServerKey $n
$cmd = [string]$man.server.mcp_config.command
$argsList = New-Object System.Collections.Generic.List[string]
foreach ($a in @($man.server.mcp_config.args)) {
$s = [string]$a
if ($s -eq '${user_config.author}') { $argsList.Add('Claude'); continue }
if ($s -eq '${user_config.read_root}') { $argsList.Add('${userHome}/Documents'); continue }
if ($s -eq '${user_config.write_root}') { $argsList.Add('${userHome}/Documents/Claude'); continue }
$argsList.Add($s)
}
$transport = @{ command = $cmd; args = @($argsList) }
$link = New-CursorDeeplink -ServerName $serverKey -Config $transport
$deeplink = "[Add to Cursor]($link)"
}
$table += ('| [{0}](skills/{0}/) | {1} | {2} | [README](skills/{0}/README.md) | {3} | {4} | {5} | {6} |' -f $n, $desc, $ver, $zipLink, $mcpb, $cursorZip, $deeplink)
}
$newLines = @()
if ($start -ge 0) { $newLines += $lines[0..$start] }
$newLines += $table
$newLines += $lines[$end..($lines.Count - 1)]
$new = $newLines -join "`n"
if ($Check) {
if ($new -cne $current) {
Write-Host 'README.md ist nicht aktuell - scripts\update-index.ps1 ausfuehren und committen.'
exit 1
}
Write-Host 'README.md ist aktuell.'
}
else {
Write-Text $readme $new
Write-Host 'README.md aktualisiert.'
}