From 59e00eeda6991df4901c72312c078b362d8c8927 Mon Sep 17 00:00:00 2001
From: Abhi <43648792+abhipatel12@users.noreply.github.com>
Date: Thu, 30 Oct 2025 19:18:25 -0400
Subject: [PATCH] Remove context percentage in footer by default (#12326)
---
.../cli/src/config/settingsSchema.test.ts | 4 ++
packages/cli/src/config/settingsSchema.ts | 9 +++
.../cli/src/ui/components/Footer.test.tsx | 61 +++++++++++++++++++
packages/cli/src/ui/components/Footer.tsx | 19 ++++--
4 files changed, 87 insertions(+), 6 deletions(-)
diff --git a/packages/cli/src/config/settingsSchema.test.ts b/packages/cli/src/config/settingsSchema.test.ts
index 67757637ec..657c4c928d 100644
--- a/packages/cli/src/config/settingsSchema.test.ts
+++ b/packages/cli/src/config/settingsSchema.test.ts
@@ -159,6 +159,10 @@ describe('SettingsSchema', () => {
expect(
getSettingsSchema().ui.properties.showMemoryUsage.showInDialog,
).toBe(true);
+ expect(
+ getSettingsSchema().ui.properties.footer.properties
+ .hideContextPercentage.showInDialog,
+ ).toBe(true);
expect(getSettingsSchema().general.properties.vimMode.showInDialog).toBe(
true,
);
diff --git a/packages/cli/src/config/settingsSchema.ts b/packages/cli/src/config/settingsSchema.ts
index 01f247e778..36a5359352 100644
--- a/packages/cli/src/config/settingsSchema.ts
+++ b/packages/cli/src/config/settingsSchema.ts
@@ -388,6 +388,15 @@ const SETTINGS_SCHEMA = {
description: 'Hide the model name and context usage in the footer.',
showInDialog: true,
},
+ hideContextPercentage: {
+ type: 'boolean',
+ label: 'Hide Context Window Percentage',
+ category: 'UI',
+ requiresRestart: false,
+ default: true,
+ description: 'Hides the context window remaining percentage.',
+ showInDialog: true,
+ },
},
},
hideFooter: {
diff --git a/packages/cli/src/ui/components/Footer.test.tsx b/packages/cli/src/ui/components/Footer.test.tsx
index f5ef617e0d..a1d45db5cd 100644
--- a/packages/cli/src/ui/components/Footer.test.tsx
+++ b/packages/cli/src/ui/components/Footer.test.tsx
@@ -4,6 +4,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
+import { describe, it, expect, vi } from 'vitest';
import {
renderWithProviders,
createMockSettings,
@@ -120,6 +121,13 @@ describe('', () => {
const { lastFrame } = renderWithProviders(, {
width: 120,
uiState: { sessionStats: mockSessionStats },
+ settings: createMockSettings({
+ ui: {
+ footer: {
+ hideContextPercentage: false,
+ },
+ },
+ }),
});
expect(lastFrame()).toContain(defaultProps.model);
expect(lastFrame()).toMatch(/\(\d+% context left\)/);
@@ -129,6 +137,13 @@ describe('', () => {
const { lastFrame } = renderWithProviders(, {
width: 99,
uiState: { sessionStats: mockSessionStats },
+ settings: createMockSettings({
+ ui: {
+ footer: {
+ hideContextPercentage: false,
+ },
+ },
+ }),
});
expect(lastFrame()).toContain(defaultProps.model);
expect(lastFrame()).toMatch(/\(\d+%\)/);
@@ -192,6 +207,13 @@ describe('', () => {
const { lastFrame } = renderWithProviders(, {
width: 120,
uiState: { sessionStats: mockSessionStats },
+ settings: createMockSettings({
+ ui: {
+ footer: {
+ hideContextPercentage: false,
+ },
+ },
+ }),
});
expect(lastFrame()).toMatchSnapshot('complete-footer-wide');
});
@@ -247,10 +269,49 @@ describe('', () => {
expect(lastFrame()).toMatchSnapshot('footer-only-sandbox');
});
+ it('hides the context percentage when hideContextPercentage is true', () => {
+ const { lastFrame } = renderWithProviders(, {
+ width: 120,
+ uiState: { sessionStats: mockSessionStats },
+ settings: createMockSettings({
+ ui: {
+ footer: {
+ hideContextPercentage: true,
+ },
+ },
+ }),
+ });
+ expect(lastFrame()).toContain(defaultProps.model);
+ expect(lastFrame()).not.toMatch(/\(\d+% context left\)/);
+ });
+
+ it('shows the context percentage when hideContextPercentage is false', () => {
+ const { lastFrame } = renderWithProviders(, {
+ width: 120,
+ uiState: { sessionStats: mockSessionStats },
+ settings: createMockSettings({
+ ui: {
+ footer: {
+ hideContextPercentage: false,
+ },
+ },
+ }),
+ });
+ expect(lastFrame()).toContain(defaultProps.model);
+ expect(lastFrame()).toMatch(/\(\d+% context left\)/);
+ });
+
it('renders complete footer in narrow terminal (baseline narrow)', () => {
const { lastFrame } = renderWithProviders(, {
width: 79,
uiState: { sessionStats: mockSessionStats },
+ settings: createMockSettings({
+ ui: {
+ footer: {
+ hideContextPercentage: false,
+ },
+ },
+ }),
});
expect(lastFrame()).toMatchSnapshot('complete-footer-narrow');
});
diff --git a/packages/cli/src/ui/components/Footer.tsx b/packages/cli/src/ui/components/Footer.tsx
index 7c4aa4347b..3e51acd740 100644
--- a/packages/cli/src/ui/components/Footer.tsx
+++ b/packages/cli/src/ui/components/Footer.tsx
@@ -60,6 +60,8 @@ export const Footer: React.FC = () => {
const hideSandboxStatus =
settings.merged.ui?.footer?.hideSandboxStatus || false;
const hideModelInfo = settings.merged.ui?.footer?.hideModelInfo || false;
+ const hideContextPercentage =
+ settings.merged.ui?.footer?.hideContextPercentage ?? true;
const pathLength = Math.max(20, Math.floor(mainAreaWidth * 0.25));
const displayPath = shortenPath(tildeifyPath(targetDir), pathLength);
@@ -145,12 +147,17 @@ export const Footer: React.FC = () => {
- {model}{' '}
-
+ {model}
+ {!hideContextPercentage && (
+ <>
+ {' '}
+
+ >
+ )}
{showMemoryUsage && }