Migrate all repos into monorepo context folders

Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
      Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
      Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)

Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
This commit is contained in:
2026-06-30 20:39:52 +02:00
parent 2f2b295531
commit a5f8fb49ab
1717 changed files with 447332 additions and 0 deletions
@@ -0,0 +1,183 @@
<#
.SYNOPSIS
Test: Pusht eine einzelne Seite um Umlaut-Konvertierung zu pruefen
#>
$ConfluenceUrl = "https://arija-confluence.jaas.service.deutschebahn.com"
$SpaceKey = "BES"
$ParentPageId = "581013135"
$ApiBase = "$ConfluenceUrl/rest/api"
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# Token aus .secrets
$SecretsPath = Join-Path $ScriptDir "..\.secrets"
$PAT = $null
if (Test-Path $SecretsPath) {
Get-Content $SecretsPath | ForEach-Object {
if ($_ -match "^CONFLUENCE_TOKEN=(.+)$") {
$val = $Matches[1].Trim()
if ($val -ne "HIER_TOKEN_EINTRAGEN") { $PAT = $val }
}
}
}
if (-not $PAT) { $PAT = Read-Host "Confluence PAT" }
$Headers = @{ "Authorization" = "Bearer $PAT"; "Content-Type" = "application/json" }
# Fix-Umlauts Funktion (identisch zum Haupt-Script)
function Fix-Umlauts($html) {
if ($null -eq $html -or $html -eq "") { return $html }
$Protect = @(
'Israel','Michael','Raphael','Emmanuel','Manuel','Daniel','Samuel',
'Maurer','Enabler','enabler','Container','container','Cluster','cluster',
'User','user','Tracing','Staging','Logging','Alerting','Monitoring',
'Deployment','deployment','Security','security','Recovery','Discovery',
'Delivery','Pipeline','pipeline','Release','release',
'Performance','performance','Interface','interface',
'Service','service','Feature','feature','Issue','issue',
'value','true','blue','Due','due','Queue','queue',
'Unique','unique','Continue','continue',
'Funnel','Tunnel','tunnel','Buildpacks','Dockerfile',
'OpenSearch','Gherkin','Kubernetes','Helmfile','Renovate',
'Operate','Template','template','Tasklist',
'Smoke','smoke','Analyse','analyse','Analysis',
'Baseline','baseline','Namespace','namespace',
'Codebase','Database','database','Rescue','rescue'
)
foreach ($w in $Protect) { $html = $html.Replace($w, "PROTECT_$w") }
# Namen
$html = $html.Replace('Hoerpel', 'H&ouml;rpel')
$html = $html.Replace('Ruecker', 'R&uuml;cker')
$html = $html.Replace('Koehler', 'K&ouml;hler')
$html = $html.Replace('Goendoer', 'G&ouml;nd&ouml;r')
# ue
$html = $html.Replace('Ueber', '&Uuml;ber')
$html = $html.Replace('ueber', '&uuml;ber')
$html = $html.Replace('Pruef', 'Pr&uuml;f'); $html = $html.Replace('pruef', 'pr&uuml;f')
$html = $html.Replace('fuehrung', 'f&uuml;hrung'); $html = $html.Replace('Fuehrung', 'F&uuml;hrung')
$html = $html.Replace('Verfueg', 'Verf&uuml;g'); $html = $html.Replace('verfueg', 'verf&uuml;g')
$html = $html.Replace('Verschluess', 'Verschl&uuml;ss'); $html = $html.Replace('verschluess', 'verschl&uuml;ss')
$html = $html.Replace('Schluess', 'Schl&uuml;ss'); $html = $html.Replace('schluess', 'schl&uuml;ss')
$html = $html.Replace('Verknuepf', 'Verkn&uuml;pf'); $html = $html.Replace('verknuepf', 'verkn&uuml;pf')
$html = $html.Replace('Unterstuetz', 'Unterst&uuml;tz'); $html = $html.Replace('unterstuetz', 'unterst&uuml;tz')
$html = $html.Replace('Luecke', 'L&uuml;cke'); $html = $html.Replace('luecke', 'l&uuml;cke')
$html = $html.Replace('Rueck', 'R&uuml;ck'); $html = $html.Replace('rueck', 'r&uuml;ck')
$html = $html.Replace('Frueh', 'Fr&uuml;h'); $html = $html.Replace('frueh', 'fr&uuml;h')
$html = $html.Replace('Nuetzlich', 'N&uuml;tzlich'); $html = $html.Replace('nuetzlich', 'n&uuml;tzlich')
$html = $html.Replace('Abkuerz', 'Abk&uuml;rz'); $html = $html.Replace('abkuerz', 'abk&uuml;rz')
$html = $html.Replace('wuerde', 'w&uuml;rde'); $html = $html.Replace('Wuerde', 'W&uuml;rde')
$html = $html.Replace('muessen', 'm&uuml;ssen'); $html = $html.Replace('Muessen', 'M&uuml;ssen')
$html = $html.Replace('muesste', 'm&uuml;sste'); $html = $html.Replace('Muesste', 'M&uuml;sste')
$html = $html.Replace('koennte', 'k&ouml;nnte'); $html = $html.Replace('Koennte', 'K&ouml;nnte')
$html = $html.Replace('fuer ', 'f&uuml;r '); $html = $html.Replace('Fuer ', 'F&uuml;r ')
# oe
$html = $html.Replace('Loesung', 'L&ouml;sung'); $html = $html.Replace('loesung', 'l&ouml;sung')
$html = $html.Replace('Erhoeh', 'Erh&ouml;h'); $html = $html.Replace('erhoeh', 'erh&ouml;h')
$html = $html.Replace('noetig', 'n&ouml;tig'); $html = $html.Replace('Noetig', 'N&ouml;tig')
$html = $html.Replace('moeglich', 'm&ouml;glich'); $html = $html.Replace('Moeglich', 'M&ouml;glich')
$html = $html.Replace('geloest', 'gel&ouml;st')
$html = $html.Replace('hoechst', 'h&ouml;chst'); $html = $html.Replace('Hoechst', 'H&ouml;chst')
$html = $html.Replace('koennen', 'k&ouml;nnen'); $html = $html.Replace('Koennen', 'K&ouml;nnen')
$html = $html.Replace('Zugehoer', 'Zugeh&ouml;r'); $html = $html.Replace('zugehoer', 'zugeh&ouml;r')
$html = $html.Replace('gehoer', 'geh&ouml;r')
# ae
$html = $html.Replace('Aenderung', '&Auml;nderung'); $html = $html.Replace('aenderung', '&auml;nderung')
$html = $html.Replace('anfaellig', 'anf&auml;llig'); $html = $html.Replace('faellig', 'f&auml;llig')
$html = $html.Replace('faehig', 'f&auml;hig')
$html = $html.Replace('traeger', 'tr&auml;ger'); $html = $html.Replace('Traeger', 'Tr&auml;ger')
$html = $html.Replace('laenger', 'l&auml;nger'); $html = $html.Replace('Laenger', 'L&auml;nger')
$html = $html.Replace('erklaer', 'erkl&auml;r')
$html = $html.Replace('klaer', 'kl&auml;r'); $html = $html.Replace('Klaer', 'Kl&auml;r')
$html = $html.Replace('verstaerk', 'verst&auml;rk')
$html = $html.Replace('Verstaend', 'Verst&auml;nd'); $html = $html.Replace('verstaend', 'verst&auml;nd')
$html = $html.Replace('Abhaengig', 'Abh&auml;ngig'); $html = $html.Replace('abhaengig', 'abh&auml;ngig')
$html = $html.Replace('haeufig', 'h&auml;ufig'); $html = $html.Replace('Haeufig', 'H&auml;ufig')
$html = $html.Replace('laeuft', 'l&auml;uft'); $html = $html.Replace('Laeuft', 'L&auml;uft')
$html = $html.Replace('waere', 'w&auml;re'); $html = $html.Replace('Waere', 'W&auml;re')
$html = $html.Replace('schaerfen', 'sch&auml;rfen'); $html = $html.Replace('Schaerfen', 'Sch&auml;rfen')
$html = $html.Replace('aufraeumen', 'aufr&auml;umen'); $html = $html.Replace('Aufraeumen', 'Aufr&auml;umen')
$html = $html.Replace('Verlaenger', 'Verl&auml;nger'); $html = $html.Replace('verlaenger', 'verl&auml;nger')
$html = $html.Replace('Naechst', 'N&auml;chst'); $html = $html.Replace('naechst', 'n&auml;chst')
$html = $html.Replace('Massnahme', 'Ma&szlig;nahme'); $html = $html.Replace('massnahme', 'ma&szlig;nahme')
$html = $html.Replace('Groesse', 'Gr&ouml;&szlig;e'); $html = $html.Replace('groesse', 'gr&ouml;&szlig;e')
$html = $html.Replace('gleichmaessig', 'gleichm&auml;&szlig;ig')
$html = $html -replace '([a-z])taet\b', '$1t&auml;t'
# Schutz aufheben
$html = $html.Replace('PROTECT_', '')
return $html
}
# Fuer Seitentitel: Echte Unicode-Zeichen (PS5.1 kompatibel via Char-Codes)
function Fix-Title($title) {
$title = $title.Replace('ue', "$([char]0xFC)")
$title = $title.Replace('Ue', "$([char]0xDC)")
$title = $title.Replace('oe', "$([char]0xF6)")
$title = $title.Replace('Oe', "$([char]0xD6)")
$title = $title.Replace('ae', "$([char]0xE4)")
$title = $title.Replace('Ae', "$([char]0xC4)")
return $title
}
# Test-HTML mit vielen Umlauten
$TestHtml = @"
<h2>Umlaut-Test</h2>
<p>Ueberblick ueber die Qualitaet: Hoechste Prioritaet fuer Massnahmen.</p>
<p>Das Team muesste die Komplexitaet verstaendlich erklaeren koennen.</p>
<table>
<tr><th>Person</th><th>Rolle</th><th>Bewertung</th></tr>
<tr><td>Leon Hoerpel</td><td>Dev</td><td>Bug-anfaellig</td></tr>
<tr><td>Dominik Ruecker</td><td>Backend Dev</td><td>Verfuegbar</td></tr>
<tr><td>Jonas Koehler</td><td>Dev</td><td>Leistungstraeger</td></tr>
<tr><td>Sebastian Goendoer</td><td>Dev (ehem. STeam)</td><td>Wenig aktiv</td></tr>
<tr><td>Emmanuel Kontcheu Tagne</td><td>Frontend Dev</td><td>KRITISCH</td></tr>
</table>
<p>Naechste Schritte: Abhaengigkeiten klaeren, Loesungen erhoehen, Verschluesselung pruefen.</p>
"@
# Konvertieren und anzeigen
$Converted = Fix-Umlauts $TestHtml
Write-Host "=== VORHER (Auszug) ===" -ForegroundColor Yellow
Write-Host " Ueberblick, Qualitaet, Hoerpel, Goendoer, Emmanuel"
Write-Host ""
Write-Host "=== NACHHER (Auszug) ===" -ForegroundColor Green
# Zeige ein paar konvertierte Stellen
if ($Converted -match '&Uuml;berblick') { Write-Host " Ueberblick -> OK" -ForegroundColor Green }
if ($Converted -match 'Qualit&auml;t') { Write-Host " Qualitaet -> OK" -ForegroundColor Green }
if ($Converted -match 'H&ouml;rpel') { Write-Host " Hoerpel -> OK" -ForegroundColor Green }
if ($Converted -match 'G&ouml;nd&ouml;r') { Write-Host " Goendoer -> OK" -ForegroundColor Green }
if ($Converted -match 'Emmanuel') { Write-Host " Emmanuel -> OK (nicht konvertiert)" -ForegroundColor Green }
if ($Converted -match 'Ma&szlig;nahme') { Write-Host " Massnahme -> OK" -ForegroundColor Green }
if ($Converted -match 'f&uuml;r ') { Write-Host " fuer -> OK" -ForegroundColor Green }
if ($Converted -match 'Abh&auml;ngig') { Write-Host " Abhaengig -> OK" -ForegroundColor Green }
if ($Converted -match 'kl&auml;r') { Write-Host " klaeren -> OK" -ForegroundColor Green }
if ($Converted -match 'Komplexit&auml;t') { Write-Host " Komplexitaet -> OK" -ForegroundColor Green }
# Pruefen ob Emmanuel NICHT kaputt ist
if ($Converted -match 'E&') { Write-Host " FEHLER: Emmanuel wurde konvertiert!" -ForegroundColor Red }
Write-Host ""
Write-Host ">> Pushe Test-Seite nach Confluence..." -ForegroundColor Yellow
# Push
$SearchUri = "$ApiBase/content?spaceKey=$SpaceKey&title=$([Uri]::EscapeDataString('TEST Umlaut-Pruefung'))&type=page"
$SearchResp = Invoke-WebRequest -Uri $SearchUri -Headers $Headers -UseBasicParsing -ErrorAction Stop
$SearchData = $SearchResp.Content | ConvertFrom-Json
if ($SearchData.results -and $SearchData.results.Count -gt 0) {
$PageId = $SearchData.results[0].id
$VerResp = Invoke-WebRequest -Uri "$ApiBase/content/$PageId`?expand=version" -Headers $Headers -UseBasicParsing
$Version = ($VerResp.Content | ConvertFrom-Json).version.number + 1
$Body = @{ version = @{ number = $Version }; title = "TEST Umlaut-Pruefung"; type = "page"; body = @{ storage = @{ value = $Converted; representation = "storage" } } } | ConvertTo-Json -Depth 10
$Resp = Invoke-WebRequest -Uri "$ApiBase/content/$PageId" -Method Put -Headers $Headers -Body ([System.Text.Encoding]::UTF8.GetBytes($Body)) -UseBasicParsing
Write-Host " Aktualisiert: $ConfluenceUrl/pages/viewpage.action?pageId=$PageId" -ForegroundColor Green
} else {
$Body = @{ type = "page"; title = "TEST Umlaut-Pruefung"; space = @{ key = $SpaceKey }; ancestors = @(@{ id = $ParentPageId }); body = @{ storage = @{ value = $Converted; representation = "storage" } } } | ConvertTo-Json -Depth 10
$Resp = Invoke-WebRequest -Uri "$ApiBase/content" -Method Post -Headers $Headers -Body ([System.Text.Encoding]::UTF8.GetBytes($Body)) -UseBasicParsing
$NewId = ($Resp.Content | ConvertFrom-Json).id
Write-Host " Erstellt: $ConfluenceUrl/pages/viewpage.action?pageId=$NewId" -ForegroundColor Green
}
Write-Host ""
Write-Host "Pruefe die Seite in Confluence und sag mir ob die Umlaute stimmen!" -ForegroundColor Cyan