Releases: ruwadgroup/autotranslate
Release list
@autotranslate/zod@1.0.0-beta.10
@autotranslate/vite@1.0.0-beta.20
@autotranslate/react@1.0.0-beta.11
@autotranslate/providers@1.0.0-beta.10
Minor Changes
-
bb38cd5
Thanks @tamimbinhakim! - Add theagent
provider - translate with Claude Code or CodexDrives a headless coding-agent CLI already installed and signed in on the
machine, instead of calling a model API. No API key, no separate billing.provider: { name: 'agent', agent: 'claude', // or 'codex' model: 'claude-haiku-4-5', // optional }
The agent is used strictly as a text transformer - tools disabled, sandbox
read-only, prompt on stdin, JSON out. It cannot touch your repository.- Claude Code:
claude -p --output-format json --disallowedTools '*'.
Fenced or prose-wrapped answers are unwrapped by a balanced-brace scan. - Codex:
codex exec --sandbox read-only --output-schema, so the response
shape is enforced by the API rather than by prompt discipline.
Options:
agent,model,command,args,timeoutMs(default 300000).Each batch is a process spawn, so this suits local development and
small-to-medium catalogs rather than bulk runs; keepconcurrencymodest. CI
runners do not carry your agent login, so preferaiwith a key there.Batching, retry with backoff, and re-asking for omitted keys are shared with
theaiprovider. - Claude Code:
-
bb38cd5
Thanks @tamimbinhakim! - Fix incremental
translation: committed catalogs are now the diff baselineinitgitignored.translations/.cache/, andtranslateused that cache as
its only record of what had been translated - it never consulted the committed
catalogs. On any machine without the cache (fresh clone, new teammate, every
CI run) the entire catalog was re-sent to the provider despite valid
translations sitting in the repo.Three defects compounded it:
- Omitted keys deleted committed translations. A key missing from a
provider response (routine on large batches) was pruned from the catalog on
write. - One failed chunk discarded the run. Catalogs were written only after
every task settled, so a single 429 threw away every other chunk's work. - Reference context was unbounded. Every cached neighbour rode along on
every request, growing prompts with catalog size - which is what pushed
large batches past the point where models answer completely.
Changes
- Translation state moves to
.translations/.state/<locale>/<chunk>.json,
recording the source hash behind each translation. Commit it -initno
longer ignores anything underoutDirand strips a stale.cache/line if
it finds one. Existing.cache/layouts migrate on the nexttranslate. - Switching provider or model no longer invalidates anything.
- Omitted keys keep their previous translation and stay out of state, so the
next run retries exactly those. - Batches fail independently.
TranslateResultgainsfailures; the CLI
exits non-zero when any batch failed. - Reference context is capped at 8 items.
Batching moves to the CLI
translatenow plans the whole run, collapses duplicate copy, and splits the
remainder into uniform batches instead of inheriting whatever landed in a hash
bucket.- New
batchSizeconfig option (default 25). This is the lever when a model
drops items. - Identical copy under several keys is translated once and fanned out; copy
with differing context or description still translates separately. - The
aiprovider retries transient failures with backoff and re-asks for
omitted keys in smaller slices.
TranslateProgressreportsbatch/totalBatches/itemsinstead of
chunkPath.Upgrading
Run
npx autotranslate initonce, then commit.translations/.init
removes the stale.gitignoreentry and the nexttranslatemigrates
.cache/into.state/, so no retranslation is needed.Until
.state/is committed, CI still has no diff input and will retranslate
the full catalog on each run - exactly the old behaviour, no worse. Projects
that never commit.translations/at all are unaffected. - Omitted keys deleted committed translations. A key missing from a
Patch Changes
@autotranslate/next@1.0.0-beta.20
@autotranslate/eslint-plugin@1.0.0-beta.10
@autotranslate/core@1.0.0-beta.10
Minor Changes
-
bb38cd5
Thanks @tamimbinhakim! - Add theagent
provider - translate with Claude Code or CodexDrives a headless coding-agent CLI already installed and signed in on the
machine, instead of calling a model API. No API key, no separate billing.provider: { name: 'agent', agent: 'claude', // or 'codex' model: 'claude-haiku-4-5', // optional }
The agent is used strictly as a text transformer - tools disabled, sandbox
read-only, prompt on stdin, JSON out. It cannot touch your repository.- Claude Code:
claude -p --output-format json --disallowedTools '*'.
Fenced or prose-wrapped answers are unwrapped by a balanced-brace scan. - Codex:
codex exec --sandbox read-only --output-schema, so the response
shape is enforced by the API rather than by prompt discipline.
Options:
agent,model,command,args,timeoutMs(default 300000).Each batch is a process spawn, so this suits local development and
small-to-medium catalogs rather than bulk runs; keepconcurrencymodest. CI
runners do not carry your agent login, so preferaiwith a key there.Batching, retry with backoff, and re-asking for omitted keys are shared with
theaiprovider. - Claude Code:
-
bb38cd5
Thanks @tamimbinhakim! - Fix incremental
translation: committed catalogs are now the diff baselineinitgitignored.translations/.cache/, andtranslateused that cache as
its only record of what had been translated - it never consulted the committed
catalogs. On any machine without the cache (fresh clone, new teammate, every
CI run) the entire catalog was re-sent to the provider despite valid
translations sitting in the repo.Three defects compounded it:
- Omitted keys deleted committed translations. A key missing from a
provider response (routine on large batches) was pruned from the catalog on
write. - One failed chunk discarded the run. Catalogs were written only after
every task settled, so a single 429 threw away every other chunk's work. - Reference context was unbounded. Every cached neighbour rode along on
every request, growing prompts with catalog size - which is what pushed
large batches past the point where models answer completely.
Changes
- Translation state moves to
.translations/.state/<locale>/<chunk>.json,
recording the source hash behind each translation. Commit it -initno
longer ignores anything underoutDirand strips a stale.cache/line if
it finds one. Existing.cache/layouts migrate on the nexttranslate. - Switching provider or model no longer invalidates anything.
- Omitted keys keep their previous translation and stay out of state, so the
next run retries exactly those. - Batches fail independently.
TranslateResultgainsfailures; the CLI
exits non-zero when any batch failed. - Reference context is capped at 8 items.
Batching moves to the CLI
translatenow plans the whole run, collapses duplicate copy, and splits the
remainder into uniform batches instead of inheriting whatever landed in a hash
bucket.- New
batchSizeconfig option (default 25). This is the lever when a model
drops items. - Identical copy under several keys is translated once and fanned out; copy
with differing context or description still translates separately. - The
aiprovider retries transient failures with backoff and re-asks for
omitted keys in smaller slices.
TranslateProgressreportsbatch/totalBatches/itemsinstead of
chunkPath.Upgrading
Run
npx autotranslate initonce, then commit.translations/.init
removes the stale.gitignoreentry and the nexttranslatemigrates
.cache/into.state/, so no retranslation is needed.Until
.state/is committed, CI still has no diff input and will retranslate
the full catalog on each run - exactly the old behaviour, no worse. Projects
that never commit.translations/at all are unaffected. - Omitted keys deleted committed translations. A key missing from a
@autotranslate/cli@1.0.0-beta.20
Minor Changes
-
bb38cd5
Thanks @tamimbinhakim! - Add theagent
provider - translate with Claude Code or CodexDrives a headless coding-agent CLI already installed and signed in on the
machine, instead of calling a model API. No API key, no separate billing.provider: { name: 'agent', agent: 'claude', // or 'codex' model: 'claude-haiku-4-5', // optional }
The agent is used strictly as a text transformer - tools disabled, sandbox
read-only, prompt on stdin, JSON out. It cannot touch your repository.- Claude Code:
claude -p --output-format json --disallowedTools '*'.
Fenced or prose-wrapped answers are unwrapped by a balanced-brace scan. - Codex:
codex exec --sandbox read-only --output-schema, so the response
shape is enforced by the API rather than by prompt discipline.
Options:
agent,model,command,args,timeoutMs(default 300000).Each batch is a process spawn, so this suits local development and
small-to-medium catalogs rather than bulk runs; keepconcurrencymodest. CI
runners do not carry your agent login, so preferaiwith a key there.Batching, retry with backoff, and re-asking for omitted keys are shared with
theaiprovider. - Claude Code:
-
bb38cd5
Thanks @tamimbinhakim! - Add a git merge
driver for the generated catalogsNow that translation state is committed, two branches that both add copy will
both write to.translations/. Git's line-based merge conflicts on adjacent
keys and writes conflict markers into JSON, which breaks every consumer.autotranslate initregisters a merge driver and the matching
.gitattributesrules:- Catalogs merge to the union of both sides' keys; deletions are honoured.
- State drops any key both branches retranslated, so the next
translate
re-derives that one key instead of picking an arbitrary winner. index.tsis regenerated from the union of both sides' chunk files, and
now emits one import per line so it stays diff-friendly.
Conflicts in your own source still surface normally; only generated files
resolve automatically..gitattributesis committed, but the driver command lives in.git/config,
which git does not share. Teammates runautotranslate initonce to enable
it.Also adds
autotranslate merge-driver <base> <ours> <theirs> [path], invoked
by git rather than by hand. -
bb38cd5
Thanks @tamimbinhakim! - Fix incremental
translation: committed catalogs are now the diff baselineinitgitignored.translations/.cache/, andtranslateused that cache as
its only record of what had been translated - it never consulted the committed
catalogs. On any machine without the cache (fresh clone, new teammate, every
CI run) the entire catalog was re-sent to the provider despite valid
translations sitting in the repo.Three defects compounded it:
- Omitted keys deleted committed translations. A key missing from a
provider response (routine on large batches) was pruned from the catalog on
write. - One failed chunk discarded the run. Catalogs were written only after
every task settled, so a single 429 threw away every other chunk's work. - Reference context was unbounded. Every cached neighbour rode along on
every request, growing prompts with catalog size - which is what pushed
large batches past the point where models answer completely.
Changes
- Translation state moves to
.translations/.state/<locale>/<chunk>.json,
recording the source hash behind each translation. Commit it -initno
longer ignores anything underoutDirand strips a stale.cache/line if
it finds one. Existing.cache/layouts migrate on the nexttranslate. - Switching provider or model no longer invalidates anything.
- Omitted keys keep their previous translation and stay out of state, so the
next run retries exactly those. - Batches fail independently.
TranslateResultgainsfailures; the CLI
exits non-zero when any batch failed. - Reference context is capped at 8 items.
Batching moves to the CLI
translatenow plans the whole run, collapses duplicate copy, and splits the
remainder into uniform batches instead of inheriting whatever landed in a hash
bucket.- New
batchSizeconfig option (default 25). This is the lever when a model
drops items. - Identical copy under several keys is translated once and fanned out; copy
with differing context or description still translates separately. - The
aiprovider retries transient failures with backoff and re-asks for
omitted keys in smaller slices.
TranslateProgressreportsbatch/totalBatches/itemsinstead of
chunkPath.Upgrading
Run
npx autotranslate initonce, then commit.translations/.init
removes the stale.gitignoreentry and the nexttranslatemigrates
.cache/into.state/, so no retranslation is needed.Until
.state/is committed, CI still has no diff input and will retranslate
the full catalog on each run - exactly the old behaviour, no worse. Projects
that never commit.translations/at all are unaffected. - Omitted keys deleted committed translations. A key missing from a