from pathlib import Path
p=Path('/opt/struktur/projects-dashboard/app.py'); s=p.read_text()
if 'from pathlib import Path' not in s:
    s=s.replace('import subprocess\n','import subprocess\nfrom pathlib import Path\n',1)
marker='\n# Suchrichtungen sind eigenstaendige Gruppierungen;'
newproj="""
    {
        'id': 'ki-wissens-onboarding', 'name': 'KI-Wissens- & Onboarding-System', 'icon': '◈',
        'desc': 'Unternehmenswissen sichern, quellenbasiert zugänglich machen und Einarbeitung beschleunigen.',
        'metrics': {'Aufbau': '30–70 h', 'Umsetzung': 'mittel · Infrastruktur vorhanden', 'Potenzial': '9,2/10', 'Erlös': 'Setup + 200–700 €/Monat'},
        'fields': {}
    }
"""
if "'id': 'ki-wissens-onboarding'" not in s:
    pos=s.index(marker); before=s[:pos]; after=s[pos:]
    end=before.rfind('\n]')
    before=before[:end] + ',\n' + newproj + before[end:]
    s=before+after
mapping="""
CUSTOMER_PROJECT_DOSSIERS = {
    'sop-agent-system': 'SOP-Agent-System.md',
    'prozess-human-loop': 'Prozessautomatisierung-Human-in-the-loop.md',
    'ai-rezeptionist-lead-agent': 'AI-Rezeptionist-Lead-Agent.md',
    'skill-library-orchestration': 'Skill-Library-Agenten-Orchestrierung.md',
    'content-landingpage-service': 'Content-Landingpage-Service.md',
    'ki-wissens-onboarding': 'KI-Wissens-Onboarding-System.md',
}
CUSTOMER_PROJECT_VAULT_DIR = Path('/opt/obsidian-vault/Agent-Solutions/Kundenprojekte')

def load_customer_project_fields(project_id):
    filename = CUSTOMER_PROJECT_DOSSIERS.get(project_id)
    if not filename: return {}, None
    path = CUSTOMER_PROJECT_VAULT_DIR / filename
    if not path.exists(): return {}, str(path)
    text = path.read_text(encoding='utf-8')
    fields, current, buf = {}, None, []
    for line in text.splitlines():
        if line.startswith('## '):
            if current: fields[current] = '\n'.join(buf).strip()
            current, buf = line[3:].strip(), []
        elif current is not None:
            buf.append(line)
    if current: fields[current] = '\n'.join(buf).strip()
    return fields, str(path)

"""
if 'CUSTOMER_PROJECT_DOSSIERS =' not in s:
    s=s.replace(marker,'\n'+mapping+marker.lstrip('\n'),1)
s=s.replace("'evaluated': '10 Videos ausgewertet'","'evaluated': '20 Videos ausgewertet'",1)
s=s.replace("'usable': '9 verwertbar'","'usable': '19 verwertbar'",1)
s=s.replace("'batch': 'kundenprojekte-business-2026-09-08',","'batch': '2 Batches · 2026-09-08',\n        'recency': 'KI-Aktualität: max. 90 Tage · Fallback bis 120 Tage',",1)
s=s.replace('Übersicht der fünf ausgearbeiteten Projektangebote.','Übersicht der ausgearbeiteten Projektangebote.',1)
s=s.replace('<span>Batch: {{direction.batch}}</span></div>','<span>Batch: {{direction.batch}}</span><span>{{direction.recency}}</span></div>',1)
old="project = next((item for item in CUSTOMER_PROJECTS if item['id'] == project_id), None)\n    if project is None:\n        return 'Projekt nicht gefunden', 404\n    return render_template_string(CUSTOMER_PROJECT_DETAIL_HTML, project=project)"
new="project = next((item for item in CUSTOMER_PROJECTS if item['id'] == project_id), None)\n    if project is None:\n        return 'Projekt nicht gefunden', 404\n    project = dict(project)\n    dossier_fields, dossier_path = load_customer_project_fields(project_id)\n    if dossier_fields:\n        project['fields'] = dossier_fields\n    project['dossier_path'] = dossier_path\n    return render_template_string(CUSTOMER_PROJECT_DETAIL_HTML, project=project)"
if old not in s: raise SystemExit('detail route pattern missing')
s=s.replace(old,new,1)
hero='<section class="hero"><p>{{project.desc}}</p><div class="note">'
if hero in s and 'Wissensquelle:' not in s:
    s=s.replace(hero,'<section class="hero"><p>{{project.desc}}</p>{% if project.dossier_path %}<p style="font-size:.8rem;color:#fff"><strong>Wissensquelle:</strong> {{project.dossier_path}} · für Obsidian/Graphiti</p>{% endif %}<div class="note">',1)
p.write_text(s); print('PROJECT_DOSSIER_PATCH_OK')