- Adicionado estrutura completa do projeto - Configurado MCP server para Premiere Pro - Adicionado documentação e skills - Configurado Gitignore para o projeto
218 lines
8.0 KiB
Bash
Executable File
218 lines
8.0 KiB
Bash
Executable File
#!/bin/zsh
|
|
# ============================================================
|
|
# Jhonny - admin/PremiereMCP.command
|
|
#
|
|
# PONTO DE ENTRADA UNICO do MCP do Premiere Pro (code/) e do pipeline
|
|
# de corte de silencio por transcricao (Whisper). Rode este arquivo
|
|
# sempre que mexer no codigo antes de testar dentro do Premiere.
|
|
#
|
|
# 1. BUILD compila o TypeScript (code/, tsc -> dist/), valida a
|
|
# sintaxe dos scripts do painel CEP e do apply-silence-cuts,
|
|
# e reinstala a COPIA do painel que o Premiere realmente
|
|
# carrega (~/Library/.../Adobe/CEP/extensions/MCPBridgeCEP -
|
|
# editar code/cep-plugin sozinho nao e o bastante)
|
|
# 2. PYTHON confere o venv/dependencias do pipeline de transcricao
|
|
# (faster-whisper) e a presenca dos scripts esperados
|
|
# 3. RAG reindexa na RAG do Jhonny (jhonny-rag) o que mudou em
|
|
# code/ desde o ultimo build - mantem o indice em dia pro
|
|
# agente de IA buscar o codigo certo. Best-effort: se o
|
|
# abre o tunel temporariamente quando necessario e fecha o
|
|
# processo que este ciclo iniciou ao terminar.
|
|
# 4. LEMBRETE reinicie o Premiere Pro por completo para o painel
|
|
# reinstalado ser carregado - este passo so imprime isso
|
|
#
|
|
# Nao mexe em git (este projeto nao e um repositorio git) e nao sobe
|
|
# nenhum servidor - o bridge roda dentro do proprio Premiere via CEP.
|
|
#
|
|
# Uso:
|
|
# admin/PremiereMCP.command ciclo completo
|
|
# SKIP_BUILD=1 admin/PremiereMCP.command pula o build TypeScript
|
|
# SKIP_PYTHON=1 admin/PremiereMCP.command pula a checagem Python
|
|
# SKIP_RAG=1 admin/PremiereMCP.command pula a reindexacao RAG
|
|
# ONLY=build admin/PremiereMCP.command roda so uma etapa
|
|
# (build | python | rag | reload)
|
|
# ============================================================
|
|
set -u
|
|
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd -P)"
|
|
CODE="$ROOT/code"
|
|
CEP="$CODE/cep-plugin"
|
|
SCRIPTS="$CODE/scripts"
|
|
|
|
# Pipeline de transcricao (Whisper) - mesmo venv usado nesta sessao.
|
|
TRANSCRICAO="/Volumes/Merongo/SISTEMAS/WHISPERX/transcricao"
|
|
VENV_PY="/Volumes/Merongo/SISTEMAS/venvs/whisperx-transcricao/bin/python"
|
|
|
|
GRN="$(tput setaf 2 2>/dev/null)"; YLW="$(tput setaf 3 2>/dev/null)"
|
|
RD="$(tput setaf 1 2>/dev/null)"; BLU="$(tput setaf 4 2>/dev/null)"
|
|
NC="$(tput sgr0 2>/dev/null)"
|
|
step() { echo; echo "${BLU}============================================================${NC}"
|
|
echo "${BLU} $*${NC}"
|
|
echo "${BLU}============================================================${NC}"; }
|
|
ok() { echo "${GRN}-> OK ${NC}$*"; }
|
|
warn() { echo "${YLW}-> Aviso: ${NC}$*"; }
|
|
die() { echo "${RD}-> Erro: ${NC}$*" >&2; exit 1; }
|
|
|
|
ONLY="${ONLY:-all}"
|
|
run_step() { [ "$ONLY" = "all" ] || [ "$ONLY" = "$1" ]; }
|
|
|
|
FAILED=0
|
|
RAG_TUNNEL_PID=""
|
|
|
|
cleanup_rag_tunnel() {
|
|
if [ -n "$RAG_TUNNEL_PID" ] && kill -0 "$RAG_TUNNEL_PID" 2>/dev/null; then
|
|
kill "$RAG_TUNNEL_PID" 2>/dev/null || true
|
|
wait "$RAG_TUNNEL_PID" 2>/dev/null || true
|
|
fi
|
|
}
|
|
trap cleanup_rag_tunnel EXIT
|
|
|
|
[ -d "$CODE" ] || die "pasta do projeto nao encontrada: $CODE"
|
|
|
|
# ------------------------------------------------------------
|
|
# 1) Build (TypeScript + validacao de sintaxe dos scripts)
|
|
# ------------------------------------------------------------
|
|
if run_step build && [ "${SKIP_BUILD:-0}" != "1" ]; then
|
|
step "1/4 BUILD (tsc + validacao de sintaxe)"
|
|
cd "$CODE" || die "nao consegui entrar em $CODE"
|
|
|
|
if npm run build; then
|
|
ok "npm run build (dist/ atualizado)"
|
|
else
|
|
warn "npm run build falhou - veja o log acima"
|
|
FAILED=1
|
|
fi
|
|
|
|
for f in "$CEP/main.js" "$SCRIPTS/apply-silence-cuts.mjs"; do
|
|
if [ -f "$f" ]; then
|
|
if node --check "$f" 2>/dev/null; then
|
|
ok "sintaxe valida: ${f#$ROOT/}"
|
|
else
|
|
warn "sintaxe invalida: ${f#$ROOT/}"
|
|
FAILED=1
|
|
fi
|
|
else
|
|
warn "arquivo esperado nao encontrado: ${f#$ROOT/}"
|
|
FAILED=1
|
|
fi
|
|
done
|
|
|
|
# O Premiere carrega o painel de uma COPIA instalada em
|
|
# ~/Library/.../Adobe/CEP/extensions/MCPBridgeCEP, nao direto de
|
|
# code/cep-plugin. Sem este passo, mudancas no painel nunca aparecem
|
|
# dentro do Premiere, mesmo com o app reaberto.
|
|
if node dist/index.js --install-cep >/tmp/premiere-mcp-install-cep.log 2>&1; then
|
|
ok "painel CEP reinstalado (copia sincronizada)"
|
|
else
|
|
warn "falha ao reinstalar o painel CEP - veja /tmp/premiere-mcp-install-cep.log"
|
|
FAILED=1
|
|
fi
|
|
elif run_step build; then
|
|
step "1/4 BUILD - PULADO (SKIP_BUILD=1)"
|
|
fi
|
|
|
|
# ------------------------------------------------------------
|
|
# 2) Pipeline Python (Whisper / corte de silencio)
|
|
# ------------------------------------------------------------
|
|
if run_step python && [ "${SKIP_PYTHON:-0}" != "1" ]; then
|
|
step "2/4 PYTHON (venv + pipeline de transcricao)"
|
|
|
|
if [ -x "$VENV_PY" ]; then
|
|
ok "venv encontrado: $VENV_PY"
|
|
else
|
|
warn "venv nao encontrado em $VENV_PY"
|
|
FAILED=1
|
|
fi
|
|
|
|
if [ -x "$VENV_PY" ] && "$VENV_PY" -c "import faster_whisper" 2>/dev/null; then
|
|
ok "faster-whisper importavel"
|
|
else
|
|
warn "faster-whisper nao importavel neste venv"
|
|
FAILED=1
|
|
fi
|
|
|
|
for f in "$TRANSCRICAO/transcribe_cli.py" "$TRANSCRICAO/silence_cutter.py"; do
|
|
if [ -f "$f" ]; then
|
|
ok "script presente: ${f#/Volumes/Merongo/}"
|
|
else
|
|
warn "script esperado nao encontrado: ${f#/Volumes/Merongo/}"
|
|
FAILED=1
|
|
fi
|
|
done
|
|
elif run_step python; then
|
|
step "2/4 PYTHON - PULADO (SKIP_PYTHON=1)"
|
|
fi
|
|
|
|
# ------------------------------------------------------------
|
|
# 3) RAG - reindexa na RAG do Jhonny o que mudou em code/
|
|
# ------------------------------------------------------------
|
|
if run_step rag && [ "${SKIP_RAG:-0}" != "1" ]; then
|
|
step "3/4 RAG (reindexacao incremental jhonny-rag)"
|
|
RAG_PY="$ROOT/rag/.venv/bin/python3"
|
|
[ -x "$RAG_PY" ] || RAG_PY="$(command -v python3)"
|
|
if ! nc -z 127.0.0.1 55435 2>/dev/null; then
|
|
echo "-> Abrindo tunel RAG temporario (127.0.0.1:55435)..."
|
|
ssh -N \
|
|
-o ExitOnForwardFailure=yes \
|
|
-o ServerAliveInterval=30 \
|
|
-o ServerAliveCountMax=3 \
|
|
-L "127.0.0.1:55435:127.0.0.1:55435" \
|
|
root@179.197.228.240 &
|
|
RAG_TUNNEL_PID=$!
|
|
|
|
RAG_TUNNEL_READY=0
|
|
for _ in $(seq 1 10); do
|
|
if nc -z 127.0.0.1 55435 2>/dev/null; then
|
|
RAG_TUNNEL_READY=1
|
|
break
|
|
fi
|
|
if ! kill -0 "$RAG_TUNNEL_PID" 2>/dev/null; then
|
|
break
|
|
fi
|
|
sleep 0.5
|
|
done
|
|
|
|
if [ "$RAG_TUNNEL_READY" != "1" ]; then
|
|
warn "nao foi possivel abrir o tunel RAG - reindexacao pulada."
|
|
else
|
|
ok "tunel RAG aberto temporariamente"
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$RAG_TUNNEL_PID" ] && ! nc -z 127.0.0.1 55435 2>/dev/null; then
|
|
warn "tunel RAG ficou indisponivel - reindexacao pulada."
|
|
elif ! nc -z 127.0.0.1 55435 2>/dev/null; then
|
|
warn "tunel RAG fechado - reindexacao pulada."
|
|
elif [ ! -x "$RAG_PY" ]; then
|
|
warn "python do rag nao encontrado - reindexacao pulada."
|
|
else
|
|
if ( cd "$ROOT" && RAG_ENV_FILE="$ROOT/rag/jhonny.env" \
|
|
"$RAG_PY" "$ROOT/rag/index_code.py" >/tmp/premiere-mcp-rag.log 2>&1 ); then
|
|
ok "RAG reindexado (incremental) - índice em dia"
|
|
else
|
|
warn "reindexacao RAG falhou - veja /tmp/premiere-mcp-rag.log"
|
|
FAILED=1
|
|
fi
|
|
fi
|
|
elif run_step rag; then
|
|
step "3/4 RAG - PULADO (SKIP_RAG=1)"
|
|
fi
|
|
|
|
# ------------------------------------------------------------
|
|
# 4) Lembrete de recarregar o painel dentro do Premiere
|
|
# ------------------------------------------------------------
|
|
if run_step reload; then
|
|
step "4/4 REINICIAR O PREMIERE"
|
|
echo "O painel ja foi reinstalado (passo 1), mas o Premiere so carrega a"
|
|
echo "copia nova depois de um restart completo:"
|
|
echo " 1. Feche o Premiere Pro por completo (Cmd+Q)"
|
|
echo " 2. Abra de novo e va em Window > Extensions > MCP for Adobe Premiere Pro"
|
|
echo " 3. Confira se aparecem as abas 'Bridge' e 'Cortar silencio'"
|
|
fi
|
|
|
|
echo
|
|
if [ "$FAILED" != "0" ]; then
|
|
die "ciclo terminou com pendencias - corrija os avisos acima antes de testar no Premiere."
|
|
fi
|
|
ok "Ciclo concluido. Pronto para recarregar o painel no Premiere."
|