snapcontext 0.4.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.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 SnapContext Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,453 @@
1
+ Metadata-Version: 2.4
2
+ Name: snapcontext
3
+ Version: 0.4.0
4
+ Summary: SnapContext: Asistente de IA con contexto automático para desarrollo
5
+ Author-email: SnapContext Contributors <tu@email.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/TU_USUARIO/snapcontext
8
+ Project-URL: Repository, https://github.com/TU_USUARIO/snapcontext
9
+ Project-URL: Bug Tracker, https://github.com/TU_USUARIO/snapcontext/issues
10
+ Keywords: ai,aider,gemini,ollama,deepseek,groq,flutter,supabase,cli
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.9
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Software Development :: Code Generators
22
+ Requires-Python: >=3.9
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: google-generativeai>=0.8.3
26
+ Requires-Dist: openai>=1.30.0
27
+ Provides-Extra: dev
28
+ Requires-Dist: aider-chat>=0.67.0; extra == "dev"
29
+ Requires-Dist: build>=1.2.0; extra == "dev"
30
+ Requires-Dist: twine>=5.0.0; extra == "dev"
31
+ Dynamic: license-file
32
+
33
+ # SnapContext
34
+ <p align="center">
35
+ <pre>
36
+ ┌──────────────────────────────────────────────────────────┐
37
+ │ │
38
+ │ │
39
+ │ ███████╗███╗ ██╗ █████╗ ██████╗ ██████╗ ██████╗ │
40
+ │ ██╔════╝████╗ ██║██╔══██╗██╔══██╗██╔════╝██╔════╝ │
41
+ │ ███████╗██╔██╗ ██║███████║██████╔╝██║ ██║ │
42
+ │ ╚════██║██║╚██╗██║██╔══██║██╔═══╝ ██║ ██║ │
43
+ │ ███████║██║ ╚████║██║ ██║██║ ╚██████╗╚██████╗ │
44
+ │ ╚══════╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═════╝ │
45
+ │ │
46
+ │ » Selección inteligente de archivos │
47
+ │ » Soporte: Gemini · Ollama · DeepSeek · Groq │
48
+ │ » v0.4.0 │
49
+ │ │
50
+ └──────────────────────────────────────────────────────────┘
51
+ </pre>
52
+ </p>
53
+
54
+ [![PyPI version](https://badge.fury.io/py/snapcontext.svg)](https://pypi.org/project/snapcontext/)
55
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
56
+ [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
57
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com)
58
+
59
+ ## 🤝 Contribuciones
60
+
61
+ Las contribuciones son bienvenidas. Si tienes una idea, abre un issue o envía un pull request.
62
+
63
+ 1. Haz un fork del proyecto.
64
+ 2. Crea tu rama de características (`git checkout -b feature/nueva-funcionalidad`).
65
+ 3. Haz commit de tus cambios (`git commit -m 'Añadir nueva funcionalidad'`).
66
+ 4. Haz push a la rama (`git push origin feature/nueva-funcionalidad`).
67
+ 5. Abre un Pull Request.
68
+
69
+ Combina lo mejor de dos mundos:
70
+
71
+ - **Aider**: eficiencia, control y una integración Git impecable.
72
+ - **Gestión automática de contexto** (estilo Claude Code): no hace falta
73
+ decirle `/add archivo` — SnapContext averigua los archivos por ti.
74
+
75
+ Le pasas una tarea en lenguaje natural y SnapContext:
76
+
77
+ 1. **Escanea** el repositorio (por defecto las carpetas `lib/` y `supabase/`)
78
+ y encuentra los archivos más relacionados con tu consulta.
79
+ 2. **El proveedor de IA** (Gemini, Ollama local, DeepSeek o Groq) selecciona
80
+ los archivos más relevantes.
81
+ 3. **Aider** recibe esos archivos y la consulta original, y hace los cambios
82
+ en el código (con commits automáticos en Git).
83
+
84
+ ```
85
+ $ snapcontext "el botón de pago no funciona"
86
+ ℹ Repositorio: C:\...\marketplace-productos-locales
87
+ ℹ Escaneando el repositorio para encontrar candidatos...
88
+ ℹ 24 candidato(s) relevante(s) localmente.
89
+ ℹ Seleccionando con Gemini (gemini-2.5-flash)...
90
+
91
+ ✔ Archivos seleccionados (3):
92
+ • lib/pages/pago/pago_page.dart
93
+ • lib/models/pedido.dart
94
+ • supabase/functions/procesar-pago-mp/index.ts
95
+
96
+ ℹ Ejecutando Aider...
97
+ ✔ Aider terminó correctamente.
98
+ ```
99
+
100
+ ---
101
+
102
+ ## Instalación rápida (one-liner)
103
+
104
+ **Linux / macOS:**
105
+
106
+ ```bash
107
+ curl -LsSf https://NicolasBruna24.github.io/snapcontext/install.sh | sh
108
+ ```
109
+
110
+ **Windows (PowerShell):**
111
+
112
+ ```powershell
113
+ powershell -ExecutionPolicy ByPass -c "irm https://NicolasBruna24.github.io/snapcontext/install.ps1 | iex"
114
+ ```
115
+
116
+ Los scripts detectan automáticamente tu sistema, verifican Python 3.9+, instalan `uv` (gestor rápido de paquetes Python) si no está presente, y finalmente instalan SnapContext. Al terminar, el comando `snapcontext` estará disponible en tu terminal.
117
+
118
+ > **Nota:** Si prefieres una instalación manual paso a paso, ve a la sección [Instalación](#instalación).
119
+
120
+ ---
121
+
122
+ ## Requisitos
123
+
124
+ | Herramienta | Para qué | Instalación |
125
+ |---|---|---|
126
+ | Python 3.9+ | ejecutar SnapContext | [python.org](https://python.org) |
127
+ | `google-generativeai` | proveedor Gemini (por defecto) | `pip install google-generativeai` |
128
+ | `openai` | DeepSeek, Groq y Ollama (API compatible OpenAI) | `pip install openai` |
129
+ | Clave de un proveedor | `GEMINI_API_KEY`, `DEEPSEEK_API_KEY` o `GROQ_API_KEY` | [aistudio.google.com/apikey](https://aistudio.google.com/apikey) |
130
+ | `aider-chat` | hacer las modificaciones | `pip install aider-chat` |
131
+ | `flutter` (opcional) | bucle de pruebas `--test-loop` | [flutter.dev](https://flutter.dev) |
132
+
133
+ > Aider usa su propia configuración de modelo y API keys (variables `AIDER_*`
134
+ > o el fichero `.env` del proyecto). Configura Aider una vez y SnapContext lo
135
+ > reutilizará.
136
+
137
+ ---
138
+
139
+ ## Instalación
140
+
141
+ ```bash
142
+ # 1. Clonar / copiar el proyecto y entrar en él
143
+ cd SnapContext
144
+
145
+ # 2. (Recomendado) entorno virtual
146
+ python -m venv .venv
147
+ # Windows:
148
+ .venv\Scripts\activate
149
+ # Linux/Mac:
150
+ source .venv/bin/activate
151
+
152
+ # 3. Instalar en modo editable → expone el comando "snapcontext" globalmente
153
+ pip install -e .
154
+
155
+ # 4. Dependencia externa (Aider arrastra más paquetes por eso va aparte)
156
+ pip install aider-chat
157
+
158
+ # 5. Configurar la clave del proveedor que vayas a usar
159
+ # PowerShell:
160
+ $env:GEMINI_API_KEY = "tu_clave" # o DEEPSEEK_API_KEY / GROQ_API_KEY
161
+ # Linux/Mac:
162
+ export GEMINI_API_KEY=tu_clave
163
+ ```
164
+
165
+ ---
166
+
167
+ ## Uso
168
+
169
+ ```bash
170
+ # Ejemplo básico: escaneo + IA + Aider
171
+ snapcontext "el botón de pago no funciona"
172
+
173
+ # Elegir proveedor y modelo (Gemini es el proveedor por defecto)
174
+ snapcontext "..." --provider groq
175
+ snapcontext "..." --provider deepseek --model deepseek-reasoner
176
+ snapcontext "..." --provider ollama --model qwen2.5 # Ollama local
177
+
178
+ # Modo experto: revisar/añadir/eliminar archivos antes de Aider
179
+ snapcontext "revisar pago" --experto
180
+
181
+ # Si el proyecto usa carpetas distintas a lib/ y supabase/
182
+ snapcontext "arreglar login" --carpetas src migrations
183
+
184
+ # Solo ver qué archivos elegiría (sin tocar código)
185
+ snapcontext "revisar carrito" --vista-previa
186
+
187
+ # Bucle agéntico: ejecutar flutter test tras Aider y repetir si falla
188
+ snapcontext "añadir validación al formulario" --test-loop
189
+
190
+ # Cambiar el número de archivos que recibe Aider
191
+ snapcontext "agregar índice a pedidos" --max-archivos 4
192
+
193
+ # Opciones extra para Aider (modelo, etc.)
194
+ snapcontext "..." --aider-opciones "--model sonnet --no-auto-commits"
195
+
196
+ # Modo offline (sin Gemini) por si solo quieres la heurística local
197
+ snapcontext "..." --local
198
+ ```
199
+
200
+ ### Opciones principales
201
+
202
+ | Opción | Por defecto | Descripción |
203
+ |---|---|---|
204
+ | `consulta` | *(obligatorio)* | La tarea a resolver, entre comillas |
205
+ | `--directorio` | `.` | Repositorio (detecta la raíz Git automáticamente) |
206
+ | `--carpetas` | `lib supabase` | Carpetas a escanear |
207
+ | `--max-archivos` | `3` | Archivos que recibe Aider |
208
+ | `--candidatos` | `80` | Candidatos que se envían al proveedor de IA |
209
+ | `--provider` | `gemini` | Proveedor que selecciona archivos (`gemini`, `ollama`, `deepseek`, `groq`) |
210
+ | `--model` (alias `--modelo`) | según proveedor | Modelo del proveedor (o `SNAPCONTEXT_MODELO`) |
211
+ | `--local` | off | Selección sin IA (modo offline / pruebas) |
212
+ | `--vista-previa` | off | Mostrar la selección y salir |
213
+ | `--experto` (alias `--expert`) | off | Revisar/añadir/eliminar archivos antes de Aider |
214
+ | `--aider-opciones` | `""` | Flags extra para Aider |
215
+ | `--test-loop` | off | Bucle agéntico Aider → pruebas → reparar |
216
+ | `--server-loop` | off | Bucle agéntico con `flutter run`, modo automático (reintenta y pregunta s/n) |
217
+ | `--manual-loop` | off | Bucle agéntico con `flutter run`, modo manual (usuario decide cada paso) |
218
+ | `--max-intentos` | `3` | Intentos máximos de `--server-loop` |
219
+ | `--dispositivo` | `web-server` | Plataforma/dispositivo de `flutter run` |
220
+ | `--url-defecto` | `http://localhost:5000` | URL para abrir el navegador si Flutter no reporta una |
221
+ | `--comando-test` | `"flutter test"` | Comando del bucle de pruebas |
222
+ | `--max-iteraciones` | `3` | Iteraciones máximas del bucle |
223
+
224
+ ---
225
+
226
+ ## Cómo funciona por dentro
227
+
228
+ ```
229
+ consulta ──▶ [1] Escaneo local ◀── git ls-files / os.walk
230
+
231
+
232
+ candidatos ordenados (heurística: ruta + contenido)
233
+
234
+
235
+ [2] Proveedor IA (JSON) ─▶ 3 archivos más relevantes
236
+ (Gemini | Ollama | DeepSeek | Groq)
237
+
238
+
239
+ [3] Aider --yes --file A --file B --message "consulta"
240
+
241
+
242
+ [4] (opcional) verificación: flutter test / flutter run ─ si falla, Aider arregla
243
+ │ │
244
+ └── pasa ─────────────── fin (aprobado)
245
+ ```
246
+
247
+ **El escaneo** usa `git ls-files -c -o --exclude-standard` (respeta `.gitignore`
248
+ e incluye archivos nuevos), con caída automática a recorrer el árbol si no hay
249
+ Git. Luego puntúa cada archivo: coincidencias en la ruta (un nombre de archivo
250
+ como `pago_page.dart` pesa más que el directorio `pagos/`) y coincidencias en
251
+ las primeras líneas del contenido (con tildes normalizadas: `botón` → `boton`).
252
+
253
+ **El proveedor de IA** recibe la lista de candidatos y responde en JSON (con
254
+ validación y fallback si el modelo no devuelve rutas válidas). Gemini usa
255
+ `google.generativeai`; DeepSeek, Groq y Ollama usan la librería `openai` (sus
256
+ APIs son compatibles con la de OpenAI). El modo `--local` usa solo la
257
+ heurística local, sin llamar a ningún proveedor.
258
+
259
+ ---
260
+
261
+ ## Bucle agéntico (`--test-loop`)
262
+
263
+ El modo `--test-loop` implementa el paso 4 de la arquitectura:
264
+ `Aider → flutter test → si falla, Aider recibe el error real y lo arregla`,
265
+ hasta un máximo de `--max-iteraciones`.
266
+
267
+ ```bash
268
+ snapcontext "arreglar el flujo de pago" --test-loop --max-iteraciones 5
269
+ ```
270
+
271
+ Este es el punto natural para extender SnapContext: por ejemplo, añadir
272
+ `flutter analyze`, linters o más herramientas dentro de
273
+ `ejecutar_bucle_test()`.
274
+
275
+ ---
276
+
277
+ ## Modo experto (`--experto` / `--expert`)
278
+
279
+ Con `--experto`, antes de ejecutar Aider SnapContext **te deja revisar y
280
+ editar la lista de archivos** que la IA seleccionó:
281
+
282
+ ```bash
283
+ snapcontext "revisar el flujo de pago" --experto
284
+ ```
285
+
286
+ 1. Tras la selección pregunta: `¿Quieres revisar los archivos seleccionados?
287
+ (s/n)`.
288
+ - `n` → ejecuta Aider directamente (comportamiento normal).
289
+ - `s` → abre el menú experto.
290
+ 2. En el menú se muestran los archivos **numerados** y las opciones:
291
+
292
+ ```
293
+ ── Modo experto ─────────────────────────
294
+ [1] lib/pago/pago_page.dart
295
+ [2] lib/models/pedido.dart
296
+ [3] supabase/functions/procesar-pago-mp/index.ts
297
+ Opciones: [a]gregar [e]liminar [l]impiar [c]ontinuar
298
+ ```
299
+
300
+ | Opción | Qué hace |
301
+ |---|---|
302
+ | `a` | Pide una ruta y la añade (se valida que exista y esté dentro del repo) |
303
+ | `e` | Elimina por índice (fuera de rango se rechaza) |
304
+ | `l` | Vacía la lista (con confirmación) |
305
+ | `c` | Usa la lista final y ejecuta Aider |
306
+
307
+ 3. Con `c` (continuar) se muestran los archivos finales, se los pasa a Aider
308
+ y se ejecuta cualquiera de los bucles elegidos (`--test-loop`,
309
+ `--server-loop`, etc.)
310
+
311
+ ---
312
+
313
+ ## Bucle agéntico con servidor (`--server-loop` / `--manual-loop`)
314
+
315
+ En vez de solo probar, SnapContext **lanza la app** con `flutter run` en
316
+ segundo plano, detecta que el servidor arrancó (buscando `Running on`,
317
+ `Synced`, `served at`, etc., o la URL real) y deja verificar la app.
318
+
319
+ **Modo automático (`--server-loop`):**
320
+
321
+ ```bash
322
+ snapcontext "arreglar la pantalla de pago" --server-loop
323
+ snapcontext "..." --server-loop --max-intentos 5 # reintentos (por defecto 3)
324
+ snapcontext "..." --server-loop --dispositivo chrome # abrir Chrome
325
+ ```
326
+
327
+ 1. Aider edita los archivos.
328
+ 2. Se lanza `flutter run` (por defecto `-d web-server --web-port 5000`).
329
+ 3. Si el servidor **arranca** → pregunta `¿Quieres probar la app
330
+ manualmente? (s/n)`; con `s` abre el navegador con la URL real y espera a
331
+ que pulses Enter. Termina con éxito.
332
+ 4. Si el servidor **falla** → captura el error, se lo pasa a Aider
333
+ (`Arregla este error: ...`) y reintenta, hasta `--max-intentos`.
334
+ 5. Si se agotan los intentos → pregunta `¿Quieres cambiar a modo manual?
335
+ (s/n)`; con `s` pasa a `--manual-loop`, con `n` termina con error.
336
+
337
+ **Modo manual (`--manual-loop`):**
338
+
339
+ ```bash
340
+ snapcontext "revisar el flujo de login" --manual-loop
341
+ ```
342
+
343
+ Tras cada intento (arranque o fallo) pregunta siempre
344
+ `¿La app funciona correctamente? (s/n)`. Si respondes `n`, te pide que
345
+ describas el error y esa descripción se pasa a Aider
346
+ (`Arregla este error: <tu texto>`), repitiendo el ciclo.
347
+
348
+ > El servidor se cierra solo al finalizar (o con Ctrl+C), sin dejar procesos
349
+ > huérfanos. Configura tu proyecto para que `flutter run` use web si pruebas la
350
+ > interfaz en el navegador.
351
+
352
+ ---
353
+
354
+ ## Solución de problemas
355
+
356
+ | Problema | Solución |
357
+ |---|---|
358
+ | `No se encontró la librería 'google.generativeai'` | `pip install google-generativeai` |
359
+ | `No se encontró la librería 'openai'` | `pip install openai` |
360
+ | `No se encontró la variable de entorno GEMINI_API_KEY` | Configurar la clave del proveedor (ver Instalación) |
361
+ | Falta la clave de DeepSeek / Groq | Configurar `DEEPSEEK_API_KEY` / `GROQ_API_KEY` |
362
+ | `Error al llamar a Ollama` | Arrancar el servidor (`ollama serve`) y descargar el modelo (`ollama pull llama3.2`) |
363
+ | `No se encontró 'flutter'` | Instalar Flutter o revisar el PATH (bucle de servidor) |
364
+ | `--server-loop` no arranca la app | Ajustar `--dispositivo` (web-server / chrome / edge) y `--url-defecto` |
365
+ | `No se encontró el comando 'aider'` | `pip install aider-chat` |
366
+ | `No se encontraron archivos` | Revisar las carpetas escaneadas con `--carpetas` |
367
+ | Quieres probar sin gastar cuota API | `--local --vista-previa` |
368
+ | Errores de red / cuota en Gemini | Reintenta; el mensaje incluye el detalle |
369
+
370
+ ---
371
+
372
+ ## Extenderlo
373
+
374
+ El código está pensado como un **único script claro y comentado**. Puntos de
375
+ extensión fáciles:
376
+
377
+ - `escanear_repositorio()` → cambiar la heurística de relevancia local.
378
+ - `construir_prompt_seleccion()` → mejorar las instrucciones a Gemini.
379
+ - `ejecutar_bucle_test()` → añadir más herramientas al bucle agéntico.
380
+ - Constantes de configuración → ajustar el comportamiento por defecto.
381
+
382
+ ---
383
+
384
+ ## Variables de entorno
385
+
386
+ Ejemplo de configuración en **Linux/macOS** (`bash`/`zsh`):
387
+
388
+ ```bash
389
+ export GEMINI_API_KEY="tu_clave"
390
+ export DEEPSEEK_API_KEY="tu_clave"
391
+ export GROQ_API_KEY="tu_clave"
392
+ export OLLAMA_URL="http://localhost:11434"
393
+ ```
394
+
395
+ Ejemplo de configuración en **Windows** (PowerShell):
396
+
397
+ ```powershell
398
+ $env:GEMINI_API_KEY = "tu_clave"
399
+ $env:DEEPSEEK_API_KEY = "tu_clave"
400
+ $env:GROQ_API_KEY = "tu_clave"
401
+ $env:OLLAMA_URL = "http://localhost:11434"
402
+ ```
403
+
404
+ | Variable | Uso |
405
+ |---|---|
406
+ | `GEMINI_API_KEY` | Clave de Google AI Studio (proveedor `gemini`) |
407
+ | `DEEPSEEK_API_KEY` | Clave de la API de DeepSeek |
408
+ | `GROQ_API_KEY` | Clave de la API de Groq |
409
+ | `OLLAMA_URL` | URL del servidor Ollama (por defecto `http://localhost:11434`) |
410
+ | `OLLAMA_API_KEY` | Opcional, si tu servidor Ollama exige clave |
411
+ | `SNAPCONTEXT_PROVIDER` | Proveedor por defecto (opcional) |
412
+ | `SNAPCONTEXT_MODELO` | Modelo global por defecto (opcional) |
413
+ | `NO_COLOR` / `FORCE_COLOR` | Control de colores en la terminal |
414
+ | `AIDER_*` | Configuración heredada por Aider (KEY, model, etc.) |
415
+
416
+ ---
417
+
418
+ ## Compatibilidad y Permisos (Linux / macOS)
419
+
420
+ - **Permisos de ejecución**: Al instalar con `pip install -e .` o `pip install snapcontext`, pip registra el ejecutable en el `PATH` del usuario de forma automática sin requerir permisos especiales. Si ejecutas `snapcontext.py` directamente como script en Unix, puedes asignarle permisos de ejecución con `chmod +x snapcontext.py`.
421
+ - **Servidor y Navegador**: En Linux y macOS, si `webbrowser.open()` no responde en entornos sin interfaz gráfica o con configuraciones personalizadas, SnapContext usa de forma automática los comandos nativos `xdg-open` (Linux) u `open` (macOS) como respaldo sin usar `shell=True`.
422
+ - **Manejo de Señales**: En Linux/macOS y Windows, la interrupción por teclado (`Ctrl+C` / `SIGINT`) o la señal de terminación (`SIGTERM` en Unix) capturan el evento, cierran limpiamente cualquier subproceso en segundo plano (como `flutter run`) y salen de forma ordenada con código `0`.
423
+
424
+ ---
425
+
426
+ ## Publicación en PyPI
427
+
428
+ SnapContext está preparado para publicarse en PyPI (el nombre `snapcontext`
429
+ está disponible; alternativas: `snapcontext-cli`, `snapcontext-tool`). Antes
430
+ de publicar, edita en `pyproject.toml` el campo `authors` (y `[project.urls]`)
431
+ con tus datos reales.
432
+
433
+ Sigue la guía completa en **[PUBLISHING.md](PUBLISHING.md)** (build + twine):
434
+
435
+ ```bash
436
+ pip install build twine
437
+ python -m build
438
+ python -m twine check dist/*
439
+ python -m twine upload dist/*
440
+ pip install snapcontext # verificar en un entorno limpio
441
+ ```
442
+
443
+ ---
444
+ ## 🙌 Agradecimientos
445
+
446
+ - **Aider** por su excelente motor de edición de código.
447
+ - **Google Gemini** por su generoso plan gratuito.
448
+ - **Ollama**, **DeepSeek** y **Groq** por sus modelos open-source.
449
+ - La comunidad open-source por las herramientas que hacen posible este proyecto.
450
+
451
+ ## Licencia
452
+
453
+ MIT. Open-source y libre de usarlo, estudiarlo y mejorarlo.