diff --git a/.changeset/claude-code-tab-prefix.md b/.changeset/claude-code-tab-prefix.md
new file mode 100644
index 000000000..c7626d5dd
--- /dev/null
+++ b/.changeset/claude-code-tab-prefix.md
@@ -0,0 +1,5 @@
+---
+"aicodeman": patch
+---
+
+Show the CC prefix on Claude Code terminal tabs.
diff --git a/src/web/public/app.js b/src/web/public/app.js
index 05577c343..97605e069 100644
--- a/src/web/public/app.js
+++ b/src/web/public/app.js
@@ -5660,7 +5660,7 @@ class CodemanApp {
- ${mode === 'shell' ? 'sh' : mode === 'opencode' ? 'oc' : mode === 'codex' ? 'cx' : mode === 'gemini' ? 'gm' : mode === 'antigravity' ? 'ag' : mode === 'pi' ? 'pi' : mode === 'grok' ? 'gk' : mode === 'deepseek' ? 'ds' : mode === 'omp' ? 'om' : ''}
+ ${mode === 'claude' ? 'cc' : mode === 'shell' ? 'sh' : mode === 'opencode' ? 'oc' : mode === 'codex' ? 'cx' : mode === 'gemini' ? 'gm' : mode === 'antigravity' ? 'ag' : mode === 'pi' ? 'pi' : mode === 'grok' ? 'gk' : mode === 'deepseek' ? 'ds' : mode === 'omp' ? 'om' : ''}
${tabLabel}
${paneExitBadge ? `${escapeHtml(paneExitBadge)}` : ''}
${inlineSessionActions ? tabActionsHtml : ''}
diff --git a/src/web/public/home-sessions.js b/src/web/public/home-sessions.js
index eeb12c536..beff4de23 100644
--- a/src/web/public/home-sessions.js
+++ b/src/web/public/home-sessions.js
@@ -72,6 +72,7 @@ const HOME_SESSIONS_PILL_LABEL = {
/** Short backend badge, mirroring `.tab-mode` in the tab strip. */
const HOME_SESSIONS_MODE_BADGE = {
+ claude: 'cc',
shell: 'sh',
opencode: 'oc',
codex: 'cx',
diff --git a/test/claude-tab-prefix.test.ts b/test/claude-tab-prefix.test.ts
new file mode 100644
index 000000000..0952fcd1b
--- /dev/null
+++ b/test/claude-tab-prefix.test.ts
@@ -0,0 +1,17 @@
+// @vitest-environment node
+
+import { readFileSync } from 'node:fs';
+import { resolve } from 'node:path';
+import { describe, expect, it } from 'vitest';
+
+const APP = resolve(import.meta.dirname, '../src/web/public/app.js');
+
+describe('Claude Code tab prefix', () => {
+ it('includes CC in the main tab-strip markup', () => {
+ const app = readFileSync(APP, 'utf8');
+
+ expect(app).toContain(
+ "mode === 'claude' ? 'cc'"
+ );
+ });
+});
diff --git a/test/home-sessions.test.ts b/test/home-sessions.test.ts
index 67da3e55b..87520396a 100644
--- a/test/home-sessions.test.ts
+++ b/test/home-sessions.test.ts
@@ -165,25 +165,28 @@ describe('home sessions column: model', () => {
const [row] = app.buildHomeSessionRows();
expect(row.caseName).toBe('claudeman');
expect(row.modeBadge).toBe('cx');
- // claude is the default backend and gets no badge — the strip does the same.
- const plain = loadHomeSessionsApp({
+ const claude = loadHomeSessionsApp({
sessions: sessionMap([{ id: 'a', mode: 'claude' }]),
sessionOrder: ['a'],
cases: CASES,
});
- expect(plain.buildHomeSessionRows()[0].modeBadge).toBe('');
+ expect(claude.buildHomeSessionRows()[0].modeBadge).toBe('cc');
});
- it('badges every non-claude backend, so a new run mode cannot read as claude here', () => {
+ it('badges every supported backend', () => {
// The badge map is a per-mode lookup with a '' fallback, so a mode missing from it
- // is indistinguishable from claude in this rail while the tab strip badges it fine.
+ // is visually indistinguishable from an unrecognised session in this rail.
for (const [mode, badge] of [
+ ['claude', 'cc'],
['shell', 'sh'],
['opencode', 'oc'],
['codex', 'cx'],
['gemini', 'gm'],
['antigravity', 'ag'],
['pi', 'pi'],
+ ['grok', 'gk'],
+ ['deepseek', 'ds'],
+ ['omp', 'om'],
] as const) {
const app = loadHomeSessionsApp({
sessions: sessionMap([{ id: 'a', mode }]),