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.
- snapcontext-0.4.0/LICENSE +21 -0
- snapcontext-0.4.0/PKG-INFO +453 -0
- snapcontext-0.4.0/README.md +421 -0
- snapcontext-0.4.0/pyproject.toml +61 -0
- snapcontext-0.4.0/setup.cfg +4 -0
- snapcontext-0.4.0/snapcontext.egg-info/PKG-INFO +453 -0
- snapcontext-0.4.0/snapcontext.egg-info/SOURCES.txt +10 -0
- snapcontext-0.4.0/snapcontext.egg-info/dependency_links.txt +1 -0
- snapcontext-0.4.0/snapcontext.egg-info/entry_points.txt +2 -0
- snapcontext-0.4.0/snapcontext.egg-info/requires.txt +7 -0
- snapcontext-0.4.0/snapcontext.egg-info/top_level.txt +1 -0
- snapcontext-0.4.0/snapcontext.py +1593 -0
|
@@ -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
|
+
[](https://pypi.org/project/snapcontext/)
|
|
55
|
+
[](https://opensource.org/licenses/MIT)
|
|
56
|
+
[](https://www.python.org/downloads/)
|
|
57
|
+
[](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.
|