diff --git a/automaton/dashboard/html/dashboard.js b/automaton/dashboard/html/dashboard.js index 5cc114a..6b6b3ea 100644 --- a/automaton/dashboard/html/dashboard.js +++ b/automaton/dashboard/html/dashboard.js @@ -138,6 +138,14 @@ function renderBoard() { attachCardListeners(); } +const ARTIFACT_LABELS = { + 'research': 'SPEC.md', 'decomposition': 'DECOMPOSITION.md', + 'design': 'DESIGN.md', 'test_design': 'TEST_PLAN.md', + 'implement': 'IMPLEMENTATION.md', 'bug_find': 'BUG_REPORT.md', + 'adv_bug_find': 'ADVERSARIAL_BUG_REPORT.md', 'doc_review': 'DOC_REVIEW.md', + 'referee': 'VERDICT.md', +}; + function renderTaskCard(task) { const statusClass = task.state === 'done' ? 'done' : task.state === 'blocked' ? 'blocked' : 'in_progress'; const statusIcon = task.state === 'done' ? '✅' : task.state === 'blocked' ? '❌' : '🔄'; @@ -156,9 +164,16 @@ function renderTaskCard(task) { return `
${stIcon}${st.name}
`; }).join('')}` : ''; + const artifactsHtml = (reviewStatus === 'pending' || reviewStatus === 'changes_requested') + ? `
${COLUMNS.filter(col => task.artifacts[col.id]).map(col => { + const label = ARTIFACT_LABELS[col.id] || col.label; + return `${label}`; + }).join('')}
` + : ''; return `
${task.display_name}${reviewBadge}${statusIcon}
${subLabel}
+ ${artifactsHtml} ${progressHtml ? `` : ''} ${subtasksHtml}
`; diff --git a/automaton/dashboard/html/styles.css b/automaton/dashboard/html/styles.css index 0546b75..84685e4 100644 --- a/automaton/dashboard/html/styles.css +++ b/automaton/dashboard/html/styles.css @@ -246,6 +246,8 @@ kbd { .review-btn.changes { border-color: var(--error); color: var(--error); } .review-btn.changes:hover { background: var(--error-bg); } .review-comment { font-size: 12px; color: var(--text-secondary); padding: 8px; background: var(--bg-primary); border-radius: 4px; margin-top: 4px; } +.task-card-artifacts { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; } +.artifact-badge { font-size: 10px; padding: 1px 6px; background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 3px; color: var(--text-secondary); font-family: monospace; } @media (max-width: 768px) { .header { flex-wrap: wrap; gap: 8px; }