Šķîþ ţö ḿàîñ çöñţéñţ

Ţĥé kapi ļööþ îñ ÇÎ

Šöüŕçé çöñţéñţ çĥàñĝéš öñ éṽéŕý ḿéŕĝé, àñđ éṽéŕýţĥîñĝ đéŕîṽéđ ƒŕöḿ îţ (îţš ţŕàñšļàţîöñš, îţš ṽöîçé àñđ ţéŕḿîñöļöĝý çöñƒöŕḿàñçé) ƒàļļš ƃéĥîñđ. Ţĥàţ đŕîƒţ îš ţĥé ñöŕḿàļ šţàţé öƒ à šĥîþþîñĝ þŕöĵéçţ. Ŕüññîñĝ ţĥé kapi ļööþ îñ ÇÎ ķééþš éṽéŕý ļàñĝüàĝé çàüĝĥţ üþ ƒŕöḿ ţĥé þîþéļîñé ţĥàţ þŕöđüçéš ţĥé đŕîƒţ: çļöšé ŵĥàţ à ḿàçĥîñé çàñ çļöšé, đéļîṽéŕ îţ àš à ŕéṽîéŵàƃļé þüļļ ŕéǫüéšţ, àñđ éñƒöŕçé ţĥé ŕéļéàšé ƃàŕ öñ ḿéŕĝéš, ŵîţĥ çöñţéñţ ǫüàļîţý ţŕéàţéđ ļîķé àñý öţĥéŕ ţéšţ. Ţĥîš çöṽéŕš ţĥé šöüŕçé ļàñĝüàĝé ţöö: ţĥé šĥîþ ĝàţé îñçļüđéš ţĥé šöüŕçé ĝàţéš (ṽöîçé, ţéŕḿîñöļöĝý) àļöñĝšîđé ţŕàñšļàţîöñ çöṽéŕàĝé àñđ ţĥé ŕüļé-ƃàšéđ çĥéçķš.

changea merge or a schedule tickcatch upkapi up: memory first, then AI, then checkseach pass re-derivescoverage and repeatscaught up / parkeddelivera pull request with the run reportexit 3 blocks the mergegatekapi check --ship on merge requests

ÇÎ çàţçĥéš üþ àñđ đéļîṽéŕš; ţĥé ĝàţé àļöñé đéçîđéš ŵĥàţ ƃļöçķš à ḿéŕĝé.

Îñšîđé à þàšš, ƒöŕ éṽéŕý ļàñĝüàĝé ƃéĥîñđ îţš ĝàţé, ţĥé đéƒàüļţ ƒļöŵ đöéš ţĥŕéé ţĥîñĝš îñ öŕđéŕ: ŕéüšé, ŵĥéŕé éẋàçţ çöñţéñţ-ḿéḿöŕý ḿàţçĥéš ƒîļļ ƒîŕšţ, ƒöŕ ƒŕéé, àñđ àñ éđîţéđ šöüŕçé çàŕŕîéš îţš þŕéṽîöüšļý àþþŕöṽéđ ţŕàñšļàţîöñ îñţö ţĥé þŕöḿþţ àš ŕéƒéŕéñçé; ţŕàñšļàţé, ŵĥéŕé ţĥé çöñƒîĝüŕéđ ÀÎ þŕöṽîđéŕ ƒîļļš ŵĥàţ ŕéḿàîñš, ŵîţĥ ţĥé þŕöĵéçţ'š ţéŕḿîñöļöĝý àñđ ṽöîçé çöñţéẋţ; çĥéçķ, ŵĥéŕé đéţéŕḿîñîšţîç çĥéçķš ŕüñ öṽéŕ ŵĥàţ ŵàš þŕöđüçéđ (þļàçéĥöļđéŕ îñţéĝŕîţý, îñļîñé ţàĝš, đö-ñöţ-ţŕàñšļàţé ţéŕḿš). À üñîţ ŵîţĥ à ƒàîļîñĝ ƒîñđîñĝ šţîļļ çöüñţš àš ţŕàñšļàţéđ, àñđ ţĥé ƒîñđîñĝ ĥöļđš îţš ļöçàļé öüţ öƒ šĥîþþîñĝ üñţîļ îţ îš ƒîẋéđ, šö ƃàđ öüţþüţ çàñ ñéṽéŕ ļîƒţ à ļàñĝüàĝé öṽéŕ îţš ĝàţé. Ŵĥàţ à ḿàçĥîñé çàññöţ đéçîđé þàŕķš ƒöŕ ŕéṽîéŵ; àñ àþþŕöṽàļ îš ŕéçöŕđéđ îñ ţĥé çöḿḿîţţéđ üñîţ-šţàţé ŕéçöŕđ, àñđ ţĥé ñéẋţ ŕüñ šééš îţ.

Ţĥŕéé çöḿḿàñđš çàŕŕý ţĥé ŵĥöļé ḿöđéļ, àñđ ţĥéý đîṽîđé ţĥé ŵöŕķ çļéàñļý:

ÇöḿḿàñđŔöļéÉẋîţ ƃéĥàṽîöŕ
kapi statusÖƃšéŕṽé: þéŕ-ļöçàļé çöṽéŕàĝé àñđ ĝàţé šţàñđîñĝÀļŵàýš 0: ƃéĥîñđ îš þéñđîñĝ ŵöŕķ
kapi upÞŕöđüçé: ŕüñš ţĥé kapi ļööþ0 ŵĥéţĥéŕ ţĥé ŕüñ çàüĝĥţ éṽéŕýţĥîñĝ üþ öŕ þàŕķéđ ŵöŕķ ƒöŕ ŕéṽîéŵ; ñöñ-žéŕö öñļý ŵĥéñ ţĥé ŕüñ ƃŕöķé
kapi check --shipÉñƒöŕçé: ţĥé ŕéļéàšé ƃàŕ0 þàšš, 3 ĝàţé üñḿéţ, 1 öþéŕàţîöñàļ éŕŕöŕ

Àñ öŕđîñàŕý ƃüîļđ ñéṽéŕ ƒàîļš ƃéçàüšé à ţàŕĝéţ ļàñĝüàĝé îš ƃéĥîñđ. Ţĥé ĝàţé îš ţĥé éẋþļîçîţ, öþţ-îñ éñƒöŕçéḿéñţ þöîñţ: ŵîŕé îţ îñţö ḿéŕĝé-ŕéǫüéšţ þîþéļîñéš àñđ à ǫüàļîţý ŕéĝŕéššîöñ çàññöţ ḿéŕĝé, ŵĥîļé đàý-ţö-đàý đŕîƒţ ƒļöŵš ţĥŕöüĝĥ ŕéṽîéŵ îñšţéàđ öƒ ƃŕéàķîñĝ ƃüîļđš.

Šöüŕçé ƒîŕšţ: šéţţļé ƃéƒöŕé ýöü ƒàñ öüţ

Ţĥé ļööþ îš šöüŕçé-ƒîŕšţ: îţ šéţţļéš ţĥé šöüŕçé àñđ ĥöļđš àţ ţĥé šöüŕçé ĝàţé ƃéƒöŕé ţŕàñšļàţîñĝ àñý ļàñĝüàĝé, ƃéçàüšé à ţéŕḿ ļéƒţ üñŕéšöļṽéđ öŕ à šéñţéñçé ļéƒţ öƒƒ-ƃŕàñđ îñ ţĥé šöüŕçé îš þàîđ ƒöŕ öñçé þéŕ ļàñĝüàĝé àñđ àĝàîñ öñ ţĥé ƒîẋ. Îñ ÇÎ ţĥîš šĥöŵš üþ ţŵö ŵàýš. kapi check --ship ŕüñš ţĥé þŕöĵéçţ'š source_gate àļöñĝšîđé ţĥé ţàŕĝéţ šĥîþ ĝàţéš, šö à ḿéŕĝé ŵĥöšé šöüŕçé îš öƒƒ-ƃŕàñđ öŕ ƃéļöŵ îţš ţéŕḿîñöļöĝý ƃàŕ ƒàîļš ţĥé ĝàţé ţĥé šàḿé ŵàý à ţàŕĝéţ-çöṽéŕàĝé ŕéĝŕéššîöñ đöéš. Àñđ üñđéŕ šöüŕçé-ƒîŕšţ çöñṽéŕĝéñçé, šöüŕçé ţĥàţ ĥàš ñöţ çļéàŕéđ îţš source_gate ĥöļđš (ŕéþöŕţéđ àš source_not_ready, ŕöüţéđ ţö à šöüŕçé ŕéṽîéŵ) ŕàţĥéŕ ţĥàñ šþéñđîñĝ öñ à ḿàçĥîñé ţŕàñšļàţîöñ öƒ çöñţéñţ ţĥàţ îš àƃöüţ ţö çĥàñĝé. Šéé Šöüŕçé ƒîŕšţ ƒöŕ ţĥé ḿöđéļ.

Ţĥé šüŕƒàçéš

ÇÎÎñšţàļļŔüñ
ĜîţĤüƃ Àçţîöñšsetup-kapi (ÇĻÎ + þļüĝîñš, çàçĥéđ)kapi-action, öŕ ţĥé öñé-ļîñé ŕéüšàƃļé ŵöŕķƒļöŵš
ĜîţĻàƃ ÇÎñöñé ñééđéđ (ţĥé çöḿþöñéñţš ŕüñ öñ ţĥé îḿàĝé)kapi-components ƒŕöḿ ţĥé ÇÎ/ÇĐ Çàţàļöĝ
Àñýţĥîñĝ çöñţàîñéŕ-ƃàšéđghcr.io/neokapi/kapi (çöšîĝñ-šîĝñéđ; à ṽàŕîàñţ ŵîţĥ ţĥé šéŕṽéŕ-šýñç þļüĝîñ þŕéîñšţàļļéđ îš þüƃļîšĥéđ àļöñĝšîđé)Ţĥé ÇĻÎ đîŕéçţļý; ţĥé éẋîţ çöđéš àƃöṽé àŕé ţĥé çöñţŕàçţ

Çàţçĥ üþ öñ à šçĥéđüļé, đéļîṽéŕ à þüļļ ŕéǫüéšţ

Ţĥé þŕöđüçéđ ţŕàñšļàţîöñš ļàñđ àš à ƃŕàñçĥ àñđ à þüļļ ŕéǫüéšţ çàŕŕýîñĝ ţĥé ŕüñ ŕéþöŕţ: öüţçöḿé, þàššéš, þàŕķéđ ļöçàļéš. À ŕüñ ţĥàţ þàŕķš (ŵöŕķ ŕéḿàîñš ţĥàţ ñééđš à þéŕšöñ) šţîļļ đéļîṽéŕš ŵĥàţ îţ đîđ çàţçĥ üþ; ţĥé þàŕķéđ ļöçàļéš àŕé ţĥé ŕéṽîéŵ ǫüéüé.

.github/workflows/translations.yml
name: Translations
on:
schedule:
- cron: "0 6 * * 1-5"
workflow_dispatch:

jobs:
up:
uses: neokapi/kapi-workflows/.github/workflows/up.yml@v1
permissions:
contents: write
pull-requests: write
secrets:
anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}

Ţĥé ŕéüšàƃļé ŵöŕķƒļöŵ çöḿþöšéš setup-kapi, kapi-action, àñđ à đéļîṽéŕý šţéþ ţĥàţ öþéñš ţĥé þüļļ ŕéǫüéšţ. Üšéđ đîŕéçţļý, ţĥé àçţîöñ öñļý ŕéþöŕţš: has-changes àñđ changed-files ƒééđ à đéļîṽéŕý šţéþ ýöü öŵñ (þļàîñ ĝîţ, git-auto-commit-action, create-pull-request), šö ţĥé ţöķéñ, ţĥé àüţĥöŕšĥîþ àñđ ţĥé ŕéṽîéŵ þöļîçý àŕé šţàţéđ îñ ýöüŕ ŵöŕķƒļöŵ. Öñé ĜîţĤüƃ ƃéĥàṽîöŕ ţö ķñöŵ: þüšĥéš ḿàđé ŵîţĥ ţĥé ŵöŕķƒļöŵ'š öŵñ GITHUB_TOKEN ţŕîĝĝéŕ ñö ŵöŕķƒļöŵš, šö ĝîṽé ţĥé đéļîṽéŕý šţéþ à ƒîñé-ĝŕàîñéđ ÞÀŢ öŕ à ĜîţĤüƃ Àþþ ţöķéñ ŵĥéñ ÇÎ öŕ đéþļöýš šĥöüļđ ŕéàçţ ţö đéļîṽéŕéđ ţŕàñšļàţîöñš.

Ĝàţé ḿéŕĝéš öñ çöñţéñţ ǫüàļîţý

kapi check --ship ŕüñš ţĥé þŕöĵéçţ'š ƃöüñđ ǫüàļîţý ĝàţéš (ṽöîçé, ţéŕḿîñöļöĝý, ŕüļé-ƃàšéđ çĥéçķš, šţàļéñéšš) þļüš îţš šĥîþ/šöüŕçé çöṽéŕàĝé ĝàţéš, àñđ éẋîţš 3 ŵĥéñ àñý ĝàţé îš üñḿéţ. Ḿàçĥîñé-þŕöđüçéđ ţŕàñšļàţîöñš ƒàîļ ǫüîéţļý: à đŕöþþéđ þļàçéĥöļđéŕ, à çöḿþéţîţöŕ'š ţéŕḿ, ŵöŕđîñĝ ţĥàţ đŕîƒţš öƒƒ ţĥé àþþŕöṽéđ ṽöçàƃüļàŕý. Ţĥé ĝàţé ḿàķéš ţĥé þîþéļîñé ƒîñđ ţĥéḿ ƃéƒöŕé à ŕéàđéŕ đöéš.

.github/workflows/ship-gate.yml
name: Ship gate
on:
pull_request:
paths: ["content/**", "src/locales/**"]

jobs:
ship-gate:
uses: neokapi/kapi-workflows/.github/workflows/gate.yml@v1
permissions:
contents: read
pull-requests: write

Àñ üñḿéţ ĝàţé ƒàîļš ţĥé ĵöƃ ŵîţĥ à đîšţîñçţ "ĝàţé üñḿéţ" àññöţàţîöñ àñđ þöšţš öñé šţîçķý ŕéþöŕţ çöḿḿéñţ ţĥàţ ŕé-ŕüñš üþđàţé îñ þļàçé.

Ţĥé Šĥîþ ĝàţéš & ÇÎ ŕéçîþé ŵàļķš ţĥé ĝàţé éñđ ţö éñđ, îñçļüđîñĝ ţĥé çöḿḿîţţéđ üñîţ-šţàţé ŕéçöŕđ ţĥàţ ļéţš à reviewed ţĥŕéšĥöļđ þàšš öñ à ŕüññéŕ.

Ŕéþöŕţ ţĥé çöšţ öƒ à çĥàñĝé öñ îţš þüļļ ŕéǫüéšţ

kapi up --plan đŕý-ŕüñš ţĥé ļööþ: þéñđîñĝ üñîţš, çöñţéñţ-ḿéḿöŕý ļéṽéŕàĝé, àñđ à ţöķéñ éšţîḿàţé, ŵîţĥ ñö ŵŕîţéš, ñö þŕöṽîđéŕ çàļļš, ñö ķéýš. Þöšţéđ öñ ţĥé þüļļ ŕéǫüéšţ ţĥàţ çŕéàţéđ ţĥé ŵöŕķ, îţ àñšŵéŕš "ŵĥàţ đöéš ţĥîš çĥàñĝé çöšţ îñ ţŕàñšļàţîöñ?" ƃéƒöŕé àñýöñé ḿéŕĝéš:

- uses: neokapi/kapi-action@v1
with:
plan: "true"
pr-comment: "true"

Ţĥîš çĥàñĝé ļéàṽéš 42 üñîţ(š) öƒ þéñđîñĝ ţŕàñšļàţîöñ ŵöŕķ: 30 ŕéçöṽéŕàƃļé ƒŕöḿ çöñţéñţ ḿéḿöŕý, 12 ƒöŕ ÀÎ (~450 ţöķéñš éšţîḿàţéđ).

Çŕéđéñţîàļš àñđ šţàţé öñ à ŕüññéŕ

  • À þŕöđüçîñĝ ĵöƃ üšéš àñ ÀÞÎ ķéý: šéţ à þŕöṽîđéŕ ķéý (ƒöŕ éẋàḿþļé ANTHROPIC_API_KEY) àš à ÇÎ šéçŕéţ. À šüƃšçŕîþţîöñ šîĝñ-îñ îš ƃöüñđ ţö ýöüŕ üšéŕ àñđ îţš üšàĝé ŵîñđöŵ; šéé Ļéţ kapi ŕüñ Çļàüđé. Îñ à šéŕṽéŕ-çöññéçţéđ þŕöĵéçţ (à ŕéçîþé ţĥàţ đéçļàŕéš à šéŕṽéŕ ṽéñüé) ţĥé šéŕṽéŕ ĥöļđš ţĥé ķéýš îñšţéàđ, àñđ ţĥé ĵöƃ àüţĥéñţîçàţéš ŵîţĥ à šéŕṽéŕ ţöķéñ.

  • À ĝàţé-öñļý ĵöƃ ñééđš ñö ķéýš àţ àļļ: check --ship àñđ up --plan ŕéàđ ţĥé ŵöŕķîñĝ ţŕéé.

  • Üñîţ šţàţé ţŕàṽéļš ŵîţĥ ţĥé ŕéþö: à reviewed ţĥŕéšĥöļđ ŕéàđš ţĥé çöḿḿîţţéđ üñîţ-šţàţé ŕéçöŕđ üñđéŕ .kapi/state/; çöḿḿîţ îţ îñ ţĥé ÞŔ öŕ ţĥé ŕüññéŕ šééš ñö àþþŕöṽàļš. À ĵöƃ ţĥàţ ḿàķéš đéçîšîöñš ŕüñš kapi commit àñđ çöḿḿîţš ţĥé šĥàŕđš îţ þŕöđüçéš, àļöñĝšîđé ţĥé ţŕàñšļàţéđ ƒîļéš. Îţ ñéṽéŕ çöḿḿîţš .kapi/work/store.db.

  • Ţĥé þàŕšé çàçĥé îš ţĥé þàŕţ ţö çàŕŕý ƃéţŵééñ ŕüñš: .kapi/work/cache/docs îš ĝîţîĝñöŕéđ, ŕéƃüîļţ öñ à ƒŕéšĥ ŕüññéŕ, àñđ ķéýéđ ƃý éàçĥ ƒîļé'š þàţĥ àñđ çöñţéñţ, ţĥé þàŕšé çöñƒîĝüŕàţîöñ, ţĥé ŕéçîþé àñđ ţĥé kapi ƃüîļđ, šö à ŕéšţöŕéđ éñţŕý çĥàñĝéš ñö ŕéšüļţ. setup-kapi çàŕŕîéš îţ ƃý đéƒàüļţ, àñđ à ĵöƃ ţĥàţ üšéš ţĥé àçţîöñ ñééđš ñö çàçĥé šţéþ öƒ îţš öŵñ:

    - uses: neokapi/setup-kapi@v1
    with:
    version: "1.2.0"
    # cache-tm: false turns the parse cache off

    Ŵîţĥöüţ ţĥé àçţîöñ, çàçĥé ţĥàţ öñé đîŕéçţöŕý:

    - uses: actions/cache@v6
    with:
    path: .kapi/work/cache/docs
    key: kapi-parse-${{ runner.os }}-${{ hashFiles('kapi.yaml', 'src/locales/en/**') }}
    restore-keys: kapi-parse-${{ runner.os }}-

    Çàçĥé ñöţĥîñĝ éļšé üñđéŕ .kapi/work. store.db ĥöļđš ţĥé üñîţ šţàţé šţàĝéđ šîñçé ţĥé ļàšţ çöḿḿîţ, àñđ à ŕéšţöŕéđ çöþý çĥàñĝéš ŵĥàţ à ŕüñ ŕéþöŕţš: öñ à ƒîẋţüŕé þŕöĵéçţ îţ ţüŕñéđ à ƒàîļîñĝ check --ship îñţö à þàššîñĝ öñé àñđ à ļöçàļé'š çöṽéŕàĝé ƒŕöḿ 0% ţö 100%. Ţĥé öţĥéŕ éñţŕîéš üñđéŕ cache/, šüçĥ àš ţĥé éẋţŕàçţîöñ ƃàţçĥéš, ţĥé ŕéđàçţîöñ ŕéçöŕđ àñđ ţĥé šýñç šţàţé, ƃéļöñĝ ţö ţĥé çĥéçķöüţ ţĥàţ ŵŕöţé ţĥéḿ. Šéŕṽéŕ-çöññéçţéđ þŕöĵéçţš šķîþ ţĥé çàçĥé éñţîŕéļý; ţĥé þŕöĵéçţ'š çöñţéẋţ ļîṽéš öñ ţĥé šéŕṽéŕ.

:::ñöţé[Ŵöŕķš ŵîţĥ Bowrain] Éṽéŕýţĥîñĝ öñ ţĥîš þàĝé ŕüñš ţĥé ļööþ îñšîđé ýöüŕ öŵñ ÇÎ. À þŕöĵéçţ ŵĥöšé ŕéçîþé đéçļàŕéš à bowrain: ƃļöçķ ŕüñš ţĥé šàḿé ļööþ öñ à Bowrain šéŕṽéŕ îñšţéàđ: kapi up þüšĥéš, ţĥé šéŕṽéŕ çàţçĥéš éṽéŕý ļöçàļé üþ àĝàîñšţ ţĥé ŵöŕķšþàçé'š šĥàŕéđ ḿéḿöŕý àñđ ţéŕḿîñöļöĝý, àñđ ţĥé ŕüñ šţŕéàḿš ƃàçķ, ŵîţĥ ŕéṽîéŵ ĥàñđļéđ îñ ţĥé Bowrain ŵéƃ àþþ ŕàţĥéŕ ţĥàñ îñ ýöüŕ çĥéçķöüţ. Šéé ţĥé Bowrain đöçüḿéñţàţîöñ. :::

Ñéẋţ