dalbom/rev2agent/tree/main/.claude/skills/reviewer2
reviewer2
각 답변 뒤 프롬프트 위 말풍선에 Reviewer 2의 한 줄 코멘트를 띄우고 모델이 고른 아바타를 함께 보여 주는 Claude Code skills-directory 플러그인입니다.
이 mod 소개
reviewer2는 세션의 기본 작업 디렉터리 .claude/skills/reviewer2/에서 <name>@skills-dir로 로드되는 Claude Code 모드입니다. Rev2Agent 루트에서 세션을 열면 각 주 루프 답변 뒤 작은 모델을 호출해 Reviewer 2의 한 줄 코멘트를 만들고, 모델이 고른 아바타와 함께 프롬프트 위 말풍선에 표시합니다. 훅은 turn.start에서 말풍선을 지우고 turn.complete에서 백그라운드 모델 호출을 시작합니다. 서브에이전트 턴, 중단, 거부, 오류에는 코멘트를 붙이지 않습니다. 모델 호출은 $.model.complete를 사용하고 effort는 low, 출력은 300 token, 제한 시간은 30s, 동시 실행은 최대 2개입니다. 답변 첫 줄에는 대괄호 안에 아바타 이름([skeptical])이 들어갑니다. SKIP이면 아무것도 표시하지 않고, 알 수 없는 id는 매니페스트 기본값으로 대체합니다. 말풍선은 세션별로 $.store에 저장되며(최근 20개 세션 유지)대화에는 추가되지 않습니다. .claude-plugin/plugin.json의 userConfig에서 enabled와 model(sonnet 또는 haiku)에 대한 /config 행을 설정할 수 있고, 명령은 /reviewer2, /reviewer2 status, /reviewer2 on|off, /reviewer2 again입니다. 파일은 hooks/register.ts(이벤트 연결, 명령, 저장), hooks/bubble.ts(payload, 답변 파싱, 아바타 목록, SVG, 저장 인덱스), prompts/system.txt, avatars/(128px 원형 PNG와 manifest.json), tests/이며 Claude Code 2.1.287 이상이 필요합니다.
설치
먼저 작성자의 README에서 marketplace와 플러그인 이름을 확인하세요. 저장소 구조에 따라 명령어가 달라질 수 있습니다.
claude plugin marketplace add dalbom/rev2agent claude plugin install reviewer2
원문 / README
reviewer2
A Claude Code mod. In a session opened at a Rev2Agent checkout's root, after each main-loop answer it asks a small model for Reviewer 2's one-line aside and shows it in a speech bubble above the prompt, beside an avatar the model picks for the line. User-facing notes are in the repository README under "Reviewer 2 bubble".
How it is loaded
The folder is a skills-directory plugin: Claude Code loads .claude/skills/<name>/ of the session's primary working directory as <name>@skills-dir once the folder is trusted. So the mod runs only for sessions opened at the repository root, and nobody installs it. As a second guard, hooks/register.ts serves a session only when its project root has prompts/agent_workflow.md and prompts/conventions.md.
Mods need Claude Code 2.1.287 or later. Older builds skip the hooks module.
Behaviour
turn.startkeeps the prompt and takes the bubble down.turn.completestarts the model call in the background and returns at once. Subagent turns, interruptions, refusals and errors get no aside.- The model call is
$.model.completeon the session's own client: themodeloption (sonnet by default), effortlow, 300 output tokens, 30 s timeout. At most two run at once. - The reply's first line names an avatar in brackets (
[skeptical]); the rest is the aside.SKIPshows nothing. An unknown id falls back to the manifest's default. - While the model drafts, the band shows the
thinkingavatar with…(terminal: a dim line). Nothing shows while the assistant is working. - The bubble is saved per session in
$.store, so a resume or a reload shows it again until the next prompt. The 20 most recent sessions are kept. - The aside is drawn only. It never enters the conversation.
Settings and commands
userConfig in .claude-plugin/plugin.json gives two /config rows:
| Option | Default | |
| --- | --- | --- |
| enabled | true | Draft an aside after each answer |
| model | sonnet | sonnet or haiku |
/reviewer2 (or /reviewer2 status) shows the state and the last result. /reviewer2 on|off changes the enabled row through $.config.set, which reloads the module with the new value. /reviewer2 again drafts an aside for the last answer once more, even when off.
Files
| File | What it holds |
| --- | --- |
| hooks/register.ts | Event wiring: turns, the bubble, /reviewer2, storage |
| hooks/bubble.ts | Pure logic: payload, reply parsing, avatar catalog, SVG, storage index |
| prompts/system.txt | Reviewer 2's system prompt (the mod appends the reply format and avatar list) |
| avatars/ | 128 px round PNGs and manifest.json, exported by assets/avatars/slice_avatars.py |
| tests/ | claude plugin test suites |
Development
claude plugin validate .claude/skills/reviewer2
claude plugin test .claude/skills/reviewer2
An interactive session watches a skills-directory plugin and reloads the hooks module on save. To redraw or add avatars, generate 3x3 sheets into assets/avatars/sheets/ with the prompts in assets/avatars/PROMPTS.md (the sheets are not in git), update SHEETS in assets/avatars/slice_avatars.py, and run it; it rewrites avatars/ here.
