Reorganizare documentație și adăugare scripturi

- README.md nou cu documentație completă: concept, workflow-uri,
  configurare SSH prin Proxmox, Tailscale, troubleshooting
- CLAUDE.md simplificat - doar reguli pentru mod non-interactiv
- Șters SETUP-COMPLETE.md (conținut mutat în README)
- claudep.sh - script pentru task-uri în background cu logging
- work.sh - actualizat
- .gitignore - adăugat node_modules, Python, IDE, build outputs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-01-01 21:04:56 +00:00
parent 193b94c94f
commit f05f4a5516
6 changed files with 1129 additions and 243 deletions

500
work.sh
View File

@@ -102,8 +102,8 @@ select_work_mode() {
echo -e " ${BOLD}1)${NC} ${GREEN}Feature nou${NC} ${CYAN}(worktree separat)${NC}"
echo -e " └─ Creează branch + worktree izolat pentru dezvoltare"
echo ""
echo -e " ${BOLD}2)${NC} ${YELLOW}Task temporar${NC} ${CYAN}(fără worktree)${NC}"
echo -e " └─ Documente, analiză, rezultate temporare"
echo -e " ${BOLD}2)${NC} ${YELLOW}Task temporar${NC} ${CYAN}(background, fără worktree)${NC}"
echo -e " └─ Rulează în background, revine la meniu"
echo ""
echo -e " ${BOLD}3)${NC} ${BLUE}Mod interactiv${NC} ${CYAN}(claude normal)${NC}"
echo -e " └─ Pornește Claude interactiv pe branch-ul curent"
@@ -111,14 +111,27 @@ select_work_mode() {
echo -e " ${BOLD}4)${NC} ${MAGENTA}Gestionare worktrees${NC}"
echo -e " └─ Vezi, șterge worktrees existente"
echo ""
echo -e " ${BOLD}5)${NC} ${CYAN}Vezi task-uri active${NC}"
echo -e " └─ Log-uri recente și procese Claude active"
echo ""
echo -e " ${BOLD}b)${NC} Înapoi la selectare proiect"
echo -e " ${BOLD}q)${NC} ${RED}Ieșire${NC}"
echo ""
read -p "Alege mod [1-4]: " mode_choice
read -p "Alege mod [1-5/b/q]: " mode_choice
case $mode_choice in
1) WORK_MODE="feature" ;;
2) WORK_MODE="temp" ;;
3) WORK_MODE="interactive" ;;
4) WORK_MODE="manage" ;;
5) WORK_MODE="status" ;;
b|B) WORK_MODE="back" ;;
q|Q)
echo ""
print_info "La revedere!"
exit 0
;;
*)
print_error "Opțiune invalidă"
exit 1
@@ -221,7 +234,170 @@ create_worktree() {
}
# ============================================================================
# Rulează Claude cu monitorizare progres
# Rulează Claude în background cu log procesat
# ============================================================================
run_claude_background() {
local work_dir="$1"
local prompt="$2"
local log_file="$3"
# Log procesat (mesaje utile, nu JSON brut)
local processed_log="${log_file%.log}_progress.log"
# Fișier PID pentru tracking
local pid_file="${log_file%.log}.pid"
mkdir -p "$LOG_DIR"
print_section "Lansare Claude în background"
echo -e "${CYAN}Director:${NC} $work_dir"
echo -e "${CYAN}Prompt:${NC} $prompt"
echo ""
# Salvează prompt-ul într-un fișier temporar
local prompt_file=$(mktemp)
echo "$prompt" > "$prompt_file"
# Inițializează log-ul procesat
{
echo "═══════════════════════════════════════════════════════════════"
echo " Claude Code - Task Background"
echo "═══════════════════════════════════════════════════════════════"
echo "Start: $(date '+%Y-%m-%d %H:%M:%S')"
echo "Director: $work_dir"
echo "Prompt: $prompt"
echo "PID File: $pid_file"
echo "═══════════════════════════════════════════════════════════════"
echo ""
} > "$processed_log"
# Rulează Claude în background cu procesare a log-ului
(
# Salvează PID-ul subshell-ului
echo "$$" > "$pid_file"
cd "$work_dir"
local start_time=$(date +%s)
claude -p "$(cat "$prompt_file")" \
--output-format stream-json \
--verbose \
--allowedTools "Bash(git:*),Bash(npm:*),Bash(node:*),Bash(python3:*),Bash(pip3:*),Bash(pip:*),Bash(ls:*),Bash(cat:*),Bash(mkdir:*),Bash(rm:*),Bash(cp:*),Bash(mv:*),Bash(chmod:*),Bash(touch:*),Bash(find:*),Bash(grep:*),Bash(head:*),Bash(tail:*),Bash(wc:*),Bash(which:*),Bash(stat:*),Bash(file:*),Bash(pgrep:*),Bash(kill:*),Read,Write,Edit,Glob,Grep,WebSearch,WebFetch,Task,Skill,TodoWrite,LSP" \
--max-turns 50 2>&1 | while IFS= read -r line; do
# Parsează JSON și extrage informații relevante
if echo "$line" | jq -e . >/dev/null 2>&1; then
msg_type=$(echo "$line" | jq -r '.type // empty' 2>/dev/null)
timestamp=$(date '+%H:%M:%S')
case "$msg_type" in
"system")
subtype=$(echo "$line" | jq -r '.subtype // empty' 2>/dev/null)
if [ "$subtype" = "init" ]; then
echo "[$timestamp] ▶ Sesiune Claude pornită" >> "$processed_log"
fi
;;
"assistant")
# Verifică pentru tool_use - extrage detalii complete
tool_info=$(echo "$line" | jq -r '
.message.content[]? | select(.type == "tool_use") |
{name: .name, input: .input} |
if .name == "WebFetch" then "WebFetch: \(.input.url // "?") | \(.input.prompt // "" | .[0:50])"
elif .name == "WebSearch" then "WebSearch: \(.input.query // "?")"
elif .name == "Bash" then "Bash: \(.input.command // "" | .[0:100])"
elif .name == "Read" then "Read: \(.input.file_path // "?")"
elif .name == "Write" then "Write: \(.input.file_path // "?")"
elif .name == "Edit" then "Edit: \(.input.file_path // "?")"
elif .name == "Grep" then "Grep: \(.input.pattern // "?") in \(.input.path // ".")"
elif .name == "Glob" then "Glob: \(.input.pattern // "?")"
elif .name == "Task" then "Task: \(.input.description // "?") [\(.input.subagent_type // "?")]"
elif .name == "Skill" then "Skill: \(.input.skill // "?")"
else "\(.name): \(.input | tostring | .[0:80])"
end
' 2>/dev/null | head -1)
if [ -n "$tool_info" ]; then
echo "[$timestamp] ⚙ $tool_info" >> "$processed_log"
fi
# Text output
content=$(echo "$line" | jq -r '.message.content[]? | select(.type == "text") | .text // empty' 2>/dev/null | head -c 300)
if [ -n "$content" ]; then
echo "[$timestamp] 💬 $content" >> "$processed_log"
fi
;;
"user")
# Tool result - extrage detalii despre eroare sau rezumat
tool_result=$(echo "$line" | jq -r '
.message.content[]? | select(.type == "tool_result") |
if .is_error == true then
"✗ EROARE: \(.content // "" | .[0:150])"
else
"✓ OK"
end
' 2>/dev/null | head -1)
if [ -n "$tool_result" ]; then
echo "[$timestamp] $tool_result" >> "$processed_log"
else
# Fallback pentru alte formate de rezultat
is_error=$(echo "$line" | jq -r '.message.content[]?.is_error // false' 2>/dev/null | head -1)
if [ "$is_error" = "true" ]; then
err_content=$(echo "$line" | jq -r '.message.content[]?.content // "" | .[0:150]' 2>/dev/null | head -1)
echo "[$timestamp] ✗ EROARE: $err_content" >> "$processed_log"
else
echo "[$timestamp] ✓ OK" >> "$processed_log"
fi
fi
;;
"result")
result_text=$(echo "$line" | jq -r '.result // empty' 2>/dev/null | head -c 500)
echo "" >> "$processed_log"
echo "[$timestamp] ════════════════════════════════════════════" >> "$processed_log"
echo "[$timestamp] ✅ TASK FINALIZAT" >> "$processed_log"
echo "[$timestamp] ════════════════════════════════════════════" >> "$processed_log"
echo "" >> "$processed_log"
echo "Rezultat:" >> "$processed_log"
echo "$result_text" >> "$processed_log"
;;
esac
fi
done
local exit_code=${PIPESTATUS[0]}
local end_time=$(date +%s)
local duration=$((end_time - start_time))
echo "" >> "$processed_log"
echo "═══════════════════════════════════════════════════════════════" >> "$processed_log"
echo "End: $(date '+%Y-%m-%d %H:%M:%S')" >> "$processed_log"
echo "Durată: ${duration}s" >> "$processed_log"
echo "Exit code: $exit_code" >> "$processed_log"
echo "═══════════════════════════════════════════════════════════════" >> "$processed_log"
rm -f "$prompt_file"
rm -f "$pid_file"
) &
local bg_pid=$!
# Salvează și PID-ul procesului părinte pentru referință
echo "$bg_pid" > "$pid_file"
echo -e "${BOLD}${BLUE}╔════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BOLD}${BLUE}${NC} ${GREEN}Claude rulează în background${NC} ${BOLD}${BLUE}${NC}"
echo -e "${BOLD}${BLUE}╚════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${CYAN}PID:${NC} $bg_pid"
echo -e "${CYAN}Log progres:${NC} $processed_log"
echo ""
echo -e "${YELLOW}Comenzi utile:${NC}"
echo -e " ${BOLD}tail -f $processed_log${NC} # Urmărește progresul"
echo -e " ${BOLD}ps aux | grep $bg_pid${NC} # Verifică dacă rulează"
echo ""
print_success "Revenire la meniu..."
sleep 2
}
# ============================================================================
# Rulează Claude cu monitorizare progres (pentru mod feature - sincron)
# ============================================================================
run_claude_with_progress() {
@@ -229,11 +405,14 @@ run_claude_with_progress() {
local prompt="$2"
local log_file="$3"
# Log procesat (mesaje utile, nu JSON brut)
local processed_log="${log_file%.log}_progress.log"
cd "$work_dir"
print_section "Lansare Claude"
echo -e "${CYAN}Director:${NC} $work_dir"
echo -e "${CYAN}Log:${NC} $log_file"
echo -e "${CYAN}Log progres:${NC} $processed_log"
echo -e "${CYAN}Prompt:${NC} $prompt"
echo ""
@@ -248,54 +427,114 @@ run_claude_with_progress() {
echo -e "${BOLD}${BLUE}╚════════════════════════════════════════════════════════════════╝${NC}"
echo ""
# Inițializează log-ul procesat
{
echo "═══════════════════════════════════════════════════════════════"
echo " Claude Code - Task"
echo "═══════════════════════════════════════════════════════════════"
echo "Start: $(date '+%Y-%m-%d %H:%M:%S')"
echo "Director: $work_dir"
echo "Prompt: $prompt"
echo "═══════════════════════════════════════════════════════════════"
echo ""
} > "$processed_log"
# Salvează prompt-ul într-un fișier temporar pentru a evita probleme cu escape
local prompt_file=$(mktemp)
echo "$prompt" > "$prompt_file"
# Rulează Claude cu stream-json și procesează output-ul în timp real
# --allowedTools pre-aprobă tool-urile necesare pentru execuție automată
# --max-turns limitează iterațiile pentru siguranță
claude -p "$(cat "$prompt_file")" \
--output-format stream-json \
--verbose \
--allowedTools "Bash,Read,Edit,Write,Grep,Glob,LSP" \
--max-turns 20 2>&1 | tee "$log_file" | while IFS= read -r line; do
--allowedTools "Bash(git:*),Bash(npm:*),Bash(node:*),Bash(python3:*),Bash(pip3:*),Bash(pip:*),Bash(ls:*),Bash(cat:*),Bash(mkdir:*),Bash(rm:*),Bash(cp:*),Bash(mv:*),Bash(chmod:*),Bash(touch:*),Bash(find:*),Bash(grep:*),Bash(head:*),Bash(tail:*),Bash(wc:*),Bash(which:*),Bash(stat:*),Bash(file:*),Bash(pgrep:*),Bash(kill:*),Read,Write,Edit,Glob,Grep,WebSearch,WebFetch,Task,Skill,TodoWrite,LSP" \
--max-turns 50 2>&1 | while IFS= read -r line; do
# Parsează JSON și extrage informații relevante
if echo "$line" | jq -e . >/dev/null 2>&1; then
# Extrage tipul mesajului
msg_type=$(echo "$line" | jq -r '.type // empty' 2>/dev/null)
timestamp=$(date '+%H:%M:%S')
case "$msg_type" in
"system")
subtype=$(echo "$line" | jq -r '.subtype // empty' 2>/dev/null)
if [ "$subtype" = "init" ]; then
echo "[$timestamp] ▶ Sesiune Claude pornită" >> "$processed_log"
echo -e "${GREEN}${NC} Sesiune Claude pornită"
fi
;;
"assistant")
# Mesaj de la Claude - extrage text
content=$(echo "$line" | jq -r '
.message.content[]? |
select(.type == "text") |
.text // empty
' 2>/dev/null | head -c 150)
# Verifică pentru tool_use - extrage detalii complete
tool_info=$(echo "$line" | jq -r '
.message.content[]? | select(.type == "tool_use") |
{name: .name, input: .input} |
if .name == "WebFetch" then "WebFetch: \(.input.url // "?") | \(.input.prompt // "" | .[0:50])"
elif .name == "WebSearch" then "WebSearch: \(.input.query // "?")"
elif .name == "Bash" then "Bash: \(.input.command // "" | .[0:100])"
elif .name == "Read" then "Read: \(.input.file_path // "?")"
elif .name == "Write" then "Write: \(.input.file_path // "?")"
elif .name == "Edit" then "Edit: \(.input.file_path // "?")"
elif .name == "Grep" then "Grep: \(.input.pattern // "?") in \(.input.path // ".")"
elif .name == "Glob" then "Glob: \(.input.pattern // "?")"
elif .name == "Task" then "Task: \(.input.description // "?") [\(.input.subagent_type // "?")]"
elif .name == "Skill" then "Skill: \(.input.skill // "?")"
else "\(.name): \(.input | tostring | .[0:80])"
end
' 2>/dev/null | head -1)
if [ -n "$tool_info" ]; then
echo "[$timestamp] ⚙ $tool_info" >> "$processed_log"
echo -e "${YELLOW}${NC} $tool_info"
fi
# Text output
content=$(echo "$line" | jq -r '.message.content[]? | select(.type == "text") | .text // empty' 2>/dev/null | head -c 300)
if [ -n "$content" ]; then
echo "[$timestamp] 💬 $content" >> "$processed_log"
echo -e "${GREEN}${NC} $content"
fi
;;
"user")
# Tool result
echo -e "${CYAN}${NC} Tool result received"
# Tool result - extrage detalii despre eroare
tool_result=$(echo "$line" | jq -r '
.message.content[]? | select(.type == "tool_result") |
if .is_error == true then
"✗ EROARE: \(.content // "" | .[0:150])"
else
"✓ OK"
end
' 2>/dev/null | head -1)
if [ -n "$tool_result" ]; then
echo "[$timestamp] $tool_result" >> "$processed_log"
if [[ "$tool_result" == *"EROARE"* ]]; then
echo -e "${RED} $tool_result${NC}"
else
echo -e "${CYAN} $tool_result${NC}"
fi
else
is_error=$(echo "$line" | jq -r '.message.content[]?.is_error // false' 2>/dev/null | head -1)
if [ "$is_error" = "true" ]; then
err_content=$(echo "$line" | jq -r '.message.content[]?.content // "" | .[0:150]' 2>/dev/null | head -1)
echo "[$timestamp] ✗ EROARE: $err_content" >> "$processed_log"
echo -e "${RED} ✗ EROARE: $err_content${NC}"
else
echo "[$timestamp] ✓ OK" >> "$processed_log"
echo -e "${CYAN} ✓ OK${NC}"
fi
fi
;;
"result")
# Rezultat final
result_text=$(echo "$line" | jq -r '.result // empty' 2>/dev/null | head -c 200)
result_text=$(echo "$line" | jq -r '.result // empty' 2>/dev/null | head -c 500)
echo "" >> "$processed_log"
echo "[$timestamp] ════════════════════════════════════════════" >> "$processed_log"
echo "[$timestamp] ✅ TASK FINALIZAT" >> "$processed_log"
echo "[$timestamp] ════════════════════════════════════════════" >> "$processed_log"
echo "Rezultat:" >> "$processed_log"
echo "$result_text" >> "$processed_log"
echo ""
echo -e "${GREEN}REZULTAT:${NC}"
echo -e "${GREEN}TASK FINALIZAT${NC}"
echo -e "$result_text"
;;
*)
# Verifică pentru tool_use în content
tool_name=$(echo "$line" | jq -r '.message.content[]? | select(.type == "tool_use") | .name // empty' 2>/dev/null | head -1)
if [ -n "$tool_name" ]; then
echo -e "${YELLOW}${NC} Tool: ${BOLD}$tool_name${NC}"
fi
;;
esac
fi
done
@@ -306,6 +545,16 @@ run_claude_with_progress() {
rm -f "$prompt_file"
# Finalizează log-ul procesat
{
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "End: $(date '+%Y-%m-%d %H:%M:%S')"
echo "Durată: ${duration}s"
echo "Exit code: $exit_code"
echo "═══════════════════════════════════════════════════════════════"
} >> "$processed_log"
echo ""
echo -e "${BOLD}${BLUE}════════════════════════════════════════════════════════════════${NC}"
@@ -315,52 +564,156 @@ run_claude_with_progress() {
print_error "Claude a terminat cu eroare (cod: $exit_code) în ${duration}s"
fi
echo -e "${CYAN}Log salvat:${NC} $log_file"
echo -e "${CYAN}Log progres:${NC} $processed_log"
echo -e "${BOLD}${BLUE}════════════════════════════════════════════════════════════════${NC}"
return $exit_code
}
# ============================================================================
# Vezi task-uri active și log-uri recente
# ============================================================================
show_task_status() {
print_section "Task-uri active și log-uri recente"
# Afișează procese Claude active (bazat pe fișiere PID)
echo -e "${CYAN}Task-uri background active:${NC}"
local active_count=0
shopt -s nullglob
for pid_file in "$LOG_DIR"/*.pid; do
[ -f "$pid_file" ] || continue
local pid=$(cat "$pid_file" 2>/dev/null)
if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
local log_name=$(basename "${pid_file%.pid}_progress.log")
echo -e " ${GREEN}${NC} PID: $pid$log_name"
((active_count++))
else
# PID invalid sau proces terminat - șterge fișierul
rm -f "$pid_file" 2>/dev/null
fi
done
if [ $active_count -eq 0 ]; then
echo -e " ${YELLOW}${NC} Niciun task activ"
fi
echo ""
# Afișează log-uri de progres recente
echo -e "${CYAN}Log-uri recente (ultimele 5):${NC}"
local logs=$(ls -t "$LOG_DIR"/*_progress.log 2>/dev/null | head -5)
if [ -n "$logs" ]; then
local i=1
for log in $logs; do
local log_basename=$(basename "$log")
local pid_file="${log%_progress.log}.pid"
# Verifică status
if [ -f "$pid_file" ]; then
local pid=$(cat "$pid_file" 2>/dev/null)
if kill -0 "$pid" 2>/dev/null; then
status="${BLUE}◐ În curs (PID: $pid)${NC}"
else
status="${RED}✗ Întrerupt${NC}"
rm -f "$pid_file" 2>/dev/null
fi
elif grep -q "TASK FINALIZAT" "$log" 2>/dev/null; then
status="${GREEN}✓ Finalizat${NC}"
elif grep -q "Exit code:" "$log" 2>/dev/null; then
exit_code=$(grep "Exit code:" "$log" | tail -1 | awk '{print $NF}')
if [ "$exit_code" = "0" ]; then
status="${GREEN}✓ Terminat OK${NC}"
else
status="${RED}✗ Terminat cu eroare ($exit_code)${NC}"
fi
else
status="${RED}✗ Întrerupt/Incomplet${NC}"
fi
# Afișează ultima activitate
local last_activity=$(grep "^\[" "$log" 2>/dev/null | tail -1 | head -c 100)
echo -e " ${BOLD}$i)${NC} $log_basename"
echo -e " Status: $status"
echo -e " Ultima: ${CYAN}${last_activity:-N/A}${NC}"
echo -e " Path: $log"
echo ""
((i++))
done
echo -e "${YELLOW}Comenzi utile:${NC}"
echo -e " tail -f <path> # Urmărește live"
echo -e " less <path> # Citește complet"
else
echo -e " ${YELLOW}${NC} Nu există log-uri"
fi
echo ""
echo -e " ${BOLD}b)${NC} Înapoi la meniu"
echo -e " ${BOLD}q)${NC} ${RED}Ieșire${NC}"
echo ""
read -p "Alege [b/q]: " status_choice
case $status_choice in
q|Q)
echo ""
print_info "La revedere!"
exit 0
;;
*)
# Orice altceva (inclusiv b sau Enter) - înapoi la meniu
;;
esac
}
# ============================================================================
# Gestionare worktrees
# ============================================================================
manage_worktrees() {
print_section "Worktrees existente pentru $PROJECT_NAME"
while true; do
print_section "Worktrees existente pentru $PROJECT_NAME"
cd "$PROJECT_DIR"
cd "$PROJECT_DIR"
echo -e "${CYAN}Worktrees:${NC}"
git worktree list
echo ""
echo -e "${CYAN}Worktrees:${NC}"
git worktree list
echo ""
echo -e " ${BOLD}1)${NC} Șterge un worktree"
echo -e " ${BOLD}2)${NC} Navighează la un worktree"
echo -e " ${BOLD}3)${NC} Înapoi"
echo ""
echo -e " ${BOLD}1)${NC} Șterge un worktree"
echo -e " ${BOLD}2)${NC} Navighează la un worktree"
echo -e " ${BOLD}b)${NC} Înapoi la meniu"
echo -e " ${BOLD}q)${NC} ${RED}Ieșire${NC}"
echo ""
read -p "Alege [1-3]: " manage_choice
read -p "Alege [1-2/b/q]: " manage_choice
case $manage_choice in
1)
read -p "Path worktree de șters: " wt_path
if [ -n "$wt_path" ]; then
git worktree remove "$wt_path" --force
print_success "Worktree șters"
fi
;;
2)
read -p "Path worktree: " wt_path
if [ -d "$wt_path" ]; then
cd "$wt_path"
print_success "Navigat la $wt_path"
exec bash
fi
;;
3)
return
;;
esac
case $manage_choice in
1)
read -p "Path worktree de șters: " wt_path
if [ -n "$wt_path" ]; then
git worktree remove "$wt_path" --force
print_success "Worktree șters"
fi
;;
2)
read -p "Path worktree: " wt_path
if [ -d "$wt_path" ]; then
cd "$wt_path"
print_success "Navigat la $wt_path"
exec bash
fi
;;
b|B)
exec "$0"
;;
q|Q)
echo ""
print_info "La revedere!"
exit 0
;;
*)
print_error "Opțiune invalidă"
;;
esac
done
}
# ============================================================================
@@ -373,8 +726,17 @@ main() {
# 1. Selectare proiect
select_project
# 2. Selectare mod de lucru
select_work_mode
# 2. Selectare mod de lucru (cu loop pentru navigare)
while true; do
select_work_mode
# Dacă vrea înapoi, repornește scriptul
if [ "$WORK_MODE" = "back" ]; then
exec "$0"
fi
break
done
case $WORK_MODE in
"feature")
@@ -409,7 +771,7 @@ main() {
;;
"temp")
# Mod temporar fără worktree
# Mod temporar fără worktree - rulează în background
get_task_description
# Folosește directorul proiectului direct
@@ -418,8 +780,11 @@ main() {
# Generează log file
LOG_FILE="$LOG_DIR/${PROJECT_NAME}_temp_$(date +%Y%m%d_%H%M%S).log"
# Rulează Claude
run_claude_with_progress "$WORKING_DIR" "$TASK_DESCRIPTION" "$LOG_FILE"
# Rulează Claude în background și revine la meniu
run_claude_background "$WORKING_DIR" "$TASK_DESCRIPTION" "$LOG_FILE"
# Revine la meniu
exec "$0"
;;
"interactive")
@@ -433,6 +798,13 @@ main() {
# Gestionare worktrees
manage_worktrees
;;
"status")
# Vezi task-uri active
show_task_status
# Revine la meniu
exec "$0"
;;
esac
}