Achievements Support and Pedram's List 11/29#8
Conversation
pedramamini
commented
Dec 1, 2025
- MAESTRO: Add confirmation dialog to clear system logs action
- MAESTRO: Allow Cmd+Shift+F to switch to Files tab from Scratchpad
- MAESTRO: Add Texas outline to About modal above 'Made in Austin, TX'
- MAESTRO: Auto-hide TTS stop button when audio playback completes
- MAESTRO: Add comma formatting to total cost in Claude session list stats panel
- MAESTRO: Fix theme flash by waiting for settings before hiding splash
- MAESTRO: Add inline image rendering for markdown preview in FilePreview
- MAESTRO: Support Cmd+[] in addition to Cmd+Shift+[] for Git diff viewer tab navigation
- MAESTRO: Improve Claude session details view with UUID display and number formatting
- MAESTRO: Add Escape key support to close scratchpad image lightbox
- MAESTRO: Fix Cmd+Shift+F not working in scratchpad editor mode
- MAESTRO: Add LOCAL git hash version to local package builds
- MAESTRO: Remove superfluous connected indicator from web interface header
- MAESTRO: Add left/right arrow keys for collapsing/expanding groups in sidebar
- MAESTRO: Add History help modal, human validation, and AutoRun pill improvements
- MAESTRO: Add file path image support to Scratchpad preview
- feat: UX improvements for tabs and /synopsis command
- feat: UX improvements for thinking dropdown and toast notifications
- fix: Add tabName and tabId to synopsis toast notifications
- feat: Add pagination for Claude sessions list and session jump shortcuts
- fix: Resolve web interface inputMode sync issue for commands
- feat: Persist scroll position per AI tab and terminal view
- feat: Show session name in history and fix cost display
- feat: UI improvements and session jump shortcut fix
- fix: Resolve web interface remote control connectivity issues
- perf: Optimize keyboard input responsiveness and reduce CPU usage
- fix: Connect OS notifications setting to toast system
- feat: Add stop button to AutoRun thinking status pill
- fix: Style TabBar scrollbar to match other panels
- feat: Add conductor-themed achievement system for AutoRun tracking
- feat: Update app icon and splash logo to conductor silhouette
- fix: Restore wand glyph for web/PWA icons, refine elapsed time format
- fix: Use proper conductor silhouette graphic for app icon and splash
- fix: Resolve TDZ error in keyboard handler ref initialization
- fix: Resolve TDZ error in keyboard handler ref initialization
- fix: Enforce read-only mode by passing --permission-mode plan to Claude
- feat: Add git branch copy button and improve toast layout
- final tweaks in achievements
- Updated LogViewer to show ConfirmModal before clearing logs - Modified ConfirmModal to auto-focus the Confirm button on mount - Added focus ring styling to the Confirm button for better visibility - User can now press Enter to confirm after clicking the clear logs button
Previously Cmd+Shift+F was explicitly blocked when the Scratchpad had focus, preventing the global "Go to Files" shortcut from working. Now Cmd+Shift+F propagates to the global handler while Cmd+F still opens search locally.
Added a simple SVG outline of Texas with a small dot marking Austin's location, displayed above the "Made in Austin, TX" text in the About modal.
Add IPC event notification from main process to renderer when TTS process finishes playing. The stop button now correctly disappears when audio completes naturally, allowing users to replay.
The splash screen was being hidden after sessions loaded, but before the theme settings were fully applied. This caused a visible flash where the default Dracula theme appeared briefly before switching to the user's actual saved theme. Changes: - Add settingsLoaded flag to useSettings hook that tracks when all async settings have been loaded from electron-store - Add sessionsLoaded state in App.tsx to track session loading - New useEffect waits for BOTH settingsLoaded and sessionsLoaded before calling window.__hideSplash() Now the splash screen only fades out once the UI is completely rendered with the correct theme, preventing any visual flash.
Added a custom MarkdownImage component that renders images inline within markdown files. The component handles: - Relative image paths (resolved relative to the markdown file's directory) - Absolute file paths - HTTP/HTTPS URLs - Data URLs Images are loaded via the existing fs:readFile IPC handler which returns images as base64 data URLs. Includes loading and error states for better UX.
…er tab navigation
…mber formatting - Show full UUID in header when no custom name; show UUID underneath custom name - Round cost to 2 decimal places instead of 4 - Add formatNumber utility for k/M/B suffixes (handles millions/billions) - Extend formatSize to include GB and TB support - Move started timestamp to hover overlay on relative time - Update all token counts to use proper scaling (k/M/B)
The image preview/lightbox component now properly handles the Escape key to close, matching the expected behavior noted in the UI hint "(ESC to close)".
The scratchpad's container keydown handler was intercepting both Cmd+F and Cmd+Shift+F, preventing the global 'Go to Files' shortcut from triggering. Now only Cmd+F (without Shift) is intercepted for in-scratchpad search, allowing Cmd+Shift+F to propagate to App.tsx's global handler.
Modified package.json to set VITE_APP_VERSION="LOCAL <8-char-git-hash>" for all local packaging commands (package, package:mac, package:win, package:linux). This makes it easy to identify local builds in the About modal by showing version like "LOCAL 5345296" instead of the package.json version.
…ader Removed the green "Connected" badge from the upper right corner of the mobile web header. Connection state is already clearly communicated via the ConnectionStatusIndicator component which shows when disconnected or reconnecting. Cleaned up related unused imports and interface props.
… sidebar When keyboard focus is in the left bar sidebar: - ArrowLeft collapses the current group or bookmarks section - ArrowRight expands the current group or bookmarks section This provides intuitive tree-style navigation in addition to the existing Space key behavior for collapsing groups.
…mprovements - Add History Help Widget with help modal (? icon in filter row) - Add human validation feature for AUTO entries with double checkmark - Add validated toggle in History details modal - Add context window widget to History details view (calculates from usageStats) - Make History details responsive (hide token In/Out on mobile) - Remove external link jump button from History details (keep Resume only) - Add AutoRun-specific thinking pill showing total elapsed time and task progress - Pipe auto-run synopsis to TTS stack when audio feedback is configured - Add history:update IPC handler for persisting validation state Claude ID: 0d010118-90d3-40ec-a578-446e816de993 Maestro ID: 5a166b38-b7e9-47f0-a8ff-0113c65f2682
Extended the AttachmentImage component in Scratchpad to handle absolute and relative file paths for images, not just maestro-attachment:// URLs. Images referenced with file paths are now loaded via the fs:readFile IPC handler, enabling consistent image rendering between FilePreview and Scratchpad markdown previews.
- Auto-focus input when creating new tab with Command-T - Scroll active tab into view when switching tabs (resume, toaster click, etc.) - Show /synopsis command and response in tab message history - Update /synopsis description to clarify it operates on active tab - README: Update terminology from "sessions" to "agents" for consistency Claude ID: 07bd3dc6-a279-4021-aa5b-adce71fd1815 Maestro ID: 5a166b38-b7e9-47f0-a8ff-0113c65f2682
- ThinkingStatusPill: Show tab names in dropdown instead of just UUID octets (Priority: namedSessions > tab name > UUID octet > session name) - Toast notifications: Display session/tab name in accent-colored pill style - Toast notifications: Click anywhere on toast to navigate to that session/tab - Toast notifications: Clicking dismisses the toast after navigation - Added sessionId and tabId to Toast interface for navigation support Claude ID: 2be7b616-5e73-4e2d-a242-7108aef07792 Maestro ID: 5a166b38-b7e9-47f0-a8ff-0113c65f2682
Synopsis toast notifications were missing the session/tab pill because tabName and tabId weren't being passed through. This fix ensures: - synopsisData includes tabName and tabId from the completed tab - Synopsis toast in App.tsx passes tabName and tabId - /clear command synopsis toast also includes tab info Claude ID: 2be7b616-5e73-4e2d-a242-7108aef07792 Maestro ID: 5a166b38-b7e9-47f0-a8ff-0113c65f2682
- Add paginated API (claude:listSessionsPaginated) for better performance with many sessions - Load 100 sessions at a time, fetch more at 70% scroll - Auto-load more sessions when filtered view has fewer than 50 visible - Stats bar shows filtered or total count based on 'Show All' checkbox - Add Opt+Cmd+NUMBER shortcut to jump to visible sessions (1-9, 0=10th) - Show number badges on sessions when Opt+Cmd modifier held Claude ID: 1cee4b61-1237-434a-bef1-8e5675c48639 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
The web interface was unable to send AI or terminal commands reliably due to a race condition where the server's session state could be stale compared to the web client's local state after mode switches. Changes: - Include inputMode in send_command messages from web client - Update ExecuteCommandCallback type to accept optional inputMode - Forward inputMode through IPC to renderer - Renderer now uses web's intended inputMode instead of querying potentially stale session state - Sync session state when web's mode differs from desktop Also includes queue bypass logic for write commands when all running/queued items are read-only (parallel execution optimization). Claude ID: 6a6f610a-1001-4772-9bb7-63dc893320c3 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Add scroll position persistence so users can resume reading exactly where they left off when switching between sessions, tabs, or restarting the app. Changes: - Add scrollTop field to AITab interface for per-tab scroll position - Add terminalScrollTop field to Session for terminal mode scroll - Add throttled (200ms) scroll save handler in TerminalOutput - Restore scroll position on mount with requestAnimationFrame - Wire up onScrollPositionChange callback through MainPanel to App Also includes: - Session jump shortcuts (Opt+Cmd+NUMBER) now work when modals open - Session jump badges moved to left side of session item for visibility - Bookmarked sessions included in session jump numbering - Slash commands now queue through execution queue for consistency Claude ID: 1cee4b61-1237-434a-bef1-8e5675c48639 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
- Add sessionName field to HistoryEntry type for better display - History panel now shows session name instead of UUID when available - Fix cost mismatch: use tab-level usageStats (matching UI header) instead of cumulative session-level stats - Add getProjectStats IPC for aggregate stats across all sessions - AgentSessionsBrowser now shows accurate totals with progressive loading Claude ID: 906b25cb-32b7-46b7-896b-fd459f106720 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
- Fix Opt+Cmd+NUMBER shortcut to use e.code instead of e.key (macOS Option key produces special characters) - Add Maestro session name to thinking pill dropdown for better identification - Update About modal with Texas flag SVG - Simplify aggregate stats display in AgentSessionsBrowser - Enhance /synopsis command with structured summary and details parsing - Document Jump to Agent shortcut in README.md Claude ID: 1cee4b61-1237-434a-bef1-8e5675c48639 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
- Fix WebSocket connection being closed by React StrictMode double-mount by tracking connection and mount IDs to ignore stale events/cleanup - Add tab sync with session selection: when selecting a session from web interface, desktop now also switches to the same active tab - Update onRemoteSelectTab to also switch to the session if not active - Clean up debug logging from troubleshooting Claude ID: aba19eda-96f3-4309-96d8-931075d4ab52 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Major performance improvements to address keyboard input lag: - InputArea: Add useMemo for command history and slash command filtering, use requestAnimationFrame for textarea auto-grow to prevent layout thrashing, wrap component in React.memo - App.tsx: Refactor keyboard handler useEffect to use ref pattern instead of 51+ dependencies - listener now attaches once on mount instead of re-attaching on every state change - SessionList: Optimize git polling - increase interval from 10s to 30s, pause polling when app is in background, resume on visibility change - LogViewer: Optimize search filtering with lazy evaluation - check message/context before expensive JSON.stringify on log.data - useTabCompletion: Add useCallback for getSuggestions, memoize shell history reference to maintain stable function identity Claude ID: 33f0f964-5b7f-4240-9e40-8eddcecafe8e Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
The "Enable OS Notifications" setting existed in the UI but wasn't actually wired up to trigger desktop notifications when toasts appeared. The "Test Notification" button worked because it called the API directly, but actual toast notifications (from task completions, etc.) never triggered OS notifications. Added setOsNotifications to ToastContext (mirroring the existing setAudioFeedback pattern) and connected it in App.tsx so the setting now properly controls whether toasts also show as OS notifications. Claude ID: 3f3cd7e1-63cf-477b-8877-5f5b1b14c057 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Wire up onStopAutoRun callback through InputArea to ThinkingStatusPill, allowing users to stop batch runs directly from the status indicator without navigating to the Scratchpad panel. Claude ID: dd9b53ae-9d92-44c8-a34e-3630f0d33aca Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Changed scrollbar-none to scrollbar-thin for consistency with other scrollable areas in the application. Claude ID: 7fc8be90-495b-4551-b389-295a95e6d81f Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Implement a gamification system that rewards users for cumulative AutoRun usage with 11 conductor-themed badge levels (from "Apprentice Conductor" to "Titan of the Baton"). Features: - Achievement card in About modal showing current badge, progress, and stats - Standing Ovation full-screen celebration overlay for badge unlocks - Same celebration treatment for new personal longest-run records - Trophy badge indicator in session list header (visible at level 1+) - Expandable badge unlock history (visible at level 2+) - Shareable achievement card (copy to clipboard or download as PNG) - Theme-aware maestro conductor silhouette (light/dark variants) - Badge data includes example conductors with Wikipedia links Badge progression spans from 15 minutes to 10 years of cumulative AutoRun time, with each badge featuring unique flavor text and an example maestro from classical music history. Claude ID: 97a10f0d-145d-4352-babd-6d9caed0f9dc Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Replace wand icon with conductor maestro silhouette for: - App icon (icon.png, icon.icns, icon.ico) - Startup splash screen - PWA icons for web interface The wand icon is preserved as icon-wand.png (the "glyph" version) for use elsewhere in the UI where simplicity is preferred.
- Revert PWA icons back to wand glyph (favicon, mobile home screen) - Update AutoRun elapsed time to human-readable format (e.g., 2h 10m 47s) Icon usage clarified: - Conductor silhouette: app icon + startup splash only - Wand glyph: web interface, PWA icons, and other UI elements
Replace generated SVG conductor with the authentic conductor silhouette graphic provided by the user. The conductor graphic now appears in: - App icon (white silhouette on purple background) - Startup splash screen - Achievement overlays (dark/light variants for theme support) Also includes a TabBar fix for initial scroll position of active tab.
Move keyboardHandlerRef.current assignment after all handler function definitions to fix "Cannot access 'addNewSession' before initialization" error. The useRef initial value was referencing const functions before their declarations, causing a temporal dead zone violation on cold start. Claude ID: 8a4a8b58-33e0-4d14-87df-262cdb3f4624 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Achievement system polish: - Remove separator line above "View on GitHub" in About modal - Fix badge progression tooltip positioning (smart left/center/right) - Make empty badge cells more visible (dashed border, higher opacity) - Change tooltips to click-to-toggle (stays visible for Wikipedia links) - Reorder tooltip content: Level X, Title, then description - Add "Click a badge to view details" hint text Developer Playground: - Add playground() console command to open testing panel - Create PlaygroundPanel component with achievements testing tab - Quick-set badge levels 0-11 with single click - Manual time sliders for cumulative time, longest run, total runs - Standing Ovation trigger with badge level selection - Preview AchievementCard with mock data in real-time
Read-only mode was purely cosmetic - it displayed the badge but never actually told Claude to operate in plan-only mode. This allowed agents to take destructive actions even when read-only was enabled. Added --permission-mode plan to spawn arguments in two missing locations: - processQueuedItem: checks item.readOnlyMode and targetTab.readOnlyMode - Remote command handler: checks activeTab.readOnlyMode Also includes minor UI improvements: - Show tab name in session ID pill tooltip - Move read-only badge from bottom-right to top-right of user messages Claude ID: 83301ba2-5864-41f1-b6cf-eb68613c2ecb Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
- Add copy-to-clipboard button in git branch overlay with flash notification - Move tab name to same line as group/project in toast notifications (wraps to second line only when space is insufficient) Claude ID: 83301ba2-5864-41f1-b6cf-eb68613c2ecb Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Code Review: Maestro Achievements PRGreat work on this comprehensive feature update! This PR adds a conductor-themed achievement system and numerous UX improvements. Here's my detailed review: Strengths1. Well-Architected Achievement System
2. Performance Improvements
3. Remote Control Fixes
4. Code Quality
Concerns and Recommendations1. Security - Package Scripts (Critical)Location: package.json lines 25-28 Using shell command substitution in package.json scripts can be fragile:
Recommendation: Add a cross-platform Node.js script to generate version info, or use a package like cross-env for better cross-platform support with fallback logic. 2. Performance - Multiple Regex PassesLocation: src/main/index.ts lines 1706-1742 Calling content.matchAll() multiple times on the same large string. Consider combining regex passes or using stream-based parsing for better performance with hundreds of large session files. 3. Potential Bug - Cursor PositionLocation: src/main/index.ts line 1683 If the cursor session is deleted/missing, it falls back to index 0, potentially showing duplicate sessions. Consider using a timestamp-based cursor instead of session ID for more robust pagination. 4. Missing Validation - History Entry UpdatesType definitions show validated field but unclear where validation logic exists. Should there be user permission checks before allowing validation updates? 5. Icon Generation ScriptThe HTML-based icon generator requires manual steps and canvas rendering may vary across browsers. Consider using a headless approach or Node.js canvas library for reproducibility. Potential Bugs1. Race Condition in Achievement UpdatesIf multiple AutoRun tasks complete simultaneously, there could be a race condition in updating cumulative stats. Ensure atomic updates or use a queue. 2. Missing Error BoundariesNew components like StandingOvationOverlay and AchievementCard should be wrapped in error boundaries to prevent crashes from breaking the entire app. 3. Memory Leak Risk - Project StatsLocation: src/main/index.ts lines 1812-1906 The batched stats calculation sends updates via IPC but doesn't check if the window is still interested. Add cancellation support or check if component is still mounted. Minor Issues
Test CoverageNo test files were modified. Recommend adding tests for:
Overall AssessmentQuality: 4/5 stars This is a solid PR with creative features and meaningful performance improvements. The achievement system is well-designed, and the pagination implementation shows good understanding of performance optimization. Main concerns:
Recommendation: Approve with minor changes Address the package.json scripts concern and consider the pagination cursor robustness. The rest can be addressed in follow-up PRs. Great work overall! The conductor theme is delightful and the code quality is consistently high. |
- Add scripts/set-version.mjs for cross-platform VITE_APP_VERSION setting
(replaces bash-specific env var syntax that failed on Windows)
- Extract magic numbers into CLAUDE_SESSION_PARSE_LIMITS and CLAUDE_PRICING
constants for better maintainability
- Remove legacy session format migration code - sessions now require aiTabs
- Fix session ID regex patterns to properly parse -ai-{tabId} format
- Remove deprecated aiLogs fallbacks - logs are exclusively in aiTabs now
Claude ID: bfd92ffb-a375-47be-94c5-fe4186325092
Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Pull Request Review: Maestro Achievements SystemThis is a comprehensive PR with 5,648 additions and 1,071 deletions across 62 files, introducing an achievement system and numerous UX improvements. Here's my detailed review: ✅ Strengths1. Excellent Performance Optimizations 🚀The Claude session parsing improvements are well-designed:
2. Security Best Practices 🔒
3. Well-Structured Achievement System 🏆
4. Code Quality
|
- Remove localStorage to electron-store migration for sessions/groups - Remove enterToSend to enterToSendAI/enterToSendTerminal migration - Simplify history filtering to only match exact sessionId (no legacy fallback) Claude ID: 33f0f964-5b7f-4240-9e40-8eddcecafe8e Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Comprehensive Code Review: PR #8 - UX Improvements, Performance Optimizations, and Achievement SystemExecutive SummaryThis is a substantial PR with 37+ commits, 5,655 additions, and changes to 65 files. The changes include major performance optimizations, bug fixes, a new achievement system, and numerous UX improvements. Overall, the code quality is very high, with excellent adherence to project conventions and thoughtful implementation. However, there are a few areas that warrant attention before merging. 1. Code Quality & Best Practices ✅ ExcellentStrengthsTypeScript Conventions
React Best Practices
Project Convention Adherence
Minor Issues
2. Potential Bugs or Issues
|
- Fix AI input lag by using local state for typing, syncing to session state only on blur/submit instead of every keystroke - Add esbuild.drop to strip console.* and debugger in production builds - Memoize handleInputFocus and handleSessionClick callbacks in MainPanel - Simplify textarea auto-grow by removing unnecessary RAF scheduling - Fix AgentSessionsBrowser by changing button to div (nested button issue) - Restore legacy history filter fallback for entries without sessionId Claude ID: 33f0f964-5b7f-4240-9e40-8eddcecafe8e Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Pull Request ReviewThis is a comprehensive PR with 37 commits and 5,698 additions that brings substantial UX improvements, performance optimizations, and new features to Maestro. Overall, the code quality is high and aligns well with the project's conventions outlined in CLAUDE.md. Here's my detailed feedback: ✅ Strengths1. Code Quality & Architecture
2. Performance OptimizationsThe performance improvements are well-thought-out and necessary:
3. User Experience Enhancements
|
| Category | Rating | Notes |
|---|---|---|
| Code Quality | ⭐⭐⭐⭐☆ | Clean, well-structured, follows conventions |
| Security | Command injection risk in set-version.mjs | |
| Performance | ⭐⭐⭐⭐⭐ | Excellent optimizations throughout |
| Bug Risk | Race conditions, memory concerns | |
| Test Coverage | Missing critical tests | |
| UX Impact | ⭐⭐⭐⭐⭐ | Significant improvements |
✅ Recommendations
Before Merge
- ✅ Fix
shell: truein set-version.mjs - ✅ Add git hash format validation
- ✅ Extract duplicate session parsing logic
- ✅ Add JSDoc to new IPC handlers
Follow-up PRs
- Add test coverage for pagination and web sync
- Implement error boundary for achievement overlay
- Optimize git polling with file system watchers
- Add streaming for very large session files
Great work overall! The performance improvements alone make this a valuable PR. Just address the security concern in set-version.mjs before merging. 🚀
Analyze event subscriptions, tool-execution data model per agent, risky operation detection patterns, and storage requirements. Rating: Moderate — all event APIs exist but needs plugin-scoped storage API (Gap RunMaestro#8) and main-process component for SQLite. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Analyze event subscriptions, tool-execution data model per agent, risky operation detection patterns, and storage requirements. Rating: Moderate — all event APIs exist but needs plugin-scoped storage API (Gap RunMaestro#8) and main-process component for SQLite. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Analyze event subscriptions, tool-execution data model per agent, risky operation detection patterns, and storage requirements. Rating: Moderate — all event APIs exist but needs plugin-scoped storage API (Gap RunMaestro#8) and main-process component for SQLite. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>