Anche in: English, Español, Português, 日本語, Deutsch, Français, 한국어, 简体中文, हिन्दी · Tutte le guide in italiano
Trasparenza: Carbon Forge è sviluppato da noi di 100monkeys.ai, quindi leggete questa guida come il resoconto di chi lo costruisce. L'ha scritta in bozza uno dei nostri agenti di IA a partire dalla documentazione pubblica (in inglese), soprattutto i passi da 6 a 8 di Working in lanes e la pagina di catalogo Lanes, e l'azienda l'ha rivista; questa edizione italiana è una traduzione della guida originale in inglese. Ogni chiamata è l'esempio della documentazione stessa, e le citazioni sono in inglese con la traduzione accanto. Dove la documentazione lascia una domanda aperta, l'ultima sezione lo dice.
Sapere cosa conta come conflitto
Una lane è un insieme di patch sopra il trunk, e ogni lettura su di essa compone il trunk com'è adesso con quelle patch. Una patch è in conflitto "when it no longer applies to the trunk: its old text no longer matches or matches twice" (quando non si applica più al trunk: il suo vecchio testo non corrisponde più, o corrisponde due volte), oppure quando il trunk ha cambiato una voce di albero o di libreria che la patch sostituiva. Una patch che si applica ancora non è un conflitto anche se il trunk ha cambiato la stessa sezione; la lettura la segnala come sezione spostata, "worth a reviewer's look, not a conflict." (merita uno sguardo di chi rivede, non è un conflitto). Due agenti che cambiano parti diverse dello stesso file vengono integrati entrambi. E la regola che segue il resto della guida: "Nothing merges by itself." (niente si unisce da solo).
Accorgersi che una lane è in conflitto
lanes.get restituisce landable, che è vero solo per una lane aperta con almeno una patch viva e nessun conflitto. Nell'app, la pagina della lane in /<workspace>/lanes/<label> ha una scheda Conflicts. Senza interrogare di continuo, un evento webhook lane.conflict indica la lane e i percorsi delle sue righe in conflitto quando un'integrazione sul trunk la mette in conflitto per la prima volta.
Leggere il conflitto
lanes.conflicts { "label": "agent/7/fix-login" } Ogni riga porta ciò che serve a chi unisce: la patch; la sezione com'era quando la patch è stata presa; la sezione del trunk adesso; la vista composta della lane; e i changeset che l'hanno spostata, ciascuno con intent, autore e la lane che l'ha integrato. Per un albero di codice la riga aggiunge un diff unificato di ogni file in conflitto e, per un linguaggio con grammatica, un elenco indicativo delle definizioni di primo livello che differiscono, che "decides nothing" (non decide nulla). Lo strumento è in sola lettura e richiede solo il ruolo viewer. Nell'app, la scheda Conflicts mostra il testo del trunk e quello della lane con la chiamata esatta per rispondere a ciascuno, "ready to copy, while the page itself decides nothing." (pronta da copiare, mentre la pagina in sé non decide nulla).
Rispondere a un conflitto di testo
lanes.resolve { "patch_id": "…", "note": "kept both sign-in options", "old_string": "…", "new_string": "…" } La risposta è una nuova patch con una nota da 1 a 1.024 caratteri che dice perché. Viene "matched against the trunk as it stands now and bound to the hash of that state." (confrontata con il trunk com'è adesso e legata all'hash di quello stato). La vecchia patch resta come cronologia, marcata superseded. A un conflitto di albero si risponde allo stesso modo con upserts, removals o patches, e a una voce di libreria con uno sha256. Rispondete in ordine: una patch successiva sulla stessa entità aspetta che la precedente sia risolta.
Oppure scartare la patch
lanes.drop_patch { "patch_id": "…" } Quando il trunk ha già fatto ciò che la patch voleva fare, o la patch non serve più, scartatela. Dove l'entità su cui la patch era stata presa non c'è più, il rifiuto della documentazione dice di scartare la patch invece di risolverla.
Rispondere a un conflitto di spostamento
lanes.resolve { "patch_id": "…", "note": "kept the trunk's rename and moved on from it", "to_path": "guides/sign-in" } Una lane che rinomina una pagina va in conflitto quando il trunk ha nel frattempo spostato la stessa pagina, quando il trunk occupa ora il nuovo percorso, o quando la pagina non c'è più. Rispondete con to_path, e con title dove il titolo deve cambiare. La risoluzione è legata al percorso che il trunk ha adesso, quindi anche uno spostamento successivo del trunk la rende obsoleta.
Rispondere ai conflitti nel lavoro assemblato
lanes.merge { "from": "agent/8/tests", "into": "agent/7/fix-login", "intent": "assemble the login fix" } Un agente capo raccoglie le lane di più agenti in una sola prima di integrare. Una patch portata così va in conflitto dove la lane che la riceve ha cambiato ciò che essa cambia, e lanes.conflicts indica, come moved_by, le patch precedenti della lane ricevente su cui ora poggia. La sua risoluzione risponde alla vista della lane ricevente, non al solo trunk.
Integrare, prima con un dry run
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" } L'integrazione viene ricontrollata dentro la sua transazione e rifiutata per intero, con ogni conflitto nominato, se qualcosa si è spostato. Una risoluzione risponde a uno stato esatto del trunk; se il trunk sposta quella sezione prima dell'integrazione, la risoluzione diventa obsoleta e l'integrazione viene rifiutata con:
resolution <id> was resolved against <hash>; the trunk's section is now <hash> Allora rileggete lanes.conflicts e rispondete allo stato nuovo. Su un trunk protetto con regole di integrazione, ricordate che qualsiasi risoluzione dopo le approvazioni le fa "count for nothing" (valere nulla), quindi l'approvazione viene dopo l'ultima risposta. Inviate l'integrazione con una idempotency_key, e un nuovo tentativo dopo un timeout restituisce il risultato della prima integrazione invece di integrare due volte.
Per una lane che porta insieme una modifica al codice e la sua documentazione, leggete la nostra guida Integrare una modifica al codice e la sua documentazione in un solo changeset.
Cosa lascia senza risposta la documentazione
- Cosa fare quando la sezione di base non si può recuperare. La riga di conflitto risale al massimo di 200 revisioni per trovarla, altrimenti segnala
unknown; la documentazione non dice come rispondere da lì. - Cosa restituisce l'integrazione con
dry_run. La guida mostra la chiamata ma non la risposta. - Cosa porta l'evento
lane.conflictoltre alla lane e ai percorsi.