Skip to content

feat: agentes knowledge + docsearch (graphify ↔ Obsidian, cacheado, cross-tool) - #1

Draft
cacelass wants to merge 4 commits into
mainfrom
worktree-knowledge-graph-agents
Draft

cacelass wants to merge 4 commits into
mainfrom
worktree-knowledge-graph-agents

Conversation

@cacelass

@cacelass cacelass commented Jul 9, 2026

Copy link
Copy Markdown
Owner

Qué añade

Integra el grafo de conocimiento (graphify) con Obsidian mediante dos
agentes nuevos y un tool, cacheando al máximo, y siguiendo las convenciones de
kepano/obsidian-skills. Todo es
Python puro por CLI → funciona igual desde Claude Code, Codex, opencode o
cualquier herramienta con shell.

tools/graphify_tool.py — puente único con graphify (stdlib puro)

  • Resuelve el intérprete de graphify, build/update/query.
  • Detecta bóvedas de Obsidian.
  • Resúmenes de nodo padre: para cada hub, resume sus hijos y su
    correlación estructural (Jaccard de vecindarios) — p. ej. un nodo
    "información" con muchos papers hijos obtiene un resumen de qué agrupan y qué
    hijos se relacionan más.
  • Poda de nodos/referencias con backup graph.json.bak.
  • Genera Obsidian Flavored Markdown (properties, callouts, wikilinks) y
    vistas Obsidian Bases (.base).

agents/knowledge_agent.py — "cachea lo máximo"

  • setup_vault: detecta o crea una bóveda con árbol adaptado
    (papers/, code/, docs/, references/, media/), MOC, .base y nota de
    convención.
  • build: actualiza el grafo y lo exporta a Obsidian.
  • summarize_parents: resumen de nodos padre + correlación (cacheado).
  • sync: punto único que el git agent llama antes de cada commit.
  • Caché en graphify-out/cache/.

agents/docsearch_agent.py — navegación y limpieza del grafo

  • search (graphify query cacheado), neighbors, list_references,
    prune (quita información/referencias innecesarias; dry_run por defecto).

Integración con el commit

  • git_agent.commit_with_changelog delega en KnowledgeAgent.sync() → grafo +
    Obsidian se actualizan antes del commit (reemplaza las viejas helpers).
  • .gitignore: graphify-out/cache/ explícito.

Docs y tests

  • AGENTS.md y agents/README.md actualizados (22 agentes, nota cross-tool).
  • tests/test_graphify_tool.py: resúmenes, correlación, poda, backup, bóvedas,
    notas Obsidian y .base (stdlib, corre en CI del proyecto generado).

Nota sobre los commits

Este branch se creó desde origin/main, que no contenía el trabajo sin
commitear del working tree. Por eso hay dos commits:

  1. chore: snapshot ... — captura el WIP preexistente (schedule/doctor/env/…
    agents, gstack, tools) para que la feature construya sobre el estado real.
  2. feat(agents): knowledge + docsearch ...la feature de este PR,
    revisable en aislado.

Límite honesto

Los resúmenes y correlaciones son estructurales (topología del grafo), no
una lectura semántica del contenido — la extracción semántica la hace graphify
con GEMINI_API_KEY.

cacelass added 4 commits July 9, 2026 14:05
Baseline capture of the uncommitted working tree (schedule/doctor/env/make/
refactor agents, gstack, new tools, doc updates) so the knowledge/docsearch
feature that follows builds on the real current state, not on origin/main.
…eado

Añade dos agentes y un tool que integran el grafo de conocimiento (graphify)
con Obsidian, siguiendo las convenciones de kepano/obsidian-skills, y lo
mantienen cacheado al máximo. Todo es Python puro por CLI: funciona igual
desde Claude Code, Codex, opencode o cualquier herramienta con shell.

- tools/graphify_tool.py: puente único con graphify. Resuelve el intérprete,
  build/update/query, detecta bóvedas de Obsidian, calcula resúmenes de NODO
  PADRE con la correlación estructural entre hijos (Jaccard de vecindarios),
  poda nodos/referencias con backup, y genera notas Obsidian Flavored Markdown
  (properties, callouts, wikilinks) + vistas Obsidian Bases (.base). Stdlib puro.
- agents/knowledge_agent.py: 'cachea lo máximo'. status, setup_vault
  (detecta/crea bóveda con árbol adaptado papers/code/docs/references/media,
  MOC, .base y nota de convención obsidian-skills), build (graphify + export
  Obsidian), summarize_parents (resumen de hijos + correlación), sync (punto
  único para el commit). Caché en graphify-out/cache/.
- agents/docsearch_agent.py: navega el grafo. search (graphify query cacheado),
  neighbors, list_references, prune (dry_run por defecto, deja graph.json.bak).
- git_agent.commit_with_changelog delega en KnowledgeAgent.sync() antes del
  commit, unificando la actualización de grafo + Obsidian.
- .gitignore: graphify-out/cache/ explícito.
- tests/test_graphify_tool.py: resúmenes, correlación, poda, backup, bóvedas,
  notas Obsidian y .base.
- Docs: AGENTS.md y agents/README.md (22 agentes, nota cross-tool + obsidian-skills).

Límite honesto: resúmenes y correlaciones son estructurales (topología del
grafo), no lectura semántica del contenido.
- graphify_tool.run_cli: el fallback al binario 'graphify' del PATH construía
  'graphify -m graphify ...' (inválido). Se separa command_prefix: intérprete
  del marcador -> [py,-m,graphify]; si no, binario -> [graphify].
- docsearch.search: la clave de caché usaba hash(), que lleva PYTHONHASHSEED y
  cambia por proceso -> la caché en disco nunca acertaba entre invocaciones CLI.
  Ahora usa hashlib (estable).
- docsearch.search: cacheaba también las consultas fallidas (error transitorio
  cacheado para siempre). Ahora lanza en fallo para no cachearlo.
- knowledge.summarize_parents: la clave de caché iba por nº de nodos/aristas;
  dos grafos distintos con los mismos conteos servían un resumen obsoleto.
  Ahora va por mtime de graph.json.
- knowledge.build: siempre usaba --update; sin grafo previo no hay manifest.
  Nuevo GraphifyTool.build: build completo la 1ª vez, --update después.
- graphify_tool.prune(drop_isolated): lógica O(n^2) y frágil ('n not in lista'
  comparando dicts). Reescrita con sets, O(n).
- graphify_tool._correlated_pairs: O(k^2) explotaba en hubs gigantes. Tope
  determinista a los 200 hijos de mayor grado.
- graphify_tool.detect_obsidian_vaults: rglob descendía igualmente en .venv/
  node_modules (corre en cada commit). Reescrito con os.walk podando in situ.

Tests añadidos: command_prefix (marcador vs binario) y prune drop_isolated.
…itiva)

Añade búsqueda de papers académicos relacionados con el proyecto y un
supervisor que coordina workers que compiten. Sin API key, sin deps nuevas
(HTTP con RestTool/urllib, XML con stdlib), cross-tool por CLI.

- tools/research_tool.py: busca papers en fuentes abiertas (arXiv Atom,
  OpenAlex JSON con reconstrucción de abstract desde el índice invertido y
  recuento de citas). Todo lo no-red es determinista y testeable offline:
  extracción de keywords, relevancia léxica, dedupe por DOI/título, ranking.
- agents/research_agent.py: busca papers del PROYECTO. Deriva keywords de
  README + pyproject + nodos más centrales del grafo (find_papers), búsqueda
  directa (search), keywords (project_keywords). Cacheado en graphify-out/cache/.
- agents/supervisor_agent.py: patrón pedido — workers trabajan por separado,
  proponen, se prueban y se elige el mejor y se pule. 'research' compite los
  backends arXiv vs OpenAlex EN PARALELO (hilos), puntúa cada propuesta
  (0.5·relevancia + 0.4·cobertura + 0.1·volumen), elige la ganadora y pule
  fusionando lo mejor de ambas (dedupe + re-rank). 'compete' es genérico:
  enfrenta cualquier {agent, action, kwargs}. Arbitraje determinista, no juez LLM.
- tests/test_research_tool.py: parsing arXiv/OpenAlex, keywords, relevancia,
  dedupe, ranking (offline, corre en CI).
- Docs: AGENTS.md y agents/README.md (24 agentes).

Verificado end-to-end contra las APIs reales de arXiv y OpenAlex.

Límite honesto: la relevancia es léxica, no semántica.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant