diff --git a/docs/docs.json b/docs/docs.json index 38267c00..e91ce39c 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -62,6 +62,7 @@ "history", "context-management", "document-graph", + "usage-dashboard", "autorun-playbooks", "playbook-exchange", "git-worktrees", diff --git a/docs/features.md b/docs/features.md index 7876b1de..107bee6e 100644 --- a/docs/features.md +++ b/docs/features.md @@ -30,6 +30,7 @@ icon: sparkles - 🔊 **Speakable Notifications** - Audio alerts with text-to-speech announcements when agents complete tasks. - 🎨 **[Beautiful Themes](https://github.com/pedramamini/Maestro/blob/main/THEMES.md)** - 12 themes including Dracula, Monokai, Nord, Tokyo Night, GitHub Light, and more. - 💰 **Cost Tracking** - Real-time token usage and cost tracking per session and globally. +- 📊 **[Usage Dashboard](./usage-dashboard)** - Comprehensive analytics for tracking AI usage patterns. View aggregated statistics, compare agent performance, analyze activity heatmaps, and export data to CSV. Access via `Opt+Cmd+U` / `Alt+Ctrl+U`. - 🏆 **[Achievements](./achievements)** - Level up from Apprentice to Titan of the Baton based on cumulative Auto Run time. 11 conductor-themed ranks to unlock. > **Note**: Maestro supports Claude Code, OpenAI Codex, and OpenCode as providers. Support for additional providers (Aider, Gemini CLI, Qwen3 Coder) may be added in future releases based on community demand. diff --git a/docs/keyboard-shortcuts.md b/docs/keyboard-shortcuts.md index dfc952e3..1fdad48c 100644 --- a/docs/keyboard-shortcuts.md +++ b/docs/keyboard-shortcuts.md @@ -28,6 +28,7 @@ The command palette is your gateway to nearly every action in Maestro. Press `Cm | Open Settings | `Cmd+,` | `Ctrl+,` | | Open Agent Settings | `Opt+Cmd+,` | `Alt+Ctrl+,` | | View All Agent Sessions | `Cmd+Shift+L` | `Ctrl+Shift+L` | +| Usage Dashboard | `Opt+Cmd+U` | `Alt+Ctrl+U` | | Jump to Bottom | `Cmd+Shift+J` | `Ctrl+Shift+J` | | Cycle Focus Areas | `Tab` | `Tab` | | Cycle Focus Backwards | `Shift+Tab` | `Shift+Tab` | diff --git a/docs/screenshots/usage-dashboard.png b/docs/screenshots/usage-dashboard.png new file mode 100644 index 00000000..f5d6a206 Binary files /dev/null and b/docs/screenshots/usage-dashboard.png differ diff --git a/docs/usage-dashboard.md b/docs/usage-dashboard.md new file mode 100644 index 00000000..47c8f033 --- /dev/null +++ b/docs/usage-dashboard.md @@ -0,0 +1,146 @@ +--- +title: Usage Dashboard +description: Track and analyze your AI agent usage patterns with comprehensive analytics and visualizations. +icon: chart-line +--- + +The Usage Dashboard provides comprehensive analytics for tracking your AI usage patterns across all sessions. View aggregated statistics, compare agent performance, and explore activity patterns over time. + +![Usage Dashboard](./screenshots/usage-dashboard.png) + + +The Usage Dashboard only tracks activity from within Maestro. It does not include historical data from before you started using Maestro, nor does it capture usage from agents run outside of Maestro (e.g., directly from the command line). + + +## Opening the Dashboard + +**Keyboard shortcut:** +- macOS: `Opt+Cmd+U` +- Windows/Linux: `Alt+Ctrl+U` + +**From the menu:** +1. Click the hamburger menu (☰) in the top-left corner +2. Select **Usage Dashboard** + +**From Quick Actions:** +- Press `Cmd+K` / `Ctrl+K` and search for "Usage Dashboard" + +## Dashboard Tabs + +The dashboard is organized into four tabs, each providing different insights into your usage: + +### Overview + +The Overview tab gives you a high-level summary of your AI usage: + +**Summary Cards:** +- **Total Queries** — Number of messages sent to AI agents +- **Total Time** — Cumulative time spent waiting for AI responses +- **Avg Duration** — Average response time per query +- **Top Agent** — Your most-used AI agent +- **Interactive %** — Percentage of queries from interactive (non-Auto Run) sessions + +**Agent Comparison:** +A horizontal bar chart showing usage distribution across your AI agents. See at a glance which agents you use most, with query counts and time spent per agent. + +**Source Distribution:** +A donut chart breaking down your queries by source: +- **Interactive** — Manual queries from AI Terminal conversations +- **Auto Run** — Automated queries from playbook execution + +Toggle between **Count** (number of queries) and **Duration** (time spent) views. + +**Activity Heatmap:** +A GitHub-style heatmap showing your activity patterns throughout the week. Each cell represents an hour of the day, with color intensity indicating activity level. Toggle between Count and Duration views to see different perspectives. + +### Agents + +The Agents tab provides detailed per-agent analytics: + +- Individual statistics for each AI agent +- Query counts, total time, and average duration per agent +- Comparison charts for side-by-side analysis + +### Activity + +The Activity tab shows your usage patterns over time: + +- Duration trends chart showing how your usage varies +- Time-based filtering to spot patterns +- Useful for understanding your productivity cycles + +### Auto Run + +The Auto Run tab focuses specifically on automated playbook execution: + +- Auto Run session statistics +- Task completion rates +- Time spent on automated vs. interactive work + +## Time Range Filtering + +Use the time range dropdown in the top-right corner to filter all dashboard data: + +| Range | Description | +|-------|-------------| +| **Today** | Current day only | +| **This Week** | Current week (default) | +| **This Month** | Current calendar month | +| **This Year** | Current calendar year | +| **All Time** | Everything since you started using Maestro | + +The selected time range applies to all tabs and charts. Your preferred time range is saved and restored between sessions. + +## Exporting Data + +Click **Export CSV** in the top-right corner to download your usage data as a CSV file. The export includes: + +- Query timestamps +- Agent information +- Duration metrics +- Source categorization (interactive vs. Auto Run) + +Use exported data for further analysis in spreadsheet applications or to share usage reports. + +## Data Collection + +### What's Tracked + +The Usage Dashboard collects: + +- **Query events** — Each message sent to an AI agent, including duration and which agent handled it +- **Auto Run sessions** — Start/end times of automated playbook runs +- **Auto Run tasks** — Individual task completions within playbooks + +### What's NOT Tracked + +- Message content (your prompts and AI responses) +- File contents or paths +- Token counts or costs (tracked separately per-session) +- Activity outside of Maestro + +### Enabling/Disabling Collection + +Stats collection is enabled by default. To disable: + +1. Open **Settings** (`Cmd+,` / `Ctrl+,`) +2. Find **Stats Collection** +3. Toggle off to stop collecting usage data + +Disabling collection stops new data from being recorded but preserves existing data in the dashboard. + +## Accessibility + +The Usage Dashboard supports colorblind-friendly palettes: + +1. Open **Settings** (`Cmd+,` / `Ctrl+,`) +2. Enable **Colorblind Mode** +3. Charts will use high-contrast colors from the Wong palette + +## Tips + +- **Check the Activity Heatmap** to understand your most productive hours +- **Compare agents** to see if one consistently performs faster than others +- **Monitor Auto Run vs. Interactive** ratio to understand your automation level +- **Export regularly** if you want to track long-term trends externally +- **Use time filtering** to focus on recent activity or see the big picture diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 9e68799a..95275815 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -7596,12 +7596,18 @@ function MaestroConsoleInner() { const worktreePath = `${basePath}/${branchName}`; console.log('[WorktreeConfig] Create worktree:', branchName, 'at', worktreePath); + // Get SSH remote ID for remote worktree operations + // Note: sshRemoteId is only set after AI agent spawns. For terminal-only SSH sessions, + // we must fall back to sessionSshRemoteConfig.remoteId. See CLAUDE.md "SSH Remote Sessions". + const sshRemoteId = activeSession.sshRemoteId || activeSession.sessionSshRemoteConfig?.remoteId || undefined; + try { - // Create the worktree via git + // Create the worktree via git (pass SSH remote ID for remote sessions) const result = await window.maestro.git.worktreeSetup( activeSession.cwd, worktreePath, - branchName + branchName, + sshRemoteId ); if (!result.success) { @@ -7624,15 +7630,15 @@ function MaestroConsoleInner() { saveToHistory: defaultSaveToHistory }; - // Fetch git info for the worktree + // Fetch git info for the worktree (pass SSH remote ID for remote sessions) let gitBranches: string[] | undefined; let gitTags: string[] | undefined; let gitRefsCacheTime: number | undefined; try { [gitBranches, gitTags] = await Promise.all([ - gitService.getBranches(worktreePath), - gitService.getTags(worktreePath) + gitService.getBranches(worktreePath, sshRemoteId), + gitService.getTags(worktreePath, sshRemoteId) ]); gitRefsCacheTime = Date.now(); } catch { @@ -7682,7 +7688,9 @@ function MaestroConsoleInner() { customModel: activeSession.customModel, customContextWindow: activeSession.customContextWindow, nudgeMessage: activeSession.nudgeMessage, - autoRunFolderPath: activeSession.autoRunFolderPath + autoRunFolderPath: activeSession.autoRunFolderPath, + // Inherit SSH configuration from parent session + sessionSshRemoteConfig: activeSession.sessionSshRemoteConfig, }; setSessions(prev => [...prev, worktreeSession]); @@ -7723,11 +7731,17 @@ function MaestroConsoleInner() { const worktreePath = `${basePath}/${branchName}`; console.log('[CreateWorktree] Create worktree:', branchName, 'at', worktreePath); - // Create the worktree via git + // Get SSH remote ID for remote worktree operations + // Note: sshRemoteId is only set after AI agent spawns. For terminal-only SSH sessions, + // we must fall back to sessionSshRemoteConfig.remoteId. See CLAUDE.md "SSH Remote Sessions". + const sshRemoteId = createWorktreeSession.sshRemoteId || createWorktreeSession.sessionSshRemoteConfig?.remoteId || undefined; + + // Create the worktree via git (pass SSH remote ID for remote sessions) const result = await window.maestro.git.worktreeSetup( createWorktreeSession.cwd, worktreePath, - branchName + branchName, + sshRemoteId ); if (!result.success) { @@ -7750,15 +7764,15 @@ function MaestroConsoleInner() { saveToHistory: defaultSaveToHistory }; - // Fetch git info for the worktree + // Fetch git info for the worktree (pass SSH remote ID for remote sessions) let gitBranches: string[] | undefined; let gitTags: string[] | undefined; let gitRefsCacheTime: number | undefined; try { [gitBranches, gitTags] = await Promise.all([ - gitService.getBranches(worktreePath), - gitService.getTags(worktreePath) + gitService.getBranches(worktreePath, sshRemoteId), + gitService.getTags(worktreePath, sshRemoteId) ]); gitRefsCacheTime = Date.now(); } catch { @@ -7808,7 +7822,9 @@ function MaestroConsoleInner() { customModel: createWorktreeSession.customModel, customContextWindow: createWorktreeSession.customContextWindow, nudgeMessage: createWorktreeSession.nudgeMessage, - autoRunFolderPath: createWorktreeSession.autoRunFolderPath + autoRunFolderPath: createWorktreeSession.autoRunFolderPath, + // Inherit SSH configuration from parent session + sessionSshRemoteConfig: createWorktreeSession.sessionSshRemoteConfig, }; setSessions(prev => [...prev, worktreeSession]);