Šçŕîþţîñĝ & ĴŠÖÑ çöñţŕàçţ
kapi'š çöŕé ṽéŕƃš šþéàķ à đöçüḿéñţéđ, ĝöļđéñ-ţéšţéđ ḿàçĥîñé çöñţŕàçţ šö šçŕîþţš, ÇÎ þîþéļîñéš, àñđ ƒöŕéîĝñ-ļàñĝüàĝé çàļļéŕš ñéṽéŕ ĥàṽé ţö þàŕšé þŕöšé. Ţĥîš þàĝé çöṽéŕš ţĥé öüţþüţ ƒļàĝš, ţĥé šţŕüçţüŕéđ ŕéšüļţš öƒ run, extract, àñđ merge, ţĥé ĴŠÖÑ éŕŕöŕ éñṽéļöþé, éẋîţ çöđéš, àñđ šţŕéàḿîñĝ þŕöĝŕéšš éṽéñţš. Ƒöŕ đŕîṽîñĝ ţĥé éñĝîñé öṽéŕ ĝŔÞÇ îñšţéàđ öƒ ţĥé ÇĻÎ, šéé ţĥé Éñĝîñé šéŕṽîçé; ƒöŕ ţĥé ÀÎ-àĝéñţ šüŕƒàçé, šéé ţĥé ḾÇÞ šéŕṽéŕ.
Çöḿþàţîƃîļîţý: ţĥé ĴŠÖÑ đöçüḿéñţš ƃéļöŵ àŕé à šţàƃļé çöñţŕàçţ. Ƒîéļđš ḿàý ƃé àđđéđ îñ à ŕéļéàšé; éẋîšţîñĝ ƒîéļđ ñàḿéš àñđ ţýþéš đö ñöţ çĥàñĝé. Ţĥé šĥàþéš àŕé ļöçķéđ ƃý ĝöļđéñ ţéšţš (cli/contract_golden_test.go).
Ĥüḿàñ-ŕéàđàƃļé ţéẋţ öüţþüţ îš ñöţ à çöñţŕàçţ. Îţ îš þŕéšéñţàţîöñ: çöļüḿñ ŵîđţĥš àđàþţ ţö ýöüŕ ţéŕḿîñàļ, ṽàļüéš àŕé ţŕüñçàţéđ ţö ƒîţ, àñđ îţ çàŕŕîéš ÀÑŠÎ šţýļîñĝ ŵĥéñ šţđöüţ îš à ŢŢÝ. Îţ îš ŕéšţýļéđ ŵĥéñéṽéŕ ţĥé ÇĻÎ'š þŕéšéñţàţîöñ îḿþŕöṽéš. Šçŕîþţš ḿüšţ üšé --json (öŕ --jq), ŵĥîçĥ îš šţàƃļé, üñšţýļéđ, àñđ ñéṽéŕ ţŕüñçàţéđ.
Öüţþüţ ƒļàĝš
Éṽéŕý çöḿḿàñđ àççéþţš ţĥé þéŕšîšţéñţ öüţþüţ ƒļàĝš:
| Ƒļàĝ | Ƀƒéçţ |
|---|---|
--json | Ḿàçĥîñé-ŕéàđàƃļé ĴŠÖÑ öñ šţđöüţ |
--text | Ĥüḿàñ ţéẋţ (ţĥé đéƒàüļţ) |
--output-format <json|text> | Éẋþļîçîţ ƒöŕḿàţ šéļéçţîöñ |
--jq <expr> | Ƒîļţéŕ ĴŠÖÑ öüţþüţ ţĥŕöüĝĥ à ĵǫ éẋþŕéššîöñ (îḿþļîéš --json) |
--color <auto|always|never> | Çöļöŕîžé öüţþüţ. auto çöļöŕîžéš öñļý ŵĥéñ šţđöüţ îš à ţéŕḿîñàļ |
Þŕéçéđéñçé: --jq > --json > --text > --output-format.
Çöļöŕ
Çöļöŕ îš öƒƒ ŵĥéñéṽéŕ šţđöüţ îš ñöţ à ţéŕḿîñàļ, šö þîþîñĝ öŕ ŕéđîŕéçţîñĝ àļŵàýš ýîéļđš þļàîñ ţéẋţ, ŵîţĥ ñö ÀÑŠÎ šţŕîþþîñĝ ŕéǫüîŕéđ. NO_COLOR đîšàƃļéš çöļöŕ àñđ CLICOLOR_FORCE ƒöŕçéš îţ, ƃöţĥ öṽéŕŕîđđéñ ƃý àñ éẋþļîçîţ --color.
Ţĥéŕé îš ñö ļîĝĥţ/đàŕķ šéţţîñĝ, ƃéçàüšé kapi đöéš ñöţ ĥàṽé à ļîĝĥţ àñđ à đàŕķ ţĥéḿé. Îţ ĥàš öñé þàļéţţé, çĥöšéñ šö ţĥàţ éṽéŕý çöļöŕ çļéàŕš ţĥé ŴÇÀĜ çöñţŕàšţ ƃàŕ ƒöŕ ÜÎ ţéẋţ öñ àñý ţéŕḿîñàļ ƃàçķĝŕöüñđ: ŵĥîţé, ƃļàçķ, Šöļàŕîžéđ, Öñé Đàŕķ, Đŕàçüļà àļîķé. Ñöţĥîñĝ ţö çöñƒîĝüŕé àñđ ñöţĥîñĝ ţö ĝéţ ŵŕöñĝ.
Ţĥàţ àļšö ḿéàñš kapi ñéṽéŕ ǫüéŕîéš ţĥé ţéŕḿîñàļ ƒöŕ îţš ƃàçķĝŕöüñđ çöļöŕ. Ţéŕḿîñàļš àñšŵéŕ šüçĥ à ǫüéŕý öñ šţđîñ, ŵĥîçĥ kapi'š öŵñ çöḿḿàñđš ŕéàđ (kcat -), àñđ à ţéŕḿîñàļ ţĥàţ đöéš ñöţ àñšŵéŕ ļéàṽéš ţĥé ŕàŵ éšçàþé šéǫüéñçé îñ ţĥé öüţþüţ, çöŕŕüþţîñĝ þîþéđ öüţþüţ, ÇÎ ļöĝš, àñđ ŕéçöŕđéđ šéššîöñš.
Ŕéšüļţ đöçüḿéñţš
Ŵîţĥ --json, ţĥé çöŕé ṽéŕƃš þŕîñţ öñé ĴŠÖÑ đöçüḿéñţ öñ šţđöüţ ŵĥéñ ţĥéý ƒîñîšĥ. Ŵîţĥöüţ îţ, ţĥéý þŕîñţ à ĥüḿàñ ŕéþöŕţ, ŵĥîçĥ îš þŕéšéñţàţîöñ ŕàţĥéŕ ţĥàñ à çöñţŕàçţ (šéé àƃöṽé).
kapi run
À šîñĝļé-ƒîļé ŕüñ ŕéþöŕţš ţĥé ƒļöŵ àñđ ţĥé þàţĥš îñṽöļṽéđ; à ƃàţçĥ ŕüñ ŕéþöŕţš ţĥé ƒîļé çöüñţ. Àñ îñ-þŕöĵéçţ ŕüñ ŵîţĥ ñö -o îš þŕöçéšš-öñļý (þŕöĵéçţš): îţ çöḿḿîţš ţàŕĝéţ öṽéŕļàýš ţö ţĥé þŕöĵéçţ šţöŕé îñšţéàđ öƒ ŵŕîţîñĝ à ƒîļé, àñđ ŕéþöŕţš process_only.
{
"flow_name": "pseudo-translate",
"input_path": "src/messages.json",
"output_path": "src/messages_qps.json"
}
{
"flow_name": "translate",
"input_path": "src/messages.json",
"process_only": true
}
kapi extract
Öñé đöçüḿéñţ þéŕ ƃàţçĥ: îđéñţîţý (batch_id, manifest), ţĥé éẋţŕàçţîöñ îñþüţš (format, targets, sources), öñé éñţŕý þéŕ ţàŕĝéţ-ļöçàļé þàšš üñđéŕ pairs (ƒîļé/ƃļöçķ çöüñţš àñđ çöñţéñţ-ḿéḿöŕý ļéṽéŕàĝé), ţĥé àĝĝŕéĝàţé leverage, îñçŕéḿéñţàļ reused çöüñţ, àñđ failures ŵĥéñ šöüŕçé/ţàŕĝéţ þàîŕš ƒàîļéđ (đéţàîļš šţŕéàḿ ţö šţđéŕŕ àš ţĥéý ĥàþþéñ).
{
"batch_id": "0b6be731-3a5c-4a02-9e04-2f79e4c2d1aa",
"format": "xliff2",
"targets": ["fr", "de"],
"sources": 2,
"manifest": ".kapi/work/cache/extractions/0b6be731/manifest.yaml",
"pairs": [
{
"target_locale": "fr",
"files": 2,
"blocks": 10,
"leverage": { "exact": 4, "fuzzy": 1, "new": 5 }
}
],
"leverage": { "exact": 4, "fuzzy": 1, "new": 15 }
}
kapi merge
Àþþļýîñĝ ŕéţüŕñéđ ƃîļîñĝüàļ ƒîļéš (merge -i) ŕéþöŕţš öñé éñţŕý þéŕ îñþüţ þļüš ţöţàļš àñđ ţĥé ŕéšöļṽéđ çöñƒļîçţ þöļîçý; à ƒàîļéđ îñþüţ çàŕŕîéš àñ error îñšţéàđ öƒ çöüñţš.
{
"files": [
{
"input": "out/app.en-to-fr.xliff",
"applied": 8,
"stale": 1,
"skipped": 0,
"tm_new": 6,
"tm_updated": 2
}
],
"applied": 8,
"stale": 1,
"skipped": 0,
"tm_new": 6,
"tm_updated": 2,
"conflict_policy": "translator-wins"
}
Ḿàţéŕîàļîžîñĝ ƒŕöḿ ţĥé þŕöĵéçţ šţöŕé (kapi merge ŵîţĥ ñö -i îñ à þŕöĵéçţ) ŕéþöŕţš ţĥé ŵŕîţţéñ-ƒîļé çöüñţ:
{ "written": 4, "from_project_store": true }
Éŕŕöŕ éñṽéļöþé
Üñđéŕ --json (öŕ --jq / --output-format=json), à ƒàîļîñĝ çöḿḿàñđ þŕîñţš à šţŕüçţüŕéđ éñṽéļöþé öñ šţđéŕŕ îñšţéàđ öƒ ţĥé þļàîñ Error: ļîñé:
{ "error": "quality gate failed", "code": "gate" }
code îš ţĥé šýḿƃöļîç ƒöŕḿ öƒ ţĥé þŕöçéšš éẋîţ çöđé (ƃéļöŵ). Éẋîţ çöđéš àŕé üñçĥàñĝéđ ƃý --json; îñ ţéẋţ ḿöđé ţĥé éŕŕöŕ îš šţîļļ ŕéþöŕţéđ àš àñ Error: <message> ļîñé.
Éẋîţ çöđéš
| Çöđé | Šýḿƃöļ | Ḿéàñîñĝ |
|---|---|---|
| 0 | (ñöñé) | Šüççéšš |
| 1 | error | Öþéŕàţîöñàļ éŕŕöŕ |
| 2 | usage | Üšàĝé / îñṽöçàţîöñ éŕŕöŕ (àļšö ĝŕéþ-šţýļé "ţŕöüƃļé" ƒöŕ ţĥé ţööļƃöẋ üţîļîţîéš) |
| 3 | gate | À ǫüàļîţý öŕ ṽöîçé ĝàţé ƒàîļéđ (é.ĝ. kapi voice check --min-score), đîšţîñçţ ƒŕöḿ àñ öþéŕàţîöñàļ éŕŕöŕ šö ÇÎ çàñ ţéļļ "ţĥé çöñţéñţ îšñ'ţ ĝööđ éñöüĝĥ" ƒŕöḿ "ţĥé ţööļ ƃŕöķé" |
| 4 | did_not_run | kapi check ŕéàçĥéđ ñö ṽéŕđîçţ: îţ çĥéçķéđ ñö çöñţéñţ, öŕ öñé öƒ îţš çĥéçķš ŕéþöŕţéđ ñöţĥîñĝ öñ ţĥé ķñöŵñ-ƃàđ šàḿþļé îţ ŕüñš ƃéšîđé ţĥé çöñţéñţ. Ñéṽéŕ à þàšš |
| 130 | signal | Îñţéŕŕüþţéđ (ŠÎĜÎÑŢ/ŠÎĜŢÉŔḾ); ñö éŕŕöŕ ļîñé îš þŕîñţéđ |
Ţĥé ţööļƃöẋ üţîļîţîéš (kgrep) àđđîţîöñàļļý üšé ĝŕéþ-þàŕîţý šéḿàñţîçš: éẋîţ 1 ŵîţĥ ñö ḿéššàĝé ŵĥéñ ñöţĥîñĝ ḿàţçĥéđ.
Šţŕéàḿîñĝ þŕöĝŕéšš: --progress jsonl
run, extract, àñđ merge àççéþţ --progress jsonl, ŵĥîçĥ šţŕéàḿš þŕöĝŕéšš éṽéñţš ţö šţđéŕŕ àš ÑĐĴŠÖÑ (öñé ĴŠÖÑ öƃĵéçţ þéŕ ļîñé) ŵĥîļé šţđöüţ šţàýš ŕéšéŕṽéđ ƒöŕ ţĥé ƒîñàļ ŕéšüļţ. Ţĥé éṽéñţš üšé ţĥé ƒļöŵ-ŕüñ éṽéñţ ṽöçàƃüļàŕý (ţĥé šàḿé šĥàþéš ţĥé Kapi Đéšķţöþ ŕüñ šîñķ ŕéçéîṽéš), ŵîţĥ flow ñàḿîñĝ ţĥé ṽéŕƃ öŕ ƒļöŵ:
type | Ḿéàñîñĝ | Ķéý ƒîéļđš |
|---|---|---|
state | Ŕüñ-šţàţé ţŕàñšîţîöñ | message |
progress | Àƃöüţ ţö þŕöçéšš öñé ƒîļé (öŕ šöüŕçé→ļöçàļé þàîŕ) | file_index, file_count, file_path, locale |
file_done | Öñé üñîţ çöḿþļéţéđ | file_path, output_path, locale |
pipeline_metrics | Þéŕ-šţéþ ţĥŕöüĝĥþüţ šñàþšĥöţ (ḿüļţî-ļöçàļé þŕöĵéçţ ŕüñš) | steps |
complete | Ŕüñ ƒîñîšĥéđ | duration_ms, files_processed, message |
kapi extract -p kapi.yaml --progress jsonl 2> >(jq -c 'select(.type=="file_done")')
{"type":"progress","flow":"extract","locale":"fr","file_count":4,"file_path":"src/messages.json"}
{"type":"file_done","flow":"extract","locale":"fr","file_path":"src/messages.json","output_path":"out/src-messages.en-to-fr.xliff"}
{"type":"complete","flow":"extract","duration_ms":420,"files_processed":4}
Šţŕéàḿ îñţéĝŕîţý: à ţŕüñçàţéđ ÑĐĴŠÖÑ šţŕéàḿ îš ñéṽéŕ šîļéñţ
Éṽéŕý ÑĐĴŠÖÑ šţŕéàḿ kapi ŵŕîţéš (kapi up --json, --progress jsonl) îš à
çöñţŕàçţ ŵîţĥ à ḿàçĥîñé ŕéàđéŕ, šö à šţŕéàḿ ţĥàţ šţöþš éàŕļý ḿüšţ ñöţ ļööķ ļîķé öñé
ţĥàţ ƒîñîšĥéđ. Ţĥé ţŵö ŵàýš à ŵŕîţé çàñ ƒàîļ àŕé ţŕéàţéđ đéŕéñţļý, ƃéçàüšé ţĥéý
ḿéàñ öþþöšîţé ţĥîñĝš:
| Ŵĥàţ ĥàþþéñéđ | kapi'š ƃéĥàṽîöüŕ |
|---|---|
Ýöü šţöþþéđ ŕéàđîñĝ: kapi up --json | head, à jq ƒîļţéŕ ţĥàţ éẋîţš, à ŵàţçĥîñĝ ÜÎ ţĥàţ đîšçöññéçţš | Ţĥé šţŕéàḿ šţöþš, ǫüîéţļý, àñđ ţĥé ŕüñ îš ñöţ ƒàîļéđ. Ƒàîļîñĝ à ŕüñ ƃéçàüšé îţš ŕéàđéŕ ŵàļķéđ àŵàý ŵöüļđ ƃé ŵöŕšé ţĥàñ ţĥé šîļéñçé. Öñ à šĥéļļ þîþé ţĥé þŕöçéšš îš ñöŕḿàļļý ţéŕḿîñàţéđ ƃý SIGPIPE ƃéƒöŕé ţĥé ŵŕîţé éṽéñ ŕéţüŕñš, ĝîṽîñĝ ţĥé çöñṽéñţîöñàļ 141 éẋîţ; éîţĥéŕ ŵàý ñöţĥîñĝ îš þŕîñţéđ. |
| Ţĥé ŵŕîţé ƒàîļéđ: à ƒüļļ đîšķ, à çļöšéđ ƒîļé, àñ üñŵŕîţàƃļé đéšţîñàţîöñ | Öñé ḿéššàĝé öñ šţđéŕŕ (öŕ ţĥé ĴŠÖÑ éŕŕöŕ éñṽéļöþé) ñàḿîñĝ ţĥé šţŕéàḿ àñđ çöüñţîñĝ ŵĥàţ ĝöţ ţĥŕöüĝĥ, àñđ à ñöñ-žéŕö éẋîţ. À çöñšüḿéŕ ḿüšţ ñéṽéŕ ƃéļîéṽé à ţŕüñçàţéđ šţŕéàḿ. |
$ kapi up --json > /mnt/full/out.ndjson
Error: kapi up --json: the event stream truncated: 6 record(s) written, 12 lost: write /dev/stdout: no space left on device
$ echo $?
1
Ţĥé đîšţîñçţîöñ îš đŕàŵñ šţŕüçţüŕàļļý (errors.Is àĝàîñšţ syscall.EPIPE àñđ
io.ErrClosedPipe, þļüš ţĥé Ŵîñđöŵš ƃŕöķéñ-þîþé éŕŕñöš), ñéṽéŕ ƃý ḿàţçĥîñĝ ţĥé
ḿéššàĝé ţéẋţ. Üñđéŕ --progress jsonl ţĥé éẋîţ çöđé îš ţĥé šîĝñàļ ţö ŕéàđ:
ŵĥéñ ţĥé ƒàîļîñĝ ŵŕîţéŕ îš šţđéŕŕ, ţĥé ḿéššàĝé ĥàš ñöŵĥéŕé ţö ļàñđ.
Šţŕéàḿîñĝ îñšþéçţîöñ: kapi inspect --jsonl
Ƒöŕ ƃļöçķ-ļéṽéļ çöñţéñţ šţŕéàḿîñĝ (ŕàţĥéŕ ţĥàñ ŕüñ þŕöĝŕéšš), kapi inspect --jsonl éḿîţš öñé ĴŠÖÑ öƃĵéçţ þéŕ ƃļöçķ; ŕüñ kapi inspect --help ƒöŕ ţĥé ƃļöçķ ƒîéļđš.
ḾÇÞ šüŕƒàçé šţàƃîļîţý
Ţĥé ḾÇÞ šéŕṽéŕ (kapi mcp) îš þàŕţ öƒ ţĥé šàḿé çöñţŕàçţ: îţš ţööļ ñàḿéš àñđ îñþüţ šçĥéḿàš àŕé à šţàƃļé šüŕƒàçé ƒöŕ àĝéñţ îñţéĝŕàţîöñš, ļöçķéđ ƃý à šñàþšĥöţ ţéšţ (kapi/cmd/kapi/mcp_snapshot_test.go). Ñéŵ ţööļš àñđ ñéŵ öþţîöñàļ ƒîéļđš ḿàý ƃé àđđéđ; éẋîšţîñĝ ţööļš àŕé ñöţ ŕéñàḿéđ öŕ ŕéḿöṽéđ, àñđ éẋîšţîñĝ ƒîéļđš đö ñöţ çĥàñĝé ţýþé, ŵîţĥöüţ àñ éẋþļîçîţ, đöçüḿéñţéđ đéçîšîöñ.
check_text àççéþţš àñ öþţîöñàļ context_path, à þŕöĵéçţ-ŕéļàţîṽé đéšţîñàţîöñ
ŵĥöšé ṽöîçé àñđ ţéŕḿš àþþļý ţö ţĥé šüþþļîéđ đŕàƒţ. Îţ ŕéǫüîŕéš à ƃöüñđ þŕöĵéçţ
àñđ çàññöţ ƃé çöḿƃîñéđ ŵîţĥ profile_file öŕ profile_pack. Ţĥé ŕéšüļţ ķééþš
target.kind: "text" àñđ ŕéçöŕđš ţĥé đéšţîñàţîöñ îñ target.context_path;
ţĥé đéšţîñàţîöñ ñééđ ñöţ éẋîšţ. Üñšçöþéđ šñîþþéţ çĥéçķš ŕéţàîñ ţĥéîŕ éẋþļîçîţ
þŕöƒîļé öþţîöñš. Šéé Çĥéçķš ƒöŕ ŕéþöŕţ çöṽéŕàĝé.
Ţĥé öþţîöñàļ execution.contexts àŕŕàý àđđš þéŕ-îñþüţ ĝüîđàñçé šéļéçţîöñ ţö
kapi.check/v1 ŵîţĥöüţ çĥàñĝîñĝ éẋîšţîñĝ ŕéþöŕţ ƒîéļđš. Éñţŕîéš çöñţàîñ file
öŕ context_path, voice (selection, applied, öþţîöñàļ name, source,
profile àñđ channel), terms_applied, àñđ, ŵĥéñ à þŕöĵéçţ ŕéšöļṽéđ ţĥé
ĝüîđàñçé, point (profile, channel, àñđ comments ƒöŕ ţĥé þöîñţ à ƒîļé'š
çöḿḿéñţš šîţ àţ). Ƒîñđîñĝš, îñçļüđîñĝ ţĥöšé öƒ kapi check --ship, çàŕŕý ţĥé
šàḿé öþţîöñàļ point. voice.selection îš project,
override öŕ none. Ḿîššîñĝ çöñţéẋţ ḿéţàđàţà ḿéàñš üñŕéþöŕţéđ šéļéçţîöñ.
ÇĻÎ ƒîļé çĥéçķš, ḾÇÞ ƒîļé/đŕàƒţ çĥéçķš àñđ šöüŕçé-çöñţéñţ ŕéļéàšé çĥéçķš šüþþļý
îţ. Éẋþļîçîţ ṽöîçé öṽéŕŕîđéš ŕéţàîñ ţĥéîŕ ƃéĥàṽîöŕ àñđ àŕé îđéñţîƒîéđ àš
override; ḾÇÞ ƒîéļđ đéšçŕîþţîöñš šţàţé ţĥàţ öḿîţţîñĝ öṽéŕŕîđéš þŕéšéŕṽéš
ƒîļé-šçöþéđ þŕöĵéçţ ĝüîđàñçé. Šéé Çĥéçķš ƒöŕ îñţéŕþŕéţàţîöñ.
Ţĥé öþţîöñàļ warnings àŕŕàý îš àļšö àđđîţîṽé ţö kapi.check/v1, àñđ ţĥé
kapi check --ship ŕéšüļţ çàŕŕîéš ţĥé šàḿé àŕŕàý àţ îţš ţöþ ļéṽéļ. Éàçĥ éñţŕý
çöñţàîñš code, message, source àñđ, ŵĥéñ ţĥé ŵàŕñîñĝ çöñçéŕñš öñé ķéý,
key. Ţĥé àŕŕàý îš öḿîţţéđ ŵĥéñ à ŕüñ ĥàš ñöñé. Ŵàŕñîñĝš đéšçŕîƃé ţĥé
çöñƒîĝüŕàţîöñ à çĥéçķ ŕàñ üñđéŕ, àñđ ţĥéý ñéṽéŕ çĥàñĝé pass, verdict,
summary, gate öŕ ţĥé éẋîţ çöđé. Ţĥé ḾÇÞ check_text àñđ check_file ţööļš
ŕéţüŕñ ţĥéḿ îñ ţĥé šàḿé ŕéþöŕţ, àñđ ţĥé check_report_warnings ĝöļđéñ îñ
cli/contract_golden_test.go þîñš ţĥé šĥàþé. Šéé Çĥéçķš
ƒöŕ ţĥé çöđéš.
Ƒöŕ apply_edits, çöñţéñţ éñţŕîéš þüţ ñéŵ ŵöŕđîñĝ îñ text; replacement îš
à ṽöîçé-ŕüļé ƒîéļđ. À ñöñéḿþţý replacement öñ à çöñţéñţ éñţŕý îš ŕéĵéçţéđ
ƃéƒöŕé àþþļýîñĝ ţĥé çĥàñĝé-šéţ. Ţĥé îñþüţ ƒîéļđ đéšçŕîþţîöñš šţàţé ţĥîš
đîšţîñçţîöñ ŵîţĥöüţ çĥàñĝîñĝ ƒîéļđ ñàḿéš öŕ ţýþéš.
Ţĥé ŕéĝîšţŕý ţööļš öñ ţĥàţ šüŕƒàçé àŕé éẋàçţļý ţĥé ÇĻÎ-ṽîšîƃļé öñéš: à ƃüîļţ-îñ ţööļ àþþéàŕš üñđéŕ kapi exec, îñ kapi tools list, àñđ àš àñ ḾÇÞ ţööļ ŵĥéñ îţ ŕéĝîšţéŕš à çöñƒîĝ ƒàçţöŕý àñđ đöéš ñöţ đéçļàŕé îţšéļƒ îñţéŕñàļ (registry.ToolRegistry.CLITools). Ŵîŕîñĝ à ƒàçţöŕý ƒöŕ à ţööļ ţĥàţ ļàçķéđ öñé îš ţĥéŕéƒöŕé àñ àđđîţîṽé šüŕƒàçé çĥàñĝé: îţ àđđš ţĥé ţööļ ţö àļļ ţĥŕéé àţ öñçé, àñđ ţĥé šñàþšĥöţ ḿöṽéš. whitespace-correct ĝàîñéđ öñé ţĥîš ŵàý, àñđ dnt-check, placeholder-check, xml-validation, create-target, remove-target, inline-codes-remove àñđ external-command ƒöļļöŵéđ.
Ţĥé up ţööļ ţàķéš àñ öþţîöñàļ local ƒîéļđ, ḿîŕŕöŕîñĝ kapi up --local: îñ à þŕöĵéçţ çöññéçţéđ ţö à šéŕṽéŕ ţĥé ŕüñ ĥàþþéñš àţ ţĥàţ ṽéñüé ƃý đéƒàüļţ (ţĥé šàḿé đéçîšîöñ ţĥé çöḿḿàñđ ḿàķéš) àñđ local ķééþš ţĥé ļööþ öñ ţĥîš ḿàçĥîñé, þüšĥîñĝ ţĥé ŕéšüļţš àƒţéŕŵàŕđš.
review_queue ţàķéš àñ öþţîöñàļ language ƒîéļđ, ḿîŕŕöŕîñĝ kapi status --review --lang: ţĥé ǫüéüé ĥöļđš éṽéŕý ļàñĝüàĝé ţĥé þŕöĵéçţ ĥàš ŵöŕķ îñ, šö language ñàŕŕöŵš îţ ţö öñé, ţĥé þŕöĵéçţ'š šöüŕçé ļàñĝüàĝé îñçļüđéđ. Ţĥé ŕöŵš çàŕŕý language, isSource, status àñđ held, àñđ ţĥé ŕéšüļţ çàŕŕîéš languages ŵîţĥ ţĥé þéñđîñĝ çöüñţ þéŕ ļàñĝüàĝé.
Ŕüññîñĝ çöḿḿàñđš à ŕéçîþé ñàḿéš
external-command àñđ script ŕüñ çöđé ţĥé çöñƒîĝüŕàţîöñ çĥööšéš. Ţĥéý šţàý
àṽàîļàƃļé öñ éṽéŕý šüŕƒàçé ŵĥéŕé ţĥé àŕĝṽ îš ţĥé üšéŕ'š öŵñ: kapi exec external-command --command … ŕüñš ŵĥàţ îţ ŵàš ţöļđ ţö, üñçĥàñĝéđ.
Ŵĥàţ à ŕéçîþé đöéš ŵîţĥ ţĥéḿ îš ĝàţéđ. À þŕöĵéçţ ŵĥöšé ŕéçîþé ñàḿéš éîţĥéŕ
ţööļ þŕöḿþţš öñçé, šĥöŵîñĝ ţĥé çöḿḿàñđ îţ ŵöüļđ ŕüñ, àñđ ţĥé àñšŵéŕ îš
ŕéḿéḿƃéŕéđ üñđéŕ ţĥé kapi çöñƒîĝ đîŕéçţöŕý àĝàîñšţ à ƒîñĝéŕþŕîñţ öƒ ŵĥàţ ŵàš
àþþŕöṽéđ, šö àñ üñŕéļàţéđ ŕéçîþé éđîţ ķééþš ţĥé àþþŕöṽàļ àñđ à çĥàñĝéđ çöḿḿàñđ
àšķš àĝàîñ. Ŵîţĥ ñö ţéŕḿîñàļ àţţàçĥéđ kapi ŕéƒüšéš ŕàţĥéŕ ţĥàñ àššüḿîñĝ
çöñšéñţ; KAPI_TRUST_EXEC=1 îš ţĥé öþţ-îñ ƒöŕ àüţöḿàţîöñ, àñđ ţĥé ĝéñéŕàļ
--yes ƒļàĝ đéļîƃéŕàţéļý đöéš ñöţ ĝŕàñţ îţ. Ţĥé éñĝîñé ĝŔÞÇ ÀÞÎ àñđ ţĥé ḾÇÞ
ţööļ šüŕƒàçé ŕéƒüšé ţĥéšé ţööļš öüţŕîĝĥţ. Šéé
É-06.
Ţööļ ŕéĝîšţŕàţîöñ îñṽàŕîàñţš
Ţĥŕéé þŕöþéŕţîéš öƒ à ƃüîļţ-îñ ţööļ'š ŕéĝîšţŕàţîöñ àŕé àššéŕţéđ öṽéŕ ţĥé þöþüļàţéđ ŕéĝîšţŕý, îñ core/tools/registration_invariants_test.go, ƃéçàüšé éàçĥ öñé ƒàîļš šîļéñţļý ŵĥéñ îţ îš ļéƒţ ţö ŕéṽîéŵ:
- À ţööļ ţĥàţ đéçļàŕéš šéţţàƃļé šçĥéḿà ƒîéļđš ŕéĝîšţéŕš à çöñƒîĝ ƒàçţöŕý. Ŵîţĥöüţ öñé,
NewToolWithConfigçàļļš ţĥé žéŕö-àŕĝ ƒàçţöŕý àñđ đîšçàŕđš ţĥé šţéþ'šconfig:ḿàþ ŵîţĥöüţ à ŵöŕđ, àñđ ţĥé ţööļ'š đöçüḿéñţéđ þàŕàḿéţéŕš đö ñöţĥîñĝ. - À ƃîļîñĝüàļ ţööļ'š ţàŕĝéţ ļöçàļé çöḿéš ƒŕöḿ ţĥé ŕüñ.
--target-langöüţŕàñķš àñý ļöçàļé ŵŕîţţéñ îñţö à šţéþ'š çöñƒîĝ, šö öñé ƒļöŵ šéŕṽéš éṽéŕý ļöçàļé îţ îš ŕüñ ƒöŕ. À ƒàçţöŕý ţĥàţ þîñš à ļöçàļé ļéàṽéš ţĥé ţööļ þŕöçéššîñĝ çöñţéñţ ţĥé ŕüñ ñéṽéŕ àšķéđ ƒöŕ, àñđ ŕéþöŕţîñĝ šüççéšš. - À ÇĻÎ-ṽîšîƃļé ţööļ ţĥàţ ŕéŵŕîţéš çöñţéñţ đéçļàŕéš
writesOutput.kapi execĝŕöŵš-o/--output-diröñļý ƒöŕ ţööļš ţĥàţ đö; ŵîţĥöüţ îţ àñ éẋéç ŕüñ ŕéŵŕîţéš ţĥé çöñţéñţ îñ ḿéḿöŕý, éẋîţš 0, àñđ ŵŕîţéš ñöţĥîñĝ.
Ŵîţĥĥöļđîñĝ à ţööļ ƒŕöḿ ţĥé ÇĻÎ îš à šéþàŕàţé đéçîšîöñ, đéçļàŕéđ ŵîţĥ internal: true öñ îţš ToolMeta àñđ ñéṽéŕ éẋþŕéššéđ ƃý öḿîţţîñĝ à çöñƒîĝ ƒàçţöŕý, ŵĥîçĥ ŵöüļđ ḿàķé à ƒöŕĝöţţéñ ţööļ îñđîšţîñĝüîšĥàƃļé ƒŕöḿ öñé đéļîƃéŕàţéļý ŵîţĥĥéļđ. Àñ îñţéŕñàļ ţööļ îš šţîļļ çöñƒîĝüŕàƃļé: à ƒļöŵ ḿàý ñàḿé îţ àš à šţéþ.
Šţéþ çöñƒîĝ ķéýš àŕé ţĥé çöñƒîĝ šţŕüçţ'š ĴŠÖÑ ñàḿéš, ŵĥîçĥ àŕé çàḿéļÇàšé (normalizeSpaces, flagExtra, textUnitIDs). Àþþļîçàţîöñ îš à json.Unmarshal, šö àñ üñŕéçöĝñîžéđ ķéý (à šñàķé_çàšé šþéļļîñĝ, öŕ à ƒîéļđ ţĥé ţööļ đöéš ñöţ ĥàṽé) îš šîļéñţļý îĝñöŕéđ.