Skip to content

Latest commit

ย 

History

History
87 lines (67 loc) ยท 7.38 KB

File metadata and controls

87 lines (67 loc) ยท 7.38 KB
title Worktree ์„ธ์…˜ ์—ฐ์†์„ฑ๊ณผ ์‹๋ณ„์„ฑ ์›์น™
tags
worktree
session
revive
fork-panel
panel-inbox
handoff
conductor
switch
resume
title
continuity
context
์›ŒํฌํŠธ๋ฆฌ
์„ธ์…˜
category workflow
status active
confidence high
applies_to
extensions/worktree
/wt switch
/wt resume
/wt sessions
extensions/fork-panel
session_info.name
revive workflow
panels inbox
handoff done workflow
source
pilee-history:2026-05-04#38
pilee-history:2026-05-05#39
pilee-history:2026-05-05#40
pilee-history:2026-05-05#41
pilee-history:2026-05-05#42
user-direction:2026-05-07-local-resolver
user-direction:2026-05-12-wt-switch-session-unification
user-direction:2026-05-12-minimal-worktree-handoff
user-direction:2026-05-17-full-worktree-fork-default
reviewed_at 2026-06-02
reviewed_commit 63f2a622f7539ebd582b9af2b392c6de9ee47d47
related
subagent-model-policy
pilee-knowledge-system
frame-plan-synthesis-continuity

Overview

pilee์˜ worktree/fork UX๋Š” โ€œ์„ธ์…˜์„ ๋งŽ์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹คโ€๋ณด๋‹ค โ€œ๋‚˜์ค‘์— ์–ด๋–ค ์„ธ์…˜์ด ๋ฌด์—‡์ด์—ˆ๋Š”์ง€ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹คโ€๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„ธ์…˜ ๋ชฉ๋ก์€ ํŒŒ์ผ๋ช…์ด๋‚˜ ๋ฐฉํ–ฅ label๋ณด๋‹ค ์‚ฌ๋žŒ์ด ๊ธฐ์–ตํ•˜๋Š” ์ œ๋ชฉ, ๋งˆ์ง€๋ง‰ ์˜๋ฏธ ์žˆ๋Š” ์š”์ฒญ, workspace ์ •๋ณด๋ฅผ ์šฐ์„  ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

Identification Rule

์„ธ์…˜ ์‹๋ณ„์ž๋Š” ๋‚ด๋ถ€ ํŒŒ์ผ๋ช…๋ณด๋‹ค session_info.name์„ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. footer์— ๋ณด์ด๋Š” ์„ธ์…˜๋ช…์€ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๋ณธ ์ œ๋ชฉ์ด๋ฏ€๋กœ, revive๋‚˜ worktree switch ๋ชฉ๋ก์—์„œ ๊ฐ€์žฅ ๊ฐ•ํ•œ ์‹๋ณ„ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์„ธ์…˜๋ช…์ด ์—†๊ฑฐ๋‚˜ ์˜๋ฏธ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋งˆ์ง€๋ง‰ user/assistant ๋ฉ”์‹œ์ง€ ์š”์•ฝ์œผ๋กœ fallbackํ•ฉ๋‹ˆ๋‹ค.

Continuity Rule

fork-panel์—์„œ ์ข…๋ฃŒ๋œ ๋Œ€ํ™”๋Š” transcript๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ธ์…˜ ์ž์ฒด๋ฅผ ๋‹ค์‹œ ์‚ด๋ฆฌ๋Š” ํŽธ์ด ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํšŒ์ˆ˜ ํ๋ฆ„์€ /recall์‹ ๋ณต์‚ฌ๋ณด๋‹ค /revive์‹ ์žฌ๊ฐœ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋ชฉ๋ก์€ ํ˜„์žฌ workspace๋ฅผ ๊ธฐ๋ณธ scope๋กœ ๋ณด์—ฌ์ฃผ๋˜, ํ•„์š”ํ•  ๋•Œ ์ „์ฒด workspace๋ฅผ ํ™•์žฅํ•ด ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™ˆ/planning ์„ธ์…˜์—์„œ ๋งŒ๋“  ticket-bound frame.json์€ worktree ์ƒ์„ฑยท์ „ํ™˜ ์‹œ ๊ฐ™์€ ticket์˜ worktree .pi/frame.json์œผ๋กœ ์ž๋™ ์Šน๊ฒฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ธ์…˜ transcript carry์™€ ๋ณ„๊ฐœ๋กœ canonical ๊ณ„์•ฝ์„ ์˜ฎ๊ธฐ๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. /wt fork์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž๊ฐ€ โ€œํ˜„์žฌ ๋Œ€ํ™”์—์„œ worktree๋กœ ๋ถ„๊ธฐํ•œ๋‹คโ€๊ณ  ๊ธฐ๋Œ€ํ•˜๋Š” ํ๋ฆ„์€ ์ „์ฒด transcript๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋ณต์‚ฌํ•ด์•ผ โ€œ๊ฐ™์€ ์ž‘์—…์ด ์‹คํ–‰ ๊ณต๊ฐ„์„ ์–ป์—ˆ๋‹คโ€๋Š” ์—ฐ์†์„ฑ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์ด๋•Œ planning work-unit์˜ task board๋„ ์ƒˆ worktree .pi/work-tasks.json์œผ๋กœ ํ•จ๊ป˜ ์Šน๊ฒฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. frame๋งŒ ์Šน๊ฒฉ๋˜๊ณ  slice/verify task๊ฐ€ ๋น„๋ฉด overlay๊ฐ€ ๋นˆ ์ž‘์—…์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ์„ธ์…˜ ์—ฐ์†์„ฑ์ด ๊นจ์ง‘๋‹ˆ๋‹ค. ํ† ํฐ/์˜ค์—ผ ์œ„ํ—˜ ๋•Œ๋ฌธ์— ๊ฐ€๋ณ๊ฒŒ ๋„˜๊ธฐ๊ณ  ์‹ถ์„ ๋•Œ๋งŒ --minimal-context / minimalContext: true๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

Worktree Entry Rule

๊ธฐ๋ณธ ์ง„์ž…์ ์€ /wt switch์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—…๊ณต๊ฐ„์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค๋Š” ๊ฒƒ์€ โ€œ์›ŒํฌํŠธ๋ฆฌ๋งŒ ์ด๋™โ€์ด ์•„๋‹ˆ๋ผ โ€œ๊ทธ ์›ŒํฌํŠธ๋ฆฌ ์•ˆ์—์„œ ์ด์–ด๊ฐˆ ์„ธ์…˜์„ ๊ณ ๋ฅธ๋‹คโ€๋Š” ๋œป์ด๋ฏ€๋กœ, /wt switch๋Š” ์›ŒํฌํŠธ๋ฆฌ ์„ ํƒ ๋‹ค์Œ์— ํ•ด๋‹น worktree session picker๊นŒ์ง€ ์ด์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. /wt sessions๋Š” ๋…๋ฆฝ UX๊ฐ€ ์•„๋‹ˆ๋ผ ํ˜ธํ™˜ alias๋กœ ๋‚จ๊ฒจ ๊ฐ™์€ session picker ํ๋ฆ„์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

/wt resume <workspace>๋Š” Conductor workspace ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•œ ์„ธ์…˜๋งŒ ๋ณต๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น workspace์˜ Conductor ์„ธ์…˜ ์ „์ฒด๋ฅผ Pi session์œผ๋กœ hydrateํ•˜๊ณ , ๊ฐ ๋ณ€ํ™˜ ์„ธ์…˜์— source metadata๋ฅผ ๋‚จ๊ฒจ ์žฌ์‹คํ–‰ ์‹œ ์ค‘๋ณต ๋ณ€ํ™˜์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค. hydrate๊ฐ€ ๋๋‚˜๋ฉด /wt switch <workspace>์™€ ๊ฐ™์€ ์„ธ์…˜ ์„ ํƒ ํ๋ฆ„์œผ๋กœ ์ด์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณต๊ตฌ๋œ Pi session ์ž์ฒด๊ฐ€ ์›๋ณธ transcript๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฏ€๋กœ, workspace-level conductor-context.md๊ฐ€ ํŠน์ • active Conductor session ์š”์•ฝ์„ ๋‹ค์Œ turn์— ์ž˜๋ชป ์ฃผ์ž…ํ•˜์ง€ ์•Š๋„๋ก .loaded.md๋กœ ๋ณด์กด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

/revive๋Š” ์ „์—ญ ํšŒ์ˆ˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. P0/P1/P2 ํŒจ๋„, ์ „์ฒด Pi ์„ธ์…˜, split/tab ๋ณต๊ตฌ์ฒ˜๋Ÿผ โ€œ์–ด๋”” ์žˆ๋˜ ์„ธ์…˜์ธ์ง€ ๋ชจ๋ฅด์ง€๋งŒ ๋˜์‚ด๋ฆฐ๋‹คโ€๊ฐ€ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด /wt switch๋Š” โ€œ์ด worktree๋กœ ๋Œ์•„๊ฐ€ ์ด์–ด ํ•œ๋‹คโ€๋Š” ์ž‘์—…๊ณต๊ฐ„ ์ค‘์‹ฌ ์ง„์ž…์ ์ž…๋‹ˆ๋‹ค. ์„ธ์…˜ ๋ชฉ๋ก ๊ธฐ๋Šฅ์ด ๊ฒน์น˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ์–ตํ•ด์•ผ ํ•  ๊ธฐ๋ณธ ๋ช…๋ น์€ /wt switch์™€ /revive ๋‘ ๊ฐœ๋กœ ์ค„์ž…๋‹ˆ๋‹ค.

Context Sharing Rule

worktree ์ƒ์„ฑ์˜ context sharing์€ command ์˜๋ฏธ์— ๋งž์ถฐ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. /wt fork์™€ worktree_fork๋Š” ํ˜„์žฌ ํŒจ๋„ ๋Œ€ํ™”์˜ ์กฐ์‚ฌยทํŒ๋‹จยทํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ด์–ด๋ฐ›๋Š” ๊ฒƒ์ด ์‚ฌ์šฉ์ž ๊ธฐ๋Œ€์ด๋ฏ€๋กœ full transcript๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. P0/P1/P2๋Š” ์œ„์น˜ ํ‘œ์‹œ์ผ ๋ฟ ๊ธฐ๋ณธ source๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ /wt new๋Š” ๊นจ๋—ํ•œ ์„ธ์…˜์ด๊ณ , --minimal-context / minimalContext: true๋ฅผ ๋ช…์‹œํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ตœ๊ทผ user prompt, source session /archive <path> reference, ์„ ํƒ์  summary๋ฅผ ๋‹ด์€ ์ตœ์†Œ ์ „๋‹ฌ pack์„ ๋ถ™์ž…๋‹ˆ๋‹ค.

์ตœ์†Œ ์ „๋‹ฌ ์ •๋ณด๋„ โ€œ๋ณด์กฐ ํžŒํŠธโ€๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ artifact์ž…๋‹ˆ๋‹ค. ์ƒˆ session JSONL์— ์‹ค์ œ worktree-context custom message๋กœ persist๋˜์–ด์•ผ ํ•˜๋ฉฐ, .pi/worktree-meta.json์—๋Š” context.mode, source session file/title/cwd, target session file, full transcript copy ์—ฌ๋ถ€๊ฐ€ ๋‚จ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. UI์˜ cwd binding๋„ ์ „๋ฌธ ๊ณ„์Šน, ์ตœ์†Œ ์ „๋‹ฌ ๋ฉ”๋ชจ ์ €์žฅ, ๋Œ€์ฒด ์ „๋‹ฌ ๋ฉ”๋ชจ ์ €์žฅ์ฒ˜๋Ÿผ ์‹ค์ œ ์ „๋‹ฌ ์ƒํƒœ๋ฅผ ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. handoff๋ฅผ ์ˆจ๊ธด๋‹ค๋Š” ๋œป์€ ์ „๋‹ฌ ์‚ฌ์‹ค์„ ๊ฐ์ถ”๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๋„ handoff ์ ˆ์ฐจ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ๋งŒ worktree๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” UX๋ฅผ ์—†์•ค๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

fork-panel์˜ handoff๋Š” ํŒจ๋„ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ํŒจ๋„์ด ๋‹ซํ˜€์•ผ๋งŒ ๋งฅ๋ฝ์ด ์ „๋‹ฌ๋˜๋Š” ๊ตฌ์กฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํŒจ๋„์„ ์ข…๋ฃŒํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ์ฆ‰์‹œ follow-up ์ฃผ์ž…์€ ๋ถ€๋ชจ ๋Œ€ํ™” ํ๋ฆ„์„ ๋Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ handoff๋Š” parent inbox์— unread ํ•ญ๋ชฉ์œผ๋กœ ์ €์žฅํ•˜๊ณ , ๋ถ€๋ชจ๊ฐ€ /panels์—์„œ ์„ ํƒํ•ด ์ž…๋ ฅ์ฐฝ์— ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ follow-up ์ „์†กํ•  ๋•Œ๋งŒ ๋Œ€ํ™” ์ปจํ…์ŠคํŠธ์— ๋“ค์–ด์˜ต๋‹ˆ๋‹ค.

์ž์‹ ํŒจ๋„์€ ๋ถ€๋ชจ ๊ธฐ์ค€ P1, P2 ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ณ , ๊ทธ label์„ ์ž…๋ ฅ์ฐฝ ๋ฉ”ํƒ€ ์˜์—ญ์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ ํŒจ๋„์€ ๋ช…์‹œ์ ์œผ๋กœ P0๋กœ ํ‘œ์‹œํ•ด ํ˜„์žฌ ์„ธ์…˜์ด handoff์˜ ๊ธฐ์ค€์ ์ž„์„ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. /handoff --inject์™€ /done --inject๋Š” ๋ถ€๋ชจ๋ฅผ ์ฆ‰์‹œ interruptํ•ด๋„ ๋˜๋Š” ์ƒํ™ฉ์—์„œ๋งŒ ์“ฐ๋Š” ๊ฐ•ํ•œ ์˜ต์…˜์ด๊ณ , ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ข…๋ฃŒ fallback์€ inbox ์ €์žฅ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Display Guardrail

TUI ๋ชฉ๋ก row๋Š” ๋ฐ˜๋“œ์‹œ ๋‹จ์ผ ํ–‰์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. preview๋‚˜ label์— newline, code block, ANSI/control ๋ฌธ์ž๊ฐ€ ๋‚จ์•„ ์žˆ์œผ๋ฉด ํ™”๋ฉด ์ „์ฒด๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ์ €์žฅ ๋ฐ์ดํ„ฐ๊ฐ€ multi-line์ด์–ด๋„ ๋ Œ๋”๋ง ๋‹จ๊ณ„์—์„œ ์ •๊ทœํ™”ํ•˜๊ณ  ํญ์„ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Migration Lesson

์™ธ๋ถ€ ์„ธ์…˜ ๊ธฐ๋ก์„ pilee JSONL๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ๋Š” message๋งŒ ์˜ฎ๊ธฐ์ง€ ๋ง๊ณ  ์›๋ณธ ์‹œ์Šคํ…œ์˜ session title๋„ session_info.name์œผ๋กœ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฏธ ์—†๋Š” Untitled๋Š” ์ œ์™ธํ•˜๊ณ , ๋ฉ”์‹œ์ง€๊ฐ€ ์—†๋Š” ์„ธ์…˜์€ title๋งŒ์œผ๋กœ ํŒŒ์ผ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์›์น™์€ subagent-model-policy์ฒ˜๋Ÿผ agent fan-out์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๋” ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค.