- Split Git status into file, branch, and detail hooks for cleaner UI wiring 🧩
- Supercharged panel resizing by updating state only on mouseup ⚡
- Added explicit tests ensuring resize drags avoid excessive rerenders 🧪
- Refreshed dashboard wording: “Agent Comparison” is now “Provider Comparison” 🔁
- Renamed “Source Distribution” chart to clearer “Session Type” labeling 🏷️
- Updated chart accessibility labels and headings to match new terminology ♿
- Improved mobile timestamps: time-only for today, date+time for older 🕰️
- Added robust MessageHistory tests covering today vs older date formatting 📅
- Eliminated mobile session ref initialization race with immediate saved defaults 🚀
- Made active tab ref mirror URL/saved tab instantly for reliable callbacks 🧭
- Simplified hook test by removing unnecessary async waiting on refs 🧪
- Import useMainPanelProps, useSessionListProps, useRightPanelProps hooks
- Create memoized wizard handlers (handleWizardComplete, handleWizardLetsGo, handleToggleWizardShowThinking)
- Integrate all three props hooks with comprehensive dependency objects
- Update MainPanel, SessionList, and RightPanel JSX to use spread props pattern
- Fix type mismatches:
- BatchRunState null vs undefined
- AITab type for activeTab
- DocumentGenerationCallbacks function signature
- mergeSourceName/mergeTargetName string | undefined
- lastGraphFocusFilePath string | undefined
This optimization prevents React from re-evaluating 50-100+ props on every state change in MaestroConsoleInner by memoizing props objects that only change when their dependencies change.
Add React's useDeferredValue to prioritize input field responsiveness
while allowing expensive components to defer their updates. InputArea
uses the immediate inputValue for responsive typing, while the prompt
composer uses deferredInputValue to avoid blocking keystrokes.
- RightPanel/SessionList resize: Use direct DOM style updates during drag,
React state updated only on mouseup (eliminates ~60 re-renders/sec)
- Extract 4 inline callbacks from MainPanel props to useCallback hooks:
handleExportHtml, handlePublishTabGist, handleClearAgentErrorForMainPanel,
handleShowAgentErrorModal
- Add themeRef to App.tsx for callback stability
- Verified derived arrays already properly memoized
- Playbook Exchange now highlights local playbooks with blue “Local” badge 🟦
- Added new screenshot documenting the Local badge UI state 🖼️
- Marketplace manifest results now include per-playbook `source` metadata 🧾
- Manifest handling now merges official and local sources consistently 🔀
- Network failures now return empty merged manifest instead of error 📡
- HTTP fetch failures now degrade gracefully to empty manifest result 🧯
- Marketplace tests updated for dual-read cache + local manifest flow 🧪
- InputArea now expects pre-filtered `thinkingSessions` for better performance ⚡
- ThinkingStatusPill mock now matches real conditional rendering behavior 🎭
- Added `onManifestChanged` stub to Maestro test setup for new hook 🪝
- Dramatically reduced re-renders by memoizing tons of UI callbacks 🚀
- Input blur now syncs session text via refs, not dependencies 🧠
- File preview history navigation now uses stable, memoized back/forward arrays 🧭
- Thinking status now receives pre-filtered “busy AI” sessions only 🔥
- MainPanel no longer rerenders on keystrokes from inline prop functions ⚡
- New log deletion handler cleanly removes user blocks and updates histories 🗑️
- AI log deletion also prunes persisted Claude JSONL context asynchronously 📜
- Tab actions (rename, reorder, star, unread) now run through memoized handlers 🧩
- “Last Document Graph” opens reliably using ref-backed remembered file path 🕸️
- Replay message now stages images then triggers input processing via ref 🎬
- Add comprehensive documentation for local manifest feature
- Create example local-manifest.json with custom playbook structure
- Implement local manifest reading and merging with official manifests
- Add file watcher for hot reload on local manifest changes
- Support local filesystem paths (absolute and tilde-prefixed)
- Add "Local" badge to distinguish custom playbooks in UI
- Expose manifest change event through preload API
- Add source field to playbook type for origin tracking
- Search result scrolling now centers correctly within scrollable preview container 🎯
- Search scrolling clamps to non-negative positions for safer navigation 🛡️
- Edit-mode search no longer steals focus while you type—huge UX win ✍️
- Edit-mode search now resets match counts cleanly when query clears 🧹
- Match selection triggers only during navigation (Enter/Shift+Enter) ⌨️
- Added tracking refs to detect match navigation versus query edits 🧠
- Git status widget is now memoized to avoid needless re-renders 🚀
- Session hover tooltip content is memoized for smoother session lists 🧊
- Installed React DevTools automatically for Electron development debugging bliss 🧩
- Fixed token aggregation: MAX across models to stop double-counting 🎯
- Corrected Claude context math by excluding cumulative cache-read tokens 📉
- Context usage now reflects latest value, not high-water mark history 🧠
- Preserved lifetime stats by archiving deleted sessions instead of purging 🗄️
- Filtered SSH shell-integration junk from stdout for cleaner logs 🧼
- Hardened terminal/ANSI stripping for iTerm2, VSCode, and OSC sequences 🧹
- Prevented UI freezes: truncate huge syntax-highlight previews and warn users ⚠️
- Skipped expensive token counting for >1MB files to keep previews snappy 🚀
- Mobile web now renders AI responses as rich Markdown with copyable code blocks 📱
- Persist Claude session context-usage percentage, surviving resumes and restarts 🧠
- New IPC/API: `claude:updateSessionContextUsage` to store live context stats 🔌
- Fix resumed sessions falsely showing 100% context from lifetime tokens 🧯
- Usage stats now preserve cost only; tokens intentionally zeroed 📉
- Resume now always fetches session origins to restore context usage 🧭
- Reconstruct context percent on resume by synthesizing equivalent input tokens 🧮
- Add `{{AGENT_HISTORY_PATH}}` template variable for prompts and commands 🧾
- System prompt gains Task Recall guidance using the history JSON file 🗂️
- Input processing now resolves history file path during prompt substitution 🧬
- Add Electron DevTools trace-export workarounds in performance docs 🛠️
- Right-click now selects the clicked file before opening menu 🖱️
- LogViewer shows agent name pill for toast project entries ✏️
- Autorun logs get an agent/session pill pulled from context 🏷️
- Context badges no longer show for toast and autorun logs 🚫
- Added `NOTHING_TO_REPORT` sentinel for “no meaningful work” responses 🧩
- Synopsis parsing now flags `nothingToReport` and skips history creation ⏭️
- New helper `isNothingToReport()` handles ANSI/box-drawing-wrapped tokens 🧼
- Autorun synopsis prompt now requires strict `NOTHING_TO_REPORT` output 📜
- File tree loading avoids redundant reloads after an empty initial load 🌲
- Delete confirmation button uses softer semi-transparent error styling 🎨
- Split monolithic CLAUDE.md into focused, indexed sub-docs for faster onboarding 📚
- Added deep Agent support guide: capabilities, flags, parsers, storage, and adding agents 🤖
- Documented full `window.maestro` IPC surface with clearer namespaces and History API 📡
- Captured core implementation patterns: processes, security, settings, modals, SSH, Auto Run 🧭
- Published performance playbook for React, IPC batching, caching, and debouncing 🚀
- Formalized Session interface docs, including multi-tab, queues, stats, and error fields 🧩
- Session-level custom agent path now overrides detected binary during spawn 🛠️
- New rendering settings: disable GPU acceleration (early startup) and disable confetti 🖥️
- Confetti effects now respect user preference across celebration overlays and wizard completion 🎊
- File explorer now distinguishes “loading” vs “no files found” empty states 🗂️
* MAESTRO: Add Bluesky social network support to leaderboard registration
- Add blueskyHandle field to LeaderboardRegistration interface
- Create BlueskySkyIcon component with official butterfly logo
- Add Bluesky input field to registration modal
- Update IPC handlers to accept and transmit blueskyHandle
- Support both username.bsky.social and custom domain formats
- Strip @ prefix from handles for consistency with other social fields
- Update main process to include blueskyHandle in API submission
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* MAESTRO: Add comprehensive test suite for Bluesky leaderboard integration
- Created LeaderboardRegistrationModal.test.tsx with 20 tests
- Tests cover Bluesky field rendering, @ prefix stripping, state persistence, and theme styling
- 16/20 tests passing (4 form submission tests have timing issues in test environment)
- Updated test setup to include leaderboard API mock
- All existing tests remain passing (9,893/9,898 pass)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix: add blueskyHandle to MaestroAPI type and fix test setup
- Added blueskyHandle to global.d.ts MaestroAPI interface (was missing)
- Added missing leaderboard mock methods to test setup
- Fixed form submission tests to use existing registration
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: Pedram Amini <pedram.amini@gmail.com>
- Added `calculateContextTokens` to unify agent-specific context token semantics 🧮
- Codex context usage now counts output tokens for accurate combined-window math 🎯
- Claude context usage keeps excluding output tokens, matching real limits 🧠
- Refactored context percentage calculations across main process listeners 🔧
- Updated desktop UI panels to use shared context-token calculator 📊
- Tab switcher now computes context usage using each tab’s agent type 🗂️
- Context extraction/token estimation now respects agent-specific counting logic 🔍
- Mobile header and status banner now handle Codex combined context windows 📱
- Expanded test coverage for new token calculator, edge cases included ✅
- Adjusted Codex default-window tests to reflect new output-inclusive usage 🧪
Fixes#178 - OpenSpec "Check for Updates" was always showing version 0.1.0
regardless of the actual latest release (currently v0.19.0).
Root cause: sourceVersion was hardcoded in refreshOpenSpecPrompts().
Changes:
- Fetch latest release from GitHub API to get actual version tag
- Download AGENTS.md from release tag instead of main branch
- Use fetched version for both commitSha and sourceVersion metadata
- Update bundled metadata to v0.19.0
- Removed `remoteWorkingDir` SSH setting—remote sessions now start in `~` by default 🏠
- Simplified SSH command building: only `cwd` triggers remote `cd` injection 🧭
- Dropped remote-CWD integration assertions to reduce flaky SSH test failures 🧪
- Added `stripAnsi` utility to clean ANSI/OSC noise from SSH outputs 🧼
- Hardened remote agent detection against iTerm2 shell-integration escape sequences 🛰️
- Updated remote git execution to require explicit `remoteCwd` for correctness 🔧
- Streamlined SSH remote IPC payloads—no more working-directory field transmitted 📡
- Cleaned up SSH remote settings UI by removing the Remote Working Directory input 🧰
- Refined remote `cd` handling: `~` and bare `cd` map to session base dir 📁
- Tightened shared types and tests to match the new SSH remote config shape 🧩
- Launched Symphony Stats dashboard with summary cards and achievement milestones 🏆
- Embedded new Symphony screenshots to showcase History and Stats tabs 🖼️
- Added “Available Issues” card linking Maestro-ready GitHub issue list 🔗
- Introduced “Confirm and Erase” agent deletion flow that trashes working directory 🗑️
- Added new Delete Agent confirmation modal with strong accessibility and focus behavior ♿
- Implemented secure `shell:trashItem` IPC handler with validation and existence checks 🛡️
- Exposed `maestro.shell.trashItem()` in preload and renderer typings for use 🧩
- Wizard document prompts now respect configurable Auto Run folder paths 📁
- Prompt templates now forbid extra summary/recap files—only Phase docs allowed 🚫
- Added a live “Detecting agent on remote host” banner during SSH scans 🚧
- Introduced a themed, animated spinner to visualize ongoing detection work 🌀
- Conditioned the banner to hide once a real agent configuration is detected 🎯
- Smoothed tab switching by resizing textarea only when active tab changes 🚀
- Reduced costly layout reflows by dropping per-keystroke resize dependencies ⚡
- Prevented agent-config undefined states during slow SSH detection with fallbacks 🛡️
- Added placeholder agent configs from tiles to handle detection race conditions 🧩
- Added multi-document Auto Run progress fields across IPC and WebSocket state 📚
- Web clients now receive aggregated task totals and completions across documents 📈
- Active tab UI docs expanded with screenshot and richer contribution details 🖼️
- Canonical `activeTab` lookup is now memoized to kill repeated O(n) finds ⚡
- Staged images, logs, and prompt tab toggles now reuse memoized `activeTab` 🧠
- Tab-completion suggestions now debounce input only while menu is open ⌨️
- @mention suggestions now debounce filter only while menu is open 🔎
- Disabling worktrees now removes all sub-agents and reports counts 🧹
- Added performance guidance: debounce, throttle, batching, virtualization, parallel IPC 🚀
- Bumped version to 0.14.5 for this release tag 🏷️