Add designer + design-reviewer agent types (UI/UX mockups) #56
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/claude-hooks#56
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
User story
As a maintainer, I want two new agent types —
designeranddesign-reviewer— routed byarea:design, so that UI/UX mockup tickets (like #55) land through a dedicated agent pair that can drive Penpot end-to-end and catch obvious visual defects, without a human driving the session.Context
#55 was delivered interactively from Claude Desktop with Penpot MCP + Forge MCP + a chunk of Authelia auth plumbing. That's not a repeatable pipeline — the design workflow needs to become an agent type with a containerised MCP loadout, the same way
dev/boss/reviewerhave pre-baked skills.Model decisions (resolves the review chat on #55):
designerdefault model:claude-opus-4-7. Layout math, MCP quirks (frame-fill bug, parallel-write coordination), and design-system reasoning are past Sonnet's reliability. Downgrade to Sonnet only per-instance, via the dashboard, for simple one-frame tweaks.design-reviewerdefault model:claude-sonnet-4-6. Multimodal pattern-matching on exported frame PNGs (overflow / contrast / alignment / poor positioning) is high-recall review work, not synthesis. Sonnet is the cost/quality sweet spot.Acceptance criteria
Config —
config/agents.jsondesignerentry:forgejo_user: designer,model: claude-opus-4-7,branch_prefix: designer, system prompt explaining it produces Penpot mockups and handoff comments, container enabled with theclaude-hooks:devimage.design-reviewerentry:forgejo_user: design-reviewer,model: claude-sonnet-4-6, system prompt for visual defect review, container enabled.designeranddesign-reviewercreated on the instance; tokens issued to~/.config/claude-hooks/tokens/{designer,design-reviewer}; added to the repos they should access.boss/dev/reviewerhave them (per theforgejo_gpg_homememory — keyring must live at/var/lib/forgejo/data/home/.gnupg/).MCP bindings — container image
designercontainer embeds Forge MCP (already baked) + Penpot MCP (new binding).design-reviewercontainer embeds the same two MCPs (reviewer needs Forge for posting comments + Penpot forexport_frame_pngand for reading file structure).~/.config/claude-hooks/penpot-creds,~/.config/claude-hooks/authelia-creds,~/.config/claude-hooks/penpot-cookie.login-with-passworddisabled (OIDC-only) and access tokens off. The stockpenpot-mcp-servercrashes on startup because it tries login-with-password and getscode: login-disabled. The patched build at~/Workspace/penpot-mcp-server/addsAUTHELIA_BASIC_AUTH(Authelia proxy-auth) +PENPOT_AUTH_TOKEN_COOKIE(pre-seeded OIDC session cookie, bypasses login) + DB→RPC fallback inservices/changes.py::get_file_info. These patches must be upstreamed or baked intoclaude-hooks:devbefore this ticket closes, otherwise the designer/reviewer containers will crash-loop.dev/boss/reviewercontainers do not embed Penpot MCP — cost and attack-surface aren't worth it for code-only agents.Skills
New skills, living under
src/skills/:design-breakdown(designer) — reads a spec ticket; proposes per-screen scope; optionally creates the Penpot file skeleton and sub-stories. Mirrors the existingbreakdownskill, but outputs are Penpot artifacts + design user stories, not code tickets.design-implement(designer) — reads the ticket's AC, creates the Penpot pages/frames/shapes, posts a handoff comment matching the shape of #55 (comment) (deep-link, per-page table, token CSS, decisions-that-deviated list).design-address-review(designer) — reads review comments fromdesign-reviewer, applies fixes to the Penpot file, re-posts.design-review(design-reviewer) — exports each frame via Penpotexport_frame_png, inspects visually, posts a comment with findings grouped by category:overflow,contrast,alignment,typography,UX,suggestion. Each finding cites the frame name + approximate coordinates.implement/review/address-review/rebase/merge/fix-ci/breakdownskills stay unchanged;dev/boss/reviewerdo not gain design skills.Label routing
area:design(suggested color#ec4899magenta to differentiate fromarea:dashboardpurple; description: "UI/UX mockup work — routes to designer agent").area:design→ dispatch todesigner(notdev/boss). PR opened bydesigner→ dispatch todesign-reviewer(notreviewer).area:designkeep routing as today.src/webhook.ts(or wherever label-based dispatch lives) to look up the type by label before falling through to the default type mapping.Tests
area:designissues todesigner; routesdesigner-authored PRs todesign-reviewer.area:designissue → designer creates a Penpot file + posts handoff comment → design-reviewer posts review comment → designer applies fixes. End-to-end happy path on a disposable ticket.area:webhookissue → still goes todev/bossper existing rules (no regression).Documentation
CLAUDE.mdRoles table: adddesigneranddesign-reviewerrows.CLAUDE.md: one paragraph on Penpot MCP auth gotcha (OIDC-only → cookie + Authelia-basic).README.md: one-liner on the new agent types +area:designrouting.Out of scope
agents.json.penpot-mcp-serverrepo — we bake into our own image for now; upstreaming is a separate effort.References
/agentsmockups. The skills here should reproduce that workflow agentically.design-implementskill should emit: #55 (comment)~/.claude/projects/.../memory/):agents.md(roles),sdk_config_isolation.md(CLAUDE_CONFIG_DIR trap),mcp_merge_bug.md(forgejo-mcp patch pattern),forgejo_gpg_home.md(signing keyring location).~/Workspace/penpot-mcp-server/(three patches landed during #55, seesrc/penpot_mcp/{config.py,services/api.py,services/changes.py}).Dependencies
main. Can run in parallel with A1–A6 on the milestone.main.Suggested breakdown (for
boss)Substories roughly sized to one PR each:
claude-hooks:dev— includesAUTHELIA_BASIC_AUTH,PENPOT_AUTH_TOKEN_COOKIE,get_file_infoRPC fallback.area:design→designer; create the label; update tests.design-implement+design-review— core pipeline, enough for the happy path smoke test.design-breakdown+design-address-review— completes the loop.CLAUDE.md,README.md.claude loginwithout container restart) #57designer+design-reviewercontainers #64area:design-reviewlabel, not just designer-authored PRs #82