diff --git a/.gitignore b/.gitignore index f26ed53..f4dd81c 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,6 @@ build/ # Temporary files *.tmp *.temp + +# Resumo temporário usado pelo admin/deploy.command para detalhar o commit +admin/COMMIT-DETAILS.md diff --git a/AGENTS.md b/AGENTS.md index eb045fe..ee2c703 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,6 +2,19 @@ ## Project Skills +## Resumo obrigatório para commits + +Toda pessoa, agente ou IA que implementar qualquer alteração neste projeto +deve, antes de finalizar o trabalho, acrescentar **uma única linha** ao final +de `admin/COMMIT-DETAILS.md`, em PT-BR, resumindo o que foi feito. Nunca +substituir nem apagar as linhas já registradas durante o lote. A linha deve +ser curta, sem credenciais, tokens ou dados sensíveis; por exemplo: +`- corrigido o carregamento do Scanner quando executado pelo painel CEP`. + +O script `admin/deploy.command` incorpora todas as linhas na mensagem do +commit e limpa o arquivo somente após o commit ser concluído com sucesso. Se +o commit falhar, os resumos devem ser preservados para nova tentativa. + ## Convenções obrigatórias de Python / OO Todo código Python em `code/engine/` deve seguir a skill **`.agents/skills/boas-praticas-oo/SKILL.md`** (boas práticas de programação orientada a objetos) — obrigatória, aplicada automaticamente, não apenas quando solicitada. Leia-a antes de criar, modificar, corrigir, revisar, refatorar ou ampliar qualquer sistema Python. diff --git a/CLAUDE.md b/CLAUDE.md index 5340633..077c4c8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,6 +2,15 @@ ## Project Context +## Registro obrigatório de alterações + +Ao concluir qualquer implementação, acrescentar uma única linha em +`admin/COMMIT-DETAILS.md` descrevendo resumidamente o que foi alterado. A +linha deve ser adicionada ao final do arquivo, sem apagar os registros +anteriores do lote. O resumo não pode conter segredos ou tokens. O +`admin/deploy.command` usa essas linhas na mensagem do commit e limpa o +arquivo somente depois de um commit bem-sucedido. + This is a software engineering project that uses mattpocock/skills for code quality and organization. ## Code Search: use the RAG first diff --git a/admin/DEV-NOTES.md b/admin/DEV-NOTES.md index f22064f..8baf547 100644 --- a/admin/DEV-NOTES.md +++ b/admin/DEV-NOTES.md @@ -1,9 +1,11 @@ # DEV-NOTES — Registro de Alterações (Jhonny Editor) > **Como usar:** -> 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` +> 1. Para alterações feitas pelo agente, use `admin/COMMIT-DETAILS.md`. +> 2. Rode `admin/deploy.command` — ele usa o resumo como detalhe do commit. +> 3. Após um commit bem-sucedido, o arquivo temporário é limpo automaticamente. +> +> O bloco abaixo continua como fallback para notas manuais ou histórico do projeto. --- diff --git a/admin/deploy.command b/admin/deploy.command index 083c543..4242ff7 100755 --- a/admin/deploy.command +++ b/admin/deploy.command @@ -21,6 +21,7 @@ umask 077 ROOT="$(cd "$(dirname "$0")/.." && pwd -P)" ADMIN="$ROOT/admin" NOTES="$ADMIN/DEV-NOTES.md" +COMMIT_DETAILS="$ADMIN/COMMIT-DETAILS.md" REMOTE="origin" BRANCH="main" @@ -57,10 +58,16 @@ echo " ... ($(echo "$CHANGES" | grep -c .) itens)" echo # ------------------------------------------------------------ -# 2) Extrair notas do DEV-NOTES.md +# 2) Extrair detalhes preparados pelo agente # ------------------------------------------------------------ MSG_NOTA="" -if [[ -f "$NOTES" && -s "$NOTES" ]]; then +if [[ -f "$COMMIT_DETAILS" && -s "$COMMIT_DETAILS" ]]; then + MSG_NOTA="$(sed 's/^[[:space:]]*//; s/[[:space:]]*$//' "$COMMIT_DETAILS" \ + | grep -v '^$' \ + | grep -v '^' || true)" +fi +if [[ -z "$MSG_NOTA" && -f "$NOTES" && -s "$NOTES" ]]; then MSG_NOTA="$(awk ' /^## NOVO NESTE LOTE/ {f=1; next} /^## / && f {exit} @@ -124,6 +131,9 @@ fi say "Adicionando arquivos e commitando..." git add -A git commit -m "$COMMIT_MSG" || die "commit falhou" +if [[ -f "$COMMIT_DETAILS" ]]; then + : > "$COMMIT_DETAILS" +fi ok "commit criado: $(git rev-parse --short HEAD)" echo diff --git a/code/cep-plugin/main.js b/code/cep-plugin/main.js index c9d0775..32bbbc1 100755 --- a/code/cep-plugin/main.js +++ b/code/cep-plugin/main.js @@ -230,6 +230,10 @@ function switchTab(name) { // A aba apenas controla o processo e mostra resultados; a análise inteira // acontece na engine (scanner/retakes), chamada via executar_retakes.py. var RETAKES_ENGINE_SCRIPT = "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code/engine/executar_retakes.py"; +// A engine usa tipos do Python 3.10+ (ex.: `X | None`, `dict[str, ...]`), que +// o `/usr/bin/python3` do macOS (3.9) não aceita. Usar o mesmo venv do projeto +// (Python 3.14, com faster_whisper) garante que Scanner e Retakes carreguem bem. +var SCANNER_PYTHON_BIN = "/Volumes/Merongo/SISTEMAS/venvs/whisperx-transcricao/bin/python"; var retakesCasoAtual = null; var retakesGrupos = []; var retakesProcesso = null; @@ -354,7 +358,7 @@ function retakesAnalisar() { taskStart("Retakes", "Preparando análise", null); document.getElementById("retakesProgressoCard").hidden = false; document.getElementById("retakesProgressoEtapa").textContent = "Analisando retakes…"; - var child = childProcess.spawn("python3", [RETAKES_ENGINE_SCRIPT, entrada, path.join(retakesRaiz(), retakesCasoAtual)], + var child = childProcess.spawn(SCANNER_PYTHON_BIN, [RETAKES_ENGINE_SCRIPT, entrada, path.join(retakesRaiz(), retakesCasoAtual)], { cwd: "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code/engine", stdio: ["ignore", "pipe", "pipe"] }); retakesProcesso = child; var resto = ""; @@ -393,7 +397,7 @@ function retakesRevisar(grupoId, acao) { var pedido = { acao: "revisar", video_id: retakesCasoAtual, revisao: { grupo_id: grupoId, acao: acao } }; var entrada = path.join(os.tmpdir(), "revisao-retakes-" + Date.now() + ".json"); fs.writeFileSync(entrada, JSON.stringify(pedido), "utf-8"); - var child = childProcess.spawn("python3", [RETAKES_ENGINE_SCRIPT, entrada, path.join(retakesRaiz(), retakesCasoAtual)], + var child = childProcess.spawn(SCANNER_PYTHON_BIN, [RETAKES_ENGINE_SCRIPT, entrada, path.join(retakesRaiz(), retakesCasoAtual)], { cwd: "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code/engine", stdio: ["ignore", "pipe", "pipe"] }); child.on("close", function (codigo) { if (codigo !== 0) { showToast("err", "Não foi possível registrar a revisão."); return; } @@ -511,7 +515,7 @@ function scannerProcess() { setBusy("btnScannerProcess",true); taskStart("Scanner", "Preparando análise", null); var spawnOptions={cwd:"/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code",stdio:["ignore","pipe","pipe"]}; var huggingFaceEnvironment=hfSpawnOptions(); if(huggingFaceEnvironment&&huggingFaceEnvironment.env) spawnOptions.env=huggingFaceEnvironment.env; - var child=childProcess.spawn("python3",[SCANNER_ENGINE_SCRIPT,input,scannerReportPath],spawnOptions); + var child=childProcess.spawn(SCANNER_PYTHON_BIN,[SCANNER_ENGINE_SCRIPT,input,scannerReportPath],spawnOptions); var stderr="", stdout=""; child.stdout.on("data",function(chunk) { stdout += chunk.toString(); var lines=stdout.split("\n"); stdout=lines.pop(); diff --git a/code/engine/executar_retakes.py b/code/engine/executar_retakes.py index b4e01da..0ded068 100644 --- a/code/engine/executar_retakes.py +++ b/code/engine/executar_retakes.py @@ -36,6 +36,14 @@ import sys from dataclasses import asdict from pathlib import Path +# O painel chama este arquivo com cwd ``code/engine`` e o Python inclui apenas +# essa pasta no caminho de importação. Injetar ``code`` (pai do pacote +# ``engine``) para que os importes da engine funcionem, como em +# ``executar_scanner.py``. +CAMINHO_DO_CODIGO = Path(__file__).resolve().parent.parent +if str(CAMINHO_DO_CODIGO) not in sys.path: + sys.path.insert(0, str(CAMINHO_DO_CODIGO)) + from engine.scanner.retakes import ( STATUS_CONFIRMADO, STATUS_IGNORADO,