#!/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 recarregue somente a extensao CEP 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 somente a extensao dentro do Premiere # ------------------------------------------------------------ if run_step reload; then step "4/4 RECARREGAR A EXTENSAO CEP" echo "O painel ja foi reinstalado (passo 1). Para carregar a copia nova:" echo " 1. Feche somente o painel MCP for Adobe Premiere Pro" echo " 2. Abra novamente em Window > Extensions > MCP for Adobe Premiere Pro" echo " 3. Confira a aba Editar video e os passos Concluir edicao / Aplicar na timeline" 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 somente a extensao no Premiere."