Auch auf: English, Español, Português, 日本語, Français, 한국어, 简体中文, Italiano, हिन्दी · Alle Anleitungen auf Deutsch
Offenlegung: Wir entwickeln Carbon Forge bei 100monkeys.ai, lesen Sie dies also als Bericht des Herstellers. Einer unserer KI-Agenten hat diese Anleitung aus der öffentlichen Doku (auf Englisch) entworfen, vor allem den Schritten 6 bis 8 von Working in lanes und der Katalogseite Lanes, und das Unternehmen hat sie geprüft; diese deutsche Ausgabe ist eine Übersetzung der englischen Originalanleitung. Jeder Aufruf ist das eigene Beispiel der Doku; Zitate bleiben auf Englisch, mit der Übersetzung daneben. Wo die Doku eine Frage offen lässt, sagt es der letzte Abschnitt.
Schritt 1. Wissen, was als Konflikt zählt
Eine Lane ist eine Menge von Patches über dem Trunk, und jeder Lesezugriff auf sie setzt den Trunk, wie er jetzt steht, mit diesen Patches zusammen. Ein Patch ist im Konflikt, "when it no longer applies to the trunk: its old text no longer matches or matches twice" (wenn er nicht mehr auf den Trunk passt: sein alter Text passt nicht mehr oder passt zweimal), oder wenn der Trunk einen Baum- oder Bibliothekseintrag geändert hat, den der Patch ersetzt hat. Ein Patch, der noch passt, ist kein Konflikt, selbst wenn der Trunk denselben Abschnitt geändert hat; der Lesezugriff meldet ihn als verschobenen Abschnitt, "worth a reviewer's look, not a conflict." (einen Blick beim Review wert, kein Konflikt.) Zwei Agenten, die verschiedene Teile einer Datei ändern, landen beide. Und die Regel, der der Rest dieser Anleitung folgt: "Nothing merges by itself." (Nichts merged von selbst.)
Schritt 2. Bemerken, dass eine Lane im Konflikt ist
lanes.get liefert landable, das nur für eine offene Lane mit mindestens einem lebenden Patch und ohne Konflikt wahr ist. In der App hat die Seite der Lane unter /<workspace>/lanes/<label> einen Tab Conflicts. Ohne Polling nennt ein Webhook-Ereignis lane.conflict die Lane und die Pfade ihrer Konfliktzeilen, sobald eine Landung auf dem Trunk sie zum ersten Mal in Konflikt bringt.
Schritt 3. Den Konflikt lesen
lanes.conflicts { "label": "agent/7/fix-login" } Jede Zeile trägt, was jemand zum Zusammenführen braucht: den Patch; den Abschnitt, wie er stand, als der Patch genommen wurde; den Abschnitt des Trunks jetzt; die zusammengesetzte Sicht der Lane; und die Changesets, die ihn bewegt haben, jedes mit Intent, Akteur und der Lane, die es gelandet hat. Für einen Code-Baum fügt die Zeile ein Unified Diff jeder Konfliktdatei hinzu und, für eine Sprache mit Grammatik, eine beratende Liste der abweichenden Top-Level-Definitionen, die "decides nothing" (nichts entscheidet). Das Werkzeug liest nur und braucht nur die Rolle Viewer. In der App zeigt der Tab Conflicts den Trunk-Text und den Lane-Text mit dem genauen Aufruf, um jeden zu beantworten, "ready to copy, while the page itself decides nothing." (bereit zum Kopieren, während die Seite selbst nichts entscheidet.)
Schritt 4. Einen Textkonflikt beantworten
lanes.resolve { "patch_id": "…", "note": "kept both sign-in options", "old_string": "…", "new_string": "…" } Die Antwort ist ein neuer Patch mit einer Notiz von 1 bis 1.024 Zeichen, die sagt, warum. Er wird "matched against the trunk as it stands now and bound to the hash of that state." (gegen den Trunk, wie er jetzt steht, abgeglichen und an den Hash dieses Stands gebunden.) Der alte Patch bleibt als Verlauf erhalten, markiert als superseded. Ein Baumkonflikt wird genauso mit upserts, removals oder patches beantwortet, ein Bibliothekseintrag mit einem sha256. Antworten Sie der Reihe nach: Ein späterer Patch auf derselben Entität wartet, bis der frühere gelöst ist.
Schritt 5. Oder den Patch verwerfen
lanes.drop_patch { "patch_id": "…" } Wenn der Trunk schon getan hat, was der Patch tun sollte, oder der Patch nicht mehr gewollt ist, verwerfen Sie ihn stattdessen. Wo die Entität, gegen die der Patch genommen wurde, nicht mehr existiert, sagt die Ablehnung der Doku, den Patch zu verwerfen statt ihn zu lösen.
Schritt 6. Einen Verschiebekonflikt beantworten
lanes.resolve { "patch_id": "…", "note": "kept the trunk's rename and moved on from it", "to_path": "guides/sign-in" } Eine Lane, die eine Seite umbenennt, gerät in Konflikt, wenn der Trunk dieselbe Seite seitdem verschoben hat, wenn der Trunk jetzt den neuen Pfad hält oder wenn die Seite weg ist. Antworten Sie mit to_path und, wo sich der Titel ändern soll, mit title. Die Lösung ist an den Pfad gebunden, den der Trunk jetzt hält; eine spätere Verschiebung auf dem Trunk macht sie also ebenfalls veraltet.
Schritt 7. Konflikte in zusammengeführter Arbeit beantworten
lanes.merge { "from": "agent/8/tests", "into": "agent/7/fix-login", "intent": "assemble the login fix" } Ein leitender Agent sammelt die Lanes mehrerer Agenten vor dem Landen in einer. Ein so mitgenommener Patch gerät dort in Konflikt, wo die empfangende Lane geändert hat, was er ändert, und lanes.conflicts nennt als moved_by die früheren Patches der empfangenden Lane, auf denen er jetzt steht. Seine Lösung beantwortet die Sicht der empfangenden Lane, nicht den Trunk allein.
Schritt 8. Landen, zuerst mit einem Probelauf
lanes.land { "label": "agent/7/fix-login", "intent": "fix: accept magic links", "dry_run": true }
lanes.land { "label": "agent/7/fix-login", "intent": "fix: accept magic links" } Die Landung wird in ihrer eigenen Transaktion erneut geprüft und als Ganzes abgelehnt, jeder Konflikt benannt, wenn sich etwas bewegt hat. Eine Lösung beantwortet genau einen Stand des Trunks; bewegt der Trunk diesen Abschnitt vor der Landung, wird die Lösung veraltet und die Landung abgelehnt mit:
resolution <id> was resolved against <hash>; the trunk's section is now <hash> Lesen Sie dann lanes.conflicts erneut und beantworten Sie den frischen Stand. Auf einem geschützten Trunk mit Landing-Regeln gilt: Jede Lösung nach den Freigaben lässt diese "count for nothing" (nichts mehr zählen), die Freigabe kommt also nach der letzten Antwort. Senden Sie die Landung mit einem idempotency_key, dann liefert ein Wiederholungsversuch nach einem Timeout das Ergebnis der ersten Landung, statt zweimal zu landen.
Für eine Lane, die eine Codeänderung und ihre Dokumentation zusammen trägt, lesen Sie unsere Anleitung Eine Codeänderung und ihre Dokumentation in einem Changeset landen.
Was die Doku offen lässt
- Was zu tun ist, wenn sich der Basisabschnitt nicht wiederherstellen lässt. Die Konfliktzeile geht dafür höchstens 200 Revisionen zurück und meldet sonst
unknown; die Doku sagt nicht, wie man von dort aus antwortet. - Was die Landung mit
dry_runliefert. Die Anleitung zeigt den Aufruf, aber nicht seine Antwort. - Was das Ereignis
lane.conflictüber die Lane und die Pfade hinaus enthält.