// Navigation const navLinks = document.querySelectorAll('.nav-link'); const pages = document.querySelectorAll('.page'); navLinks.forEach(link => { link.addEventListener('click', (e) => { e.preventDefault(); const targetPage = link.dataset.page; // Update active nav link navLinks.forEach(l => l.classList.remove('active')); link.classList.add('active'); // Show target page pages.forEach(page => { page.classList.remove('active'); if (page.id === `page-${targetPage}`) { page.classList.add('active'); } }); // Load page data if (targetPage === 'wiki') loadWiki(); if (targetPage === 'agents') loadAgents(); if (targetPage === 'usage') loadUsage(); }); }); // Task Dashboard const COLUMNS = { 'Backlog': { title: '📋 Backlog', tasks: [] }, 'Todo': { title: '📝 Todo', tasks: [] }, 'In Progress': { title: '🔄 In Progress', tasks: [] }, 'Review': { title: '👀 Review', tasks: [] }, 'Done': { title: '✅ Done', tasks: [] } }; async function loadTasks() { const res = await fetch('/api/tasks'); const tasks = await res.json(); // Reset columns Object.keys(COLUMNS).forEach(status => { COLUMNS[status].tasks = []; }); // Group tasks by status tasks.forEach(task => { if (COLUMNS[task.status]) { COLUMNS[task.status].tasks.push(task); } }); renderBoard(); } function renderBoard() { const board = document.getElementById('board'); board.innerHTML = ''; Object.entries(COLUMNS).forEach(([status, column]) => { const columnEl = document.createElement('div'); columnEl.className = 'column'; columnEl.innerHTML = `
${escapeHtml(task.description || '')}
`; // Checkbox handler const checkbox = cardEl.querySelector('.card-check'); checkbox.addEventListener('change', async () => { await fetch(`/api/tasks/${task.id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: 'Done' }) }); loadTasks(); }); cardsEl.appendChild(cardEl); }); board.appendChild(columnEl); }); } // Task form document.getElementById('task-form').addEventListener('submit', async (e) => { e.preventDefault(); const formData = new FormData(e.target); const task = { title: formData.get('title'), description: formData.get('description'), assignee: formData.get('assignee'), priority: formData.get('priority'), status: formData.get('status'), tags: formData.get('tags').split(',').map(t => t.trim()).filter(t => t) }; await fetch('/api/tasks', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(task) }); e.target.reset(); loadTasks(); }); // Populate agent dropdown async function populateAgentDropdown() { try { const res = await fetch('/api/agents'); const agents = await res.json(); const select = document.getElementById('assignee'); if (!select) return; // Keep the first option ("Select agent...") const firstOption = select.options[0]; select.innerHTML = ''; select.appendChild(firstOption); // Add agent options agents.forEach(agent => { const option = document.createElement('option'); option.value = agent.name; option.textContent = agent.name; select.appendChild(option); }); } catch (err) { console.error('Failed to load agents for dropdown:', err); } } // Populate dropdown on page load document.addEventListener('DOMContentLoaded', () => { populateAgentDropdown(); }); // Wiki async function loadWiki() { const res = await fetch('/api/wiki'); const pages = await res.json(); const wikiList = document.getElementById('wiki-list'); wikiList.innerHTML = ''; pages.forEach(page => { const itemEl = document.createElement('div'); itemEl.className = 'wiki-item'; itemEl.innerHTML = `${new Date(page.created).toLocaleDateString()}
`; itemEl.addEventListener('click', async () => { // Mark active wikiList.querySelectorAll('.wiki-item').forEach(i => i.classList.remove('active')); itemEl.classList.add('active'); // Load content const contentRes = await fetch(`/api/wiki/${page.filename}`); const contentData = await contentRes.json(); const wikiContent = document.getElementById('wiki-content'); wikiContent.innerHTML = `${escapeHtml(contentData.content)}`;
});
wikiList.appendChild(itemEl);
});
}
// Agents
async function loadAgents() {
const res = await fetch('/api/agents');
const agents = await res.json();
const grid = document.getElementById('agents-grid');
grid.innerHTML = '';
agents.forEach(agent => {
const cardEl = document.createElement('div');
cardEl.className = 'agent-card';
cardEl.innerHTML = `
${agent.currentTask || 'No active task'}