CommunitySchreiben & Editierengithub.com

readwright

Liest Texte aus E-Books und Dokumenten abschnittsweise aus, anstatt die gesamte Datei in den Kontext zu laden: zuerst eine Gliederung, dann nur die benötigten Kapitel, dann gezielte Suche.

Was ist readwright?

readwright ist ein Kommandozeilentool (in reinem Python ab Version 3.10) für KI-Agenten, das das Auslesen großer E-Books und Dokumente effizient gestaltet. Es vermeidet das Überladen des Kontextfensters, indem es die Arbeit in fünf Schritte unterteilt: Größenbestimmung, Gliederung (Inhaltsverzeichnis mit Wortanzahlen), abschnittsweises Lesen mit zahlreichen Optionen (z. B. Titelauswahl, Maximalwörter, Sprachfilter), Suche (grep mit BM25-Ranking) und abschließende Extraktion in eine temporäre Datei. readwright unterstützt die Formate EPUB, MOBI, AZW3, FB2, DOCX, ODT, RTF, PPTX, XLSX, HTML, EML, CSV, JSON, Markdown und ZIP-Archive nativ, sowie PDF, DOC, XLS und PPT über externe Tools wie poppler, calibre oder LibreOffice, die optional installiert werden können. Dieses Werkzeug eignet sich besonders für Claude Code, Cursor und Codex, um Urheberrechte zu respektieren (kurze Zitate), OCR für gescannte Bücher zu nutzen und wiederholte Boilerplate-Texte zu unterdrücken.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/m4bwav/readwright/tree/HEAD/skills/readwright

Installed? Explore more Schreiben & Editieren skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht readwright?

Ein Roman hat 150.000 bis 300.000 Token. Ihn mit einem Konverter (epr -d, pandoc -t plain, ebook-convert book.txt) auszugeben, füllt den Kontext, bevor die Frage beantwortet wird. readwright gibt dem Agenten ein Inhaltsverzeichnis mit Wortanzahlen, dann die gewählten Abschnitte, dann Suchergebnisse mit Abschnitts- und Absatznummern, sodass nur das gelesen wird, was die Aufgabe braucht – und sonst nichts.

RW unten bedeutet python "<dieser Ordner>/scripts/rw.py" (python3 unter macOS und Linux). Die Startskripte scripts/rw.sh und scripts/rw.ps1 tun dasselbe. Es benötigt Python 3.10 oder neuer und sonst nichts für die eingebauten Formate; RW formats zeigt, welche externen Werkzeuge auf diesem Rechner verfügbar sind.

Schritt 0: Aktualität

Lies evergreen.json. Wenn contradiction gesetzt ist oder das heutige Datum auf oder nach next_due liegt, sag das in einer Zeile, führe die Aufgabe aus und aktualisiere dann (MAINTENANCE.md). Konverter-Versionen und E-Book-Formate ändern sich; das unten beschriebene Verfahren hängt nicht von ihnen ab.

Discord: Ein Live-Kanal ist keine Datei; lies ihn mit everscouts scripts/es_discord.py (dem eigenen, vom Benutzer eingeladenen Bot, everscout kb/discord.md). Ein Kanal-Export, den der Benutzer erstellt hat (JSON oder HTML), wird wie jede andere JSON- oder HTML-Datei hier gelesen.

Schritt 1: Größe bestimmen

Führe RW info DATEI aus. Es gibt das erkannte Format (aus den Bytes der Datei, nicht ihrer Endung), Titel, Autor, Sprache, Anzahl der Abschnitte, Wörter und ungefähre Token (Zeichen geteilt durch 4) aus. Bei unter etwa 6.000 Token (25.000 Zeichen) gibt RW read DATEI den gesamten Text aus, und du kannst hier aufhören.

Wenn info DRM meldet, sag das klar und höre auf. readwright entfernt niemals DRM, und das solltest du auch nicht: Schlage den eigenen Reader des Stores oder eine DRM-freie Kopie vom Verkäufer vor. Wenn es ein fehlendes Werkzeug nennt (pdftotext, calibres ebook-convert, LibreOffice), gib die Installationszeile weiter, die es ausgibt. Installiere niemals etwas ohne die Zustimmung des Benutzers. Bei einem PDF ist oft der eigene Read-Tool des Agenten mit Seitenbereichen der bessere Weg.

Wenn info note: no text layer ausgibt, handelt es sich um Seitenbilder (einen Scan) und readwright hat nichts zu lesen. Nimm die Wege, die der Hinweis in seiner Reihenfolge nennt. Zuerst eine Kopie desselben Buches in einem anderen Format daneben; eine DjVu-Kopie enthält oft OCR-Text. Dann, für ein PDF, RW ocr DATEI: Es rendert die Seiten und führt die in Windows 10 und 11 integrierte OCR aus (oder tesseract, wo installiert), etwa eine Seite pro Sekunde, speichert nach jeweils 25 Seiten und behält den Text in ~/.readwright/ocr/, sodass info, toc, read und grep auf derselben Datei ihn von da an verwenden (--pages N-M für ein paar Seiten, --force zum Wiederholen). Führe ein ganzes Buch im Hintergrund aus. OCR liest einige Buchstaben falsch und hat keine Überschriften, daher sind Abschnitte Seiten; überprüfe ein Zitat anhand eines Seitenbilds. Zuletzt ein paar Seiten, die mit RW page DATEI 1-5 (60 dpi, --dpi, --out-dir) gerendert und mit einem eigenen Bildbetrachter angesehen werden. Frage, bevor du ein OCR-Tool installierst.

Schritt 2: Gliederung

Führe RW toc DATEI aus. Jede Zeile ist N. Titel (Wörter w), eingerückt nach Ebene; --ids fügt die ID jedes Abschnitts hinzu (Datei und Fragment, Seite, Blatt), was du selten brauchst. EPUB-Titel stammen aus der eigenen Navigation des Buches (nav-Dokument oder NCX), DOCX- und ODT-Titel aus Überschriftenformaten, HTML aus h1 bis h3, Klartext und Markdown aus Überschriften oder CHAPTER-Zeilen. Text ohne Struktur wird in Teile von etwa 3.000 Wörtern geschnitten. Bei einem ZIP-Archiv listet toc die Mitglieder auf; füge zu jedem späteren Befehl --member NAME (oder dessen Nummer) hinzu.

Bücher, die jede Kapitelnummer als eigenen, fast leeren Abschnitt auflisten (Packt, manche O'Reilly), werden zusammengefasst angezeigt: Ch. 12: Titel, gedruckt unter der Abschnittsnummer des Titels (der nummernreine Abschnitt ist versteckt, behält aber seine Nummer und kann weiterhin gelesen werden). RW toc DATEI --depth 1 gibt nur die oberste Ebene aus (Teile und Kapitel) mit den Wortanzahlen jeder Zeile, die aus den darunter liegenden Abschnitten summiert sind (--depth 2 fügt die nächste Ebene hinzu; JSON erhält chapter und words_total). Verwende es, um Kapitel zu zählen, anstatt von Hand zu zählen. Ein PDF ohne Gliederung listet einen Abschnitt pro Seite auf; RW toc DATEI --group faltet Seiten, die sich einen Kolumnentitel teilen, zu Seitenbereichen (Kapiteln) zusammen, um sie mit --section 20-40 zu lesen; ohne Kolumnentitel verwendet es das gedruckte Inhaltsverzeichnis, wobei jeder Eintrag eine Titelzeile und dann eine Seitenzahlzeile ist (0.26.0), oder Einträge laufen als Titel ... 21 Nächstes ... 26 weiter (0.35.0), und toc sagt dies in einer Notiz.

Passe die Wörter des Benutzers an toc-Zeilen an. „Kapitel 14“ bedeutet normalerweise die Zeile mit dem Titel VIERZEHNTES KAPITEL, die in vielen E-Books nur den Kapiteltitel und ein Motto enthält: Ihr Textkörper ist der nächste Abschnitt. Die Wortanzahlen zeigen dies (72 Wörter, dann 6.330). Abschnittsnummern sind keine Kapitelnummern: Das Vorspannmaterial kommt zuerst, daher kann Kapitel 16 eines Romans Abschnitt 24 sein.

Schritt 3: Nur das Nötigste lesen

  • RW read DATEI --section 43-44 (auch N, N-, N,M; ein wiederholtes --section summiert sich) oder --title "REGEX" (Groß-/Kleinschreibung egal, passt auf Titel und IDs; wenn nichts passt, werden Leerzeichen ignoriert, daher findet westgate WEST GATE).
  • Wenn --title auf einen Abschnitt unter 300 Wörtern trifft, wird der Abschnitt danach hinzugefügt, und eine Notiz sagt dies. --with-next tut dasselbe für jede Auswahl.
  • Ein Abschnitt, dessen Titel 3 oder mehr Mal im Buch wiederholt wird („Vorbereitung“, „So geht's…“, „Weitere Informationen…“), wird mit der nächstgelegenen markanten Überschrift davor angezeigt, in read-Kopfzeilen und in toc: So geht's... (in: Einen Pfad verfolgen) (in in toc JSON).
  • --max-words N begrenzt jeden ausgewählten Abschnitt auf N Wörter, sodass ein Stapel wie --section 27-58 --max-words 80 klein bleibt; ein abgeschnittener Abschnitt endet mit [cut at N of M words; continue with --section S --offset C].
  • --drop-repeated (read) entfernt kurze Absätze (40 Wörter oder weniger), die in 30 % oder mehr der Abschnitte wörtlich oder mit denselben letzten vier Wörtern wiederkehren, sobald Ziffern gefaltet sind: Bildcredits und Urheberrechtshinweise in EPUBs. Es entfernt auch eine Zeile von acht Wörtern oder weniger, die zehnmal oder mehr innerhalb eines Abschnitts wiederholt wird (ein Viertel seiner Absätze), wie den Rücklink „GEHE ZUR QUELLENANGABE IM TEXT“ nach jeder Endnote. Standardmäßig deaktiviert.
  • --skip-code (read und grep) entfernt Codeblöcke, die durch die Struktur gefunden werden (EPUB und HTML <pre>, eingerücktes Markdown; PDFs haben keine Markierung, daher nicht dort) und sagt, wie viele Wörter entfernt wurden. Hinweiszeilen kommen als eine Zeile am Ende; --quiet entfernt sie.
  • --lang CODE (read und grep, 0.43.0; en, de, es, fr, it, nl, pt) behält die Absätze, deren häufige kurze Wörter diese Sprache bevorzugen, für eine Ausgabe, die mehrere Sprachen nebeneinander druckt. Bindestriche und Fragmente unter 4 Wörtern werden entfernt, außer Überschriften; Code und Tabellen bleiben; durch OCR zusammengeklebte Wörter zählen weiterhin. Die Fußzeile sagt, wie viele entfernt wurden, und --max-chars zählt, was übrig ist. info notiert ein Buch mit vielen Absätzen in zwei oder mehr Sprachen.
  • --headings (read, 0.20.0) gibt nur die Überschriftenabsätze der gewählten Abschnitte aus, eingerückt nach Ebene, jede mit ihrer Absatznummer und den darunter liegenden Wörtern; springe mit --at-para P. Ein Abschnitt ohne Überschriften (ein PDF ohne Struktur) sagt dies: verwende toc --group oder grep.
  • --strip-boilerplate (read und grep) entfernt Zeilen, die auf den Seiten eines PDFs wiederholt werden: Fußzeilen, bloße Seitenzahlen, Kolumnentitel, gefunden daran, wie oft sie wiederholt werden. Verwende es bei beiden Befehlen, damit die Absatznummern von grep mit --at-para übereinstimmen.
  • Jeder Abschnitt beginnt mit einer Kopfzeile: === [43/80] Titel | id ... | Wörter | beginnt bei Wort N von TOTAL (P%) ===.
  • Die Ausgabe stoppt bei --max-chars (Standard 25.000). Der Schnitt endet an einer Absatz-, Zeilen- oder Satzgrenze nahe dem Limit (0.11.1), und die letzte Zeile sagt dann, wo es weitergeht: --offset N. Halte jede Lektüre unter dem Ausgabelimit deines Shell-Tools: Claude Code zeigt 30.000 Zeichen der Ausgabe eines Befehls an und speichert den Rest in einer Datei, die du dann öffnen müsstest. Für zwei lange Kapitel lies sie jeweils in einem Aufruf. Für mehr schreibe die Auswahl mit --out <scratch>/part.txt und öffne sie mit deinem eigenen Read-Tool. Um einem Leseagenten mehrere Kapitel zu übergeben, schreibt --out-dir <scratch>/secs jeden ausgewählten Abschnitt in eine eigene Datei (NNN-title.txt) und listet ihre Größen auf (0.12.0).
  • --section akzeptiert eine Liste und Bereiche in einem Aufruf: --section 61,80,87 oder --section 12,189-190. Abschnitte werden in dieser Reihenfolge ausgegeben, jeder mit seiner eigenen Kopfzeile.
  • Eine kurze Auswahl endet mit einem Hinweis, der den nächsten Abschnitt nennt, wenn dieser Abschnitt wahrscheinlich den Text fortsetzt: Die Auswahl ist eine Titelseite oder ein Motto (unter 60 Wörtern), oder der nächste Abschnitt ist ohne Titel, als Fortsetzung markiert oder wiederholt den Titel (0.15.0; es feuert nicht mehr bei jedem kleinen Unterabschnitt).
  • read ohne Selektor verweigert, wenn der Text über dem Limit liegt (Exitcode 2), und gibt stattdessen das toc aus. Diese Weigerung ist die Funktionsweise des Tools: Wähle Abschnitte aus.
  • --format md behält Überschriften und Listen als Markdown; --out DATEI schreibt die Auswahl in eine Datei; mit --max-chars schneidet es an einer sauberen Grenze und gibt cut at chars A-B of N; write the rest with --offset B aus (0.15.1). --compact entfernt die Leerzeile zwischen Absätzen (0.13.0); gib es erneut mit --offset an.

Schritt 4: Suche

RW grep DATEI "MUSTER" -C 1 --max 5 gibt jeden passenden Absatz mit seiner Abschnittsnummer und seinem Titel, Absatznummer und einem Absatz Kontext auf jeder Seite aus. Lange Absätze werden um die Übereinstimmung herum gekürzt (--width). --after N (-A N) fügt N Absätze nach jedem Treffer hinzu, angezeigt bis --width mit ihren Zeilenumbrüchen: der Codeblock oder die Liste, die dem Satz folgt, der sie benennt (0.15.0). Ein Muster ohne Großbuchstaben passt in jeder Schreibweise (--case-sensitive erzwingt genaue Schreibweise, -i erzwingt beliebige Schreibweise), und -F akzeptiert einen einfachen String; --count gibt Treffer pro Abschnitt aus, der schnellste Weg, um herauszufinden, wo eine Figur oder ein Begriff vorkommt. Jede Trefferzeile endet mit | offset N, dem Zeichenoffset, bei dem read --section S --offset N beginnt; read --section S --at-para P beginnt bei einem Absatz. Verwende sie, wenn toc einen riesigen Abschnitt vermerkt (Lesezeichen, die früh enden); seit 0.17.0 wird ein solcher Abschnitt zuerst an den Kapiteln geschnitten, die ein gedrucktes Inhaltsverzeichnis oder eine Liste „Kapitel N, Titel“ nennt, sodass der Hinweis nur erscheint, wenn dies fehlschlägt. Exitcode 1 bedeutet keine Übereinstimmung. Suche, bevor du liest, wenn der Benutzer fragt, wo oder ob etwas erwähnt wird.

RW rank DATEI Themenwörter (0.24.0) ordnet Abschnitte nach BM25 für ein paar Themenwörter und gibt Punktzahl, Wörter und die Begriffe aus, die jeder enthält: welcher Abschnitt zuerst gelesen werden soll, wo grep Treffer in Buchreihenfolge ausgibt. Stoppwörter und Plural-, -ed- und -ing-Endungen werden gefaltet, sodass shingles shingling findet; ein Wort, das nicht im Buch vorkommt, wird genannt. --paras ordnet Absätze (Überschriftenzeilen gewinnen oft: lies von dort), --top N, --section, --k1 und --b wie in BM25. Ordne zuerst bei einem langen Buch, dann grep innerhalb der besten Abschnitte.

Schritt 5: Gesamtes Buch in eine temporäre Datei

Für Arbeiten, die mehrere Durchläufe durch ein langes Buch erfordern (jede Szene mit einer Figur, ein Zeitstrahl), führe einmal RW dump DATEI --out <scratch>/buch.txt aus. Verwende dann deine eigenen Such- und Lesewerkzeuge auf dieser Datei, niemals cat. Abschnittsmarkierungen sind Zeilen, die mit === [N/ beginnen; --format md schreibt <!-- readwright section N/... -->-Kommentare mit Markdown-Überschriften. Dump schreibt nur dann auf stdout, wenn der Text unter 25.000 Zeichen liegt. Lege die Datei im Scratch- oder Temp-Ordner der Sitzung ab, niemals im Repository des Benutzers.

Schritt 6: Antworten

Zitiere kurz. Bei einem urheberrechtlich geschützten Buch fasse zusammen und zitiere immer nur ein oder zwei Sätze auf einmal, niemals ganze Seiten oder Kapitel, selbst wenn der Benutzer das Exemplar besitzt. Gib an, woher jeder Punkt stammt (Abschnittsnummer und -titel), damit der Benutzer es überprüfen kann. Wenn ein Konverterhinweis ausgegeben wurde (calibre, LibreOffice, pdftotext), erwähne, dass der Text durch einen Konverter gekommen ist, wenn die Formulierung von Bedeutung ist.

Ein Buch destillieren

  • Aufbauend auf den Notizen einer früheren Lektüre: grep zwei oder drei der Passagen, die sie zitieren, bevor du sie wiederverwendest, und lies ein Kapitel, das die Notizen übersprungen haben, damit die neue Zusammenstellung etwas hinzufügt und keinen kopierten Fehler enthält.
  • Eine toc-Zeile mit (0 w) neben Geschwistern auf derselben Seite bedeutet, dass ihr Text in einem Nachbarn gelandet ist: lies die gesamte Gruppe mit --section N-M. Praxisbücher geben Rahmen- oder Ebenentoleranzen als Erfahrung an; zitiere sie als die des Autors, nicht als gemessen.
  • Suche eine Studie, die der Autor für eine starke Behauptung zitiert, und notiere ihre Grenzen. Ein populäres Buch kann sie weglassen: Eines berichtete einen Geschlechterunterschied, ohne zu sagen, dass die Studie ihn nur in einem Teil der Altersspanne gefunden hat.

Ein breites Nachschlagewerk, das bereits für ein anderes Fach gelesen wurde: überprüfe, worauf die früheren Notizen für dein Fach abzielten, lies dann die Kapitel zu deiner eigenen Aufgabe, die sie übersprungen haben (ein Bewertungsanhang, die Analyse-Kapitel), aufgeteilt nach Art auf zwei Leseagenten.

Ein Film- oder Rundfunklehrbuch, das erneut für ein Ton- oder Schnittthema gelesen wird: die früheren Notizen haben normalerweise die Theoriekapitel übernommen; gehe zu den Schnitt- und Premix-Abschnitten (Spur-Layout, Stems, Szenenübergänge), die die Arbeitsregeln enthalten. Lies die ausgewählten Abschnitte in einem Aufruf, read --section 248,250,251, nicht einen Aufruf pro Abschnitt.

Ein gescanntes Praxisbuch, das per OCR gelesen wurde (ein Abschnitt pro Seite): toc --chapters gibt die Kapitelseitenbereiche; dann grep die Wörter des Themas mit --section N-M innerhalb der gewünschten Kapitel und lies nur die Seiten mit Treffern, da die meisten Seiten Anekdoten und alte Ausrüstung sind.

Ein flacher PDF-Abschnitt mit nummerierten oder in Großbuchstaben geschriebenen Überschriften: read --headings listet sie auf, dann springt --at-para zu der gewünschten.

Ein PDF, dessen Lesezeichen bei den Teilen enden (toc warnt, dass ein Abschnitt einen großen Teil des Textes enthält): read --section N --headings auf jedem großen Abschnitt gibt die tatsächliche Kapitelkarte mit Absatznummern für --at-para.

Ein herausgegebenes Handbuch: lies zuerst die Einleitung des Herausgebers, da sie sagt, welches Kapitel was abdeckt, dann nur die Anfänge dieser Kapitel und jeden Absatz zur Methode. Jedes Kapitel hat seine eigenen Autoren, also zitiere das Kapitel und bewerte es allein.

Eine Anleitung aus einem benachbarten Handwerk (Theaterton für Spiel-Effekte gelesen): überspringe die Personen und die Veranstaltungsort-Hardware, lies die Kapitel zur Herstellung des Materials und grep die Wörter des Jobs über den Rest. Text wie mu?ed kann in der Verlagsdatei sein; überprüfe die Quelle, bevor du den Leser beschuldigst.

Ein langer Geschichtsüberblick: überspringe die Instrumentenkapitel. Grep die Methodenwörter, lies die Kapitel dazu, die Schlussfolgerung und jede Passage, in der der Autor urteilt.

…

Readwright macht große Bücher lesbar, indem es den Agenten zwingt, sie zu gliedern, anstatt sie auszuschütten. Der Agent spart Kontext, der Benutzer bekommt eine zitierte Antwort, und das Buch wird nicht in einen Token-Eimer verwandelt.

Verwandte Skills