feat(i18n): localize Workspace controls and harden interpolation - #744
feat(i18n): localize Workspace controls and harden interpolation#744seonghobae wants to merge 17 commits into
Conversation
|
👋 Jules, reporting for duty! I'm here to lend a hand with this pull request. When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down. I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job! For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
|
Warning Review limit reached
Next review available in: 52 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. 📝 WalkthroughWalkthroughWorkspace의 내보내기, 스템, 반복, 솔로, 음소거, 전사 컨트롤을 번역 키로 변경했습니다. ChangesWorkspace localization
Estimated code review effort: 3 (Moderate) | ~20 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
… 적용\n- security audit fail(undici vulnerability) 패키지 업데이트
There was a problem hiding this comment.
Pull request overview
OpenCode cannot approve yet because required coverage evidence did not pass.
Review outcome
1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
-
Problem: The required coverage-evidence job result was
failure, so OpenCode cannot establish approval sufficiency for this head. -
Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.
-
Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present. -
Result: REQUEST_CHANGES
-
Reason: coverage-evidence result was
failure, so required test/docstring evidence was not proven for current head160ef9f107325010736c66af5f76f53415b6f4f2. -
Head SHA:
160ef9f107325010736c66af5f76f53415b6f4f2 -
Workflow run: 30863645738
-
Workflow attempt: 1
Coverage evidence
Coverage evidence job did not run or did not publish coverage evidence.
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (6 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (6 files)"]
R1 --> V1["required checks"]
OpenCode Review Overview
Pull request overviewOpenCode cannot approve yet because required coverage evidence did not pass. Review outcome1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
Coverage evidenceCoverage evidence job did not run or did not publish coverage evidence. Changed-File Evidence Mapflowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (8 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (8 files)"]
R1 --> V1["required checks"]
|
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/desktop/src/features/workspace/Workspace.test.tsx`:
- Line 99: Set the test locale to English at the start of the relevant Workspace
test before querying accessible names. Update the transcribeBass and
transcribePart assertions to use their English labels, or consistently derive
the expected labels from the configured locale.
In `@apps/desktop/src/features/workspace/Workspace.tsx`:
- Around line 397-405: Update the non-Bass unavailable transcription Button to
use t("transcribePart") instead of the hardcoded t("transcribeBass"). Add an
aria-label that communicates the current role name and transcription-coming-soon
status, matching the existing title context and fallback role behavior.
In `@apps/desktop/src/i18n/index.test.ts`:
- Around line 80-87: Update the “replaces every occurrence of a named
placeholder” test to use a translation string containing {roleName} multiple
times, then assert that every occurrence is replaced without recursively
replacing placeholder text inside the value. Alternatively, rename the test to
reflect single-occurrence interpolation if repeated-placeholder behavior is not
being tested.
In `@apps/desktop/src/locales/en/common.json`:
- Around line 157-161: Update the soon-status locale entries playStemSoon,
loopSectionSoon, and soloMuteOthersSoon to use complete, natural English
sentences that clearly state the feature is coming soon, such as adding “is”
before “coming soon.” Keep the non-soon labels unchanged.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 1af43685-2a86-421a-9e33-211bc617e294
📒 Files selected for processing (6)
apps/desktop/src/features/workspace/Workspace.test.tsxapps/desktop/src/features/workspace/Workspace.tsxapps/desktop/src/i18n/index.test.tsapps/desktop/src/i18n/index.tsapps/desktop/src/locales/en/common.jsonapps/desktop/src/locales/ko/common.json
fad3107 to
87b3455
Compare
Pull request was converted to draft
Dismissed because this review evaluated an obsolete head and failed solely on the superseded central coverage environment. The current head has successful repository CI/security/build evidence; a fresh independent current-head approval remains required before merge.
|
@cwl-noema-review @opencode-agent Please independently review exact head |
Acknowledged. |
|
@coderabbitai review |
Rate Limit Exceeded
|
6817f51 to
87b3455
Compare
|
Reverted branch head from |
Acknowledged. I understand the branch was reverted to |
…8n 적용\n- Github workflow checkout step에 대한 init.defaultBranch 적용\n- security audit 문제(undici) 수정
|
@opencode-agent @cwl-noema-review Please independently review exact current head @coderabbitai review |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
target='67d1136ec8dbedebb721901c6ab50906f7e52746'
echo '== checked-out HEAD and target =='
git rev-parse HEAD
git cat-file -t "$target"
git show -s --format='commit=%H%nparents=%P%nsubject=%s' "$target"
echo '== changed files at target =='
git diff-tree --no-commit-id --name-status -r "$target"
echo '== complete commit diff (no lockfile context truncation) =='
git show --format=fuller --find-renames --find-copies --stat "$target"
git diff "$target^" "$target" -- \
apps/desktop/src/features/workspace/Workspace.tsx \
apps/desktop/src/features/workspace/Workspace.test.tsx \
apps/desktop/src/i18n/index.ts \
apps/desktop/src/i18n/index.test.ts \
apps/desktop/src/locales/en/common.json \
apps/desktop/src/locales/ko/common.json \
package.json package-lock.json pnpm-lock.yaml yarn.lock bun.lockb 2>/dev/null || true
echo '== source outlines =='
ast-grep outline apps/desktop/src/features/workspace/Workspace.tsx --items all 2>/dev/null || true
ast-grep outline apps/desktop/src/i18n/index.ts --items all 2>/dev/null || true
echo '== relevant source =='
cat -n apps/desktop/src/i18n/index.ts
cat -n apps/desktop/src/i18n/index.test.ts
cat -n apps/desktop/src/features/workspace/Workspace.tsx
cat -n apps/desktop/src/features/workspace/Workspace.test.tsx
echo '== locale key comparison and relevant values =='
python3 - <<'PY'
import json
from pathlib import Path
en = json.loads(Path("apps/desktop/src/locales/en/common.json").read_text())
ko = json.loads(Path("apps/desktop/src/locales/ko/common.json").read_text())
print("EN-only:", sorted(set(en) - set(ko)))
print("KO-only:", sorted(set(ko) - set(en)))
for key in sorted(set(en) & set(ko)):
if any(token in key.lower() for token in ("export", "stem", "loop", "solo", "mute", "transcrib", "role", "practice")):
print(f"{key}: EN={en[key]!r} | KO={ko[key]!r}")
PY
echo '== Undici references in changed lockfiles and root manifests =='
for file in package.json package-lock.json pnpm-lock.yaml yarn.lock; do
if [ -f "$file" ]; then
echo "--- $file ---"
git diff "$target^" "$target" -- "$file" | grep -n -i -C 4 'undici' || true
grep -n -i -C 2 'undici' "$file" || true
fi
done
echo '== changed runtime/dependency authority files =='
git diff-tree --no-commit-id --name-only -r "$target" | \
grep -E '(^|/)(package\.json|.*lock|.*config\.(js|ts|mjs|cjs)|Dockerfile|compose[^/]*\.ya?ml)$' || trueLength of output: 54713 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/bandscope'
pr='744'
head='67d1136ec8dbedebb721901c6ab50906f7e52746'
echo '== pull request metadata and files =='
gh pr view "$pr" --repo "$repo" --json number,baseRefOid,headRefOid,commits,files,statusCheckRollup \
--jq '{number, baseRefOid, headRefOid, commits: [.commits[] | {oid, messageHeadline}], files: [.files[] | {path, additions, deletions}], checks: [.statusCheckRollup[] | {name, status, conclusion}]}'
base="$(gh pr view "$pr" --repo "$repo" --json baseRefOid --jq '.baseRefOid')"
echo "== pull request comparison: $base...$head =="
git diff --stat "$base" "$head"
git diff --name-status "$base" "$head"
git diff -- "$base" "$head" -- package-lock.json package.json pnpm-lock.yaml yarn.lock 2>/dev/null || true
echo '== exact changed locale content =='
git diff "$base" "$head" -- apps/desktop/src/locales/en/common.json apps/desktop/src/locales/ko/common.json
echo '--- English locale ---'
cat apps/desktop/src/locales/en/common.json
echo '--- Korean locale ---'
cat apps/desktop/src/locales/ko/common.json
echo '== Workspace translator calls and remaining string literals in JSX attributes/content =='
ast-grep run --lang tsx --pattern 't($KEY, $$$ARGS)' apps/desktop/src/features/workspace/Workspace.tsx
rg -n -P 'aria-label=|title=|>\s*[A-Za-z][^<{]*<' apps/desktop/src/features/workspace/Workspace.tsx
echo '== placeholder parity and repeated placeholder analysis =='
python3 - <<'PY'
import json, re
from pathlib import Path
en = json.loads(Path("apps/desktop/src/locales/en/common.json").read_text())
ko = json.loads(Path("apps/desktop/src/locales/ko/common.json").read_text())
pattern = re.compile(r"\{([^{}]+)\}")
for key in sorted(en):
ep = pattern.findall(en[key])
kp = pattern.findall(ko[key])
if ep or kp:
print(f"{key}: en={ep}, ko={kp}, repeated_en={len(ep) != len(set(ep))}, repeated_ko={len(kp) != len(set(kp))}")
if sorted(ep) != sorted(kp):
print(" MISMATCH")
PY
echo '== Undici lock entries and all lockfile changes in PR range =='
python3 - <<'PY'
import json
from pathlib import Path
lock = json.loads(Path("package-lock.json").read_text())
root = lock.get("packages", {}).get("", {})
print("root dependencies:", root.get("dependencies", {}))
print("root devDependencies:", root.get("devDependencies", {}))
print("undici package:", lock.get("packages", {}).get("node_modules/undici"))
PY
git diff --unified=80 "$base" "$head" -- package-lock.json | sed -n '1,260p'
echo '== GitHub Dependabot alerts for undici and open high/critical alerts =='
gh api --paginate "/repos/$repo/dependabot/alerts?state=open&per_page=100" \
--jq '.[] | select(.dependency.package.name == "undici" or .security_advisory.severity == "high" or .security_advisory.severity == "critical") | {number, state, dependency: .dependency.package.name, severity: .security_advisory.severity, ghsa: .security_advisory.ghsa_id, manifest_path: .dependency.manifest_path, scope: .dependency.scope}' \
|| trueLength of output: 34177
For example: t("message", { first: "{second}", second: "value" })If The current tests cover one replacement variable. They do not cover cross-variable placeholder injection. Replace variables in one source-text pass, or otherwise ensure replacement values cannot become later substitution input. Add a regression test for this case. The locale keys are synchronized. The Workspace controls use localized labels and role-aware unavailable-transcription names. The lockfile update is limited to ✅ Action performedReview finished.
|
Acknowledged. |
…8n 적용\n- Github workflow checkout step에 대한 init.defaultBranch 적용\n- security audit 문제(undici) 수정
There was a problem hiding this comment.
Pull request overview
OpenCode cannot approve yet because required coverage evidence did not pass.
Review outcome
1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
-
Problem: The required coverage-evidence job result was
failure, so OpenCode cannot establish approval sufficiency for this head. -
Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.
-
Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present. -
Result: REQUEST_CHANGES
-
Reason: coverage-evidence result was
failure, so required test/docstring evidence was not proven for current head213ae6aeb686ca0ebba6af4ec7ab30042593d058. -
Head SHA:
213ae6aeb686ca0ebba6af4ec7ab30042593d058 -
Workflow run: 30956491502
-
Workflow attempt: 1
Coverage evidence
Coverage evidence job did not run or did not publish coverage evidence.
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (8 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (8 files)"]
R1 --> V1["required checks"]
- PR 리뷰 피드백에 따라 기존에 영어로 작성되었던 CHANGELOG.md의 새 항목들을 한국어로 변경했습니다.
There was a problem hiding this comment.
Pull request overview
OpenCode cannot approve yet because required coverage evidence did not pass.
Review outcome
1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
-
Problem: The required coverage-evidence job result was
failure, so OpenCode cannot establish approval sufficiency for this head. -
Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.
-
Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present. -
Result: REQUEST_CHANGES
-
Reason: coverage-evidence result was
failure, so required test/docstring evidence was not proven for current head54577e1369187d60a5f8a8c51028792b50b340c5. -
Head SHA:
54577e1369187d60a5f8a8c51028792b50b340c5 -
Workflow run: 30973753014
-
Workflow attempt: 1
Coverage evidence
Coverage evidence job did not run or did not publish coverage evidence.
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (8 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (8 files)"]
R1 --> V1["required checks"]
|
@coderabbitai review Please review exact current head @opencode-agent Please rerun exact-head review after the central npm-workspace coverage fix lands; do not reuse previous failed coverage evidence. @cwl-noema-review Please independently review this exact head. Merge remains subject to current-head branch protection and qualifying non-author approval. |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/bandscope'
pr='744'
head='54577e1369187d60a5f8a8c51028792b50b340c5'
echo '== exact head =='
printf 'checked_out='
git rev-parse HEAD
git cat-file -t "$head"
git show -s --format='target=%H%nparents=%P%nsubject=%s' "$head"
base="$(gh pr view "$pr" --repo "$repo" --json baseRefOid --jq '.baseRefOid')"
printf 'base=%s\n' "$base"
echo '== PR metadata and checks =='
gh pr view "$pr" --repo "$repo" --json headRefOid,mergeStateStatus,isDraft,reviewDecision,statusCheckRollup \
--jq '{headRefOid, mergeStateStatus, isDraft, reviewDecision, checks: [.statusCheckRollup[] | {name, status, conclusion}]}'
echo '== changed files in PR range =='
git diff --name-status "$base" "$head"
echo '== implementation outlines =='
ast-grep outline apps/desktop/src/i18n/index.ts --items all
ast-grep outline apps/desktop/src/i18n/index.test.ts --items all
ast-grep outline apps/desktop/src/features/workspace/Workspace.tsx --items all
ast-grep outline apps/desktop/src/features/workspace/Workspace.test.tsx --items all
echo '== relevant source =='
cat -n apps/desktop/src/i18n/index.ts
cat -n apps/desktop/src/i18n/index.test.ts
cat -n apps/desktop/src/features/workspace/Workspace.tsx
cat -n apps/desktop/src/features/workspace/Workspace.test.tsx
echo '== translator implementation and call sites =='
ast-grep run --lang typescript --pattern 'text.replace($_, $_)' apps/desktop/src/i18n/index.ts || true
ast-grep run --lang tsx --pattern 't($KEY, $$$ARGS)' apps/desktop/src/features/workspace/Workspace.tsx || true
rg -n -P 'aria-label=|title=|tooltip|Transcrib|transcrib|Export|export|Stem|stem|Loop|loop|Solo|solo|Mute|mute' \
apps/desktop/src/features/workspace/Workspace.tsx \
apps/desktop/src/features/workspace/Workspace.test.tsx
echo '== locale keys and placeholders =='
python3 - <<'PY'
import json, re
from pathlib import Path
en = json.loads(Path('apps/desktop/src/locales/en/common.json').read_text())
ko = json.loads(Path('apps/desktop/src/locales/ko/common.json').read_text())
print('EN-only:', sorted(set(en) - set(ko)))
print('KO-only:', sorted(set(ko) - set(en)))
pattern = re.compile(r'\{([^{}]+)\}')
for key in sorted(set(en) | set(ko)):
ev, kv = en.get(key), ko.get(key)
if any(token in key.lower() for token in ('export','stem','loop','solo','mute','transcrib','role')):
print(f'{key}: EN={ev!r} | KO={kv!r}')
if isinstance(ev, str) and isinstance(kv, str):
ep, kp = pattern.findall(ev), pattern.findall(kv)
if ep or kp:
print(f'placeholders {key}: EN={ep} KO={kp}')
PY
echo '== exact PR diff for reviewed files =='
git diff --find-renames --unified=30 "$base" "$head" -- \
apps/desktop/src/i18n/index.ts \
apps/desktop/src/i18n/index.test.ts \
apps/desktop/src/features/workspace/Workspace.tsx \
apps/desktop/src/features/workspace/Workspace.test.tsx \
apps/desktop/src/locales/en/common.json \
apps/desktop/src/locales/ko/common.json \
package-lock.json \
CHANGELOG.md
echo '== lockfile scope =='
git diff --name-status "$base" "$head" -- package.json package-lock.json pnpm-lock.yaml yarn.lock bun.lockb
git diff --unified=40 "$base" "$head" -- package-lock.json
python3 - <<'PY'
import json
from pathlib import Path
lock = json.loads(Path('package-lock.json').read_text())
print('root:', lock.get('packages', {}).get('', {}))
print('undici:', lock.get('packages', {}).get('node_modules/undici'))
PYLength of output: 105748
Blocker 1 — non-recursive interpolation remains incorrect. t("message", { first: "{second}", second: "value" })If the source text is The current test only checks Blocker 2 — the lockfile update is not bounded to Undici. The EN and KO dictionaries have matching keys. The reviewed Workspace controls use localized labels, tooltips, and accessible names. The non-Bass transcription control has the localized role-aware unavailable name and
|
|
@opencode-agent @cwl-noema-review Please independently re-review exact current head |
What
Localize the buyer-facing Workspace export, stem-player, loop, solo, mute, and transcription controls in English and Korean.
The change also:
$&, brackets, and regex metacharacters;Product outcome
English and Korean users receive consistent labels, tooltips, and accessible names across the primary rehearsal controls. Dynamic role copy is rendered safely and predictably rather than relying on regular-expression replacement semantics.
Verification
npm audit --workspaces --audit-level=highpasses after the bounded Undici update.Security notes
Placeholder keys and values are treated as literal text. No user-controlled regular expression is compiled. The dependency update changes only the verified Undici registry tarball/version/integrity entry in the root lock.
Summary by CodeRabbit
개선 사항
버그 수정