diff --git a/CLAUDE.md b/CLAUDE.md index 226d5060..a46e8d8d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -16,7 +16,7 @@ When user says "COM": 1. Increment version in BOTH `package.json` AND `CLAUDE.md` 2. Run: `git add -A && git commit -m "chore: bump version to X.XXXX" && git push && npm run build && systemctl --user restart claudeman-web` -**Version**: 0.1418 (must match `package.json`) +**Version**: 0.1419 (must match `package.json`) ## Project Overview diff --git a/package.json b/package.json index 91de7599..6e384374 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "claudeman", - "version": "0.1418", + "version": "0.1419", "description": "The missing control plane for Claude Code - run 20 autonomous agents with real-time monitoring and session persistence", "type": "module", "main": "dist/index.js", diff --git a/src/web/public/app.js b/src/web/public/app.js index 9e5190e0..70a9368e 100644 --- a/src/web/public/app.js +++ b/src/web/public/app.js @@ -2730,8 +2730,31 @@ class ClaudemanApp { const modal = document.getElementById('ralphWizardModal'); modal?.classList.remove('active'); + // Track windows minimized due to wizard minimize (so we can restore them) + this.wizardMinimizedWindows = new Set(); + + // Minimize all plan subagent windows + for (const [agentId, windowData] of this.planSubagents) { + if (windowData.element && windowData.element.style.display !== 'none') { + windowData.element.style.display = 'none'; + this.wizardMinimizedWindows.add(`plan:${agentId}`); + } + } + + // Minimize all regular subagent windows + for (const [agentId, windowData] of this.subagentWindows) { + if (windowData.element && !windowData.minimized && windowData.element.style.display !== 'none') { + windowData.element.style.display = 'none'; + windowData.hiddenByWizard = true; + this.wizardMinimizedWindows.add(`subagent:${agentId}`); + } + } + // Show the minimized indicator this.showWizardMinimizedIndicator(); + + // Update connection lines (all hidden now) + this.updateConnectionLines(); } restoreRalphWizard() { @@ -2741,6 +2764,30 @@ class ClaudemanApp { // Show the modal again const modal = document.getElementById('ralphWizardModal'); modal?.classList.add('active'); + + // Restore windows that were minimized due to wizard minimize + if (this.wizardMinimizedWindows) { + for (const key of this.wizardMinimizedWindows) { + if (key.startsWith('plan:')) { + const agentId = key.slice(5); + const windowData = this.planSubagents.get(agentId); + if (windowData?.element) { + windowData.element.style.display = ''; + } + } else if (key.startsWith('subagent:')) { + const agentId = key.slice(9); + const windowData = this.subagentWindows.get(agentId); + if (windowData?.element && windowData.hiddenByWizard) { + windowData.element.style.display = ''; + windowData.hiddenByWizard = false; + } + } + } + this.wizardMinimizedWindows.clear(); + } + + // Update connection lines + this.updateConnectionLines(); } showWizardMinimizedIndicator() { diff --git a/src/web/public/styles.css b/src/web/public/styles.css index 3c842bf2..bd8bf2b2 100644 --- a/src/web/public/styles.css +++ b/src/web/public/styles.css @@ -4679,18 +4679,23 @@ kbd { .connection-line { stroke: #00ff41; - stroke-width: 2; + stroke-width: 3; stroke-dasharray: 5 3; fill: none; - opacity: 0.6; - filter: drop-shadow(0 0 3px #00ff41); + opacity: 0.9; + /* Multiple shadows for contrast against blurred backgrounds */ + filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.8)) + drop-shadow(0 0 4px #00ff41) + drop-shadow(0 0 8px #00ff41); transition: opacity 0.2s, stroke-width 0.2s, filter 0.2s; } .connection-line:hover { opacity: 1; - stroke-width: 3; - filter: drop-shadow(0 0 6px #00ff41); + stroke-width: 4; + filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.9)) + drop-shadow(0 0 6px #00ff41) + drop-shadow(0 0 12px #00ff41); } .connection-line.spawning-line { @@ -4701,31 +4706,41 @@ kbd { /* Wizard connection lines - different color to show plan generation link */ .connection-line.wizard-connection { stroke: #60a5fa; - filter: drop-shadow(0 0 4px #60a5fa); + stroke-width: 3; + /* Dark outline for contrast against blurred backgrounds */ + filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.8)) + drop-shadow(0 0 5px #60a5fa) + drop-shadow(0 0 10px #60a5fa); stroke-dasharray: 8 4; animation: wizard-pulse 1.5s ease-in-out infinite; } @keyframes wizard-pulse { - 0%, 100% { opacity: 0.5; } - 50% { opacity: 0.9; } + 0%, 100% { opacity: 0.75; } + 50% { opacity: 1; } } /* Plan subagent to regular subagent connection lines (Opus → Haiku) */ .connection-line.plan-to-subagent-line { stroke: #00ff41; - filter: drop-shadow(0 0 4px #00ff41); + stroke-width: 3; + /* Dark outline for contrast against blurred backgrounds */ + filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.8)) + drop-shadow(0 0 5px #00ff41) + drop-shadow(0 0 10px #00ff41); stroke-dasharray: 5 3; animation: plan-subagent-pulse 1.2s ease-in-out infinite; } .connection-line.plan-to-subagent-line:hover { - stroke-width: 3; - filter: drop-shadow(0 0 8px #00ff41); + stroke-width: 4; + filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.9)) + drop-shadow(0 0 8px #00ff41) + drop-shadow(0 0 14px #00ff41); } @keyframes plan-subagent-pulse { - 0%, 100% { opacity: 0.6; } + 0%, 100% { opacity: 0.8; } 50% { opacity: 1; } }