Iago
Skill drakulavich/iago/iago
π¦ Greptile-style Mermaid diagrams for AI code reviews β drawn by your own agent. A Claude Code / Codex / Copilot / Gemini skill; run /iago after /review.
npx -y skills add drakulavich/iago --skill iagoAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Append a Mermaid diagram (sequence, flow, class, or entity-relation) to a GitHub PR's existing /review comment. Like Iago the parrot from Aladdin, this skill loudly squawks a visual summary on top of an existing review. Also triggered by /squawk. Use after the /review skill finishes, or when the user asks to add/append a diagram to a pull request review, or says "squawk". Auto-detects the most useful diagram type from the diff; accepts an explicit override.
SKILL.md
8.3 KB, as published. Nobody here has run it
PR Diagrams β append Mermaid diagrams to /review output
You generate ONE Mermaid diagram that visualizes the most important change in a
pull request and append it to the existing /review comment on that PR (so the
diagram lives next to the rest of the review, not as a separate comment).
GitHub and GitLab natively render fenced ```mermaid code blocks, so no
external service is needed.
Inputs
Parse $ARGUMENTS permissively:
- PR number β first integer-looking token. If absent, derive it:
gh pr view --json number -q .number(current branch).- If that fails, fall back to
gh pr list --head "$(git rev-parse --abbrev-ref HEAD)" --json number -q '.[0].number'. - If still unknown, ask the user.
- Type override β one of:
sequence,flow,class,er(aliases:flowchartβflow,entity-relation/entity/erdβer). If absent, auto-detect (see below). - Mode β
--mode=append(default) or--mode=comment.appendedits the existing /review comment;commentposts a new standalone comment. If no /review comment is found inappendmode, fall back tocommentand tell the user.
Workflow
-
Resolve the PR.
PR=<number>from arguments or detection above.REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner).
-
Gather context. Run in parallel where possible:
gh pr view "$PR" --json title,body,files,baseRefName,headRefName,additions,deletionsgh pr diff "$PR"(capture full diff; if it exceeds ~150 KB, fall back togh pr diff "$PR" --name-onlyplus targetedgit diffper file).- List changed files; classify each by extension and path.
-
Pick the diagram type (skip if user passed an override):
Apply these rules in order β first match wins. See
references/diagram-selection.mdfor the full rubric and tie-breakers.Signal in the diff Type Migration files, schema/model changes, *.sql,*.prisma,models/*.py, ORM entity fileserNew/changed classes, inheritance, interfaces, traits across β₯2 OO files classCross-service calls, new HTTP/RPC handlers, queue producers/consumers, multi-component request flow sequenceControl-flow / business-logic changes inside one component, new conditionals, state machines flowTrivial change (docs-only, single-line fix, dependency bump, formatting) none β abort with a friendly note, do not post -
Build the Mermaid block.
Follow
references/mermaid-templates.mdfor syntax patterns. Hard rules:- Use exactly one fenced block:
```mermaidβ¦```. - Keep it under ~40 nodes / ~60 edges. If the change is bigger, abstract β group by module/service, not by individual function.
- Use real names from the diff (functions, classes, services, tables) β never placeholders like
ServiceA. - For
sequence: label arrows with the actual method/endpoint, mark async with-), sync with->>. - For
flow: preferflowchart TD; use{}for decisions,[]for steps,[[ ]]for subroutines. - Never start an unquoted node label with
@. Mermaid parses[@as its edge-ID/shape syntax, soN[@utils/utils -> x]fails the whole diagram. Wrap the label in double quotes:N["@utils/utils -> x"]. (@in the middle of a label is fine.) - For
class: include only classes touched by the diff plus their direct collaborators; show new members with+and removed with-. - For
er: only include tables/entities touched by the migration plus their FK neighbors. - No HTML, no inline styles unless necessary for readability. No emoji in node labels.
- Never put
;inside asequenceDiagrammessage label. GitHub's Mermaid parser treats;as a statement separator inside sequence diagrams, soBoot-->>User: printUsage(); exit 0is split into two statements and the trailing half breaks the diagram. Use,or split into two messages. This is the most common rendering failure in this skill β re-read your generated block and replace any;with,in message labels before continuing.
- Use exactly one fenced block:
-
Wrap it. Produce this exact block (the markers let later runs find and replace it idempotently):
<!-- iago:end --><!-- iago:begin --> ### πΊοΈ Change diagram β <type> _Auto-generated by [iago](https://github.com/drakulavich/iago). Edit or remove this block; it will be replaced on the next run._ ```mermaid <diagram body> -
Append (or replace) in the /review comment.
You MUST use the helper script. Do NOT call
gh pr comment,gh api -X PATCH .../comments/..., or any other direct GitHub write yourself for the diagram. The script is the only sanctioned write path: it locates the right comment, idempotently replaces any prior iago block, handles new-comment fallback, and runs a deterministic Mermaid sanitizer that catches model mistakes (e.g. stray;in sequence message labels) before posting. Bypassing it means the diagram ships unchecked and is the #1 source of broken renders.The helper lives at
scripts/post.tsin this skill's own directory (run withbun). Different runtimes expose that directory differently β${CLAUDE_SKILL_DIR}in Claude Code,${OPENCODE_SKILL_DIR}in OpenCode, etc. Pick the one your runtime sets, or resolve it from the path of thisSKILL.mdfile (typically~/.claude/skills/iago/,~/.agents/skills/iago/, or~/.config/opencode/skills/iago/).Required tools: bun + gh (GitHub CLI, authenticated).
# Pick the env var your runtime sets, or substitute the absolute path: SKILL_DIR="${CLAUDE_SKILL_DIR:-${OPENCODE_SKILL_DIR:-$(dirname "$0")}}" bun run "$SKILL_DIR/scripts/post.ts" \ --repo "$REPO" \ --pr "$PR" \ --mode "$MODE" \ --diagram-file "$DIAGRAM_FILE"Where
$DIAGRAM_FILEis a temp file you wrote in step 5 containing the full wrapped block. The script:- Locates the most recent comment authored by the /review skill (matched via the marker
<!-- review-skill -->, falling back to the most recent comment authored by the current user that contains the heading## Reviewor# Review). - If found and
--mode=append: updates that comment viagh api -X PATCH /repos/{owner}/{repo}/issues/comments/{id}. Replaces any prioriago:begin/endblock in place; otherwise appends the new block to the bottom. - If not found, or
--mode=comment: posts a new comment viagh pr comment. - Prints the URL of the updated/created comment.
- Locates the most recent comment authored by the /review skill (matched via the marker
-
Report back. In your final message:
- State the chosen type and why (one sentence).
- Include the comment URL.
- If you abstained (trivial PR), say so.
Behavioral guardrails
- Never open a new PR, push commits, or modify code. This skill is read-only against the repo and write-only against PR comments.
- Never post more than one
iagoblock per PR β always replace the previous one. - If
ghis not authenticated (gh auth statusfails), stop and tell the user. - If the diff is empty, stop and tell the user β there is nothing to diagram.
- If the user says "no diagram needed" or the PR is labeled
skip-diagram/no-diagram, stop without posting.
Examples
See examples/ for sample outputs across all four diagram types.