RestoPromt

localhost-manager (port tarayıcı & yönetici)

Skill
RestoPromt21 Temmuz 2026

Dinlenen localhost portlarını tarar, hangi projenin kullandığını gösterir, boş port bulur, bir projenin dev sunucularını durdurur (macOS/lsof). Dev sunucu başlatmadan önce port çakışmasını önler.

# localhost-manager

Yerel geliştirmede **port çakışmasını önlemek** için bir yardımcı. Bir dev sunucu (Next.js, Vite vb.) başlatmadan ÖNCE hangi portların dolu olduğunu, hangi projenin kullandığını gösterir ve boş port önerir. macOS + `lsof` içindir.

## Ne zaman kullanılır
- `npm run dev` / `next dev` başlatmadan önce → hedef port (ör. 3000) başka bir projede mi?
- Birden çok proje aynı anda çalışırken hangi portun kimde olduğunu görmek için.
- Eski/stray dev sunucularını temizlemek için.

## Kurulum
`~/localhost-manager.sh` olarak kaydet, `chmod +x ~/localhost-manager.sh`.

## Kullanım
```
~/localhost-manager.sh scan          # tüm dinlenen portlar + proje adı
~/localhost-manager.sh port 3000     # tek portun durumu (BOŞ/DOLU + kim)
~/localhost-manager.sh free 3000     # 3000'den itibaren ilk BOŞ portu yaz
~/localhost-manager.sh kill panel    # cwd adı 'panel' olan dev sunucularını durdur
```

## Ajan/Claude için akış (dev başlatmadan önce)
1. `~/localhost-manager.sh port <istenen>` → doluysa kim kullanıyor gör.
2. Doluysa: ya `free <istenen>` ile boş port al, ya da kendi eski sürecinse `kill <proje>` ile durdur.
3. Dev sunucuyu boş/dedike portta başlat: `next dev -p <port>`.
4. Projeye SABİT bir port ata (ör. restoSign paneli 3010) ki her seferinde çakışma olmasın.

## Script (localhost-manager.sh)
```bash
#!/usr/bin/env bash
# Dinlenen portları tarar, projeyi gösterir, boş port bulur, dev sunucu durdurur.
set -euo pipefail

proj_of_pid() {  # pid → çalışma dizininin adı (proje)
  local cwd; cwd=$(lsof -a -p "$1" -d cwd -Fn 2>/dev/null | grep '^n' | sed 's/^n//' | head -1)
  basename "${cwd:-?}" 2>/dev/null || echo "?"
}

scan() {
  printf "%-7s %-12s %-8s %s\n" "PORT" "PROSES" "PID" "PROJE"
  lsof -nP -iTCP -sTCP:LISTEN 2>/dev/null | awk 'NR>1{split($9,a,":");print a[length(a)]"\t"$1"\t"$2}' \
    | sort -n -u | while IFS=$'\t' read -r port cmd pid; do
      printf "%-7s %-12s %-8s %s\n" ":$port" "$cmd" "$pid" "$(proj_of_pid "$pid")"
    done
}

port_status() {
  local n="$1"; local line
  line=$(lsof -nP -iTCP:"$n" -sTCP:LISTEN 2>/dev/null | awk 'NR>1{print $1" "$2; exit}')
  if [ -n "$line" ]; then
    local cmd pid; cmd=$(echo "$line"|awk '{print $1}'); pid=$(echo "$line"|awk '{print $2}')
    echo "DOLU  :$n  ->  $cmd (pid $pid)  proje: $(proj_of_pid "$pid")"; return 1
  fi
  echo "BOS   :$n"; return 0
}

free_port() {
  local n="${1:-3000}"
  while lsof -nP -iTCP:"$n" -sTCP:LISTEN >/dev/null 2>&1; do n=$((n+1)); done
  echo "$n"
}

kill_proj() {
  local target="$1"
  lsof -nP -iTCP -sTCP:LISTEN 2>/dev/null | awk 'NR>1{print $2}' | sort -u | while read -r pid; do
    if [ "$(proj_of_pid "$pid")" = "$target" ]; then
      echo "durduruluyor: pid $pid ($target)"; kill -9 "$pid" 2>/dev/null || true
    fi
  done
}

case "${1:-scan}" in
  scan) scan ;;
  port) port_status "${2:?port no gerekli}" ;;
  free) free_port "${2:-3000}" ;;
  kill) kill_proj "${2:?proje adi gerekli}" ;;
  *) echo "kullanim: $0 {scan|port <n>|free [start]|kill <proje>}"; exit 1 ;;
esac
```

## Not (bu makinede gözlemlenen)
Port 3000 → **restopromt**, 4000 → restomarkt, 8080 → player (Flutter web). RestoSign paneli 3000'i KULLANAMAZ; dedike **3010** önerilir.

Değişiklik öner

Bu promptu yalnızca sahibi düzenleyebilir; ama sen bir iyileştirme önerebilirsin. Sahibi kabul ederse içerik güncellenir.

Öneri göndermek için giriş yap