saber: catalogo de awesome lists en el RAG

- awesome.py parsea awesome lists (markdown y RST): limpia enlaces y badges,
  agrupa cada categoria en un fragmento, y etiqueta fuente + licencia.
- indexa.py las incluye; en el indice PUBLICO solo entran las redistribuibles:
  awesome (sindresorhus, CC0) y awesome-selfhosted (CC BY-SA 3.0). awesome-hacking
  (sin licencia) se indexa solo en el indice personal si se clona en CODERS.
- saber-publico.jsonl pasa a 699 entradas (glosario + conocimiento + catalogo).
- ATRIBUCION.md acredita fuentes y licencias; docs/rag.md lo documenta.
This commit is contained in:
sito 2026-08-16 18:55:35 +02:00
parent 9fa0a40edf
commit 43335d329f
5 changed files with 500 additions and 6 deletions

View file

@ -149,6 +149,22 @@ def trocea(ruta):
yield buffer.strip()
def _catalogo(solo_publico=False):
"""Las awesome lists clonadas en CODERS, si el modulo y las listas estan."""
try:
try:
from saber import awesome
except ImportError:
import awesome
except ImportError:
return []
fragmentos = []
for e in awesome.entradas(solo_publico=solo_publico):
e.pop("publico", None) # marca interna de filtrado, no va al indice
fragmentos.append(e)
return fragmentos
def _conocimiento():
"""El pack de metodologia y manuales que viene con el repo (conocimiento/)."""
fragmentos = []
@ -201,8 +217,10 @@ def construye_publico(solo_cuenta=False):
import glosario
glo = list(glosario.entradas())
con = _conocimiento()
todo = glo + con
print(f" glosario {len(glo)} + conocimiento {len(con)} = {len(todo)} entradas publicas")
cat = _catalogo(solo_publico=True) # solo las awesome de licencia redistribuible
todo = glo + con + cat
print(f" glosario {len(glo)} + conocimiento {len(con)} + catalogo {len(cat)} "
f"= {len(todo)} entradas publicas")
if solo_cuenta:
return 0
_guarda_indice(todo, INDICE_PUBLICO)
@ -262,9 +280,16 @@ def construye(solo_cuenta=False, solo_cofre=False):
conocimiento = _conocimiento()
print(f" CONOCIMIENTO {len(conocimiento):5d} fragmentos (pack del repo)")
todo = fichas + fragmentos + sistema + conocimiento
# Las awesome lists clonadas en CODERS (catalogo de que-existe-para-X). En el
# indice personal entran todas; el filtro por licencia solo aplica al publico.
catalogo = _catalogo(solo_publico=False)
if catalogo:
print(f" CATALOGO {len(catalogo):5d} fragmentos (awesome lists)")
todo = fichas + fragmentos + sistema + conocimiento + catalogo
print(f"\n total: {len(fichas)} fichas + {len(fragmentos)} apuntes + "
f"{len(sistema)} sistema + {len(conocimiento)} conocimiento = {len(todo)} entradas")
f"{len(sistema)} sistema + {len(conocimiento)} conocimiento + "
f"{len(catalogo)} catalogo = {len(todo)} entradas")
if solo_cuenta:
return 0