make-commit

Zapíše rozdělanou práci jako commit podle Conventional Commits — zjistí stav repozitáře, rozdělí změny do logických celků, sestaví zprávu z diffu a commitne; hotový commit rovnou pushne, a nemá-li vět

SKILL.md

GitHub

Make Commit

Cílem je jednotná, strojově čitelná historie. Závazný formát zprávy drží ${CLAUDE_PLUGIN_ROOT}/skills/make-commit/conventional-commits.md; přečti si ho, než začneš psát první zprávu.

Veškerá práce s gitem jde přes skripty. Důvod není pohodlí, ale předvídatelnost: skripty mají ošetřené hraniční stavy (odpojená HEAD, zastaralý lokální ref na výchozí větev, chybějící upstream) a neumí operace, které přepisují historii. Příkaz git proto nevolej přímo, ani když se to zdá rychlejší.

Skripty

Cesty ke skriptům i k doprovodné referenci jsou ukotvené k ${CLAUDE_PLUGIN_ROOT}, protože plugin může běžet nad cizím projektem, kde relativní scripts/… ani conventional-commits.md neexistují. Skripty volej vždy tvarem bash <cesta> — bez toho nespadnou do zúžení v allowed-tools.

Skript Co dělá
${CLAUDE_PLUGIN_ROOT}/skills/make-commit/scripts/preflight.sh Stav repozitáře jako key=value, výpis změn a zavedené scopy
${CLAUDE_PLUGIN_ROOT}/skills/make-commit/scripts/show-diff.sh Staged diff; s --worktree vše necommitnuté proti HEAD
${CLAUDE_PLUGIN_ROOT}/skills/make-commit/scripts/commit.sh Stagne zadané cesty a commitne se zprávou ze stdinu
${CLAUDE_PLUGIN_ROOT}/skills/make-commit/scripts/push.sh Pushne větev; nemá-li upstream, publikuje ji na origin

Každý skript má v hlavičce popis použití a návratových kódů. Nenulový kód vždy vyhodnoť — nothing_staged znamená jiný postup než detached_head.

Vstupní kontext

  • Zadání od uživatele (může být prázdné): $ARGUMENTS

Zadání ber jako vodítko pro type, scope a rozdělení do celků. O obsahu zprávy ale rozhoduje diff, ne zadání.

Interaktivní, nebo ne? Nehádej to z toho, kdo tě spustil — automatické spuštění na konci jiné úlohy ještě neznamená, že uživatel není k dispozici. Za neinteraktivní běh považuj situaci, kdy volání AskUserQuestion selže nebo odpověď nedorazí; teprve pak platí neinteraktivní varianty níže.

Postup

1. Zjisti stav

Spusť bash "${CLAUDE_PLUGIN_ROOT}/skills/make-commit/scripts/preflight.sh" a vyhodnoť výstup:

  • error=not_a_git_repository (kód 2) → ohlas to a skonči.
  • detached=true → zastav se a ohlas to. Commit na odpojené HEAD se tiše ztratí, jakmile se přepne větev.
  • on_default_branch=true → zeptej se nástrojem AskUserQuestion, jestli má práce opravdu jít přímo do výchozí větve, nebo se má nejdřív založit nová — na to slouží skill create-branch, sám větve nezakládej. Neinteraktivně necommituj a jen ohlas, že změny leží na výchozí větvi a čekají na rozhodnutí; zápis do sdílené výchozí větve se špatně bere zpět, takže tady opatrnost vítězí nad plynulostí.
  • on_default_branch=unknown (offline, default_branch_source=unavailable) → chovej se, jako bys na výchozí větvi byl.
  • staged_count=0 i unstaged_count=0 i untracked_count=0 → není co commitovat. Přeskoč rovnou na krok 5: větev může mít nepushnuté commity nebo vůbec žádný upstream a odejít odsud znamená nechat je ležet lokálně. Má-li upstream a předstih nula, je push levný no-op.

Ze sekce [recent_scopes] si vezmi slovník scopů, které repozitář už používá.

2. Urči rozsah

Je-li něco staged, commituj výhradně to — někdo ten výběr udělal vědomě a rozšířit ho by znamenalo commitnout cizí práci.

Jinak projdi [status] z preflightu a rozděl změny do logických celků podle oblasti a povahy změny. Smíchaný commit znehodnotí type i scope: změna, která je zároveň feat i fix v jiné oblasti, nemá správnou zprávu.

Při přímém vyvolání uživatelem („commitni to") je rozsahem celý pracovní strom, pokud uživatel sám nezúžil. Při automatickém spuštění na konci jiné úlohy vynech změny, které s ní zjevně nesouvisejí — a vynechání ohlas.

Víc celků → víc commitů. Rozdělení urči a proveď sám podle vlastního návrhu, bez čekání na potvrzení — a to i v interaktivním běhu. Návrh rozdělení do celků i tak vypiš prostým textem (v postupu commitování nebo ve shrnutí), ať zůstane vidět, jak byl diff rozdělen.

3. Napiš zprávu

Pro každý celek si nech vypsat diff:

bash "${CLAUDE_PLUGIN_ROOT}/skills/make-commit/scripts/show-diff.sh" --worktree <cesty>

U staged výběru vynech --worktree, u většího rozsahu si diff vyžádej po souborech. Soubory ze sekce [untracked] si přečti nástrojem Read — u nesledovaných souborů diff obsah neukáže, a type i popis odvozený jen z názvu souboru bývá vedle.

Zprávu piš z diffu, ne z paměti konverzace. Commituješ to, co je skutečně v repu — včetně změn, o kterých konverzace nemluvila. Formát a pravidla drží ${CLAUDE_PLUGIN_ROOT}/skills/make-commit/conventional-commits.md, slovník scopů [recent_scopes] z kroku 1.

4. Commitni

bash "${CLAUDE_PLUGIN_ROOT}/skills/make-commit/scripts/commit.sh" <cesty> <<'MSG'
<zpráva>
MSG

Zprávu předávej vždy takhle — heredocem s ukončovačem v uvozovkách. Bez uvozovek by shell expandoval $ a zpětné apostrofy a do historie by dorazilo něco jiného, než jsi napsal. Je-li výběr už staged z kroku 2, cesty vynech.

Skript vrátí commit=<hash> a subject=<popis>. Odmítne-li commit hook, ohlas příčinu uživateli — opravit ji sám nemůžeš, skill soubory needituje. Přeformátoval-li hook soubory sám, stagni je znovu a commit zopakuj.

5. Pushni

bash "${CLAUDE_PLUGIN_ROOT}/skills/make-commit/scripts/push.sh"

Pushni po každém commitu, ať už větev upstream má, nebo ne — v druhém případě ji skript publikuje na origin. Čekat na zvláštní pokyn nemá o co se opřít: commit, který zůstane jen lokálně, je ztracená práce při první ztrátě pracovní kopie a open-pr nad ním nemá z čeho PR založit. Vlastní pracovní větev na remotu nikomu nepřekáží — dokud není zmergovaná, nic v projektu nemění.

Push vynech jen tehdy, když ho uživatel odmítl — v konverzaci, nebo v zadání od volajícího skillu. Vynechání pak ohlas ve shrnutí, ať se ví, že commit leží jen lokálně.

Nenulový kód vyhodnoť:

  • error=no_remote (kód 4) → repozitář nemá kam publikovat. Není to chyba skillu; ohlas, že commit zůstal lokálně, a remote sám nezakládej.
  • error=detached_head (kód 2) → sem se běh po kroku 1 nedostane; dorazí-li přesto, zastav se a ohlas to.
  • Odmítnutý push (zamítnuto remotem, chybějící oprávnění, mezitím posunutá větev) → ohlas příčinu. Nezkoušej ji obejít force pushem ani přepsáním historie; commit je zapsaný a push jde zopakovat, až bude příčina odstraněná.

6. Shrň výsledek

Pro každý commit uveď hash a popis, kam se pushlo (nebo proč ne), a co jsi z rozsahu vynechal i s důvodem.

Zásady

  • Git jen přes skripty. Přímé volání git obchází ošetřené hraniční stavy, kvůli kterým skripty vznikly.
  • Historie se jen rozrůstá. Žádný --amend, žádný force push, žádné přeskakování hooků. Skripty tyhle operace záměrně neumí — nesnaž se je obejít jinou cestou.
  • Zpráva se píše z diffu. Konverzace je vodítko, diff je pravda.
  • Staged výběr je zadání, ne návrh k rozšíření.
  • Commit nezůstává lokálně. Push i publikace nové větve jsou výchozí konec práce, ne zvláštní krok na vyžádání. Zdrženlivost tu nic nechrání: pracovní větev na remotu do ničeho nezasahuje, kdežto commit jen v pracovní kopii se dá ztratit. Vynech push jen tehdy, když ho někdo výslovně odmítl.