Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Osobní vrstva nemění nic sdíleného: kryje ji vlastní exclude soubor gitu, kontroluje se tam, kde se nárokuje, a týmu se předává jedním příkazem

Osobní vrstva nemění nic sdíleného: kryje ji vlastní exclude soubor gitu, kontroluje se tam, kde se nárokuje, a týmu se předává jedním příkazem

majordomus://adr/adr-0145navrženo architekturadistributionadopceobjevovánívynucování

odkazuje na

  • put_in_force apps/majordomus-cli/src/app.rs (soubor)
  • put_in_force apps/majordomus-cli/src/discovery/mod.rs (soubor)
  • put_in_force share/install/install.sh.in (soubor)
  • put_in_force adr-0005
  • put_in_force adr-0019
  • put_in_force adr-0027
  • put_in_force lib/capture.sh (implementace)
  • put_in_force lib/common.sh (implementace)
  • put_in_force lib/doctor.sh (implementace)
  • put_in_force lib/init.sh (implementace)
  • put_in_force lib/update.sh (implementace)
  • put_in_force test/cases/2979_a_personal_layer_changes_nothing_shared.sh (test)

odkazuje na něj

Nic ve vrstvě to nejmenuje. Zpětné odkazy se odvozují, takže prázdný seznam je odpověď, ne opomenutí.

145. Osobní vrstva nemění nic sdíleného: pokrývá ji vlastní exclude soubor gitu, kontroluje se tam, kde se nárokuje, a týmu se předává jedním příkazem

Kontext

majordomus init vytváří vrstvu, kterou repozitář vlastní. Její sledovaná polovina, .ai/repo/, je určena k commitu; řádek, který drží lokální polovinu mimo, je zapsán do sledovaného .gitignore; update zapisuje AGENTS.md, CLAUDE.md a GEMINI.md v kořeni; a doctor selhává, dokud README.md nejmenuje AGENTS.md. Každé z toho je změna toho, co sdílí celý tým.

To je správný způsob, jak nástroj adoptovat jako tým, a špatný jako jediný způsob, jak se s ním seznámit. Týmové rozhodnutí si zaslouží důkazy a důkazy plynou z používání. Vývojář, který chce nástroj vyzkoušet na skutečné práci — v repozitáři týmu, klienta nebo open-source projektu — musel měnit sdílené soubory, čímž se osobní zkouška změnila v návrh dřív, než bylo co navrhovat. Obejitím byl ručně psaný exclude soubor, který nic neověřovalo, mimo který zapisovaly update i capture install a skrz který program v Rustu nemohl číst: zjišťování se ptá gitu na sledované soubory, takže nesledovaná vrstva je vrstva bez souborů (--discovery filesystem existovalo a nic ho nepředávalo).

Rozhodnutí

  1. Personal je způsob instalace, ne druhé rozložení. majordomus init --personal vytvoří stejné soubory, jaké vytvoří obyčejný init, na stejných místech. Liší se to, čí jsou. Nic se nepřesouvá, takže každý příkaz, cesta a dokument znamená to, co dřív, a co se člověk naučí v personal módu, je to, co by dostal tým.

  2. Krytím je vlastní exclude soubor gitu. Vrstva je kryta ukotveným vzorem v $GIT_COMMON_DIR/info/exclude, uvnitř označeného bloku, přičemž všechny ostatní řádky souboru zůstávají nedotčeny. Git tento soubor nikdy necommituje, nepushuje, neklonuje ani nestashuje a každý worktree repozitáře se řídí tím společným, proto se žádá o společný adresář, a ne o .git — v linked worktree je .git soubor. Sledovaný .gitignore se nezapisuje.

  3. Žádné nastavení neexistuje. Vrstva je osobní, když ji pokrývá blok exclude. Blok je zároveň mechanismus i záznam a čte se pokaždé, když se na něj zeptáme (mj_personal_active), takže --extend osobní vrstvy zůstává osobním i bez příznaku. Nic neukládá režim, který by se mohl s repozitářem rozcházet.

  4. Každý zapisovatel mimo vrstvu kryje před zápisem. update a capture install volají jednu ochranu (mj_personal_guard) pro každou cestu, kterou se chystají zapsat: přidá cestu a vedle ní název stagingu do bloku. Cesta, kterou git už sleduje, patří projektu a odmítá se dříve, než se cokoli zapíše, protože poloviční aktualizace je horší než žádná. Mimo osobní vrstvu ochrana nedělá nic, takže ji zapisovatel volá bezpodmínečně a neexistuje druhá cesta kódu, kterou je třeba držet v souladu.

  5. Tvrzení je ověřováno tam, kde vzniká, dvakrát, programy, které nesdílejí nic. init --personal zaznamená git status --porcelain --untracked-files=all před zápisem a skončí s kódem 10, pokud po něm nečte totéž. --personal instalátoru spouští init --personal a porovnává stav samo, před a po, aniž by cokoli zapsalo. doctor drží vrstvu u tvrzení při každém běhu a jmenuje soubor z ní, který byl přesto sledován; nežádá README.md projektu, aby bootstrap jmenoval, protože ta řádka by byla změnou sdíleného souboru.

  6. Objevování je odvozeno. Když je manifest na disku a index pro něj nemá položku, spustitelný soubor prochází pracovní strom, místo aby se ptal indexu (discovery::layer_is_untracked). Ptá se gitu při každém startu. Žádný příznak si nemusí pamatovat launcher, hook ani konfigurace klienta MCP a vrstva commitnutá později se od té chvíle čte přes index.

  7. Předání týmu je jeden příkaz, a stále rozhodnutí člověka. majordomus init --extend --shared odstraní blok, přidá dva řádky .gitignore, které přidává běžný init, a vypíše cesty, které nyní patří repozitáři ke commitu. Nic necommituje. Od té chvíle je vrstva běžná.

Důsledky

Osobní vrstva patří jednomu člověku na jednom stroji. Nepřenáší se s klonem, pushem ani stashem, takže předávky na jiný stroj jdou přes mesh, nebo vůbec; kolega, který chce totéž, si nainstaluje vlastní. Průvodce to říká.

Osobní režim drží vrstvu stranou od toho, co repozitář sdílí; není to řízení přístupu ani způsob, jak obejít pravidla organizace o nástrojích. Soubory jsou na disku na očích a zda smí být nástroj na kódové základně použit, je rozhodnutí organizace, činěné tak, jak taková rozhodnutí činí.

Hooky pro commit a push osobní init neinstaluje o nic víc než běžný. .git/hooks/ je už lokální, takže tam lze přidat dva řádky, které doctor jmenuje; repozitář, jehož core.hooksPath ukazuje na sledovaný adresář, si ponechává vlastní hooky a doctor říká které.

scripts/derive a generate si drží svůj kontrakt — derive vidí to, co uvidí commit — což znamená, že osobní vrstva není zdrojem commitovaných projekcí. Nemá žádnou, kterou by commitovala, dokud se nesdílí.

Odmítnuté alternativy

  • Režim zaznamenaný v manifestu nebo v politice. Dva zdroje pro jeden fakt: soubor by říkal personal, zatímco index říkal tracked, a něco by muselo rozhodnout, kdo vyhraje. Blok exclude si odporovat nemůže.
  • Přesun vrstvy mimo pracovní strom (proměnná prostředí jmenující jiný adresář). Každá cesta v každém dokumentu, hooku a konfiguraci klienta by znamenala dvě věci a pracovník, který čte .ai/README.md, by ji nenašel.
  • Zapsat .gitignore a označit ho assume-unchanged. Změna je stále v pracovním stromu, git stash -u i checkout jiné větve na ni narazí a příznak se ztratí při dalším přepisu indexu.
  • Globální položka core.excludesFile. Pokrývá .ai/ v každém repozitáři na stroji, včetně těch, které svou vrstvu sledují.

Stav

Navrženo. Implementováno s pravidlem project.a-personal-layer-changes-nothing-shared, tvrzením personal-layer-changes-nothing-shared, případem 2979 a úkolem I2491.

Odkud to pochází

kanonický soubor
.ai/repo/adrs/0145-a-personal-layer-changes-nothing-shared.md
identity
adr-0145
dostupné také jako
Zdroj MCP majordomus://adr/adr-0145 · majordomus entity show adr/adr-0145 · GET /api/v1/entity?uri=majordomus://adr/adr-0145
v Cockpitu
/cockpit/objects/adr/adr-0145

Tato stránka je generována z výše uvedeného souboru pomocí scripts/generate-site-data; úprava stránky nic nemění, úprava souboru změní všechna rozhraní. Výše uvedené vztahy jsou hrany docs/generated/graph.json, které spustitelný program zapisuje ze stejného indexu.

Prohledává názvy a popisy všech stránek, které tento web publikuje.