snapcontext 2.3.0__tar.gz → 3.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. {snapcontext-2.3.0/snapcontext.egg-info → snapcontext-3.1.0}/PKG-INFO +100 -1
  2. {snapcontext-2.3.0 → snapcontext-3.1.0}/README.md +99 -0
  3. {snapcontext-2.3.0 → snapcontext-3.1.0}/agentes.py +73 -1
  4. {snapcontext-2.3.0 → snapcontext-3.1.0}/orquestador.py +13 -1
  5. {snapcontext-2.3.0 → snapcontext-3.1.0}/pyproject.toml +3 -1
  6. {snapcontext-2.3.0 → snapcontext-3.1.0/snapcontext.egg-info}/PKG-INFO +100 -1
  7. {snapcontext-2.3.0 → snapcontext-3.1.0}/snapcontext.egg-info/SOURCES.txt +2 -0
  8. {snapcontext-2.3.0 → snapcontext-3.1.0}/snapcontext.py +1095 -3
  9. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_auto_017.py +190 -190
  10. snapcontext-3.1.0/tests/test_diagnostico_310.py +178 -0
  11. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_diff_editor_210.py +103 -103
  12. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_editor_ast_220.py +180 -180
  13. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_editor_propio_200.py +91 -91
  14. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_exe_150.py +72 -72
  15. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_jetbrains_170.py +115 -115
  16. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_mcp_014.py +225 -225
  17. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_mcp_140.py +255 -255
  18. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_memoria_015.py +186 -186
  19. snapcontext-3.1.0/tests/test_memoria_300.py +319 -0
  20. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_permisos_013.py +190 -190
  21. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_plan_012.py +279 -279
  22. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_plan_mcp_230.py +223 -223
  23. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_v010.py +248 -248
  24. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_validacion_130.py +133 -133
  25. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_vscode_016.py +94 -94
  26. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_web_160.py +95 -95
  27. {snapcontext-2.3.0 → snapcontext-3.1.0}/LICENSE +0 -0
  28. {snapcontext-2.3.0 → snapcontext-3.1.0}/setup.cfg +0 -0
  29. {snapcontext-2.3.0 → snapcontext-3.1.0}/snapcontext.egg-info/__pycache__/top_level.cpython-313.pyc +0 -0
  30. {snapcontext-2.3.0 → snapcontext-3.1.0}/snapcontext.egg-info/dependency_links.txt +0 -0
  31. {snapcontext-2.3.0 → snapcontext-3.1.0}/snapcontext.egg-info/entry_points.txt +0 -0
  32. {snapcontext-2.3.0 → snapcontext-3.1.0}/snapcontext.egg-info/requires.txt +0 -0
  33. {snapcontext-2.3.0 → snapcontext-3.1.0}/snapcontext.egg-info/top_level.txt +0 -0
  34. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_agentes.py +0 -0
  35. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_deteccion.py +0 -0
  36. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_embeddings_110.py +0 -0
  37. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_orquestador.py +0 -0
  38. {snapcontext-2.3.0 → snapcontext-3.1.0}/tests/test_web_120.py +0 -0
  39. {snapcontext-2.3.0 → snapcontext-3.1.0}/web/__init__.py +0 -0
  40. {snapcontext-2.3.0 → snapcontext-3.1.0}/web/app.py +0 -0
  41. {snapcontext-2.3.0 → snapcontext-3.1.0}/web/static/index.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snapcontext
3
- Version: 2.3.0
3
+ Version: 3.1.0
4
4
  Summary: SnapContext: Asistente de IA con contexto automático para desarrollo
5
5
  Author-email: SnapContext Contributors <tu@email.com>
6
6
  License-Expression: MIT
@@ -85,6 +85,50 @@ pip install aider-chat # ediciones de código
85
85
  snapcontext --init # asistente inicial + API key
86
86
  ```
87
87
 
88
+ ## 🧰 Instalación y onboarding sin fricción (v3.1.0)
89
+
90
+ Objetivo: instalar SnapContext y empezar a usarlo en menos de 5 minutos.
91
+
92
+ ### Modo offline con Ollama por defecto
93
+ Si no hay ninguna API key (`GEMINI_API_KEY`, `ANTHROPIC_API_KEY`,
94
+ `DEEPSEEK_API_KEY`, `GROQ_API_KEY`, …), SnapContext usa **Ollama
95
+ automáticamente** eligiendo el modelo más ligero disponible (`llama3.2`,
96
+ `phi3`, …). Si tampoco hay Ollama, muestra un mensaje claro:
97
+
98
+ > No se encontró una API key ni Ollama. Puedes instalar Ollama desde
99
+ > <https://ollama.com> o configurar una API key con `snapcontext --init`.
100
+
101
+ ### `snapcontext --diagnostico`
102
+ Revisa tu instalación con resumen en colores (verde OK / amarillo aviso /
103
+ rojo error):
104
+ - Versión de Python y si está en el PATH.
105
+ - Instalación de SnapContext (`python -m snapcontext --version`).
106
+ - Dependencias opcionales (`questionary`, `fastapi`, `sentence-transformers`, …).
107
+ - Estado del PATH (si `snapcontext` es accesible como comando).
108
+ - Memoria: integridad de la base SQLite y número de skills.
109
+ Cada problema incluye su solución sugerida.
110
+
111
+ ### `snapcontext --reparar`
112
+ Arregla instalaciones rotas:
113
+ - Limpia entornos corruptos de `uv` (carpetas vacías en `~/.snapcontext`).
114
+ - Reinstala SnapContext con `pip`.
115
+ - Recrea la base SQLite si está corrupta (respaldando la anterior).
116
+ - Si el PATH no incluye la carpeta de scripts, ejecuta `--setup-path`.
117
+
118
+ ### Tutorial y asistente mejorados
119
+ - `snapcontext --bienvenida`: tutorial interactivo de primeros pasos.
120
+ - `snapcontext --init` ahora también pregunta si quieres configurar Ollama
121
+ (ofreciendo abrir <https://ollama.com>), crear un proyecto de prueba y
122
+ ejecutar el tutorial interactivo.
123
+
124
+ ### Instalador gráfico para Windows
125
+ El instalador NSIS (`installer.nsi`, generado con
126
+ `scripts/empaquetar_exe.ps1`) ahora:
127
+ - Detecta Python y guía al usuario (abre python.org si falta).
128
+ - Añade una sección opcional "Instalar/actualizar con pip" que deja el
129
+ comando `snapcontext` disponible en cualquier terminal.
130
+ - Sigue añadiendo la carpeta al PATH y creando accesos directos.
131
+
88
132
  ## 🚀 Inicio rápido (5 minutos)
89
133
 
90
134
  ```bash
@@ -329,6 +373,61 @@ El resultado queda disponible para los pasos posteriores:
329
373
  consultable con `execute_command_status`) y `capture_output=false` para
330
374
  mostrar la salida en tiempo real.
331
375
 
376
+ ## 🧠 Aprendizaje autónomo: memoria SQLite, skills y curador (v3.0.0)
377
+
378
+ SnapContext ya no solo ejecuta tareas: **aprende de ellas**. Toda la
379
+ memoria avanzada vive en una base de datos SQLite (`~/.snapcontext/memoria.db`; sin dependencias externas: `sqlite3` viene con Python).
380
+
381
+ ### Skills: procedimientos reutilizables
382
+
383
+ - Al terminar una tarea con `--plan` **con éxito**, SnapContext extrae
384
+ los pasos clave y guarda un *skill* (procedimiento reutilizable) en
385
+ la tabla `skills`, junto a su contexto (archivos, comandos) y
386
+ metadatos (fecha, usos, fallos, confiabilidad).
387
+ - Cuando repites una tarea similar, busca el skill más parecido con
388
+ similitud semántica (embeddings; fallback Jaccard/contención sin
389
+ dependencias) y lo reutiliza como punto de partida.
390
+ - Si el skill falla, se penaliza y queda marcado para revisión; si
391
+ tiene éxito repetidamente (3+ usos sin fallos) se marca como
392
+ **confiable** y se prioriza.
393
+
394
+ Comandos útiles:
395
+
396
+ ```bash
397
+ snapcontext --skills # lista los skills aprendidos
398
+ snapcontext --curador # ejecuta una pasada del curador
399
+ snapcontext --daemon # daemon: curador + cola de skills
400
+ snapcontext --daemon-intervalo 24 # curador cada 24 h
401
+ snapcontext --plan "..." --sin-aprendizaje # desactiva el aprendizaje
402
+ ```
403
+
404
+ Ejemplo de aprendizaje:
405
+
406
+ ```bash
407
+ snapcontext --plan "migrar pagos a stripe" --auto --no-confirmar
408
+ # → al terminar (código 0): '[aprendizaje] Nuevo skill guardado:
409
+ # migrar-pagos-a-stripe'
410
+ snapcontext --plan "migrar pagos a stripe ya" --auto --no-confirmar
411
+ # → reutiliza y refuerza el skill existente (sube su confiabilidad)
412
+ ```
413
+
414
+ ### Curador autónomo
415
+
416
+ - Archiva skills sin uso durante más de 30 días.
417
+ - Fusiona skills casi idénticos (similitud ≥ 0.90), conservando el más
418
+ usado y sumando sus estadísticas.
419
+ - Notifica por CLI los skills con baja confiabilidad (< 0.4).
420
+ - Se ejecuta manualmente (`--curador`) o periódicamente vía daemon.
421
+
422
+ ### Daemon (`--daemon`)
423
+
424
+ Proceso en segundo plano que cada minuto sondea la memoria: ejecuta el
425
+ curador cuando vence el intervalo configurado (`--daemon-intervalo`,
426
+ 168 h por defecto = semanal) y procesa la cola de skills pendientes
427
+ (tabla `cola`) para ejecutarlos sin intervención. La CLI y el chat
428
+ encolan skills con `_cola_encolar()`; el agente `AgenteAprendizaje`
429
+ (en `agentes.py`) expone toda esta memoria al orquestador.
430
+
332
431
  - **Paralelismo**: con `--paralelo N` (junto a `--auto`) se ejecutan hasta N
333
432
  pasos independientes a la vez; los logs llevan el identificador `[paso N]`. Desde v2.3.0 el planificador también respeta las dependencias dinámicas: un paso cuya condición usa una variable que otro paso aún no ha producido espera a que esté disponible:
334
433
 
@@ -40,6 +40,50 @@ pip install aider-chat # ediciones de código
40
40
  snapcontext --init # asistente inicial + API key
41
41
  ```
42
42
 
43
+ ## 🧰 Instalación y onboarding sin fricción (v3.1.0)
44
+
45
+ Objetivo: instalar SnapContext y empezar a usarlo en menos de 5 minutos.
46
+
47
+ ### Modo offline con Ollama por defecto
48
+ Si no hay ninguna API key (`GEMINI_API_KEY`, `ANTHROPIC_API_KEY`,
49
+ `DEEPSEEK_API_KEY`, `GROQ_API_KEY`, …), SnapContext usa **Ollama
50
+ automáticamente** eligiendo el modelo más ligero disponible (`llama3.2`,
51
+ `phi3`, …). Si tampoco hay Ollama, muestra un mensaje claro:
52
+
53
+ > No se encontró una API key ni Ollama. Puedes instalar Ollama desde
54
+ > <https://ollama.com> o configurar una API key con `snapcontext --init`.
55
+
56
+ ### `snapcontext --diagnostico`
57
+ Revisa tu instalación con resumen en colores (verde OK / amarillo aviso /
58
+ rojo error):
59
+ - Versión de Python y si está en el PATH.
60
+ - Instalación de SnapContext (`python -m snapcontext --version`).
61
+ - Dependencias opcionales (`questionary`, `fastapi`, `sentence-transformers`, …).
62
+ - Estado del PATH (si `snapcontext` es accesible como comando).
63
+ - Memoria: integridad de la base SQLite y número de skills.
64
+ Cada problema incluye su solución sugerida.
65
+
66
+ ### `snapcontext --reparar`
67
+ Arregla instalaciones rotas:
68
+ - Limpia entornos corruptos de `uv` (carpetas vacías en `~/.snapcontext`).
69
+ - Reinstala SnapContext con `pip`.
70
+ - Recrea la base SQLite si está corrupta (respaldando la anterior).
71
+ - Si el PATH no incluye la carpeta de scripts, ejecuta `--setup-path`.
72
+
73
+ ### Tutorial y asistente mejorados
74
+ - `snapcontext --bienvenida`: tutorial interactivo de primeros pasos.
75
+ - `snapcontext --init` ahora también pregunta si quieres configurar Ollama
76
+ (ofreciendo abrir <https://ollama.com>), crear un proyecto de prueba y
77
+ ejecutar el tutorial interactivo.
78
+
79
+ ### Instalador gráfico para Windows
80
+ El instalador NSIS (`installer.nsi`, generado con
81
+ `scripts/empaquetar_exe.ps1`) ahora:
82
+ - Detecta Python y guía al usuario (abre python.org si falta).
83
+ - Añade una sección opcional "Instalar/actualizar con pip" que deja el
84
+ comando `snapcontext` disponible en cualquier terminal.
85
+ - Sigue añadiendo la carpeta al PATH y creando accesos directos.
86
+
43
87
  ## 🚀 Inicio rápido (5 minutos)
44
88
 
45
89
  ```bash
@@ -284,6 +328,61 @@ El resultado queda disponible para los pasos posteriores:
284
328
  consultable con `execute_command_status`) y `capture_output=false` para
285
329
  mostrar la salida en tiempo real.
286
330
 
331
+ ## 🧠 Aprendizaje autónomo: memoria SQLite, skills y curador (v3.0.0)
332
+
333
+ SnapContext ya no solo ejecuta tareas: **aprende de ellas**. Toda la
334
+ memoria avanzada vive en una base de datos SQLite (`~/.snapcontext/memoria.db`; sin dependencias externas: `sqlite3` viene con Python).
335
+
336
+ ### Skills: procedimientos reutilizables
337
+
338
+ - Al terminar una tarea con `--plan` **con éxito**, SnapContext extrae
339
+ los pasos clave y guarda un *skill* (procedimiento reutilizable) en
340
+ la tabla `skills`, junto a su contexto (archivos, comandos) y
341
+ metadatos (fecha, usos, fallos, confiabilidad).
342
+ - Cuando repites una tarea similar, busca el skill más parecido con
343
+ similitud semántica (embeddings; fallback Jaccard/contención sin
344
+ dependencias) y lo reutiliza como punto de partida.
345
+ - Si el skill falla, se penaliza y queda marcado para revisión; si
346
+ tiene éxito repetidamente (3+ usos sin fallos) se marca como
347
+ **confiable** y se prioriza.
348
+
349
+ Comandos útiles:
350
+
351
+ ```bash
352
+ snapcontext --skills # lista los skills aprendidos
353
+ snapcontext --curador # ejecuta una pasada del curador
354
+ snapcontext --daemon # daemon: curador + cola de skills
355
+ snapcontext --daemon-intervalo 24 # curador cada 24 h
356
+ snapcontext --plan "..." --sin-aprendizaje # desactiva el aprendizaje
357
+ ```
358
+
359
+ Ejemplo de aprendizaje:
360
+
361
+ ```bash
362
+ snapcontext --plan "migrar pagos a stripe" --auto --no-confirmar
363
+ # → al terminar (código 0): '[aprendizaje] Nuevo skill guardado:
364
+ # migrar-pagos-a-stripe'
365
+ snapcontext --plan "migrar pagos a stripe ya" --auto --no-confirmar
366
+ # → reutiliza y refuerza el skill existente (sube su confiabilidad)
367
+ ```
368
+
369
+ ### Curador autónomo
370
+
371
+ - Archiva skills sin uso durante más de 30 días.
372
+ - Fusiona skills casi idénticos (similitud ≥ 0.90), conservando el más
373
+ usado y sumando sus estadísticas.
374
+ - Notifica por CLI los skills con baja confiabilidad (< 0.4).
375
+ - Se ejecuta manualmente (`--curador`) o periódicamente vía daemon.
376
+
377
+ ### Daemon (`--daemon`)
378
+
379
+ Proceso en segundo plano que cada minuto sondea la memoria: ejecuta el
380
+ curador cuando vence el intervalo configurado (`--daemon-intervalo`,
381
+ 168 h por defecto = semanal) y procesa la cola de skills pendientes
382
+ (tabla `cola`) para ejecutarlos sin intervención. La CLI y el chat
383
+ encolan skills con `_cola_encolar()`; el agente `AgenteAprendizaje`
384
+ (en `agentes.py`) expone toda esta memoria al orquestador.
385
+
287
386
  - **Paralelismo**: con `--paralelo N` (junto a `--auto`) se ejecutan hasta N
288
387
  pasos independientes a la vez; los logs llevan el identificador `[paso N]`. Desde v2.3.0 el planificador también respeta las dependencias dinámicas: un paso cuya condición usa una variable que otro paso aún no ha producido espera a que esté disponible:
289
388
 
@@ -420,4 +420,76 @@ class AgenteTester:
420
420
  limite = getattr(sc, "MAX_ERROR_SALIDA", 4000)
421
421
  if len(limpieza) > limite:
422
422
  limpieza = "\n--- (salida recortada) ---\n" + limpieza[-limite:]
423
- return limpieza
423
+ return limpieza
424
+
425
+
426
+ class AgenteAprendizaje:
427
+ """Agente de Aprendizaje (v3.0.0): memoria persistente y skills.
428
+
429
+ Encapsula la memoria SQLite de SnapContext (skills, historial de
430
+ aprendizaje, contexto clave/valor) y el curador autónomo. Delega en las
431
+ funciones del módulo :mod:`snapcontext` para mantener una única fuente
432
+ de verdad; esta clase aporta la capa de alto nivel que consumen el
433
+ orquestador y futuras integraciones (chat, web).
434
+ """
435
+
436
+ def inicializar(self) -> str:
437
+ """Crea la base de datos de memoria si no existe. Devuelve su ruta."""
438
+ import snapcontext as sc
439
+
440
+ return sc._db_init()
441
+
442
+ def buscar_skill(self, consulta: str,
443
+ umbral: float = 0.75) -> Optional[dict]:
444
+ """Busca un skill similar a ``consulta`` (embeddings o fallback)."""
445
+ import snapcontext as sc
446
+
447
+ return sc._skill_buscar(consulta, umbral=umbral)
448
+
449
+ def generar_skill(self, consulta: str, resultados: List[dict],
450
+ raiz: str = ".") -> Optional[int]:
451
+ """Genera y guarda un skill a partir de una tarea exitosa."""
452
+ import snapcontext as sc
453
+
454
+ return sc._skill_generar(consulta, resultados, raiz=raiz)
455
+
456
+ def registrar_exito(self, skill_id: int) -> float:
457
+ """Refuerza un skill tras reutilizarlo con éxito."""
458
+ import snapcontext as sc
459
+
460
+ return sc._skill_registrar_exito(skill_id)
461
+
462
+ def registrar_fallo(self, skill_id: int) -> float:
463
+ """Penaliza un skill tras un fallo (queda marcado para revisión)."""
464
+ import snapcontext as sc
465
+
466
+ return sc._skill_registrar_fallo(skill_id)
467
+
468
+ def aprender_de_tarea(self, consulta: str, todo_ok: bool,
469
+ resultados: List[dict], raiz: str = ".",
470
+ detalle: str = "") -> Optional[int]:
471
+ """Gancho principal: registra la tarea y aprende de ella."""
472
+ import snapcontext as sc
473
+
474
+ return sc._aprender_de_tarea(consulta, todo_ok, resultados,
475
+ raiz=raiz, detalle=detalle)
476
+
477
+ def encolar_skill(self, skill_id: int) -> int:
478
+ """Encola un skill para ejecución en segundo plano por el daemon."""
479
+ import snapcontext as sc
480
+
481
+ return sc._cola_encolar(skill_id)
482
+
483
+ def curar(self, dias_sin_uso: int = 30,
484
+ umbral_fusion: float = 0.90) -> dict:
485
+ """Ejecuta el curador autónomo y devuelve el resumen de acciones."""
486
+ import snapcontext as sc
487
+
488
+ return sc._curador_ejecutar(dias_sin_uso=dias_sin_uso,
489
+ umbral_fusion=umbral_fusion)
490
+
491
+ def listar_skills(self, incluir_archivados: bool = False) -> List[dict]:
492
+ """Lista los skills almacenados en la memoria persistente."""
493
+ import snapcontext as sc
494
+
495
+ return sc._skill_listar(incluir_archivados=incluir_archivados)
@@ -21,7 +21,7 @@ import sys
21
21
  from typing import List, Optional, Tuple
22
22
 
23
23
  from agentes import (AgenteContexto, AgenteEditor, AgenteEditorAST,
24
- AgenteEditorPropio, AgenteTester)
24
+ AgenteEditorPropio, AgenteAprendizaje, AgenteTester)
25
25
 
26
26
  # Centinela diferenciado del None de "aborto": _planificar lo devuelve cuando
27
27
  # el pipeline termina de forma exitosa y temprana (p. ej. --vista-previa).
@@ -43,6 +43,7 @@ class Orquestador:
43
43
  self.agente_editor_propio = AgenteEditorPropio()
44
44
  self.agente_editor_ast = AgenteEditorAST()
45
45
  self.agente_tester = AgenteTester()
46
+ self.agente_aprendizaje = AgenteAprendizaje()
46
47
  self.evento_callback = evento_callback
47
48
 
48
49
  def _on_evento(self, evento: dict) -> None:
@@ -200,6 +201,17 @@ class Orquestador:
200
201
  )
201
202
  self._emitir_tipo("aider", accion="fin", ok=ok)
202
203
  self._emitir_tipo("final", ok=ok)
204
+ # Aprendizaje continuo (v3.0.0): registrar el resultado de la
205
+ # tarea en la memoria persistente y generar/reforzar skills.
206
+ try:
207
+ if not getattr(args, "sin_aprendizaje", False):
208
+ self.agente_aprendizaje.aprender_de_tarea(
209
+ consulta, bool(ok),
210
+ [{"descripcion": consulta, "accion": "editar",
211
+ "archivos": seleccion}],
212
+ raiz=str(raiz))
213
+ except Exception as exc:
214
+ sc.aviso(f"[aprendizaje] No se pudo registrar ({exc})")
203
215
  return 0 if ok else 1
204
216
  finally:
205
217
  # Si este orquestador fue quien registró el callback global, lo limpia.
@@ -6,13 +6,15 @@ build-backend = "setuptools.build_meta"
6
6
  # Nombre verificado disponible en PyPI (18/08/2026): pypi.org/pypi/snapcontext → 404.
7
7
  # Alternativas si algún día estuviera ocupado: "snapcontext-cli" o "snapcontext-tool".
8
8
  name = "snapcontext"
9
- version = "2.3.0"
9
+ version = "3.1.0"
10
10
  description = "SnapContext: Asistente de IA con contexto automático para desarrollo"
11
11
  readme = "README.md"
12
12
  requires-python = ">=3.9"
13
13
  # PEP 639: licencia SPDX + fichero de licencia incluido en el paquete.
14
14
  license = "MIT"
15
15
  license-files = ["LICENSE"]
16
+ # Nota (v3.0.0): la memoria avanzada usa `sqlite3`, incluido en la stdlib de
17
+ # Python; no añade dependencias externas.
16
18
  authors = [
17
19
  # TODO: cambia por tu nombre y correo reales antes de publicar.
18
20
  { name = "SnapContext Contributors", email = "tu@email.com" },
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snapcontext
3
- Version: 2.3.0
3
+ Version: 3.1.0
4
4
  Summary: SnapContext: Asistente de IA con contexto automático para desarrollo
5
5
  Author-email: SnapContext Contributors <tu@email.com>
6
6
  License-Expression: MIT
@@ -85,6 +85,50 @@ pip install aider-chat # ediciones de código
85
85
  snapcontext --init # asistente inicial + API key
86
86
  ```
87
87
 
88
+ ## 🧰 Instalación y onboarding sin fricción (v3.1.0)
89
+
90
+ Objetivo: instalar SnapContext y empezar a usarlo en menos de 5 minutos.
91
+
92
+ ### Modo offline con Ollama por defecto
93
+ Si no hay ninguna API key (`GEMINI_API_KEY`, `ANTHROPIC_API_KEY`,
94
+ `DEEPSEEK_API_KEY`, `GROQ_API_KEY`, …), SnapContext usa **Ollama
95
+ automáticamente** eligiendo el modelo más ligero disponible (`llama3.2`,
96
+ `phi3`, …). Si tampoco hay Ollama, muestra un mensaje claro:
97
+
98
+ > No se encontró una API key ni Ollama. Puedes instalar Ollama desde
99
+ > <https://ollama.com> o configurar una API key con `snapcontext --init`.
100
+
101
+ ### `snapcontext --diagnostico`
102
+ Revisa tu instalación con resumen en colores (verde OK / amarillo aviso /
103
+ rojo error):
104
+ - Versión de Python y si está en el PATH.
105
+ - Instalación de SnapContext (`python -m snapcontext --version`).
106
+ - Dependencias opcionales (`questionary`, `fastapi`, `sentence-transformers`, …).
107
+ - Estado del PATH (si `snapcontext` es accesible como comando).
108
+ - Memoria: integridad de la base SQLite y número de skills.
109
+ Cada problema incluye su solución sugerida.
110
+
111
+ ### `snapcontext --reparar`
112
+ Arregla instalaciones rotas:
113
+ - Limpia entornos corruptos de `uv` (carpetas vacías en `~/.snapcontext`).
114
+ - Reinstala SnapContext con `pip`.
115
+ - Recrea la base SQLite si está corrupta (respaldando la anterior).
116
+ - Si el PATH no incluye la carpeta de scripts, ejecuta `--setup-path`.
117
+
118
+ ### Tutorial y asistente mejorados
119
+ - `snapcontext --bienvenida`: tutorial interactivo de primeros pasos.
120
+ - `snapcontext --init` ahora también pregunta si quieres configurar Ollama
121
+ (ofreciendo abrir <https://ollama.com>), crear un proyecto de prueba y
122
+ ejecutar el tutorial interactivo.
123
+
124
+ ### Instalador gráfico para Windows
125
+ El instalador NSIS (`installer.nsi`, generado con
126
+ `scripts/empaquetar_exe.ps1`) ahora:
127
+ - Detecta Python y guía al usuario (abre python.org si falta).
128
+ - Añade una sección opcional "Instalar/actualizar con pip" que deja el
129
+ comando `snapcontext` disponible en cualquier terminal.
130
+ - Sigue añadiendo la carpeta al PATH y creando accesos directos.
131
+
88
132
  ## 🚀 Inicio rápido (5 minutos)
89
133
 
90
134
  ```bash
@@ -329,6 +373,61 @@ El resultado queda disponible para los pasos posteriores:
329
373
  consultable con `execute_command_status`) y `capture_output=false` para
330
374
  mostrar la salida en tiempo real.
331
375
 
376
+ ## 🧠 Aprendizaje autónomo: memoria SQLite, skills y curador (v3.0.0)
377
+
378
+ SnapContext ya no solo ejecuta tareas: **aprende de ellas**. Toda la
379
+ memoria avanzada vive en una base de datos SQLite (`~/.snapcontext/memoria.db`; sin dependencias externas: `sqlite3` viene con Python).
380
+
381
+ ### Skills: procedimientos reutilizables
382
+
383
+ - Al terminar una tarea con `--plan` **con éxito**, SnapContext extrae
384
+ los pasos clave y guarda un *skill* (procedimiento reutilizable) en
385
+ la tabla `skills`, junto a su contexto (archivos, comandos) y
386
+ metadatos (fecha, usos, fallos, confiabilidad).
387
+ - Cuando repites una tarea similar, busca el skill más parecido con
388
+ similitud semántica (embeddings; fallback Jaccard/contención sin
389
+ dependencias) y lo reutiliza como punto de partida.
390
+ - Si el skill falla, se penaliza y queda marcado para revisión; si
391
+ tiene éxito repetidamente (3+ usos sin fallos) se marca como
392
+ **confiable** y se prioriza.
393
+
394
+ Comandos útiles:
395
+
396
+ ```bash
397
+ snapcontext --skills # lista los skills aprendidos
398
+ snapcontext --curador # ejecuta una pasada del curador
399
+ snapcontext --daemon # daemon: curador + cola de skills
400
+ snapcontext --daemon-intervalo 24 # curador cada 24 h
401
+ snapcontext --plan "..." --sin-aprendizaje # desactiva el aprendizaje
402
+ ```
403
+
404
+ Ejemplo de aprendizaje:
405
+
406
+ ```bash
407
+ snapcontext --plan "migrar pagos a stripe" --auto --no-confirmar
408
+ # → al terminar (código 0): '[aprendizaje] Nuevo skill guardado:
409
+ # migrar-pagos-a-stripe'
410
+ snapcontext --plan "migrar pagos a stripe ya" --auto --no-confirmar
411
+ # → reutiliza y refuerza el skill existente (sube su confiabilidad)
412
+ ```
413
+
414
+ ### Curador autónomo
415
+
416
+ - Archiva skills sin uso durante más de 30 días.
417
+ - Fusiona skills casi idénticos (similitud ≥ 0.90), conservando el más
418
+ usado y sumando sus estadísticas.
419
+ - Notifica por CLI los skills con baja confiabilidad (< 0.4).
420
+ - Se ejecuta manualmente (`--curador`) o periódicamente vía daemon.
421
+
422
+ ### Daemon (`--daemon`)
423
+
424
+ Proceso en segundo plano que cada minuto sondea la memoria: ejecuta el
425
+ curador cuando vence el intervalo configurado (`--daemon-intervalo`,
426
+ 168 h por defecto = semanal) y procesa la cola de skills pendientes
427
+ (tabla `cola`) para ejecutarlos sin intervención. La CLI y el chat
428
+ encolan skills con `_cola_encolar()`; el agente `AgenteAprendizaje`
429
+ (en `agentes.py`) expone toda esta memoria al orquestador.
430
+
332
431
  - **Paralelismo**: con `--paralelo N` (junto a `--auto`) se ejecutan hasta N
333
432
  pasos independientes a la vez; los logs llevan el identificador `[paso N]`. Desde v2.3.0 el planificador también respeta las dependencias dinámicas: un paso cuya condición usa una variable que otro paso aún no ha producido espera a que esté disponible:
334
433
 
@@ -14,6 +14,7 @@ snapcontext.egg-info/__pycache__/top_level.cpython-313.pyc
14
14
  tests/test_agentes.py
15
15
  tests/test_auto_017.py
16
16
  tests/test_deteccion.py
17
+ tests/test_diagnostico_310.py
17
18
  tests/test_diff_editor_210.py
18
19
  tests/test_editor_ast_220.py
19
20
  tests/test_editor_propio_200.py
@@ -23,6 +24,7 @@ tests/test_jetbrains_170.py
23
24
  tests/test_mcp_014.py
24
25
  tests/test_mcp_140.py
25
26
  tests/test_memoria_015.py
27
+ tests/test_memoria_300.py
26
28
  tests/test_orquestador.py
27
29
  tests/test_permisos_013.py
28
30
  tests/test_plan_012.py