fix(cli): replace all emoji with Unicode text symbols in TUI rendering - #5999
Conversation
Re-triage (rerun) — PR #5999Re-running triage after the author addressed all review feedback and maintainer verification. Template: still uses "Motivation"/"Changes" instead of template headings, and is missing "Tested on", "Risk & Scope", "Linked Issues", "Evidence (Before & After)". Same as before — not blocking, the core information is solid. Please align with the template before merge. Direction: unchanged from the first pass — this is a well-motivated continuation of the already-merged batch 1 (#5787). Emoji in TUI cause width-2 misalignment and cross-terminal inconsistency. Claude Code's CHANGELOG validates this problem class with repeated emoji-related rendering fixes. Approach: scope is appropriate for a mechanical find-and-replace across 39 files. Every edit serves the stated goal. No scope creep. Moving to code review and testing. 🔍 中文说明重新分流(重跑)— PR #5999在作者处理所有 review 反馈和维护者验证后重新运行分流。 模板: 仍使用 "Motivation"/"Changes" 而非模板标题,缺少 "Tested on"、"Risk & Scope"、"Linked Issues"、"Evidence (Before & After)"。与之前一样——不阻塞,核心信息完整。请在合并前按模板调整。 方向: 与首次评估一致——这是已合并的 batch 1(#5787)的合理延续。TUI 中的 emoji 导致宽度 2 错位和跨终端不一致。Claude Code 的 CHANGELOG 以反复出现的 emoji 相关渲染修复验证了这个问题类别。 方案: 39 个文件的机械性查找替换范围合理。每处编辑都服务于目标。无范围蔓延。 进入代码审查和测试。🔍 — Qwen Code · qwen3.7-max |
Code Coverage Summary
CLI Package - Full Text ReportCore Package - Full Text ReportFor detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run. |
Code Review (re-triage)Clean mechanical change — 39 files, +251/-241. Every edit is a character-level substitution from a width-2 emoji to a width-1 Unicode text symbol (or removal where the glyph was decorative). No logic changes, no new abstractions, no package boundary violations. Correctness: all replacements are consistent across components, tests, snapshots, and 9 i18n locale files. The Review feedback addressed since first triage:
One non-blocking observation from the prior review: the TestsAll affected test suites pass on the PR merge ref:
Build succeeds cleanly (npm ci → build → bundle). Real-Scenario TestingNon-interactive mode (tmux)Both the installed build (v0.19.1) and the PR build (v0.19.3) respond identically and correctly: Interactive TUIThe interactive Ink TUI renders in the alternate screen buffer, which Independent maintainer verification (referenced)Maintainer @wenshao performed exhaustive real-binary tmux testing on this PR with:
Key finding: 6 of the new glyphs ( 中文说明代码审查(重新分流)干净的机械性改动——39 个文件,+251/-241。每处编辑都是从宽度 2 的 emoji 到宽度 1 的 Unicode 文本符号的字符级替换(或在字形仅为装饰时的移除)。无逻辑变更、无新抽象、无包边界违规。 正确性: 所有替换在组件、测试、快照和 9 个 i18n 语言文件中保持一致。 首次分流后处理的 review 反馈:
测试所有受影响的测试套件在 PR merge ref 上通过:McpStatus 12/12、agent-statistics 32/32、useGeminiStream 150/150、i18n 检查(9 个 locale)全部通过。构建成功。 真实场景测试非交互模式(tmux):安装版本(v0.19.1)和 PR 构建(v0.19.3)均正确响应。交互式 Ink TUI 在备用屏幕缓冲区中渲染,欢迎屏幕正常显示。 维护者 @wenshao 已在真实二进制 tmux 中进行了详尽验证,包括物理单元格宽度测量、双源 Unicode 宽度分析、以及 bundle 审计。关键发现:6 个新字形( — Qwen Code · qwen3.7-max |
Reflection (re-triage)This PR is what I'd independently propose for the same goal: direct 1:1 character replacements at each call site, no shared utility (each replacement is a single character literal — nothing to abstract), consistent symbol semantics across MCP and IDE views, and mechanical i18n key renames. The author has now addressed every concern raised in both the initial triage and the detailed maintainer review:
The remaining non-blocking observations — All 194 affected tests pass. Build is clean. Non-interactive tmux test confirms both builds work. Maintainer's exhaustive real-binary verification confirms the change does what it claims. Verdict: this is a well-executed, thoroughly reviewed mechanical change. Ship it. ✅ 中文说明反思(重新分流)本 PR 的实现方式与我的独立方案一致:在每个调用点直接 1:1 字符替换,没有共享工具(每个替换是单个字符字面量,没什么可抽象的),MCP 和 IDE 视图中的符号语义一致,i18n key 重命名是机械性的。 作者已处理了初始分流和详细维护者审查中提出的所有问题:
剩余的非阻塞观察—— 194 个受影响的测试全部通过。构建干净。非交互 tmux 测试确认两个构建均可用。维护者的详尽真实二进制验证确认改动达成了目标。 结论: 执行良好、审查充分的机械性改动。可以合并。✅ — Qwen Code · qwen3.7-max |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship. ✅
e186b0e to
67426e3
Compare
41643e0 to
e0b5025
Compare
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
[Critical] User-facing documentation still references old emoji
docs/users/ide-integration/ide-integration.md lines 116, 122, 128, 132 show 🔴 Disconnected: in 4 IDE error examples, and docs/users/features/status-line.md lines 13, 18, 24 show 🔒 docker in 3 status-line examples. After this PR, the CLI outputs ● Disconnected: and docker (no lock). Users reading the docs will see output that doesn't match their terminal.
Suggested fix: Replace 🔴 with ● in the 4 IDE doc examples and remove 🔒 from the 3 status-line examples.
— qwen3.7-max via Qwen Code /review
🟠 Maintainer local verification — code is sound, but the 2 [Critical] findings are validVerified at PR head What's solid ✅
Finding #1 — user docs still show the old emoji — CONFIRMED (valid Critical)The CLI output changes but the docs weren't updated, so they now disagree with the terminal:
Finding #2 — connecting/disconnected snapshots are vacuous — CONFIRMED (valid Critical)
Finding #3 —
|
| 检查 | 结果 |
|---|---|
npm ci + build + npm run typecheck |
✅ 0 错误 |
check-i18n(en.js 基准;PR 改了全部 9 个 locale) |
✅ 全部通过 —— locale 保持一致 |
| 受影响测试套件 | ✅ cli 230 + core 254 + McpStatus 12 全绿 |
| "所有 emoji 已替换" —— 触及的文件 | ✅ 扫描全部 37 个 PR 文件(对 merge-base):零 pictograph / VS16 / regional 残留;9 个 i18n 文件干净。⚠(U+26A0,无 VS16)等是目标宽度 1 字形,非 emoji |
| 真实渲染新字形 | ✅ 用各状态渲染 McpStatus:CONNECTED→●、CONNECTING→◐、DISCONNECTED→●;每个状态帧均宽度 1、无 \u{1F000}+/VS16。代码在屏幕上可用 |
发现 #1 —— 用户文档仍是旧 emoji —— 确认(有效 Critical)
CLI 输出变了但文档没更新,导致与终端不符:
docs/users/features/status-line.md——🔒 docker×3(行 13、18、24)docs/users/ide-integration/ide-integration.md——🔴 Disconnected:×4(行 116、122、128、132)- (次要/可争议越界)
docs/users/qwen-serve.md——⏸️×2 是 roadmap "deferred" 标记,非 CLI 输出示例。
发现 #2 —— connecting/disconnected 快照空过 —— 确认(有效 Critical)
McpStatus.tsx 的字形取自 serverStatus prop(const originalStatus = serverStatus(serverName)),但 "disconnected" 测试用 vi.spyOn mock 模块函数 getMCPServerStatus(无效),"connecting" 测试只设 connectingServers(它喂的是计数,不是 per-server 字形)。两者都渲染 baseProps 默认的 CONNECTED。证据:
- 快照内容:connecting 和 disconnected 两个快照都字面写着
● server-1 - Ready (1 tool),即 CONNECTED 态。 - 变异:我把 CONNECTING 字形
◐ → 'ZZZ_MUT'后重跑 —— 12 个测试仍全过,包括 "renders correctly with a connecting server"。◐符号零测试覆盖;它若回归会静默发布。 - 我用
serverStatus={() => CONNECTING}渲染组件,◐确实出现 —— 所以修复只在测试(按 bot 建议设serverStatusprop),不在组件。
发现 #3 —— ● 字形重载 —— 有效的设计取舍(非阻塞)
CONNECTED(绿)和 DISCONNECTED(红)都渲染 ●,仅靠颜色区分,McpStatus.tsx 和 ideCommand.ts 皆然(● Connected / ● Disconnected)。旧的 🟢/🔴 是不同形状;单色/管道输出或色盲用户下两态现在看起来一样。bot 建议 disconnected 用 ○(或任意第二种形状)可恢复一眼可辨。由维护者定夺。
建议
替换工作做得不错且已验证 —— 渲染、宽度、i18n、测试在触及范围内全绿。但两个 [Critical] 是真问题:更新这 2 个用户文档,并让 connecting/disconnected 快照测试真正触发这些状态(否则新符号无测试、快照还锁定了错误状态)。两者都很小。补上后即可合并;#3 可选。
🤖 maintainer local verification · isolated worktree @ e0b50258 · build + typecheck + i18n + 496 tests + real glyph render + mutation (◐→sentinel ⇒ connecting snapshot still passed = vacuous)
wenshao
left a comment
There was a problem hiding this comment.
[Critical] Footer.tsx still renders ⚙ workflow active, even though this PR's description and reviewer test plan explicitly say the workflow-active footer should render ▷ workflow active. Because that line was not part of the diff, I cannot attach this as an inline comment. Please update packages/cli/src/ui/components/Footer.tsx to use ▷ ${t('workflow active')} and tighten packages/cli/src/ui/components/Footer.test.tsx to assert the full glyph text, not just workflow active.
— GPT-5 via Qwen Code /review
Review feedback addressed in 31497a4All 8 review threads resolved. Here's the breakdown: Fixed (Critical)
Fixed (Suggestion)
Skipped (design choice / scope)
Tests verified
中文说明31497a4 中处理的 review 反馈全部 8 个 review threads 已 resolve。分类如下: 已修复 (Critical)
已修复 (Suggestion)
跳过(设计选择 / 范围外)
|
Comprehensive cleanup of emoji in TUI rendering paths (follow-up to #5787 / #5788). Replaces width-2 emoji with width-1 Unicode text symbols from the project's existing glyph vocabulary. ## Source changes (25 source files) Status indicators: - McpStatus: 🟢→● 🔄→◐ 🔴→● (colors preserved via Text color prop) - ideCommand: 🟢→● 🟡→◐ 🔴→● (both getIdeStatusMessage functions) - Footer: 🔒 removed (sandbox text label is self-explanatory) - Footer: ⚙→▷ (workflow active indicator) - ToolMessage: ⏳→◌ (progress + queued approval) - McpStatus: ⏳→◌ (server startup message) - LiveAgentPanel: ⏸→‖ (pause glyph) Text prefixes and labels: - StatusMessages: 🔎→◎ (vision bridge gutter prefix) - Session: 🚫→✗ (blocked notifications) - useGeminiStream: 🔎→◎ 🚫→✗ 💡→★ (prefixes and headers) - useContextualTips: 💡→★ (tip prefix) - WelcomeBackDialog: 👋🎯📋 removed (text labels are self-explanatory) - CreationSummary: ✅→✓ ❌→✗ - summaryCommand: ❌→✗ - AppContainer: ❌→✗ - AgentEditStep: ❌→✗ - useAutoAcceptIndicator: ℹ️→i - McpStatus Tips: 💡→★ Core package: - agent-statistics: 📋→▸ 🔧→● ⏱️→(stripped) 🔁→● 🔢→● ✅→✓ 🚀→● 💡→★ - shell: 🤖 removed from PR attribution footer - artifact-tool: 📄 removed from publish display - coreToolScheduler:⚠️ →⚠ (strip VS16) Standardized⚠️ (U+26A0+VS16, width-2) → ⚠ (U+26A0, width-1): - CommandFormatMigrationNudge, command-migration-tool, useGeminiStream i18n: all 9 locale files updated for changed keys. ## Test changes (5 test files) - ideCommand.test.ts: 5 emoji assertions updated - McpStatus.test.tsx: 13 snapshots updated - HistoryItemDisplay.test.tsx: 🔎→◎ assertions - useGeminiStream.test.tsx: VS16 + 🔄 assertions - agent-statistics.test.ts: all emoji assertions updated
- Fix McpStatus test snapshots to actually exercise connecting/disconnected states via serverStatus prop instead of ineffective vi.spyOn mock - Update user docs (status-line.md, ide-integration.md) to match new symbols - Change Footer workflow indicator from ⚙ to ▷ for consistency - Fix Duration line leading space in agent-statistics formatCompact/formatDetailed - Revert ‖ (U+2016, EAW=Ambiguous) back to ⏸ (EAW=Narrow) for CJK terminals - Restore 🤖 in PR attribution (GitHub web UI, not TUI) - Add old emoji to lspCommand.test.ts negative assertion - Tighten Footer test to assert full ▷ glyph text
31497a4 to
27fff76
Compare
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
No Critical findings. One new Suggestion (test coverage gap) below.
— qwen3.7-max via Qwen Code /review
…cpStatus snapshot
Review Response — 7 unresolved conversations addressedFixed (commit 9f4dd09)
Investigated — not a bug
Rejected — intentional design
Rejected — out of scope
All review threads resolved. |
|
Qwen Code review did not complete successfully. Qwen review aborted with an API error before posting comments. See workflow logs. |
wenshao
left a comment
There was a problem hiding this comment.
No new review findings on the actual PR changes (39 files, +247/-241). The diff is a clean, mechanical emoji cleanup — every replacement is consistent and tests are updated to match. All existing inline comments from prior review rounds cover the substantive discussion points. Downgraded from Approve to Comment: CI failing (review-pr).
— qwen3.7-max via Qwen Code /review
|
@qwen-code /review |
| _Qwen Code review request accepted. Review is queued in [workflow run](https://github.com/QwenLM/qwen-code/actions/runs/28431870746)._ |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
No new Critical findings. One Suggestion below.
— qwen3.7-max via Qwen Code /review
✅ The "build failure" is CI infrastructure flakiness — not your code. Current HEAD is fully green.I investigated every red check on this PR. There is no build or code failure. The current head ( 1. The cancelled CI run on
|
| Step | Result | Timing |
|---|---|---|
| Run ESLint | ✅ success | finished 03:46:36Z |
| Run actionlint | ⛔ cancelled | started 03:46:36Z, hung until 09:43:13Z |
The job ran for 6h 00m 23s total and was force-killed by GitHub Actions' hard 6-hour job timeout while stuck on Run actionlint. The build, i18n check, and tests never ran — they were skipped when the job was killed. actionlint only lints .github/workflows/*.yml, and this PR changes zero workflow / yaml / shell files (only packages/cli, packages/core, and 2 docs), so there was nothing PR-related for it to do. This is a self-hosted-runner / network stall — pure infrastructure.
2. "Post Coverage Comment: failure" is a cascade, not a cause
Same run — the coverage job failed only because the test job was cancelled, so there was no coverage artifact to post. A symptom of #1, not an independent problem.
3. "🧐 Qwen Pull Request Review: failure" is unrelated to the build
Run 28418712141 — the bot said it itself: "Qwen review aborted with an API error before posting comments." That is the AI-review bot hitting an API error, not your code.
✅ Current status: green
You already pushed the merge commit b34afc285, which re-triggered CI → run 28437802487 is fully green: lint, prettier, i18n, settings-schema, serve-fast-path bundle closure, and tests all pass. My local re-run of tsx scripts/check-i18n.ts on this head also returned ✅ All checks passed!.
No code action is needed for the CI red. If a future run hangs at actionlint / shellcheck / yamllint again, just re-run the job — it's the runner, not the PR.
中文版
✅ 这个"构建失败"是 CI 基础设施抖动 —— 不是代码问题。当前 HEAD 完全是绿的。
我排查了本 PR 上的每一个红色检查。不存在构建或代码层面的失败。 当前 head(b34afc285)通过了完整 CI,我还在本地独立重跑了本 PR 风险最高的检查(9 个语言文件的 i18n key 一致性),同样通过。下面是各项变红的真实原因。
1. 9f4dd09fe 上被取消的 CI run = 约 6 小时 runner 卡死,不是构建错误
Run 28418712932 里 Test (ubuntu) 显示已取消,但步骤时间线才是真相:
| 步骤 | 结果 | 时间 |
|---|---|---|
| Run ESLint | ✅ 通过 | 03:46:36Z 结束 |
| Run actionlint | ⛔ 取消 | 03:46:36Z 开始,一直卡到 09:43:13Z |
整个 job 跑了 6 小时 00 分 23 秒,卡在 Run actionlint 上直到撞 GitHub Actions 的 6 小时硬性超时被强制杀掉。构建、i18n 检查、测试根本没执行 —— job 被杀时它们全被跳过。actionlint 只检查 .github/workflows/*.yml,而本 PR 没有改动任何 workflow / yaml / shell 文件(只动了 packages/cli、packages/core 和 2 个文档),它根本没有 PR 相关的活要干。这是自托管 runner / 网络卡死 —— 纯基础设施问题。
2. "Post Coverage Comment: failure" 是连锁反应,不是原因
同一个 run —— 覆盖率 job 失败仅仅是因为 test job 被取消、没有覆盖率产物可发。是 #1 的症状,不是独立问题。
3. "🧐 Qwen Pull Request Review: failure" 与构建无关
Run 28418712141 —— bot 自己说得很清楚:"Qwen review aborted with an API error before posting comments." 这是 AI 评审 bot 撞上 API 错误,与代码无关。
✅ 当前状态:全绿
你已经推了 merge commit b34afc285 重新触发了 CI → run 28437802487 完全通过:lint、prettier、i18n、settings-schema、serve-fast-path bundle 闭包、测试全部通过。本地在该 head 重跑 tsx scripts/check-i18n.ts 也返回 ✅ All checks passed!。
针对 CI 变红无需任何代码改动。 如果以后某次 run 又卡在 actionlint / shellcheck / yamllint,直接重跑该 job 即可 —— 是 runner 的问题,不是 PR 的问题。
🟢 Maintainer real-binary verification (tmux) — sound to merge; two caveats for the recordBuilt the real bundle at PR head How it was verified
Width results (measured, not asserted)
Findings
Two caveats worth recording (neither blocks merge)
Bottom lineMechanically clean, tests updated, ships correctly, and improves consistency for the vast majority of users. Consistent with my earlier approve — merge is fine. The only durable note for future readers is the Ambiguous-width locale dependency on the six 中文版(点击展开)🟢 维护者真实二进制验证(tmux)—— 可以合并,记录两点说明在隔离 worktree 中基于 PR head 验证方法
宽度结果(实测,非断言)
发现
两点值得记录(都不阻塞合并)
结论机械式改动干净、测试已同步、产物正确,对绝大多数用户改善了一致性。与我之前的 approve 一致——可以合并。唯一需要给后来读者留底的是这六个 Verified at |
- ideCommand: Connected and Disconnected both rendered an identical bullet differing only by color, indistinguishable under deuteranopia/protanopia, in NO_COLOR terminals, or when copy-pasted. Use the PR's established ✓/✗ vocabulary (✓ Connected, ✗ Disconnected); Connecting keeps ◐. - coreToolScheduler: note that the ⚠ in the two RETRY_LOOP directives is an LLM-facing prompt string, not a TUI glyph, so it isn't 'fixed' for width later. Co-Authored-By: Qwen-Coder <noreply@qwen.ai>
|
@qwen-code /triage |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship. ✅
| ### Connection Errors | ||
|
|
||
| - **Message:** `🔴 Disconnected: Failed to connect to IDE companion extension for [IDE Name]. Please ensure the extension is running and try restarting your terminal. To install the extension, run /ide install.` | ||
| - **Message:** `● Disconnected: Failed to connect to IDE companion extension for [IDE Name]. Please ensure the extension is running and try restarting your terminal. To install the extension, run /ide install.` |
There was a problem hiding this comment.
[Suggestion] Docs/code glyph mismatch: these lines show ● Disconnected: but ideCommand.ts (lines 48, 110) actually produces ✗ Disconnected. The PR changed the code and docs with different replacement glyphs.
| - **Message:** `● Disconnected: Failed to connect to IDE companion extension for [IDE Name]. Please ensure the extension is running and try restarting your terminal. To install the extension, run /ide install.` | |
| - **Message:** `✗ Disconnected: Failed to connect to IDE companion extension for [IDE Name]. Please ensure the extension is running and try restarting your terminal. To install the extension, run /ide install.` |
Apply the same fix to lines 122, 128, and 132.
— qwen3.7-max via Qwen Code /review
|
|
||
| return ` | ||
| ⚠️ ${t('TOML Command Format Deprecation Notice')} | ||
| ⚠ ${t('TOML Command Format Deprecation Notice')} |
There was a problem hiding this comment.
[Suggestion] Stripping VS16 (U+FE0F) from ⚠️ to get bare ⚠ (U+26A0) does not guarantee width-1 rendering. Many popular terminals (iTerm2, VTE/GNOME Terminal, Windows Terminal) default to emoji presentation (width-2) for U+26A0 without any variation selector. Consider adding VS15 (U+FE0E, text presentation selector) to explicitly request text-mode: ⚠\uFE0E.
This also applies to CommandFormatMigrationNudge.tsx:72, useGeminiStream.ts:1502, and useAutoAcceptIndicator.ts:169.
— qwen3.7-max via Qwen Code /review
Resolve conflict in docs/users/configuration/settings.md the same way as the prior main merge: keep the incoming `ui.history.collapsePreviewCount` row and this branch's updated `ui.compactMode` description (retired in the terminal UI; Ctrl+O opens the full-detail transcript). The incoming side still carried the stale "Toggle with Ctrl+O" wording. Everything else auto-merged cleanly, including the QwenLM#5999 emoji → Unicode-text-symbol changes across the i18n locales and the TUI ToolMessage / HistoryItemDisplay renderers, and the QwenLM#6005 pending-prompt queue additions to AcpSessionBridge. Verified after rebuilding core + acp-bridge: cli typecheck clean, check-i18n passes, and the affected suites (ToolMessage, ToolGroupMessage, HistoryItemDisplay, ScrollableList, useHistoryManager, useMouseEvents) all pass. Generated with AI Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Motivation
Follow-up to #5787 / #5788. The first batch replaced the thinking icon (
💡→∴) and summary success icon (✅→✓). This PR completes the emoji cleanup across all TUI rendering paths, replacing width-2 emoji with width-1 Unicode text symbols from the project's existing glyph vocabulary (● ◐ ✓ ✗ ◎ ★ ▸ ‖).Emoji in a TUI have real downsides: width=2 causes column misalignment, rendering varies across terminals and fonts, and colored emoji among monochrome text glyphs reads as a foreign object. This PR addresses every remaining emoji that surfaces in TUI output.
Changes
Status indicators (colored dots and progress)
/mcp):🟢→●🔄→◐🔴→●— colors preserved via<Text color={...}>/ide):🟢→●🟡→◐🔴→●⏳→◌(ToolMessage progress bar + queued approval)⏳→◌(server initialization message)🔒removed (text label is self-explanatory)⚙→▷(workflow active indicator)⏸→‖Text prefixes and labels
🔎→◎(gutter prefix in StatusMessages)🚫→✗(Session.ts prompt/tool blocking)🔎→◎🚫→✗💡→★(useGeminiStream prefixes)💡→★(useContextualTips prefix)👋🎯📋removed (text labels are self-explanatory)✅→✓❌→✗(CreationSummary, AgentEditStep, summaryCommand, AppContainer)ℹ️→i(useAutoAcceptIndicator)💡→★(accent-colored star)Core package
📋→▸🔧→●⏱️→stripped🔁→●🔢→●✅→✓🚀→●💡→★🤖removed from shell.ts footer📄removed from artifact-tool.ts⚠️→⚠in coreToolScheduler.ts (strip VS16)VS16 standardization
Standardized
⚠️(U+26A0 + VS16, width-2) →⚠(U+26A0, width-1) in: CommandFormatMigrationNudge, command-migration-tool, useGeminiStreami18n
All 9 locale files updated for changed keys:
❌→✗,✅→✓,👋/🎯removed,⏳→◌,⚠️→⚠.中文说明
动机
#5787 / #5788 的后续。第一批替换了 thinking icon(
💡→∴)和 summary 成功图标(✅→✓)。本 PR 完成 TUI 渲染路径中所有剩余 emoji 的清理,用宽度 1 的 Unicode 文本符号替换宽度 2 的 emoji。改动概览
🟢🟡🔴🔄→●◐●(颜色保留)、工具进度⏳→◌、沙箱🔒移除、工作流⚙→▷、暂停⏸→‖🔎→◎、阻断🚫→✗、提示💡→★、欢迎对话框👋🎯📋移除、成功/失败✅❌→✓✗、信息ℹ️→i🤖移除、artifact📄移除⚠️→⚠(去掉 VS16,确保宽度 1)Reviewer Test Plan
/mcpwith configured servers — verify●(green/yellow/red) instead of emoji dots/mcpwith tips — verify★ Tips:in accent color/ide status— verify● Connected/◐ Connecting.../● Disconnected◌ [N/M]instead of⏳▷ workflow activeinstead of gear emoji/welcomedialog has no emoji prefixes✗error prefix instead of❌