worktree
Kam patří každý propojený git worktree tohoto repozitáře a kde který je. Kontejner je sourozenec primárního checkoutu pojmenovaný s `-wt`, cesta pod ním je název větve se zachovanou hierarchií a obojí se odvozuje z vlastní identity gitu — společného adresáře, registrovaných worktrees, větví — nikdy z registru, konfigurace nebo aktuálního adresáře. Worktree jinde je typovaná diagnostika s nápravou; migrace, která ji opraví, je operace příkazové řádky téže služby.
Celá topologie
Repozitář, kontejner, trunk a jak bylo rozhodnuto, každý registrovaný worktree s jeho postavením (primary, canonical, misplaced, detached, missing), jeho necommitnutou prací, vzdáleností od upstreamu a úkolem, který jeho větev prokazatelně jmenuje, každá lokální větev s worktree nebo bez něj a zda je způsobilá k úklidu, každá diagnostika s kódem a nápravou a součty. Čte se z gitu při každém volání: topologie se mění mimo tento proces.
- query
- behaviorally_verified
- vyžaduje se měření výkonu
- cache vypnuta
- nástroj MCP majordomus_worktrees
- Zdroj MCP {"name": "worktrees", "uri": "majordomus://worktrees"}
- $ worktree topology
Žádné parametry.
Vyzkoušejte
Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.
curl -s "http://127.0.0.1:8741/api/v1/worktrees"
Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.
Odpovědi
| status | tělo | význam |
| 200 |
RepositoryTopology |
Celá topologie: výsledek. |
| 400 |
ErrorBody |
invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne. |
| 404 |
ErrorBody |
not_found: Vstup pojmenovává něco, co repozitář nemá. |
| 500 |
ErrorBody |
internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává. |
| výchozí |
ErrorBody |
Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON. |
Jedna větev: kam patří její worktree a co v něm je
Kanonická cesta větve, odvozená pouze z jejího názvu, zda větev existuje, zda tu cestu něco zabírá, worktree, které větev drží, když nějaké je, a co brání jeho vytvoření nebo migraci. Odpověď pro větev, která ještě neexistuje, je cesta, kterou by použilo `worktree create`.
- query
- behaviorally_verified
- vyžaduje se měření výkonu
- cache vypnuta
- Nástroj MCP majordomus_worktree_inspect
- $ worktree inspect
Parametry dotazu
| název | typ | povinné | popis | příklady |
| větev |
string |
ano |
Větev, plný název (`feature/improve-cli`). Nemusí existovat: kanonická cesta se odvozuje jen z názvu. |
feature-branch: "feature/example" |
Vyzkoušejte
Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.
curl -s "http://127.0.0.1:8741/api/v1/worktrees/inspect?branch=feature%2Fexample"
Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.
Odpovědi
| status | tělo | význam |
| 200 |
InspectReport |
Jedna větev: kam její worktree patří a co v něm je: výsledek. |
| 400 |
ErrorBody |
invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne. |
| 404 |
ErrorBody |
not_found: Vstup pojmenovává něco, co repozitář nemá. |
| 500 |
ErrorBody |
internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává. |
| výchozí |
ErrorBody |
Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON. |
Co by bylo potřeba, aby se každý worktree vrátil domů
Jeden krok na každý špatně umístěný worktree s větví: kde je, kam patří, jak by se přesunul, necommitnutá práce, která se přesouvá s ním, a co ho blokuje; plus výjimky, které migrace z podstaty nemůže řešit — detached worktrees, zastaralé registrace, primární checkout mimo trunk — každá s tím, co s ní člověk udělá. Plánování nic nemění; `majordomus worktree migrate` jej aplikuje s otiskem pořízeným před každým přesunem i po něm.
- query
- behaviorally_verified
- vyžaduje se měření výkonu
- cache vypnuta
- Nástroj MCP majordomus_worktree_migration_plan
- $ worktree migrate
Žádné parametry.
Vyzkoušejte
Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.
curl -s "http://127.0.0.1:8741/api/v1/worktrees/migration"
Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.
Odpovědi
| status | tělo | význam |
| 200 |
MigrationPlan |
Co by bylo třeba, aby se každý worktree vrátil domů: výsledek. |
| 400 |
ErrorBody |
invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne. |
| 404 |
ErrorBody |
not_found: Vstup pojmenovává něco, co repozitář nemá. |
| 500 |
ErrorBody |
internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává. |
| výchozí |
ErrorBody |
Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON. |
Kde to je a zda tam patří
Jeden worktree — vlastní repozitáře, nebo ten, který drží adresář jmenovaný volajícím — s jeho postavením, branchí, kanonickou cestou, spočtenou necommitnutou prací, informací, zda je tam, kam patří, a počtem chyb celé topologie. To, co agent čte, než začne, a podle čeho rozhoduje guard.
- query
- behaviorally_verified
- vyžaduje se měření výkonu
- cache vypnuta
- Nástroj MCP majordomus_worktree_status
- $ worktree status
Parametry dotazu
| název | typ | povinné | popis | příklady |
| path |
string |
ne |
Adresář uvnitř jednoho z worktree tohoto repozitáře; odpověď se týká onoho worktree. Při relativní cestě relativně k primárnímu checkoutu (`.` je samotný primární checkout). Výchozí: repozitář, pro který byl server spuštěn. Cesta v jiném repozitáři se odmítne: topologie odpovídá jen o sobě. |
primary-checkout: "." |
Vyzkoušejte
Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.
curl -s "http://127.0.0.1:8741/api/v1/worktrees/status?path=."
Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.
Odpovědi
| status | tělo | význam |
| 200 |
StatusReport |
Kde to je a zda je to tam, kam to patří: výsledek. |
| 400 |
ErrorBody |
invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne. |
| 404 |
ErrorBody |
not_found: Vstup pojmenovává něco, co repozitář nemá. |
| 500 |
ErrorBody |
internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává. |
| výchozí |
ErrorBody |
Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON. |
Jak daleko je checkout od vzdáleného trunku
`HEAD` checkoutu a lokální větev trunku, každé započítané proti vzdálenému sledovacímu trunku — commity pozadu a napřed, přičemž probíhající merge počítá, co přináší — k poslednímu fetchi, jehož čas je součástí odpovědi; posuzováno proti `checkout.trunk_distance` politiky jako `current`, `lagging`, `stale`, `unjudged` (není deklarován práh) nebo `unmeasured` (není vzdálený trunk), s příkazy, které ho aktualizují. Co vykresluje doctor a co o stromu, který server poskytuje, říkají `server.status` a instrukce MCP (`project.a-checkout-serves-the-current-trunk`). Nic nestahuje a nic nezapisuje.
- query
- behaviorally_verified
- vyžaduje se měření výkonu
- cache vypnuta
- nástroj MCP majordomus_worktree_trunk
- $ worktree trunk
Parametry dotazu
| název | typ | povinné | popis | příklady |
| path |
string |
ne |
Adresář uvnitř jednoho z worktree tohoto repozitáře; odpověď se týká onoho worktree. Při relativní cestě relativně k primárnímu checkoutu (`.` je samotný primární checkout). Výchozí: repozitář, pro který byl server spuštěn. Cesta v jiném repozitáři se odmítne: topologie odpovídá jen o sobě. |
primary-checkout: "." |
Vyzkoušejte
Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.
curl -s "http://127.0.0.1:8741/api/v1/worktrees/trunk?path=."
Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.
Odpovědi
| status | tělo | význam |
| 200 |
TrunkDistance |
Jak daleko je checkout od vzdáleného trunku: výsledek. |
| 400 |
ErrorBody |
invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne. |
| 404 |
ErrorBody |
not_found: Vstup pojmenovává něco, co repozitář nemá. |
| 500 |
ErrorBody |
internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává. |
| výchozí |
ErrorBody |
Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON. |
Necommitnutá práce v propojených worktree a co ji drží
Každý propojený worktree, jehož index nebo pracovní strom drží změny, které žádný commit nenese: kolik cest (staged, unstaged, untracked, conflicted), kdy byla provedena nejstarší změna (nejstarší čas úpravy mezi změněnými cestami, u smazané ho zastupuje stav souboru indexu) a co práci drží — záznam aktivní úlohy, otevřená epizoda, která není opuštěná, nebo proces, jehož pracovní adresář je uvnitř. Práce, kterou nic nedrží a která je starší než práh, je `abandoned`, s příkazem, který by ji dostal na vzdálený ref `rescue/`; ten se navrhuje, nikdy nespouští. Práh je `session.stranded_after` z politiky, pokud `older_than` nejmenuje jiný. Čte každý worktree a žádný nezapisuje: každý status běží bez volitelných zámků, takže se neobnovuje žádný index.
- query
- behaviorally_verified
- vyžaduje se měření výkonu
- cache vypnuta
- Nástroj MCP majordomus_worktree_uncommitted
- $ worktree uncommitted
Parametry dotazu
| název | typ | povinné | popis | příklady |
| older_than |
string |
ne |
Stáří, po jehož překročení je práce, kterou nic nedrží, opuštěná, tak jak je píše člověk (`90s`, `30m`, `12h`, `1d`). Výchozí: `session.stranded_after` z politiky, což je také doba, po kterou smí být otevřená epizoda němá a stále držet práci. |
one-hour: "1h" |
Vyzkoušejte
Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.
curl -s "http://127.0.0.1:8741/api/v1/worktrees/uncommitted?older_than=1h"
Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.
Odpovědi
| status | tělo | význam |
| 200 |
UncommittedReport |
Necommitnutá práce v propojených worktree a co ji drží: výsledek. |
| 400 |
ErrorBody |
invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne. |
| 404 |
ErrorBody |
not_found: Vstup pojmenovává něco, co repozitář nemá. |
| 500 |
ErrorBody |
internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává. |
| výchozí |
ErrorBody |
Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON. |
Schémata
Komponenty, které používají jen operace tohoto tagu. Každý řádek je pole daného typu, jeho doc komentář je popis; typ vlastněný jinou stránkou na ni odkazuje.
BranchState
object
Jedna lokální větev, s pracovním stromem nebo bez něj.
| vlastnost | typ | povinné | popis |
| název |
string |
ano |
Větev, krátce. |
| head |
string |
ano |
Commit, na který ukazuje. |
| trunk |
boolean |
ano |
Tato větev je trunk. |
| expected_path |
string | null |
ne |
Kam patří jeho pracovní strom. |
| worktree |
string | null |
ne |
Kde je checkoutován, pokud je. |
| upstream |
UpstreamState | null → UpstreamState |
ne |
Upstream a jeho vzdálenost. |
| merged_into_trunk |
boolean | null |
ne |
Dosažitelné z trunku. Chybí, když je trunk neznámý. |
| cleanup_eligible |
boolean |
ano |
Sloučeno do trunku, není to trunk a buď není vybaveno, nebo je vybaveno v work tree, o kterém se ví, že je čisté. Odvozený stav, nikdy se podle něj automaticky nejedná. |
| issue |
string | null |
ne |
Úkol, který tato větev prokazatelně jmenuje. |
Používá RepositoryTopology
ContainerView
object
Kontejner, jak jej hlásí topologie.
| vlastnost | typ | povinné | popis |
| path |
string |
ano |
Odvozená cesta. |
| přípona |
string |
ano |
Přípona, s níž byl odvozen. |
| existuje |
boolean |
ano |
Existuje na disku. Vytvoří ho první worktree, který ho potřebuje. |
Používá RepositoryTopology StatusReport
DiagnosticCode
"worktree.path_mismatch" | "worktree.container_occupied" | "worktree.nested" | "worktree.destination_conflict" | "worktree.missing" | "worktree.stale_registration" | "worktree.branch_already_checked_out" | "worktree.detached" | "worktree.ephemeral" | "worktree.primary_on_non_trunk" | "worktree.trunk_in_linked_worktree" | "worktree.path_escape" | "worktree.invalid_branch_name" | "worktree.locked" | "worktree.migration_verification_failed" | "worktree.trunk_unknown" | "worktree.case_collision" | "worktree.cross_device"
Stabilní strojový název všeho, co může být s topologií špatně. Jeden kód na podmínku, použitý příkazovou řádkou, API, MCP, Cockpitem, testy i dokumentací; próza vedle kódu se vykresluje z typovaného stavu.
worktree.path_mismatchPropojený pracovní strom není na kanonické cestě své větve.worktree.container_occupiedPropojený pracovní strom zabírá samotnou cestu kontejneru.worktree.nestedPropojený pracovní strom leží uvnitř primárního checkoutu nebo uvnitř jiného pracovního stromu.worktree.destination_conflictKanonickou cestu branche zabírá něco, co není její pracovní strom.worktree.missingAdresář registrovaného pracovního stromu neexistuje.worktree.stale_registrationGit hlásí registraci jako prunable.worktree.branch_already_checked_outVětev je checkoutnutá jinde než na své kanonické cestě.worktree.detachedLinked worktree nemá větev.worktree.ephemeralPropojený pracovní strom je odkládací checkout relace: pod dočasným adresářem nebo pod .claude/worktrees/ primárního checkoutu.worktree.primary_on_non_trunkPrimární checkout drží větev, která není trunk.worktree.trunk_in_linked_worktreeTrunk je checkoutnut v linked worktree, ne v primárním checkoutu.worktree.path_escapeOdvozená cesta by opustila kontejner. U platného názvu větve nemůže nastat.worktree.invalid_branch_nameNázev větve, který git přijal a pro který tento spustitelný soubor nedokáže odvodit cestu.worktree.lockedPracovní strom je zamčený, takže jej nelze přesunout, dokud se neodemkne.worktree.migration_verification_failedPřesun proběhl a otisk po něm se liší od otisku před ním.worktree.trunk_unknownTrunk se nepodařilo určit.worktree.case_collisionDvě jména větví se na souborovém systému nerozlišujícím velikost písmen mapují na jeden adresář.worktree.cross_devicePřesun překročil zařízení a proběhl kopií, opravou a ověřením.
Používá TopologyDiagnostic
DirtyState
object
Nezapsaná práce v pracovním stromě, počítaná z git status --porcelain. Počítá se i nesledovaný obsah: přesně ten ztratí neopatrný přesun.
| vlastnost | typ | povinné | popis |
| připraveno k zapsání |
integer (uint) |
ano |
Položky se změnou v indexu. |
| unstaged |
integer (uint) |
ano |
Záznamy se změnou v pracovním stromu, která není v indexu. |
| nesledováno |
integer (uint) |
ano |
Nesledované, neignorované soubory. |
| v konfliktu |
integer (uint) |
ano |
Záznamy s nevyřešeným konfliktem při merge. |
| čisté |
boolean |
ano |
Nic z výše uvedeného není nenulové. |
| in_progress |
string | null |
ne |
Probíhá zde merge, rebase, cherry-pick, revert nebo bisect. |
Používá MigrationStep UncommittedWorktree WorktreeState
EnvrcApproval
jedna ze 6 variant
Co se stalo s .envrc právě vytvořeného, nalezeného nebo přesunutého worktree.
varianta direnv ho přijal: další cd načte prostředí.
varianta Worktree nemá .envrc; není co schvalovat a nic není blokováno.
variant direnv není na PATH; nic se neudělalo a nic ani není blokováno, protože nic by soubor nenačetlo.
| výsledek | "direnv_absent" | ano | |
variant .envrc worktree není tím primárního checkoutu, takže tam udělené schválení se nepřenáší. direnv allow ve worktree, po přečtení, je věcí člověka.
varianta .envrc primárního checkoutu není schválen, takže není co přenášet.
| výsledek | "not_approved_in_primary" | ano | |
varianta direnv byl dotázán a odmítl, nebo ho nešlo spustit; zpráva je jeho vlastní.
| zpráva | string | ano | standardní chybový výstup direnv nebo chyba při jeho spuštění. |
| výsledek | "failed" | ano | |
Používá MigrationStep
HooksPath
jedna ze 6 variant
Co se stalo s adresářem hooků worktree, který byl právě vytvořen, nalezen nebo přesunut.
Putuje v JSON příkazů worktree create, ensure, migrate a repair, označené outcome, takže čtenář větví podle jednoho slova, místo aby parsoval řádek:
use majordomus_cli::worktree::HooksPath;
let set = HooksPath::Set {
path: "/r-wt/fix/x/.githooks".into(),
enabled: vec![],
};
let json = serde_json::to_value(&set).unwrap();
assert_eq!(json["outcome"], "set");
assert_eq!(json["path"], "/r-wt/fix/x/.githooks");
let back: HooksPath = serde_json::from_value(json).unwrap();
assert_eq!(back, set);
varianta Konfigurace repozitáře nenastavuje žádný core.hooksPath: vlastní adresář hooků gitu ve společném adresáři (nebo hodnota uživatele) slouží každému worktree a neexistuje žádný sledovaný adresář, který by se následoval.
| výsledek | "not_configured" | ano | |
varianta Git už hooky tohoto worktree rozřešuje do jeho vlastního adresáře; nic se nenastavovalo.
| path | string | ano | Adresář, z něhož git spouští hooky. |
| výsledek | "own" | ano | |
variant core.hooksPath tohoto worktree byl nastaven, pro každý worktree, na jeho vlastní adresář.
| path | string | ano | Adresář, ze kterého nyní běží hooky. |
| zapnuto | array of string | ano | Nastavení repozitáře zapnutá tak, aby se respektovala hodnota pro každý worktree, jako key=value; prázdné, pokud už byla zapnutá. |
| výsledek | "set" | ano | |
varianta Adresář hooků je mimo primární checkout — jeden adresář sdílený záměrně — a běží z něj každý worktree; nic nebylo nastaveno.
| path | string | ano | Adresář, ze kterého každý worktree spouští háčky. |
| výsledek | "shared" | ano | |
variant Adresář hooků primárního checkoutu nemá v tomto stromu worktree protějšek, takže worktree dál spouští hooky primárního: nasměrovat ho na neexistující adresář by hooky vypnulo.
| chybí | string | ano | Adresář, který by byl vlastním adresářem worktree, a není tam. |
| runs | string | ano | Adresář, z něhož worktree místo toho spouští hooky. |
| výsledek | "untracked" | ano | |
variant Git byl dotázán a odmítl, nebo jej nešlo spustit; zpráva je jeho vlastní.
| zpráva | string | ano | Co se pokazilo. |
| výsledek | "failed" | ano | |
Používá MigrationStep
InspectReport
object
Jedna větev, prohlédnutá: kam patří její pracovní strom a co v něm je.
| vlastnost | typ | povinné | popis |
| větev |
string |
ano |
Větev, na kterou se ptá. |
| branch_exists |
boolean |
ano |
Větev existuje lokálně. |
| expected_path |
string |
ano |
Kam patří jeho pracovní strom. |
| destination_exists |
boolean |
ano |
Na té cestě něco existuje. |
| worktree |
WorktreeState | null → WorktreeState |
ne |
Pracovní strom, který drží větev, pokud nějaký existuje. |
| kanonické |
boolean |
ano |
Větev je checkoutnuta na své kanonické cestě. |
| diagnostika |
pole TopologyDiagnostic → TopologyDiagnostic |
ano |
Co stojí v cestě, pokud něco. |
Používá worktree.inspect
MigrationAction
"move" | "move_via_staging" | "copy_and_repair" | "none"
Jak krok přesouvá svůj worktree.
moveJeden git worktree move.move_via_stagingWorktree je samotný kontejner: ven na pracovní cestu, pak dovnitř kontejneru.copy_and_repairPřesun překročil zařízení: zkopírovat, git worktree repair, ověřit, odstranit originál.noneNic: krok je blokován.
Používá MigrationStep
MigrationPlan
object
Migrace, plánovaná nebo aplikovaná.
| vlastnost | typ | povinné | popis |
| schema |
string |
ano |
SCHEMA. |
| kontejner |
string |
ano |
Kontejner, do kterého se vše přesouvá. |
| kroky |
pole MigrationStep → MigrationStep |
ano |
Jeden krok na každý špatně umístěný worktree s větví, nejdřív obyvatelé kontejneru. |
| výjimky |
pole TopologyDiagnostic → TopologyDiagnostic |
ano |
Worktree, které migrace z principu nemůže adresovat: detached, chybějící, primární checkout mimo trunk. Každý říká, co s tím člověk udělá. |
| přesunutelné |
integer (uint) |
ano |
Kroky, které lze za současného stavu provést. |
| blokováno |
integer (uint) |
ano |
Kroky, které nemohou. |
| přesunuto |
integer (uint) |
ano |
Provedené a ověřené kroky. |
| selhalo |
integer (uint) |
ano |
Kroky, které byly zkoušeny a nebyly ověřeny. |
| aplikováno |
boolean |
ano |
Zda se cokoli změnilo. |
| moved_current |
string | null |
ne |
Nová cesta worktree, ze kterého byl příkaz spuštěn, když se přesunul. |
Používá worktree.migration_plan
MigrationStep
object
Jeden worktree k přenesení domů.
| vlastnost | typ | povinné | popis |
| větev |
string |
ano |
Větev, kterou drží. |
| z |
string |
ano |
Kde to je. |
| do |
string |
ano |
Kam patří. |
| head |
string | null |
ne |
Commit, který je vyčerpán. |
| akce |
MigrationAction → MigrationAction |
ano |
Jak se pohybuje. |
| špinavé |
DirtyState → DirtyState |
ano |
Jeho necommitnutá práce, která se s ním přesouvá. |
| blockers |
pole TopologyDiagnostic → TopologyDiagnostic |
ano |
Proč se nemůže pohnout, když se nemůže. |
| výsledek |
StepOutcome → StepOutcome |
ano |
Co se stalo. |
| zpráva |
string | null |
ne |
Co se stalo, slovy, když to nebyl prostý přesun. |
| před |
WorktreeFingerprint | null → WorktreeFingerprint |
ne |
Otisk před přesunem. |
| po |
WorktreeFingerprint | null → WorktreeFingerprint |
ne |
Otisk po něm. |
| rozdíly |
array of string |
ano |
Čím se obě liší; prázdné, když je ověřeno. |
| envrc |
EnvrcApproval | null → EnvrcApproval |
ne |
Co se stalo s jeho .envrc pod direnv, jakmile byl na nové cestě: zda se tam přenesl souhlas primárního checkoutu, nebo proč ne. Jen u kroku přesunu. |
| hooky |
HooksPath | null → HooksPath |
ne |
Které hooky spouští na své nové cestě: core.hooksPath pro worktree pojmenovává starý, takže přesunuté worktree se znovu naváže na hooky vlastního stromu (I2718). Jen na přesunutém kroku. |
Používá MigrationPlan
OpenEpisode
object
Otevřená epizoda v pracovním stromu, pokud jde o držení její práce: práci drží, jen dokud je
stranded Some(false); opuštěná nebo nerozsouditelná nedrží nic.
use majordomus_cli::worktree::OpenEpisode;
let unjudged = OpenEpisode {
id: "s-20260101000000-0a0a".into(),
last_sign_of_life: None,
stranded: None,
};
let wire = serde_json::to_value(&unjudged).unwrap();
assert!(wire.get("stranded").is_none(), "what could not be judged is absent, not false");
let back: OpenEpisode = serde_json::from_value(wire).unwrap();
assert_eq!(back, unjudged);
| vlastnost | typ | povinné | popis |
| id |
string |
ano |
Epizoda. |
| last_sign_of_life |
string | null |
ne |
Jeho nejnovější známka života, RFC 3339 v UTC. |
| uvízlé |
boolean | null |
ne |
Mlčí déle než práh. Chybí, když to nelze posoudit — žádný práh nebo žádný čitelný znak života — a pak nic nedrží. |
Používá UncommittedWorktree
RepositoryTopology
object
Celá topologie: co čtou worktree list, zdroj MCP, routa HTTP i Cockpit.
| vlastnost | typ | povinné | popis |
| schema |
string |
ano |
SCHEMA. |
| repozitář |
RepositoryView → RepositoryView |
ano |
Repozitář. |
| kontejner |
ContainerView → ContainerView |
ano |
Kontejner, pod který patří každý propojený pracovní strom. |
| trunk |
TrunkView → TrunkView |
ano |
Trunk. |
| observed_from |
string |
ano |
Pracovní strom, z něhož bylo na volání odpovězeno. |
| worktrees |
pole WorktreeState → WorktreeState |
ano |
Každý registrovaný pracovní strom, primární první. |
| branches |
pole BranchState → BranchState |
ano |
Každá místní větev, podle jména. |
| diagnostika |
pole TopologyDiagnostic → TopologyDiagnostic |
ano |
Vše, co je s topologií špatně, nejdřív pracovní stromy, pak celý repozitář. |
| součty |
TopologyTallies → TopologyTallies |
ano |
Počty. |
| platné |
boolean |
ano |
Nestojí žádná diagnostika úrovně error. |
Používá worktree.topology
RepositoryView
object
Identita repozitáře, jak ji hlásí topologie.
| vlastnost | typ | povinné | popis |
| primary_worktree |
string |
ano |
Primární checkout: podle čeho je kontejner pojmenován. |
| git_common_dir |
string |
ano |
Společný git adresář: identita repozitáře. |
| název |
string |
ano |
Název adresáře primárního checkoutu. |
Používá RepositoryTopology StatusReport
Postavení
"primary" | "canonical" | "misplaced" | "detached" | "ephemeral" | "missing"
Kde pracovní strom stojí vůči topologii.
primaryPrimární checkout: osvobozen od pravidla cesty, vázán pravidlem trunku.canonicalLinked worktree přesně na kanonické cestě své větve.misplacedPropojený pracovní strom jinde. Migrace jej přivede domů.detachedPropojený work tree bez větve. Nemá kanonickou cestu a nikdy se nepřesouvá.ephemeralLinked worktree pod dočasným adresářem operačního systému nebo pod .claude/worktrees/ primárního checkoutu: pracovní checkout relace, vlastněný a odstraňovaný harnessem, který ho vytvořil. Hlásí se; migruje se jen na žádost.missingRegistrace, jejíž adresář zmizel. Oprava ji zahodí.
Používá WorktreeState
StatusReport
object
Odpověď na otázku „kde jsem a je to tam, kam patřím“.
| vlastnost | typ | povinné | popis |
| schema |
string |
ano |
SCHEMA. |
| repozitář |
RepositoryView → RepositoryView |
ano |
Repozitář. |
| kontejner |
ContainerView → ContainerView |
ano |
Kontejner. |
| trunk |
TrunkView → TrunkView |
ano |
Trunk. |
| worktree |
WorktreeState → WorktreeState |
ano |
Pracovní strom, z něhož volání přišlo, s počtem jeho necommitnuté práce. |
| kanonické |
boolean |
ano |
Zda je tento pracovní strom tam, kam patří: kanonický, nebo primární checkout na trunku, nebo detached. |
| repository_errors |
integer (uint) |
ano |
Kolik diagnostik úrovně error nese celá topologie. |
| trunk_distance |
TrunkDistance → TrunkDistance |
ano |
Jak daleko je tento pracovní strom a lokální trunk od vzdáleného trunku, posouzeno podle checkout.trunk_distance z politiky: co by obsloužil a jak je to staré. |
Používá worktree.status
StepOutcome
"planned" | "blocked" | "moved" | "failed"
Co se z kroku stalo.
plannedNaplánováno a neaplikováno.blockedNeprovedeno, s blokátory u kroku.movedPřesunuto a otisk po se rovná otisku před.failedPokusilo se a nedokončilo, nebo dokončilo a neověřilo; zpráva říká, které z toho.
Používá MigrationStep
Práh
object
Stáří, po jehož překročení je necommitnutá práce, kterou nic nedrží, opuštěná, a odkud pochází.
Uvádí se u každého čtení, aby čtenář viděl, vůči čemu byly verdikty posuzovány; práh, který nic nedeklaruje, se nese jako chybějící, nedoplňuje se.
use majordomus_cli::worktree::Threshold;
let declared = Threshold::resolve(Some("12h"), None).unwrap();
let wire = serde_json::to_value(&declared).unwrap();
assert_eq!(wire["declared"], "12h");
assert_eq!(wire["seconds"], 43_200);
let absent: Threshold =
serde_json::from_value(serde_json::json!({"source": "absent"})).unwrap();
assert_eq!((absent.declared, absent.seconds), (None, None), "absent is not a default");
| vlastnost | typ | povinné | popis |
| deklarováno |
string | null |
ne |
Hodnota, jak je zapsána (12h). Chybí, pokud ji nic nedeklaruje. |
| sekundy |
integer | null |
ne |
Stejná hodnota, v sekundách. |
| zdroj |
string |
ano |
THRESHOLD_KEY, older_than, když ho volající uvedl, nebo absent. |
Používá UncommittedReport
TopologyDiagnostic
object
Jedna věc, která je na topologii špatně nebo stojí za to vědět.
| vlastnost | typ | povinné | popis |
| kód |
DiagnosticCode → DiagnosticCode |
ano |
Stabilní kód. |
| závažnost |
Závažnost → Závažnost |
ano |
Jak je to závažné. |
| path |
string | null |
ne |
Dotčený pracovní strom. |
| větev |
string | null |
ne |
Dotčená větev. |
| očekáváno |
string | null |
ne |
Kam pracovní strom patří. |
| zpráva |
string |
ano |
Co je špatně, jedním řádkem. |
| náprava |
string |
ano |
Příkaz, který to oslovuje. |
Používají InspectReport MigrationPlan MigrationStep RepositoryTopology WorktreeState
TopologyTallies
object
Kolik work trees a větví je v kterém stavu.
| vlastnost | typ | povinné | popis |
| worktrees |
integer (uint) |
ano |
Každý registrovaný pracovní strom, včetně primárního. |
| kanonické |
integer (uint) |
ano |
Propojené work trees na své kanonické cestě. |
| špatně umístěno |
integer (uint) |
ano |
Propojené worktree jinde. |
| detached |
integer (uint) |
ano |
Propojené work trees bez větve. |
| dočasný |
integer (uint) |
ano |
Dočasné checkouty relace. |
| chybí |
integer (uint) |
ano |
Registrace, jejichž adresář zmizel. |
| uzamčeno |
integer (uint) |
ano |
Pracovní stromy, které git hlásí jako zamčené. |
| špinavé |
integer (uint) |
ano |
Pracovní stromy s necommitnutou prací, když o ně bylo požádáno. |
| branches |
integer (uint) |
ano |
Lokální větve. |
| branches_without_worktree |
integer (uint) |
ano |
Lokální větve bez pracovního stromu. |
| cleanup_eligible |
integer (uint) |
ano |
Větve způsobilé k úklidu. |
| chyby |
integer (uint) |
ano |
Diagnostika na úrovni chyb. |
| varování |
integer (uint) |
ano |
Diagnostika úrovně varování. |
Používá RepositoryTopology
TrunkSource
"remote_head" | "default_branch_config" | "conventional_name" | "primary_checkout" | "unknown"
Odkud se trunk zjistil, v pořadí, v jakém se hledá.
remote_headrefs/remotes/<remote>/HEAD: jak remote nazývá svou výchozí větev.default_branch_configinit.defaultBranch v konfiguraci gitu a ta branch existuje lokálně.conventional_namePrávě jeden z main a master existuje lokálně.primary_checkoutVětev, kterou drží primární checkout, protože nic jiného neřeklo.unknownNic neřekl; trunk je neznámý a každá kontrola, která ho potřebuje, to říká.
Používá TrunkView
TrunkView
object
Trunk, jak ho hlásí topologie.
| vlastnost | typ | povinné | popis |
| větev |
string | null |
ne |
Větev, pokud je známa. |
| zdroj |
TrunkSource → TrunkSource |
ano |
Jak bylo rozhodnuto. |
| checked_out_at |
string | null |
ne |
Kde je checkoutnut. |
Používá RepositoryTopology StatusReport
UncommittedReport
object
Každý propojený pracovní strom držící necommitnutou práci a co ji drží: odpověď
worktree.uncommitted na každém povrchu a to, co vykresluje
doctor.
use majordomus_cli::worktree::uncommitted::UNCOMMITTED_SCHEMA;
use majordomus_cli::worktree::{Threshold, UncommittedReport, WorktreeService};
let dir = tempfile::tempdir().unwrap();
let init = std::process::Command::new("git")
.args(["init", "-q"])
.current_dir(dir.path())
.status()
.unwrap();
assert!(init.success());
// a repository with no linked work tree, and a policy that declares no threshold
let threshold = Threshold::resolve(None, None).unwrap();
let report: UncommittedReport =
WorktreeService::open(dir.path()).unwrap().uncommitted(&threshold).unwrap();
assert_eq!(report.schema, UNCOMMITTED_SCHEMA);
assert!(report.worktrees.is_empty());
assert_eq!(report.tallies.measured, 0);
assert_eq!(report.findings.len(), 1, "a missing threshold is said, not assumed");
| vlastnost | typ | povinné | popis |
| schema |
string |
ano |
UNCOMMITTED_SCHEMA. |
| observed_at |
string |
ano |
Kdy bylo čtení pořízeno, RFC 3339 v UTC. |
| práh |
Threshold → Threshold |
ano |
Práh, vůči kterému se posuzovalo. |
| worktrees |
pole UncommittedWorktree → UncommittedWorktree |
ano |
Každý propojený pracovní strom s necommitnutou prací, nejprve opuštěné, pak od nejstaršího. |
| součty |
UncommittedTallies → UncommittedTallies |
ano |
Počty. |
| zjištění |
array of string |
ano |
Co nešlo přečíst ani posoudit, slovy. |
Používá worktree.uncommitted
UncommittedTallies
object
Počty
UncommittedReport: kolik linked worktrees bylo přečteno, kolik jich drží necommitnutou práci a jak se dělí na držené, nedávné a opuštěné. Tato tři postavení se vždy sečtou na
uncommitted;
doctor čte
abandoned, aby rozhodlo, zda má před čím varovat.
use majordomus_cli::worktree::UncommittedTallies;
let wire = serde_json::json!(
{"measured": 4, "uncommitted": 3, "held": 1, "recent": 1, "abandoned": 1}
);
let t: UncommittedTallies = serde_json::from_value(wire.clone()).unwrap();
assert_eq!(t.held + t.recent + t.abandoned, t.uncommitted);
assert_eq!(serde_json::to_value(&t).unwrap(), wire, "the shape doctor's jq reads");
assert_eq!(UncommittedTallies::default().abandoned, 0, "nothing read, nothing abandoned");
| vlastnost | typ | povinné | popis |
| naměřeno |
integer (uint) |
ano |
Linked worktrees, jejichž stav byl přečten. |
| uncommitted |
integer (uint) |
ano |
Z nich ty, které drží necommitnutou práci: každá položka výpisu. |
| držené |
integer (uint) |
ano |
Drženo úlohou, epizodou nebo procesem. |
| nedávné |
integer (uint) |
ano |
Nedrženo ničím, mladší než práh. |
| opuštěno |
integer (uint) |
ano |
Nikým nedržený, starší než práh. |
Používá UncommittedReport
UncommittedWorktree
object
Jeden linked worktree držící necommitnutou práci: kolik, jak starou, co ji drží, verdikt a příkaz, který by ji zachoval. Výpis je v kanonickém pořadí — opuštěné první, pak nedávné, pak držené, uvnitř každé nejstarší první.
use majordomus_cli::worktree::{DirtyState, UncommittedWorktree, WorkStanding};
let entry = |path: &str, standing: WorkStanding, age: u64| UncommittedWorktree {
path: path.into(),
branch: None,
label: path.into(),
work: DirtyState { staged: 1, ..DirtyState::default() },
paths: 1,
oldest_change: None,
age_seconds: Some(age),
age: None,
task: None,
episodes: Vec::new(),
process_inside: None,
held_by: Vec::new(),
standing,
remedy: String::new(),
};
let mut listing = vec![
entry("/wt/held-old", WorkStanding::Held, 900_000),
entry("/wt/young", WorkStanding::Abandoned, 50_000),
entry("/wt/older", WorkStanding::Abandoned, 90_000),
];
majordomus_cli::order::canonical(&mut listing);
let paths: Vec<&str> = listing.iter().map(|w| w.path.as_str()).collect();
assert_eq!(paths, ["/wt/older", "/wt/young", "/wt/held-old"]);
| vlastnost | typ | povinné | popis |
| path |
string |
ano |
Absolutní, tak jak ji drží git. |
| větev |
string | null |
ne |
Tam checkoutnutá větev. Chybí při detached. |
| popisek |
string |
ano |
Branch, nebo detached/<short commit>. |
| práce |
DirtyState → DirtyState |
ano |
Počty tak, jak je dává worktree status. |
| cesty |
integer (uint) |
ano |
Každá změněná cesta: staged, unstaged, untracked a konfliktní dohromady. |
| oldest_change |
string | null |
ne |
Kdy byla provedena nejstarší změna: nejstarší čas úpravy mezi změněnými cestami, u cesty, která už neexistuje, čas souboru indexu. RFC 3339. |
| age_seconds |
integer | null |
ne |
Sekundy od té doby. |
| stáří |
string | null |
ne |
Totéž pro člověka (3d, 5h, 40m). |
| úloha |
string | null |
ne |
Aktivní úloha tam zaznamenaná. |
| epizody |
pole OpenEpisode → OpenEpisode |
ano |
Epizody tam otevřené. |
| process_inside |
boolean | null |
ne |
Proces má v něm svůj pracovní adresář. Chybí, když to nešlo přečíst. |
| held_by |
array of string |
ano |
Co to drží, slovy; prázdné, když to nedrží nic. |
| postavení |
WorkStanding → WorkStanding |
ano |
Verdikt. |
| náprava |
string |
ano |
Příkaz, který by dal tuto práci na remote ref. Navrhuje se, nikdy nespouští. |
Používá UncommittedReport
UpstreamState
object
Upstream větve a jak daleko se obě rozešly, z for-each-ref v jediném podprocesu pro všechny větve, nikdy fetch.
| vlastnost | typ | povinné | popis |
| název |
string |
ano |
Upstream ref, zkráceně (origin/master). |
| napřed |
integer | null |
ne |
Zdejší commity, které upstream nemá. |
| pozadu |
integer | null |
ne |
Upstream commity, které této větvi chybí. |
| pryč |
boolean |
ano |
Upstream ref už neexistuje. |
Používá BranchState WorktreeState
WorkStanding
"held" | "recent" | "abandoned"
Čím je nezacommitovaná práce pracovního stromu, posouzeno: drží ji něco, je čerstvá, nebo opuštěná.
judge je jediné místo, kde se to rozhoduje, a
doctor varuje jen při
abandoned.
use majordomus_cli::worktree::uncommitted::{judge, WorkStanding};
let standing = judge(false, Some(90_000), Some(43_200));
assert_eq!(standing, WorkStanding::Abandoned);
assert_eq!(serde_json::to_value(standing).unwrap(), "abandoned");
heldDrží ho úloha, epizoda nebo proces.recentNic ho nedrží a je mladší než práh.abandonedNic ho nedrží a je starší než práh — nebo jeho stáří nelze přečíst.
Používá UncommittedWorktree
WorktreeFingerprint
object
Co pracovní strom obsahoval v jednom okamžiku, zredukováno na digesty.
| vlastnost | typ | povinné | popis |
| větev |
string | null |
ne |
Větev, nebo žádná, když je HEAD odpojený. |
| head |
string | null |
ne |
Commit. |
| index_digest |
string |
ano |
Digest indexu: každá sledovaná cesta s režimem, blobem a stagem. |
| staged_diff_digest |
string |
ano |
Souhrn staged diffu proti HEAD. |
| unstaged_diff_digest |
string |
ano |
Přehled neindexovaného diffu proti indexu. |
| untracked_manifest_digest |
string |
ano |
Souhrn každého nesledovaného souboru: cesta, druh, velikost a obsah. |
| untracked_files |
integer (uint) |
ano |
Kolik nesledovaných souborů manifest drží. |
| ignored_manifest_digest |
string |
ano |
Digest každé ignorované položky: cesta, druh a velikost, nikdy obsah. |
| in_progress |
string | null |
ne |
Probíhající operace, pokud nějaká je. |
| tree_manifest_digest |
string | null |
ne |
Digest každé položky adresářového stromu, včetně ignorovaných: cesta, druh, velikost a cíl odkazu. Pořizuje se jen u přesunu kopírováním, kde záruka přejmenování neplatí. |
Používá MigrationStep
WorktreeKind
"primary" | "linked"
Zda je worktree vlastním checkoutem repozitáře, nebo s ním jen propojený.
primaryHlavní pracovní strom. Hostí kmen, nikdy se nepřesouvá a nikdy se neodstraňuje.linkedPropojený work tree. Patří na kanonickou cestu své větve.
Používá WorktreeState
WorktreeState
object
Jeden pracovní strom, jak jej vidí topologie.
| vlastnost | typ | povinné | popis |
| path |
string |
ano |
Absolutní, tak jak ji drží git. |
| druh |
WorktreeKind → WorktreeKind |
ano |
Primární nebo linked. |
| postavení |
Standing → Standing |
ano |
Kde stojí vůči topologii. |
| větev |
string | null |
ne |
Zde vybavená větev, zkráceně. Chybí při detached HEAD. |
| popisek |
string |
ano |
Název, pod kterým se zobrazuje: větev, nebo detached/<short commit>. |
| head |
string | null |
ne |
Zde checkoutnutý commit. |
| detached |
boolean |
ano |
HEAD je zde odpojen. |
| expected_path |
string | null |
ne |
Kam patří pracovní strom této větve. Chybí při odpojení, nebo u primárního checkoutu na trunku. |
| existuje |
boolean |
ano |
Adresář, který git zaregistroval, stále existuje na disku. |
| aktuální |
boolean |
ano |
Volání přišlo zevnitř tohoto work tree. |
| uzamčeno |
string | null |
ne |
Zamčeno, s důvodem gitu; prázdný řetězec, když žádný nezaznamenal. |
| k odstranění |
string | null |
ne |
K vyčištění, s důvodem od gitu. |
| špinavé |
DirtyState | null → DirtyState |
ne |
Zde necommitnutá práce. Chybí, když o ni nebylo požádáno: stojí jeden podproces na pracovní strom a kontrola topologie ji nepotřebuje. |
| upstream |
UpstreamState | null → UpstreamState |
ne |
Upstream větve a její vzdálenost od něj. |
| issue |
string | null |
ne |
Úkol, který tato větev prokazatelně jmenuje: komponenta cesty větve rovná id úkolu z .ai/repo/project/issues/, nebo s ním začínající a následovaná pomlčkou. Nic se neodvozuje z podobnosti. |
| diagnostika |
pole TopologyDiagnostic → TopologyDiagnostic |
ano |
Co je s tímto pracovním stromem špatně, pokud něco. |
Používá InspectReport RepositoryTopology StatusReport