diff --git a/src/web/public/app.js b/src/web/public/app.js
index a61c9217..157fc392 100644
--- a/src/web/public/app.js
+++ b/src/web/public/app.js
@@ -3438,14 +3438,19 @@ class CodemanApp {
statusEl.className = `tab-status ${status}`;
}
- // Update name if changed
+ // Update name if changed. #232: a description (the `: suffix` part of the
+ // name) is the whole tab label; the generated id lives in the tooltip. The
+ // compare targets the DISPLAY text, or a described tab would re-render on
+ // every pass (textContent never equals the full name there).
const nameEl = tab.querySelector('.tab-name');
- if (nameEl && nameEl.textContent !== name) {
+ if (nameEl) {
const _p = parseSessionPrefix(name);
- if (_p && _p.suffix) {
- nameEl.innerHTML = '' + escapeHtml(_p.prefix) + ': ' + escapeHtml(_p.suffix) + '';
- } else {
- nameEl.textContent = name;
+ const _label = _p && _p.suffix ? _p.suffix : name;
+ if (nameEl.textContent !== _label) {
+ nameEl.textContent = _label;
+ tab.title = _p && _p.suffix
+ ? (session.workingDir ? `${_p.prefix} (${session.workingDir})` : _p.prefix)
+ : (session.workingDir || '');
}
}
@@ -3617,14 +3622,23 @@ class CodemanApp {
const tallTabsEnabled = this._tallTabsEnabled ?? false;
const showFolder = tallTabsEnabled && session.name && folderName && folderName !== name;
- parts.push(`
+ // #232: a session with a description (the `: suffix` part of its name) shows
+ // JUST the description on the tab; the generated w
- id moves to the
+ // tooltip and stays visible in the session settings modal.
+ const parsedName = parseSessionPrefix(name);
+ const tabLabel = parsedName && parsedName.suffix ? parsedName.suffix : name;
+ const tabTooltip = parsedName && parsedName.suffix
+ ? (session.workingDir ? `${parsedName.prefix} (${session.workingDir})` : parsedName.prefix)
+ : (session.workingDir || '');
+
+ parts.push(`
${_tabIdx < 9 ? '' + (_tabIdx + 1) + '' : ''}
${loadState ? '' : ''}
${mode === 'shell' ? 'sh' : mode === 'opencode' ? 'oc' : mode === 'codex' ? 'cx' : mode === 'gemini' ? 'gm' : mode === 'antigravity' ? 'ag' : ''}
- ${(() => { const p = parseSessionPrefix(name); return p && p.suffix ? '' + escapeHtml(p.prefix) + ': ' + escapeHtml(p.suffix) + '' : escapeHtml(name); })()}
+ ${escapeHtml(tabLabel)}
detached
${showFolder ? `\u{1F4C1} ${escapeHtml(folderName)}` : ''}
diff --git a/src/web/public/styles.css b/src/web/public/styles.css
index 10c9a7cf..62236f0f 100644
--- a/src/web/public/styles.css
+++ b/src/web/public/styles.css
@@ -1383,15 +1383,6 @@ html[data-line-anim="packet"] .connection-line.line-enter {
text-overflow: ellipsis;
}
-.session-tab .tab-prefix {
- color: var(--text-muted);
-}
-
-.session-tab .tab-suffix {
- color: var(--text);
- font-weight: 500;
-}
-
/* Tab folder path — hidden by default, shown via .tabs-show-folder on container */
.session-tab .tab-folder {
font-size: 0.6rem;