Loading...
Loading...
UI design team pipeline. Research existing design system, generate design tokens (W3C format), audit quality, and implement code. CSV wave pipeline with GC loop (designer <-> reviewer) and dual-track parallel support.
npx skill4agent add catlog22/claude-code-workflow team-uidesign--yes-y$team-uidesign "Design a button component with tokens and accessibility"
$team-uidesign -c 3 "Create a complete design system for our SaaS dashboard"
$team-uidesign -y "Full design system redesign for healthcare portal"
$team-uidesign --continue "uds-saas-dashboard-20260308"-y, --yes-c, --concurrency N--continue.workflow/.csv-wave/{session-id}/tasks.csvresults.csvdiscoveries.ndjsoncontext.md+-------------------------------------------------------------------+
| TEAM UI DESIGN WORKFLOW |
+-------------------------------------------------------------------+
| |
| Phase 0: Pre-Wave Interactive (Requirement Clarification) |
| +- Parse UI design task description |
| +- Select scope (component/system/full-system), industry |
| +- Output: refined requirements for decomposition |
| |
| Phase 1: Requirement -> CSV + Classification |
| +- Signal detection: keyword scan -> pipeline inference |
| +- Pipeline selection (component/system/full-system) |
| +- Dependency graph from pipeline definition |
| +- Classify tasks: csv-wave | interactive (exec_mode) |
| +- Compute dependency waves (topological sort) |
| +- Generate tasks.csv with wave + exec_mode columns |
| +- User validates task breakdown (skip if -y) |
| |
| Phase 2: Wave Execution Engine (Extended) |
| +- For each wave (1..N): |
| | +- Execute pre-wave interactive tasks (if any) |
| | +- Build wave CSV (filter csv-wave tasks for this wave) |
| | +- Inject previous findings into prev_context column |
| | +- spawn_agents_on_csv(wave CSV) |
| | +- Execute post-wave interactive tasks (if any) |
| | +- Merge all results into master tasks.csv |
| | +- Check: any failed? -> skip dependents |
| | +- GC Loop: if audit fails, create DESIGN-fix + AUDIT-re |
| +- discoveries.ndjson shared across all modes (append-only) |
| |
| Phase 3: Post-Wave Interactive (Completion Action) |
| +- Pipeline completion report with deliverables listing |
| +- Interactive completion choice (Archive/Keep/Export) |
| +- Final aggregation / report |
| |
| Phase 4: Results Aggregation |
| +- Export final results.csv |
| +- Generate context.md with all findings |
| +- Display summary: completed/failed/skipped per wave |
| +- Offer: view results | retry failed | done |
| |
+-------------------------------------------------------------------+exec_mode| exec_mode | Mechanism | Criteria |
|---|---|---|
| | One-shot, structured I/O, no multi-round interaction |
| | Multi-round, revision cycles, user approval |
| Task Property | Classification |
|---|---|
| Design system research (researcher) | |
| Token system design (designer) | |
| Component specification (designer) | |
| 5-dimension audit (reviewer) | |
| Token/component implementation (implementer) | |
| GC loop fix revision (designer) | |
| GC loop escalation (user decision on audit failure) | |
| Pipeline completion action | |
id,title,description,role,pipeline_mode,scope,audit_type,deps,context_from,exec_mode,wave,status,findings,artifacts_produced,audit_score,audit_signal,error
"RESEARCH-001","Design system analysis","PURPOSE: Analyze existing design system...","researcher","component","full","","","","csv-wave","1","pending","","","","",""
"DESIGN-001","Design tokens + component spec","PURPOSE: Define design tokens...","designer","component","tokens","","RESEARCH-001","RESEARCH-001","csv-wave","2","pending","","","","",""
"AUDIT-001","Design audit","PURPOSE: 5-dimension quality audit...","reviewer","component","full","token-audit","DESIGN-001","DESIGN-001","csv-wave","3","pending","","","","",""| Column | Phase | Description |
|---|---|---|
| Input | Unique task identifier (PREFIX-NNN: RESEARCH, DESIGN, AUDIT, BUILD) |
| Input | Short task title |
| Input | Detailed task description with PURPOSE/TASK/CONTEXT/EXPECTED/CONSTRAINTS |
| Input | Role name: |
| Input | Pipeline: |
| Input | Task scope: |
| Input | Audit type: |
| Input | Semicolon-separated dependency task IDs |
| Input | Semicolon-separated task IDs whose findings this task needs |
| Input | |
| Computed | Wave number (computed by topological sort, 1-based) |
| Output | |
| Output | Key discoveries or implementation notes (max 500 chars) |
| Output | Semicolon-separated paths of produced artifacts |
| Output | Audit weighted score (0-10, empty for non-reviewer tasks) |
| Output | Audit signal: |
| Output | Error message if failed (empty if success) |
wave-{N}.csvprev_context| Agent | Role File | Pattern | Responsibility | Position |
|---|---|---|---|---|
| GC Loop Handler | agents/gc-loop-handler.md | 2.3 (send_input cycle) | Handle audit GC loop escalation decisions | post-wave |
| Completion Handler | agents/completion-handler.md | 2.3 (send_input cycle) | Handle pipeline completion action (Archive/Keep/Export) | standalone |
COMPACT PROTECTION: Agent files are execution documents. When context compression occurs, you MUST immediatelythe corresponding agent.md to reload.Read
| File | Purpose | Lifecycle |
|---|---|---|
| Master state -- all tasks with status/findings | Updated after each wave |
| Per-wave input (temporary, csv-wave tasks only) | Created before wave, deleted after |
| Final export of all task results | Created in Phase 4 |
| Shared exploration board (all agents, both modes) | Append-only, carries across waves |
| Human-readable execution report | Created in Phase 4 |
| Phase 0/1 output: scope, pipeline, industry | Created in Phase 1 |
| Per-role instruction templates for CSV agents | Created in Phase 1 |
| All deliverables: research, design, audit, build artifacts | Created by agents |
| Results from interactive tasks | Created per interactive task |
.workflow/.csv-wave/{session-id}/
+-- tasks.csv # Master state (all tasks, both modes)
+-- results.csv # Final results export
+-- discoveries.ndjson # Shared discovery board (all agents)
+-- context.md # Human-readable report
+-- task-analysis.json # Phase 1 analysis output
+-- wave-{N}.csv # Temporary per-wave input (csv-wave only)
+-- role-instructions/ # Per-role instruction templates
| +-- researcher.md
| +-- designer.md
| +-- reviewer.md
| +-- implementer.md
+-- artifacts/ # All deliverables
| +-- research/
| | +-- design-system-analysis.json
| | +-- component-inventory.json
| | +-- accessibility-audit.json
| | +-- design-intelligence.json
| +-- design/
| | +-- design-tokens.json
| | +-- component-specs/
| | +-- layout-specs/
| +-- audit/
| | +-- audit-001.md
| +-- build/
| +-- token-files/
| +-- component-files/
+-- interactive/ # Interactive task artifacts
| +-- {id}-result.json
+-- wisdom/ # Cross-task knowledge
+-- learnings.md
+-- decisions.mdconst getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()
const AUTO_YES = $ARGUMENTS.includes('--yes') || $ARGUMENTS.includes('-y')
const continueMode = $ARGUMENTS.includes('--continue')
const concurrencyMatch = $ARGUMENTS.match(/(?:--concurrency|-c)\s+(\d+)/)
const maxConcurrency = concurrencyMatch ? parseInt(concurrencyMatch[1]) : 3
const requirement = $ARGUMENTS
.replace(/--yes|-y|--continue|--concurrency\s+\d+|-c\s+\d+/g, '')
.trim()
const slug = requirement.toLowerCase()
.replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-')
.substring(0, 40)
const dateStr = getUtc8ISOString().substring(0, 10).replace(/-/g, '')
const sessionId = `uds-${slug}-${dateStr}`
const sessionFolder = `.workflow/.csv-wave/${sessionId}`
Bash(`mkdir -p ${sessionFolder}/artifacts/research ${sessionFolder}/artifacts/design/component-specs ${sessionFolder}/artifacts/design/layout-specs ${sessionFolder}/artifacts/audit ${sessionFolder}/artifacts/build/token-files ${sessionFolder}/artifacts/build/component-files ${sessionFolder}/role-instructions ${sessionFolder}/interactive ${sessionFolder}/wisdom`)
Write(`${sessionFolder}/discoveries.ndjson`, '')
Write(`${sessionFolder}/wisdom/learnings.md`, '# Learnings\n')
Write(`${sessionFolder}/wisdom/decisions.md`, '# Decisions\n').workflow/.csv-wave/uds-*/tasks.csv--continue| Option | Pipeline | Task Count |
|---|---|---|
| Single component | component | 4 tasks (linear) |
| Component system | system | 7 tasks (dual-track parallel) |
| Full design system | full-system | 8 tasks (dual-track + final audit) |
| Option | Strictness |
|---|---|
| SaaS/Tech | standard |
| E-commerce/Retail | standard |
| Healthcare/Finance | strict (extra accessibility) |
| Education/Content | standard |
| Other | standard |
| Signal | Keywords | Pipeline Hint |
|---|---|---|
| Component | component, button, card, input, modal | component |
| System | design system, token, theme, multiple components | system |
| Full | complete, full, all components, redesign | full-system |
| Accessibility | accessibility, a11y, wcag | component or system |
| Factor | Points |
|---|---|
| Single component | +1 |
| Component system | +2 |
| Full design system | +3 |
| Accessibility required | +1 |
| Multiple industries/constraints | +1 |
| Keywords | Industry |
|---|---|
| saas, dashboard, analytics | SaaS/Tech |
| shop, cart, checkout | E-commerce |
| medical, patient, healthcare | Healthcare |
| bank, finance, payment | Finance |
| edu, course, learning | Education/Content |
| Default | SaaS/Tech |
| Scope | Pipeline | Tasks |
|---|---|---|
| component | RESEARCH-001 -> DESIGN-001 -> AUDIT-001 -> BUILD-001 | 4 |
| system | RESEARCH-001 -> DESIGN-001 -> AUDIT-001 -> [DESIGN-002 + BUILD-001] -> AUDIT-002 -> BUILD-002 | 7 |
| full-system | system chain + AUDIT-003 after BUILD-002 | 8 |
role-instructions/{role}.md| Task Property | exec_mode |
|---|---|
| Research analysis pass (researcher) | |
| Token design pass (designer) | |
| Component spec pass (designer) | |
| Audit pass (reviewer) | |
| Implementation pass (implementer) | |
| GC fix revision (designer) | |
| All standard pipeline tasks | |
// Generate per-role instruction templates
for (const role of ['researcher', 'designer', 'reviewer', 'implementer']) {
const instruction = generateRoleInstruction(role, sessionFolder)
Write(`${sessionFolder}/role-instructions/${role}.md`, instruction)
}
// Generate tasks.csv from pipeline definition
const tasks = buildTasksCsv(pipelineMode, requirement, sessionFolder, industry, constraints)
Write(`${sessionFolder}/tasks.csv`, toCsv(tasks))
Write(`${sessionFolder}/task-analysis.json`, JSON.stringify(analysisResult, null, 2))const masterCsv = Read(`${sessionFolder}/tasks.csv`)
let tasks = parseCsv(masterCsv)
const maxWave = Math.max(...tasks.map(t => t.wave))
let gcRound = 0
const MAX_GC_ROUNDS = 2
for (let wave = 1; wave <= maxWave; wave++) {
console.log(`\nWave ${wave}/${maxWave}`)
// 1. Separate tasks by exec_mode
const waveTasks = tasks.filter(t => t.wave === wave && t.status === 'pending')
const csvTasks = waveTasks.filter(t => t.exec_mode === 'csv-wave')
const interactiveTasks = waveTasks.filter(t => t.exec_mode === 'interactive')
// 2. Check dependencies -- skip tasks whose deps failed
for (const task of waveTasks) {
const depIds = (task.deps || '').split(';').filter(Boolean)
const depStatuses = depIds.map(id => tasks.find(t => t.id === id)?.status)
if (depStatuses.some(s => s === 'failed' || s === 'skipped')) {
task.status = 'skipped'
task.error = `Dependency failed: ${depIds.filter((id, i) =>
['failed','skipped'].includes(depStatuses[i])).join(', ')}`
}
}
// 3. Execute pre-wave interactive tasks (if any)
const preWaveInteractive = interactiveTasks.filter(t => t.status === 'pending')
for (const task of preWaveInteractive) {
Read(`agents/gc-loop-handler.md`)
const agent = spawn_agent({
message: `## TASK ASSIGNMENT\n\n### MANDATORY FIRST STEPS\n1. Read: agents/gc-loop-handler.md\n2. Read: ${sessionFolder}/discoveries.ndjson\n\nGoal: ${task.description}\nScope: ${task.title}\nSession: ${sessionFolder}\n\n### Previous Context\n${buildPrevContext(task, tasks)}`
})
const result = wait({ ids: [agent], timeout_ms: 600000 })
if (result.timed_out) {
send_input({ id: agent, message: "Please finalize and output current findings." })
wait({ ids: [agent], timeout_ms: 120000 })
}
Write(`${sessionFolder}/interactive/${task.id}-result.json`, JSON.stringify({
task_id: task.id, status: "completed", findings: parseFindings(result),
timestamp: getUtc8ISOString()
}))
close_agent({ id: agent })
task.status = 'completed'
task.findings = parseFindings(result)
}
// 4. Build prev_context for csv-wave tasks
const pendingCsvTasks = csvTasks.filter(t => t.status === 'pending')
for (const task of pendingCsvTasks) {
task.prev_context = buildPrevContext(task, tasks)
}
if (pendingCsvTasks.length > 0) {
// 5. Write wave CSV
Write(`${sessionFolder}/wave-${wave}.csv`, toCsv(pendingCsvTasks))
// 6. Build instruction per role group
const waveInstruction = buildWaveInstruction(pendingCsvTasks, sessionFolder, wave)
// 7. Execute wave via spawn_agents_on_csv
spawn_agents_on_csv({
csv_path: `${sessionFolder}/wave-${wave}.csv`,
id_column: "id",
instruction: waveInstruction,
max_concurrency: maxConcurrency,
max_runtime_seconds: 900,
output_csv_path: `${sessionFolder}/wave-${wave}-results.csv`,
output_schema: {
type: "object",
properties: {
id: { type: "string" },
status: { type: "string", enum: ["completed", "failed"] },
findings: { type: "string" },
artifacts_produced: { type: "string" },
audit_score: { type: "string" },
audit_signal: { type: "string" },
error: { type: "string" }
}
}
})
// 8. Merge results into master CSV
const results = parseCsv(Read(`${sessionFolder}/wave-${wave}-results.csv`))
for (const r of results) {
const t = tasks.find(t => t.id === r.id)
if (t) Object.assign(t, r)
}
// 9. GC Loop Check: if a reviewer task returned fix_required
const auditResults = results.filter(r => r.id.startsWith('AUDIT') && r.audit_signal === 'fix_required')
for (const ar of auditResults) {
if (gcRound < MAX_GC_ROUNDS) {
gcRound++
const fixId = `DESIGN-fix-${gcRound}`
const recheckId = `AUDIT-recheck-${gcRound}`
tasks.push({
id: fixId, title: `Fix audit issues (round ${gcRound})`,
description: `PURPOSE: Address audit feedback from ${ar.id} | Success: All critical/high issues resolved\nTASK:\n- Parse audit feedback for specific issues\n- Apply targeted fixes to design tokens/specs\n- Re-validate affected artifacts\nCONTEXT:\n- Session: ${sessionFolder}\n- Upstream: artifacts/audit/\nEXPECTED: Fixed design artifacts\nCONSTRAINTS: Targeted fixes only`,
role: 'designer', pipeline_mode: tasks[0].pipeline_mode, scope: 'full',
audit_type: '', deps: ar.id, context_from: ar.id,
exec_mode: 'csv-wave', wave: wave + 1, status: 'pending',
findings: '', artifacts_produced: '', audit_score: '', audit_signal: '', error: ''
})
tasks.push({
id: recheckId, title: `Audit recheck (round ${gcRound})`,
description: `PURPOSE: Re-audit after fixes | Success: Score >= 8, critical == 0\nTASK:\n- Execute 5-dimension audit on fixed artifacts\n- Focus on previously flagged issues\nCONTEXT:\n- Session: ${sessionFolder}\n- Audit type: token-audit\nEXPECTED: artifacts/audit/audit-recheck-${gcRound}.md`,
role: 'reviewer', pipeline_mode: tasks[0].pipeline_mode, scope: 'full',
audit_type: 'token-audit', deps: fixId, context_from: fixId,
exec_mode: 'csv-wave', wave: wave + 2, status: 'pending',
findings: '', artifacts_produced: '', audit_score: '', audit_signal: '', error: ''
})
}
}
}
// 10. Update master CSV
Write(`${sessionFolder}/tasks.csv`, toCsv(tasks))
// 11. Cleanup temp files
Bash(`rm -f ${sessionFolder}/wave-${wave}.csv ${sessionFolder}/wave-${wave}-results.csv`)
// 12. Display wave summary
const completed = waveTasks.filter(t => t.status === 'completed').length
const failed = waveTasks.filter(t => t.status === 'failed').length
const skipped = waveTasks.filter(t => t.status === 'skipped').length
console.log(`Wave ${wave} Complete: ${completed} completed, ${failed} failed, ${skipped} skipped`)
}const tasks = parseCsv(Read(`${sessionFolder}/tasks.csv`))
const completed = tasks.filter(t => t.status === 'completed')
const failed = tasks.filter(t => t.status === 'failed')
const deliverables = [
{ name: "Design System Analysis", path: `${sessionFolder}/artifacts/research/design-system-analysis.json` },
{ name: "Component Inventory", path: `${sessionFolder}/artifacts/research/component-inventory.json` },
{ name: "Accessibility Audit", path: `${sessionFolder}/artifacts/research/accessibility-audit.json` },
{ name: "Design Intelligence", path: `${sessionFolder}/artifacts/research/design-intelligence.json` },
{ name: "Design Tokens", path: `${sessionFolder}/artifacts/design/design-tokens.json` },
{ name: "Component Specs", path: `${sessionFolder}/artifacts/design/component-specs/` },
{ name: "Audit Reports", path: `${sessionFolder}/artifacts/audit/` },
{ name: "Token Files", path: `${sessionFolder}/artifacts/build/token-files/` },
{ name: "Component Files", path: `${sessionFolder}/artifacts/build/component-files/` }
]
console.log(`
============================================
UI DESIGN TEAM COMPLETE
Pipeline: ${completed.length}/${tasks.length} tasks (${tasks[0]?.pipeline_mode} mode)
GC Rounds: ${gcRound}/${MAX_GC_ROUNDS}
Session: ${sessionFolder}
Deliverables:
${deliverables.map(d => ` - ${d.name}: ${d.path}`).join('\n')}
============================================
`)
if (!AUTO_YES) {
// Spawn completion handler interactive agent
Read(`agents/completion-handler.md`)
const agent = spawn_agent({
message: `## TASK ASSIGNMENT\n\n### MANDATORY FIRST STEPS\n1. Read: agents/completion-handler.md\n2. Read: ${sessionFolder}/tasks.csv\n\nGoal: Handle pipeline completion action\nSession: ${sessionFolder}\nDeliverables: ${JSON.stringify(deliverables)}`
})
const result = wait({ ids: [agent], timeout_ms: 300000 })
close_agent({ id: agent })
}Bash(`cp ${sessionFolder}/tasks.csv ${sessionFolder}/results.csv`)
const tasks = parseCsv(Read(`${sessionFolder}/tasks.csv`))
let contextMd = `# UI Design Report\n\n`
contextMd += `**Session**: ${sessionId}\n`
contextMd += `**Pipeline**: ${tasks[0]?.pipeline_mode} mode\n`
contextMd += `**Date**: ${getUtc8ISOString().substring(0, 10)}\n\n`
contextMd += `## Summary\n`
contextMd += `| Status | Count |\n|--------|-------|\n`
contextMd += `| Completed | ${tasks.filter(t => t.status === 'completed').length} |\n`
contextMd += `| Failed | ${tasks.filter(t => t.status === 'failed').length} |\n`
contextMd += `| Skipped | ${tasks.filter(t => t.status === 'skipped').length} |\n\n`
const maxWave = Math.max(...tasks.map(t => t.wave))
contextMd += `## Wave Execution\n\n`
for (let w = 1; w <= maxWave; w++) {
const waveTasks = tasks.filter(t => t.wave === w)
contextMd += `### Wave ${w}\n\n`
for (const t of waveTasks) {
const icon = t.status === 'completed' ? '[DONE]' : t.status === 'failed' ? '[FAIL]' : '[SKIP]'
contextMd += `${icon} **${t.title}** [${t.role}]`
if (t.audit_score) contextMd += ` Score: ${t.audit_score}/10 (${t.audit_signal})`
contextMd += ` ${t.findings || ''}\n\n`
}
}
contextMd += `## Audit Summary\n\n`
const auditResults = tasks.filter(t => t.role === 'reviewer' && t.audit_score)
for (const a of auditResults) {
contextMd += `- **${a.id}**: Score ${a.audit_score}/10 - ${a.audit_signal}\n`
}
contextMd += `\n## GC Loop Summary\n`
contextMd += `- Rounds used: ${gcRound}/${MAX_GC_ROUNDS}\n`
Write(`${sessionFolder}/context.md`, contextMd)
console.log(`Results exported to: ${sessionFolder}/results.csv`)
console.log(`Report generated at: ${sessionFolder}/context.md`)discoveries.ndjson{"ts":"2026-03-08T10:00:00Z","worker":"RESEARCH-001","type":"tech_stack_detected","data":{"stack":"react","framework":"nextjs","ui_lib":"shadcn"}}
{"ts":"2026-03-08T10:05:00Z","worker":"DESIGN-001","type":"token_generated","data":{"category":"color","count":24,"supports_dark_mode":true}}
{"ts":"2026-03-08T10:10:00Z","worker":"BUILD-001","type":"file_modified","data":{"file":"tokens.css","change":"Generated CSS custom properties","lines_added":85}}
{"ts":"2026-03-08T10:15:00Z","worker":"AUDIT-001","type":"issue_found","data":{"file":"design-tokens.json","line":0,"severity":"high","description":"Missing dark mode variant for semantic color tokens"}}| Type | Data Schema | Description |
|---|---|---|
| | Tech stack identified by researcher |
| | Existing design pattern in codebase |
| | Design token category created |
| | File change recorded |
| | Audit issue discovered |
| | Design anti-pattern detected |
| | Deliverable created |
{type, data.file}RESEARCH-001 --> DESIGN-001 --> AUDIT-001 --> BUILD-001
[researcher] [designer] [reviewer] [implementer]
wave 1 wave 2 wave 3 wave 4RESEARCH-001 --> DESIGN-001 --> AUDIT-001 --> DESIGN-002 --+
[researcher] [designer] [reviewer] [designer] |
BUILD-001 --+--> AUDIT-002 --> BUILD-002
[implementer] [reviewer] [implementer]
wave 1 wave 2 wave 3 wave 4 wave 5 wave 6Same as System + AUDIT-003 after BUILD-002
BUILD-002 --> AUDIT-003
[reviewer: final-audit]
wave 6 wave 7designer (Generator) -> design artifacts -> reviewer (Critic)
<- audit feedback <-
(max 2 rounds)
Convergence: audit.score >= 8 AND audit.critical_count === 0| Error | Resolution |
|---|---|
| Circular dependency | Detect in wave computation, abort with error message |
| CSV agent timeout | Mark as failed in results, continue with wave |
| CSV agent failed | Mark as failed, skip dependent tasks in later waves |
| Interactive agent timeout | Urge convergence via send_input, then close if still timed out |
| Interactive agent failed | Mark as failed, skip dependents |
| All agents in wave failed | Log error, offer retry or abort |
| CSV parse error | Validate CSV format before execution, show line number |
| discoveries.ndjson corrupt | Ignore malformed lines, continue with valid entries |
| Audit score < 6 over 2 GC rounds | Escalate to user for manual intervention |
| ui-ux-pro-max unavailable | Degrade to LLM general design knowledge |
| Task description too vague | AskUserQuestion for clarification in Phase 0 |
| Continue mode: no session found | List available sessions, prompt user to select |
wait()send_input()send_input({ id: agent_id, message: "Please provide status update or clarify blockers" })