Versionierung von KI-Arbeit
Menschen, die iterativ mit KI arbeiten, verlieren gute Versionen: Eine Neuerstellung überschreibt sie, ein Rückgängigmachen geht zu weit oder das Gespräch driftet ab. Dieses Skill macht jede Änderung zu einer nummerierten Version, die bleibt, bis der Nutzer sie löscht, sodass er jeden früheren Zustand einsehen, vergleichen und wiederherstellen kann.
Die drei Regeln
- Jede Änderung erhält eine Version. Eine Nutzeranfrage, die Dateien ändert, ist eine Version, die am Ende dieses Bearbeitungsschritts gespeichert wird, bevor du antwortest. Das Speichern pro Anfrage (nicht pro Dateibearbeitung) hält den Verlauf lesbar.
- Zurückgehen löscht niemals eine Version. Nur das Skript schreibt in
.ai-versions/. Bearbeite, verschiebe oder lösche dort niemals etwas, selbst wenn der Nutzer um Aufräumen bittet. Verweise den Nutzer stattdessen aufbackup. - Zurückgehen ist eine neue Version. Stelle mit dem Skript wieder her; baue niemals alte Arbeit aus dem Gedächtnis neu auf. Eine Wiederherstellung wird als neue Version gespeichert, sodass auch sie rückgängig gemacht werden kann.
Das Skript wählt jede Versionsnummer aus. Rate niemals eine; gib die Nummer aus, die es ausgibt.
Wähle den Modus einmal pro Projekt
- Du kannst Befehle ausführen und Dateien bearbeiten (Claude Code, Cursor, Codex, Windsurf, Copilot, Gemini CLI, Replit Agent, claude.ai mit Code-Ausführung): Verwende den Dateimodus unten.
- Das Projekt hat
.github/workflows/ai-versions.yml: Es verwendet die GitHub-Versionsebene. Führeinitnicht aus. Überschreibe stattdessen bei jeder Änderung.ai-versions/pending.json, und schreibe zum Zurückgehen.ai-versions/restore.json. Beides wird in assets/rules/github-layer-rules.md beschrieben. - Du kannst keine Befehle ausführen (ein reiner Chat): Folge references/chat-mode.md.
- Der Nutzer arbeitet in Lovable, Bolt oder v0 (Bolt und v0 sind in Beta: noch nicht live getestet) oder Figma Make und fragt nach der Versionierung dort: Lies references/app-builders.md.
Dateimodus
Das Skript ist scripts/aiv.py im Ordner dieses Skills (dem Ordner, der diese SKILL.md enthält). Rufe es mit seinem vollständigen Pfad auf und weise mit --root auf das Projekt:
python3 "<Ordner dieses Skills>/scripts/aiv.py" --root "<Projektordner>" <Befehl>
# Windows: py statt python3
Nach init hat jedes Projekt auch eine eigene Kopie, sodass im Projektordner python3 .ai-versions/aiv.py <Befehl> genauso funktioniert. Im Folgenden steht aiv für beide Formen. Wenn Python nicht installiert ist, teile dem Nutzer mit, dass es benötigt wird (python.org), und verwende bis dahin den Chat-Modus.
Start
Führe vor deiner ersten Bearbeitung in einem Projekt ohne .ai-versions/ init aus. Es speichert die aktuellen Dateien als v1.0.0, sodass der Nutzer jederzeit zum Zustand vor deiner Bearbeitung zurückkehren kann.
Wenn der Ordner mehr als das Projekt enthält (eine Sandbox, ein Home-Ordner, ein Downloads-Ordner), grenze ihn ein: init --only poster.html assets/. init lehnt Ordner mit über 5.000 Dateien ab, da das normalerweise auf den falschen Ordner hindeutet.
Nach jeder Änderung
aiv save --bump minor --summary "Preisbereich mit 3 Plänen hinzugefügt" \
--reason "Neuer Abschnitt; Layout und Stil unverändert" --prompt "Preise mit 3 Plänen hinzufügen"
--bump | Dem Nutzer angezeigt als | Wann |
|---|---|---|
patch | Kleine Anpassung | Gleiche Funktionen, kleine Anpassung: Text, Farbe, Abstand, Größe, eine kleine Korrektur |
minor | Neue Funktion | Etwas Neues, gleiche Richtung: ein Abschnitt, eine Seite, eine Komponente, ein Feature |
major | Große Änderung | Die Richtung hat sich geändert: Neugestaltung, neues Layout, neues Stilsystem, Entfernen einer Funktion |
Eine Anfrage mit mehreren Änderungen erhält die höchste Stufe. Bei Unsicherheit zwischen zwei Stufen: Nimm die niedrigere und erwähne dies in --reason. Randfälle (Dokumente, Refactorings, Inhaltsaktualisierungen) sind in references/bump-levels.md.
Schreibe --summary für den Nutzer, nicht für einen Entwickler: "Hero-Bild vergrößert", nicht "Hero.tsx aktualisieren". Setze die Anfrage des Nutzers, auf eine Zeile gekürzt, in --prompt.
Beende dann deine Antwort mit einer Zeile, zum Beispiel: Gespeichert v1.3.0 (Neue Funktion): Preisbereich mit 3 Plänen hinzugefügt.
Wenn save sagt, dass die Dateien exakt mit einer älteren Version übereinstimmen, zeichnet es den Speichervorgang als Rückkehr zu dieser Version auf. Teile dem Nutzer mit, dass dies passiert ist.
Wenn der Nutzer fragt
| Der Nutzer sagt | Führe aus | Dann |
|---|---|---|
| "Versionen anzeigen", "Verlauf" | list | Zeige eine kurze Tabelle. Für eine visuelle Zeitleiste führe view aus und teile die HTML-Datei, die es erstellt. |
| "Was hat sich in v1.3.0 geändert" | diff v1.3.0^ v1.3.0 | Erkläre in einfachen Worten. vX^ bedeutet die Version vor vX. |
| "Vergleiche v1.2 und v2.0" | diff v1.2.0 v2.0.0 --stat, dann ohne --stat für Details | Sage, was sich geändert hat, was besser wurde, was schlechter wurde. Wenn du die Arbeit rendern kannst (HTML, Bilder), zeige beide nebeneinander. |
| "Geh zurück zu v1.2.0", "Mach das rückgängig" | restore v1.2.0 oder restore prev für Rückgängig | Führe dann den Schritt unten aus. |
| "Nur den alten Header zurückbringen", "Altes Design, aber den neuen Text behalten" | restore v1.2.0 --path <dateien> | Nur diese Dateien ändern sich; es wird als Kleine Anpassung gespeichert. |
| "Andere Richtung ab v1.2.0 versuchen" | restore v1.2.0 | Mache dann die neue Änderung und speichere sie wie gewohnt. |
| "Was ist die aktuelle Version", "Gibt es ungespeicherte Änderungen" | status | |
| "Gib mir v1.2.0 als Dateien" | export v1.2.0 --out v1.2.0.zip | |
| "Führe dies in einem anderen Chat oder Tool fort" | backup --out history.zip | Am neuen Ort: import history.zip. |
Wenn der Nutzer eine Version vage benennt ("die Blaue", "vor dem Redesign"), führe list aus und gleiche die Zusammenfassungen ab. Wenn zwei Versionen passen, frage nach.
Nach dem Zurückgehen
Eine vollständige Wiederherstellung setzt alle Projektdateien in den ursprünglichen Zustand zurück, einschließlich Dateien, die der Nutzer möglicherweise nicht als Teil der Arbeit betrachtet, wie Notizen oder Daten. Teile dem Nutzer mit, welche Dateien sich geändert haben (das Skript listet sie auf). Wenn es zuerst ungespeicherte Arbeit gespeichert hat, sage, welche Version sie enthält, und biete an, bestimmte Dateien mit restore <diese Version> --path <datei> zurückzubringen. Wenn die Anfrage eindeutig nur einen Teil des Projekts betrifft ("die alten Farben"), verwende von Anfang an --path.
Führe handoff <wiederhergestellte Version> aus und behandle dessen Ausgabe als aktuelle Wahrheit, bevor du die nächste Änderung vornimmst. Es listet nur die Entscheidungen auf, die zu dieser Version geführt haben, und benennt die verworfenen, damit Anweisungen aus aufgegebenen Richtungen nicht zurückkriechen. Wenn die Unterhaltung lang ist, biete an, in einem neuen Chat fortzufahren, und gib dem Nutzer den Handoff-Text zum Einfügen dort.
Sicherheitsnetz für vergessene Speicherungen
Biete in Claude Code oder Cursor dies einmal pro Projekt an: install-hooks claude-code oder install-hooks cursor. Es fügt einen Hook hinzu, der jede vergessene Änderung als Kleine Anpassung speichert, wenn du fertig bist. Installiere es nur, nachdem der Nutzer zugestimmt hat, da es in seine Tool-Einstellungen schreibt.
Über Versionen sprechen
Verwende die Worte des Nutzers: Kleine Anpassung, Neue Funktion, Große Änderung, Zurückgegangen. Erwähne Versionsnummern, nicht Commits, Dateien in .ai-versions/ oder Hashes. Toolspezifische Hinweise (claude.ai, Replit, Windows) sind in references/tools.md.
Wenn ein Nutzer zurückgeht, erinnere ihn einmal daran, dass nur Dateien zurückkommen: Datenbankzeilen und andere Live-Daten bleiben wie sie sind.
Alle Befehle
| Befehl | Was es tut |
|---|---|
init [--only PFAD...] | Starte den Verlauf und speichere v1.0.0 |
save --bump B --summary S [--reason R] [--prompt P] | Speichere die aktuellen Dateien als neue Version |
status | Aktuelle Version und ungespeicherte Änderungen |
list [--all] [--json] | Versionen, neueste zuerst |
show V | Details einer Version und geänderte Dateien |
diff [A] [B] [--stat] [--path P...] | Keine Argumente: ungespeicherte Änderungen. Eins: A bis zur neuesten. Zwei: A bis B |
restore V [--path P...] [--note N] | Gehe zurück (alle Dateien oder nur einige); speichert zuerst ungespeicherte Arbeit, dann die Wiederherstellung als neue Version |
handoff [V] | Sauberer Kontext für die Fortsetzung ab V |
view [--out DATEI] | HTML-Zeitleiste aller Versionen |
export V --out VERZ_ODER_ZIP | Die Dateien einer Version |
backup --out DATEI.zip / import DATEI.zip | Verschiebe den gesamten Verlauf |
| `install-hooks claude-code | cursor` |
setup-github [--with-pill] | Füge die GitHub-Ebene zu einem App-Builder-Repository hinzu |
doctor | Überprüfe den Verlauf auf fehlende Teile |
Versionen können geschrieben werden als v1.2.0, 1.2.0, latest, prev oder v1.2.0^.