diff --git a/:memory:.ses b/:memory:.ses new file mode 100644 index 0000000..b7104b7 --- /dev/null +++ b/:memory:.ses @@ -0,0 +1,2 @@ +1788878781647 +0de531b6-352d-4673-95fd-f920138f27ea diff --git a/AGENTS.md b/AGENTS.md index e37e1a5..435323b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,6 +2,10 @@ ## Project Skills +## Interface do painel + +Quando o usuário pedir uma implementação “na tela”, “no painel” ou “na interface do MCP”, use o painel CEP em `code/cep-plugin/`, identificado por **MCP for Adobe Premiere Pro** e pelas abas **Editar vídeo**, **Scanner**, **Conexão**, **Modelos** e **Ajustes**. Essa é a interface de produto; não criar fluxos de interface alternativos em `code/uxp-plugin/`. + Este projeto usa skills do mattpocock/skills para manter integridade e organização do código. ### Skills disponíveis diff --git a/admin/DEV-NOTES.md b/admin/DEV-NOTES.md index a9d0a9b..f22064f 100644 --- a/admin/DEV-NOTES.md +++ b/admin/DEV-NOTES.md @@ -1,33 +1,23 @@ -# DEV-NOTES — Registro de implementações (Ronald) +# DEV-NOTES — Registro de Alterações (Jhonny Editor) -> Este arquivo é a **fonte da mensagem de commit**. -> O script `admin/update.command` lê automaticamente a seção `## NOVO NESTE LOTE` -> abaixo (se houver texto) e usa o conteúdo no corpo da mensagem no momento do commit. -> > **Como usar:** -> 1. Ao trabalhar, adicione bullets em `## NOVO NESTE LOTE` descrevendo o que mudou. -> 2. Depois rode `admin/update.command` — ele monta o commit com esse texto + resumo -> automático dos arquivos alterados, faz build/deploy, commita e dá push. -> 3. Após o script rodar com sucesso, você pode mover os bullets desta seção para -> `## Histórico` e esvaziar `NOVO NESTE LOTE`. +> 1. Ao fazer alterações, adicione bullets na seção `## NOVO NESTE LOTE` +> 2. Rod `admin/deploy.command` — ele lê essas notas e usa como descrição do commit +> 3. Após o deploy, mova os bullets para `## Histórico` e esvazie `NOVO NESTE LOTE` --- -## NOVO NESTE LOTE - -- adicionado admin/update.command (automatizacao de build+deploy+commit+push) -- adicionado admin/DEV-NOTES.md (fonte de texto para a mensagem de commit) -## Uso / lembretes (não apagar) -- `admin/update.command` → build + deploy + commit + push em um só -- `admin/DEV-NOTES.md` → fonte da mensagem (seção NOVO NESTE LOTE) +## NOVO NESTE LOTE +- criado repositório jhonny-editor no Gitea +- adicionado script admin/deploy.command com commit automático +- atualizado admin/DEV-NOTES.md com template limpo ## Histórico -- Versão inicial: inicialização do repositório Ronald (backend OpenCut + painéis UXP/CEP + admin) + -## Anotações / pendências -- Os PNGs de `code/extension/design/` (~46 MB) são mockups de system design — avaliar se mantém ou otimiza. -- `admin/VPS-ACCESS.md` é o único arquivo com credenciais e NÃO deve ser commitado (já está no .gitignore). \ No newline at end of file +## Notas Técnicas + + +## Anotações / Pendências +- repositório: https://gitea.nacarmed.cloud/joaohenrique/jhonny-editor +- remote SSH: ssh://git@gitea.nacarmed.cloud:2222/joaohenrique/jhonny-editor.git diff --git a/admin/Jhonny.command b/admin/Jhonny.command new file mode 100755 index 0000000..f58b3e4 --- /dev/null +++ b/admin/Jhonny.command @@ -0,0 +1,47 @@ +#!/bin/zsh +# ============================================================ +# Jhonny Editor - admin/Jhonny.command +# +# PONTO DE ENTRADA UNICO: builda/instala o painel do Premiere e, +# se tudo deu certo, commita + faz push. +# +# 1. PremiereMCP.command build TS, reinstala a copia do painel +# CEP, confere venv Python, reindexa RAG +# 2. deploy.command commit + push (usa as notas de +# admin/DEV-NOTES.md) +# +# Se o passo 1 falhar, o script PARA antes de commitar - nada de +# publicar painel quebrado. +# +# Uso: +# admin/Jhonny.command ciclo completo (pede confirmacao pro push) +# AUTO=1 admin/Jhonny.command nao pergunta antes do push +# SKIP_BUILD=1 admin/Jhonny.command pula o build (so commit+push) +# SKIP_PYTHON=1 admin/Jhonny.command repassado ao PremiereMCP.command +# SKIP_RAG=1 admin/Jhonny.command repassado ao PremiereMCP.command +# ============================================================ +set -u + +ADMIN="$(cd "$(dirname "$0")" && pwd -P)" + +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}$*"; } +die() { echo "${RD}-> Erro: ${NC}$*" >&2; exit 1; } + +if [[ "${SKIP_BUILD:-0}" != "1" ]]; then + step "1/2 - PremiereMCP.command (build + instalar painel)" + "$ADMIN/PremiereMCP.command" || die "PremiereMCP.command falhou - corrija antes de publicar" + ok "build/instalação concluída" +else + ok "SKIP_BUILD=1 - pulando etapa de build" +fi + +step "2/2 - deploy.command (commit + push)" +"$ADMIN/deploy.command" || die "deploy.command falhou" + +ok "Jhonny.command concluído" diff --git a/admin/commit.command b/admin/commit.command deleted file mode 100755 index 28212a6..0000000 --- a/admin/commit.command +++ /dev/null @@ -1,127 +0,0 @@ -#!/bin/zsh -# ============================================================ -# OpenCut Ronald - admin/commit.command -# -# COMMIT: monta a mensagem, commita e envia para o Gitea. -# 1. Le a secao 'NOVO NESTE LOTE' do admin/DEV-NOTES.md -# 2. Junta o resumo automatico dos arquivos alterados -# 3. git add -A + commit + push -# -# O push e a unica etapa que sai desta maquina, entao ele pede -# confirmacao. Use AUTO=1 para rodar sem perguntar (ex.: dentro do -# OpenCut.command em modo automatico). -# -# Uso: -# admin/commit.command commita e pergunta antes do push -# DRY=1 admin/commit.command so mostra o plano, nao commita -# AUTO=1 admin/commit.command commita e faz push sem perguntar -# ============================================================ -set -u -umask 077 - -ROOT="$(cd "$(dirname "$0")/.." && pwd -P)" -ADMIN="$ROOT/admin" -NOTES="$ADMIN/DEV-NOTES.md" -REMOTE="origin" - -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)" -say() { echo "${BLU}== ${NC}$*"; } -ok() { echo "${GRN}-> OK ${NC}$*"; } -warn() { echo "${YLW}-> Aviso: ${NC}$*"; } -die() { echo "${RD}-> Erro: ${NC}$*" >&2; exit 1; } - -cd "$ROOT" || die "nao consegui entrar em $ROOT" -[[ -d .git ]] || die "nao e um repositorio git em $ROOT" -git remote get-url "$REMOTE" >/dev/null 2>&1 || die "remote '$REMOTE' nao configurado" - -echo "${BLU}============================================================${NC}" -say "commit.command - commit + push" -say "repositorio: $(git remote get-url "$REMOTE")" -say "branch: $(git branch --show-current)" -echo "${BLU}============================================================${NC}" - -# ------------------------------------------------------------ -# 1) Ha o que commitar? -# ------------------------------------------------------------ -CHANGES="$(git status --porcelain)" -if [[ -z "$CHANGES" ]]; then - ok "Nenhuma alteracao para commitar." - exit 0 -fi - -say "Alteracoes detectadas:" -echo "$CHANGES" | sed 's/^/ /' | head -60 -echo " ... ($(echo "$CHANGES" | grep -c .) itens)" -echo - -# ------------------------------------------------------------ -# 2) Mensagem do commit -# ------------------------------------------------------------ -MSG_NOTA="" -if [[ -f "$NOTES" && -s "$NOTES" ]]; then - MSG_NOTA="$(awk ' - /^## NOVO NESTE LOTE/ {f=1; next} - /^## / && f {exit} - f - ' "$NOTES" 2>/dev/null \ - | sed 's/^[[:space:]]*//; s/[[:space:]]*$//' \ - | grep -v '^$' \ - | awk '/^/&&c{c=0;next} c{next} {print}' \ - | sed 's/^[-*] //' \ - | grep -v '(_vazio' || true)" -fi - -FILES="$(git status --porcelain | sed 's/^.../ - /' | head -80)" -STAT="$(git diff --stat HEAD | tail -1)" - -if [[ -n "$MSG_NOTA" ]]; then - BODY="$MSG_NOTA" -else - BODY="(sem nota em DEV-NOTES.md; veja os arquivos alterados abaixo)" -fi - -COMMIT_MSG="update automatizado: alteracoes no projeto -$(printf '%s\n' "$BODY") - -$STAT - -Arquivos alterados: -$FILES" - -say "Mensagem do commit a ser usada:" -echo "----------------------------------------------" -echo "$COMMIT_MSG" -echo "----------------------------------------------" -echo - -if [[ "${DRY:-0}" = "1" ]]; then - say "DRY=1 - nao vou commitar/push." - exit 0 -fi - -# ------------------------------------------------------------ -# 3) Commit -# ------------------------------------------------------------ -say "Adicionando arquivos e commitando..." -git add -A -git commit -m "$COMMIT_MSG" || die "commit falhou" -ok "commit criado: $(git rev-parse --short HEAD)" -echo - -# ------------------------------------------------------------ -# 4) Push (confirmado - e o passo que publica) -# ------------------------------------------------------------ -if [[ "${AUTO:-0}" != "1" ]]; then - printf "Enviar para '%s' agora? [s/N] " "$REMOTE" - read -r RESP - case "$RESP" in - [sS]|[sS][iI][mM]|[yY]|[yY][eE][sS]) ;; - *) warn "push cancelado - o commit ficou local (envie depois com: git push $REMOTE HEAD)"; exit 0 ;; - esac -fi - -say "Fazendo push para '$REMOTE'..." -git push "$REMOTE" HEAD || die "push falhou" -ok "push concluido" diff --git a/admin/deploy.command b/admin/deploy.command index e8d14fb..083c543 100755 --- a/admin/deploy.command +++ b/admin/deploy.command @@ -1,128 +1,147 @@ #!/bin/zsh # ============================================================ -# OpenCut Ronald - admin/deploy.command +# Jhonny Editor - admin/deploy.command # -# DEPLOY: garante o backend OpenCut no ar em http://127.0.0.1:5679 -# e sobe a ponte de live-updates (WebSocket) que o painel consome. +# DEPLOY COMMIT: verifica alterações, documenta e faz push # -# E este o script que o painel do Premiere dispara quando pede -# "iniciar backend" (via ~/.opencut/launcher.command). Por isso ele -# nao pergunta nada e nao mexe no git: roda sozinho e sai. +# Fluxo: +# 1. Verifica se há alterações no repositório +# 2. Lê as notas do admin/DEV-NOTES.md +# 3. Monta mensagem de commit descritiva +# 4. Faz commit e push automático # # Uso: -# admin/deploy.command sobe (ou recupera) o backend -# OPENCUT_RESTART=1 admin/deploy.command reinicia o backend atual -# OPENCUT_NO_OPEN=1 admin/deploy.command nao abre o navegador +# admin/deploy.command commit + push interativo +# AUTO=1 admin/deploy.command commit + push automático +# DRY=1 admin/deploy.command mostra plano sem executar # ============================================================ set -u +umask 077 ROOT="$(cd "$(dirname "$0")/.." && pwd -P)" -CODE="$ROOT/code" -START_SCRIPT="$CODE/start-opencut.sh" -RUNTIME_DIR="$CODE/.opencut-runtime" -LOG="$RUNTIME_DIR/server.log" -URL="http://127.0.0.1:5679" -HEALTH="$URL/health" -RESTART="${OPENCUT_RESTART:-0}" +ADMIN="$ROOT/admin" +NOTES="$ADMIN/DEV-NOTES.md" +REMOTE="origin" +BRANCH="main" -notify() { osascript -e "display notification \"$1\" with title \"OpenCut\"" 2>/dev/null || true; } -open_ui() { [ "${OPENCUT_NO_OPEN:-0}" = "1" ] || open "$URL" 2>/dev/null || true; } +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)" +say() { echo "${BLU}== ${NC}$*"; } +ok() { echo "${GRN}-> OK ${NC}$*"; } +warn() { echo "${YLW}-> Aviso: ${NC}$*"; } +die() { echo "${RD}-> Erro: ${NC}$*" >&2; exit 1; } -server_ok() { curl -s -m 5 "$HEALTH" 2>/dev/null | grep -q '"status":"ok"'; } +cd "$ROOT" || die "nao consegui entrar em $ROOT" +[[ -d .git ]] || die "nao e um repositorio git em $ROOT" +git remote get-url "$REMOTE" >/dev/null 2>&1 || die "remote '$REMOTE' nao configurado" -stop_opencut_pids() { - local signal="$1" - local pid - for pid in ${(f)PGREP}; do - [ -n "$pid" ] && kill "$signal" "$pid" 2>/dev/null || true - done -} +echo "${BLU}============================================================${NC}" +say "Jhonny Editor - Deploy com Commit Automático" +say "repositorio: $(git remote get-url "$REMOTE")" +say "branch: $(git branch --show-current)" +echo "${BLU}============================================================${NC}" # ------------------------------------------------------------ -# Ponte de live-updates (WebSocket) -# -# O backend nao sobe a ponte sozinho: ela so existe apos um POST em -# /ws/start, e esse endpoint exige o token CSRF que o /health entrega. -# Sem este passo o painel abre mostrando "Bridge stopped" e o usuario -# precisa clicar em "Start" na mao a cada boot. +# 1) Ha o que commitar? # ------------------------------------------------------------ -start_bridge() { - if curl -s -m 5 "$URL/ws/status" 2>/dev/null | grep -q '"running":true'; then - echo "-> ponte de live-updates ja ativa" - return 0 - fi - local token - token="$(curl -s -m 5 -H "Origin: $URL" "$HEALTH" 2>/dev/null \ - | /usr/bin/python3 -c 'import sys,json -try: print(json.load(sys.stdin).get("csrf_token") or "") -except Exception: print("")' 2>/dev/null)" - if [ -z "$token" ]; then - echo "-> Aviso: /health nao devolveu token CSRF; ponte nao iniciada" - return 1 - fi - if curl -s -m 10 -X POST "$URL/ws/start" \ - -H "Content-Type: application/json" \ - -H "X-OpenCut-Token: $token" \ - -H "Origin: $URL" -d '{}' 2>/dev/null | grep -q '"running":true'; then - echo "-> ponte de live-updates ativa" - return 0 - fi - echo "-> Aviso: a ponte de live-updates nao subiu (veja $LOG)" - return 1 -} - -# 1) Ja esta no ar? -if server_ok && [ "$RESTART" != "1" ]; then - echo "-> backend ja rodando em $URL" - start_bridge - notify "Backend ja esta rodando em $URL" - open_ui - exit 0 +CHANGES="$(git status --porcelain)" +if [[ -z "$CHANGES" ]]; then + ok "Nenhuma alteracao para commitar." + exit 0 fi -if [ "$RESTART" = "1" ]; then - echo "-> reinicio solicitado; substituindo o backend atual" +say "Alteracoes detectadas:" +echo "$CHANGES" | sed 's/^/ /' | head -60 +echo " ... ($(echo "$CHANGES" | grep -c .) itens)" +echo + +# ------------------------------------------------------------ +# 2) Extrair notas do DEV-NOTES.md +# ------------------------------------------------------------ +MSG_NOTA="" +if [[ -f "$NOTES" && -s "$NOTES" ]]; then + MSG_NOTA="$(awk ' + /^## NOVO NESTE LOTE/ {f=1; next} + /^## / && f {exit} + f + ' "$NOTES" 2>/dev/null \ + | sed 's/^[[:space:]]*//; s/[[:space:]]*$//' \ + | grep -v '^$' \ + | awk '/^/&&c{c=0;next} c{next} {print}' \ + | sed 's/^[-*] //' \ + | grep -v '(_vazio' || true)" fi -# 2) Processo antigo travado? Derruba antes de subir outro. -PGREP=$(pgrep -f 'opencut.server' || true) -if [ -n "$PGREP" ]; then - notify "Backend travado detectado - reiniciando..." - echo "Encerrando processo(s) antigo(s): $PGREP" - stop_opencut_pids TERM - sleep 3 - PGREP=$(pgrep -f 'opencut.server' || true) - [ -n "$PGREP" ] && stop_opencut_pids KILL - sleep 1 +# ------------------------------------------------------------ +# 3) Montar estatísticas +# ------------------------------------------------------------ +FILES="$(git status --porcelain | sed 's/^.../ - /' | head -80)" +STAT="$(git diff --stat HEAD | tail -1)" +TOTAL_FILES=$(echo "$CHANGES" | grep -c .) +NEW_FILES=$(echo "$CHANGES" | grep -c '^??' || true) +MODIFIED_FILES=$(echo "$CHANGES" | grep -c '^ M\|^M' || true) +DELETED_FILES=$(echo "$CHANGES" | grep -c '^ D\|^D' || true) + +# ------------------------------------------------------------ +# 4) Montar mensagem do commit +# ------------------------------------------------------------ +if [[ -n "$MSG_NOTA" ]]; then + BODY="$MSG_NOTA" +else + BODY="(sem nota em DEV-NOTES.md)" fi -# 3) Sobe pelo start-opencut.sh (venv, modelos, ffmpeg e tmp no Merongo) -if [ ! -x "$START_SCRIPT" ]; then - echo "Erro: $START_SCRIPT nao encontrado ou sem permissao de execucao" >&2 - notify "Falha: start-opencut.sh ausente" - exit 1 +COMMIT_MSG="feat: $(echo "$BODY" | head -1 | cut -c1-50) + +$BODY + +Resumo: +- $TOTAL_FILES arquivos alterados +- $NEW_FILES novos +- $MODIFIED_FILES modificados +- $DELETED_FILES removidos + +$STAT + +Arquivos: +$FILES" + +say "Mensagem do commit:" +echo "----------------------------------------------" +echo "$COMMIT_MSG" +echo "----------------------------------------------" +echo + +if [[ "${DRY:-0}" = "1" ]]; then + say "DRY=1 - nao vou commitar/push." + exit 0 fi -mkdir -p "$RUNTIME_DIR" -mkdir -p "/Volumes/Merongo/SISTEMAS/OPENCUT-MEDIA/tmp" -nohup "$START_SCRIPT" > "$LOG" 2>&1 & -NEW_PID=$! -echo "Backend iniciado (PID $NEW_PID). Aguardando health check..." -# 4) Espera ate 60s pelo health check -for i in {1..30}; do - if server_ok; then - start_bridge - notify "Backend pronto em $URL" - open_ui - exit 0 - fi - if ! kill -0 $NEW_PID 2>/dev/null; then - break - fi - sleep 2 -done +# ------------------------------------------------------------ +# 5) Commit +# ------------------------------------------------------------ +say "Adicionando arquivos e commitando..." +git add -A +git commit -m "$COMMIT_MSG" || die "commit falhou" +ok "commit criado: $(git rev-parse --short HEAD)" +echo -echo "Falha ao iniciar. Log em $LOG" >&2 -notify "Falha ao iniciar o backend. Veja $LOG" -tail -30 "$LOG" -exit 1 +# ------------------------------------------------------------ +# 6) Push (automático ou interativo) +# ------------------------------------------------------------ +if [[ "${AUTO:-0}" = "1" ]]; then + RESP="s" +else + printf "Enviar para '%s' agora? [s/N] " "$REMOTE" + read -r RESP +fi + +case "$RESP" in + [sS]|[sS][iI][mM]|[yY]|[yY][eE][sS]) ;; + *) warn "push cancelado - commit local salvo"; exit 0 ;; +esac + +say "Fazendo push para '$REMOTE'..." +git push "$REMOTE" "$BRANCH" || die "push falhou" +ok "push concluido - deploy finalizado!" diff --git a/admin/OpenCut.command b/admin/inativos/OpenCut.command similarity index 100% rename from admin/OpenCut.command rename to admin/inativos/OpenCut.command diff --git a/admin/update.command b/admin/inativos/update.command similarity index 100% rename from admin/update.command rename to admin/inativos/update.command diff --git a/code/cep-plugin/index.html b/code/cep-plugin/index.html index f3005d8..78a5b9b 100755 --- a/code/cep-plugin/index.html +++ b/code/cep-plugin/index.html @@ -25,6 +25,9 @@ + @@ -218,6 +221,44 @@ + + +