← Files Pesquisa MirandasTechARCHIVED FILE

scripts/resumo_sessao.py

3.45 KB · Oct 5, 2026 · 18:33 UTC

↓ Download file

#!/usr/bin/env python3
"""Resumo curto do projeto para o início da sessão (hook SessionStart) ou para o Pesquisador.
Lê PROGRESSO.md, DECISOES.md e USO_DE_IA.csv da pasta atual. Só lê; imprime até ~8 linhas.
    python3 resumo_sessao.py            # texto
    python3 resumo_sessao.py --json     # dicionário com os mesmos dados"""
import csv, json, os, re, sys, datetime as dt
from pathlib import Path

def tabela(txt, cabecalho):
    """Linhas de uma tabela Markdown cujo cabeçalho começa por `cabecalho`."""
    i = txt.find(cabecalho)
    if i < 0: return []
    linhas = []
    for l in txt[i:].splitlines()[2:]:
        if not l.startswith("|"): break
        linhas.append([c.strip() for c in l.strip("|").split("|")])
    return linhas

def ler(pasta="."):
    pasta = Path(pasta); p = pasta / "PROGRESSO.md"
    if not p.is_file(): return None
    txt = p.read_text(encoding="utf-8")
    tema = (re.search(r"^# Progresso — (.+)$", txt, re.M) or [None, ""])[1]
    esquema = int((re.search(r"<!-- esquema: (\d+)", txt) or [None, "0"])[1])
    fases = tabela(txt, "| Fase | Nome |")
    fechadas = [f for f in fases if len(f) > 4 and f[4].lower() == "[x]"]
    abertas = [f for f in fases if len(f) > 4 and f[4].lower() != "[x]"]
    atual = abertas[0] if abertas else None
    checks = {}
    itens = re.findall(r"^\| ([MIBL])(\d+) \|[^\n]*\| (\[[ xX]\]) \|", txt, re.M)
    for pref, n, est in itens:
        c = checks.setdefault(pref, {"feitos": 0, "total": 0}); c["total"] += 1
        if est.lower() == "[x]": c["feitos"] += 1
    mod = dt.datetime.fromtimestamp(p.stat().st_mtime); dias = (dt.datetime.now() - mod).days
    ultima = None
    d = pasta / "DECISOES.md"
    if d.is_file():
        blocos = re.findall(r"^## (D\d+) — (.+?)\n\*\*Data:\*\* *([^·\n]+)", d.read_text(encoding="utf-8"), re.M)
        reais = [(k, t.strip(), dta.strip()) for k, t, dta in blocos if re.match(r"\d{4}-\d{2}-\d{2}", dta.strip())]
        if reais: ultima = reais[-1]
    usos = 0; u = pasta / "USO_DE_IA.csv"
    if u.is_file():
        with open(u, encoding="utf-8", newline="") as f: usos = sum(1 for r in csv.DictReader(f) if any(r.values()))
    return {"tema": tema, "esquema": esquema, "fase_atual": atual and {"n": atual[0], "nome": atual[1], "porta": atual[2]},
            "fases_fechadas": [f[0] for f in fechadas], "checklists": checks, "dias_sem_alteracao": dias,
            "ultima_decisao": ultima and {"id": ultima[0], "titulo": ultima[1], "data": ultima[2]}, "usos_de_ia": usos}

def texto(r):
    if not r: return ""
    out = [f"Projeto de pesquisa MirandasTech: {r['tema']}"]
    fa = r["fase_atual"]
    out.append(f"Fase atual: {fa['n']} — {fa['nome']} (porta: {fa['porta']})" if fa else "Todas as onze fases fechadas.")
    out.append("Fases fechadas: " + (", ".join(r["fases_fechadas"]) or "nenhuma"))
    ck = " · ".join(f"{k} {v['feitos']}/{v['total']}" for k, v in sorted(r["checklists"].items()))
    if ck: out.append("Checklists: " + ck)
    ud = r["ultima_decisao"]
    out.append(f"Última decisão: {ud['id']} — {ud['titulo']} ({ud['data']})" if ud else "Nenhuma decisão datada em DECISOES.md ainda.")
    out.append(f"Usos de IA registrados: {r['usos_de_ia']} · PROGRESSO.md sem alteração há {r['dias_sem_alteracao']} dia(s)")
    out.append('Diga: "Pesquisador, onde paramos?"')
    return "\n".join(out)

if __name__ == "__main__":
    r = ler(".")
    if r is None: sys.exit(0)
    print(json.dumps(r, ensure_ascii=False, indent=1) if "--json" in sys.argv else texto(r))

SHA-256: 0ff2ce033e22c77ccfcc64dac490a3165cafa70f9cd8b6e04b901472be464c8b