# Control Flow Diagrams

Draws ASCII trees of triggers, call chains, payloads and state changes.

- Repository: https://github.com/slopus/happy (24443 stars)
- Category: Engineering
- License: MIT
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add slopus/happy --skill control-flow -g -a claude-code -y`
Codex: `npx skills add slopus/happy --skill control-flow -g -a codex -y`
Cursor: `npx skills add slopus/happy --skill control-flow -g -a cursor -y`
Gemini CLI: `npx skills add slopus/happy --skill control-flow -g -a gemini-cli -y`

## Description

Analyze and design control flows and data structures. Produces compact ASCII tree diagrams showing triggers, call chains, payload shapes, state mutations, and re-render effects. Use when user asks to diagram, trace, visualize, or design a flow or data structure.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# /control-flow, Analyze and design control flows and data structures

Read the relevant source code and produce ASCII tree diagrams inside ```txt blocks.

## Format

- Each user action or IO event is a separate tree root
- Real function names and types, never invent
- Payload shapes as TypeScript types, not prose
- State mutations: which fields change, what triggers
- Re-render chain: which components and why
- Cross-package when the flow spans app → CLI → server
- Compact, skip trivial pass-throughs, show decisions

Example:

```txt
User taps "Archive"
│
├─ handleActionPress(action: SessionActionItem)
│  └─ onClose() → setActionsAnchor(null)
│
├─ sessionKill(sessionId: string)
│  ├─ POST /api/sessions/:id/kill
│  └─ → { success: boolean, message?: string }
│
└─ deleteSession(sessionId)
   ├─ mutates: sessions, sessionMessages, gitStatus, fileCache
   ├─ rebuilds: sessionListViewData
   └─ re-renders: SessionsListWrapper (data ref changed)
```

For data structures, show the shape and what depends on it:

```txt
SessionRowData (flat primitives, cheap deep-equal)
├─ id, name, subtitle, avatarId     ← identity + display
├─ state: SessionState              ← collapsed from presence + agentState + thinking
├─ hasDraft: boolean                ← collapsed from draft string
├─ activeAt?: number                ← only inactive sessions (avoids heartbeat diffs)
├─ machineId, path, homeDir         ← grouping in ActiveSessionsGroup
└─ completedTodosCount, totalTodosCount
   │
   consumed by:
   ├─ SessionItem         → renders purely from props, no store hooks
   ├─ ActiveSessionsGroup → groups by machineId + path
   └─ useDeepEqual        → 12 primitive comparisons vs full Session tree
```

## Principles

The rest: https://github.com/slopus/happy/blob/HEAD/.agents/skills/control-flow/SKILL.md
