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 ์
ร๋ฒํผ(localStorageprojectList.hidden.v1), ํด๋ฐ์Hidden (N)๋ฒํผ์ผ๋ก ์จ๊น ๋ชฉ๋ก ๋ทฐ ์ง์ ,โบ๋ฒํผ์ผ๋ก ๋ณต๊ตฌ - ์ธ์
์จ๊น โ ํ๋ก์ ํธ ๋ทฐ ์ข์ธก ์ธ์
์ฌ์ด๋๋ฐ์ ๊ฐ ํ hover ์
ร๋ฒํผ(localStoragesessionSidebar.hidden.v1), ์ฌ์ด๋๋ฐ ํค๋์Hidden (N)๋ฒํผ์ผ๋ก ์จ๊น ๋ทฐ ์ง์- ํ์ฌ ์ด๋ ค์๋ ์ธ์ ์ ์จ๊ธฐ๋๋ผ๋ ์ฌ์ด๋๋ฐ์์ ์ฆ์ ์ฌ๋ผ์ง์ง ์์ (๋ทฐ ๊น๋นก์ ๋ฐฉ์ง)
- ์จ๊ธด ํ๋ก์ ํธ / ์ธ์
์ ๋ฉ๋ชจ๋
/memosํญ๊ณผ/editorpicker์์๋ ์๋ ์ ์ธ (๊ณต์ ํฌํผ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โ ์ ํญ์์ 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๋๋#/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.js1๊ณณ๋ง ์์ โ 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 ๋ถํฌํจ)
๋ชจ๋ ๋ผ์ฐํธ๋ Fastify(5174) ์์ ์ ๊ณต.
| Method | Path |
|---|---|
GET |
/api/projects |
GET |
/api/projects/:id/sessions |
GET |
/api/projects/:id/sessions/:sessionId |
GET |
/api/sessions/:sessionId/watch (SSE) |
| 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 |
๋ฉ๋ชจ ์ญ์ |
| Method | Path |
|---|---|
GET |
/api/memos |
| 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> |
| 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 |
์๊ฒฉ ์ธ์ ๋ด์ฉ |
- ์ธ์ ์ ์ฐ ๋ค ๋ฉ์์ง ํ์ ํด๋ฆญํ๋ฉด ์ ํ, ์ฌ๋ฌ ํ ์๋ก ๋๋๊ทธํ๋ฉด ์ผ๊ด ์ ํ (ํ ๋ด ๋๋๊ทธ๋ ํ ์คํธ ๋ณต์ฌ๋ก ๋์)
- Shift+ํด๋ฆญ์ผ๋ก ๋ฒ์ ์ ํ, ํค๋์
select all์ฒดํฌ๋ฐ์ค๋ก ์ ์ฒด ์ ํ - ํ๋จ ํ๋กํ
๋ฐ์ Add memo โ ์ ๋ชฉ(์ ํ) + ๋
ธํธ(Markdown) ์์ฑ ํ Save
- ์ ๋ชฉ ์
๋ ฅ๋์์
Enterโ ์ฆ์ ์ ์ฅ, ๋ ธํธ textarea์์Cmd/Ctrl+Enterโ ์ ์ฅ
- ์ ๋ชฉ ์
๋ ฅ๋์์
- ์ฐ์ธก ๋ฉ๋ชจ ํจ๋์ ์นด๋๊ฐ ์ถ๊ฐ๋จ โ ๋๋๊ทธ๋ก ์์ ๋ณ๊ฒฝ, ํด๋ฆญ์ผ๋ก ์๋ณธ ๋ฉ์์ง๋ก ์ ํ, Edit (์ ๋ชฉ/๋ ธํธ) / Edit Message (๋ฉ์์ง ์์) / Delete
- ๋ฉ๋ชจ ์นด๋์ Edit Message ๋ฒํผ ํด๋ฆญ โ ํด๋น ๋ฉ๋ชจ๊ฐ ํ๋ accent๋ก ๊ฐ์กฐ๋๊ณ ์์ ๋ฉ์์ง๋ค์ด
.selected์ํ๋ก ๋ฏธ๋ฆฌ ์ฑ์์ง - ๋ค๋ฅธ ํ ํด๋ฆญ์ผ๋ก ํฌํจ ์ถ๊ฐ, ์ด๋ฏธ ์ํ ํ ํด๋ฆญ์ผ๋ก ์ ๊ฑฐ, ๋๋๊ทธ/Shift+ํด๋ฆญ์ผ๋ก ์ผ๊ด ํ ๊ธ
- ํ๋จ ๋ฐ์ Save ๋๋ฅด๋ฉด
messageUuids๊ต์ฒด ์ปค๋ฐ, Cancel์ ์๋๋๋ก ๋ณต๊ตฌ - ํธ์ง ์ค์ ๋ค๋ฅธ ๋ฉ๋ชจ ์นด๋์ 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ํด๋ฆญ โ#/editor - ๋ฌธ์ ์ ๋ชฉ / ์ธํธ๋ก ์์ฑ
+ ๋ฉ๋ชจ ์ฐธ์กฐ ์ถ๊ฐโ picker์์ ๊ฒ์(title / note / ๋ํ ์๋ฌธ) โ ๋ค์ค ์ ํ ํAdd (N)- ๋ธ๋ก ์์ ์กฐ์ (๋๋๊ทธ ๋๋ โโ), title / note ์ธ๋ผ์ธ ํธ์ง(์๋ณธ ๋ฉ๋ชจ๋ ๋ณ๊ฒฝ ์์)
- Download HTML / Copy MD / Preview ํ ๊ธ
- ์์ ์ค ๋ด์ฉ์ localStorage์ ์๋ ์ ์ฅ
์ธ์
ํค๋์ 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: ์ ์ฅ / textareaCmd(Ctrl)+Enter: ์ ์ฅ - ๋ฉ๋ชจ ์ฐธ์กฐ picker โ ํญ๋ชฉ ํด๋ฆญ ๋๋
Enter/Space: ์ ํ ํ ๊ธ,Esc: ๋ซ๊ธฐ
MIT. ์์ธํ ๋ด์ฉ์ LICENSE ์ฐธ๊ณ .
