Skip to content

Eun0/Claude_Code_History

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

14 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Claude Code History + Memo

Claude Code ๋Œ€ํ™” ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์›น์—์„œ ๋ธŒ๋ผ์šฐ์ง•ํ•˜๊ณ , ๊ฐ€์น˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ๋ฐœ์ทŒ+๋ฉ”๋ชจํ•ด์„œ ํŒ€์›๋“ค์—๊ฒŒ ๋‹จ์ผ HTML / Markdown์œผ๋กœ ๊ณต์œ ํ•˜๋Š” ๋กœ์ปฌ ํˆด. ์—ฌ๋Ÿฌ ์„ธ์…˜์˜ ๋ฉ”๋ชจ๋ฅผ ๋ชจ์•„ ํ•œ ๋ฌธ์„œ๋กœ ๋ฌถ๋Š” cross-session Editor๋„ ํฌํ•จ.

๋ฉ”์ธ ๊ธฐ๋Šฅ ์‹œ์—ฐ

๐Ÿ“บ ๊ณ ํ™”์งˆ ์˜์ƒ์€ assets/๋ฉ”์ธ๊ธฐ๋Šฅ.mp4 (2.2MB).

Anthropic๊ณผ ์ œํœด/ํ›„์› ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ๋น„๊ณต์‹ ๋ทฐ์–ด์ž…๋‹ˆ๋‹ค. "Claude" ๋ฐ "Claude Code"๋Š” Anthropic, PBC์˜ ์ƒํ‘œ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ

  • ~/.claude/projects/ ์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ/์„ธ์…˜ ๋ธŒ๋ผ์šฐ์ง•
  • ๋Œ€ํ™” ์ „์ฒด ๋ Œ๋”๋ง โ€” user / assistant / tool_use / tool_result / thinking / image / sidechain(subagent), Shiki ์ฝ”๋“œ ํ•˜์ด๋ผ์ดํŒ… + GFM Markdown. 4๊ฐœ surface(ํ”„๋กœ์ ํŠธ ๋Œ€ํ™” ๋ทฐ, Preview, Editor, Download HTML)๊ฐ€ ๊ณต์œ  ๋ Œ๋”๋Ÿฌ 1๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด ์‹œ๊ฐ์ ์œผ๋กœ ๋™์ผ
  • ์›๊ฒฉ ์„œ๋ฒ„ ํžˆ์Šคํ† ๋ฆฌ โ€” ~/.ssh/config ์˜ SSH ํ˜ธ์ŠคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด ์›๊ฒฉ ์„œ๋ฒ„์˜ Claude Code ์„ธ์…˜๋„ ๋กœ์ปฌ๊ณผ ๋™์ผํ•˜๊ฒŒ ์กฐํšŒ (SFTP). ์ƒ๋‹จ ํƒญ์œผ๋กœ Local / ์„œ๋ฒ„๋ณ„ ์ „ํ™˜
  • ์ „์—ญ ๊ฒ€์ƒ‰ โ€” ํ…์ŠคํŠธ + ํˆด ํ•„ํ„ฐ + ๋‚ ์งœ ๋ฒ”์œ„. "์„œ๋ฒ„์—์„œ๋„ ๊ฒ€์ƒ‰" ์ฒดํฌ ์‹œ ์—ฐ๊ฒฐ๋œ ์„œ๋ฒ„์—์„œ SSH exec + grep์œผ๋กœ ๋ณ‘๋ ฌ ๊ฒ€์ƒ‰, ํƒญ์œผ๋กœ ๊ฒฐ๊ณผ ๋ถ„๋ฆฌ
  • ๋ฉ”๋ชจ โ€” ๋ฉ”์‹œ์ง€ ๋ฒ”์œ„๋ฅผ ์„ ํƒํ•ด ์ œ๋ชฉ+Markdown ๋…ธํŠธ๋กœ ์ €์žฅ, ์„ธ์…˜๋ณ„ ๋ณด๋“œ ๊ตฌ์„ฑ
  • ์„ธ์…˜ ๋ฉ”๋ชจ ํŽธ์ง‘ โ€” ์‚ฌ์ด๋“œ ํŒจ๋„์˜ Preview & Edit๋กœ in-app ํŽธ์ง‘ ํ™”๋ฉด ์ง„์ž…, ์ธ๋ผ์ธ์œผ๋กœ ๋ณด๋“œ ํƒ€์ดํ‹€ / ๋ฉ”๋ชจ / ์ˆœ์„œ / ์‚ญ์ œ + ๋ฉ”์ธ ํƒญ๊ณผ ์ž๋™ ๋™๊ธฐํ™”
  • Editor (cross-session ์ž‘์„ฑ๊ธฐ) โ€” ์—ฌ๋Ÿฌ ์„ธ์…˜์˜ ๋ฉ”๋ชจ๋ฅผ ๋‘๋ ˆ์ด "์—…๋ฌด ์ฐธ์กฐ" ๋ฐฉ์‹์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋กœ ๋ชจ์•„ ํŽธ์ง‘, ๋กœ์ปฌ ๋“œ๋ž˜ํ”„ํŠธ ์ž๋™ ์ €์žฅ
  • ๊ณต์œ  โ€” Download HTML(๋‹จ์ผ self-contained) / Copy Markdown / Preview
  • Resume ๋ช…๋ น ๋ณต์‚ฌ โ€” cd "<cwd>" && claude --resume <sessionId>

์ƒ์„ธ ๊ธฐ๋Šฅ

ํ”„๋กœ์ ํŠธ / ์„ธ์…˜ ๋ชฉ๋ก

  • ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก: ์นด๋“œ ๊ทธ๋ฆฌ๋“œ + ๊ฒ€์ƒ‰ / ์ •๋ ฌ(RecentยทName) / ํŽ˜์ด์ง€๋„ค์ด์…˜(9๊ฐœ/ํŽ˜์ด์ง€)
  • ํ”„๋กœ์ ํŠธ ์ˆจ๊น€ โ€” ์นด๋“œ hover ์‹œ ร— ๋ฒ„ํŠผ(localStorage projectList.hidden.v1), ํˆด๋ฐ”์˜ Hidden (N) ๋ฒ„ํŠผ์œผ๋กœ ์ˆจ๊น€ ๋ชฉ๋ก ๋ทฐ ์ง„์ž…, โ†บ ๋ฒ„ํŠผ์œผ๋กœ ๋ณต๊ตฌ
  • ์„ธ์…˜ ์ˆจ๊น€ โ€” ํ”„๋กœ์ ํŠธ ๋ทฐ ์ขŒ์ธก ์„ธ์…˜ ์‚ฌ์ด๋“œ๋ฐ”์˜ ๊ฐ ํ–‰ hover ์‹œ ร— ๋ฒ„ํŠผ(localStorage sessionSidebar.hidden.v1), ์‚ฌ์ด๋“œ๋ฐ” ํ—ค๋”์˜ Hidden (N) ๋ฒ„ํŠผ์œผ๋กœ ์ˆจ๊น€ ๋ทฐ ์ง„์ž…
    • ํ˜„์žฌ ์—ด๋ ค์žˆ๋Š” ์„ธ์…˜์€ ์ˆจ๊ธฐ๋”๋ผ๋„ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ์ฆ‰์‹œ ์‚ฌ๋ผ์ง€์ง€ ์•Š์Œ (๋ทฐ ๊นœ๋นก์ž„ ๋ฐฉ์ง€)
  • ์ˆจ๊ธด ํ”„๋กœ์ ํŠธ / ์„ธ์…˜์˜ ๋ฉ”๋ชจ๋Š” /memos ํƒญ๊ณผ /editor picker์—์„œ๋„ ์ž๋™ ์ œ์™ธ (๊ณต์œ  ํ—ฌํผ src/state/hiddenProjects.js ยท hiddenSessions.js)
  • Claude Code์˜ lossy ๊ฒฝ๋กœ ์ธ์ฝ”๋”ฉ(my.app_name โ†’ -my-app-name)์„ ์„ธ์…˜ cwd ํ•„๋“œ์—์„œ ๋ฌด์†์‹ค ๋ณต์›

๋Œ€ํ™” ๋ทฐ

  • ํ…์ŠคํŠธ ๋“œ๋ž˜๊ทธ ๋ณต์‚ฌ โ€” ํ–‰ ๋‚ด์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ…์ŠคํŠธ ์„ ํƒ, ์—ฌ๋Ÿฌ ํ–‰์— ๊ฑธ์นœ ๋“œ๋ž˜๊ทธ๋Š” ๋ฉ”๋ชจ์šฉ ๋‹ค์ค‘ ํ–‰ ์„ ํƒ์œผ๋กœ ์ž๋™ ์Šน๊ฒฉ
  • AskUserQuestion ํŠน์ˆ˜ ๋ Œ๋” โ€” ์งˆ๋ฌธ์€ Claude ๋ฉ”์‹œ์ง€์— **AskUserQuestion ๋„๊ตฌ ํ˜ธ์ถœ** prefix์™€ ํ•จ๊ป˜ ํ‰๋ฌธ์œผ๋กœ, ์‚ฌ์šฉ์ž์˜ ์„ ํƒ ๋‹ต๋ณ€์€ User ๋ฒ„๋ธ”์— ๋‹ต๋ณ€ 1: โ€ฆ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ (toolUseResult.answers ๊ตฌ์กฐํ™” ํ•„๋“œ ์šฐ์„  ์‚ฌ์šฉ)
  • ๋ผ์ด๋ธŒ ์—…๋ฐ์ดํŠธ โ€” ์„œ๋ฒ„๊ฐ€ ์›๋ณธ JSONL์„ watchํ•˜์—ฌ ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด SSE๋กœ ํ‘ธ์‹œ, ํ•˜๋‹จ ๊ทผ์ฒ˜์— ์žˆ์„ ๊ฒฝ์šฐ ์ž๋™ ์Šคํฌ๋กค
  • Subagent task notification โ€” Claude Code๊ฐ€ ์ฃผ์ž…ํ•˜๋Š” <task-notification> (background task/subagent ์™„๋ฃŒ ์•Œ๋ฆผ)์„ ์œ ์ € ๋ฒ„๋ธ”์ด ์•„๋‹Œ Claude์˜ ์ ‘๊ธฐ ์˜์—ญ(thinking ๋ธ”๋ก)์œผ๋กœ ํ‘œ์‹œ. ๋นˆ ์œ ์ € ๋ฒ„๋ธ” ๋ฐฉ์ง€
  • IDE ๋ฉ”ํƒ€ wrapper ์ œ๊ฑฐ โ€” <ide_selection> / <ide_opened_file> ์ฒ˜๋Ÿผ IDE๊ฐ€ ํ”„๋กฌํ”„ํŠธ์— ์ฃผ์ž…ํ•˜๋Š” ์ปจํ…์ŠคํŠธ ๋ธ”๋ก์€ ์œ ์ € ๋ฒ„๋ธ”์—์„œ ์ˆจ๊น€ (tool_result ๋คํ”„๊ฐ€ ์‚ฌ์šฉ์ž ํ…์ŠคํŠธ๋กœ ์˜ค์—ผ๋˜๋Š” ๊ฒƒ ๋ฐฉ์ง€)
  • ์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ โ€” ์œ ์ € ๋ฒ„๋ธ” ์•ˆ ์ธ๋ผ์ธ ์ฝ”๋“œ ๋ธ”๋ก์œผ๋กœ ํ‘œ์‹œ (`/commit` ํ˜•ํƒœ)
  • ์œ ์ € ๋ฒ„๋ธ” ๋ณต์‚ฌ ๋ฒ„ํŠผ โ€” ๋ฒ„๋ธ” ์˜† ํด๋ฆฝ๋ณด๋“œ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋ฉ”์‹œ์ง€์˜ ์›๋ฌธ(์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ ํฌํ•จ, IDE wrapper ์ œ๊ฑฐ๋œ ์ƒํƒœ)๋งŒ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ. hover ์‹œ ๋“ฑ์žฅ
  • Select All โ€” ์„ธ์…˜ ํ—ค๋”์˜ select all ์ฒดํฌ๋ฐ•์Šค๋กœ ์ „์ฒด ๋ฉ”์‹œ์ง€ ์ผ๊ด„ ์„ ํƒ/ํ•ด์ œ
  • thinking / system event ํ† ๊ธ€๋กœ ๊ฐ€๋…์„ฑ ์กฐ์ •

๋ฉ”๋ชจ

  • ๋“œ๋ž˜๊ทธ๋กœ ์ˆœ์„œ ์žฌ๋ฐฐ์น˜, ์นด๋“œ ํด๋ฆญ์œผ๋กœ ์›๋ณธ ๋ฉ”์‹œ์ง€๋กœ ์ ํ”„
  • Edit Message ๋ชจ๋“œ โ€” ๋ฉ”๋ชจ ์นด๋“œ์˜ Edit Message ๋ฒ„ํŠผ์œผ๋กœ ๊ธฐ์กด ๋ฉ”๋ชจ์˜ ๋ฉ”์‹œ์ง€ ์†Œ์†์„ ์žฌํŽธ์ง‘(์ถ”๊ฐ€/์ œ๊ฑฐ), ํ•˜๋‹จ ๋ฐ”์˜ Save/Cancel๋กœ ์ปค๋ฐ‹
  • ๋ณด๋“œ ํƒ€์ดํ‹€ ํŽธ์ง‘ (์„ธ์…˜๋ณ„ ์ปค์Šคํ…€ ์ œ๋ชฉ, ๊ธฐ๋ณธ๊ฐ’ "Claude Memos")
  • Memos ํƒญ โ€” ์ƒ๋‹จ ๋„ค๋น„์˜ Memos์—์„œ ์„ธ์…˜์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ๋ฉ”๋ชจ ์ธ๋ฑ์Šค ์กฐํšŒ, ํด๋ฆญ ์‹œ ์›๋ณธ ์„ธ์…˜์˜ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋กœ ๋”ฅ๋งํฌ

Preview & Edit (์„ธ์…˜ ๋ฉ”๋ชจ ํŽธ์ง‘)

  • ๋ฉ”๋ชจ ์‚ฌ์ด๋“œ ํŒจ๋„์˜ Preview & Edit โ†’ ์ƒˆ ํƒญ์—์„œ in-app ํŽธ์ง‘ ํ™”๋ฉด(#/sessions/:projectId/:sessionId/edit) ์˜คํ”ˆ
  • ๊ธฐ๋ณธ์€ Preview ๋ชจ๋“œ (์ „์ฒด์ ์ธ ๋ฌธ์„œ ๋ชจ์–‘์„ ๋จผ์ € ๋ณด๊ณ , ํ•„์š”ํ•  ๋•Œ๋งŒ Edit์œผ๋กœ ์ „ํ™˜)
  • ์ƒ๋‹จ sticky banner: Edit โ†” Preview ํ† ๊ธ€ + Download HTML / Copy MD ์•„์ด์ฝ˜
  • Edit ๋ชจ๋“œ: ๋ณด๋“œ ํƒ€์ดํ‹€, ๋ฉ”๋ชจ ์ œ๋ชฉ, ๋ฉ”๋ชจ note(ํด๋ฆญ-ํˆฌ-์—๋””ํŠธ) ์ธ๋ผ์ธ ํŽธ์ง‘ โ€” ๋””๋ฐ”์šด์Šค๋˜์–ด ์ž๋™ ์ €์žฅ
  • ๋ฉ”๋ชจ ์นด๋“œ ์šฐ์ƒ๋‹จ toolbar๋กœ โ‹ฎโ‹ฎ ๋“œ๋ž˜๊ทธ / โ†‘โ†“ ํ•œ ์นธ ์ด๋™ / โœ• ์‚ญ์ œ, ์ „์ฒด-์นด๋“œ drop zone + ๊ฐ•ํ•œ drop indicator
  • ๋Œ€ํ™” ์›๋ฌธ์€ ๋ฉ”๋ชจ์˜ messageUuids๋กœ ํ•„ํ„ฐ๋ง๋˜์–ด ํ˜„์žฌ ์„ธ์…˜์—์„œ ์ถ”์ถœ, ์ฝ๊ธฐ ์ „์šฉ ๋ Œ๋”
  • ํŽธ์ง‘ ๋‚ด์šฉ์ด BroadcastChannel(memo-updates)๋กœ ๋ฉ”์ธ ์•ฑ ์‚ฌ์ด๋“œ ํŒจ๋„์— ์ฆ‰์‹œ ๋™๊ธฐํ™”

Editor (cross-session ์ž‘์„ฑ๊ธฐ)

  • ์ƒ๋‹จ ๋„ค๋น„์˜ Editor ๋˜๋Š” #/editor
  • ๊ธฐ๋ณธ์€ Edit ๋ชจ๋“œ (์ž‘์„ฑ์šฉ ์›Œํฌ์ŠคํŽ˜์ด์Šค)
  • + ๋ฉ”๋ชจ ์ฐธ์กฐ ์ถ”๊ฐ€ โ†’ ๋ชจ๋‹ฌ picker์—์„œ ๋ชจ๋“  ์„ธ์…˜์˜ ๋ฉ”๋ชจ๋ฅผ ํ‰๋ฉด ๋ฆฌ์ŠคํŠธ๋กœ ๊ฒ€์ƒ‰(title / note / ๋Œ€ํ™” ์›๋ฌธ ๊ฐ€์ค‘ ๋งค์นญ) โ†’ ๋‹ค์ค‘ ์„ ํƒ ํ›„ Add (N)์œผ๋กœ ํ•œ ๋ฒˆ์— ์‚ฝ์ž…
    • ํ•ญ๋ชฉ ์šฐ์ธก ๋Œ€ํ™” N๊ฐœ ๋ณด๊ธฐ โ–พ๋กœ ์ธ๋ผ์ธ ํŽผ์ณ ์‹ค์ œ ๋Œ€ํ™” ํ™•์ธ ๊ฐ€๋Šฅ
    • ์ด๋ฏธ ์ถ”๊ฐ€ํ•œ ๋ฉ”๋ชจ๋Š” ์ž ๊ธˆ(disabled)
    • ์ˆจ๊ธด ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”๋ชจ๋Š” picker์—์„œ ์ž๋™ ์ œ์™ธ
  • ํ”ฝํ•œ ๋ฉ”๋ชจ๋Š” ๋ฌธ์„œ ๋ธ”๋ก์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉฐ ์›๋ณธ ๋ฉ”๋ชจ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ(ํŽธ์ง‘์€ ๋กœ์ปฌ ๋“œ๋ž˜ํ”„ํŠธ์—๋งŒ)
  • ๋ฌธ์„œ ์ œ๋ชฉ / ์ธํŠธ๋กœ / ๋ฉ”ํƒ€ DATE / ๋ฉ”๋ชจ ๋ธ”๋ก(ํŽธ์ง‘ ๊ฐ€๋Šฅ title / note + ์›๋ณธ ๋Œ€ํ™” + ์ถœ์ฒ˜) / footer โ€” ๋‹ค์šด๋กœ๋“œ HTML๊ณผ ์‹œ๊ฐ์ ์œผ๋กœ ๋™์ผ
  • ๋™์ผํ•œ toolbar UX(๋“œ๋ž˜๊ทธ / โ†‘โ†“ / โœ•)
  • ์ž๋™ ๋™๊ธฐํ™”: ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ api.listMemos()๋กœ ๊ฐ ๋ธ”๋ก์˜ messageUuids๋ฅผ ์ตœ์‹ ๊ฐ’์œผ๋กœ ๊ต์ฒด (๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ฉ”๋ชจ ๋ฒ”์œ„๊ฐ€ ํŽธ์ง‘๋œ ๊ฒฝ์šฐ ๋ฐ˜์˜). ๋กœ์ปฌ ํŽธ์ง‘ํ•œ title / note๋Š” ํ•ญ์ƒ ๋ณด์กด
  • localStorage(editor.draft.v1) ์ž๋™ ์ €์žฅ, Banner์˜ โœ• ์•„์ด์ฝ˜์œผ๋กœ ์ดˆ๊ธฐํ™”(Clear)
  • ์ƒ๋‹จ ๋„ค๋น„์˜ Editor ํด๋ฆญ ์‹œ ํ•ญ์ƒ ์ƒˆ draft (์ด๋ฏธ /editor์— ์žˆ์–ด๋„ unique hash๋กœ remount), F5/๋ถ๋งˆํฌ/์ง์ ‘ URL์€ ์ž‘์—… ์œ ์ง€
  • Download HTML โ€” ์„œ๋ฒ„ ํŒŒ์ดํ”„๋ผ์ธ(POST /api/editor/export): shiki ํ•˜์ด๋ผ์ดํŒ… + formatTools + pre-rendered ์ •์  HTML(JS ๋ถˆํ•„์š”). ๊ณต์œ  ๋ Œ๋”๋Ÿฌ(renderDocBody)๊ฐ€ ํ”„๋กœ์ ํŠธ ๋Œ€ํ™” ๋ทฐ์™€ ๋™์ผํ•œ ํด๋ž˜์Šค๋ช…ยท๊ตฌ์กฐ๋กœ ์ถœ๋ ฅ โ†’ ๊ธด ์œ ์ € ๋ฒ„๋ธ”์€ ์ธ๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ๋กœ "๋” ๋ณด๊ธฐ" collapsible ์ž๋™ ์ ์šฉ
  • Copy MD โ€” ๊ฐ ๋ธ”๋ก์˜ ์›๋ณธ ๋Œ€ํ™” ํ„ด(### ๐Ÿ‘ค You / ### ๐Ÿค– Claude + > body) ํฌํ•จ (๊ณต์œ  renderTurns), ๋ฉ”๋ชจ ์‚ฌ์ด๋“œ ํŒจ๋„ preview์˜ markdown export์™€ ๋™์ผ ํฌ๋งท. ์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ๋Š” heading์ด ์•„๋‹Œ ๋ณธ๋ฌธ ์ฒซ ์ค„(> /commit)๋กœ ์‚ฝ์ž… โ€” ์›๋ฌธ ๊ทธ๋Œ€๋กœ ๋ณต๊ตฌ ๊ฐ€๋Šฅ
  • Preview ๋ชจ๋“œ ํ† ๊ธ€

์•„ํ‚คํ…์ฒ˜: ๊ณต์œ  ๋ Œ๋”๋Ÿฌ๋กœ 4 surface ํ†ต์ผ

๋Œ€ํ™” ๋ฉ”์‹œ์ง€ HTML ๋ Œ๋”๋ง์€ src/lib/renderMessageHtml.js ํ•˜๋‚˜๊ฐ€ ๋‹ด๋‹น. ์ด ๋ชจ๋“ˆ์ด ์ƒ์‚ฐํ•˜๋Š” HTML์„:

  • React ์•ฑ (ํ”„๋กœ์ ํŠธ ๋Œ€ํ™” ๋ทฐ, Editor, SessionMemoEditPage) โ†’ dangerouslySetInnerHTML๋กœ ์‚ฌ์šฉ
  • Download HTML โ†’ ์„œ๋ฒ„๊ฐ€ renderDocBody(payload) ํ˜ธ์ถœ โ†’ pre-rendered ์ •์  HTML (JS ๋ถˆํ•„์š”)
  • viewer.js (/preview) โ†’ esbuild๊ฐ€ shared import๋ฅผ ๋ฒˆ๋“ค โ†’ renderNodes() ํ˜ธ์ถœ

๋ฌธ์„œ ๋ ˆ์ด์•„์›ƒ(h1, lede, meta, memo sections)์€ MemoDoc.jsx + **EditorMemoBlock.jsx**๊ฐ€ React ์•ฑ ๋‘ surface์— ๊ณต์œ . Markdown export๋Š” memoMarkdown.js(renderMemoSection ยท renderTurns)๋ฅผ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๊ณต์œ .

์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ ํ‘œ์‹œ ๋ฐฉ์‹ ๊ฐ™์€ UI ๋ณ€๊ฒฝ โ†’ renderMessageHtml.js 1๊ณณ๋งŒ ์ˆ˜์ • โ†’ 4 surface ๋ชจ๋‘ ๋ฐ˜์˜.

์‹คํ–‰

npm install

# dev: Vite(5173) + Fastify(5174) ๋™์‹œ ๊ธฐ๋™
npm run dev
# ๋ธŒ๋ผ์šฐ์ €: http://localhost:5173

# prod: ๋‹จ์ผ ํฌํŠธ 5174 ์—์„œ ์ •์  + API ๋™์‹œ ์„œ๋น™
npm run build
npm start
# ๋ธŒ๋ผ์šฐ์ €: http://localhost:5174

node server/index.js๋Š” nodemon ์—†์ด ๋Œ์•„๊ฐ€๋ฏ€๋กœ, ์„œ๋ฒ„ ์ฝ”๋“œ(server/) ์ˆ˜์ • ์‹œ Ctrl+C ํ›„ ๋‹ค์‹œ npm run dev.

๋ฐ์ดํ„ฐ ์œ„์น˜

  • ์„ธ์…˜ ์›๋ณธ (read-only): ~/.claude/projects/<encoded-project>/<session-id>.jsonl
  • ๋ฉ”๋ชจ/ํƒ€์ดํ‹€ (runtime): ./data/memos/<sessionId>.json (gitignored)
  • ์—ฐ๊ฒฐ๋œ ์„œ๋ฒ„ ๋ชฉ๋ก (runtime): ./data/servers.json (gitignored โ€” SSH ํ˜ธ์ŠคํŠธ ์ •๋ณด ํฌํ•จ)
  • ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ: ./dist/ (viewer.min.js โ€” /preview ์ „์šฉ; Download HTML์€ pre-rendered ์ •์  HTML๋กœ viewer.js ๋ถˆํฌํ•จ)

API

๋ชจ๋“  ๋ผ์šฐํŠธ๋Š” Fastify(5174) ์—์„œ ์ œ๊ณต.

ํ”„๋กœ์ ํŠธ / ์„ธ์…˜

Method Path
GET /api/projects
GET /api/projects/:id/sessions
GET /api/projects/:id/sessions/:sessionId
GET /api/sessions/:sessionId/watch (SSE)

๋ฉ”๋ชจ (per-session)

Method Path ์„ค๋ช…
GET /api/sessions/:sessionId/memos ๋ณด๋“œ ์ „์ฒด ์กฐํšŒ (title, memos[])
PATCH /api/sessions/:sessionId/memos ๋ณด๋“œ ํƒ€์ดํ‹€ ์ˆ˜์ • ({title})
POST /api/sessions/:sessionId/memos ๋ฉ”๋ชจ ์ƒ์„ฑ
PATCH /api/sessions/:sessionId/memos/order ์ผ๊ด„ reorder ({orderedIds: [...]}) โ€” single read+write๋กœ atomic
PATCH /api/sessions/:sessionId/memos/:memoId ๋ฉ”๋ชจ ์ˆ˜์ • (title, note, order, messageUuids)
DELETE /api/sessions/:sessionId/memos/:memoId ๋ฉ”๋ชจ ์‚ญ์ œ

๋ฉ”๋ชจ (cross-session)

Method Path
GET /api/memos

Export / Preview

Method Path ์„ค๋ช…
GET /api/sessions/:sessionId/memos/export ์„ธ์…˜ ๋ฉ”๋ชจ ๋‹ค์šด๋กœ๋“œ์šฉ self-contained HTML
GET /api/sessions/:sessionId/memos/preview ๋ผ์ด๋ธŒ HTML (edit ๊ฐ€๋Šฅ) โ€” ๋ ˆ๊ฑฐ์‹œ. ๋ฉ”์ธ ํŽธ์ง‘์€ in-app #/sessions/:pid/:sid/edit ๋ผ์šฐํŠธ๋กœ ํ†ตํ•ฉ๋จ
GET /api/sessions/:sessionId/memos/markdown ์„ธ์…˜ ๋ฉ”๋ชจ Markdown
POST /api/editor/export /editor์˜ cross-session doc์„ pre-rendered HTML๋กœ ๋‹ค์šด๋กœ๋“œ (body: {docTitle, intro, blocks[]}). ์œ„์˜ /memos/export์™€ ๋™์ผ ํŒŒ์ดํ”„๋ผ์ธ(shiki + formatTools + ๊ณต์œ  ๋ Œ๋”๋Ÿฌ)

๊ฒ€์ƒ‰

Method Path
GET /api/search?q=<text>&tool=<name>&from=<iso>&to=<iso>
GET /api/servers/:id/search?q=<text>

์›๊ฒฉ ์„œ๋ฒ„ (SSH)

Method Path ์„ค๋ช…
GET /api/ssh-hosts ~/.ssh/config ํ˜ธ์ŠคํŠธ ๋ชฉ๋ก
GET /api/servers ์—ฐ๊ฒฐ๋œ ์„œ๋ฒ„ ๋ชฉ๋ก
POST /api/servers ์„œ๋ฒ„ ์ถ”๊ฐ€ ({sshAlias})
DELETE /api/servers/:id ์„œ๋ฒ„ ์‚ญ์ œ
GET /api/servers/:id/projects ์›๊ฒฉ ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก
GET /api/servers/:id/projects/:pid/sessions ์›๊ฒฉ ์„ธ์…˜ ๋ชฉ๋ก
GET /api/servers/:id/projects/:pid/sessions/:sid ์›๊ฒฉ ์„ธ์…˜ ๋‚ด์šฉ

์›Œํฌํ”Œ๋กœ

๋ฉ”๋ชจ ๋งŒ๋“ค๊ธฐ

  1. ์„ธ์…˜์„ ์—ฐ ๋’ค ๋ฉ”์‹œ์ง€ ํ–‰์„ ํด๋ฆญํ•˜๋ฉด ์„ ํƒ, ์—ฌ๋Ÿฌ ํ–‰ ์œ„๋กœ ๋“œ๋ž˜๊ทธํ•˜๋ฉด ์ผ๊ด„ ์„ ํƒ (ํ–‰ ๋‚ด ๋“œ๋ž˜๊ทธ๋Š” ํ…์ŠคํŠธ ๋ณต์‚ฌ๋กœ ๋™์ž‘)
  2. Shift+ํด๋ฆญ์œผ๋กœ ๋ฒ”์œ„ ์„ ํƒ, ํ—ค๋”์˜ select all ์ฒดํฌ๋ฐ•์Šค๋กœ ์ „์ฒด ์„ ํƒ
  3. ํ•˜๋‹จ ํ”Œ๋กœํŒ… ๋ฐ”์˜ Add memo โ†’ ์ œ๋ชฉ(์„ ํƒ) + ๋…ธํŠธ(Markdown) ์ž‘์„ฑ ํ›„ Save
    • ์ œ๋ชฉ ์ž…๋ ฅ๋ž€์—์„œ Enter โ†’ ์ฆ‰์‹œ ์ €์žฅ, ๋…ธํŠธ textarea์—์„œ Cmd/Ctrl+Enter โ†’ ์ €์žฅ
  4. ์šฐ์ธก ๋ฉ”๋ชจ ํŒจ๋„์— ์นด๋“œ๊ฐ€ ์ถ”๊ฐ€๋จ โ€” ๋“œ๋ž˜๊ทธ๋กœ ์ˆœ์„œ ๋ณ€๊ฒฝ, ํด๋ฆญ์œผ๋กœ ์›๋ณธ ๋ฉ”์‹œ์ง€๋กœ ์ ํ”„, Edit (์ œ๋ชฉ/๋…ธํŠธ) / Edit Message (๋ฉ”์‹œ์ง€ ์†Œ์†) / Delete

๋ฉ”๋ชจ ๋ฉ”์‹œ์ง€ ๋ฒ”์œ„ ํŽธ์ง‘

  1. ๋ฉ”๋ชจ ์นด๋“œ์˜ Edit Message ๋ฒ„ํŠผ ํด๋ฆญ โ†’ ํ•ด๋‹น ๋ฉ”๋ชจ๊ฐ€ ํŒŒ๋ž€ accent๋กœ ๊ฐ•์กฐ๋˜๊ณ  ์†Œ์† ๋ฉ”์‹œ์ง€๋“ค์ด .selected ์ƒํƒœ๋กœ ๋ฏธ๋ฆฌ ์ฑ„์›Œ์ง
  2. ๋‹ค๋ฅธ ํ–‰ ํด๋ฆญ์œผ๋กœ ํฌํ•จ ์ถ”๊ฐ€, ์ด๋ฏธ ์†ํ•œ ํ–‰ ํด๋ฆญ์œผ๋กœ ์ œ๊ฑฐ, ๋“œ๋ž˜๊ทธ/Shift+ํด๋ฆญ์œผ๋กœ ์ผ๊ด„ ํ† ๊ธ€
  3. ํ•˜๋‹จ ๋ฐ”์˜ Save ๋ˆ„๋ฅด๋ฉด messageUuids ๊ต์ฒด ์ปค๋ฐ‹, Cancel์€ ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌ
  4. ํŽธ์ง‘ ์ค‘์—” ๋‹ค๋ฅธ ๋ฉ”๋ชจ ์นด๋“œ์˜ Edit/Delete/Edit Message/์žฌ์ •๋ ฌ์ด ์ž ๊น€ (์‹ค์ˆ˜ ๋ฐฉ์ง€)

๊ณต์œ 

๋ฉ”๋ชจ ํŒจ๋„ ์ƒ๋‹จ์˜ ํƒ€์ดํ‹€ ์ž…๋ ฅ๋ž€์— ์ œ๋ชฉ์„ ์“ฐ๊ณ (๋น„์šฐ๋ฉด "Claude Memos"), ํ•˜๋‹จ ๋ฒ„ํŠผ์œผ๋กœ:

  • Download HTML โ€” ๋‹จ์ผ self-contained ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ (claude-memos-<sid>-<date>.html)
  • Preview & Edit โ€” ์ƒˆ ํƒญ์—์„œ in-app ํŽธ์ง‘ ํ™”๋ฉด ์˜คํ”ˆ (#/sessions/:pid/:sid/edit)
  • Copy as Markdown โ€” ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ (์œ„ํ‚ค/๋…ธ์…˜/Slack ๋“ฑ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ)

์—ฌ๋Ÿฌ ์„ธ์…˜์˜ ๋ฉ”๋ชจ๋ฅผ ํ•œ ๋ฌธ์„œ๋กœ ๋ฌถ๊ธฐ (Editor)

  1. ์ƒ๋‹จ ๋„ค๋น„ Editor ํด๋ฆญ โ†’ #/editor
  2. ๋ฌธ์„œ ์ œ๋ชฉ / ์ธํŠธ๋กœ ์ž‘์„ฑ
  3. + ๋ฉ”๋ชจ ์ฐธ์กฐ ์ถ”๊ฐ€ โ†’ picker์—์„œ ๊ฒ€์ƒ‰(title / note / ๋Œ€ํ™” ์›๋ฌธ) โ†’ ๋‹ค์ค‘ ์„ ํƒ ํ›„ Add (N)
  4. ๋ธ”๋ก ์ˆœ์„œ ์กฐ์ •(๋“œ๋ž˜๊ทธ ๋˜๋Š” โ†‘โ†“), title / note ์ธ๋ผ์ธ ํŽธ์ง‘(์›๋ณธ ๋ฉ”๋ชจ๋Š” ๋ณ€๊ฒฝ ์—†์Œ)
  5. Download HTML / Copy MD / Preview ํ† ๊ธ€
  6. ์ž‘์—… ์ค‘ ๋‚ด์šฉ์€ localStorage์— ์ž๋™ ์ €์žฅ

Resume

์„ธ์…˜ ํ—ค๋”์˜ resume ๋ฒ„ํŠผ โ†’ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ๋˜๋Š” ๋ช…๋ น์–ด:

cd "<์›๋ณธ cwd>" && claude --resume <sessionId>

ํ„ฐ๋ฏธ๋„์— ๋ถ™์—ฌ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ์„ธ์…˜์œผ๋กœ ์ด์–ด์„œ ์ž‘์—… ์‹œ์ž‘.

๊ตฌ์กฐ

server/                       # Fastify ์„œ๋ฒ„
  projects.js / sessions.js   # ๋กœ์ปฌ ์„ธ์…˜ ์ฝ๊ธฐ
  sshConfig.js                # ~/.ssh/config ํŒŒ์‹ฑ
  serverStore.js              # data/servers.json CRUD
  remoteFs.js                 # SSH2 SFTP ์—ฐ๊ฒฐ ํ’€
  remoteProjects.js           # ์›๊ฒฉ ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก (SFTP)
  remoteSessions.js           # ์›๊ฒฉ ์„ธ์…˜ ์ฝ๊ธฐ (SFTP)
  remoteSearch.js             # ์›๊ฒฉ ๊ฒ€์ƒ‰ (SSH exec + grep)
  memos, search, export, ...
src/lib/                      # ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๊ณต์šฉ ESM
  renderMessageHtml.js        # โ˜…โ˜… ๊ณต์œ  HTML ๋ Œ๋”๋Ÿฌ โ€” 4 surface (์•ฑยทpreviewยทeditorยทdownload)์˜ ๋‹จ์ผ ์†Œ์Šค
  memoMarkdown.js             # โ˜… ๋ฉ”๋ชจ markdown ๋ Œ๋”๋Ÿฌ (server/exportMarkdown + ํด๋ผ์ด์–ธํŠธ Copy MD ๊ณต์šฉ)
  editorExport.js             # /editor์˜ Markdown ๋นŒ๋” + download blob ํ—ฌํผ (HTML์€ ์„œ๋ฒ„ ์œ„์ž„)
  formatTools.js              # tool_use ๋ธ”๋ก ํฌ๋งท (๊ณต์œ )
  parseMessages.js, ...
src/state/                    # ํด๋ผ์ด์–ธํŠธ ์Šคํ† ์–ด
  memoStore.js                # ์„ธ์…˜ ๋ฉ”๋ชจ (useSyncExternalStore)
  editorDraft.js              # /editor localStorage ๋“œ๋ž˜ํ”„ํŠธ
  sessionCache.js             # /api/projects/:id/sessions/:sid promise ์บ์‹œ + ๋™์‹œ์„ฑ ํ
  hiddenProjects.js           # projectList.hidden.v1 read/write (๊ณต์œ  ํ—ฌํผ)
  hiddenSessions.js           # sessionSidebar.hidden.v1 read/write (๊ณต์œ  ํ—ฌํผ)
src/components/
  MemoDoc.jsx                 # โ˜… /editor์™€ ์„ธ์…˜ ๋ฉ”๋ชจ ํŽธ์ง‘์ด ๊ณต์œ ํ•˜๋Š” ๋ฌธ์„œ ๋ Œ๋”๋Ÿฌ
  EditorMemoBlock.jsx         # โ˜… ๋ฉ”๋ชจ ๋ธ”๋ก (toolbar / drag / ํด๋ฆญ-ํˆฌ-์—๋””ํŠธ / ๋Œ€ํ™” ์ž„๋ฒ ๋“œ)
  ReferencedConversation.jsx  # ๋ฉ”๋ชจ์˜ messageUuids๋กœ ์„ธ์…˜ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋ง + ๋ Œ๋”
  MemoReferencePicker.jsx     # /editor์˜ ๋‘๋ ˆ์ด-์Šคํƒ€์ผ ๋ฉ”๋ชจ ์ฐธ์กฐ picker
  MemoPanel.jsx               # ์„ธ์…˜ ์‚ฌ์ด๋“œ ํŒจ๋„ (DraggableMemoList + ExportBar)
  ...
src/pages/
  EditorPage.jsx              # /editor โ€” cross-session ์ž‘์„ฑ๊ธฐ
  SessionMemoEditPage.jsx     # /sessions/:pid/:sid/edit โ€” in-app ๋ฉ”๋ชจ ํŽธ์ง‘
  SessionViewPage.jsx         # /p/:pid/s/:sid โ€” ๋Œ€ํ™” + ์‚ฌ์ด๋“œ ํŒจ๋„
  ...
export-template/              # HTML ํ…œํ”Œ๋ฆฟ (CSS) + viewer.js (/preview edit-mode ์ „์šฉ, renderMessageHtml.js import)
scripts/                      # viewer.js esbuild ๋ฒˆ๋“ค ์Šคํฌ๋ฆฝํŠธ
data/memos/                   # ๋ฉ”๋ชจ JSON (๋Ÿฐํƒ€์ž„ ์ƒ์„ฑ, gitignored)

๋‹จ์ถ•ํ‚ค

  • / : ์ƒ๋‹จ ๊ฒ€์ƒ‰์ฐฝ ํฌ์ปค์Šค
  • Esc : ๋ชจ๋‹ฌ / ํŽธ์ง‘ textarea / ๋…ธํŠธ ํŽธ์ง‘ ๋‹ซ๊ธฐ
  • ๋ฉ”์‹œ์ง€ ํ–‰ Shift+ํด๋ฆญ : ๋ฒ”์œ„ ์„ ํƒ
  • Add/Edit memo ๋ชจ๋‹ฌ โ€” ์ œ๋ชฉ ์ž…๋ ฅ Enter : ์ €์žฅ / textarea Cmd(Ctrl)+Enter : ์ €์žฅ
  • ๋ฉ”๋ชจ ์ฐธ์กฐ picker โ€” ํ•ญ๋ชฉ ํด๋ฆญ ๋˜๋Š” Enter/Space : ์„ ํƒ ํ† ๊ธ€, Esc : ๋‹ซ๊ธฐ

๋ผ์ด์„ ์Šค

MIT. ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ์ฐธ๊ณ .

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors