saber: lo instalado en la maquina y los docs de repos clonados entran al indice

instalado.py lee los .desktop y los paquetes para saber que hay en el equipo y
para que sirve cada cosa. indexa.py lo engancha, y con el los docs markdown de
las herramientas clonadas en CODERS. Las dos fuentes son personales: se quedan
en el indice de la maquina y no entran en el publico.

busca_cli.py expone el mismo motor que usa el cerebro (saber.busca) para
consultar el indice desde la terminal, con --n y --json.

reentrena_noche.sh encadena las fases del reentrenamiento largo y las deja
corriendo horas; cada fase es reanudable por su cuenta.

eval del indice vivo: hit@1 43/57 (75%), hit@5 55/57 (96%), sim 0.909.
This commit is contained in:
sito 2026-08-18 12:14:57 +02:00
parent b1f8118272
commit 7c5381eea7
7 changed files with 369 additions and 2 deletions

View file

@ -200,6 +200,57 @@ def _ganchos(solo_publico=False):
return ganchos
def _instalado():
"""Las aplicaciones instaladas en esta maquina (instalado.py). Personal."""
try:
try:
from saber import instalado
except ImportError:
import instalado
except ImportError:
return []
fragmentos = []
for e in instalado.entradas():
e.pop("publico", None)
fragmentos.append(e)
return fragmentos
# Repos de ~/COFRE/CODERS cuyos docs (markdown) vale la pena indexar aunque no
# sean un perfil de COFRE. Personal: son herramientas de terceros clonadas aqui.
DOCS_REPOS = [
("strix", "PENTESTERS", ["README.md", "AGENTS.md", "docs", "benchmarks"]),
]
def _docs_extra():
"""Docs markdown de herramientas clonadas en CODERS (strix, etc.). Personal."""
coders = os.path.join(COFRE, "CODERS")
fragmentos = []
for nombre, perfil, rutas in DOCS_REPOS:
base = os.path.join(coders, nombre)
if not os.path.isdir(base):
continue
ficheros = []
for r in rutas:
p = os.path.join(base, r)
if os.path.isfile(p) and p.endswith(".md"):
ficheros.append(p)
elif os.path.isdir(p):
for raiz, dirs, fs in os.walk(p):
if IGNORA.search(raiz):
dirs[:] = []
continue
ficheros += [os.path.join(raiz, f) for f in fs if f.endswith(".md")]
for doc in ficheros:
for trozo in trocea(doc):
fragmentos.append({
"tipo": "metodologia", "herramienta": nombre, "perfil": perfil,
"tema": nombre, "fichero": os.path.relpath(doc, coders),
"texto": trozo})
return fragmentos
def _conocimiento():
"""El pack de metodologia y manuales que viene con el repo (conocimiento/)."""
fragmentos = []
@ -325,14 +376,24 @@ def construye(solo_cuenta=False, solo_cofre=False):
if catalogo:
print(f" CATALOGO {len(catalogo):5d} fragmentos (awesome lists)")
instalado = _instalado()
if instalado:
print(f" INSTALADO {len(instalado):5d} apps/paquetes de esta maquina")
docs_extra = _docs_extra()
if docs_extra:
print(f" DOCS-CODERS {len(docs_extra):5d} fragmentos (strix, etc.)")
ganchos = _ganchos(solo_publico=False)
if ganchos:
print(f" GANCHOS {len(ganchos):5d} preguntas sintetizadas")
todo = fichas + fragmentos + sistema + conocimiento + catalogo + ganchos
todo = (fichas + fragmentos + sistema + conocimiento + catalogo
+ instalado + docs_extra + ganchos)
print(f"\n total: {len(fichas)} fichas + {len(fragmentos)} apuntes + "
f"{len(sistema)} sistema + {len(conocimiento)} conocimiento + "
f"{len(catalogo)} catalogo + {len(ganchos)} ganchos = {len(todo)} entradas")
f"{len(catalogo)} catalogo + {len(instalado)} instalado + "
f"{len(docs_extra)} docs + {len(ganchos)} ganchos = {len(todo)} entradas")
if solo_cuenta:
return 0