Skip to content

Codewhale 0.9.12: Fleet-only UX (workbar, startup, underwater default, provider, settings, logo, hover, roles, retro theme) - #5862

Merged
Hmbown merged 52 commits into
mainfrom
fix/0912-ux-20260902
Sep 3, 2026
Merged

Codewhale 0.9.12: Fleet-only UX (workbar, startup, underwater default, provider, settings, logo, hover, roles, retro theme)#5862
Hmbown merged 52 commits into
mainfrom
fix/0912-ux-20260902

Conversation

@Hmbown

@Hmbown Hmbown commented Sep 3, 2026

Copy link
Copy Markdown
Owner

Integrates 10 slices onto fix/0912-ux-20260902 for the 0.9.12 release.

Slices (each on its own branch, merged --no-ff):

  • hover contract (unified hovered_row_style band, Link/TruncatedText hover layer)
  • workbar rename (sidebar/rail -> workbar, bottom default, /workbar + aliases)
  • settings regroup (Fleet tab removed, sub-agent depth under Model, hover states)
  • theme picker (live preview + Esc rollback, underwater default)
  • provider screen (per-model cost labels)
  • startup screen (recent sessions, hover, LaunchState)
  • logo (braille founder mark + sixel/image tiers)
  • fleet roles (fleet simplified to role layer over subagents)
  • underwater-retro theme (legacy flat deepsea look, selectable)
  • test consolidation (-324 tests, asserts preserved)
  • pod rip-out (Pod fully removed incl. compat shims)

Gates on merged tree: tui lib 11617 passed / 13 skipped; tui-integration 279/280 (1 load flake, passes alone); cucumber 16/16; cli 333; config 626; lane 67; workspace clippy clean; cargo fmt clean. Goldens jointly re-blessed (B+F+E+C+retro): startup dots-only diff, picker/settings show Underwater Retro row.


Note

Medium Risk
Breaking change for scripts or muscle memory using codewhale pod and hotbar slash.pod, plus new workbar defaults and trimmed settings UI that may surprise upgraded configs.

Overview
Retires the pod spelling end-to-end in favor of Fleet: the top-level codewhale pod alias is removed (those tokens fall through as prompt text instead of dispatching), TUI passthrough and help text use fleet only, hotbar no longer maps legacy slash.pod to slash.fleet, and user-facing copy/skills/lane hints are updated accordingly.

Renames “sidebar/rail” to workbar in settings, commands, and locales, with work_surface_placement defaulting to bottom (new bottom-bar choice) and expanded rail panel options (background, files, notepad, git, price; Pinned and some editor-only rows dropped).

Reorganizes the settings schema: default theme underwater, removes ocean_treatment and the animated whale status option, drops the dedicated Fleet config tab ( fleet.exec.max_spawn_depth moves under Models), and hides several Advanced rows (fast_model, default_model, features.vision_model) while keeping them /set-able.

Launch screen copy/flow gains recent-session strings, worktree success/escape hints, and updated Claude migration text; ProvisionedWorktree is re-exported from the lane crate.

Reviewed by Cursor Bugbot for commit 0f90457. Bugbot is set up for automated code reviews on this repo. Configure here.

CodeWhale Bot and others added 30 commits September 2, 2026 11:36
UiThemeValue::Custom now holds its full custom:<name> selector, the same
single string /theme and the persisted theme setting use, so the typed
/config document round-trips a custom theme without the sibling
custom_theme_name field. No disk migration: that key was typed-UI only
and was never persisted.
ConfigLabelLaunchScreen belonged to the retired launch_screen setting
(load already accepts and drops it) and ConfigLabelSidebarWidth /
ConfigLabelSidebarFocus belonged to sidebar load-only shims that were
never schema keys and had no hints. Remove the MessageIds and every pack
entry; all 15 packs stay in parity. No behavior change.
- work_surface_placement: the live default is bottom and Settings::set
  accepts top|bottom|left|right|off, but the schema offered
  top|left|right|off defaulting to left, and WorkSurfacePlacementValue
  only had Top|Left|Right — a persisted bottom round-tripped as top
  through the typed /config document and corrupted the setting on save.
  Schema gains bottom (default bottom); the typed enum gains Bottom and
  Off so every live value round-trips.
- rail_panel: the schema offered tasks|agents|context|pinned while the
  dock cycles eight panels and Settings::set rejected five of them.
  Schema and set() now accept tasks, agents, background, files, notepad,
  context, git, price; pinned stays an accepted alias that folds into
  tasks like the load-time migration.
- status_indicator: drop the retired whale choice from the schema; the
  whale|🐳|🐋 → cw load migration stays.
- UiThemeValue gains claude and solarized-light (SELECTABLE_THEMES
  entries the typed document could not round-trip) and a test pins the
  typed value space to every selectable theme.
- packs: widen the two value-enumeration hints, add the bottom placement
  copy, and drop the retired choice keys from all 15 packs.

Test updates: rail_panel_persists_tasks_agents_context_and_pinned
encoded the old four-panel set() and its pinned-verbatim persistence;
it now covers all eight panels and the pinned→tasks fold.
`/theme underwater` validated through normalize_theme_name, which has no
underwater entry — the alias only existed on the ocean_treatment field, so
the command the founder reached for said "invalid theme". Underwater is a
compound choice (Dark palette + deepsea treatment); route the aliases
underwater|deepsea|deep-sea|ombre through set_theme_selection, the same
setter the picker's Deepsea row uses.

Test: theme_command_underwater_alias_applies_the_deepsea_pair.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
… has Esc back

Enter on the empty launch composer ran the pre-highlighted "New worktree"
entry, which the founder hit by reflex ("toxic"). The menu now starts
with nothing selected (menu_selected: Option<usize>); ↑/↓ highlight, Enter
runs only a highlighted entry, Esc unhighlights.

Every launch flow now walks back to the card: LaunchState::restore_card()
is applied when the resume picker or changelog pager closes over the
launch screen, on Esc from the empty composer once the card has dissolved,
and Resume with no saved sessions no longer dissolves the card just to
show a status line. The worktree prompt copy says "Esc back".

Suspecting the New worktree entry of doing nothing, prove it end to end:
new_worktree_creates_a_checkout_and_the_session_starts_inside_it drives
provision_launch_worktree against a scratch repo and checks the checkout,
the branch, duplicate refusal, and that begin_launch_session points the
session at the worktree. It did work — silently. It now leaves a receipt
in the transcript and status line (LaunchWorktreeCreated, 15 packs).

Startup goldens re-blessed: the only symbol change is the removed ▸ on
the first menu row; the ink goldens relabel because one palette entry
(SELECTION_TEXT BOLD) is no longer on screen.

Tests: launch/tideline slice 157 passed; event_loop/session_state/
localization/theme_picker slice 91 passed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Alias deepsea; picker single list; config read-only migration folds
deepsea into theme underwater and drops the key; OceanRamp keys on theme.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
…p orphans)

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
…rip test

Signed-off-by: Hunter Bown <hmbown@codewhale.net>
The cucumber PTY suite was not in the local gate (--lib only), so three
expectations shipped stale against the collapse rules:

- the startup/live-shell wordmark is the lowercase codewhale mark;
- the ctx reading stays silent below 50% fullness, so the inline
  screen-mode proof keys on the composer placeholder, which paints in
  both screen modes, and the pointer proof on the plain-workspace
  caption;
- the new launch-worktree test pins core.autocrlf=false in its fixture
  repo so Windows CI (global autocrlf=true) checks out HEAD's files
  verbatim for the byte-fidelity assert.

Receipts: cucumber active_composer_pointer + screen_mode_inline 2/2
passed with --features long-running-tests; launch_worktree 1/1 with
RUST_MIN_STACK=16MiB; fmt clean; workspace clippy under CI flags clean.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Legacy deepseek_theme token module was never user-selectable; expose its
flat phosphor-teal era as ThemeId::UnderwaterRetro (underwater-retro,
retro) with underwater ink roles on a flat unpainted ground.
Copilot AI lite review requested due to automatic review settings September 3, 2026 02:27
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@cursor

cursor Bot commented Sep 3, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_b3cb9c26-35f6-4755-8443-f86c6224e45f)

@claude

claude Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Claude finished @Hmbown's task in 4m 47s —— View job


Claude is reviewing this PR

Note: the file list in the trigger context only covered 100 of the actual 187 changed files — dispatching extra passes over the omitted files (theme picker live-preview/rollback, provider/model picker, logo/mark rendering, startup views, UI event loop/frame layout, workbar hover unification, mcp routing) so nothing central to this release gets skipped.

  • Gather context (PR body, changed files, CLAUDE.md/AGENTS.md contract)
  • Pull local diff (git diff origin/main...HEAD), discover full 187-file changeset
  • Review correctness (panics, unwrap/expect, non-exhaustive matches, race conditions) — in progress across 6 parallel passes
  • Review provider/model/route safety (prefix-inference invariant)
  • Review reuse/simplification/dead code
  • Review test coverage
  • Review security (secrets, shell/exec, input validation)
  • Post summary + inline comments

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The change set is broad and cross-cutting (commands, TUI UX, docs, goldens, and runtime behavior), and I found multiple user-facing accuracy/consistency issues that should be addressed before a safe merge.

Pull request overview

This PR rolls up the 0.9.12 “Fleet-only” UX changes across the TUI, CLI/docs, and test/golden fixtures—standardizing terminology (Pod→Fleet, sidebar/rail→workbar), updating startup/settings/theme flows, and aligning hover/interaction affordances.

Changes:

  • Retires Pod-facing surfaces in favor of Fleet wording and behavior (CLI, slash commands, docs, skills, receipts, tests).
  • Renames/reshapes the “rail/sidebar” work surface into a bottom-default “workbar” with updated panels and keybindings.
  • Updates startup and settings UX (recent sessions, theme picker/live preview, underwater defaults) and re-blesses goldens accordingly.
File summaries
File Description
fleets/stopship.toml Updates fleet role mapping copy/values
docs/zh_hans/README.md Pod→Fleet doc link wording
docs/zh_hans/CONFIGURATION.md Adds underwater themes / updates theme docs
docs/WORKROOM_ARCHITECTURE.md Sidebar→workbar wording
docs/SUBAGENTS.md Sidebar→workbar wording
docs/skills/codew-release-qa-sweep/SKILL.md Sidebar→workbar QA wording
docs/RUNTIME_API.md Sidebar→workbar wording
docs/MODES.md Sidebar→workbar wording in flags section
docs/KEYBINDINGS.md Keybinding doc updates for workbar/panels
docs/id/FLEET.md Removes Pod alias mention
docs/GUIDE.md Workbar wording/placement updates
docs/FLEET.md Removes Pod alias table; workbar wording
docs/FLEET_WORKFLOW_TUTORIAL.md Removes Pod alias mention
docs/examples/fleet-dogfood.toml Updates example commands to fleet
docs/design/TIDELINE_RATATUI_TRANSLATION.md Pod→Fleet in Tideline design doc
crates/tui/tests/features/core_command_surfaces.feature Fleet help contract + /pod unknown assertion
crates/tui/tests/cucumber/screen_mode_inline_pty.rs Startup sentinel/menu text updates
crates/tui/tests/cucumber/plugin_e2e_acceptance.rs Startup “New session” updates
crates/tui/tests/cucumber/active_composer_pointer_pty.rs Startup/live-shell assertions updated
crates/tui/src/worker_profile.rs Imports FleetRole from new location
crates/tui/src/tui/work_surface/tideline/tests.rs POD→FLEET rail label assertions
crates/tui/src/tui/work_surface/tideline.rs POD→FLEET in Tideline rail rendering
crates/tui/src/tui/work_surface/panels/tideline_tests.rs Ledger golden contract wording
crates/tui/src/tui/work_surface/panels.rs POD LEDGER→FLEET LEDGER text
crates/tui/src/tui/work_surface/model.rs Work surface placement/panel model updates
crates/tui/src/tui/work_surface/mod.rs Workbar docs (bottom default, new panels)
crates/tui/src/tui/widgets/header.rs Wordmark casing normalization in header
crates/tui/src/tui/widgets/agent_card.rs Moves public_role_label import
crates/tui/src/tui/whales.rs Plain whale species name casing
crates/tui/src/tui/views/tideline_tests.rs Settings/theme list tests updated
crates/tui/src/tui/views/tideline_preview.rs Pod→Fleet wording in preview
crates/tui/src/tui/views/route_save_prompt.rs Pod→Fleet wording in save prompt docs
crates/tui/src/tui/views/fleet_setup.rs /pod setup/fleet setup wording + imports
crates/tui/src/tui/views/fleet_roster/tests.rs Adds hover behavior tests
crates/tui/src/tui/views/fleet_roster.rs Adds hover tint state/logic
crates/tui/src/tui/views/fleet_detail.rs Moves public_role_label import
crates/tui/src/tui/underwater/tideline_tests.rs Startup recent sessions + mark tier tests
crates/tui/src/tui/ui/terminal.rs Resets sixel emission on screen rebuild
crates/tui/src/tui/ui/session_state.rs Adds launch-session resume path + tests
crates/tui/src/tui/ui/overlays.rs Theme picker API change + launch-card restore helper
crates/tui/src/tui/ui/motion.rs Rail→workbar status messaging
crates/tui/src/tui/ui/handlers.rs Theme selection event simplified (theme only)
crates/tui/src/tui/ui/frame/one_owner_tests.rs Context reading conditional paint test updates
crates/tui/src/tui/ui/apply.rs Rail→workbar status messaging + theme picker API
crates/tui/src/tui/ui.rs Pod→Fleet status strings for setup targets
crates/tui/src/tui/theme_picker/tideline_tests.rs Theme rows count assertions updated
crates/tui/src/tui/setup/operate.rs Pod→Fleet wording in readiness facts
crates/tui/src/tui/setup/mod.rs Pod→Fleet wording in runtime facts
crates/tui/src/tui/setup/fleet_draft.rs Pod→Fleet wording in drafting prompts
crates/tui/src/tui/notifications.rs Wordmark casing in terminal title paths
crates/tui/src/tui/notification_payload.rs Wordmark casing fallback headline
crates/tui/src/tui/mouse_ui.rs Launch-screen hover + click row routing
crates/tui/src/tui/model_picker.rs Pod→Fleet wording in picker docs
crates/tui/src/tui/menu_style.rs Adds shared hovered-row style helper
crates/tui/src/tui/mcp_routing.rs Uses display-target redaction for MCP manager
crates/tui/src/tui/keybindings.rs Sidebar→workbar chord label updates
crates/tui/src/tui/infoline/tests.rs Adds hover behavior test for context segment
crates/tui/src/tui/infoline.rs Adds Cache segment + hover rules for actionable segments
crates/tui/src/tui/hover_hit.rs Hover registry docs + hit-test coverage
crates/tui/src/tui/hotbar/setup.rs Sidebar→workbar action label updates
crates/tui/src/tui/hotbar/actions.rs Removes slash.pod compat binding + wording updates
crates/tui/src/tui/history/tideline_stream.rs Pod→Fleet wording in stream docs
crates/tui/src/tui/goldens/work_160x40.txt Re-blessed Tideline work golden
crates/tui/src/tui/goldens/work_120x32.txt Re-blessed Tideline work golden
crates/tui/src/tui/goldens/work_100x30.txt Re-blessed Tideline work golden
crates/tui/src/tui/goldens/theme_picker_80x24.txt New theme picker golden
crates/tui/src/tui/goldens/theme_picker_120x32.txt New theme picker golden
crates/tui/src/tui/goldens/startup_surfacing_80x24.txt Startup surfacing golden updates
crates/tui/src/tui/goldens/startup_ink_80x24.txt Startup ink golden updates
crates/tui/src/tui/goldens/startup_ink_160x40.txt Startup ink golden updates
crates/tui/src/tui/goldens/startup_ink_120x32.txt Startup ink golden updates
crates/tui/src/tui/goldens/startup_ink_100x30.txt Startup ink golden updates
crates/tui/src/tui/goldens/startup_first_run_80x24.txt Startup first-run golden updates
crates/tui/src/tui/goldens/startup_80x24.txt Startup golden updates
crates/tui/src/tui/goldens/startup_40x10.txt Startup floor golden updates
crates/tui/src/tui/goldens/startup_160x40.txt Startup golden updates
crates/tui/src/tui/goldens/startup_120x32.txt Startup golden updates
crates/tui/src/tui/goldens/startup_100x30.txt Startup golden updates
crates/tui/src/tui/goldens/settings_80x24.txt Settings stage golden updates
crates/tui/src/tui/goldens/settings_160x40.txt Settings stage golden updates
crates/tui/src/tui/goldens/settings_120x32.txt Settings stage golden updates
crates/tui/src/tui/goldens/settings_100x30.txt Settings stage golden updates
crates/tui/src/tui/goldens/ledger_80x24.txt Ledger title golden updates
crates/tui/src/tui/goldens/ledger_160x40.txt Ledger title golden updates
crates/tui/src/tui/goldens/ledger_120x32.txt Ledger title golden updates
crates/tui/src/tui/goldens/ledger_100x30.txt Ledger title golden updates
crates/tui/src/tui/goldens/edit_theme_80x24.txt New edit-theme golden
crates/tui/src/tui/goldens/edit_theme_120x32.txt New edit-theme golden
crates/tui/src/tui/goldens/config_panel_80x24.txt Config panel golden updates
crates/tui/src/tui/goldens/config_panel_120x32.txt Config panel golden updates
crates/tui/src/tui/command_palette.rs Adds hover tinting + MCP target display
crates/tui/src/tui/app/types.rs Pod→Fleet comments for actions
crates/tui/src/tui/app/init.rs Removes ocean_treatment init plumbing
crates/tui/src/tui/ambient_life.rs Smooths ambient motion physics
crates/tui/src/tui/agent_roster.rs Pod→Fleet wording in empty state
crates/tui/src/tools/workflow/mod.rs Role-only dispatch + snapshot-based binding updates
crates/tui/src/tools/spec.rs Pod→Fleet wording in envelope docs
crates/tui/src/tools/shell.rs Pod→Fleet wording in availability error
crates/tui/src/tools/execution_envelope.rs Updates denylist module reference
crates/tui/src/session_manager.rs Exposes is_empty_auto_created_session
crates/tui/src/route_runtime.rs Pod→Fleet wording in preflight hint
crates/tui/src/request_manifest.rs “Pod assignment”→“Fleet assignment” label
crates/tui/src/palette/osc11.rs Adds CSI-terminated terminal query for sixel probing
crates/tui/src/operate.rs Pod→Fleet wording in module docs
crates/tui/src/mcp/tests.rs Adds tests for MCP display target
crates/tui/src/mcp.rs Adds mcp_display_target presentation helper
crates/tui/src/fleet/worker_runtime.rs Centralizes role permission logic into fleet::role
crates/tui/src/fleet/store.rs Pod→Fleet wording throughout store module docs
crates/tui/src/fleet/scheduler.rs Pod→Fleet error wording
crates/tui/src/fleet/profile.rs Moves role label helper to fleet::role
crates/tui/src/fleet/mod.rs Exposes new fleet::role module
crates/tui/src/fleet/members.rs Moves public_role_label import
crates/tui/src/fleet/host.rs Pod→Fleet wording in SSH host errors
crates/tui/src/fleet/control.rs /pod/fleet wording; receipt key expectations
crates/tui/src/fleet/alerts.rs Pod→Fleet wording in alerts + commands
crates/tui/src/doctor.rs Pod→Fleet wording in path report contexts
crates/tui/src/core/engine/turn_loop.rs Title animation base casing update
crates/tui/src/core/engine/preview/tests.rs Removes fleet_roster from preview route context
crates/tui/src/core/engine/preview.rs Removes fleet_roster from preview route context
crates/tui/src/core/engine.rs Removes fleet_roster from TurnRouteContext
crates/tui/src/commands/traits.rs /rail discovery→/workbar
crates/tui/src/commands/mod.rs Renames /rail command to /workbar (aliases kept)
crates/tui/src/commands/groups/core/setup.rs Retires /setup pod target
crates/tui/src/commands/groups/core/core.rs Pod→Fleet status text in /model messaging
crates/tui/src/commands/groups/core/acceptance.rs Updates acceptance scenario step count
crates/tui/src/commands/groups/config/mod.rs Registers /workbar (aliases rail/sidebar) + theme usage update
crates/tui/assets/skills/fleet-manager/SKILL.md Updates skill copy to Fleet naming
crates/lane/src/lib.rs Re-exports ProvisionedWorktree
crates/lane/src/control.rs Pod→Fleet wording in lane control hints
crates/config/src/tests.rs Removes legacy hotbar normalization test
crates/config/src/lib.rs Removes hotbar action id normalization
crates/config/src/app_mode.rs Pod→Fleet wording for Operate mode
config.example.toml Sidebar→workbar wording in example config
Review details
  • Files reviewed: 71/187 changed files
  • Comments generated: 5
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines 74 to 80
static RAIL_INFO: CommandInfo = CommandInfo {
name: "rail",
// /sidebar is the name users already know; it now drives the one rail.
aliases: &["sidebar"],
usage: "/rail [top|left|right|off|tasks|agents|context|pinned] [--save]",
name: "workbar",
// /rail and /sidebar are the names users already know; both now drive
// the one workbar.
aliases: &["rail", "sidebar"],
usage: "/workbar [bottom|top|left|right|off|tasks|agents|context|pinned] [--save]",
description_id: MessageId::CmdSidebarDescription,
Comment on lines +32 to +36
/// Hovered-but-not-selected row (Slice G global rule: every clickable
/// element responds visibly on hover). Underline + bold, deliberately *no*
/// background fill, so a hovered row can never masquerade as the keyboard
/// selection (`selected_row_style` owns the `SELECTION_BG` band). Callers
/// apply this only when `!selected`; selection always wins.
Comment on lines 9 to 13
#[test]
fn theme_rows_are_the_thirteen_selectable_themes() {
assert_eq!(tideline_theme_rows().len(), 13);
fn theme_rows_are_the_fourteen_selectable_themes() {
assert_eq!(tideline_theme_rows().len(), 15);
assert_eq!(tideline_theme_rows().as_slice(), SELECTABLE_THEMES);
}
@@ -126,12 +126,12 @@ fn settings_strip_windows_to_the_selected_category_with_painted_hitboxes() {
}

#[test]
fn theme_list_shows_thirteen_themes_boxed_selection_and_motion_toggles() {
let list = TidelineThemeList::new(&UI_THEME, 3).motion(false, true);
fn theme_list_shows_fourteen_themes_boxed_selection_and_motion_toggles() {
@@ -936,7 +936,7 @@ codewhale 还把用户偏好存储在:

常用设置键:

- `theme`(`system`、`terminal`、`dark`、`light`、`grayscale`、`catppuccin-mocha`、`tokyo-night`、`dracula`、`gruvbox-dark`、`claude`、`matrix`、`solarized-light`;默认 `system`):`system` 跟随终端背景检测,`dark`/`light` 使用 Codewhale Whale 配对,`terminal` 继承宿主终端,`grayscale` 是低意见的黑/白主题,命名的社区预设应用于整个 TUI。`whale`、`mono`、`black-white`、`tokyonight` 和 `gruvbox` 这样的别名被接受。在 Whale 中,钴蓝色拥有动作/焦点,海沫绿拥有实时工作,Signal Gold 拥有人类决策和鲸鱼,珊瑚色拥有警告,玫瑰色拥有危险,紫色拥有 Operate,绿色保持已完成/已验证。文本标签、标记和动效策略在颜色不可用时携带同样的状态;颜色从来不是唯一的线索。用户创作的覆盖只存在于 `~/.codewhale/themes/<name>.json`(或 `$CODEWHALE_HOME/themes/<name>.json`),用 `/theme custom:<name>` 选择。文件名是有界的 slug,符号链接和超过 64 KiB 的文件被拒绝,颜色必须是 `#RRGGBB`,未知字段会验证失败。`/theme schema` 打印嵌入的 JSON Schema,`/theme path` 显示确切目录。覆盖命名一个编译好的 `base` 主题,只改变列出的语义颜色;它不能包含或读取另一个文件。
- `theme`(`system`、`terminal`、`underwater`、`underwater-retro`、`dark`、`light`、`grayscale`、`catppuccin-mocha`、`tokyo-night`、`dracula`、`gruvbox-dark`、`claude`、`matrix`、`solarized-light`、`uwu`;默认 `system`):`system` 跟随终端背景检测,`dark`/`light` 使用 Codewhale Whale 配对,`terminal` 继承宿主终端,`grayscale` 是低意见的黑/白主题,命名的社区预设应用于整个 TUI。`whale`、`mono`、`black-white`、`tokyonight` 和 `gruvbox` 这样的别名被接受。在 Whale 中,钴蓝色拥有动作/焦点,海沫绿拥有实时工作,Signal Gold 拥有人类决策和鲸鱼,珊瑚色拥有警告,玫瑰色拥有危险,紫色拥有 Operate,绿色保持已完成/已验证。文本标签、标记和动效策略在颜色不可用时携带同样的状态;颜色从来不是唯一的线索。用户创作的覆盖只存在于 `~/.codewhale/themes/<name>.json`(或 `$CODEWHALE_HOME/themes/<name>.json`),用 `/theme custom:<name>` 选择。文件名是有界的 slug,符号链接和超过 64 KiB 的文件被拒绝,颜色必须是 `#RRGGBB`,未知字段会验证失败。`/theme schema` 打印嵌入的 JSON Schema,`/theme path` 显示确切目录。覆盖命名一个编译好的 `base` 主题,只改变列出的语义颜色;它不能包含或读取另一个文件。

@codewhale-agent codewhale-agent Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Codewhale review

PR #5862 retires the pod CLI alias and fully renames Pod to Fleet across CLI, config, lane control, and locale strings. It also renames sidebar/rail to workbar, changes default placement to bottom, regroups settings, changes default theme to underwater, adds new rail panel options, and consolidates tests. The changes are largely mechanical and the test suites reportedly pass, but several compatibility and test-quality issues remain.

Findings

  • [WARNING] CLI test assertion is ineffective due to case mismatch (crates/cli/src/lib.rs:6569)
    In crates/cli/src/lib.rs, the test fleet_is_the_only_top_level_command_and_pod_is_rejected asserts !help.contains("Manage durable Agent Fleet runs"). The actual command summary in the doc comment is 'Manage durable Agent fleet runs' (lowercase 'f'). The assertion therefore always passes, even if the summary is present in top-level help. The intent is unclear because Fleet is not retired; the test comment says 'the retired Fleet-led summary must be gone', but Fleet remains the command. This does not guard against regressions where the old Pod text is reintroduced.
  • [WARNING] Removal of hotbar action normalization breaks existing slash.pod bindings (crates/config/src/lib.rs:1433)
    The function normalize_hotbar_action_id was removed and resolve_hotbar_bindings now clones the action directly. Users with saved hotbar slots containing slash.pod will have those slots treated as unknown actions without migration. This is a deliberate breaking change, but it is likely to silently disable functionality for existing users. A migration or a load-time warning would be safer.
  • [INFO] New rail panel options have empty label/detail strings (crates/config/src/settings_schema.rs:314)
    The settings schema adds background, files, notepad, git, and price options with empty strings for label and detail. The comment suggests the UI relies on raw value fallback, but if the settings editor requires these strings to be non-empty, these options will render as blank rows. This needs verification or fallback logic.

Suggestions

  • crates/cli/src/lib.rs:6569 — Remove the ineffective assertion or correct the string to match the actual command summary ('Manage durable Agent fleet runs') if the intent is to ensure that text is absent from top-level help. Since Fleet is a valid subcommand, that line likely should not be in top-level help in the first place; consider dropping the assertion entirely.
  • crates/config/src/lib.rs:1433 — Consider keeping a lightweight migration or adding a warning when a legacy slash.pod action is encountered during hotbar resolution, so users are not silently left with broken bindings.
  • crates/config/src/settings_schema.rs:314 — Verify that the settings UI falls back to the raw value when label/detail are empty for the new rail panel options; otherwise provide proper localization keys for these options to avoid blank entries.

Assessment

The PR is a large but mostly mechanical rename and UI regroup. The reported test gates are green, but the ineffective CLI test assertion and the compatibility risks with hotbar bindings and potential blank settings entries should be addressed before merge. The changes are otherwise coherent and align with the stated 0.9.12 UX goals.


Advisory review by Codewhale (codewhale review --pr 5862 --post, head 1454f895f61ebf50dc492ad74a4f24b11ea8ec6a). Line-specific findings are also posted as inline review comments; mechanical fixes arrive as committable suggestions you can apply from the Files tab. CODEOWNERS approval still governs merge.

Comment thread crates/cli/src/lib.rs
assert!(
!help.contains("Manage durable Agent Pod runs"),
"the retired Pod-led summary must be gone from top-level help"
!help.contains("Manage durable Agent Fleet runs"),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[WARNING] CLI test assertion is ineffective due to case mismatch

In crates/cli/src/lib.rs, the test fleet_is_the_only_top_level_command_and_pod_is_rejected asserts !help.contains("Manage durable Agent Fleet runs"). The actual command summary in the doc comment is 'Manage durable Agent fleet runs' (lowercase 'f'). The assertion therefore always passes, even if the summary is present in top-level help. The intent is unclear because Fleet is not retired; the test comment says 'the retired Fleet-led summary must be gone', but Fleet remains the command. This does not guard against regressions where the old Pod text is reintroduced.

Comment thread crates/config/src/lib.rs
@@ -1447,7 +1433,7 @@ pub fn resolve_hotbar_bindings(
.iter()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[WARNING] Removal of hotbar action normalization breaks existing slash.pod bindings

The function normalize_hotbar_action_id was removed and resolve_hotbar_bindings now clones the action directly. Users with saved hotbar slots containing slash.pod will have those slots treated as unknown actions without migration. This is a deliberate breaking change, but it is likely to silently disable functionality for existing users. A migration or a load-time warning would be safer.

"ConfigChoiceRailAgents",
"ConfigChoiceDetailRailAgents",
),
SettingOption::new("background", "", ""),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[INFO] New rail panel options have empty label/detail strings

The settings schema adds background, files, notepad, git, and price options with empty strings for label and detail. The comment suggests the UI relies on raw value fallback, but if the settings editor requires these strings to be non-empty, these options will render as blank rows. This needs verification or fallback logic.

Comment thread crates/cli/src/lib.rs
!help.contains("Manage durable Agent Pod runs"),
"the retired Pod-led summary must be gone from top-level help"
!help.contains("Manage durable Agent Fleet runs"),
"the retired Fleet-led summary must be gone from top-level help"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove the ineffective assertion or correct the string to match the actual command summary ('Manage durable Agent fleet runs') if the intent is to ensure that text is absent from top-level help. Since Fleet is a valid subcommand, that line likely should not be in top-level help in the first place; consider dropping the assertion entirely.

Comment thread crates/config/src/lib.rs
@@ -1447,7 +1433,7 @@ pub fn resolve_hotbar_bindings(
.iter()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider keeping a lightweight migration or adding a warning when a legacy slash.pod action is encountered during hotbar resolution, so users are not silently left with broken bindings.

"ConfigChoiceDetailRailAgents",
),
SettingOption::new("background", "", ""),
SettingOption::new("files", "", ""),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verify that the settings UI falls back to the raw value when label/detail are empty for the new rail panel options; otherwise provide proper localization keys for these options to avoid blank entries.

Comment on lines +12983 to +12984
"child stays on the session endpoint, got {}",
child.client.base_url()
@cursor

cursor Bot commented Sep 3, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_6a348b73-6a7e-40e6-b121-335fc611803c)

@claude

claude Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Claude is reviewing this PR

  • Gather context (PR body, CLAUDE.md/AGENTS.md contract, changed files list)
  • Pull local diff (git diff origin/main...HEAD)
  • Review correctness (panics, unwrap/expect, non-exhaustive matches, races)
  • Review provider/model/route safety (prefix-inference invariant)
  • Review reuse/simplification/dead code
  • Review test coverage
  • Review security (secrets, shell/exec, input validation)
  • Post final review

View job run

@cursor

cursor Bot commented Sep 3, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_46942469-c00c-4b63-960a-db0ed5edd046)

@claude

claude Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Claude finished @Hmbown's task in 1m 24s —— View job


Claude is reviewing this PR

  • Gather context (PR body, CLAUDE.md/AGENTS.md contract, changed files list)
  • Pull local diff (git diff origin/main...HEAD, 190 files, +14885/-12980)
  • Review correctness (panics, unwrap/expect, non-exhaustive matches, races) — dispatched to subagent
  • Review provider/model/route safety (prefix-inference invariant) — dispatched to subagent
  • Review reuse/simplification/dead code + verify prior automated-review claims — dispatched to subagent
  • Review test coverage
  • Review security (secrets, shell/exec, input validation)
  • Post final review

@codewhale-agent codewhale-agent Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Codewhale review

Fleet-only UX integration for 0.9.12: removes pod spelling and compat shims, renames sidebar/rail to workbar, changes settings defaults and grouping, updates locales, and adds launch-screen recent sessions. Large but mostly mechanical; main risks are backward compatibility for removed settings and stale non-English UI text.

Findings

  • [WARNING] Stale keyboard shortcut description still references removed Pinned panel (crates/tui/locales/en.json:651)
    KbFocusSidebar in en.json lists "Tasks / Agents / Context / Pinned", but the rail_panel enum no longer includes pinned and now includes background, files, notepad, git, and price. Users reading the shortcut help will see an outdated panel list.
  • [WARNING] Removing pinned from rail_panel enum may break existing user configs (crates/config/src/settings_schema.rs)
    The RAIL_PANEL setting loses the pinned option without a visible load-time migration. Existing TOML configs that set rail_panel = "pinned" may fail to parse or become invalid after upgrade, producing a broken settings file. Consider accepting the legacy value and mapping it to tasks or adding a migration.
  • [INFO] Non-English locales retain 'Sidebar' terminology after workbar rename
    Several locale files (ca, de, es-419, fr, hi, id, ja) still translate ConfigLabelWorkSurfacePlacement and ConfigSectionSidebar as 'Sidebar' while the English locale and command names now use 'Workbar'. This produces an inconsistent UI for non-English users.
  • [INFO] Missing tests for settings removal migrations and new defaults
    The PR removes ocean_treatment, the whale status indicator, and the pinned rail panel, and changes defaults for theme and work_surface_placement. No tests are added to prove old configs migrate or fail gracefully. Given the breakage risk, add tests for load-time migration/validation of these settings.

Suggestions

  • crates/tui/locales/en.json:651 — Update the shortcut help to match the new rail_panel options, removing the retired Pinned panel and including the new workbar panels.

      "KbFocusSidebar": "Focus the Tasks / Agents / Background / Files / Notepad / Context / Git / Price workbar panel",
    

Assessment

The change is coherent and the code paths are updated consistently for the Fleet-only rename. Main concerns are backward compatibility for removed settings and stale user-facing text. No critical correctness errors were found in the reviewed diff, but the compatibility risks should be addressed before merge.


Advisory review by Codewhale (codewhale review --pr 5862 --post, head 0f90457e474f2c21971595022f3e723253522549). Line-specific findings are also posted as inline review comments; mechanical fixes arrive as committable suggestions you can apply from the Files tab. CODEOWNERS approval still governs merge.

@@ -655,7 +651,7 @@
"KbCyclePermissions": "Cycle Access: Ask → Auto-Review → Full Access (Shift+Tab)",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[WARNING] Stale keyboard shortcut description still references removed Pinned panel

KbFocusSidebar in en.json lists "Tasks / Agents / Context / Pinned", but the rail_panel enum no longer includes pinned and now includes background, files, notepad, git, and price. Users reading the shortcut help will see an outdated panel list.

@@ -655,7 +651,7 @@
"KbCyclePermissions": "Cycle Access: Ask → Auto-Review → Full Access (Shift+Tab)",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update the shortcut help to match the new rail_panel options, removing the retired Pinned panel and including the new workbar panels.

Suggested change
"KbCyclePermissions": "Cycle Access: Ask → Auto-Review → Full Access (Shift+Tab)",
"KbFocusSidebar": "Focus the Tasks / Agents / Background / Files / Notepad / Context / Git / Price workbar panel",

@Hmbown
Hmbown merged commit 7bc08e2 into main Sep 3, 2026
31 of 34 checks passed
@Hmbown
Hmbown deleted the fix/0912-ux-20260902 branch September 3, 2026 04:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants