Integrácia s gitom
kontext používa ako vrstvu spolupráce samotný git: súbory pre pravdu, commity pre review, trailery pre odkazy, hooky pre vynucovanie.
Hooky
| Hook | Čo kontext robí | Môže zablokovať? |
|---|---|---|
pre-commit | zvaliduje stagnuté znalosti a preskenuje ich na tajné údaje; znova vygeneruje .ai/README.md zo stagnutého stromu a stagne ho; pripomenie kandidátov z inboxu, ktorí sa týkajú stagnutých ciest | áno, pri chybách |
prepare-commit-msg | pridá pre stagnuté záznamy trailery Decision:, Convention:, Learning:, Incident: (pri merge commitoch sa preskočí; amend sa meria od rodiča HEAD) | nie |
post-commit | zaradí udalosti sync pre znalosti, ktoré sa zmenili v HEAD, odstráni povýšené položky inboxu, ktoré sú už commitnuté, spustí doručovanie na pozadí | nie |
post-merge, post-rewrite | zaradí udalosti sync po pulle, merge a rebase | nie |
Jednorazovo obídeš cez KONTEXT_SKIP=1 git commit … alebo git commit --no-verify.
Pravidlá inštalácie
kontext hooks install (spúšťa ho aj kontext init) nikdy nenahradí tvoje hooky:
- Cieľom je
core.hooksPath, ak je nastavený (.husky/_od husky sa mapuje na.husky/), inak.git/hooks(git rev-parse --git-path hooks, zdieľané všetkými worktree). - Do existujúceho shellového hooku sa vloží označený blok hneď za shebang, takže sa spustí, aj keby zvyšok skriptu skončil predčasne.
- Hook, ktorý nie je shellový (napr. Node skript), sa premenuje na
<hook>.kontext-chaineda zavolá sa po bloku kontextu. - Každý blok hľadá
kontextvPATH, v~/.local/bina~/.cargo/bina bez neho neurobí nič. Zdieľané adresáre hookov teda nerozbijú kolegov, ktorí kontext nemajú. - Ak je adresár hookov sledovaný (napr.
.githooks/), zmena sa ukáže vgit status: commitni ju, aby hooky zdieľal celý tím. - Ak sledovaný adresár hookov existuje, ale ešte nie je aktívny (napríklad
core.hooksPathnastaví ažnpm install), kontext ťa na to upozorní akontext hooks install --hooks-dir .githooksho pokryje. - Správcovia hookov, ktorí súbory hookov generujú znova (lefthook, pre-commit), sa rozpoznajú; namiesto toho pridaj
kontext hook <name>do ich konfigurácie.
kontext hooks status ukáže, čo je nainštalované; kontext hooks uninstall bloky odstráni a obnoví zreťazené originály.
jj (Jujutsu)
Kolokovaný repozitár jj je pre kontext git repozitár, s dvoma rozdielmi: jj nikdy nespúšťa git hooky a nikdy nestaguje. Commit za teba nikto neskontroluje, takže kontroly spusti ručne pred jj commit / jj describe alebo jj git push:
kontext prepare-commit(aleboctx_prepare_commit): keď nie je nič stagnuté, prečíta zmeny pracovného stromu vočiHEAD, teda pracovnú kópiu jj, a vypíše znalosti, ktoré ich pokrývajú;kontext drift: znalosti, ktoré tvoja zmena, commitnutá či nie, nechala za sebou od predvolenej vetvy;kontext check: validáciu a sken tajných údajov, ktoré by spustil pre-commit hook.
Pre tím patrí brána tam, kadiaľ prejde každý commit, nech ho urobilo čokoľvek: kontrolný skript (bun run check, make check) alebo CI spúšťa kontext drift --fail (stav 2, keď zmena nechala zaznamenané znalosti za sebou) alebo kontext ci --strict. kontext nepridáva git hook, ktorý by commit pre drift blokoval, lebo commit z jj by naň nikdy nenarazil; to isté hovorí kontext hooks status.
kontext confirm aj povýšenia stagujú súbory v indexe gitu; jj berie súbory z pracovnej kópie a index ignoruje, takže to neškodí. Trailery sa nepridajú samy: napíš ich do popisu (prepare-commit ich vypíše).
Kontroly, ktoré hľadajú špinavý strom (beh verify označí [dirty: <cesty>] v denníku a cez MCP sa nespustí, confirm odmietne súbor s nestagnutými úpravami), vidia pracovnú kópiu jj ako necommitnuté zmeny z pohľadu gitu. Najprv spusti jj commit alebo jj new, aby súbory, ktoré potvrdzuješ, boli v commite; colocated jj smoke test beží v CI, keď je jj nainštalované.
Trailery
Pre každý súbor znalostí stagnutý v commite pridá prepare-commit-msg trailer (git interpret-trailers --if-exists addIfDifferent):
fix(billing): round in cents
Decision: 2026-09-28-prices-are-integer-centsKľúče trailerov pochádzajú z store.kinds.<kind>.trailer. Obyčajný git s nimi odpovedá na otázky:
git log --format='%h %s%n%(trailers:key=Decision,valueonly)' -- src/billing
git log --grep 'Decision: 0007'kontext why zoradí commity s trailermi kontextu na prvé miesta.
Záznamy vyťažené cez kontext init žiadne nedostanú: pochádzajú zo starších commitov uvedených v ich poli commits.
Preformulovanie cez git commit --amend -m … trailery zachová: hook amend rozpozná (z argumentov alebo z commitujúceho procesu git) a to, čo commit pridáva, meria od rodiča HEAD. Commit z git merge --squash dostane trailery všetkého, čo nesie.
Udalosti sync
Po commite, merge alebo rebase porovná kontext súbory znalostí v HEAD so snapshotom poslednej synchronizácie (pre každý worktree) a zaradí udalosť sync pre každý pridaný alebo zmenený záznam. Prvé spustenie vo worktree snapshot len zapíše; kontext sync --all raz zrkadlí všetky záznamy. Nič sa nedeje, kým udalosť sync neodoberá žiadny adaptér.
Outbox
Hooky nikdy nekomunikujú so sieťou. Udalosti sa pripisujú do <git-common-dir>/kontext/outbox.jsonl a odpojený kontext outbox flush ich doručí. Doručenia sa sledujú pre každý adaptér a operáciu a v jednom klone beží naraz len jedno doručovanie. Pokus sa ráta len adaptéru, ktorý sa naozaj skúsil, takže výpadok jedného adaptéra nemíňa pokusy ostatným; eventy pre adaptér, ktorý preskočilo when, ostanú vo fronte. Po ôsmich neúspešných pokusoch sa event presunie do outbox.dead.jsonl, ktorý ukáže kontext status a vráti kontext outbox retry. Nič sa nestratí ticho. kontext outbox vypíše, čo čaká, a poslednú chybu; sync hlási mazania a premenovania; logy adaptérov rotujú.
Merge
- Záznamy sú samostatné súbory: paralelné vetvy sa toho istého súboru dotknú len zriedka.
.ai/README.mdsa generuje znova a je označenýmerge=union(v.ai/.gitattributes).- Sekvenčné čísla ADR môžu medzi vetvami kolidovať, rovnako ako pri akejkoľvek praxi s ADR; ID podľa dátumu (predvolené pre nové úložiská) sa tomu vyhnú.
Worktree
Všetko lokálne žije v spoločnom git adresári, takže všetky worktree klonu zdieľajú inbox, outbox a postup zavádzania, zatiaľ čo každý worktree má vlastný vyhľadávací index a snapshot synchronizácie (riadia sa checkoutnutou vetvou; commity, ktoré z histórie vypadnú cez amend alebo rebase, sa z indexu odstránia).
Každý kandidát v inboxe si pamätá worktree a vetvu, v ktorých vznikol. Pri paralelných agentoch v samostatných worktree (Superset, Codex, Claude Code) ponúkajú ctx_prepare_commit, pripomienka v pre-commit hooku a brief len vlastných kandidátov aktuálneho worktree; kandidáti iného živého worktree sa ukážu zvlášť ako „not for this commit“ a kandidátov zmazaného worktree si môže prevziať ktokoľvek. kontext inbox ukáže, odkiaľ ktorý pochádza.