Skip to content

Commit 3da7158

Browse files
committed
Fix: AI analysis key mapping mismatch, mock PocketBase/Gemini in unit tests, and add Docker test runner
1 parent 79350be commit 3da7158

6 files changed

Lines changed: 361 additions & 238 deletions

File tree

‎README.md‎

Lines changed: 134 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -1,122 +1,134 @@
1-
# FrictionLog ⚡
2-
3-
**Convierte la frustración en tu próximo proyecto.**
4-
FrictionLog es una API ligera que captura "puntos de dolor" (fricciones) diarios, los analiza con IA y los prioriza para que construyas soluciones que la gente realmente necesita.
5-
6-
---
7-
8-
### "Odio hacer esto manualmente..."
9-
10-
¿Cuántas veces has pensado eso y luego lo has olvidado?
11-
Como desarrolladores o Indie Hackers, a menudo buscamos ideas "revolucionarias" mientras ignoramos los problemas reales que tenemos delante. **FrictionLog** actúa como un buzón de quejas inteligente:
12-
13-
1. **Captura** la molestia en el momento (vía CLI o API).
14-
2. **Centraliza** tus frustraciones.
15-
3. **Genera** especificaciones técnicas automáticas (MVP) usando LLMs.
16-
17-
---
18-
19-
### 🚀 Quickstart
20-
21-
#### Opción A: Docker + PocketBase (Recomendado)
22-
23-
1. **Configura tu Base de Datos**
24-
Descarga y ejecuta [PocketBase](https://pocketbase.io/). Importa el archivo `pocketbase_schema.json` desde su panel de administrador (`http://127.0.0.1:8090/_/`).
25-
26-
2. **Clona y levanta**
27-
28-
```bash
29-
git clone https://github.com/Medalcode/FrictionLog.git && cd FrictionLog
30-
export GOOGLE_API_KEY="tu_clave_aqui" # Necesario para Gemini
31-
docker-compose up --build -d
32-
```
33-
34-
3. **Servicios**
35-
- **Dashboard:** [http://localhost:8501](http://localhost:8501)
36-
- **API:** [http://localhost:8000/docs](http://localhost:8000/docs)
37-
38-
#### Opción B: Local (Python)
39-
40-
1. **Instala y ejecuta**
41-
42-
```bash
43-
# Clona
44-
git clone https://github.com/Medalcode/FrictionLog.git && cd FrictionLog
45-
46-
# Setup entorno y dependencias
47-
python3 -m venv venv
48-
source venv/bin/activate
49-
pip install -r requirements.txt
50-
51-
# Configurar Entorno e IPs
52-
export GOOGLE_API_KEY="tu_clave_aqui" # En Windows usa: $env:GOOGLE_API_KEY="tu_clave"
53-
export POCKETBASE_URL="http://127.0.0.1:8090"
54-
55-
# Ejecuta API y Dashboard (en terminales separadas)
56-
uvicorn api:app --reload
57-
streamlit run ui.py
58-
```
59-
60-
2. **Registra una fricción (tu primer pain-point)**
61-
62-
```bash
63-
curl -X POST http://127.0.0.1:8000/registrar-friccion \
64-
-H "Content-Type: application/json" \
65-
-d '{"description": "Odio copiar datos de facturas PDF a Excel manualmente", "severity": 4}'
66-
```
67-
68-
3. **Visualiza y Prioriza**
69-
Abre el dashboard en `http://localhost:8501` para ver qué deberías construir primero.
70-
71-
### ☁️ Despliegue en Vercel (Serverless)
72-
73-
FrictionLog está completamente optimizado para entornos Serverless y Zero-Config en Vercel (gracias a su entrypoint nativo `main.py`).
74-
75-
1. Sube tu código a GitHub.
76-
2. Crea un nuevo proyecto en Vercel e importa el repositorio.
77-
3. En **Environment Variables**, añade:
78-
* `GOOGLE_API_KEY`: Tu clave de Google AI Studio.
79-
* `POCKETBASE_URL`: La URL pública donde tengas alojado tu PocketBase.
80-
81-
---
82-
83-
### 💡 Casos de Uso
84-
85-
- **Para Indie Hackers:** Valida ideas basándote en quejas recurrentes, no en suposiciones.
86-
- **Para equipos de Plataforma/DevOps:** Detecta qué herramientas internas están frenando al equipo.
87-
- **Para DevRel:** Recolecta feedback crudo y prioriza fixes en tu librería.
88-
89-
---
90-
91-
### 🛠 Estructura Lean & Stack
92-
93-
Arquitectura desacoplada para máxima hackeabilidad.
94-
95-
- **`api.py`**: Interfaz RESTful ligera asíncrona con FastAPI.
96-
- **`core.py`**: Motor de lógica y orquestador hacia la BD.
97-
- **`llm_client.py`**: Cliente estricto Pydantic + Google Gemini (1.5 Flash).
98-
- **`ui.py`**: Dashboard visual con Streamlit (Maneja Live Analytics y persistencia base).
99-
- **`docs/`**: Documentación técnica y bitácora.
100-
- **DB:** PocketBase (Reemplaza a SQLite para soportar persistencia distribuida y Serverless en Vercel/Cloud Run).
101-
- **IA:** Google AI Studio (Gemini) vía SDK oficial.
102-
103-
---
104-
105-
### 🤝 Desarrollo
106-
107-
Consulta nuestras guías internas para contribuir (ahora en `/docs`):
108-
- [Roles de Agentes](./docs/agents.md): Estructura del equipo simulado.
109-
- [Skills y Estándares](./docs/skills.md): Guías técnicas y mejores prácticas.
110-
- [Bitácora](./docs/BITACORA.md): Registro de decisiones arquitectónicas.
111-
112-
---
113-
114-
### 🔮 Roadmap
115-
116-
- [x] **Persistencia IA:** Guardar los análisis generados automáticamente en base de datos.
117-
- [ ] **CLI Wrapper:** `fl log "esto apesta"` para registro instantáneo.
118-
- [ ] **Smart Grouping:** Detectar fricciones duplicadas semánticamente.
119-
120-
---
121-
122-
_Hecho con ❤️ para constructores._
1+
# FrictionLog ⚡
2+
3+
**Convierte la frustración en tu próximo proyecto.**
4+
FrictionLog es una API ligera que captura "puntos de dolor" (fricciones) diarios, los analiza con IA y los prioriza para que construyas soluciones que la gente realmente necesita.
5+
6+
---
7+
8+
### "Odio hacer esto manualmente..."
9+
10+
¿Cuántas veces has pensado eso y luego lo has olvidado?
11+
Como desarrolladores o Indie Hackers, a menudo buscamos ideas "revolucionarias" mientras ignoramos los problemas reales que tenemos delante. **FrictionLog** actúa como un buzón de quejas inteligente:
12+
13+
1. **Captura** la molestia en el momento (vía CLI o API).
14+
2. **Centraliza** tus frustraciones.
15+
3. **Genera** especificaciones técnicas automáticas (MVP) usando LLMs.
16+
17+
---
18+
19+
### 🚀 Quickstart
20+
21+
#### Opción A: Docker + PocketBase (Recomendado)
22+
23+
1. **Configura tu Base de Datos**
24+
Descarga y ejecuta [PocketBase](https://pocketbase.io/). Importa el archivo `pocketbase_schema.json` desde su panel de administrador (`http://127.0.0.1:8090/_/`).
25+
26+
2. **Clona y levanta**
27+
28+
```bash
29+
git clone https://github.com/Medalcode/FrictionLog.git && cd FrictionLog
30+
export GOOGLE_API_KEY="tu_clave_aqui" # Necesario para Gemini
31+
docker-compose up --build -d
32+
```
33+
34+
3. **Servicios**
35+
- **Dashboard:** [http://localhost:8501](http://localhost:8501)
36+
- **API:** [http://localhost:8000/docs](http://localhost:8000/docs)
37+
38+
#### Opción B: Local (Python)
39+
40+
1. **Instala y ejecuta**
41+
42+
```bash
43+
# Clona
44+
git clone https://github.com/Medalcode/FrictionLog.git && cd FrictionLog
45+
46+
# Setup entorno y dependencias
47+
python3 -m venv venv
48+
source venv/bin/activate
49+
pip install -r requirements.txt
50+
51+
# Configurar Entorno e IPs
52+
export GOOGLE_API_KEY="tu_clave_aqui" # En Windows usa: $env:GOOGLE_API_KEY="tu_clave"
53+
export POCKETBASE_URL="http://127.0.0.1:8090"
54+
55+
# Ejecuta API y Dashboard (en terminales separadas)
56+
uvicorn api:app --reload
57+
streamlit run ui.py
58+
```
59+
60+
2. **Registra una fricción (tu primer pain-point)**
61+
62+
```bash
63+
curl -X POST http://127.0.0.1:8000/registrar-friccion \
64+
-H "Content-Type: application/json" \
65+
-d '{"description": "Odio copiar datos de facturas PDF a Excel manualmente", "severity": 4}'
66+
```
67+
68+
3. **Visualiza y Prioriza**
69+
Abre el dashboard en `http://localhost:8501` para ver qué deberías construir primero.
70+
71+
### ☁️ Despliegue en Vercel (Serverless)
72+
73+
FrictionLog está completamente optimizado para entornos Serverless y Zero-Config en Vercel (gracias a su entrypoint nativo `main.py`).
74+
75+
1. Sube tu código a GitHub.
76+
2. Crea un nuevo proyecto en Vercel e importa el repositorio.
77+
3. En **Environment Variables**, añade:
78+
* `GOOGLE_API_KEY`: Tu clave de Google AI Studio.
79+
* `POCKETBASE_URL`: La URL pública donde tengas alojado tu PocketBase.
80+
81+
---
82+
83+
### 💡 Casos de Uso
84+
85+
- **Para Indie Hackers:** Valida ideas basándote en quejas recurrentes, no en suposiciones.
86+
- **Para equipos de Plataforma/DevOps:** Detecta qué herramientas internas están frenando al equipo.
87+
- **Para DevRel:** Recolecta feedback crudo y prioriza fixes en tu librería.
88+
89+
---
90+
91+
### 🛠 Estructura Lean & Stack
92+
93+
Arquitectura desacoplada para máxima hackeabilidad.
94+
95+
- **`api.py`**: Interfaz RESTful ligera asíncrona con FastAPI.
96+
- **`core.py`**: Motor de lógica y orquestador hacia la BD.
97+
- **`llm_client.py`**: Cliente estricto Pydantic + Google Gemini (1.5 Flash).
98+
- **`ui.py`**: Dashboard visual con Streamlit (Maneja Live Analytics y persistencia base).
99+
- **`docs/`**: Documentación técnica y bitácora.
100+
- **DB:** PocketBase (Reemplaza a SQLite para soportar persistencia distribuida y Serverless en Vercel/Cloud Run).
101+
- **IA:** Google AI Studio (Gemini) vía SDK oficial.
102+
103+
---
104+
105+
### 🤝 Desarrollo
106+
107+
Consulta nuestras guías internas para contribuir (ahora en `/docs`):
108+
- [Roles de Agentes](./docs/agents.md): Estructura del equipo simulado.
109+
- [Skills y Estándares](./docs/skills.md): Guías técnicas y mejores prácticas.
110+
- [Bitácora](./docs/BITACORA.md): Registro de decisiones arquitectónicas.
111+
112+
#### 🧪 Pruebas Unitarias y de Integración (Docker)
113+
Puedes ejecutar toda la suite de pruebas unitarias localmente de forma aislada a través de Docker Compose:
114+
115+
```bash
116+
# Método A: Usando el script helper (dale permisos de ejecución primero)
117+
chmod +x run_tests_docker.sh
118+
./run_tests_docker.sh
119+
120+
# Método B: Comando directo
121+
docker-compose run --rm test
122+
```
123+
124+
---
125+
126+
### 🔮 Roadmap
127+
128+
- [x] **Persistencia IA:** Guardar los análisis generados automáticamente en base de datos.
129+
- [ ] **CLI Wrapper:** `fl log "esto apesta"` para registro instantáneo.
130+
- [ ] **Smart Grouping:** Detectar fricciones duplicadas semánticamente.
131+
132+
---
133+
134+
_Hecho con ❤️ para constructores._

‎api.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ async def analyze_friction(friction_id: str):
9292
# 3. Guardar el resultado en la misma fila en PocketBase (UPDATE / PATCH)
9393
patch_payload = {
9494
"categoria": res_ia.get("categoria", "Desconocida"),
95-
"tipo_problema": res_ia.get("tipo_problema", "Desconocido"),
96-
"impacto": res_ia.get("impacto", "Desconocido"),
97-
"idea_solucion": res_ia.get("idea_solucion", "Sin sugerencia")
95+
"tipo_problema": res_ia.get("nombre_comercial", "Desconocido"),
96+
"impacto": res_ia.get("arquitectura_sugerida", "Desconocido"),
97+
"idea_solucion": res_ia.get("funcionalidad_clave_mvp", "Sin sugerencia")
9898
}
9999

100100
patch_res = await client.patch(f"{core.PB_URL}/api/collections/fricciones/records/{friction_id}", json=patch_payload)

‎docker-compose.yml‎

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,41 @@
1-
services:
2-
api:
3-
build: .
4-
container_name: frictionlog-api
5-
command: gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
6-
environment:
7-
- POCKETBASE_URL=${POCKETBASE_URL:-http://host.docker.internal:8090}
8-
- GOOGLE_API_KEY=${GOOGLE_API_KEY}
9-
ports:
10-
- "8000:8000"
11-
restart: unless-stopped
12-
networks:
13-
- friction-net
14-
15-
dashboard:
16-
build: .
17-
container_name: frictionlog-ui
18-
command: streamlit run ui.py --server.port 8501 --server.address 0.0.0.0
19-
volumes:
20-
- ./ui.py:/app/ui.py:ro
21-
depends_on:
22-
- api
23-
ports:
24-
- "8501:8501"
25-
restart: unless-stopped
26-
networks:
27-
- friction-net
28-
29-
networks:
30-
friction-net:
31-
driver: bridge
1+
services:
2+
api:
3+
build: .
4+
container_name: frictionlog-api
5+
command: gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
6+
environment:
7+
- POCKETBASE_URL=${POCKETBASE_URL:-http://host.docker.internal:8090}
8+
- GOOGLE_API_KEY=${GOOGLE_API_KEY}
9+
ports:
10+
- "8000:8000"
11+
restart: unless-stopped
12+
networks:
13+
- friction-net
14+
15+
dashboard:
16+
build: .
17+
container_name: frictionlog-ui
18+
command: streamlit run ui.py --server.port 8501 --server.address 0.0.0.0
19+
volumes:
20+
- ./ui.py:/app/ui.py:ro
21+
depends_on:
22+
- api
23+
ports:
24+
- "8501:8501"
25+
restart: unless-stopped
26+
networks:
27+
- friction-net
28+
29+
test:
30+
build: .
31+
container_name: frictionlog-test
32+
command: pytest tests/
33+
environment:
34+
- POCKETBASE_URL=${POCKETBASE_URL:-http://host.docker.internal:8090}
35+
- GOOGLE_API_KEY=${GOOGLE_API_KEY}
36+
networks:
37+
- friction-net
38+
39+
networks:
40+
friction-net:
41+
driver: bridge

0 commit comments

Comments
 (0)