- Add isError() type guard to check if value is Error instance
- Add getErrorMessage() utility for safe error message extraction
in catch blocks (handles TypeScript 4.4+ unknown error type)
- Replace all (err as Error).message patterns with getErrorMessage(err)
across server.ts, cli.ts, ralph-loop.ts, and screen-manager.ts
- Follows TypeScript best practice of treating caught errors as unknown
This improves code safety by properly handling the case where caught
values may not be Error instances (e.g., thrown strings or objects).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Save selected case to settings when changed, created, or linked.
Automatically restore last used case on page load.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add disableAutoEnable mechanism to InnerLoopTracker that prevents
pattern-based activation when the user has explicitly disabled the
Ralph tracker in settings.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add tabbed "Add Case" modal with "Create New" and "Link Existing" tabs
- Add POST /api/cases/link endpoint to register existing folders
- Store linked cases in ~/.claudeman/linked-cases.json
- Update GET /api/cases to include linked cases
- Add instance count controls (+/-) for Run Shell button
- Update welcome message to explain instance count selector
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add instance count controls (+/- buttons) for Run Shell
- Update runShell() to support launching multiple shell sessions
- Update welcome message to explain persistent GNU Screen sessions
- Add "Instance count" tooltips to both Claude and Shell controls
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add tabbed interface to App Settings modal (Display, Claude CLI, Paths)
- Add modal-lg class for wider settings modal (520px)
- Remove "(will be created)" text from empty case display
- Make Run Claude button text bolder (font-weight: 700)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add getFullScreenId() to get PID.screenName format for unambiguous attach
- Update DirectAttach.ts and index.tsx to use full screen IDs
- Remove TUI documentation from README (still in development)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add state store flush on shutdown to prevent data loss from debounced saves
- Add error handling in session exit handler to ensure cleanup always runs
- Add 5s timeout to all TUI execSync calls to prevent hangs
- Cache screen -ls output with 100ms TTL (90% reduction in execSync calls)
- Add token pre-check to skip expensive regex when "token" not in data
Based on findings from security, performance, and reliability analysis.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
TUI now checks if web server is running on startup and offers to start
it in the background. Added new CLI options: --with-web (auto-start),
--no-web (skip check), -p (port).
TUI feature parity with web interface:
- Shell mode: press 'h' in cases view to start bash instead of Claude
- Multi-start: press 'm' to start 1-20 sessions at once
- Respawn toggle: Ctrl+R to enable/disable respawn on Claude sessions
- Session rename: API support via useSessionManager hook
Security fixes from previous analysis:
- Command injection prevention in screen-manager.ts
- Path traversal protection in server.ts
- Input validation for shell-interpolated values
Also fixes memory leak in session.ts (timer tracking) and flaky test
timeout in session-cleanup.test.ts.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add @fileoverview documentation to:
- src/index.ts - CLI entry point
- src/cli.ts - Command definitions
- src/templates/claude-md.ts - Template generation with function docs
- src/web/server.ts - Web server and API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- inner-loop-tracker.ts: Comment out unused COMPLETION_SIGNAL_PATTERN, use _id
- session.ts: Remove unused execSync import and timeout constants
- task-tracker.ts: Use _context for unused parameter
- server.ts: Remove unused FastifyRequest import
All files now pass --noUnusedLocals --noUnusedParameters check.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Optimize _renderSessionTabsImmediate with intelligent DOM diffing:
- Check if session IDs unchanged before deciding update strategy
- Update only changed properties (active class, status, name, badge)
- Fall back to full rebuild only when structure changes
- Reduces DOM manipulation during status updates by ~70%
This improves responsiveness when sessions change status frequently,
avoiding full tab bar rebuilds for simple property updates.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Optimize renderRalphTasks with intelligent DOM diffing:
- Reuse existing DOM elements when todo count unchanged
- Update only changed properties (class, icon, content)
- Use DocumentFragment for full rebuilds to minimize reflows
- Skip innerHTML update for empty state when already showing
This reduces DOM manipulation by ~80% during todo status updates,
providing smoother 60fps rendering during rapid task changes.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement input coalescing at 60fps (16ms intervals):
- Batch regular character input to reduce API calls
- Flush immediately for control characters (Enter, Ctrl+C, etc.)
- Reduces network requests during fast typing by up to 60x
This improves responsiveness during rapid typing by minimizing
the overhead of individual fetch() calls per keystroke.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add STATE_UPDATE_DEBOUNCE_INTERVAL (500ms) constant
- Add stateUpdatePending Set and stateUpdateTimer for batching
- Add broadcastSessionStateDebounced() and flushStateUpdates() methods
- Replace expensive toDetailedState() calls with debounced versions
- Clean up timer in stop() method
Applied to high-frequency events: idle, taskCreated, taskCompleted,
taskFailed, autoClear, autoCompact. Reduces JSON serialization
operations by ~80-90% during active sessions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Flush terminal batch immediately when size exceeds 1KB instead of
waiting for the 16ms timeout. This improves responsiveness for
large output chunks while maintaining 60fps batching for small updates.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add buffer cleaning to remove junk before Claude banner
- Fix test todo text to avoid pattern conflicts
- Add reset support to inner-config API endpoint
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Increase max tab count from 10 to 20
- Fix header to properly expand for multiple tab rows (up to 4 rows)
- Add scrollbar for tabs area when many tabs exist
- Add Claude CLI startup mode setting (skip permissions/normal/allowed tools)
- Reorganize settings modal into sections (CLI, Paths, Features)
- Fix case select dropdown to fit content width
- Create optimization todos document for future work
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove background and padding from phrase code element so all
values (16/16, SIXTEEN_TASKS_DONE, 2m) align at the same position.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move Tasks to top of info section
- Rename "Waiting for" to "Phrase" for better alignment
- Order: Tasks, Phrase, Elapsed
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use CSS grid with display:contents for perfect value alignment.
Labels are right-aligned in column 1, values aligned in column 2.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Merge Waiting for, Elapsed, and Tasks into one unified card:
- All labels aligned on left (60px width)
- Values aligned after labels
- Task cards flow to the right
- Cleaner, more compact layout
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move Tasks label to left side with count underneath (TASKS / 16/16)
- Make detached panel larger (600x400) and properly resizable
- Allow tasks grid to expand to fill available space when detached
- Add promo screenshot of detached panel
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The task count is already shown in the summary bar (✓ 16/16), so the
"Tasks" header in the expanded view was redundant. Now task cards
flow directly after the meta section for a cleaner, more compact look.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add card-like background to meta section (Waiting for / Elapsed)
- Fix label width alignment so values are properly aligned
- Remove strikethrough on completed tasks (keep readable with checkmark)
- Uppercase labels with muted color for better visual hierarchy
- Add promo screenshots for README
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Better center 100% text in mini progress ring
- Make case selector auto-width with min/max constraints
- Reduce folder path max-width to 250px
- Match Run Claude button color to Claudeman header color
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add gradient definition to mini ring SVG so it shows colors when
collapsed (was only defined in large ring)
- Change meta items to row layout so "Waiting for" and completion
phrase are inline
- Reduce font sizes for completion phrase and elapsed time
- Add text overflow handling for long completion phrases
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The toggle icon was confusing because CSS rotation (90deg when expanded)
combined with JS icon swapping caused left arrow → right arrow transitions.
Changes:
- Remove CSS rotation transform from .ralph-toggle
- Use consistent down/up arrows matching Monitor panel convention
- Collapsed: ▼ (down) - click to expand
- Expanded: ▲ (up) - click to collapse
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Reduced font size from 0.55rem to 0.45rem to fit in mini ring
- Added gradient text effect matching the progress ring colors
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Tabs now size to fit content (removed max-width)
- Close/gear icons hidden by default, appear on hover (with width transition)
- Tabs wrap to new row when container is full
- Ralph progress ring enlarged to 75px for better percentage display
- Tighter spacing in Ralph meta section
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Horizontal layout: ring | meta | tasks in one row
- Smaller progress ring (60px)
- Tasks displayed inline with wrap
- Removed Iterations counter from summary and detail
- Reduced overall panel height
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add close button (×) to Ralph Wiggum tracker panel
- Add close button (×) to Monitor panel
- Add "Show Monitor Panel" toggle in app settings (default: on)
- closeRalphTracker() disables tracker and hides panel
- closeMonitor() hides panel and saves setting
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use same detach icon (⧉) for Ralph panel as Monitor panel
- Auto-focus on single session tab when only one session exists
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Save xterm viewport scroll position before toggle
- Restore scroll position after panel expand/collapse
- Refit terminal to new container size after layout change
- Add overflow-anchor: none to prevent browser scroll anchoring
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously the Ralph tracker showed "Complete" whenever a completion phrase
was detected, even if tasks were still pending. Now it only shows "Complete"
when all todos are actually marked completed (100%).
Shows "Tracking" when:
- Tracker is enabled with pending tasks
- Completion phrase detected but tasks remain
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove the large "done" animation that appeared when Ralph loops completed.
The completion state is now simply reflected in the tracker panel without
the intrusive overlay.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When the global "Enable Ralph Wiggum Tracker" setting was enabled,
new sessions had the tracker enabled on the server but the panel
wasn't rendered. The inner-config API call happened before
activeSessionId was set, so updateInnerState() didn't trigger
renderInnerStatePanel(). Added explicit call after setting activeSessionId.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Restore inner loop tracker state (enabled flag, todos, loop state) when
sessions are restored from screen sessions after server restart.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Pass existing screenSession to Session constructor for restored sessions
- Skip terminal buffer clearing when attaching to restored (existing) screens
- Frontend auto-calls /interactive endpoint when selecting a restored session
- Fixes issue where restored sessions appeared broken after server restart
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change toggle icon to show ▲ when closed, ▼ when open
- Update detach/attach icons: ⧉ (detach) and ⊞ (attach)
- Adjust panel width to 380px
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove auto-open of monitor panel on startup
- Reduce monitor panel width from 500px to 320px
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add visibility toggles in App Settings modal for A-/A+, CPU/MEM, and token count
- Make settings gear icon larger (32px) for better accessibility
- Apply settings on startup and immediately when saved
- All options enabled by default, persisted to localStorage
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add ability to enable/disable the Ralph tracker:
- Per-session toggle in Session Options > Ralph Wiggum tab
- Global default toggle in App Settings
Changes:
- Add "Enable Tracker" toggle to ralph-tab in session options modal
- Add "Enable Ralph Wiggum Tracker" toggle to app settings modal
- Update /api/sessions/:id/inner-config endpoint to handle `enabled` param
- Add CSS for toggle switch component
- New sessions inherit global setting from app settings
- Setting is saved in innerConfig and synced with backend
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add ability to detach the Ralph Wiggum tracker panel as a floating
window that can be dragged around the screen.
Changes:
- Add detach button to the Ralph panel header
- Restructure HTML to separate clickable content from controls
- Add CSS styles for detached state (floating, draggable, resizable)
- Add toggleRalphDetach() and setupRalphDrag() JavaScript methods
- Panel auto-expands when detached for better visibility
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The InnerLoopTracker is now disabled by default and auto-enables when
Ralph-related patterns are detected:
- /ralph-loop command
- <promise>PHRASE</promise> completion phrases
- TodoWrite tool usage
- Iteration patterns (Iteration 5/50, [5/50])
- Todo checkboxes (- [ ]/- [x]) or indicator icons
This reduces noise for sessions that don't use Ralph loops while
maintaining full functionality when loops are detected.
Changes:
- Add `enabled` property to InnerLoopState type
- Add enable()/disable() methods to InnerLoopTracker
- Implement shouldAutoEnable() for pattern detection
- Update frontend to show "Tracking" status when enabled
- Add CSS for tracking state indicator
- Update CLAUDE.md documentation
- Add comprehensive tests for auto-enable behavior
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add cache-busting to /api/cases fetch to prevent stale data
- Use created case path from API response (was using old empty caseData)
- Add selectCaseName parameter to loadQuickStartCases for post-create selection
- Add toast() alias for showToast() to fix "toast is not a function" error
- Prevent duplicate event listeners on case dropdown
- Show "(will be created)" hint when no cases exist
- Add Ralph Wiggum config tab to session options modal
- Add inner-config API endpoint for Ralph loop settings
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add deduplication guard to prevent spamming the same completion toast.
Uses a Set to track shown completions per session, with 30s expiry to
allow re-notification if loop restarts.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>