onesensei 0.2.0__py3-none-any.whl

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,516 @@
1
+ Metadata-Version: 2.4
2
+ Name: onesensei
3
+ Version: 0.2.0
4
+ Summary: Monitor local y privado de tu uso de IA (Claude Code y más). 100% local, solo lectura.
5
+ Project-URL: Homepage, https://github.com/OneTerminal-co/sensei
6
+ Author: Yulian Zapata
7
+ License: MIT
8
+ Keywords: claude-code,cost,dashboard,local,privacy,telemetry
9
+ Requires-Python: >=3.9
10
+ Provides-Extra: pro
11
+ Requires-Dist: cryptography>=42; extra == 'pro'
12
+ Provides-Extra: voice
13
+ Requires-Dist: piper-tts>=1.4; extra == 'voice'
14
+ Description-Content-Type: text/markdown
15
+
16
+ # Sensei
17
+
18
+ > *El que observa, entiende y enseña.*
19
+
20
+ Construís con agentes de IA todos los días. Claude Code, opencode, Kiro, varios modelos, decenas de sesiones, varios clientes. Pero al final del mes tenés una pregunta que nadie responde: **¿cuánto costó todo eso y valió la pena?**
21
+
22
+ Sensei observa tu trabajo. En silencio, localmente, sin enviar nada a ningún lado. Cada mañana te entrega un reporte. Cada vez que lo pedís, te dice exactamente a dónde fue tu plata y qué patrones detectó. Y cuando te ve hacer lo mismo por novena vez, dice: *eso deberías convertirlo en un skill.*
23
+
24
+ ```bash
25
+ uvx sensei # abrir el dashboard
26
+ sensei morning # tu briefing diario
27
+ sensei doctor # ver qué puede leer Sensei
28
+ ```
29
+
30
+ ---
31
+
32
+ ## La historia
33
+
34
+ **6:47 AM.** Antes de que abras la laptop, Sensei ya estuvo trabajando.
35
+
36
+ Leyó todas las sesiones de ayer — Claude Code, opencode, Kiro IDE y Kiro CLI. Calculó el costo exacto: $100/mes de tu plan Claude Max, 2.6B tokens usados, 1.8 credits de Kiro. Miró qué modelo usaste para qué, notó que gastaste el 82% del presupuesto en Opus para tareas que Sonnet resuelve igual de bien, y estimó cuánto te cuesta eso por mes. Revisó tus repos git por cambios sin commitear y sacó la próxima acción de cada `STATUS.md`. Detectó que arrancaste cinco sesiones de presales esta semana con contexto casi idéntico — el mismo brief del cliente, tipeado desde cero cada vez.
37
+
38
+ A las 7:00 AM imprimió esto en tu terminal:
39
+
40
+ ```
41
+ ════════════════════════════════════════════════
42
+ Sensei · Reporte matutino — 2026-06-30
43
+ ════════════════════════════════════════════════
44
+ Gasto total : $100.00/mes (Claude Max)
45
+ Tokens : 2.6B (suscripción)
46
+ Valor mercado : $37.5k est.
47
+ Kiro CLI : 1.8 credits
48
+
49
+ ⚡ 2 insights:
50
+ 🔴 Opus está haciendo trabajo que Sonnet puede hacer
51
+ $0 adicional pero sí costo de oportunidad
52
+ 🔵 5 sesiones largas sin checkpoint
53
+
54
+ 💡 2 skills para crear:
55
+ · client-bootstrap (alta)
56
+ · eks-triage (alta)
57
+ ════════════════════════════════════════════════
58
+ ```
59
+
60
+ ---
61
+
62
+ ## Qué hace Sensei
63
+
64
+ ```
65
+ ┌─────────────────────────────────────────────────────────┐
66
+ │ Sensei · tres capas │
67
+ │ │
68
+ │ OBSERVAR lee tus archivos locales (Claude Code, │
69
+ │ opencode, Kiro IDE, Kiro CLI, git) │
70
+ │ — nunca los escribe │
71
+ │ │
72
+ │ ENTENDER costo exacto por sesión, por modelo, │
73
+ │ por cliente. Suscripción vs API exacto. │
74
+ │ Proxy de ROI. Cache hit. Tendencia 30d. │
75
+ │ │
76
+ │ ENSEÑAR Reglas del Coach: cuándo cambiar de │
77
+ │ modelo, cuándo hacer checkpoint, qué │
78
+ │ convertir en skill. Evidencia incluida. │
79
+ └─────────────────────────────────────────────────────────┘
80
+ ```
81
+
82
+ ---
83
+
84
+ ## Arquitectura
85
+
86
+ ```
87
+ ┌─────────────────────────────────────────────────────────────────┐
88
+ │ Tu máquina │
89
+ │ │
90
+ │ ~/.claude/ ~/.local/share/ ~/.kiro/ ~/Library/Kiro/ ~/ │
91
+ │ (Claude Code) opencode/ sessions/ globalStorage/ repos│
92
+ │ │ .db cli/*.json workspace-sessions/ │
93
+ │ ▼ ▼ ▼ ▼ ▼ │
94
+ │ ┌─────────┐ ┌─────────┐ ┌──────────────────────┐ ┌──────┐ │
95
+ │ │claude_ │ │opencode │ │ kiro.py │ │git_ │ │
96
+ │ │code.py │ │.py │ │ (CLI credits + IDE │ │status│ │
97
+ │ └────┬────┘ └────┬────┘ │ tokens unificados) │ │.py │ │
98
+ │ └────────────┴───────┴──────────────┬─────────┘ └──┬───┘ │
99
+ │ ▼ │ │
100
+ │ ┌─────────────┐ │ │
101
+ │ │ engine.py │◄───────┘ │
102
+ │ │ agregar │ │
103
+ │ │ atribuir │ │
104
+ │ │ billing │ │
105
+ │ └──────┬──────┘ │
106
+ │ │ │
107
+ │ ┌──────────────────┼─────────┐ │
108
+ │ ▼ ▼ ▼ │
109
+ │ coach.py roi.py payload │
110
+ │ (reglas) (proxy) (JSON) │
111
+ │ └──────────────────┴────┬────┘ │
112
+ │ ▼ │
113
+ │ ┌──────────────┐ │
114
+ │ │ server.py │ │
115
+ │ │ 127.0.0.1 │ │
116
+ │ └──────┬───────┘ │
117
+ │ ▼ │
118
+ │ ┌──────────────────┐ │
119
+ │ │ dashboard (8 │ │
120
+ │ │ vistas) + │ │
121
+ │ │ /settings │ │
122
+ │ └──────────────────┘ │
123
+ │ ~/.sensei/ │
124
+ │ config.json ← tu configuración editable │
125
+ │ reports/ ← snapshots matutinos │
126
+ └─────────────────────────────────────────────────────────────────┘
127
+ ```
128
+
129
+ ---
130
+
131
+ ## Fuentes
132
+
133
+ | Herramienta | Superficie | Qué captura | Unidad |
134
+ |-------------|-----------|-------------|--------|
135
+ | **Claude Code** | CLI | Tokens por sesión/modelo (con desglose input/output/cache), caché, costo exacto | USD (API o suscripción) |
136
+ | **opencode** | CLI | Sesiones SQLite, modelo usado, tokens con desglose | USD o suscripción |
137
+ | **Kiro IDE** | VS Code ext. | Tokens por workspace, costo por sesión | USD |
138
+ | **Kiro CLI** | Terminal | Credits consumidos por turn | credits |
139
+ | **GitHub Copilot** | VS Code | Sesiones de chat, turns, modelo | suscripción |
140
+ | **git** | repos | Rama, dirty flag, `STATUS.md` | — |
141
+
142
+ Kiro IDE lee de `~/Library/Application Support/Kiro/User/globalStorage/kiro.kiroagent/`.
143
+ Kiro CLI lee de `~/.kiro/sessions/cli/`.
144
+ opencode lee de `~/.local/share/opencode/opencode.db` (SQLite).
145
+
146
+ **Claude Desktop (Cowork y sesiones despachadas):** cuando Claude Code corre embebido en
147
+ la app de escritorio (terminal integrada o sub-agentes de Cowork), el transcript completo
148
+ se escribe en la misma ruta que la CLI (`~/.claude/projects/`) y Sensei lo cuenta con costo
149
+ exacto. Cuando un sub-agente no llega a persistir ese transcript completo, Sensei recupera
150
+ un resumen parcial de `~/.claude/usage-data/session-meta/` (solo tokens input/output, sin
151
+ cache, tarifa `_default`) y lo muestra **separado y marcado como estimado** — nunca sumado
152
+ al costo exacto.
153
+
154
+ **Límite conocido:** esto solo cubre el motor de Claude Code. Las conversaciones de **Chat**
155
+ y **Design** (canvas/artifacts) de Claude Desktop que no invocan ese motor no dejan ningún
156
+ archivo local con conteo de tokens — ese dato vive del lado de Anthropic, no en disco. Como
157
+ Sensei es LOCAL ONLY / READ ONLY, no hay forma honesta de reconstruir ese costo sin inventarlo,
158
+ así que esas sesiones no aparecen en absoluto.
159
+
160
+ ---
161
+
162
+ ## Facturación por modelo
163
+
164
+ Sensei entiende que dentro de una misma herramienta podés tener modelos con distinto esquema de pago. Se configura en la UI de Settings (`/settings`) o directamente en `~/.sensei/config.json`:
165
+
166
+ ```json
167
+ "sources": {
168
+ "claude_code": {
169
+ "model_billing": { "_default": "subscription" },
170
+ "subscriptions": [
171
+ { "name": "Claude Max", "monthly_usd": 100, "covers": ["*"] }
172
+ ]
173
+ },
174
+ "opencode": {
175
+ "model_billing": { "_default": "free" }
176
+ },
177
+ "kiro": {
178
+ "model_billing": { "kiro/cli": "credits", "_default": "api" }
179
+ }
180
+ }
181
+ ```
182
+
183
+ **Tipos de facturación:**
184
+
185
+ | Tipo | Qué hace Sensei |
186
+ |------|-----------------|
187
+ | `api` | Costo exacto = tokens × tarifa. Se suma al total USD. |
188
+ | `subscription` | Costo = $0 adicional (cubierto por el plan). Se muestra el `monthly_usd` del plan. |
189
+ | `free` | Costo = $0. Los tokens se cuentan pero no se cobran. |
190
+ | `credits` | Unidad propia (Kiro CLI). No se mezcla con USD. |
191
+
192
+ **Presets en la UI de Settings** — un clic para configurar:
193
+ - Claude Code: API key · Claude Pro $20/mes · Claude Max $100/mes · Claude Max $200/mes · Personalizado
194
+ - opencode: API key · Modelos locales (gratis) · Plan mensual · Personalizado
195
+ - Kiro: Solo IDE por token · Solo IDE plan mensual · Solo CLI credits · CLI+IDE · Personalizado
196
+
197
+ ---
198
+
199
+ ## Configuración
200
+
201
+ Editá `~/.sensei/config.json` o usá `/settings` en el dashboard:
202
+
203
+ ### Precios (costo exacto, no estimado)
204
+
205
+ ```json
206
+ "pricing": {
207
+ "models": {
208
+ "claude-opus-4-8": { "input": 15.00, "output": 75.00,
209
+ "cache_read": 1.50, "cache_write": 18.75 },
210
+ "claude-sonnet-4-6": { "input": 3.00, "output": 15.00,
211
+ "cache_read": 0.30, "cache_write": 3.75 },
212
+ "claude-haiku-4-5": { "input": 0.80, "output": 4.00,
213
+ "cache_read": 0.08, "cache_write": 1.00 }
214
+ }
215
+ }
216
+ ```
217
+
218
+ > ¿Usás **Bedrock**? Reemplazá estos valores con tus tarifas de Bedrock. Sensei calcula `tokens × tarifa` — nunca estima.
219
+
220
+ ### Alias de modelos
221
+
222
+ Si opencode o Kiro usan nombres internos distintos al modelo real:
223
+
224
+ ```json
225
+ "model_pricing_alias": {
226
+ "big-pickle": "claude-sonnet-4-6"
227
+ }
228
+ ```
229
+
230
+ ### Atribución por cliente
231
+
232
+ ```json
233
+ "clients": {
234
+ "map": {
235
+ "acme-prd-*": "Client A",
236
+ "bancoomeva-cards": "Client A",
237
+ "freelance-*": "Client B",
238
+ "my-brain": "Personal"
239
+ }
240
+ }
241
+ ```
242
+
243
+ Soporta comodines `prefix-*`. Los proyectos sin match quedan como "Sin asignar".
244
+
245
+ ### Objetivos
246
+
247
+ ```json
248
+ "goals": {
249
+ "monthly_budget_usd": 300,
250
+ "target_score": 80,
251
+ "client_budgets": { "Client A": 200 }
252
+ }
253
+ ```
254
+
255
+ Editables en `/settings`. Con presupuesto configurado, el tab Costos muestra el gasto API real del mes, la proyección lineal a fin de mes (etiquetada como inferida) y un semáforo; con `target_score`, el Coach muestra la barra de progreso; `client_budgets` agrega semáforo por cliente. `sensei morning` incluye todo en el bloque 🎯 Objetivos.
256
+
257
+ ---
258
+
259
+ ## Cerrar el loop: de detectar a escribir
260
+
261
+ Sensei no solo diagnostica — cierra el ciclo con números medidos:
262
+
263
+ 1. **Detectar** — el Coach mide contexto repetido de verdad: agrupa sesiones de un mismo proyecto cuya apertura es *idéntica* (hash exacto del primer mensaje) y te dice cuántos tokens re-enviaste. El grafo del Perfil marca nodos con oportunidad (proyecto con sesiones repetidas → CLAUDE.md; framework recurrente → skill).
264
+ 2. **Cuantificar** — el **Simulador de model-mix** (tab Costos) recalcula tu desglose real de tokens bajo otra tarifa: aritmética exacta, no estimación. La **autopsia de sesión** (botón "¿Por qué?" en el Coach) desglosa una sesión cara por tipo de token — p.ej. "45% del costo fue cache read".
265
+ 3. **Generar** — CLAUDE.md / skill sugerido por el CLI de IA local (con fallback a reglas si no hay CLI).
266
+ 4. **Escribir** — el botón **"Aplicar…"** guarda el archivo generado, con doble restricción del server: solo dentro de tu HOME y solo archivos llamados `CLAUDE.md` o `SKILL.md`. Siempre confirmado por vos.
267
+
268
+ Además: **export CSV** de todas las sesiones (botón en Costos o `GET /api/export.csv`) con la base de cada costo declarada por fila (`api` / `plan` / `credits`), **burn rate real** (tokens/min medidos del tail de los transcripts activos — sin actividad muestra 0.0, nunca un número inventado) y **trayectoria del score** (serie de tus snapshots matutinos reales).
269
+
270
+ ---
271
+
272
+ ## En vivo: el costo mientras estás gastando
273
+
274
+ Todo lo anterior mira hacia atrás. El copiloto en vivo actúa en el momento:
275
+
276
+ **`sensei statusline`** — el costo de tu sesión activa de Claude Code, en tu prompt, en cada turno:
277
+
278
+ ```
279
+ ⛩ $2.41 · 187k tok · sonnet-4-6 · ≈$0.08/turno
280
+ ```
281
+
282
+ Agregá a `~/.claude/settings.json` (Sensei no toca ese archivo — es tuyo):
283
+
284
+ ```json
285
+ "statusLine": { "type": "command", "command": "sensei statusline" }
286
+ ```
287
+
288
+ Lectura **incremental**: guarda un cursor por sesión en `~/.sensei/cache/live/` y solo lee los bytes nuevos — ~40ms por invocación aunque el transcript pese cientos de MB. El ⚠ aparece al pasar 200k tokens (el umbral del coach: de ahí en más cada turno cuesta más sin ganar precisión).
289
+
290
+ **`/live`** (◉ en la nav del dashboard) — las sesiones activas de los últimos 30 minutos (Claude Code + opencode) con costo acumulado, **≈ costo del próximo turno** (= el último observado, etiquetado como inferido) y barra de progreso hacia el umbral de cierre. Refresco cada 5s.
291
+
292
+ ---
293
+
294
+ ## API local (127.0.0.1)
295
+
296
+ | Endpoint | Qué devuelve |
297
+ |----------|--------------|
298
+ | `GET /api/data` | Payload completo del motor (cache 30s) |
299
+ | `GET /api/history` | Serie temporal de snapshots de `~/.sensei/reports/` |
300
+ | `GET /api/whatif` | Simulador de model-mix (recálculo con tokens reales) |
301
+ | `GET /api/export.csv` | Todas las sesiones en CSV con base de costo por fila |
302
+ | `GET /api/burn` | Tokens/min reales de los últimos 5 minutos |
303
+ | `GET /api/live` | Sesiones activas ahora con costo marginal por turno |
304
+ | `GET /api/repeated_context` | Aperturas idénticas repetidas por proyecto |
305
+ | `GET /api/session_autopsy?session_id=X` | Desglose de costo dentro de una sesión |
306
+ | `GET /api/client_budgets` | Estado mensual por cliente vs presupuesto |
307
+ | `GET /api/baseline` | Percentiles de referencia estáticos (no son datos de otros usuarios) |
308
+ | `GET /api/graph` · `/api/profile` | Grafo y perfil del developer (`sensei profile update`) |
309
+ | `GET /api/llm/*` | Narrativas del Coach vía CLI de IA local, con fallback a reglas |
310
+ | `POST /api/config` | Guarda `~/.sensei/config.json` (config propia de Sensei) |
311
+ | `POST /api/apply` | Escritura confirmada de CLAUDE.md/SKILL.md dentro de HOME |
312
+
313
+ Todo valida el header `Host` contra loopback (anti DNS-rebinding) y los POST rechazan `Sec-Fetch-Site` cross-site.
314
+
315
+ ---
316
+
317
+ ## Vistas del dashboard
318
+
319
+ ```
320
+ [Resumen] [Tendencia] [ROI] [Skills] [Proyectos] [Costos] [Coach] [Perfil]
321
+
322
+ Resumen → cards por herramienta (plan/API/credits/tokens),
323
+ anillo de burn rate, gasto total, cache hit,
324
+ ROI, sesiones activas, IA subsidiada
325
+
326
+ Tendencia → gráfico de área 14/30d por herramienta:
327
+ costo USD + tokens, créditos Kiro CLI aparte
328
+
329
+ ROI → scatter por sesión
330
+ sage=replicar · sky=ok · gold=neutral · rose=revisar
331
+
332
+ Skills → ranking de uso con gráfico de barras
333
+
334
+ Proyectos → rama git + flag dirty + próxima acción
335
+ ordenados por costo (donde más invertís)
336
+
337
+ Costos → presupuesto con proyección, barras por cliente
338
+ (con semáforo por presupuesto) + por herramienta
339
+ + por modelo, simulador de model-mix, export CSV
340
+
341
+ Coach → score de madurez con trayectoria y objetivo,
342
+ insights con evidencia (badges nueva/recurrente),
343
+ autopsia de sesiones caras, contexto repetido
344
+ medido, sugerencias de skills con "Aplicar…"
345
+ "Sin datos = sin insight" (nunca fabrica)
346
+
347
+ Perfil → mapa de actividad, burn por hora, distribución
348
+ de tamaño de sesiones, tendencia de modelos
349
+ ```
350
+
351
+ ---
352
+
353
+ ## Instalación
354
+
355
+ ```bash
356
+ # Portable — sin instalación permanente:
357
+ uvx sensei
358
+
359
+ # O permanente:
360
+ pip install sensei
361
+ sensei
362
+ ```
363
+
364
+ La primera vez, el dashboard abre con un **wizard de bienvenida** de 3 pasos: qué fuentes detectó en tu máquina (con conteo real de sesiones), cómo pagás Claude (API / Pro / Max — decide cómo se calculan tus costos) y objetivos opcionales. "Omitir" usa los defaults y no vuelve a aparecer. Para setups por SSH o scripts existe la variante de terminal: `sensei setup`.
365
+
366
+ ---
367
+
368
+ ## Comandos
369
+
370
+ | Comando | Qué hace |
371
+ |---------|----------|
372
+ | `sensei` | Abrir dashboard en `http://127.0.0.1:4317` (con wizard de bienvenida la primera vez) |
373
+ | `sensei setup` | Setup guiado en terminal (para SSH/headless; el del dashboard es el principal) |
374
+ | `sensei statusline` | Costo de la sesión activa para el statusLine de Claude Code |
375
+ | `sensei doctor` | Verificar entorno: rutas, fuentes, precios |
376
+ | `sensei scan` | Imprimir payload JSON completo y salir |
377
+ | `sensei morning` | Reporte terminal + snapshot en `~/.sensei/reports/` |
378
+ | `sensei install-morning` | Instalar job diario a las 7am vía launchd (Mac) |
379
+ | `sensei --port 5000` | Cambiar puerto |
380
+ | `sensei --no-browser` | No abrir el navegador |
381
+
382
+ ---
383
+
384
+ ## Reporte matutino
385
+
386
+ ```bash
387
+ sensei morning
388
+ ```
389
+
390
+ Instalarlo como job diario en Mac:
391
+
392
+ ```bash
393
+ sensei install-morning
394
+ # Corre todos los días a las 7:00 AM
395
+ # Logs: ~/.sensei/morning.log
396
+ ```
397
+
398
+ O con crontab:
399
+
400
+ ```bash
401
+ crontab -e
402
+ 0 7 * * * sensei morning >> ~/.sensei/morning.log 2>&1
403
+ ```
404
+
405
+ ---
406
+
407
+ ## Reglas del Coach
408
+
409
+ ```
410
+ ┌──────────────────────────────────────────────────────┐
411
+ │ Regla Se activa cuando │
412
+ ├──────────────────────────────────────────────────────┤
413
+ │ modelo caro dominante >60% gasto en Opus │
414
+ │ cache hit bajo hit < 70% con >500k │
415
+ │ proyecto concentrado >50% gasto en 1 │
416
+ │ sesiones largas ≥2 sesiones >350k │
417
+ └──────────────────────────────────────────────────────┘
418
+
419
+ Sin datos → sin insight. Cada insight incluye evidencia exacta.
420
+ Fuente marcada como "regla" (heurística). Sin IA generativa.
421
+ ```
422
+
423
+ ---
424
+
425
+ ## ROI
426
+
427
+ ```
428
+ Puntaje de valor (0-100) = proxy de output (≤40 pts)
429
+ + profundidad (≤30 pts)
430
+ + git activo (≤15 pts)
431
+ + sustancia (≤15 pts)
432
+
433
+ Multiplicador ROI = valor / costo_usd
434
+
435
+ Cuadrantes:
436
+ sage → alto valor, bajo costo → replicar esto
437
+ sky → alto valor, alto costo → ok, pero vigilar
438
+ gold → bajo valor, bajo costo → neutral
439
+ rose → alto costo, bajo valor → revisar esta sesión
440
+ ```
441
+
442
+ > El valor es un **proxy** basado en señales observables (tokens, eventos, git). No es verdad absoluta — usalo como brújula, no como veredicto.
443
+
444
+ ---
445
+
446
+ ## Las tres reglas que Sensei nunca rompe
447
+
448
+ ```
449
+ 1. SOLO LOCAL el servidor escucha en 127.0.0.1 únicamente.
450
+ Nada sale de tu máquina.
451
+
452
+ 2. SOLO LECTURA Sensei nunca escribe tus archivos por su cuenta.
453
+ Única excepción, acotada y explícita: el botón
454
+ "Aplicar…" escribe CLAUDE.md/SKILL.md dentro de
455
+ tu HOME, solo cuando vos lo confirmás.
456
+
457
+ 3. NÚMEROS HONESTOS costo = tokens × tarifa, exacto.
458
+ Suscripción = plan declarado, no estimado.
459
+ Credits de Kiro CLI nunca se mezclan con USD.
460
+ El ROI siempre se etiqueta como proxy.
461
+ ```
462
+
463
+ ---
464
+
465
+ ## Tests
466
+
467
+ ```bash
468
+ python3 -m pytest tests/ -q
469
+ ```
470
+
471
+ ---
472
+
473
+ ## Estructura del proyecto
474
+
475
+ ```
476
+ sensei/
477
+ ├── pyproject.toml
478
+ ├── README.md
479
+ ├── sensei/
480
+ │ ├── cli.py punto de entrada: sensei [comando]
481
+ │ ├── config.py capas: default→usuario→env→CLI
482
+ │ ├── config.default.json
483
+ │ ├── engine.py orquestar + atribuir + billing + whatif
484
+ │ ├── coach.py motor de reglas (insights)
485
+ │ ├── maturity.py score de madurez 0-100 con señales
486
+ │ ├── roi.py proxy de valor por sesión
487
+ │ ├── llm_coach.py narrativas vía CLI de IA local + fallback
488
+ │ ├── content_parser.py señales de contenido + contexto repetido
489
+ │ ├── graph.py grafo developer (nodos con oportunidad)
490
+ │ ├── profiler.py perfil desde grafo + señales
491
+ │ ├── adapters.py CLAUDE.md / kiro-context / AGENTS.md
492
+ │ ├── morning.py briefing diario + objetivos + launchd
493
+ │ ├── server.py HTTP local (lectura + 2 escrituras acotadas)
494
+ │ ├── baseline.json percentiles de referencia estáticos
495
+ │ ├── collectors/
496
+ │ │ ├── claude_code.py + autopsia de sesión + burn rate
497
+ │ │ ├── opencode.py SQLite (opencode.db)
498
+ │ │ ├── kiro.py CLI (credits) + IDE (tokens)
499
+ │ │ ├── copilot.py transcripts de VS Code
500
+ │ │ └── git_status.py
501
+ │ └── ui/
502
+ │ ├── index.html dashboard (8 vistas)
503
+ │ └── settings.html configuración de fuentes y facturación
504
+ └── tests/
505
+ ```
506
+
507
+ ---
508
+
509
+ ## Roadmap
510
+
511
+ - [x] **Capa AI del Coach** — narrativas vía CLI de IA local (Claude Code/opencode), 100% local, con fallback a reglas
512
+ - [ ] **Paridad opencode** — contexto repetido, autopsia y burn hoy son solo Claude Code
513
+ - [ ] **Plugin VS Code** — panel WebView dentro del editor
514
+ - [ ] **Collector Bedrock** — leer directamente desde logs de CloudWatch
515
+ - [ ] **Multi-máquina** — sincronizar `~/.sensei/reports/` vía iCloud/Dropbox
516
+ - [ ] **Pesos ROI personalizados** — scoring configurable en `~/.sensei/config.json`
@@ -0,0 +1,36 @@
1
+ sensei/__init__.py,sha256=iJKt68oAGyo2Be4bPAGX_0E95shxiinMeXwiqixIVno,77
2
+ sensei/_resources.py,sha256=475kYqYd22IW9Vx_-_5ZGOVfxCE_PpBao8J5X6D6WGQ,407
3
+ sensei/adapters.py,sha256=LQFuhH6cZ94B4BBIxRJQ5MwfsIPIoio9VYCDBFl4X4U,7345
4
+ sensei/baseline.json,sha256=E3vd-63SryhzmdEWvY-sGRCP04y4KQAyCq-2kSdR3KA,434
5
+ sensei/cli.py,sha256=HAm2379EhRSJIV_vELx_EKl5vPO0E-buWE7mRtNK7TI,13391
6
+ sensei/coach.py,sha256=8LSzexvPsW_wzEQdZEcJ3Mw7nIEnBES9RMqmAZ9_b6I,17858
7
+ sensei/config.default.json,sha256=oK7KUSQQ4En9Z7BoYuLcx5dVM0qUfIxJ3WbNV4Nz2qI,5248
8
+ sensei/config.py,sha256=zazhB6Gt4qUoqCFoOZnfB4UTPkT-xfPa0WJ4Ur89bPM,4367
9
+ sensei/content_parser.py,sha256=w6APLdTvwts5_g6Zjall6KWLHp2bU9R2jZlSNoFr-1s,19482
10
+ sensei/costo.py,sha256=Zxdp3b5YGWhMAo0AJ8GEDeoYMlvZZB3o4E-msgqZUx8,10463
11
+ sensei/engine.py,sha256=CRLQKDVD8zZpNdFV57t5B8_DFI1qsI5aTds_aBSdq1k,33925
12
+ sensei/graph.py,sha256=1W1URzdDWy6NJMQ7Iu_T0x_IHGydz18i9ydtoFTQXYk,5183
13
+ sensei/licensing.py,sha256=G7l8l0T4R33N7pPiHBzy620xHCcSBVmWdU1_tB4rXso,8966
14
+ sensei/live.py,sha256=OZS7D64R7J-X8ollqDXNZXVYEnIgdO8kYdcA5ENKxao,11314
15
+ sensei/llm_coach.py,sha256=rBNhXX0qVZ56mygr-9jTOx8UEZjt-dlmMJjytaXT5m0,42965
16
+ sensei/maturity.py,sha256=bUqvYgQxVRR3ca4gH6T57nP8dAhWrCFp38Cxio1QuGM,10201
17
+ sensei/morning.py,sha256=0hU3ahJO0MjsNrYrLTjfSsBiLLDGdIyRxTWKJBfDmws,11773
18
+ sensei/profiler.py,sha256=zDyz16VIpUzcMyBK5hqq7j9wx52-sjiuHjUuvT25xkk,5998
19
+ sensei/roi.py,sha256=VpIOmjiUZtJXw4UvLELi61BU29hA2oRahvnKXdFbsi4,8507
20
+ sensei/server.py,sha256=qTDhn8NHJErYqlT78hZbaPL3PVw03fWBPZ-eOe79pPk,40889
21
+ sensei/setup_wizard.py,sha256=qt-x7XXwiJTtbvm7e1gv87o4Rk4JQ1L3SEVOJWCizpI,6017
22
+ sensei/voice.py,sha256=THqeoaSpLtvDFtsuOlAtHhXGyvgh1jxtZe339XK9Rbk,1614
23
+ sensei/collectors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ sensei/collectors/claude_code.py,sha256=qg-8_zTI8UutvBKP-jcBPzVL824NPMum6BQXmZiO7Xc,17874
25
+ sensei/collectors/copilot.py,sha256=rd3EVNNNflueRclUNueR3wh03RgoxGKSPftQB_H7yLA,10450
26
+ sensei/collectors/git_status.py,sha256=MvaAaaJpPmMOxa_F3LJI5kTzdX3a4C2rjTtpKQk2cgQ,3037
27
+ sensei/collectors/kiro.py,sha256=bGssbjInh_Ol3QvzqxyHuRToR_-wdKq_vJ3h7io7XQw,17682
28
+ sensei/collectors/opencode.py,sha256=Oe2w54azsL0Lsmuz7w1dvfXlW_6pdA596kW-wogs03g,19250
29
+ sensei/ui/index.html,sha256=OQHBly5fstNSdX-77oz2iria-M7b2JgKm4fTDQHuj5Q,228405
30
+ sensei/ui/live.html,sha256=YY2nT9NmbhX2GiueG0EkIJClQqwMfrJ0S60Wybu8auM,6246
31
+ sensei/ui/settings.html,sha256=9D4uOGNkQ7r00F0WuvmkdCc3wrLn3HDCiHyHrC8JeWk,50376
32
+ sensei/ui/setup.html,sha256=XERD9PuFv-NZrO97SPdrf2H_QNdETnLaOZFAh-VvuHA,9748
33
+ onesensei-0.2.0.dist-info/METADATA,sha256=dcnhv_KH3ZbMpmqnORvhrdZdlbXbOaAMuO6CvXSxBHQ,24063
34
+ onesensei-0.2.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
35
+ onesensei-0.2.0.dist-info/entry_points.txt,sha256=udQ3VMS6BqAIptb2ITr1BPl0CQ41ZqBCMaQsEy535WA,71
36
+ onesensei-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.30.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ onesensei = sensei.cli:main
3
+ sensei = sensei.cli:main
sensei/__init__.py ADDED
@@ -0,0 +1,2 @@
1
+ """Sensei — monitor local y privado de uso de IA."""
2
+ __version__ = "0.1.0"
sensei/_resources.py ADDED
@@ -0,0 +1,13 @@
1
+ """
2
+ Utilidad para localizar recursos del paquete tanto en desarrollo
3
+ como dentro de un ejecutable PyInstaller (sys.frozen).
4
+ """
5
+ import sys
6
+ from pathlib import Path
7
+
8
+
9
+ def pkg_root() -> Path:
10
+ """Raíz del paquete: sys._MEIPASS si está frozen, __file__.parent si no."""
11
+ if getattr(sys, "frozen", False):
12
+ return Path(sys._MEIPASS) # type: ignore[attr-defined]
13
+ return Path(__file__).parent