Communitygithub.com

swapit — Inventario de tóxicos domésticos + motor de intercambio

Inventario local y con estado de tóxicos domésticos + motor de intercambio. Identifica artículos del hogar que contienen disruptores endocrinos y químicos persistentes (BPA/BPS, ftalatos, PFAS/PTFE, parabenos, retardantes de llama, COV, microplásticos), puntúa cada uno según la exposición *real* (gravedad x presencia x cómo se usa x estado) y rastrea el intercambio hacia una alternativa más segura desde "marcado" -> "abastecido" -> "intercambiado". Incluye un grafo de conocimiento fundamentado y citado de ~20 peligros, ~40 clases de artículos y ~40 alternativas. Delega el abastecimiento a la habilidad `procurer`. El estado de la habilidad es la fuente de verdad — el agente es la aplicación.

¿Qué es swapit — Inventario de tóxicos domésticos + motor de intercambio?

swapit es una habilidad para agentes de IA (como Claude Code, Cursor o Codex) que convierte la preocupación vaga sobre químicos tóxicos en el hogar en un plan concreto, priorizado y rastreable. Es completamente local y con estado: el inventario del hogar se almacena en disco y persiste entre sesiones. La herramienta evalúa cada artículo según un modelo de riesgo multifactorial (gravedad del peligro x probabilidad de presencia x evidencia x relevancia de exposición x frecuencia x estado), generando una lista priorizada de los intercambios que más reducen la exposición. Además, swapit incluye un grafo de conocimiento citado con ~20 peligros, ~40 clases de artículos y ~40 alternativas seguras, y se integra con la habilidad `procurer` para agilizar el abastecimiento. Los datos privados del inventario nunca salen del dispositivo, y las contribuciones anónimas al conocimiento común se realizan mediante un sistema de corroboración opcional.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/broomva/skills/tree/HEAD/skills/commerce/swapit

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace swapit — Inventario de tóxicos domésticos + motor de intercambio?

Qué es esta habilidad

swapit convierte una preocupación vaga ("probablemente hay mucho plástico y BPA en mi casa") en un plan concreto, priorizado y rastreable. Es con estado: tu inventario del hogar vive en el disco y persiste entre sesiones. Es local primero: cero servicios de pago, nada sale de tu dispositivo a menos que optes explícitamente por el (M3) común.

Un pase produce:

  1. Un inventario de los artículos que posees, cada uno etiquetado con su clase de artículo genérica.
  2. Una puntuación de riesgo por artículo que refleja la exposición real — una sartén antiadherente rayada usada a diario a alta temperatura tiene una puntuación mucho más alta que un contenedor de plástico sin abrir en el garaje.
  3. Una lista ordenada de "intercambiar primero" — el 5% de cambios que reducen la mayor exposición.
  4. Seguimiento de intercambios — alternativa elegida, estado de abastecimiento, lista de verificación, marcadores.
  5. Un informe HTML compartible (y, en M2, un panel en vivo con swapit serve).

Los tres ámbitos (y la invariante de privacidad)

ÁmbitoQué contieneCompartir
1 · Conocimientopeligros → clases de artículo → alternativas (hechos genéricos, citados)compartible; almacenado en caché + (M3) sincronizado con el común
2 · Inventariotus artículos, habitaciones, cantidades, marcas, fotos, intercambios, marcadoresPRIVADO — nunca sale del dispositivo
3 · Común (M3)contribuciones anónimas que enriquecen el grafo de conocimiento compartidoopt-in, revisado, solo hechos genéricos

Invariante de privacidad (vinculante): El inventario del Ámbito 2 (artículos, habitaciones, cantidades, marcas, fotos, información de compra, ubicación) nunca cruza el límite de sincronización. Solo los hechos genéricos del Ámbito 1 son compartibles, mediante opt-in explícito + un swapit sync --dry-run revisable. Aplicado por un serializador de listas permitidas (scripts/anonymize.py) en el cliente y un cortafuegos en el servidor común, más pruebas difusas que afirman que cada artículo real del inventario es rechazado por la puerta. Lista de campos prohibidos: anonymize.CONTRIBUTION_FORBIDDEN (el subconjunto estructural del inventario de state.PRIVATE_FIELDS).

Modelo de datos

El estado reside en ~/.config/swapit/ (se puede anular con $SWAPIT_HOME; respeta $XDG_CONFIG_HOME).

~/.config/swapit/
├── knowledge/   hazards.jsonl · item-classes.jsonl · alternatives.jsonl · products.jsonl · procurement.jsonl
├── inventory/   events.jsonl(registro de solo añadido) · items.json · swaps.json · rooms.json · bookmarks.json
├── contributions/ queue.jsonl   (M3)
├── sync/        config.json · sync-log.jsonl   (M3)
└── photos/

Esquemas de nodo (consulta seed/*.jsonl para el conjunto de datos completo y citado):

  • peligro — id · nombre · alias · clase · mecanismo · rutas de exposición · regulatorio · gravedad(0-3) · fuerza de evidencia · fuentes
  • clase_de_artículo — id · nombre · categoría · descripción · peligros[]{hazard_id, probabilidad_de_presencia, fundamento} · pistas_de_detección · fuentes
  • alternativa — id · nombre · reemplaza[] · material · fundamento · compensaciones · advertencias · evita_peligros · preocupaciones_residuales · fuentes
  • opción_de_abastecimiento (dónde comprar, público) — id · alternativa · clase_de_artículo · minorista · región(ISO-3166-1 a2) · área · url · precio_mín · precio_máx · moneda · a_fecha_de · disponibilidad · confianza · número_de_corroboraciones
  • artículo (privado) — id · nombre · clase_de_artículo · habitación · cantidad · marca · estado · uso{frecuencia, contacto_alimentos, calor, contacto_infantil} · estado · notas · fotos
  • intercambio (privado) — id · id_artículo · alternativa_elegida · abastecimiento{estado, costo, proveedor} · lista_de_verificación[] · marcadores[]

Modelo de riesgo

riesgo = gravedad × probabilidad_de_presencia × evidencia × relevancia_de_exposición × frecuencia × estado
  • relevancia_de_exposición activa la ruta de un peligro según cómo se usa el artículo (contacto con alimentos + calor maximiza un peligro de ingestión/contacto con alimentos-calor; el contacto dérmico importa para el cuidado personal; la inhalación para limpieza/muebles; el contacto infantil lo amplifica).
  • Puntuación del artículo = suma escalada del riesgo por peligro → banda alta / media / baja.
  • Esta es la inteligencia de priorización — el análogo del "modo de fallo dominante" del procurer: arregla los pocos artículos que impulsan la mayor exposición primero, no una lista de culpa de todo lo que es plástico.

Modos

ModoQué hace
initcrear estado + cargar el grafo de conocimiento semilla
addañadir un artículo del hogar (nombre, clase, habitación, estado, uso) → imprime su evaluación
assessevaluar un artículo o una clase de artículo ad hoc → peligros + riesgo + alternativas ordenadas
listlistar inventario, filtrar por --habitación/--banda/--estado/--clase/--peligro, ordenar por riesgo
swapcrear/actualizar un plan de intercambio: elegir alternativa, establecer estado, lista de verificación, marcador, costo
scoreresumen de exposición del hogar + la clasificación de intercambiar primero
reportgenerar el informe HTML autocontenido (Categoría-C)
procureinforme de traspaso al procurer + ofertas conocidas de dónde comprar para el objetivo de intercambio (filtrar por --región); registrar una oferta encontrada (--minorista/--url/--precio-*) al común público
knowledgenavegar/buscar el grafo de conocimiento (list/search/show)
roomslistar/añadir habitaciones
selfhealvalidar bordes de conocimiento + referencias del inventario + fundamentación; salir con código no cero en errores
servepanel en vivo local en http://127.0.0.1:8731 — tablero kanban, lista de verificación, marcadores, estado; cada clic escribe de vuelta al estado
contributeponer en cola un hecho anónimo — producto / peligro (clase-de-artículo→peligro) / alternativa / abastecimiento (oferta pública de dónde comprar) / clase_de_artículo (nuevo nodo de taxonomía); aplicado localmente + filtrado para el común
syncenviar la cola de contribuciones + obtener conocimiento de la comunidad (opt-in); --dry-run previsualiza exactamente lo que se enviaría; --configure establece el punto final

Flujo típico

swapit init
swapit add --nombre "Sartén Teflon vieja" --clase utensilios-de-cocina-antiadherentes --habitación cocina \
           --estado rayada --frecuencia diaria --contacto-alimentos --calor
swapit score                      # qué intercambiar primero
swapit swap itm_xxxx --a sartén-de-hierro-fundido --estado abastecimiento --añadir-tarea "comprar sartén de 10 pulgadas"
swapit procure itm_xxxx           # -> pasar el informe a la habilidad `procurer`
swapit report --abrir              # HTML compartible

Combinación con otras habilidades

  • procurer — swapit procure <artículo> construye la necesidad ("reemplazar 3 botellas de policarbonato con vidrio/acero") y el aviso listo para procurer; procurer devuelve fuentes citadas + un presupuesto.
  • bookkeeping (P6) — un hallazgo nuevo y duradero de peligro/producto (por ejemplo, una clase de artículo recién caracterizada) se archiva proactivamente en research/entities/ y luego puede fluir al común.
  • health — contexto de exposición personal. content-creation — publicaciones educativas desde el grafo.

Disciplina de fundamentación

El conocimiento semilla cita solo organismos autorizados (NIEHS, ATSDR/CDC, US EPA, US FDA, ECHA/EU REACH, CA OEHHA Prop 65, WHO, EWG). Cada registro lleva ≥1 fuente; verified: false marca estos como de referencia (no recién obtenidos) — ejecuta un pase con fuentes (o el común) para actualizar. selfheal falla si algún nodo pierde su cita. Esto es orientación al consumidor fundamentada en la ciencia de la salud pública, no consejo médico o legal.

Recursos

  • scripts/swapit.py — punto de entrada CLI + manejadores de comandos
  • scripts/state.py — capa de estado de dos ámbitos (PRIVATE_FIELDS define el límite de sincronización)
  • scripts/ops.py — la ruta de escritura de mutación de estado única (compartida por CLI + panel)
  • scripts/knowledge.py — carga del grafo de conocimiento + resolución de bordes
  • scripts/risk.py — motor de puntuación de riesgo de exposición
  • scripts/report.py — generador de informe HTML autocontenido (Categoría-C)
  • scripts/server.py — panel en vivo swapit serve (http.server de la stdlib, solo localhost)
  • scripts/anonymize.py — la puerta de privacidad: constructores de hechos de listas permitidas + el escaneo de campos prohibidos
  • scripts/sync.py — cliente de sincronización con el común (cola, vista previa --dry-run, envío/recepción, fusión)
  • scripts/selfheal.py — validador de integridad
  • templates/dashboard.html — el panel en vivo (CSS/JS en línea, Categoría-C)
  • commons/ — el servidor de referencia del común en red (FastAPI + SQLite; despliegue restringido)
  • seed/{hazards,item-classes,alternatives}.jsonl — conocimiento inicial fundamentado
  • tests/ — pruebas de riesgo, conocimiento, auto-reparación, CLI, privacidad/anonimización, sincronización, informe y servidor

Colaboración (el común)

Las contribuciones son solo hechos genéricos — swapit contribute product|hazard|alternative|procurement|item-class construye un hecho anónimo (una asignación pública producto→clase de artículo, una corrección de borde de peligro, una alternativa, una oferta de dónde comprar, o un nuevo nodo de taxonomía), lo aplica localmente y lo pone en cola. swapit sync --dry-run muestra exactamente lo que se enviaría; swapit sync envía la cola y obtiene conocimiento de la comunidad (opt-in, después de --configure). Hechos idénticos de diferentes usuarios se corroboran (direccionados por contenido) en lugar de duplicarse; el común sirve un hecho solo cuando dos contribuyentes distintos lo corroboran (corroboration >= 2) — la moderación está filtrada por corroboración, no por confianza, porque confidence es suministrada por el llamante y un único remitente podría auto-aprobarse de otro modo. La invariante de privacidad se aplica en ambos lados (puerta anonymize del cliente + cortafuegos del servidor) — el inventario nunca cruza.

Común de dónde comprar (abastecimiento)

Un hecho procurement_option es una oferta pública: una alternativa más segura vendida por un minorista en una región (ISO-3166-1 alpha-2), con url, precio_mín/precio_máx + moneda + a_fecha_de, área y disponibilidad opcionales. Está direccionado por contenido en (alternativa, minorista, región) — la misma oferta se corrobora entre usuarios; una región diferente es un hecho diferente (el eje de escala geográfica). El precio/url/área son datos de mercado refinables: una corroboración con un a_fecha_de estrictamente más reciente actualiza el precio hacia adelante, sin retroceder datos más recientes. La costura de privacidad es nítida: la oferta pública usa minorista + precio_* y nunca el proveedor/costo privados (dónde compraste tú y qué pagaste tú se quedan en el Ámbito 2). swapit procure <artículo> --región <CC> muestra ofertas conocidas y registra nuevas que encuentres — creciendo un conjunto de datos abierto, detallado y geo-escalado que cualquiera puede usar.

Hoja de ruta

  • M1 (enviado, 0.1.0) — modelo de datos, conocimiento semilla, CLI, motor de riesgo, informe HTML estático, auto-reparación.
  • M2 (enviado, 0.2.0) — swapit serve: panel en vivo local con lectura/escritura de vuelta al estado.
  • M3 (0.3.0) — colaboración anónima + común en red (commons/, FastAPI + SQLite). Invariante de privacidad aplicada por serialización de listas permitidas + pruebas difusas tanto en cliente como en servidor.
  • M4 (esta versión, 0.4.0) — común de abastecimiento geo-escalado + crecimiento de taxonomía: los tipos de hecho procurement_option (dónde comprar público, clave por (alternativa, minorista, región), actualización de precio solo hacia adelante) y item_class (crecimiento de taxonomía filtrado por corroboración); procure muestra + registra ofertas; ofertas semilla en EE.UU./CO/DE/GB; paridad de hash entre idiomas fijada por vectores anclados. El despliegue en vivo en la infraestructura de broomva.tech está restringido a una autorización explícita (credenciales/DNS); la habilidad es completamente funcional sin conexión sin él.

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

broomva/skills

Local TTS, voice cloning, voice design, and video dubbing via the OmniVoice Studio MCP server (open-source ElevenLabs alternative; nothing leaves the machine, runs on MPS/CUDA/CPU). Use when: (1) generating speech from text in any of 646 languages, (2) cloning a voice from a 3-second reference clip, (3) designing a voice by gender/age/accent/pitch/style, (4) dubbing a video into another language, (5) listing voice profiles or personality presets, (6) producing narration where privacy, cost, or absent API keys matter, (7) non-English narration where Edge TTS/kokoro fall short, (8) batch audio for blog posts or content pipelines. Triggers: 'omnivoice', 'voice clone', 'clone this voice', 'tts', 'narrate', 'generate speech', 'voice synthesis', 'dub video', 'voice design', 'local tts', 'multilingual voice', 'narrate this post', 'elevenlabs alternative'.

broomva/skills

>- Speak an explanation out loud while working in any project — tiered text-to-speech with a pluggable backend (ElevenLabs by default and quota-guarded, macOS `say` via `--fast` for free instant local speech, local OmniVoice as an unlimited private tier). Markdown-aware, so code fences, URLs and deep paths collapse to short spoken placeholders instead of being dictated character by character, while snake_case identifiers survive intact so the listener can still search for them. Every utterance is saved to disk for later replay. Also carries a **talk mode** toggle: turn it on and the agent speaks a full readback of every turn, for as long as that session lasts — the whole response, not a summary of it, with `brief` and `marker` levels for when you want less. Talk mode is off by default and scoped to the single session that enabled it, so parallel agents in other worktrees stay silent. Use when the user asks to hear something rather than read it — an explanation of a change, a walkthrough of what just happen...

broomva/skills

Shop Tiendas D1 (Colombia, d1.com.co) from the command line — search the catalogue, resolve your nearest physical store, price a basket against that store's real stock, and quote delivery. D1 runs VTEX IO (account `d1tiendas`), so this drives its public storefront API with no admin key at all — catalogue and cart work fully anonymously, and a one-time emailed code unlocks order history. Handles the two traps that make naive D1 automation wrong — availability is regionalized (an unregioned query reports a national catalogue nobody can actually buy from) and prices arrive in two different units (search reports whole pesos, checkout reports hundredths, a silent 100x). Builds and prices baskets; it deliberately cannot pay, handing a checkout URL to a human instead. USE WHEN the user wants to find D1 products or prices, check whether D1 delivers somewhere, build or cost a D1 grocery basket, compare D1 items, or review their D1 orders. NOT FOR other Colombian retailers (Éxito, Jumbo, Ara, Alkosto), and not for c...

broomva/skills

Tekton — the shared architecture-intent substrate for co-designing systems with the agent. One typed graph across six tiers (system / journey / data / infra / decisions / qualities); views are queries, not separate diagrams. The canonical artifact is a diff-friendly YAML model both human and agent read and write; it renders to Mermaid (agent-legible, GitHub-native) and a self-contained tabbed HTML viewer (human-visual). Cross-tier traceability (`tekton query <from> <to>`) answers "which infra does this user-journey step touch?" as a path query. USE WHEN: designing or thinking deeply about architecture, a system, a data model, user journeys/flows, or a technical plan WITH the agent; when a Category-C HTML doc isn't enough because you need to see AND edit AND traverse the design across tiers; "let's design X", "architect this", "model the system", "draw the flow", "how does this fit together", "diagram this", "/tekton". NOT FOR: a one-off throwaway diagram (use Mermaid inline); prose-only ADRs (write the ADR...

broomva/skills

Generate a polished Remotion video and X thread showcasing the full agent skills inventory. Use when creating social media content about skills, rendering category-based skill visualizations, or producing animated showcases of agent capabilities. Triggers on "skills video", "showcase skills", "skills thread", "render skills", "social content for skills", or requests to visualize the skills inventory.

broomva/skills

OpenCaptions extension for Content Engine — adds intent-driven CWI (Caption With Intent) captions to the post-production pipeline. Hooks into the grade → caption → final stage. Generates captions that understand video intent (pitch, volume, emotion, emphasis) and style themselves accordingly with variable font weight, size, and color. Uses the OpenCaptions CLI or MCP server. Triggers on: 'add captions', 'opencaptions', 'CWI captions', 'intent captions'.

broomva/skills

Produce polished product launch videos using the Liquid Glass aesthetic — dark void backgrounds, 3D perspective floating UI panels, particle effects, spring animations, and cinematic pacing. Built on Remotion with Imagen 4.0 for frames and Veo 3.1 for B-roll. Use when: (1) creating a product demo or launch video, (2) showcasing a UI/app/tool with cinematic polish, (3) building a social-ready video from screenshots and renders, (4) applying the liquid glass floating panel style, (5) composing Remotion videos with 3D transforms and spring animations. Triggers on: 'launch video', 'product video', 'liquid glass video', 'demo video', 'showcase video', 'remotion video', 'floating panel', 'glass aesthetic'.

Skills relacionados