Files
ThothII/harness/tht/cli/evidence_cmd.py
T
marcopan 99b01b0407 feat(harness): port memory/search/evidence/db/decision cmd (Onda 3.2)
5 cmd foglia portati con rename + drift fix:
- memory_cmd: portato col modello registry INTATTO (TODO marker per il drop registry
  decisione spec 5 — task separato, richiede L2 per validare il rewrite su vectordb)
- search_cmd: creata search_app sub-app (era funzione standalone in ChironeWp3),
  registrata come 'tht search find'
- evidence_cmd, db_cmd, decision_cmd: port verbatim

Drift fix decision_cmd: DECISION_MIN_PHASE.get(type,1) -> load_workflow().decision_min_phase(type).
Check grep-per-file: ~15 residui nsp/PSD_SSL_CA nei messaggi utente fixati (nsp <cmd>
-> tht <cmd>, nsp.yaml -> workspace yaml, PSD_SSL_CA -> THT_SSL_CA).

Suite: 165 passed. tht --help ora mostra 10 sottocomandi.
2026-06-27 14:14:48 +02:00

77 lines
2.5 KiB
Python

from pathlib import Path
import typer
from tht.cli.config_cmd import CONFIG_OPT
from tht.cli.schema_cmd import _load_config_or_exit
from tht.cli._guards import require_vector_write_allowed
evidence_app = typer.Typer(help="Generazione e gestione delle evidence")
def evidence_root(cfg) -> Path:
return cfg.paths.artifacts / "evidence"
def _require_evidence_cfg(cfg):
if cfg.evidence is None:
typer.secho(
"ERRORE: sezione `evidence` mancante nel workspace yaml (serve `source_root`).",
fg=typer.colors.RED, err=True,
)
raise typer.Exit(code=1)
return cfg.evidence
@evidence_app.command("extract")
def extract_cmd(config: Path = CONFIG_OPT) -> None:
"""Rispecchia la cartella curata dell'ETL in artifacts/evidence/.
artifacts/evidence/ e' un artefatto derivato e rigenerabile: viene riallineato a
ogni estrazione (le evidence rimosse a monte spariscono anche qui). La gerarchia
per dominio della cartella sorgente viene preservata.
"""
import shutil
from tht.evidence.extract import load_curated
cfg = _load_config_or_exit(config)
sources = _require_evidence_cfg(cfg)
out_dir = evidence_root(cfg)
if out_dir.exists():
shutil.rmtree(out_dir)
written = 0
for rel, doc in load_curated(sources):
doc.save(out_dir / rel)
written += 1
if written == 0:
typer.secho(
f"ATTENZIONE: nessuna evidence trovata in "
f"{sources.source_root / sources.evidence_dir}",
fg=typer.colors.YELLOW, err=True,
)
raise typer.Exit(code=1)
typer.secho(f"OK: {written} evidence rispecchiate in {out_dir}", fg=typer.colors.GREEN)
@evidence_app.command("index")
def index_cmd(config: Path = CONFIG_OPT) -> None:
"""Embedda e sincronizza su pgvector tutte le evidence presenti in artifacts/."""
from tht.cli.vector_cmd import (
_print_stats,
make_embedder,
open_store,
require_vector_cfg,
)
from tht.evidence.model import load_evidence_dir
from tht.vectorstore.records import evidence_records
cfg = _load_config_or_exit(config)
require_vector_write_allowed(cfg, "evidence index")
require_vector_cfg(cfg)
docs = load_evidence_dir(evidence_root(cfg))
records = evidence_records(docs, cfg.vector.max_chunk_chars)
store = open_store(cfg, "evidence")
stats = store.sync(records, make_embedder(cfg.embeddings), kinds={"evidence"})
_print_stats(stats)