Co to znamená
majordomus init --personal a --personal instalátoru vytvářejí tutéž vrstvu, jakou vytváří prosté init. Liší se tím, čí je. Po příkazu, v repozitáři, který už držel nepotvrzenou práci:
git status --porcelain --untracked-files=allvypíše přesně to, co vypisoval dříve;- nebyl zapsán žádný sledovaný soubor, včetně
.gitignoreaREADME.md; - nic pod
.ai/není sledováno ani stagováno agit add -Aby nic z toho nestagoval; - pozdější zapisovatelé to tak udržují:
updateacapture installpokryjí každý soubor před zápisem a soubor, který projekt už sleduje, nechají, jak je.
Když zkouška obhájila svůj případ, majordomus init --extend --shared předá vrstvu týmu: odstraní zakrytí a vypíše, co je nyní na repozitáři ke commitnutí. Soubor, který je podle vlastního názvu něčí osobní (*.local, *.local.*), zůstává zakrytý.
Princip
Kryt je označený blok v $GIT_COMMON_DIR/info/exclude, souboru vyloučení, který git čte pro repozitář a nikdy jej necommituje, nepushuje, neklonuje ani nestashuje. Ptá se na společný adresář, ne na .git, takže propojený worktree je kryt stejným souborem. Pomocné funkce jsou v lib/common.sh: mj_personal_cover zapíše blok a ostatní řádky nechá být, mj_personal_active jej čte, mj_personal_guard je to, co volá zapisovač, než zapíše, mj_personal_verify je kontrola, kterou sdílejí init a doctor, a mj_personal_uncover je to, co spouští --shared.
Neukládá se žádný režim. Vrstva je osobní, když ji pokrývá blok, takže --extend zůstává osobní bez příznaku a nic nemůže říkat „osobní“, zatímco repozitář říká něco jiného.
Spustitelný soubor čte nesledovanou vrstvu, aniž by mu to někdo řekl: když je manifest na disku a index pro něj nemá záznam, objevování projde pracovní strom (discovery::layer_is_untracked v apps/majordomus-cli/src/discovery/mod.rs, vybráno v apps/majordomus-cli/src/app.rs).
Jak to vidět
git status --porcelain --untracked-files=all > /tmp/before
majordomus init --personal
git status --porcelain --untracked-files=all | diff /tmp/before -
majordomus doctor | grep personal
bash test/run.sh 2979_a_personal_layer_changes_nothing_shared
Případ pracuje v repozitáři s upraveným a jedním nesledovaným souborem, protože čistý strom, který zůstane čistý, dokazuje málo. Spouští init --personal, update, capture install a --extend a po každém porovná stav. Commitne CLAUDE.md a vyžaduje, aby update to odmítl, nic nezapsal a nikdy kvůli tomu neradil --force; doctor nesmí tento soubor poměřovat pravidly této vrstvy. Sleduje jeden soubor vrstvy a vyžaduje, aby jej doctor pojmenoval. Sdílí vrstvu a vyžaduje, aby zmizel kryt a nic nebylo commitnuto. Instaluje skutečným instalátorem proti testovacímu release a vyžaduje Verified (personal).
Co nepokrývá
Osobní režim drží vrstvu stranou od toho, co repozitář sdílí. Není to řízení přístupu: soubory jsou na disku na očích. Není to ani způsob, jak obejít pravidla organizace o nástrojích; zda lze nástroj na codebase použít, je rozhodnutí organizace.
Neinstaluje hooky commit a push; .git/hooks/ je lokální, takže tam lze přidat dva řádky, které doctor jmenuje, a repozitář, jehož core.hooksPath ukazuje na sledovaný adresář, si ponechá vlastní. Osobní vrstva necestuje — ani s klonem, pushem ani stashem — a není zdrojem commitnutých projekcí, protože derive vidí to, co uvidí commit. Nástroj, který zapisuje do repozitáře bez volání guardu, není pokryt; tři zapisovatele, které tato distribuce dodává, ano.
Proč existuje
Tým přijímá nástroj na základě důkazů a důkazy plynou z používání. Dříve používání nástroje na skutečné práci znamenalo měnit soubory, které sdílí každý, takže osobní zkouška se stala návrhem dřív, než bylo co navrhovat. „Nezměnil jsem nic, co sdílíte“ je tvrzení o práci druhých a ručně psaný soubor exclude, který ho dřív zastupoval, nekontrolovalo nic. ADR 0145 o tom rozhoduje; pravidlo project.a-personal-layer-changes-nothing-shared to drží.