diff --git a/CLAUDE.md b/CLAUDE.md index 95270c4e..4c32053c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,7 +21,7 @@ When user says "COM": 1) Increment version in BOTH `package.json` AND `CLAUDE.md Claudeman is a Claude Code session manager with a web interface and autonomous Ralph Loop. It spawns Claude CLI processes via PTY, streams output in real-time via SSE, and supports scheduled/timed runs. -**Version**: 0.1370 (must match `package.json`) +**Version**: 0.1371 (must match `package.json`) **Tech Stack**: TypeScript (ES2022/NodeNext, strict mode), Node.js, Fastify, Server-Sent Events, node-pty diff --git a/package.json b/package.json index 065b3a11..e6e506df 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "claudeman", - "version": "0.1370", + "version": "0.1371", "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", @@ -55,8 +55,9 @@ "@types/uuid": "^10.0.0", "@vitest/coverage-v8": "^4.0.17", "agent-browser": "^0.6.0", + "playwright": "^1.58.0", "tsx": "^4.15.0", - "typescript": "^5.5.0", + "typescript": "^5.9.3", "vitest": "^4.0.17" }, "engines": { diff --git a/src/web/public/app.js b/src/web/public/app.js index 1ace27be..ee520052 100644 --- a/src/web/public/app.js +++ b/src/web/public/app.js @@ -5098,10 +5098,18 @@ class ClaudemanApp { const agent = this.subagents.get(agentId); if (!agent) return; - // Calculate final position (cascade from top-left) + // Calculate final position - grid layout to avoid overlaps const windowCount = this.subagentWindows.size; - const finalX = 50 + (windowCount % 5) * 30; - const finalY = 100 + (windowCount % 5) * 30; + const windowWidth = 420; + const windowHeight = 350; + const gap = 20; + const startX = 50; + const startY = 120; + const maxCols = Math.floor((window.innerWidth - startX - 50) / (windowWidth + gap)) || 1; + const col = windowCount % maxCols; + const row = Math.floor(windowCount / maxCols); + const finalX = startX + col * (windowWidth + gap); + const finalY = startY + row * (windowHeight + gap); // Get parent tab position for spawn animation const parentTab = agent.parentSessionId diff --git a/src/web/public/styles.css b/src/web/public/styles.css index 281e052f..bfd572b3 100644 --- a/src/web/public/styles.css +++ b/src/web/public/styles.css @@ -3819,10 +3819,10 @@ kbd { .subagent-window { position: fixed; - width: 500px; - height: 400px; - min-width: 300px; - min-height: 200px; + width: 420px; + height: 350px; + min-width: 280px; + min-height: 180px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; @@ -3980,17 +3980,19 @@ kbd { } .connection-line { - stroke: var(--accent); + stroke: #00ff41; stroke-width: 2; stroke-dasharray: 5 3; fill: none; - opacity: 0.5; - transition: opacity 0.2s, stroke-width 0.2s; + opacity: 0.6; + filter: drop-shadow(0 0 3px #00ff41); + transition: opacity 0.2s, stroke-width 0.2s, filter 0.2s; } .connection-line:hover { - opacity: 0.8; + opacity: 1; stroke-width: 3; + filter: drop-shadow(0 0 6px #00ff41); } .connection-line.spawning-line {