Skip to content

Commit 89cd7e7

Browse files
authored
Release v3.0.4 (#48)
* fix(ui): restore global tabs, keep panes optional; pane Add menu selects existing sessions; show session history on join in split panes * chore(release): v3.0.4
1 parent 740ba00 commit 89cd7e7

7 files changed

Lines changed: 40 additions & 24 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,3 +289,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
289289
- Reattach active sessions to terminals after grid rebuilds so sessions no longer appear to vanish.
290290
- Honor copy vs move when dragging tabs between splits and avoid removing from the wrong source pane.
291291
- Improve edge-of-grid splits to consistently place the tab into the intended new split.
292+
## [3.0.4] - 2025-09-14
293+
294+
### Fixed
295+
- Restore VS Code-style tab workflow: global tabs are visible in both single and tiled modes; selecting a tab targets the active pane.
296+
- Make tiled panes optional again (no auto-enable on load); preserve pane layout and assignments across refresh via localStorage.
297+
- Pane “+” opens a reliable session picker (Shift+click opens folder browser to create a new one).
298+
- When attaching an existing session to a split, replay recent output buffer so tabs don’t look like “new” empty sessions.
299+
- Remove CSS that hid tabs in tiled mode; panes fill width without interfering with the tab bar.

bin/cc-web.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const program = new Command();
1111
program
1212
.name('cc-web')
1313
.description('Web-based interface for Claude Code CLI')
14-
.version('3.0.3')
14+
.version('3.0.4')
1515
.option('-p, --port <number>', 'port to run the server on', '32352')
1616
.option('--no-open', 'do not automatically open browser')
1717
.option('--auth <token>', 'authentication token for secure access')

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "claude-code-web",
3-
"version": "3.0.3",
3+
"version": "3.0.4",
44
"description": "Web-based interface for Claude Code CLI accessible via browser",
55
"main": "src/server.js",
66
"bin": {
@@ -44,4 +44,4 @@
4444
"devDependencies": {
4545
"mocha": "^11.7.1"
4646
}
47-
}
47+
}

src/public/app.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class ClaudeCodeWebInterface {
7373
this.setupTerminal();
7474
this.setupUI();
7575
this.setupPlanDetector();
76-
// Pane manager after UI exists (always-on multi-pane)
76+
// Pane manager after UI exists (optional multi-pane)
7777
this.paneManager = new PaneManager(this);
7878
this.loadSettings();
7979
this.applyAliasesToUI();
@@ -85,10 +85,8 @@ class ClaudeCodeWebInterface {
8585
// Initialize the session tab manager and wait for sessions to load
8686
this.sessionTabManager = new SessionTabManager(this);
8787
await this.sessionTabManager.init();
88-
// Always enable multi-pane mode and hide global tabs
89-
if (this.paneManager && !this.paneManager.enabled) {
90-
this.paneManager.enable();
91-
}
88+
// Respect user preference from storage; do not auto-enable panes by default
89+
// PaneManager.restoreFromStorage() will enable if previously enabled.
9290

9391
// Show mode switcher on mobile
9492
if (this.isMobile) {

src/public/panes.js

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,21 @@ class ClaudePane {
7979
this.hadOutput = true;
8080
this.hideStartOverlay();
8181
}
82+
} else if (msg.type === 'session_joined') {
83+
// Replay recent buffer so existing sessions show content immediately
84+
if (Array.isArray(msg.outputBuffer) && msg.outputBuffer.length) {
85+
const joined = msg.outputBuffer.join('');
86+
const filtered = joined.replace(/\x1b\[\[?[IO]/g, '');
87+
this.terminal.write(filtered);
88+
if (filtered) {
89+
this.hadOutput = true;
90+
this.hideStartOverlay();
91+
}
92+
}
93+
} else if (msg.type === 'error') {
94+
// Show errors in terminal UI for visibility
95+
const text = (msg.message || 'Error').toString();
96+
this.terminal.write(`\r\n\x1b[31m${text}\x1b[0m\r\n`);
8297
}
8398
};
8499
this.socket.onclose = () => {};
@@ -267,11 +282,7 @@ class PaneManager {
267282
const active = this.app?.currentClaudeSessionId;
268283
if (active) this.assignSession(0, active);
269284
this.focusPane(this.activeIndex || 0);
270-
// Hide global tabs in tiled mode
271-
const tabsSection = document.querySelector('.tabs-section');
272-
if (tabsSection) tabsSection.style.display = 'none';
273-
const overflow = document.getElementById('tabOverflowWrapper');
274-
if (overflow) overflow.style.display = 'none';
285+
// Keep global tabs visible; they target the active pane (VS Code-style)
275286
this.persist();
276287
}
277288
disable() {
@@ -283,11 +294,7 @@ class PaneManager {
283294
const tw = tc.querySelector('.terminal-wrapper');
284295
if (tw) tw.style.display = '';
285296
}
286-
// Show global tabs again
287-
const tabsSection = document.querySelector('.tabs-section');
288-
if (tabsSection) tabsSection.style.display = '';
289-
const overflow = document.getElementById('tabOverflowWrapper');
290-
if (overflow) overflow.style.display = '';
297+
// Global tabs remain visible in both modes
291298
this.persist();
292299
}
293300

@@ -739,7 +746,12 @@ class PaneManager {
739746
this.grid.querySelectorAll('.pane-add').forEach(btn => btn.addEventListener('click', (e) => {
740747
const idx = parseInt(btn.dataset.index, 10);
741748
this.focusPane(idx);
742-
this.app?.showFolderBrowser?.();
749+
// Shift-click to create a new session directly; normal click opens session picker
750+
if (e.shiftKey) {
751+
this.app?.showFolderBrowser?.();
752+
} else {
753+
this.openAddMenu(idx, btn);
754+
}
743755
e.stopPropagation();
744756
}));
745757
this.refreshSessionSelects();

src/public/style.css

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -467,9 +467,7 @@ body {
467467
.tab-tile:hover { background: var(--bg-tertiary); color: var(--text-primary); }
468468
.tab-tile[disabled] { opacity: .5; cursor: not-allowed; }
469469

470-
/* Always multi-pane: hide global tabs */
471-
.session-tabs-bar .tabs-section { display: none !important; }
472-
#tabOverflowWrapper { display: none !important; }
470+
/* Global tabs are visible; panes can be enabled optionally */
473471

474472
.tab-new:hover {
475473
background-color: var(--bg-tertiary);

0 commit comments

Comments
 (0)