git-worktree
npx skills add https://github.com/ssiumha/dots --skill git-worktree
Agent 安装分布
Skill 文档
Git Worktree
Git worktree를 íì©í ë³ë ¬ ê°ë° ê´ë¦¬. ì ì²´ ë¼ì´íì¬ì´í´ ì§ì.
ë¼ì´íì¬ì´í´
graph LR
A[add] --> B[WORK]
B --> C[pr]
C --> D{Merged?}
D -->|Yes| E[cleanup]
D -->|No| B
ë¤ì´ë° 컨벤ì
| í목 | íì | ìì |
|---|---|---|
| ëë í 리 | ../worktrees/{repo}_{feature}_{YYMMDD} |
../worktrees/myapp_login_260113 |
| ë¸ëì¹ | fix/{feature} ëë feature/{feature} |
fix/login, feature/auth |
| feature ì´ë¦ | ì문ì, ì«ì, _, - ë§ íì© |
login, user-auth, api_v2 |
.worktree.json ì¤í¤ë§
ê° worktree 루í¸ì ìì±ëë ì¤ì íì¼. í¬í¸ ê´ë¦¬, íê²½ë³ì, ì¤í¬ë¦½í¸ ì ì.
{
"feature": "login",
"created": "2025-01-20",
"ports": {
"api": 3001,
"db": 5433,
"dev": 5173
},
"env": {
"PORT": "{{ports.api}}",
"DB_PORT": "{{ports.db}}",
"CORS_ORIGINS": "http://localhost:{{ports.dev}}"
},
"scripts": {
"dev": "pnpm dev",
"test": "pnpm test"
}
}
| íë | ì¤ëª | íì |
|---|---|---|
feature |
feature ì´ë¦ | O |
created |
ìì± ì¼ì (YYYY-MM-DD) | O |
ports.* |
í¬í¸ ì ì (api, db, dev ë± ìì ë¡ê²) | – |
env |
íê²½ë³ì ë§µ ({{ports.xxx}} í
í릿 ì§ì) |
– |
scripts |
ì¤í ê°ë¥í ì¤í¬ë¦½í¸ | – |
í¬í¸ í ë¹: 기존 worktreeë¤ì .worktree.jsonì ì¤ìºíì¬ ì¶©ë ìë í¬í¸ ìë í ë¹. íë¡ì í¸ í¹ì±ì ë§ê² ë²ì ì¡°ì .
ëª ë ¹ì´
add {feature} [–type fix|feature]
ì ìì ìì. worktree + ë¸ëì¹ ìì±.
set -e # ìë¬ ì ì¦ì ì¢
ë£
# 1. feature ì´ë¦ ê²ì¦
[[ "{feature}" =~ ^[a-z0-9_-]+$ ]] || {
echo "â feature ì´ë¦: ì문ì, ì«ì, _, - ë§ íì©" >&2
exit 1
}
# 2. worktrees ëë í 리 íì¸
mkdir -p ../worktrees
# 3. ë³ì ì¤ì
REPO=$(basename "$(git rev-parse --show-toplevel)")
DATE=$(date +%y%m%d)
BRANCH_TYPE="${TYPE:-fix}" # ê¸°ë³¸ê° fix, --typeì¼ë¡ ë³ê²½ ê°ë¥
BRANCH="${BRANCH_TYPE}/{feature}"
WORKTREE_PATH="../worktrees/${REPO}_{feature}_${DATE}"
# 4. 기존 worktree íì¸ (ì íí ê²½ê³ ë§¤ì¹)
# WHY: ë¶ë¶ 문ìì´ ì¤í ë°©ì§ (login vs login2)
PATTERN="/${REPO}_{feature}_[0-9]{6}(\s|$)"
if git worktree list | grep -Eq "$PATTERN"; then
EXISTING=$(git worktree list | grep -E "$PATTERN" | awk '{print $1}' | head -1)
echo "â ï¸ ì´ë¯¸ ì¡´ì¬: ${EXISTING}"
echo "ð cd ${EXISTING}"
exit 0
fi
# 5. ë¸ëì¹ ì¶©ë íì¸
if git show-ref --verify --quiet "refs/heads/${BRANCH}"; then
BRANCH="${BRANCH}-${DATE}"
echo "â ï¸ ë¸ëì¹ ì¶©ë. ë³ê²½: ${BRANCH}"
fi
# 6. base ë¸ëì¹ ê°ì§ (ê²ì¦ í¬í¨)
# WHY: origin/HEAD ì°ì , ìì¼ë©´ main/master fallback
BASE=$(git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's|origin/||')
if [ -z "$BASE" ]; then
if git show-ref --verify --quiet refs/remotes/origin/main; then
BASE="main"
elif git show-ref --verify --quiet refs/remotes/origin/master; then
BASE="master"
else
echo "â base ë¸ëì¹ë¥¼ ì°¾ì ì ììµëë¤" >&2
echo "ð¡ ë¤ì ëª
ë ¹ì´ë¡ ì¤ì íì¸ì:" >&2
echo " git remote set-head origin main" >&2
exit 1
fi
fi
# 7. worktree ìì±
git worktree add "${WORKTREE_PATH}" -b "${BRANCH}" "origin/${BASE}"
# 8. .worktree.json ìì± (í¬í¸ ìë í ë¹)
# WHY: ë©í° worktree íê²½ìì í¬í¸ ì¶©ë ë°©ì§
allocate_port() {
local base=$1 key=$2
local used_ports=$(find ../worktrees -name ".worktree.json" -exec cat {} \; 2>/dev/null | \
grep -o "\"$key\": *[0-9]*" | grep -o '[0-9]*' | sort -n)
local port=$base
while echo "$used_ports" | grep -q "^${port}$"; do
port=$((port + 1))
done
echo $port
}
API_PORT=$(allocate_port 3001 "api")
DB_PORT=$(allocate_port 5433 "db")
DEV_PORT=$(allocate_port 5173 "dev")
cat > "${WORKTREE_PATH}/.worktree.json" << EOF
{
"feature": "{feature}",
"created": "$(date +%Y-%m-%d)",
"ports": {
"api": ${API_PORT},
"db": ${DB_PORT},
"dev": ${DEV_PORT}
},
"env": {
"PORT": "{{ports.api}}",
"DB_PORT": "{{ports.db}}",
"CORS_ORIGINS": "http://localhost:{{ports.dev}}"
},
"scripts": {
"dev": "pnpm dev",
"test": "pnpm test"
}
}
EOF
echo "â
worktree ìì±: ${WORKTREE_PATH}"
echo "ð cd ${WORKTREE_PATH}"
echo "ð í¬í¸: api=${API_PORT}, db=${DB_PORT}, dev=${DEV_PORT}"
list
íì¬ worktree ëª©ë¡ + PR ìí íì¸.
echo "PATH BRANCH PR STATUS"
echo "================================================================"
git worktree list --porcelain | grep "^worktree" | sed 's/worktree //' | while read path; do
BRANCH=$(git -C "$path" branch --show-current 2>/dev/null || echo "-")
if [ "$BRANCH" != "-" ]; then
PR=$(gh pr list --head "$BRANCH" --json number,state --jq '.[0] | "#\(.number) (\(.state))"' 2>/dev/null || echo "-")
else
PR="-"
fi
printf "%-35s %-20s %s\n" "$path" "$BRANCH" "$PR"
done
switch {feature}
ë¤ë¥¸ worktreeë¡ ì í ìë´.
WORKTREE=$(git worktree list | grep "{feature}" | awk '{print $1}')
if [ -z "$WORKTREE" ]; then
echo "â worktree를 ì°¾ì ì ìì: {feature}"
echo "ð¡ git worktree list ë¡ íì¸íì¸ì"
exit 1
fi
echo "ð ë¤ì ëª
ë ¹ì´ë¥¼ ì¤ííì¸ì:"
echo " cd ${WORKTREE}"
ì°¸ê³ : Claudeë ì§ì cd ë¶ê°. ì¬ì©ììê² ê²½ë¡ ìë´.
pr {feature}
PR ìì±. ì¬ì©ììê² ëª ë ¹ì´ ì ê³µ.
WORKTREE=$(git worktree list | grep "{feature}" | awk '{print $1}')
BRANCH=$(git -C "$WORKTREE" branch --show-current)
echo "ð ë¤ì ëª
ë ¹ì´ë¥¼ ììëë¡ ì¤ííì¸ì:"
echo ""
echo " cd ${WORKTREE}"
echo " git push -u origin ${BRANCH}"
echo " gh pr create --title '${BRANCH}: ...' --body '...'"
ëë worktree ë´ìì ì§ì ì¤í:
# worktree ëë í 리ìì ì¤í
git push -u origin "$(git branch --show-current)"
gh pr create
cleanup {feature} [–force] [–delete-remote]
머ì§ë ìì ì 리. worktree + ë¸ëì¹ ìì .
# 1. worktree ê²½ë¡ ì°¾ê¸°
WORKTREE=$(git worktree list | grep "{feature}" | awk '{print $1}')
BRANCH=$(git -C "$WORKTREE" branch --show-current 2>/dev/null)
if [ -z "$WORKTREE" ]; then
echo "â worktree를 ì°¾ì ì ìì: {feature}"
exit 1
fi
# 2. PR ë¨¸ì§ ìí íì¸
STATE=$(gh pr list --head "$BRANCH" --state all --json state --jq '.[0].state' 2>/dev/null)
if [ "$STATE" != "MERGED" ] && [ "$FORCE" != "true" ]; then
echo "â PRì´ ë¨¸ì§ëì§ ìì (state: ${STATE:-unknown})"
echo "ð¡ ê°ì ìì : cleanup {feature} --force"
exit 1
fi
# 3. ë³ê²½ì¬í íì¸ (í ë²ì ì²´í¬)
STATUS=$(git -C "${WORKTREE}" status --porcelain)
if [ -n "$STATUS" ]; then
echo "â 커ë°ëì§ ìì ë³ê²½:"
echo "$STATUS"
# untracked íì¼(??ë¡ ìì) ìì¼ë©´ ì¶ê° ê²½ê³
if echo "$STATUS" | grep -q "^??"; then
echo ""
echo "â ï¸ untracked íì¼(??)ì ìì ë©ëë¤. ë³´ì¡´ íì ì:"
else
echo ""
echo "ð¡ ìµì
:"
fi
echo " 1) git -C ${WORKTREE} stash -u # untracked í¬í¨ stash"
echo " 2) git -C ${WORKTREE} add -A && git -C ${WORKTREE} commit -m 'wip'"
exit 1
fi
# 4. worktree ì ê±°
git worktree remove "${WORKTREE}"
echo "â
worktree ì ê±°: ${WORKTREE}"
# 5. ë¡ì»¬ ë¸ëì¹ ìì
if ! git branch -d "${BRANCH}" 2>/dev/null; then
echo "â ï¸ ë¸ëì¹ê° ìì í 머ì§ëì§ ìì. ê°ì ìì ì¤..."
git branch -D "${BRANCH}"
fi
echo "â
ë¡ì»¬ ë¸ëì¹ ìì : ${BRANCH}"
# 6. ì격 ë¸ëì¹ ìì (--delete-remote íëê·¸ë¡ ìëí ê°ë¥)
if [ "$DELETE_REMOTE" = "true" ]; then
git push origin --delete "${BRANCH}" 2>/dev/null || echo "â ï¸ ì격 ë¸ëì¹ ìì ì¤í¨ (ì´ë¯¸ ìì ë¨)"
echo "â
ì격 ë¸ëì¹ ìì : ${BRANCH}"
else
echo ""
echo "ð¡ ì격 ë¸ëì¹ë ìì íë ¤ë©´:"
echo " git push origin --delete ${BRANCH}"
fi
# 7. ê´ë ¨ íì¼ ì 리 (ìì¼ë©´)
# .plan ëë í 리 ë´ ê´ë ¨ íì¼ ìì
if [ -d ".plan" ]; then
if find .plan \( -name "*{feature}*" -o -name "*${BRANCH}*" \) -print -quit 2>/dev/null | grep -q .; then
find .plan \( -name "*{feature}*" -o -name "*${BRANCH}*" \) -print0 2>/dev/null | xargs -0 rm -f
echo "â
.plan íì¼ ìì "
fi
fi
# .tmp/ports.jsonìì í´ë¹ í목 ì ê±°
if [ -f ".tmp/ports.json" ] && command -v jq &>/dev/null; then
if jq -e ".[\"{feature}\"]" .tmp/ports.json &>/dev/null; then
jq "del(.[\"{feature}\"])" .tmp/ports.json > .tmp/ports.json.tmp
mv .tmp/ports.json.tmp .tmp/ports.json
echo "â
ports.json ì 리"
fi
fi
prune
ê³ ì worktree ì¼ê´ ì 리.
PRUNABLE=$(git worktree list --porcelain | grep -c "prunable" 2>/dev/null || echo 0)
if [ "$PRUNABLE" -eq 0 ]; then
echo "â
ì 리í ê³ ì worktree ìì"
else
echo "ðï¸ ${PRUNABLE}ê° ê³ ì worktree ì 리 ì¤..."
git worktree prune -v
echo "â
ì 리 ìë£"
fi
ports
모ë worktreeì í¬í¸ í ë¹ íí© íì¸.
echo "WORKTREE API DB DEV ACTIVE"
echo "============================================================="
find ../worktrees -name ".worktree.json" 2>/dev/null | while read config; do
WORKTREE_DIR=$(dirname "$config")
WORKTREE_NAME=$(basename "$WORKTREE_DIR")
API=$(jq -r '.ports.api // "-"' "$config" 2>/dev/null)
DB=$(jq -r '.ports.db // "-"' "$config" 2>/dev/null)
DEV=$(jq -r '.ports.dev // "-"' "$config" 2>/dev/null)
# ì¤ì ì¬ì© ì¤ì¸ì§ lsofë¡ íì¸
ACTIVE=""
[ "$API" != "-" ] && lsof -i:$API &>/dev/null && ACTIVE="${ACTIVE}api "
[ "$DB" != "-" ] && lsof -i:$DB &>/dev/null && ACTIVE="${ACTIVE}db "
[ "$DEV" != "-" ] && lsof -i:$DEV &>/dev/null && ACTIVE="${ACTIVE}dev "
printf "%-35s %-6s %-6s %-6s %s\n" "$WORKTREE_NAME" "$API" "$DB" "$DEV" "${ACTIVE:--}"
done
run {script_name}
.worktree.jsonì envì scripts 기ë°ì¼ë¡ ì¤í.
# íì¬ ëë í 리ìì .worktree.json íì¸
if [ ! -f ".worktree.json" ]; then
echo "â .worktree.jsonì´ ììµëë¤. worktree 루í¸ìì ì¤ííì¸ì."
exit 1
fi
SCRIPT=$(jq -r ".scripts[\"{script_name}\"] // empty" .worktree.json)
if [ -z "$SCRIPT" ]; then
echo "â ì¤í¬ë¦½í¸ë¥¼ ì°¾ì ì ìì: {script_name}"
echo "ð¡ ì¬ì© ê°ë¥í ì¤í¬ë¦½í¸:"
jq -r '.scripts | keys[]' .worktree.json 2>/dev/null | sed 's/^/ /'
exit 1
fi
# {{ports.xxx}} í
í릿 ë³ì ì¹í
resolve_template() {
local value="$1"
local api=$(jq -r '.ports.api // ""' .worktree.json)
local db=$(jq -r '.ports.db // ""' .worktree.json)
local dev=$(jq -r '.ports.dev // ""' .worktree.json)
echo "$value" | sed "s/{{ports.api}}/$api/g" | sed "s/{{ports.db}}/$db/g" | sed "s/{{ports.dev}}/$dev/g"
}
# env íê²½ë³ì 구ì±
ENV_VARS=""
for key in $(jq -r '.env | keys[]' .worktree.json 2>/dev/null); do
raw_value=$(jq -r ".env[\"$key\"]" .worktree.json)
resolved=$(resolve_template "$raw_value")
ENV_VARS="${ENV_VARS}${key}=${resolved} "
done
echo "ð ì¤í: ${ENV_VARS}${SCRIPT}"
eval "${ENV_VARS}${SCRIPT}"
ì¬ì© ìì:
cd ../worktrees/myapp_login_260113
# .worktree.jsonì scripts.dev ì¤í (env ìë ì ì©)
# â PORT=3001 DB_PORT=5433 CORS_ORIGINS=http://localhost:5173 pnpm dev
ê³ ì Worktree (Persistent)
ìì worktreeì ë¬ë¦¬ ìì ì ì§ëë worktree. í¹ì 목ì (문ìí, 모ëí°ë§ ë±)ì ì ì©.
ë¤ì´ë°
| í목 | íì | ìì |
|---|---|---|
| ëë í 리 | wt/_{purpose}/ |
wt/_quality/, wt/_docs/ |
| ë¸ëì¹ | _{purpose} |
_quality, _docs |
_ prefixë¡ ìì worktreeì 구ë¶.
ë¼ì´íì¬ì´í´
graph LR
A[create] --> B[ì¸ì
ìì: rebase main]
B --> C[WORK]
C --> D{ë³ê²½ ì¶ì ?}
D -->|Yes| E[주기ì PR]
E --> F{Merged?}
F -->|Yes| B
F -->|No| C
D -->|No| B
create {purpose}
ê³ ì worktree ìì±. í ë²ë§ ì¤í.
set -e
PURPOSE="{purpose}"
WORKTREE_PATH="wt/_${PURPOSE}"
BRANCH="_${PURPOSE}"
# ì´ë¯¸ ì¡´ì¬ íì¸
if [ -d "$WORKTREE_PATH" ]; then
echo "â ï¸ ì´ë¯¸ ì¡´ì¬: ${WORKTREE_PATH}"
exit 0
fi
# base ë¸ëì¹ ê°ì§
BASE=$(git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's|origin/||')
[ -z "$BASE" ] && BASE="main"
# worktree ìì±
git worktree add "${WORKTREE_PATH}" -b "${BRANCH}" "origin/${BASE}"
echo "â
ê³ ì worktree ìì±: ${WORKTREE_PATH}"
echo "ð cd ${WORKTREE_PATH}"
sync
ê³ ì worktree ì ì©. ì¸ì
ìì ì wt/_*/ í¨í´ì ê³ ì worktreeë§ mainì rebase.
ìì worktree(wt/feat-*, ../worktrees/*)ë ëìì´ ìëë¤.
for wt in wt/_*/; do
[ -d "$wt" ] || continue
BRANCH=$(git -C "$wt" branch --show-current)
echo "ð ${wt} (${BRANCH})..."
git -C "$wt" fetch origin
git -C "$wt" rebase "origin/main" || {
echo "â rebase ì¶©ë: ${wt}"
echo "ð¡ git -C ${wt} rebase --abort í ìë í´ê²°"
continue
}
echo "â
${wt} ë기í ìë£"
done
ì´ì ê·ì¹
| ê·ì¹ | ì¤ëª |
|---|---|
| ìì ê¸ì§ | ì구 ì ì§. cleanup ëì ìë |
| ì¸ì ìì ì sync | main rebaseë¡ ìµì ìí ì ì§ |
| 주기ì PR | ë³ê²½ ì¶ì í batch PRë¡ main ë°ì |
| ë 립 ì´ì | ê³ ì worktree ê° ìì¡´ì± ìì |
ì¼ë°ì ì©ë
| ì©ë | worktree | ì¤ëª |
|---|---|---|
| í ì¤í¸ ê°ì | wt/_quality/ |
커ë²ë¦¬ì§ ì¶ì , ì í©ì± 모ëí°ë§ |
| 문ì/ë¶ì | wt/_docs/ |
ì½ë ë¶ì, ìí¤í ì² ë¬¸ì ì¶ì |
| ì¤í | wt/_lab/ |
íë¡í íì , PoC |
íë¡ì¸ì¤ ì¢ ë£ ìì¹
ë©í° worktree íê²½ìì ë¤ë¥¸ ìì ììê² ìí¥ì ì£¼ì§ ìëë¡ ì£¼ì.
| ê¸ì§ | íì© |
|---|---|
pkill -f "node" |
PID 기ë°: kill $(cat .pid) |
pkill -f "nest" |
ê²½ë¡ ê¸°ë°: pkill -f "worktrees/myapp_login.*node" |
kill $(lsof -t -i:3000) |
lsof íì¸ í ê²½ë¡ ê²ì¦ |
ìì í ì¢ ë£ í¨í´:
# ë°©ë² 1: PID íì¼ ì¬ì©
pnpm dev & echo $! > .pid
kill $(cat .pid)
# ë°©ë² 2: í¹ì worktree ê²½ë¡ë¡ íí°ë§
pkill -f "worktrees/myapp_login.*node"
# ë°©ë² 3: lsofë¡ íì¸ í ê²½ë¡ ê²ì¦
lsof -i:3001 # PIDì COMMAND íì¸
# í´ë¹ PIDê° ìì ì worktreeì¸ì§ íì¸ í ì¢
ë£
# ë°©ë² 4: tmux ì¸ì
ì¬ì©
tmux kill-session -t my-dev-server
ì¢ ë£ ì íì¸ì¬í:
- í´ë¹ íë¡ì¸ì¤ê° ìì ì worktreeìì ì¤íë ê²ì¸ì§ íì¸
- ë¤ë¥¸ í°ë¯¸ë/tmux ì¸ì ìì ì¤í ì¤ì¸ ìì ì´ ìëì§ íì¸
- ë¶íì¤íë©´
lsof -i:{port}ë¡ ë¨¼ì íì¸
ì¤ì ìì¹
- ë 립ì ìì ê³µê°: ê° worktreeë ìì í ë 립ë ìì íê²½ ì ê³µ
- ë¤ì´ë° ì¼ê´ì±:
{repo}_{feature}_{YYMMDD}íìì¼ë¡ ì¶ì ì©ì´ - ìì í ì 리: PR ë¨¸ì§ íì¸ í cleanup, ê°ì ìì ë ëª ìì íëê·¸ íì
- Claude ì ì½ ì¸ì: cd ë¶ê° â ê²½ë¡ ìë´, ì¬ì©ìê° ì§ì ì´ë
ìì ì¥ì¹
| ìí© | ëì | ì°í ë°©ë² |
|---|---|---|
| cleanup ì PR ë¯¸ë¨¸ì§ | ì°¨ë¨ | --force íëê·¸ |
| cleanup ì uncommitted ë³ê²½ | ì°¨ë¨ + stash ìë´ | stash -u ëë commit í ì¬ìë |
| cleanup ì untracked íì¼ | ê²½ê³ + ì°¨ë¨ | commitì¼ë¡ ë³´ì¡´ ëë ìì íì¸ |
| ì´ë¯¸ ì¡´ì¬íë worktree | 기존 ê²½ë¡ ìë´ | 기존 worktree ì¬ì© |
| ì격 ë¸ëì¹ ìì | ëª ë ¹ì´ë§ ì ê³µ | --delete-remote íëê·¸ |
| .plan íì¼ | ê´ë ¨ íì¼ ìë ìì | feature/ë¸ëì¹ ì´ë¦ ë§¤ì¹ |
| ports.json | í´ë¹ í목 ìë ì ê±° | jq ì¤ì¹ íì |
| feature ì´ë¦ ê·ì¹ ìë° | ì°¨ë¨ | ê·ì¹ì ë§ê² ìì |
Examples
ì ê¸°ë¥ ìì ìì
User: "login ê¸°ë¥ ìì
ìì"
â add login â worktree ìì±
â ê²°ê³¼: "cd ../worktrees/myapp_login_260113"
ëê·ëª¨ ê¸°ë¥ (feature ë¸ëì¹)
User: "auth ê¸°ë¥ ìì
, feature ë¸ëì¹ë¡"
â add auth --type feature â ë¸ëì¹: feature/auth
â ê²°ê³¼: "cd ../worktrees/myapp_auth_260113"
ìì ìë£ í PR
User: "login PR ë§ë¤ì´ì¤"
â pr login â ëª
ë ¹ì´ ìë´
â ê²°ê³¼: cd, push, gh pr create ìì ì ê³µ
ë¨¸ì§ í ì 리
User: "login ì 리í´ì¤"
â cleanup login â PR ë¨¸ì§ íì¸ â worktree ì ê±° â ë¸ëì¹ ìì
â ê²°ê³¼: "â
ì 리 ìë£"
ê°ì ì 리 (PR ìì´)
User: "login ê°ì ìì "
â cleanup login --force â worktree + ë¸ëì¹ ìì (PR ìí 무ì)
â ê²°ê³¼: "â
ê°ì ìì ìë£"
ì ì²´ íí© íì¸
User: "worktree 목ë¡"
â list â í
ì´ë¸ ì¶ë ¥
â ê²°ê³¼: ê²½ë¡, ë¸ëì¹, PR ìí íì
ê´ë ¨ íì¼ í¬í¨ ì 리
User: "stats-page ì 리í´ì¤"
â cleanup stats-page â worktree ì ê±° â ë¸ëì¹ ìì â .plan/ports.json ì 리
â ê²°ê³¼: "â
ì 리 ìë£"
í¬í¸ íí© íì¸
User: "í¬í¸ íí© ë³´ì¬ì¤"
â ports â 모ë worktree ì¤ìº
â ê²°ê³¼:
WORKTREE API DB DEV ACTIVE
=============================================================
myapp_login_260113 3001 5433 5173 api dev
myapp_auth_260115 3002 5434 5174 -
ì¤í¬ë¦½í¸ ì¤í
User: "dev ìë² ì¤íí´ì¤"
â run dev â .worktree.jsonì env + scripts.dev ì¤í
â ê²°ê³¼: "ð ì¤í: PORT=3001 DB_PORT=5433 CORS_ORIGINS=http://localhost:5173 pnpm dev"
ì worktree ìì± (í¬í¸ ìë í ë¹)
User: "payment ê¸°ë¥ ìì
ìì"
â add payment â worktree ìì± + .worktree.json ìë ìì±
â ê²°ê³¼:
â
worktree ìì±: ../worktrees/myapp_payment_260120
ð cd ../worktrees/myapp_payment_260120
ð í¬í¸: api=3003, db=5435, dev=5175