Skip to content

Anthropic built Scion for itself. Carbon Forge is yours →

Carbon Forge
Menu

Anleitung

Eine Codeänderung und ihre Dokumentation in einem Changeset landen

Eine Codeänderung und die Seite, die sie dokumentiert, landen im selben Changeset, zusammen oder gar nicht. Diese Anleitung begleitet eine solche Änderung von einer offenen Lane bis zu einer einzigen Landung.

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 entworfen, vor allem Working in lanes und Code and files on the substrate, und das Unternehmen hat sie geprüft; diese deutsche Ausgabe ist eine Übersetzung der englischen Originalanleitung. Jeder Aufruf unten ist das Beispiel der Doku selbst, und Zitate stehen auf Englisch mit der Übersetzung daneben. Wo die Doku eine Frage offenlässt, sagt es der letzte Abschnitt.

Warum ein Changeset

Die Startseite der Doku definiert die Einheit: "A changeset is many writes landed as one: every page, atom, code tree and library entry it names is written in one transaction under one intent, the changeset's intent, or nothing is written" (Welcome to Carbon). (Ein Changeset sind viele Schreibvorgänge, die als einer landen: Jede Seite, jedes Atom, jeder Codebaum und jeder Bibliothekseintrag, den es nennt, wird in einer Transaktion unter einer Absicht geschrieben, der Absicht des Changesets, oder es wird nichts geschrieben.) Code und Prosa sind Entitäten eines Datensatzes, also trifft niemand den neuen Code neben der alten Seite an, und ein Revert nimmt beides zusammen zurück.

Sie brauchen ein Token, das Lanes und Bäume schreiben darf; das Preset SCM agent nennt die Doku für diese Arbeit.

Schritt 1. Prüfen, ob der Trunk geschützt ist

workspaces.get_settings {}
→ { "workspaceId": "…", "trunkProtected": true, "trunkProtectedEntities": false }

"With trunkProtected, code trees, library entries and changesets go through a lane; with trunkProtectedEntities as well, page and atom edits do too." (Mit trunkProtected gehen Codebäume, Bibliothekseinträge und Changesets über eine Lane; ist zusätzlich trunkProtectedEntities gesetzt, auch Änderungen an Seiten und Atomen.) So oder so ist eine Lane hier die richtige Form: Die Doku greift zu ihr, wenn "a change should be seen whole before it lands." (eine Änderung als Ganzes gesehen werden soll, bevor sie landet.)

Schritt 2. Eine Lane für die Änderung öffnen

lanes.create { "label": "agent/7/fix-login" }

Ein Label besteht aus kleingeschriebenen, durch Schrägstriche getrennten Segmenten und ist unter den offenen Lanes eindeutig. "A lane costs nothing to open and holds no copy, so one per task, or one per agent, is the expected use." (Eine Lane kostet beim Öffnen nichts und enthält keine Kopie, also ist eine pro Aufgabe oder pro Agent der vorgesehene Gebrauch.) Übergeben Sie owner, damit nur Sie die Lane schreiben, auflösen und landen können.

Schritt 3. Den Code auf der Lane ändern

trees.apply_patch { "path": "app", "operations": [ { "op": "patch", "entry_path": "src/login.ts", "old_string": "password", "new_string": "magicLink" } ], "intent": "fix: accept magic links", "lane": "agent/7/fix-login" }

Übergeben Sie das Label als lane, und "the write is held on the lane as a patch against the trunk" (der Schreibvorgang wird auf der Lane als Patch gegen den Trunk gehalten): "the trunk is not written." (der Trunk wird nicht geschrieben.) trees.apply_patch sendet nur seine Operationen (eine Ersetzung in einer Datei, ein Schreiben, ein Entfernen oder ein Verschieben); trees.put sendet die ganze Eintragsliste des Baums. So oder so gilt: "the lane keeps only what differs." (die Lane behält nur, was sich unterscheidet.)

Schritt 4. Die dokumentierende Seite auf derselben Lane ändern

pages.apply_patch { "pathOrId": "guides/login", "old_string": "Sign in with a password.", "new_string": "Sign in with a magic link.", "lane": "agent/7/fix-login" }

Dasselbe Label, also wartet die Seitenänderung neben dem Code. Benennt die Änderung auch eine Seite um, nimmt pages.move ebenfalls lane, und "a rename belongs to the change that needs it." (eine Umbenennung gehört zu der Änderung, die sie braucht.) Ein Screenshot kommt genauso mit library.put_at_path und dem Label hinein.

Schritt 5. Lesen, was die Lane ergeben würde

Übergeben Sie dieselbe lane an einen Lesezugriff, und "the answer is the trunk as it stands now with the lane's patches applied, composed on the call" (die Antwort ist der Trunk, wie er jetzt steht, mit den Patches der Lane angewandt, beim Aufruf zusammengesetzt): pages.read für die Seite, trees.get, trees.diff oder trees.grep für den Code. Dann prüfen Sie das Ganze:

lanes.diff { "label": "agent/7/fix-login" }
lanes.get { "label": "agent/7/fix-login" }

lanes.diff antwortet "entity by entity, the trunk's section and the lane's" (Entität für Entität, den Abschnitt des Trunks und den der Lane); lanes.get antwortet mit den Patches, den Konflikten und landable: "open, at least one live patch, no conflict." (offen, mindestens ein lebender Patch, kein Konflikt.) In der App zeigt /<workspace>/lanes/<label> dasselbe, jede geänderte Textdatei als Unified Diff. Wer lanes.export liest und beim Kompositions-Hash freigibt, "has approved exactly that change." (hat genau diese Änderung freigegeben.)

Schritt 6. Konflikte beantworten

Hat inzwischen jemand dieselben Zeilen der Seite oder der Datei auf dem Trunk bearbeitet, steht der Patch im Konflikt, und "nothing merges by itself." (nichts wird von selbst zusammengeführt.) lanes.conflicts liefert den Patch, den Abschnitt, wie er war, den Abschnitt des Trunks jetzt und die Changesets, die ihn verändert haben. Antworten Sie mit lanes.resolve oder verwerfen Sie den Patch mit lanes.drop_patch. Eine Ersetzung in einer Datei "replays on the trunk's current file, so two agents changing different parts of one file both land." (wird auf die aktuelle Datei des Trunks neu angewandt, sodass zwei Agenten, die verschiedene Teile einer Datei ändern, beide landen.)

Schritt 7. Einmal landen, mit einer Absicht

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" }

Führen Sie zuerst den Probelauf aus, dann die Landung. "Every live patch is replayed as one changeset whose intent is lane agent/7/fix-login: fix: accept magic links" (Jeder lebende Patch wird als ein Changeset mit dieser Absicht neu angewandt), in seiner eigenen Transaktion erneut geprüft und "refused whole, with every conflict named, if anything moved." (als Ganzes abgelehnt, mit jedem Konflikt benannt, falls sich etwas bewegt hat.) Beginnen Sie die Absicht mit feat, fix, docs, chore oder revert, dann gruppieren die Release Notes sie unter diesem Wort. Senden Sie einen idempotency_key, und ein erneuter Versuch nach einem Timeout "answers the first landing's result instead of landing twice." (antwortet mit dem Ergebnis der ersten Landung, statt zweimal zu landen.)

Schritt 8. Die Landung zurücklesen

Öffnen Sie /<workspace>/changes/<id>: Dort stehen die ganze Absicht, der Akteur, die Lane, aus der gelandet wurde, das Siegel und die Einträge, Codedatei und Seite zusammen. Blame auf der geänderten Zeile antwortet jetzt mit Ihrer Absicht: trees.blame liefert "each line's revision, changeset, intent, actor and landing lane" (für jede Zeile Revision, Changeset, Absicht, Akteur und Landungs-Lane) (Code and files). Um beides auf einmal rückgängig zu machen, schreibt changesets.revert ein neues Changeset, das jede von der Landung geschriebene Entität wiederherstellt.

Was die Doku nicht beantwortet

Verwandte Anleitungen

Code und Doku zusammen landen.