# Erzeugt die Skill-Tabelle in README.md zwischen und # 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, '') $end = [Array]::IndexOf($lines, '') if ($start -lt 0 -or $end -lt $start) { Write-Error 'README.md enthaelt die Marker / nicht.' exit 1 } $ServerKeys = @{ 'wordcraft-mcp' = 'wordcraft' 'gridcraft-mcp' = 'gridcraft' } 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.' }