saber: manuales cosechados e indice publico pre-construido

- manuales.py cosecha el --help de las herramientas que no traen man page
  (ffuf, sqlmap, suite impacket, netexec, hydra...) y lo escribe como markdown
  en conocimiento/09 - Manuales/. Es la referencia de opciones que la man page
  no da; complementa el cheatsheet de invocaciones comunes.
- indexa.py --publico construye saber-publico.jsonl: glosario + pack de
  conocimiento con los vectores ya calculados, 100% publico y portable.
- busca.py usa ese indice publico como fallback cuando no hay indice personal,
  asi un clon recien hecho consulta al instante sin reindexar nada.
- .gitignore deja pasar saber-publico.jsonl; el personal (saber.jsonl) sigue
  fuera.
- docs/rag.md y el README del pack documentan ambas cosas.
This commit is contained in:
sito 2026-08-16 18:43:56 +02:00
parent 1dfb3513e6
commit 9fa0a40edf
12 changed files with 1206 additions and 45 deletions

View file

@ -22,18 +22,31 @@ import os
AQUI = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
INDICE = os.path.join(AQUI, "datos", "saber.jsonl")
# El indice portable que viene en el repo. Se usa tal cual mientras no exista el
# personal, para que un clon recien hecho ya sepa de pentesting sin reindexar.
INDICE_PUBLICO = os.path.join(AQUI, "datos", "saber-publico.jsonl")
_modelo = None
_entradas = None
_matriz = None
def _fuente():
"""El indice personal si existe; si no, el publico que trae el repo."""
if os.path.exists(INDICE):
return INDICE
if os.path.exists(INDICE_PUBLICO):
return INDICE_PUBLICO
return None
def _carga():
global _modelo, _entradas, _matriz
if _entradas is not None:
return _entradas is not False
if not os.path.exists(INDICE):
fuente = _fuente()
if not fuente:
_entradas = False
return False
@ -41,7 +54,7 @@ def _carga():
from model2vec import StaticModel
entradas, vectores = [], []
with open(INDICE, encoding="utf-8") as f:
with open(fuente, encoding="utf-8") as f:
for l in f:
try:
d = json.loads(l)
@ -190,4 +203,4 @@ def resumen(tope_temas: int = 10) -> str:
def disponible() -> bool:
return os.path.exists(INDICE)
return _fuente() is not None