evolve-dashboard 0.1.0

Local-only web dashboard for Evolve
Documentation
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Evolve Dashboard</title>
    <style>
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
            margin: 0;
            padding: 2rem;
            background: #0a0a0a;
            color: #e0e0e0;
        }
        h1 { color: #0A84FF; margin-bottom: 2rem; }
        .card {
            background: #151515;
            border: 1px solid #2a2a2a;
            border-radius: 8px;
            padding: 1rem 1.5rem;
            margin-bottom: 1rem;
        }
        .card-title { font-weight: 600; color: #0A84FF; margin-bottom: 0.25rem; }
        .card-meta { color: #808080; font-size: 0.85rem; }
        .empty { color: #808080; font-style: italic; }
        button {
            background: #0A84FF;
            color: white;
            border: none;
            padding: 0.5rem 1rem;
            border-radius: 4px;
            cursor: pointer;
            margin-top: 1rem;
        }
        button:hover { background: #3399ff; }
        pre { overflow-x: auto; background: #0a0a0a; padding: 0.5rem; border-radius: 4px; }
    </style>
</head>
<body>
    <h1>Evolve</h1>
    <div id="app">Loading...</div>

    <script>
        async function refresh() {
            const app = document.getElementById("app");
            try {
                const res = await fetch("/api/projects");
                const projects = await res.json();
                if (!projects.length) {
                    app.innerHTML = '<p class="empty">No projects registered. Run <code>evolve init &lt;adapter&gt;</code> in a repo to get started.</p>';
                    return;
                }
                app.innerHTML = projects.map(p => `
                    <div class="card">
                        <div class="card-title">${p.name}</div>
                        <div class="card-meta">${p.adapter_id} · ${p.root_path}</div>
                        <div class="card-meta">Created ${new Date(p.created_at).toLocaleString()}</div>
                        <div class="card-meta">Champion config: ${p.champion_config_id ?? ''}</div>
                    </div>
                `).join('');
            } catch (e) {
                app.innerHTML = `<p class="empty">Failed to load: ${e.message}</p>`;
            }
        }
        refresh();
        setInterval(refresh, 5000);
    </script>
</body>
</html>