qwen-code/packages/cli
ChiGao b30a4c27d9
fix(cli): align all TUI icon columns to a uniform 2-col width (#7633)
* fix(cli): align all TUI icon columns to a uniform 2-col width

Remove the extra left padding (paddingX=1) from ToolMessage and
CompactToolGroupDisplay that caused tool status icons (✓, ✗) to be
indented relative to the assistant message prefix (◆).

Reduce STATUS_INDICATOR_WIDTH from 3 to 2 so the tool status indicator
column matches the prefix width used by conversation and status
messages. Add flexShrink={0} to prefix boxes that were missing it.

Unify CompressionMessage, SummaryMessage, and MemorySavedMessage to
use the same fixed-width prefix box pattern (width=2, flexShrink=0)
instead of ad-hoc marginRight or minWidth approaches.

Restructure tool_use_summary in HistoryItemDisplay to use the
standard prefix box pattern instead of inline paddingLeft.

This ensures all icons (◆, ✓, ✗, ●, △, etc.) start at the same
column and all text content begins at a uniform offset, regardless
of whether the icon glyph is 1 or 2 terminal columns wide.

* fix(cli): address review feedback on icon alignment PR

- Remove dead COMPACT_GROUP_HORIZONTAL_PADDING constant (now 0)
  and its no-op subtraction from the height estimation formula.
- Reduce TMUX_SPINNER_FRAMES from 3-char to 2-char equivalents
  ('. ' / '..') so they fit the narrowed 2-col indicator box
  without overflowing in tmux sessions.

* fix(cli): force narrow presentation for ambiguous-width TUI icons

Append VS15 (U+FE0E, Variation Selector 15) to all East-Asian-Width
'Ambiguous' icon glyphs (◆ ● △ ○ ◎ ※ ∴ ∵ ★ ◉) via a central ICON
constant map in constants.ts. VS15 forces the terminal to render these
glyphs in their narrow (1-column) text presentation, matching
string-width's default ambiguousIsNarrow=true calculation.

Without this, CJK terminals render ambiguous glyphs as 2 columns while
Ink's layout engine allocates 1, causing a 1-column visual drift that
breaks icon/text alignment in the conversation view.

25 files updated to use ICON.XXX constants instead of raw string
literals for ambiguous icons.

* fix(cli): update test assertions for VS15 icon changes

- Fix 17 inline test assertions across 7 test files to match
  VS15-appended icon output
- Fix MarkdownDisplay.tsx: use stringWidth(prefix) instead of
  prefix.length to correctly measure display width of icons
  that include VS15 (a zero-width code unit that .length counts
  but stringWidth ignores)

* fix(cli): update CronPill/SettingsDialog for VS15 icon changes

- Fix CronPill test assertion for ◎ with VS15
- Update SettingsDialog to use ICON.CIRCLE_FILLED instead of raw ●
- Fix 10 SettingsDialog test assertions for ● with VS15
- Update SettingsDialog snapshots

* fix(cli): address maintainer review feedback on PR #7633

- Fix ToolGroupMessage width regression: split innerWidth so
  ToolMessage gets full contentWidth (no longer needs -2 since
  paddingX was removed) while ToolConfirmationMessage keeps -2
  (it still has its own padding={1})
- Fix stale '3-char' comment in GeminiRespondingSpinner → '2-char'
- Add comment explaining minWidth vs width asymmetry in
  ToolStatusIndicator (minWidth allows growth for tmux spinner
  frames and test mocks)

* fix(cli): add VS15 to ◐ (U+25D0) ambiguous icon in todo components

◐ (CIRCLE WITH LEFT HALF BLACK) is East-Asian-Width Ambiguous.
Added ICON.CIRCLE_LEFT_HALF constant and updated StickyTodoList
and TodoDisplay to use it.

* fix(cli): strengthen test assertion and clarify VS15 comment

- HistoryItemDisplay test: restore spatial assertion to
  toContain('◆\uFE0E Hello') instead of split checks
- constants.ts: clarify that VS15 is zero-width in string-width
  but forces narrow terminal presentation

* fix(cli): update StickyTodoList test assertion for ◐ VS15

---------

Co-authored-by: 秦奇 <gary.gq@alibaba-inc.com>
2026-07-24 11:48:55 +00:00
..
src fix(cli): align all TUI icon columns to a uniform 2-col width (#7633) 2026-07-24 11:48:55 +00:00
.gitignore feat(core): add opt-in built-in web_search backed by the DashScope Responses API (#7215) 2026-07-21 10:59:36 +00:00
index.ts fix(cli): add bootstrap fast paths (#6188) 2026-07-02 22:28:11 +00:00
package.json Fix(cli): use npm view for update check instead of update-notifier (#7515) (#7528) 2026-07-23 08:36:35 +00:00
test-setup.ts feat(serve): persist dynamic workspace registrations (#6716) 2026-07-11 16:49:40 +00:00
tsconfig.json feat(webshell): replay ChatRecord history in readonly WebShell (#6999) 2026-07-19 00:09:44 +00:00
vitest.config.ts test: raise timeout ceiling for I/O-bound tests flaky under CI contention (#7230) 2026-07-19 12:03:48 +00:00