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.

Shellová automatizace

shellová automatizace v migraci: soupis každé jednotky a její dispozice, `shell check`, který odmítne shellovou jednotku bez deklarované výjimky i výjimku, jejíž jednotka zmizela, formát výjimky a jak jednotku ze seznamu vymigrovat

Vykresleno z docs/SHELL.md — stejný Markdown, který ukazuje GitHub.

Automatizace tohoto repozitáře se stěhuje ze shellu. ADR 0069 určuje směr: chování, které patří programu, se stane typovanou schopností a orchestrace nad schopnostmi se stane skriptem Rhai — skriptovanou schopností — místo shellového skriptu. Migrace tohoto tvaru konverguje, jen pokud přestane přicházet nový shell, zatímco se starý stěhuje, a o tom tato stránka je: o inventáři, který migraci sleduje, a o kontrole, která odmítne shell, jejž nikdo nedeklaroval.

Kontrola

majordomus shell check                  # every finding with its remedy; exit 10 on any
majordomus shell check --format json    # the same answer as a document
majordomus shell check --canonical      # put the inventory in canonical order, then check

shell.check je schopnost spustitelného souboru, takže tentýž verdikt se servíruje přes MCP (majordomus_shell_check) i HTTP (GET /api/v1/shell/check). Čte index gitu a prvních pár bajtů každého souboru; nic nebuilduje a nepoužívá síť. V CI je to kontrola shell-inventory jobu structure, vybraná jakoukoli změnou pod spravovaným adresářem, inventářem nebo modulem, který jej posuzuje (.ai/repo/ci/gates.yaml).

Shell jednotka je soubor pod bin/, lib/, scripts/, share/, .githooks/ nebo .claude/hooks/, jehož první řádek jmenuje shell (#!/bin/sh, #!/usr/bin/env bash, #!/usr/bin/env zsh, #!/usr/bin/env -S bash -eu, ...) nebo jehož název končí na .sh. Posuzují se soubory, které by git commitnul — sledované soubory a nesledované soubory, které žádné pravidlo ignorování nevylučuje — takže nový skript je odmítnut dřív, než je přidán. Symbolický odkaz není jednotka; jednotkou je to, na co ukazuje, pokud to leží tam.

test/ není řízeno. Každý behaviorální případ je podle kontraktu runneru shellový skript, takže jejich zamítnutí by zamítlo každý nový test, dokud se nepohne samotný harness; harness je místo toho jedním záznamem inventáře.

kódodmítnuto, když
shell.undeclaredshellová jednotka nemá záznam, nebo její záznam nenese výjimku
shell.stalezáznam jmenuje jednotku, kterou strom už nemá
shell.missing_fieldzáznam nemá disposition ani reason, nebo výjimka nemá why ani removal
shell.invalid_dispositiondispozice není jedna z A-F
shell.exemption_not_shellvýjimka je na souboru, který není řízenou shellovou jednotkou, nebo na kotvě
shell.invalid_unitjednotka je absolutní, vylézá ze stromu, nebo je pod .ai/local/
shell.duplicatedva záznamy sdílejí jednotku a kotvu
shell.out_of_orderzáznamy nejsou v kanonickém pořadí
shell.malformedřádek není záznam (včetně neznámého pole)

Kód 0 je čisto, 10 je nález, 12 je strom, který nešlo změřit — což není úspěch.

Inventář

.ai/repo/automation/inventory.jsonl drží jeden JSON objekt na řádek: každou jednotku automatizace, kterou audit migrace našel — shell soubory, ale také awk, jq a JavaScript, které volají, shell vložený ve workflow, receptech a hookách a místa, kde executable spouští shell. Záznam je:

{"unit":"scripts/ci/order-check","disposition":"A","reason":"…","exemption":{"why":"…","removal":"…"},"facts":{"purpose":"…","callers":["…"]}}
poleplatí
unitcesta, relativní ke kořeni repozitáře
anchorvolitelné: místo uvnitř jednotky (deploy :: publish, recipe build) pro vložený shell
dispositionA základní schopnost → typovaná schopnost; B orchestrace → skriptovaná schopnost; C bootstrapové lepidlo; D mrtvé; E generované; F adaptér platformy
reasonproč právě toto rozhodnutí
exemptionvyžadováno u řízeného souboru shellu, jinde odmítnuto: dnes se vyžaduje shell why a podmínka removal
factspopisná fakta auditu; nesená a nikdy nesouzená

Nic mechanického se nezaznamenává. Počet řádků nebo interpret zapsaný do souboru by po další úpravě zastaral, aniž by to cokoli říkalo; kontrola odvozuje obojí ze stromu. Soupis a seznam výjimek jsou záměrně jeden soubor: dispozice shellové jednotky se zapisuje jednou a druhý seznam výjimek vedle soupisu by byla opakovaná definice, kterou ADR 0004 označuje za vadu.

Přidání shellu

Nejprve ne. Nová automatizace repozitáře je typovaná schopnost executable (docs/CAPABILITIES.md), když něco rozhoduje, nebo skriptovaná schopnost, když orchestruje schopnosti. Když je shell opravdu nutný — hook, který poskytovatel volá dřív, než executable existuje, instalátor spuštěný jako curl | sh — přidejte záznam s dispozicí, důvodem a výjimkou a spusťte majordomus shell check --canonical, aby se zavedl. Výjimka se čte při review; je to celý argument pro soubor.

Migrace jednotky ven

  1. Přesuňte chování: typovanou schopnost pro A, skriptovanou schopnost pro B.
  2. Přesměrujte každého volajícího, kterého jmenuje facts.callers záznamu, na náhradu a zkontrolujte strom, zda neobsahuje ty, které audit minul.
  3. Smažte soubor i jeho záznam v téže změně. Smazání samotného souboru kontrolu neprojde jako shell.stale; to je ratchet a on brání tomu, aby seznam přežil jednotky, které popisuje.

Jednotka, která přestane být shellem, aniž by byla smazána — přepsaná na místě jako něco jiného — si ponechá záznam pro historii migrace, ale ztratí výjimku, kterou kontrola jinak odmítne jako shell.exemption_not_shell.

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