Skip to content

merge(dev→main): i18n coverage fix + solid-js TUI crash fix#12

Merged
Rwanbt merged 5 commits into
mainfrom
dev
Jul 18, 2026
Merged

merge(dev→main): i18n coverage fix + solid-js TUI crash fix#12
Rwanbt merged 5 commits into
mainfrom
dev

Conversation

@Rwanbt

@Rwanbt Rwanbt commented Jul 18, 2026

Copy link
Copy Markdown
Owner

Summary

  • fix(deps): dedupe solid-js instance — fixes a TUI startup crash (No renderer found) caused by @opentui/solid pulling in a second, unpatched solid-js copy instead of the workspace catalog version.
  • feat(i18n) + fix(i18n): expand and correct translation coverage across settings/dialogs for all 18 locales. The prior parity test only checked fr/zh, silently leaving ~26 real UI words (Audio, Configuration, Benchmark, Mode, Model, Diagnostics, Plugins, Skills, ...) as literal English copies in the other 14 locales. Test now loops over every locale.
  • chore(mobile): serialize mobile test runs to avoid flakiness.
  • fix(ci): unify the LOC gate on the canonical scripts/loc-gate.mjs (already excludes i18n/ as flat data, not "god files") instead of a stale inline duplicate that doesn't.

Test plan

  • bun test i18n parity suite: 6/6 pass (25474 assertions)
  • bun typecheck clean
  • CLI rebuilt, verified TUI bootstraps without the renderer crash
  • Desktop app rebuilt and launched, verified visually
  • Android APK rebuilt, installed and verified on device
  • All GitHub Actions green on dev at 87c5580 (CodeQL, generate, nix-eval, test, typecheck, deploy)

Rwanbt added 5 commits July 17, 2026 18:00
@opentui/solid declares peerDependencies.solid-js "1.9.11", incompatible
with the workspace catalog pin "1.9.10". Bun could not collapse the two
into one install and nested a second, unpatched solid-js@1.9.13 under
@opentui/solid and @solidjs/start.

Two live solid-js instances break Solid's context sharing: the renderer
context created by @opentui/solid's copy is invisible to useRenderer()
calls from the app tree (and from the ErrorBoundary's own fallback UI),
so any TUI bootstrap error now crashes the whole process with
"No renderer found" instead of rendering the TUI (or even a diagnostic).

Add solid-js to the existing "overrides" block (same pattern already
used for seroval etc.) so every consumer resolves to the single patched
1.9.10 instance. Verified: rebuilt CLI no longer prints "multiple
instances of Solid" and reaches TUI plugin bootstrap instead of crashing
at ~3s.
Add/update translation keys in all 18 locale files (ar, br, bs, da, de,
en, es, fr, ja, ko, no, pl, ru, th, tr, zh, zht) plus the parity test,
and wire the new keys into the settings and dialog components that
previously had hardcoded English strings (debate model selector, local
LLM dialog, settings dialog, and the settings-* panels for android,
audio, benchmark, configuration, disk quota, general, git auth, mobile
nav, observability, plugins, providers, remote access).

Verified: i18n parity test passes (6/6, 25460 assertions).
bun test --max-concurrency=1 for the mobile package's test/test:ci
scripts.
The 2026-07-17 i18n audit only verified fr/zh against the technical
allowlist (parity.test.ts test 6), so ~26 real UI words under
settings.fork.*/settings.localConfig.*/settings.desktop.remote.* were
silently left as literal English copies in the other 14 locales (ar,
br, bs, da, de, es, ja, ko, no, pl, ru, th, zht, tr) — most visibly the
Audio/Benchmark/Configuration section titles the user reported.

Translate the affected words (Audio, Configuration, Mode, Auto,
Capture, Diagnostics, Model, Traces, Confirmation, Type, Plugins,
Skills, Vision, Local, Internet, ...) per locale, keeping genuine
cognates (e.g. "Benchmark"/"Internet" in German/Portuguese/Danish)
where that reflects real UI convention rather than an oversight.
Left untouched: URLs/placeholders/acronyms (CPU, GPU, RAM, ID, Top P)
and the pre-existing deliberate allowlist entries for keyboard-shortcut
group labels (Session/Navigation/Terminal/Prompt).

Root cause of the silent gap: parity.test.ts's "audited settings
scope" test only checked fr and zh against the allowlist, never the
other 14 locales. Broadened it to loop over every locale so the same
class of bug can't ship silently again.

Verified: i18n parity test passes (6/6, 25474 assertions); no target
key remains identical to English outside a deliberate cognate choice.
.github/workflows/typecheck.yml duplicated the 1500-LOC gate inline,
predating scripts/loc-gate.mjs's i18n/ exclusion (flat translation
dictionaries aren't "god files", ADR-0002). Every push now blocks on
typecheck once locale files grow past 1500 lines, even though the
PR-triggered loc-gate.yml workflow already exempts them via the same
rule.

Delegate to scripts/loc-gate.mjs directly so there's one source of
truth for the LOC budget instead of two gates silently drifting apart.

Verified: node scripts/loc-gate.mjs passes locally (246 files scanned,
i18n/ excluded, none over 1500 LOC).
@github-actions

Copy link
Copy Markdown

This PR doesn't fully meet our contributing guidelines and PR template.

What needs to be fixed:

  • PR description is missing required template sections. Please use the PR template.

Please edit this PR description to address the above within 2 hours, or it will be automatically closed.

If you believe this was flagged incorrectly, please let a maintainer know.

@github-actions

Copy link
Copy Markdown

Hey! Your PR title merge(dev→main): i18n coverage fix + solid-js TUI crash fix doesn't follow conventional commit format.

Please update it to start with one of:

  • feat: or feat(scope): new feature
  • fix: or fix(scope): bug fix
  • docs: or docs(scope): documentation changes
  • chore: or chore(scope): maintenance tasks
  • refactor: or refactor(scope): code refactoring
  • test: or test(scope): adding or updating tests

Where scope is the package name (e.g., app, desktop, opencode).

See CONTRIBUTING.md for details.

@Rwanbt
Rwanbt merged commit e1f5542 into main Jul 18, 2026
32 of 34 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant