8 neue Posts aus direkt-auf-Nostr-erstellten Events (Habla/Yakihonne) ins
Repo geholt, mit sauberen ASCII-slugs statt der kaputten d-tags (Umlaute,
Emojis, Doppelpunkte, Trailing-Dashes). Alte Events per NIP-09 geloescht.
Pipeline-Erweiterungen:
- neuer subcommand "delete" publisht NIP-09 kind:5 events via stabilem
bunker-signer (nutzt CLIENT_SECRET_HEX-identitaet, keine re-pairings).
- frontmatter.lang + kind:30023 event tagt jetzt NIP-32 konform mit
["L","ISO-639-1"] + ["l","de","ISO-639-1"] (default: de).
- validate-post deno-task bekommt --allow-env (yaml-parser brauchts).
Vorbereitung fuer spaetere Mehrsprachigkeit: EN-Versionen koennen via
separate markdown-datei mit lang:en als eigenes event publiziert und
spaeter per a-tag-referenz zum DE-pendant verlinkt werden.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
probleme auf der realen amber-infrastruktur behoben:
1. ohne festen CLIENT_SECRET_HEX erzeugt applesauce bei jedem lauf einen
neuen client-pubkey. amber bindet permissions pro client-pubkey, also
sah jeder lauf wie eine neue unberechtigte app aus und bekam
"no permission" als auto-antwort.
→ CLIENT_SECRET_HEX in config + cli, SimpleSigner.fromKey durchgereicht.
2. applesauce wirft bei "already connected"/"no permission" unhandled
rejections, weil response-promises asynchron reagieren.
→ globaler unhandledrejection-handler, der diese benannten fehler
schluckt; connect() im try/catch mit open+force als fallback.
3. timeout auf bunker connect auf 60s erhöht (amber-pairing kann
menschliches tap dauern beim ersten mal).
einzel-post-publish live verifiziert:
- offenheit-das-wesentliche als kind:30023 publiziert
- alle 5 write-relays haben bestätigt
- bild auf beide blossom-server hochgeladen
- SPA rendert das bild von blossom.edufeed.org
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
runCheck(config) prüft vor jedem publish-run:
- bunker-signer erreichbar und pubkey matcht AUTHOR_PUBKEY_HEX
- kind:10002 outbox-liste enthält mindestens 1 write-relay
- kind:10063 blossom-liste nicht leer, alle server antworten auf
HEAD / (405 wird toleriert — blossom-server erlauben oft kein HEAD)
liefert { ok, issues }. printCheckResult() druckt ✓ oder ✗ + liste.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
processPost(args) orchestriert pro post:
1. frontmatter parsen + validieren
2. draft → skipped-draft
3. bilder sammeln + sequentiell zu blossom hochladen (mapping
dateiname → primary-url)
4. body mit rewriteImageUrls anpassen, coverUrl via resolveCoverUrl
5. kind:30023 event bauen via buildKind30023
6. checkExisting → action = new|update
7. signieren via nip-46
8. publishToRelays, prüfen ob minRelayAcks erreicht
alle externen abhängigkeiten (readPostFile, collectImages, upload,
sign, publish, checkExisting) via PostDeps-interface eingezogen
— einfach mockbar. fehler aller art landen als { status: failed,
error: msg }. 6 tests grün.
follow-up (nicht teil von task 15): license-tag und imeta-tags aus
images[]-frontmatter sind noch nicht im event. kommt in eigenem
folge-task, basierend auf der metadata-convention-spec.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>