보고서처럼 긴 답변 아래에 작은 모델이 쓴 두 줄 쉬운 요약을 붙인다

English · 한국어
A set of Claude Code mods that change the terminal UI and notifications. They are plugins with hook modules, installable one by one from this marketplace.
The UI text, notifications and summaries are written in Korean.
| Mod | What it does |
|---|---|
work-progress | Collects multi-step work from every open session into a line above the prompt and a /progress pane. Each task's steps are drawn as a chain of nodes that opens into a vertical flow. It also keeps follow-ups left after a task is done, what a paused task is waiting for, and subagent records that ended without being closed. Each open task shows the time likely left, judged from how long its own steps and your recent tasks' steps took. /progress 요약 writes a summary of the last 24 hours. |
plain-korean | A Korean readability bundle. An output style for short, plain Korean answers (conclusion first, no made-up abbreviations, nothing referred to by number alone), a guard that flags answers that slip into English and corrects the next one, a nudge to re-explain when you type "뭔 말" or "짧게", and the claude-warm theme. Installing it also installs plain-summary, turn-divider and compact-tool-rows. |
usage-band | Shows 5-hour and weekly usage and the Claude status page state in one line above the prompt. |
long-turn-notify | Sends a macOS notification and plays a voice line when a turn ran longer than 2 minutes, or when a question or permission prompt is waiting. macOS only. |
session-nickname | Gives each new session a random name so other sessions can address it with SendMessage. The name reaches the session list with the first prompt. |
turn-divider | Draws a divider above each of your prompts to separate questions from answers. |
plain-summary | Adds a two-sentence plain-language summary under long, report-style answers, written by a small model. |
compact-tool-rows | Shortens long Bash commands in tool rows to the start of the first line. |
work-progress pane:
업무 3개 · ● 작업 중 1 · □ 남은 일 1 · ✓ 오늘 완료 1
── ● 작업 중 1 ─────────────────────────────────────────────
▸ Theme builder spec
●━●━◉─○─○─○ 2/6 · 약 2시간 남음 · 이 단계 1시간째 · 5분 전 · @quiet-otter
지금: Write the requirements
최근: Bash Run the mod's tests · 방금
└ ● Benchmark AI app builders 1/8 · 최근: WebSearch Lovable docs
└ ‖ Seed starter audit 3/4 · 보류로 끝남 · only saving the file is left
└ ✓ 서브에이전트 5개 끝남
── □ 남은 일 1 ─────────────────────────────────────────────
▸ Fix lost attachments · 1일 전
□ push
── ✓ 오늘 완료 1 ───────────────────────────────────────────
▸ Release notes draft · 2시간 전
Click a task to open its steps as a flow, with the time each step took and its evidence:
▾ Theme builder spec
● Read the brief · 40분 — notes in brief.md
┃
● Benchmark · 1시간 20분 — 3 reports
┃
◉ Write the requirements ← 지금
│
○ Design
From the marketplace:
claude plugin marketplace add wonjangcloud9/wj-mods
claude plugin install work-progress@wj-mods
Install other mods the same way with <mod>@wj-mods. They load in sessions started after installing.
The Korean readability bundle installs plain-summary, turn-divider and compact-tool-rows with it:
claude plugin install plain-korean@wj-mods
The output style and the theme are not switched on for you. Choose plain-korean as the output style in /config, and claude-warm in /theme if you want the colors too.
From a local clone, list the mod folders in CLAUDE_CODE_PLUGIN_DIRS in ~/.claude/settings.json, separated by :. Folders listed this way do not pull in dependencies, so list the bundle's three mods as well:
git clone https://github.com/wonjangcloud9/wj-mods.git ~/wj-mods
{
"env": {
"CLAUDE_CODE_PLUGIN_DIRS": "/Users/me/wj-mods/work-progress:/Users/me/wj-mods/usage-band"
}
}
long-turn-notify records its voice lines with the macOS say Yuna voice on first use and keeps them in ~/.claude/long-turn-notify/sounds/. Without that voice it shows the notification silently.plain-summary calls a small model once per long answer, which counts toward your usage.work-progress keeps its records in ~/.claude/work-progress/ on your machine.claude plugin test <mod folder>.MIT
hooks/register.ts 32 lines1import type { EngineInterface, Register } from 'claude-code'
2
3import { SYSTEM, isReportLike, summaryLine, summaryPrompt } from './summary'
4
5const MODEL = 'haiku'
6const MAX_TOKENS = 300
7const TIMEOUT_MS = 20_000
8
9async function summarize($: EngineInterface, answer: string): Promise<void> {
10 const reply = await $.model.complete({
11 model: MODEL,
12 system: SYSTEM,
13 prompt: summaryPrompt(answer),
14 maxTokens: MAX_TOKENS,
15 effort: 'low',
16 timeoutMs: TIMEOUT_MS,
17 })
18 const line = reply.isAnswered ? summaryLine(reply.text) : undefined
19 if (line) $.ui.log(line)
20}
21
22export const register: Register = on => {
23 on('turn.complete', async ($, e, next) => {
24 const result = await next(e)
25 if (e.agentId !== undefined || e.reason !== 'answer' || !isReportLike(e.answer)) return result
26
27 // 턴 마무리를 늦추지 않도록 요약은 턴이 끝난 뒤 timer 에서 만든다.
28 $.clock.after(0, () => void summarize($, e.answer))
29 return result
30 })
31}
32hooks/summary.ts 30 lines1const HEADING = /^#{1,4}\s/m
2const TABLE_RULE = /^\|?\s*:?-{3,}:?\s*\|/m
3const MIN_CHARS = 600
4const MIN_LINES = 20
5const MAX_ANSWER_CHARS = 12_000
6
7export const PREFIX = '쉽게 말하면 · '
8
9export const SYSTEM = [
10 '너는 개발자에게 긴 답변을 쉬운 한국어로 풀어 주는 도우미다.',
11 '두 문장으로만 쓴다. 첫 문장은 결론이나 지금 상태다. 두 번째 문장은 사용자가 해야 하거나 정해야 할 일이고, 없으면 "따로 할 일은 없다"고 쓴다.',
12 '답변에 나온 줄임말, 번호, ID, 커밋 해시를 그대로 옮기지 말고 무슨 뜻인지 풀어 쓴다. 머리말, 목록, 마크다운 없이 바로 쓴다.',
13].join('\n')
14
15// 대화 기록상 "뭔 말이야" 직전 답변은 길이보다 제목과 표가 붙은 보고서 형태가 특징이었다.
16export function isReportLike(answer: string): boolean {
17 if (answer.length < MIN_CHARS) return false
18 const lines = answer.split('\n').filter(line => line.trim()).length
19 return HEADING.test(answer) || TABLE_RULE.test(answer) || lines >= MIN_LINES
20}
21
22export function summaryPrompt(answer: string): string {
23 return `다음 답변을 두 문장으로 쉽게 풀어 줘.\n\n<answer>\n${answer.slice(0, MAX_ANSWER_CHARS)}\n</answer>`
24}
25
26export function summaryLine(reply: string): string | undefined {
27 const text = reply.replace(/\s+/g, ' ').trim()
28 return text ? `${PREFIX}${text}` : undefined
29}
30