Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:

defaults:
run:
shell: bash

jobs:
checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: '3.11'

# Pillow >= 10.1, weil ImageFont.load_default() erst ab 10.1.0 einen
# size-Parameter kennt. Ohne den faellt create_banner.py auf einen
# Bitmap-Font in fester Groesse zurueck, meldet die Messung selbst als
# Safe-Zone-Verletzung und beendet --strict auch bei sauberem Text mit 1.
# Das Repo hat keine requirements.txt, die Untergrenze steht deshalb hier.
- name: Pillow installieren
run: python -m pip install --disable-pip-version-check "Pillow>=10.1"

# PYTHONPYCACHEPREFIX haelt __pycache__ aus dem Arbeitsbaum,
# das Repo hat keine .gitignore.
- name: Python-Syntax pruefen
run: PYTHONPYCACHEPREFIX="$RUNNER_TEMP/pycache" python -m compileall -q scripts

- name: Node-Syntax pruefen
run: node --check scripts/generate_report.js

- name: Banner ohne Verletzung endet mit 0
run: |
python scripts/create_banner.py \
--output "$RUNNER_TEMP/banner-clean.png" \
--title1 "Safe Zone" \
--title2 "CI Smoke Test" \
--subtitle "Kurzer Untertitel" \
--role "Beispielrolle @ Beispiel GmbH" \
--tags "#CI #SafeZone" \
--strict

- name: Banner mit Verletzung endet ungleich 0
run: |
rc=0
python scripts/create_banner.py \
--output "$RUNNER_TEMP/banner-broken.png" \
--title1 "Ein viel zu langer Titel der die Safe Zone garantiert nach rechts verlaesst" \
--strict 2> "$RUNNER_TEMP/banner-broken.err" || rc=$?
cat "$RUNNER_TEMP/banner-broken.err"
if [ "$rc" -eq 0 ]; then
echo "FEHLER: --strict hat die Safe-Zone-Verletzung nicht gemeldet" >&2
exit 1
fi
grep -q "Safe-Zone-Verletzung" "$RUNNER_TEMP/banner-broken.err"

- name: Versionsangaben pruefen
run: python scripts/check_versions.py
53 changes: 42 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# linkedin-profil-optimierung v2.1
# linkedin-profil-optimierung v2.2.2

[![CI](https://github.com/GodModeAI2025/LinkedInOptimizer/actions/workflows/ci.yml/badge.svg)](https://github.com/GodModeAI2025/LinkedInOptimizer/actions/workflows/ci.yml)

Ein Skill zur professionellen Analyse und Optimierung von LinkedIn-Profilen. Entwickelt für Berater, Agenturen und Freelancer, die Kunden strategisch als Thought Leader positionieren und auf das LinkedIn Top Voice Badge vorbereiten.

Expand All @@ -14,21 +16,26 @@ Ein Skill zur professionellen Analyse und Optimierung von LinkedIn-Profilen. Ent
| Content Skill | Personalisierter Posting-Skill mit 10 Hook-Typen |
| Kommentar Skill | 5 Kommentar-Typen, 15–20 Ziel-Accounts |
| SSI-Aktionsplan | Social Selling Index Optimierung (4 Säulen) |
| PDF-Report | 10–15 Seiten mit Radar-Charts und 12-Monats-Roadmap |
| DOCX-Report | Word-Dokument mit 9 Kapiteln, Scoring-Tabellen und Roadmap bis Monat 6 |

## Ordnerstruktur

```
linkedin-profil-skill-2/
├── SKILL.md # Hauptworkflow (8 Phasen, <500 Zeilen)
LinkedInOptimizer/
├── README.md # Diese Übersicht
├── SKILL.md # Hauptworkflow (8 Phasen)
├── LICENSE # MIT-Lizenz
├── index.html # Landingpage (GitHub Pages, Quelle ist der Repo-Root)
├── scripts/
│ ├── create_banner.py # Banner-Generator mit Safe-Zone-Validierung
│ └── generate_report.js # DOCX-Report-Template (Node.js/docx-js)
│ ├── create_banner.py # Banner-Generator mit Safe-Zone-Validierung
│ ├── check_versions.py # Vergleicht die Versionsangaben in README, SKILL.md, index.html, Report-Template
│ └── generate_report.js # DOCX-Report-Template (Node.js, npm-Paket docx)
├── references/
│ ├── SCORING.md # Gewichtete Bewertungsmatrix mit Sub-Kriterien
│ ├── TEMPLATES.md # Vorlagen für Headline, About, Content, Kommentare
│ └── BANNER.md # Technische Banner-Anleitung mit Viewport-Matrix
└── assets/ # (Platzhalter für Kundenassets wie Logos, Covers)
│ ├── SCORING.md # Gewichtete Bewertungsmatrix mit Sub-Kriterien und Benchmarks
│ ├── TEMPLATES.md # Vorlagen für Headline, About, Content, Kommentare
│ └── BANNER.md # Technische Banner-Anleitung mit Viewport-Matrix
└── .github/workflows/
└── ci.yml # Syntax-, Banner- und Versionsprüfung
```

## Datenbasis
Expand All @@ -38,6 +45,30 @@ linkedin-profil-skill-2/
- Top Voice Kriterien: Halbjährliche Review seit Januar 2025
- SSI-Framework: 4 Säulen × 25 Punkte, Ziel ≥75

## Scoring

Die zehn Kategorien, ihre Gewichte und die Begründung je Gewicht stehen in [references/SCORING.md](references/SCORING.md#gewichtung). Dort liegen auch die [Engagement-Rate-Benchmarks](references/SCORING.md#engagement-rate-benchmarks-2025) samt Berechnungsformel und die [Score-Interpretation](references/SCORING.md#score-interpretation), die einen Gesamtscore in einen Zeithorizont bis Top Voice übersetzt.

## Grenzen

- LinkedIn blockiert web_fetch und web_search über robots.txt. Ohne das Chrome-Plugin bleibt die manuelle Eingabe, und die Datenqualität sinkt entsprechend.
- Impressions sind öffentlich nicht sichtbar. `scripts/generate_report.js` schätzt die Engagement-Rate deshalb aus der Follower-Zahl, während die Benchmark-Tabelle in SCORING.md Impressions als Nenner voraussetzt. Der geschätzte Wert liegt systematisch höher als der Benchmark-Wert, beide sind nicht direkt vergleichbar.
- Der DOCX-Report enthält keine Diagramme. Radar-Chart und Balkendiagramm sind in SCORING.md als Darstellungsform beschrieben, das Report-Template erzeugt sie nicht.
- Der Ausgabepfad in `scripts/generate_report.js` steht fest auf `/mnt/user-data/outputs/`, also auf die Sandbox von claude.ai. Für einen lokalen Lauf muss die letzte Zeile angepasst werden.
- Der SSI lässt sich nur mit Zugang zu linkedin.com/sales/ssi ablesen. Ohne Zugang wird er aus Profil-Signalen geschätzt und ist im Report als geschätzt zu kennzeichnen.
- `scripts/create_banner.py` braucht Pillow ab 10.1. Ältere Versionen wenden die angeforderte Schriftgröße nicht auf den Ersatz-Font an; die Safe-Zone-Messung ist dann nicht belastbar, und `--strict` bricht ab.
- Es gibt weder requirements.txt noch package.json. Pillow und das npm-Paket docx sind nicht gepinnt.

## Roadmap

Offene Punkte, ohne Termin:

- requirements.txt und package.json mit gepinnten Versionen für Pillow und docx.
- Ausgabepfad des Report-Templates konfigurierbar machen, statt ihn auf die claude.ai-Sandbox zu verdrahten.
- Quellenangaben für die Engagement-Benchmarks in SCORING.md, dazu die Klärung, welcher Nenner gilt.
- Fehlerfälle Rate Limit beziehungsweise LinkedIn-Checkpoint und geänderte DOM-Struktur in der Fehlerbehandlung ergänzen.
- Testfälle für das Scoring mit erwarteten Score-Bändern.

## Version

v2.2.0 – Chrome-First Datenerhebung, DOCX als Pflicht-Deliverable, Report-Template in scripts/.
Aktuelle Version: v2.2.2. Was sich je Version geändert hat, steht im Changelog in [SKILL.md](SKILL.md#changelog).
25 changes: 13 additions & 12 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ description: >
oder wenn jemand seinen LinkedIn-Auftritt professionalisieren möchte.
---

# LinkedIn Profil-Optimierung & Thought-Leader Skill v2.2
# LinkedIn Profil-Optimierung & Thought-Leader Skill v2.2.2

Ein evidenzbasierter 8-Phasen-Workflow zur Analyse und Optimierung von LinkedIn-Profilen. Basiert auf LinkedIn-Algorithmus-Daten 2025/2026, Engagement-Benchmarks und den offiziellen Top Voice Kriterien.

Expand All @@ -24,7 +24,7 @@ Lies die jeweilige Datei, wenn du die Phase erreichst:
| `references/TEMPLATES.md` | Vorlagen für Headline, About, Content-Skill, Kommentar-Skill | Phase 4 + 6 |
| `references/BANNER.md` | Technische Banner-Anleitung mit Safe Zones und Viewport-Matrix | Phase 5 |
| `scripts/create_banner.py` | Ausführbares Banner-Skript mit Font-Fallback und Validierung | Phase 5 (ausführen) |
| `scripts/generate_report.js` | DOCX-Report-Template (Node.js/docx-js) — als Strukturvorlage nutzen und mit den erhobenen Daten befüllen | Phase 8 (anpassen + ausführen) |
| `scripts/generate_report.js` | DOCX-Report-Template (Node.js, npm-Paket `docx`), als Strukturvorlage nutzen und mit den erhobenen Daten befüllen | Phase 8 (anpassen + ausführen) |

---

Expand Down Expand Up @@ -251,7 +251,7 @@ Der Analyse-Report wird immer als professionelles Word-Dokument (.docx) geliefer

**Vorgehen:**
1. Lies `scripts/generate_report.js` mit dem view-Tool
2. Kopiere das Skript in das Arbeitsverzeichnis
2. Kopiere es unter dem Namen `generate_report.js` in das Arbeitsverzeichnis und installiere dort das Paket `docx` mit `npm install docx`
3. Ersetze die Platzhalter-Daten durch die erhobenen Kundendaten:
- `scoring`-Array: Alle 10 Kategorien mit Roh-Score, Gewichtung, Begründung
- `posts`-Array: Content-Aktivitäten aus Phase 1 (Schritt 2)
Expand All @@ -260,8 +260,9 @@ Der Analyse-Report wird immer als professionelles Word-Dokument (.docx) geliefer
- About-Analyse: Verbotene Wörter, CTA-Bewertung, Hashtag-Status
- Profil-Audit: 17-Punkte-Checkliste mit Status je Element
- Roadmap: Kundenspezifisch priorisierte Maßnahmen
4. Führe das Skript aus: `node report.js`
5. Validiere das Ergebnis: `python scripts/office/validate.py output.docx`
4. Passe die letzte Zeile an: der Ausgabepfad steht fest auf `/mnt/user-data/outputs/`. Außerhalb der claude.ai-Sandbox muss dort ein existierendes Verzeichnis stehen.
5. Führe das Skript aus: `node generate_report.js`. Es schreibt den Pfad der erzeugten Datei als `Done: …` nach stdout.
6. Prüfe das Ergebnis: `unzip -l <Ausgabedatei>.docx` muss `word/document.xml` listen, danach die Datei öffnen und die 9 Kapitel durchgehen.

**Report-Struktur (9 Kapitel, alle mit erklärenden Textpassagen):**

Expand All @@ -279,7 +280,7 @@ Der Analyse-Report wird immer als professionelles Word-Dokument (.docx) geliefer

7. **Profil-Audit** (1 Seite): 17-Punkte-Checkliste als Tabelle mit Status (Vorhanden/Fehlt/Teilweise) und konkreter Maßnahme je Element. Zusammenfassung: X von 17 erfüllt.

8. **Roadmap** (1 Seite): Zeitlich priorisierte Maßnahmen (Woche 1–2 Quick Wins → Monat 2–3 Skalierung → Monat 4–6 Authority Building). Erwarteter Score nach 3 Monaten mit Begründung.
8. **Roadmap** (1 Seite): Zeitlich priorisierte Maßnahmen (Woche 1–2 Quick Wins → Woche 3–4 Content-Start → Monat 2–3 Skalierung → Monat 4–6 Authority Building). Erwarteter Score nach 3 Monaten mit Begründung.

9. **Methodik & Einschränkungen** (1 Seite): Wie die Daten erhoben wurden (Chrome/web_search/manuell), welche Scoring-Methodik verwendet wurde, welche Daten geschätzt oder nicht verfügbar waren. Transparenz schafft Vertrauen.

Expand Down Expand Up @@ -341,7 +342,7 @@ Prüfe vor Übergabe an den Kunden:

**Scoring**: Jede Kategorie mit Begründung, gewichtete Summe korrekt berechnet, ≥3 Hebel identifiziert.

**Report**: DOCX generiert und validiert (validate.py bestanden), alle 9 Kapitel vorhanden, jede Tabelle und jedes Diagramm hat einen erklärenden Textabsatz darunter, keine Scoring-Kategorie ohne Begründung.
**Report**: DOCX erzeugt, als ZIP lesbar (`unzip -l` listet `word/document.xml`), alle 9 Kapitel vorhanden, jede Tabelle hat einen erklärenden Textabsatz darunter, keine Scoring-Kategorie ohne Begründung.

Bei Fehlern: Automatisch korrigieren und erneut prüfen.

Expand All @@ -361,11 +362,11 @@ Bei Fehlern: Automatisch korrigieren und erneut prüfen.

**SSI nicht verfügbar**: Erfordert Zugang zu linkedin.com/sales/ssi. Schätze die 4 Säulen basierend auf beobachtbaren Profil-Signalen. Markiere als "(geschätzt)" im Report.

**Wettbewerber nicht abrufbar**: Minimum 2 Wettbewerber für sinnvolle Matrix. Bei <2: Branchenbenchmarks aus der Tabelle oben verwenden.
**Wettbewerber nicht abrufbar**: Das Quality Gate für Phase 3 verlangt 3 Wettbewerber. Sind nur 2 erreichbar, erstelle die Matrix mit 2 und vermerke die Abweichung im Report. Bei <2: Branchenbenchmarks aus der Tabelle oben verwenden.

**Banner-Erstellung scheitert**: Font-Fallback (DejaVuSans) und Gradient-Fallback sind im Skript eingebaut. Wenn Buchcover nicht in Safe Zone passt: weglassen.

**DOCX-Generierung scheitert**: Prüfe ob `docx` npm-Paket installiert ist (`npm install -g docx`). Validiere das Ergebnis mit `python scripts/office/validate.py`. Bei Syntax-Fehlern im Report-Skript: Keine typografischen Anführungszeichen (U+201E, U+201C) in JavaScript-Strings verwenden — nur ASCII-Quotes (`"` und `'`). Umlaute (ä, ö, ü, ß) und andere UTF-8-Zeichen sind dagegen problemlos möglich und sollen immer korrekt geschrieben werden — niemals als ASCII-Umschreibungen (ae, oe, ue, ss).
**DOCX-Generierung scheitert**: Prüfe ob das npm-Paket `docx` im Arbeitsverzeichnis installiert ist (`npm install docx`). Eine globale Installation reicht nicht: `require("docx")` durchsucht nur die node_modules-Ordner oberhalb des Skripts, nicht das globale npm-Verzeichnis. Prüfe das Ergebnis mit `unzip -l <Ausgabedatei>.docx`, `word/document.xml` muss enthalten sein. Bei Syntax-Fehlern im Report-Skript: Keine typografischen Anführungszeichen (U+201E, U+201C) in JavaScript-Strings verwenden — nur ASCII-Quotes (`"` und `'`). Umlaute (ä, ö, ü, ß) und andere UTF-8-Zeichen sind dagegen problemlos möglich und sollen immer korrekt geschrieben werden — niemals als ASCII-Umschreibungen (ae, oe, ue, ss).

---

Expand All @@ -375,7 +376,7 @@ Bei Fehlern: Automatisch korrigieren und erneut prüfen.
|-------|------|---------|
| 1. Discovery | Alle Profildaten vollständig | Checkliste |
| 2. Scoring | Jeder Score mit Begründung | Sub-Kriterien aus SCORING.md |
| 3. Wettbewerb | Min. 3 Wettbewerber | Matrix ausgefüllt |
| 3. Wettbewerb | Min. 3 Wettbewerber, Ausnahme siehe Fehlerbehandlung | Matrix ausgefüllt |
| 4. Profil | Headline in 60-Zeichen-Preview geprüft | Zeichenzahl-Check |
| 5. Banner | Kein Overlap in Safe Zone | Skript-Validierung |
| 6. Content | 3 Test-Posts auf Tonalität geprüft | Template-Check |
Expand All @@ -390,7 +391,7 @@ Bei Fehlern: Automatisch korrigieren und erneut prüfen.
v2.2.2 (2026-03-09) – Template anonymisiert
├── generate_report.js: Komplett neu geschrieben mit PROFILE/EXEC/HEADLINE/ABOUT/AUDIT/ROADMAP/LIMITS-Variablen
├── Report-Body ist jetzt 100% generisch — keine Namen, Firmen oder profilspezifischen Texte im Code
├── Alle kundenspezifischen Daten stehen ausschließlich im KUNDENDATEN-Block (Zeile 80-150)
├── Alle kundenspezifischen Daten stehen ausschließlich im KUNDENDATEN-Block (PROFILE bis LIMITS, Zeile 32-149)
├── Platzhalter-Werte ("Max Mustermann", "[Begründung]") als Vorlage für Anpassung
└── Template von 585 auf 278 Zeilen reduziert (gleiche Report-Struktur, kompakterer Code)

Expand All @@ -411,7 +412,7 @@ v2.2.0 (2026-03-09) – Chrome-First + DOCX-Pflicht
└── Verifikation: Report-Check auf DOCX-Validierung und Erklärungspflicht angepasst

v2.1.0 (2026-03-09) – Anthropic Skill Standard Compliance
├── Ordnerstruktur: references/, scripts/, assets/ nach Anthropic-Standard
├── Ordnerstruktur: references/ und scripts/ nach Anthropic-Standard
├── SKILL.md auf <500 Zeilen reduziert mit klaren Verweisen auf references/
├── Banner-Code als eigenständiges Skript extrahiert (scripts/create_banner.py)
├── Font-Fallback (DejaVuSans) und Gradient-Fallback eingebaut
Expand Down
Loading
Loading