feat: - tornado obrigatório registrar uma linha de resum

- tornado obrigatório registrar uma linha de resumo para cada implementação concluída
- corrigido o Scanner e o Retakes no painel usando o Python do venv (3.14) em vez do /usr/bin/python3 3.9 e injetado o caminho da engine no executar_retakes.py

Resumo:
- 7 arquivos alterados
- 0 novos
- 7 modificados
- 0 removidos

 7 files changed, 57 insertions(+), 8 deletions(-)

Arquivos:
  - .gitignore
  - AGENTS.md
  - CLAUDE.md
  - admin/DEV-NOTES.md
  - admin/deploy.command
  - code/cep-plugin/main.js
  - code/engine/executar_retakes.py
This commit is contained in:
João Henrique
2026-09-08 17:35:07 -04:00
parent 0a01b16148
commit 5cc50f00a4
7 changed files with 57 additions and 8 deletions
+3
View File
@@ -28,3 +28,6 @@ build/
# Temporary files # Temporary files
*.tmp *.tmp
*.temp *.temp
# Resumo temporário usado pelo admin/deploy.command para detalhar o commit
admin/COMMIT-DETAILS.md
+13
View File
@@ -2,6 +2,19 @@
## Project Skills ## 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 ## 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. 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.
+9
View File
@@ -2,6 +2,15 @@
## Project Context ## 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. This is a software engineering project that uses mattpocock/skills for code quality and organization.
## Code Search: use the RAG first ## Code Search: use the RAG first
+5 -3
View File
@@ -1,9 +1,11 @@
# DEV-NOTES — Registro de Alterações (Jhonny Editor) # DEV-NOTES — Registro de Alterações (Jhonny Editor)
> **Como usar:** > **Como usar:**
> 1. Ao fazer alterações, adicione bullets na seção `## NOVO NESTE LOTE` > 1. Para alterações feitas pelo agente, use `admin/COMMIT-DETAILS.md`.
> 2. Rod `admin/deploy.command` — ele lê essas notas e usa como descrição do commit > 2. Rode `admin/deploy.command` — ele usa o resumo como detalhe do commit.
> 3. Após o deploy, mova os bullets para `## Histórico` e esvazie `NOVO NESTE LOTE` > 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.
--- ---
+12 -2
View File
@@ -21,6 +21,7 @@ umask 077
ROOT="$(cd "$(dirname "$0")/.." && pwd -P)" ROOT="$(cd "$(dirname "$0")/.." && pwd -P)"
ADMIN="$ROOT/admin" ADMIN="$ROOT/admin"
NOTES="$ADMIN/DEV-NOTES.md" NOTES="$ADMIN/DEV-NOTES.md"
COMMIT_DETAILS="$ADMIN/COMMIT-DETAILS.md"
REMOTE="origin" REMOTE="origin"
BRANCH="main" BRANCH="main"
@@ -57,10 +58,16 @@ echo " ... ($(echo "$CHANGES" | grep -c .) itens)"
echo echo
# ------------------------------------------------------------ # ------------------------------------------------------------
# 2) Extrair notas do DEV-NOTES.md # 2) Extrair detalhes preparados pelo agente
# ------------------------------------------------------------ # ------------------------------------------------------------
MSG_NOTA="" 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 '^<!--' \
| grep -v '^-->' || true)"
fi
if [[ -z "$MSG_NOTA" && -f "$NOTES" && -s "$NOTES" ]]; then
MSG_NOTA="$(awk ' MSG_NOTA="$(awk '
/^## NOVO NESTE LOTE/ {f=1; next} /^## NOVO NESTE LOTE/ {f=1; next}
/^## / && f {exit} /^## / && f {exit}
@@ -124,6 +131,9 @@ fi
say "Adicionando arquivos e commitando..." say "Adicionando arquivos e commitando..."
git add -A git add -A
git commit -m "$COMMIT_MSG" || die "commit falhou" git commit -m "$COMMIT_MSG" || die "commit falhou"
if [[ -f "$COMMIT_DETAILS" ]]; then
: > "$COMMIT_DETAILS"
fi
ok "commit criado: $(git rev-parse --short HEAD)" ok "commit criado: $(git rev-parse --short HEAD)"
echo echo
+7 -3
View File
@@ -230,6 +230,10 @@ function switchTab(name) {
// A aba apenas controla o processo e mostra resultados; a análise inteira // A aba apenas controla o processo e mostra resultados; a análise inteira
// acontece na engine (scanner/retakes), chamada via executar_retakes.py. // 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"; 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 retakesCasoAtual = null;
var retakesGrupos = []; var retakesGrupos = [];
var retakesProcesso = null; var retakesProcesso = null;
@@ -354,7 +358,7 @@ function retakesAnalisar() {
taskStart("Retakes", "Preparando análise", null); taskStart("Retakes", "Preparando análise", null);
document.getElementById("retakesProgressoCard").hidden = false; document.getElementById("retakesProgressoCard").hidden = false;
document.getElementById("retakesProgressoEtapa").textContent = "Analisando retakes…"; 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"] }); { cwd: "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code/engine", stdio: ["ignore", "pipe", "pipe"] });
retakesProcesso = child; retakesProcesso = child;
var resto = ""; var resto = "";
@@ -393,7 +397,7 @@ function retakesRevisar(grupoId, acao) {
var pedido = { acao: "revisar", video_id: retakesCasoAtual, revisao: { grupo_id: grupoId, acao: 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"); var entrada = path.join(os.tmpdir(), "revisao-retakes-" + Date.now() + ".json");
fs.writeFileSync(entrada, JSON.stringify(pedido), "utf-8"); 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"] }); { cwd: "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code/engine", stdio: ["ignore", "pipe", "pipe"] });
child.on("close", function (codigo) { child.on("close", function (codigo) {
if (codigo !== 0) { showToast("err", "Não foi possível registrar a revisão."); return; } 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); setBusy("btnScannerProcess",true); taskStart("Scanner", "Preparando análise", null);
var spawnOptions={cwd:"/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code",stdio:["ignore","pipe","pipe"]}; 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 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=""; var stderr="", stdout="";
child.stdout.on("data",function(chunk) { child.stdout.on("data",function(chunk) {
stdout += chunk.toString(); var lines=stdout.split("\n"); stdout=lines.pop(); stdout += chunk.toString(); var lines=stdout.split("\n"); stdout=lines.pop();
+8
View File
@@ -36,6 +36,14 @@ import sys
from dataclasses import asdict from dataclasses import asdict
from pathlib import Path 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 ( from engine.scanner.retakes import (
STATUS_CONFIRMADO, STATUS_CONFIRMADO,
STATUS_IGNORADO, STATUS_IGNORADO,