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

kapi îñîţ

Îñîţîàļîžé à ñéŵ þŕöĵéçţ îñ ţĥé çüŕŕéñţ đîŕéçţöŕý. Çŕéàţéš à kapi.yaml ŕéçîþé àţ ţĥé þŕöĵéçţ ŕööţ àñđ à šîƃļîñĝ .kapi/ đîŕéçţöŕý ĥöļđîñĝ ţĥé þŕöĵéçţ'š çöñţéẋţ (ţéŕḿš, çöñţéñţ ḿéḿöŕý, ṽöîçé þŕöƒîļé àñđ üñîţ šţàţé), ŵîţĥ éṽéŕýţĥîñĝ đéŕîṽéđ çöñƒîñéđ ţö .kapi/work/. Ŵîţĥ ţĥé bowrain þļüĝîñ îñšţàļļéđ, kapi init çàñ àļšö çöññéçţ ţĥé þŕöĵéçţ ţö à ŵöŕķšþàçé.

Üšàĝé

kapi init [flags]

Îñţéŕàçţîṽé ḿöđé

Ŵĥéñ ŕüñ îñ à ţéŕḿîñàļ ŵîţĥöüţ ƒļàĝš, kapi init þŕéšéñţš àñ îñţéŕàçţîṽé ŵîžàŕđ.

΃ ýöü àŕé àļŕéàđý šîĝñéđ îñ (ṽîà kapi auth login), ţĥé ŵîžàŕđ ĝöéš šţŕàîĝĥţ ţö ŵöŕķšþàçé šéļéçţîöñ, ţĥéñ þŕöĵéçţ ñàḿé àñđ šöüŕçé ļöçàļé.

΃ ýöü àŕé ñöţ šîĝñéđ îñ, ţĥé ŵîžàŕđ öƒƒéŕš ƒöüŕ þàţĥš:

ÖþţîöñĐéšçŕîþţîöñ
Šîĝñ îñ ţö BowrainÀüţĥéñţîçàţé ṽîà ƃŕöŵšéŕ (ÖÀüţĥ đéṽîçé ƒļöŵ), šéļéçţ ŵöŕķšþàçé, çŕéàţé þŕöĵéçţ
Éḿàîļ ḿé à çļàîḿ ļîñķÇŕéàţé àñöñýḿöüš þŕöĵéçţ, ŕéçéîṽé çļàîḿ éḿàîļ
Çöñţîñüé ŵîţĥöüţ šîĝñîñĝ îñÇŕéàţé àñöñýḿöüš þŕöĵéçţ, þŕîñţ çļàîḿ ÜŔĻ
Ļöçàļ öñļýÑö šéŕṽéŕ çöññéçţîöñ; à þüŕé ļöçàļ þŕöĵéçţ

Àļļ îñţéŕàçţîṽé þàţĥš îñçļüđé à ƂÇÞ-47 ļöçàļé šéļéçţöŕ ŵîţĥ ţýþé-àĥéàđ ƒîļţéŕîñĝ (þŕéšš / ţö šéàŕçĥ) ƒöŕ ţĥé šöüŕçé ļöçàļé.

Àüţĥéñţîçàţéđ þàţĥš îñçļüđé à ŵöŕķšþàçé šéļéçţöŕ ŵĥéŕé ýöü çàñ çĥööšé àñ éẋîšţîñĝ ŵöŕķšþàçé öŕ çŕéàţé à ñéŵ öñé.

Éẋàḿþļéš

# Interactive mode (recommended)
kapi init

# Non-interactive: local project with locales
kapi init --name "My App" --source en --targets fr,de,ja

# Non-interactive: a source-only project (no target language yet)
kapi init --name "Docs" --source en

# Non-interactive: anonymous project (prints claim URL)
kapi init --anonymous --name "My App" --source en

# Non-interactive: anonymous project with email claim
kapi init --name "My App" --email alex@example.com

# Non-interactive: connect to an existing server project
kapi init --server https://app.bowrain.cloud --project abc123

# Non-interactive: create the project in a named workspace
kapi init --server https://app.bowrain.cloud --workspace acme

Ŵĥàţ ĥàþþéñš

  1. Çĥéçķš ţĥàţ ñö kapi.yaml ŕéçîþé àñđ ñö .kapi/ đîŕéçţöŕý àļŕéàđý éẋîšţ (ƒàîļš ƒàšţ îƒ ţĥéý đö)
  2. Ŵŕîţéš ţĥé kapi.yaml ŕéçîþé àţ ţĥé þŕöĵéçţ ŕööţ
  3. Çŕéàţéš ţĥé .kapi/ đîŕéçţöŕý ŵîţĥ flows/, memory/, state/, manifest.yaml, àñđ àñ éḿþţý work/cache/
  4. Àđđš ţĥé éẋàḿþļé pseudo ƒļöŵ àţ .kapi/flows/pseudo.yaml
  5. Àđđš ţĥé îĝñöŕé ŕüļé ƒöŕ .kapi/work/ àñđ .kapi/filters.local.json; ţĥé ŕéšţ öƒ .kapi/ îš çöḿḿîţţéđ
  6. Öþţîöñàļļý çŕéàţéš à þŕöĵéçţ öñ ţĥé Bowrain Šéŕṽéŕ àñđ ŵŕîţéš ţĥé bowrain: ƃļöçķ ţö ţĥé ŕéçîþé

Àƒţéŕ îñîţîàļîžàţîöñ, ýöü çàñ ŕüñ kapi status, kapi up, kapi run <flow>, àñđ öţĥéŕ çöḿḿàñđš ƒŕöḿ àñýŵĥéŕé ŵîţĥîñ ţĥé þŕöĵéçţ ţŕéé.

Öþţîöñš

ƑļàĝĐéšçŕîþţîöñĐéƒàüļţ
--nameÞŕöĵéçţ ñàḿéĐîŕéçţöŕý ñàḿé
--sourceŠöüŕçé ļöçàļé çöđé (ƂÇÞ 47)en
--targetsÇöḿḿà-šéþàŕàţéđ ţàŕĝéţ ļöçàļé çöđéš(ñöñé)
--presetÀþþļý à ƒŕàḿéŵöŕķ þŕéšéţ (ƒöŕ éẋàḿþļé nextjs, react-intl, angular)(ñöñé)
--serverBowrain Šéŕṽéŕ ÜŔĻBOWRAIN_SERVER_URL öŕ çöñƒîĝ
--workspaceÇŕéàţé ţĥé þŕöĵéçţ îñ ţĥîš ŵöŕķšþàçé (šļüĝ)ýöüŕ öñļý öŕ ƒîŕšţ ŵöŕķšþàçé
--projectŠéŕṽéŕ þŕöĵéçţ ÎĐ (çöññéçţ ţö éẋîšţîñĝ)(ñöñé)
--anonymousÇŕéàţé àñöñýḿöüš þŕöĵéçţ (þŕîñţš çļàîḿ ÜŔĻ)false
--emailÇŕéàţé àñöñýḿöüš þŕöĵéçţ, šéñđ çļàîḿ éḿàîļ(ñöñé)
--jsonÖüţþüţ îñ ĴŠÖÑ ƒöŕḿàţfalse
--textÖüţþüţ îñ ţéẋţ ƒöŕḿàţ (đéƒàüļţ)true

--server, --workspace, --project, --anonymous àñđ --email àŕé çöñţŕîƃüţéđ ƃý ţĥé bowrain þļüĝîñ.

ĴŠÖÑ öüţþüţ

Üšé --json ƒöŕ ḿàçĥîñé-ŕéàđàƃļé öüţþüţ (üšéƒüļ îñ ÇÎ/ÇĐ):

kapi init --anonymous --name "My App" --source en --json
{
"root": "/path/to/my-app",
"recipe": "/path/to/my-app/kapi.yaml",
"state_dir": "/path/to/my-app/.kapi",
"project_id": "proj_abc123",
"server": "https://app.bowrain.cloud",
"claim_token": "clm_def456",
"claim_url": "https://app.bowrain.cloud/claim/clm_def456"
}

Ŕéçîþé ƒîļé

kapi init çŕéàţéš kapi.yaml àţ ţĥé þŕöĵéçţ ŕööţ ŵîţĥ ţĥîš šţŕüçţüŕé. Ţĥé name: ƒîéļđ çàŕŕîéš ţĥé þŕöĵéçţ'š ĥüḿàñ-ŕéàđàƃļé ļàƃéļ; îţ đéƒàüļţš ţö ţĥé çüŕŕéñţ đîŕéçţöŕý ñàḿé àñđ îš ţĥé öñļý þļàçé ţĥàţ ñàḿé ļîṽéš:

version: v1
name: my-app

defaults:
source_language: en
target_languages: [fr, de, ja]

collections:
- path: src/locales/**/*.json
format: json
- path: content/*.md
format: markdown

# Optional: connect to Bowrain Server (compound URL)
bowrain:
url: https://app.bowrain.cloud/my-team/abc123
stream: $auto

# Hooks: flows to run at lifecycle points (schema only; see /cli/flows/hooks)
hooks:
pre-push: [qa, term-check]
post-pull: [segmentation]

Šéé Þŕöĵéçţ Ḿöđéļ ƒöŕ ţĥé ƒüļļ ŕéçîþé šçĥéḿà.

Šéŕṽéŕ ÜŔĻ ŕéšöļüţîöñ

Ţĥé šéŕṽéŕ ÜŔĻ îš ŕéšöļṽéđ ƒŕöḿ (ƒîŕšţ ḿàţçĥ ŵîñš):

  1. --server ƒļàĝ
  2. BOWRAIN_SERVER_URL éñṽîŕöñḿéñţ ṽàŕîàƃļé
  3. server.url îñ ţĥé þéŕ-ḿàçĥîñé bowrain çöñƒîĝ
  4. Éẋîšţîñĝ àüţĥ šţàţé (ƒŕöḿ kapi auth login)
  5. Ţĥé ĥöšţéđ šéŕṽîçé (https://app.bowrain.cloud), üšéđ öñļý ŵĥéñ îñîţ çöñţàçţš à šéŕṽéŕ (šîĝñ-îñ, --anonymous, --email, --project); à þļàîñ îñîţ ŵîţĥ ñöţĥîñĝ çöñƒîĝüŕéđ ŵŕîţéš à ŕéçîþé ŵîţĥ ñö bowrain: ƃļöçķ

Šéţ îţ öñçé ĝļöƃàļļý ŵîţĥ:

kapi config set bowrain.server.url https://app.bowrain.cloud

Þŕöĵéçţ đîšçöṽéŕý

Öñçé îñîţîàļîžéđ, kapi šéàŕçĥéš ƒöŕ à kapi.yaml ŕéçîþé ƃý ŵàļķîñĝ üþ ţĥé đîŕéçţöŕý ţŕéé (ļîķé ĝîţ). Ýöü çàñ ŕüñ çöḿḿàñđš ƒŕöḿ àñý šüƃđîŕéçţöŕý:

cd my-project/src/locales/
kapi status # finds kapi.yaml up the tree

Ṽéŕšîöñ çöñţŕöļ

Çöḿḿîţ ţö ĝîţ: kapi.yaml àñđ àļļ öƒ .kapi/:

  • kapi.yaml: ţĥé ŕéçîþé (šîñĝļé šöüŕçé öƒ ţŕüţĥ)
  • .kapi/terms.json, .kapi/memory/memory.json, .kapi/voice.yaml: ţĥé çöñţéẋţ šöüŕçéš ţĥé ŕéçîþé ƃîñđš
  • .kapi/state/*.jsonl: ţĥé üñîţ-šţàţé ŕéçöŕđ, þüƃļîšĥéđ ƃý kapi commit
  • .kapi/flows/*.yaml: ƒļöŵ đéƒîñîţîöñš ýöü àüţĥöŕ
  • .kapi/manifest.yaml, .kapi/filters.json: ƃööķķééþîñĝ àñđ šĥàŕéđ ŕéàđéŕ çöñƒîĝüŕàţîöñ

Đö ÑÖŢ çöḿḿîţ:

  • .kapi/work/: éṽéŕýţĥîñĝ đéŕîṽéđ: store.db, ţĥé çàçĥéš, ţĥé ŕéđàçţîöñ ṽàüļţ
  • .kapi/filters.local.json: ýöüŕ þéŕšöñàļ ŕéàđéŕ öṽéŕŕîđéš

Àüţĥ ţöķéñš àŕé ñéṽéŕ ŵŕîţţéñ ţö ţĥé þŕöĵéçţ. Ţĥéý ļîṽé îñ ţĥé ÖŠ ķéýçĥàîñ (ķéýš bowrain-auth:<server-url> àñđ bowrain-refresh:<server-url>); ñöñ-šéçŕéţ ḿéţàđàţà šîţš îñ auth.json îñ ţĥé bowrain çöñƒîĝ đîŕéçţöŕý (~/.config/bowrain öñ Ļîñüẋ, ~/Library/Application Support/bowrain öñ ḿàçÖŠ).

kapi init ŵŕîţéš à ţŵö-ļîñé îĝñöŕé ŕüļé, /.kapi/work/ àñđ /.kapi/filters.local.json, šö éṽéŕýţĥîñĝ éļšé üñđéŕ .kapi/, îñçļüđîñĝ ţĥé çöḿḿîţţéđ ŕéçöŕđ üñđéŕ .kapi/state/, šţàýš ţŕàçķéđ ŵîţĥ ñö ñéĝàţîöñ ţö ŕéḿéḿƃéŕ.

Ñéẋţ šţéþš

Àƒţéŕ îñîţîàļîžàţîöñ:

  1. Éđîţ çöñţéñţ çöļļéçţîöñš îñ kapi.yaml ţö ḿàţçĥ ýöüŕ ƒîļé šţŕüçţüŕé
  2. Ƃîñđ ţĥé çöñţéẋţ: à ṽöîçé þŕöƒîļé üñđéŕ defaults.voice, ţéŕḿš üñđéŕ defaults.terms_source, çööŕđîñàţéš üñđéŕ defaults.coordinates
  3. Çàţçĥ ţĥé þŕöĵéçţ üþ: kapi up
  4. Çöññéçţ ţö à šéŕṽéŕ: kapi init --server … öñ àñ éẋîšţîñĝ þŕöĵéçţ çöññéçţš îţ àñđ ļéàṽéš àñ àļŕéàđý-çöññéçţéđ þŕöĵéçţ üñţöüçĥéđ