* refactor: consolidate PATH building logic into shared utilities
- Add buildExpandedPath() and buildExpandedEnv() to shared/pathUtils.ts
- Refactor 5 files to use shared PATH functions, eliminating ~170 lines of duplication
- Fix Windows .NET SDK PATH issue by including dotnet installation paths
- Ensure consistent cross-platform PATH handling across CLI agents, detectors, and process managers
Files changed:
- src/shared/pathUtils.ts (added 2 functions)
- src/cli/services/agent-spawner.ts (refactored 3 functions)
- src/main/utils/cliDetection.ts (refactored 1 function)
- src/main/agent-detector.ts (refactored 1 method)
- src/main/process-manager/utils/envBuilder.ts (refactored 1 function)
* refactor: consolidate PATH building logic into shared utilities
- Add buildExpandedPath() and buildExpandedEnv() to shared/pathUtils.ts
- Refactor 5 files to use shared PATH functions, eliminating ~170 lines of duplication
- Fix Windows .NET SDK PATH issue by including dotnet installation paths
- Ensure consistent cross-platform PATH handling across CLI agents, detectors, and process managers
Files changed:
- src/shared/pathUtils.ts (added 2 functions)
- src/cli/services/agent-spawner.ts (refactored 3 functions)
- src/main/utils/cliDetection.ts (refactored 1 function)
- src/main/agent-detector.ts (refactored 1 method)
- src/main/process-manager/utils/envBuilder.ts (refactored 1 function)
* fix(windows): enable PATH access for agent processes
Remove faulty basename rewriting that prevented shell execution from working properly on Windows. Full executable paths are now passed directly to cmd.exe, allowing agents to access PATH and run commands like node -v and dotnet -h.
- Modified process.ts to keep full paths when using shell execution
- Updated ChildProcessSpawner.ts to avoid basename rewriting
- Fixes ENOENT errors when agents spawn on Windows
Resolves issue where agents couldn't execute PATH-based commands.
fix: add missing lint-staged configuration
Add lint-staged configuration to package.json to run prettier and eslint on staged TypeScript files before commits.
* fix(windows): resolve SSH path detection with CRLF line endings
Fix SSH command spawning failure on Windows by properly handling CRLF line endings from the 'where' command. The issue was that result.stdout.trim().split('\n')[0] left trailing \r characters in detected paths, causing ENOENT errors when spawning SSH processes.
Updated detectSshPath() to use split(/\r?\n/) for cross-platform line ending handling
Applied same fix to detect cloudflared and gh paths for consistency
Ensures SSH binary paths are clean of trailing whitespace/carriage returns
Resolves "spawn C:\Windows\System32\OpenSSH\ssh.exe\r ENOENT" errors when using SSH remote agents on Windows.
* fix: resolve SSH remote execution issues with stream-json and slash commands
- Fix SSH remote execution failing with stream-json input by detecting
--input-format stream-json and sending prompts via stdin instead of
command line arguments, preventing shell interpretation of markdown
content (fixes GitHub issue #262)
- Add sendPromptViaStdin flag to ProcessConfig interface for explicit
stream-json mode detection
- Implement proper image support in buildStreamJsonMessage for Claude
Code stream-json format, parsing data URLs and including images as
base64 content in the message
- Add file existence check in discoverSlashCommands to prevent ENOENT
errors when agent paths are invalid
- Simplify ChildProcessSpawner stdin handling to ensure images are
always included in stream-json messages sent via stdin
- Update stream-json message format to use proper {"type": "user_message",
"content": [...]} structure with text and image content arrays
- Remove unrelated husky and lint-staged dev dependencies
- Fix Windows path encoding in session storage (handle backslashes)
- Add debug logging to empty catch blocks for better diagnostics
- Add type guard validation for JSON parsing in output parser
- Added extensive DEBUG-level logging for SSH command execution, spawn details, exit codes, and configuration flow
- Improved Wizard SSH remote support:
- Debounced remote directory validation to reduce excessive SSH calls
- Fixed git.isRepo() to correctly pass remoteCwd for remote checks
- Persisted SSH config in SerializableWizardState and validated directories over SSH
- Ensured ConversationScreen and ConversationSession consistently pass SSH config for remote agent execution
- Fixed "agent not available" errors by forwarding stdin via exec and enabling stream-json mode for large prompts
- Enhanced remote agent execution logic in ProcessManager with stdin streaming, exec-based forwarding, and useStdin flag
- Improved SSH file browser behavior:
- Added resolveSshPath() to locate SSH binaries on Windows (Electron spawn PATH issue)
- Corrected getSshContext() handling of enabled/remoteId states
- Ensured synopsis background tasks run via SSH instead of local paths
- Added Windows development improvements: dev:win script and PowerShell launcher for separate renderer/main terminals
- Added additional SSH directory debugging logs for remote-fs and wizard flows
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add troubleshooting section for pre-commit hooks in CONTRIBUTING.md
- Make prepare script resilient for CI/Docker: husky || true
- Update .prettierignore to exclude coverage/ and *.min.js
- 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 📱
- 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 🏷️
- Compaction now triggers earlier: 2k tokens or 8 exchanges 🎯
- Added extra compaction fallbacks when context gauge resets unexpectedly 🔁
- Read-only tabs now force “return plan in Markdown” instructions 🧾
- Auto Run without worktree automatically runs in read-only/plan mode 🛡️
- ThinkingStatusPill now accepts prefiltered thinkingSessions for speed ⚡
- InputArea precomputes thinking sessions and memoizes command filtering 🚀
- MainPanel memoizes active tab lookup to cut per-keystroke work 🧠
- TerminalOutput memoizes active logs and reduces scroll update frequency 🖥️
- Batched session updates track context high-water mark with explicit reset 🌊
- Wizard adds one-click debug log download right in the conversation UI 🧰
- Leaderboard registration now submits cumulative stats safely for multi-device sync 🏆
- AutoRun prompt now requires a concrete “what I did” synopsis first 🧭
- Added session lifecycle tracking with created/closed events and durations 🚀
- Introduced `session_lifecycle` SQLite table plus indexes via v3 migration 🗄️
- Expanded stats aggregation with total sessions, per-agent, per-day rollups 📊
- Usage Dashboard gained a new “Sessions” summary card (now six metrics) 🧩
- New IPC endpoints to record sessions and fetch lifecycle history cleanly 🔌
- Session create/close events now fire automatically from the main app flow 🧠
- Old-data cleanup now purges session lifecycle rows for leaner databases 🧹
- Stats collection toggle respected for session-created recording, avoiding noise 🔒
- Updated typings across shared/renderer APIs for new session stats fields 🧾
- Bumped package version to 0.14.1 for this stats upgrade release 🎉
- Bumped Maestro to v0.14.0 with a fresh release cutover 🚀
- Added self-serve “Resend Confirmation” for leaderboard token recovery 📧
- Wired new `leaderboard:resendConfirmation` IPC handler end-to-end 🧩
- Upgraded registration modal with resend-first flow, manual token fallback 🛟
- Added Quick Actions entry to open the Document Graph instantly ⚡
- Document Graph now persists external-links toggle back into settings 💾
- Document Graph modal now preserves state across closes for continuity 🔒
- React Flow controls are fully theme-styled with dynamic injected CSS 🎨
- Improved graph layouts to reduce external-node overlap in both modes 🧭
- Wizard now detects provider errors and shows recovery hints + “Go Back” 🧠
Fixes#116 - electron-builder was building both x64 and arm64 packages on each
runner regardless of CLI flags, causing the ARM64 runner's amd64.deb (with ARM
binaries inside) to overwrite the correct x64 package during artifact deduplication.
- Hardened Linux releases with architecture-safe npm caching to prevent cross-contamination 🛡️
- Added Linux-only prebuild cache purges to avoid wrong-arch native binaries 🧹
- Force rebuild native modules per platform, with explicit x64/arm64 env targeting 🧬
- Cleaned node-pty and better-sqlite3 prebuild directories before Linux packaging 🧱
- Added x64 better-sqlite3 binary architecture verification step in CI 🔍
- Improved Auto Run error handling with rich history entries and recovery guidance 🧾
- Added toast notifications for Auto Run errors with friendly titles and details 🔔
- Extended history entry API to track success/failure for better visibility ✅
- Enhanced Auto Run pause logging with recoverability flags and raw error context 🧰
- Bumped version to 0.13.1 for this release rollout 🚀
Install reactflow@11.11.4, @dagrejs/dagre@1.1.8, d3-force@3.0.0, and
@types/d3-force@3.0.10 for the upcoming Document Graph visualization
feature in Phase 3 of the Global Stats & Graphing implementation.
Added recharts v3.6.0 for charting components and date-fns v4.1.0 for
date formatting and manipulation. These are required for the upcoming
Usage Dashboard modal with Recharts visualizations.
- Install better-sqlite3@^12.5.0 for SQLite database support
- Add @types/better-sqlite3@^7.6.13 for TypeScript definitions
- Configure electron-rebuild to build both node-pty and better-sqlite3
- Add better-sqlite3 to asarUnpack for proper Electron packaging
- Foundation for upcoming global stats tracking system
- Added `dev:prod-data` to develop against real production sessions safely 🧪
- Dev mode now defaults to an isolated `maestro-dev` data directory 🗂️
- App can explicitly opt into production userData via `USE_PROD_DATA=1` 🔀
- Contributor docs now clearly map dev commands to their data directories 📚
- Reduced dev/production database lock conflicts when running side-by-side 🔒
- Tab hover overlay redesigned to look like a clean “open folder” panel 🗃️
- Removed tab title tooltip to streamline the tab interaction feel ✂️
- Toast logging now captures whether audio/TTS notifications were enabled 🎙️
- Toast logs include the exact audio command used for notifications 🧾
- TTS playback now reuses captured audio state for consistent behavior 🔊
- Bumped project version to 0.12.2 for this release rollout 🚀
- Added why-did-you-render to spotlight unnecessary React re-renders 🔍
- Initialized dev-only WDYR profiling with hooks and memo tracking 🧪
- Ensured WDYR loads before React for accurate render diagnostics ⏱️
- Refreshed About modal with cleaner creator + Austin side-by-side layout 🧩
- Inserted visual divider to better separate About modal sections 🧱
- Corrected About modal GitHub link targets between repo and profile 🔗
- Updated About modal tests to match the swapped GitHub link behavior ✅
- Stripped markdown from History list summaries for cleaner previews 🧹
- Create scripts/refresh-openspec.mjs for build-time prompt updates
- Add refresh-openspec npm script to package.json
- Add extraResources for openspec prompts in all platform builds
- Update bundled prompts with latest from OpenSpec repository
Found expired OAuth token, attempting refresh...
Token refresh successful
## CHANGES
- Revamped README with power features, screenshots, and crisp quick-start flow 🚀
- Added prominent User Docs badge linking to full documentation hub 📚
- Documented Auto Run playbooks for batch checklist execution and history tracking ✅
- Highlighted Git worktrees for parallel agents on isolated branches instantly 🌿
- Showcased Group Chat with moderator AI for coordinated multi-agent discussions 🗣️
- Introduced Remote Access docs for phone control via QR and tunnels 📱
- Documented `maestro-cli` for headless automation with JSONL scripting support 🧰
- Polished Achievement Card visuals: real GitHub logo and brighter trophies 🏆
- Improved Auto Run summaries by avoiding filename-extension sentence splitting ✍️
- Build and dev tweaks: disable npm rebuild and stop watching without HMR 🛠️
- Hardened Linux x64 builds: pre-rebuild native modules and verify node-pty 🐧
- Fixed ARM64 packaging reliability with forced rebuilds and architecture checks 🧬
- Disabled electron-builder npm rebuild on Linux to prevent wrong binaries 🧯
- Added rich tab bulk-close actions with smart, position-aware menu options 🗂️
- Introduced undoable tab close workflow, remembering up to 25 tabs 🔄
- Expanded keyboard shortcuts for tab creation, navigation, and bulk close ⌨️
- Refreshed context management docs to reflect hover-based tab menu overlay 📚
- Upgraded About/Achievements to accept leaderboard registration personalization 🏅
- Shareable achievement cards now include avatar and social handles rendering 🖼️
- Added deep synopsis debugging logs across parser, process manager, and UI 🔍
- Refreshed Maestro tagline across README and package metadata for clarity ✨
- Reset-on-completion now writes working copies into `Runs/` folder consistently 📁
- Auto Run working-copy IPC handler updated for new `Runs/` directory naming 🧭
- Working-copy relative paths now return `Runs/...` for downstream consumers 🔗
- Preload API docs updated to reflect `Runs/` working-copy location 🧩
- AutoRunner Help Modal now points users to `Runs/` audit-log folder 🪟
- Batch processor tracking/comments updated for `Runs/` audit log behavior 🧾
- Test suite updated to expect `Runs/` working-copy paths reliably 🧪
- Reset-on-completion now uses `/runs/` working copies, preserving originals always 🗂️
- Added `autorun:createWorkingCopy` IPC API with path validation safeguards 🔐
- Web UI now hides thinking/tool logs for cleaner conversations 🧹
- Git worktree directory scans run in parallel for huge speedups ⚡
- Legacy worktree discovery scans only on focus, not constant polling 👀
- Mermaid rendering revamped for safer, smoother SVG insertion flow 🧩
- Mobile session selection updates refs first, avoiding WebSocket race bugs 📡
- Mobile search auto-expands groups containing matches for faster navigation 🔎
- Mobile AI input supports Cmd/Ctrl+Enter submit while Enter adds newline ⌨️
- Auto Run UI simplified: removed “stopping” state visuals, consistent pulsing 🤖
Found expired OAuth token, attempting refresh...
Token refresh successful
## CHANGES
- Added `rehype-slug` for automatic heading IDs in markdown previews 🔗
- Enabled smooth in-page anchor link navigation across markdown renderers 🧭
- Improved worktree session detection by normalizing paths, avoiding duplicates 🧹
- Broadcast session updates when working directory changes, not just state 📣
- Added “stopping” batch-session tracking and surfaced it throughout the UI 🛑
- Refined Auto Run indicators: STOPPING label, red tint, no pulse 🎛️
- Prevented repeated stop clicks with stricter disabled button behavior 🚫
- Memoized batch-derived flags to cut rerenders from new array references ⚡
- Fixed HMR stale-closure issues via ref-based batch state broadcaster 🧩
- Mermaid diagrams now fully theme-aware using app color variables 🎨
Found expired OAuth token, attempting refresh...
Token refresh successful
## CHANGES
- Prompts now compile from Markdown into TypeScript at build-time 🔧
- New `build:prompts` step runs automatically for dev and release builds 🏗️
- Main process stops runtime prompt file I/O for faster, safer startups ⚡
- Group chat prompt access refactored into getter functions for flexibility 🧩
- Added IPC to reset a participant context with session summarization 🔄
- Participant cards now copy agent session IDs with one click 📋
- UI shows context-reset button when participant usage hits 40%+ ⏱️
- History markdown now supports raw HTML rendering via `rehype-raw` 🧪
- History detail supports clickable file links and in-app file previews 🗂️
- Document copy-drag enables reset-on-completion across duplicate filenames 🧷
- Register spec-kit IPC handlers in main process (was missing)
- Implement actual download/extract for "Check for Updates" button
- Downloaded prompts stored in user data dir, preferred over bundled
- Add spec-kit prompts to extraResources for production builds
- Fix github/spec-kit link to open in system browser
- Add /speckit.help command explaining workflow and Auto Run integration
- Simplify metadata.json (remove redundant commands object)
- Resolved conflicts in package.json (kept both test:performance and refresh-speckit scripts)
- Resolved conflicts in agent-detector.test.ts (kept try/finally pattern for platform restoration)
- Fixed speckit-manager.ts to read prompts from disk instead of using Vite's ?raw imports
- Removed unused extractDescription function and added proper types for GitHub API response
- Add ESLint 9 configuration (eslint.config.mjs) with TypeScript and React hooks plugins
- Add npm run lint:eslint command for code quality checks
- Expand npm run lint to check all three TypeScript configs (renderer, main, cli)
- Update tsconfig.cli.json to include src/prompts and src/types directories
Fix 29 ESLint errors:
- Remove unused updateCliActivity import in batch-processor.ts
- Convert {false && <jsx>} patterns to comments in AutoRun components
- Wrap case block with const declarations in braces (AgentSelectionScreen)
- Fix unused expression pattern in PreparingPlanScreen
- Fix conditional hook calls in FilePreview, OfflineQueueBanner, RecentCommandChips, TerminalOutput
- Add windows-diagnostics.json to PackageContents interface
Update CLAUDE.md and CONTRIBUTING.md with new linting commands and documentation.
Claude ID: 029e8abe-5734-4967-9fb4-c85078c1973d
Maestro ID: 87ffa06e-0ecd-4eb8-b327-dad1ec24f7a9
- Add asarUnpack for node-pty so native module is extracted outside ASAR
- Add missing system dependencies (libdrm2, libgbm1, libasound2) to deb
- Add missing dependencies (libdrm, mesa-libgbm, alsa-lib) to rpm
Removed dead code:
- useModalManager.ts (136 lines) - never imported by application code
- useModalManager.test.ts (686 lines) - tests for dead hook
The codebase uses useLayerStack + LayerStackContext for modal management
which provides a more sophisticated API (escape delegation, modal vs
overlay distinction, onBeforeClose support, debug APIs, focus traps).
Also removed stale ARCHITECTURE.md references to useFocusManager
(removed in Task 98).
Found expired OAuth token, attempting refresh...
Token refresh successful
POST "https://api.anthropic.com/v1/messages": 429 Too Many Requests {"type":"error","error":{"type":"rate_limit_error","message":"This request would exceed your account's rate limit. Please try again later."},"request_id":"req_011CWJa3o6GdjJKgdNY7G8EN"}