lingulink
v0.1.0
Published
LinguLink CLI — sync translation files and check coverage from your terminal and CI
Readme
lingulink
LinguLink CLI — sync translation files and check coverage from your terminal and CI.
Install
npm install -g lingulink # or: bunx lingulink <command>Setup
export LINGULINK_API_KEY=ll_... # create one in the LinguLink dashboard → API Keys
lingulink init --project-id <uuid>Create the key with the scopes your workflow needs:
| Command | Required scope(s) |
| -------- | ---------------------------------------- |
| pull | export:read |
| push | translations:write, translations:read (job status polling) |
| status | translations:read |
Scopes are checked literally (not implied by admin), so select every scope your workflow needs when creating the key.
This writes lingulink.json:
{
"format": "json",
"paths": { "pull": "locales/{language}.json" },
"projectId": "<uuid>"
}Optional: set LINGULINK_API_URL to target a non-production API.
Commands
lingulink pull # download all project languages
lingulink pull --lang de tr # specific languages
lingulink pull --env production # apply environment overrides
lingulink push locales/de.json --lang de # merge-import a JSON file
lingulink push locales/de.json --lang de --dry-run # preview changes
lingulink push locales/de.json --lang de --mode replace
lingulink status # coverage table per locale
lingulink status --json # machine-readable output
lingulink status --min 90 # exit 1 if any locale is below 90% (CI gate)Exit codes: 0 success · 1 validation / below threshold · 2 auth · 3 network/server.
Note: push accepts JSON files only in v1. Nested objects are flattened into
dot-separated keys (e.g. {"auth":{"title":"Sign in"}} imports as auth.title).
A null value imports as the literal string "null"; arrays are flattened into
index-suffixed keys (e.g. key.0, key.1) rather than being rejected — avoid
null/array values in files you push.
