Communitygithub.com

swapit — Inventário de tóxicos domésticos + mecanismo de troca

Skill stateful e local-first para inventariar tóxicos domésticos e gerenciar substituições. Identifica itens com disruptores endócrinos e químicos persistentes, pontua a exposição real e rastreia a troca por alternativas mais seguras.

O que é swapit — Inventário de tóxicos domésticos + mecanismo de troca?

`swapit` é uma skill de agente de IA (compatível com Claude Code, Cursor, Codex, etc.) que transforma a preocupação vaga com produtos químicos nocivos em casa em um plano concreto, priorizado e rastreável. Ela é stateful (o inventário persiste em disco entre sessões) e local-first (zero serviços pagos; os dados não saem do dispositivo a menos que o usuário opte explicitamente por compartilhar fatos anônimos). A skill constrói um grafo de conhecimento fundamentado e citado com cerca de 20 perigos (como BPA/BPS, ftalatos, PFAS/PTFE, parabenos, retardantes de chama, VOCs, microplásticos), ~40 classes de itens e ~40 alternativas. Para cada item, calcula um risco realista baseado em severidade, presença, forma de uso e condição. Gera uma lista ranqueada de substituições prioritárias, rastreia o status da troca ("marcado" → "origem" → "trocado"), produz relatórios HTML compartilháveis e um painel local ao vivo. A troca pode ser delegada à skill `procurer`. O estado da skill é a fonte da verdade — o agente é o aplicativo. A privacidade é garantida por uma barreira rigorosa: o inventário pessoal (Reino 2) nunca cruza a fronteira de sincronização; apenas fatos genéricos anônimos (Reino 1) são compartilháveis, com validação por allowlist e testes difusos.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que swapit — Inventário de tóxicos domésticos + mecanismo de troca faz?

O que esta skill faz

swapit transforma uma preocupação vaga ("provavelmente tem muito plástico e BPA na minha casa") em um plano concreto, priorizado e rastreável. Ela é stateful: seu inventário doméstico vive no disco e persiste entre sessões. É local-first: zero serviços pagos, nada sai do seu dispositivo a menos que você opte explicitamente pelo commons (M3).

Uma passada produz:

  1. Um inventário dos itens que você possui, cada um etiquetado com sua classe de item genérica.
  2. Uma pontuação de risco por item que reflete a exposição real — uma frigideira antiaderente arranhada usada diariamente em alta temperatura tem classificação muito maior do que um pote de plástico lacrado na garagem.
  3. Uma lista ranqueada de "troque primeiro" — os 5% de mudanças que cortam a maior parte da exposição.
  4. Rastreamento de troca — alternativa escolhida, status de obtenção, lista de verificação, marcadores.
  5. Um relatório HTML compartilhável (e, no M2, um painel ao vivo em swapit serve).

Os três reinos (e a invariante de privacidade)

ReinoO que contémCompartilhamento
1 · Conhecimentoperigos → classes de itens → alternativas (fatos genéricos citados)compartilhável; em cache + (M3) sincronizado com o commons
2 · Inventárioseus itens, cômodos, quantidades, marcas, fotos, trocas, marcadoresPRIVADO — nunca sai do dispositivo
3 · Commons (M3)contribuições anônimas enriquecendo o grafo de conhecimento compartilhadoopt-in, revisado, apenas fatos genéricos

Invariante de privacidade (vinculante): O inventário do Reino 2 (itens, cômodos, quantidades, marcas, fotos, informações de compra, localização) nunca cruza o limite de sincronização. Apenas fatos genéricos do Reino 1 são compartilháveis, mediante opt-in explícito + um swapit sync --dry-run revisável. Imposto por um serializador de allowlist (scripts/anonymize.py) no cliente e uma barreira de segurança no servidor commons, além de testes difusos que garantem que qualquer item de inventário real é rejeitado pela porta. Lista de campos proibidos: anonymize.CONTRIBUTION_FORBIDDEN (o subconjunto estrutural do inventário de state.PRIVATE_FIELDS).

Modelo de dados

O estado reside em ~/.config/swapit/ (substitua com $SWAPIT_HOME; respeita $XDG_CONFIG_HOME).

~/.config/swapit/
├── knowledge/   hazards.jsonl · item-classes.jsonl · alternatives.jsonl · products.jsonl · procurement.jsonl
├── inventory/   events.jsonl(append-only audit) · items.json · swaps.json · rooms.json · bookmarks.json
├── contributions/ queue.jsonl   (M3)
├── sync/        config.json · sync-log.jsonl   (M3)
└── photos/

Esquemas de nós (veja seed/*.jsonl para o conjunto de dados completo e citado):

  • perigo — id · nome · sinônimos · classe · mecanismo · rotas de exposição · regulatório · gravidade(0-3) · força da evidência · fontes
  • classe_de_item — id · nome · categoria · descrição · perigos[]{id_perigo, probabilidade_de_presença, justificativa} · dicas_de_detecção · fontes
  • alternativa — id · nome · substitui[] · material · justificativa · compensações · ressalvas · evita_perigos · preocupações_residuais · fontes
  • opção_de_obtenção (onde-comprar, público) — id · alternativa · classe_de_item · varejista · região(ISO-3166-1 a2) · área · url · preço_mín · preço_máx · moeda · data_de · disponibilidade · confiança · número_de_corroborações
  • item (privado) — id · nome · classe_de_item · cômodo · quantidade · marca · condição · uso{frequência, contato_com_alimentos, calor, contato_com_crianças} · status · notas · fotos
  • troca (privado) — id · id_item · alternativa_escolhida · obtenção{status, custo, fornecedor} · lista_de_verificação[] · marcadores[]

Modelo de risco

risco = gravidade × probabilidade_de_presença × evidência × relevância_da_exposição × frequência × condição
  • relevância_da_exposição ativa a rota de um perigo contra como o item é usado (contato com alimentos + calor maximiza um perigo de ingestão/contato com alimentos/calor; dérmico importa para cuidados pessoais; inalação para limpeza/móveis; contato com crianças amplifica).
  • Pontuação do item = soma escalada do risco por perigo → faixa alto / médio / baixo.
  • Esta é a inteligência de priorização — o análogo do "modo de falha dominante" do procurer: corrija os poucos itens que causam a maior parte da exposição primeiro, não uma lista de culpa de tudo que é plástico.

Modos

ModoO que faz
initcriar estado + carregar o grafo de conhecimento inicial
addadicionar um item doméstico (nome, classe, cômodo, condição, uso) → imprime sua avaliação
assessavaliar um item ou uma classe de item ad-hoc → perigos + risco + alternativas ranqueadas
listlistar inventário, filtrar por --cômodo/--faixa/--status/--classe/--perigo, ordenar por risco
swapcriar/atualizar um plano de troca: escolher alternativa, definir status, lista de verificação, marcador, custo
scoreresumo de exposição doméstica + ranqueamento de "troque primeiro"
reportgerar o relatório HTML autocontido (Categoria C)
procureresumo de passagem para o procurer + ofertas de onde-comprar conhecidas para o alvo da troca (filtrar por --região); registrar uma oferta encontrada (--varejista/--url/--preço-*) no commons público
knowledgenavegar/pesquisar o grafo de conhecimento (list/search/show)
roomslistar/adicionar cômodos
selfhealvalidar arestas de conhecimento + referências do inventário + fundamentação; sair com código diferente de zero em erros
servepainel local ao vivo em http://127.0.0.1:8731 — quadro kanban, lista de verificação, marcadores, status; cada clique escreve de volta no estado
contributeenfileirar um fato anônimo — product / hazard (classe-de-item→perigo) / alternative / procurement (oferta pública de onde-comprar) / item-class (novo nó de taxonomia); aplicado localmente + controlado para o commons
syncenviar a fila de contribuição + puxar conhecimento da comunidade (opt-in); --dry-run mostra exatamente o que seria enviado; --configure define o endpoint

Fluxo típico

swapit init
swapit add --name "Frigideira Teflon velha" --class nonstick-cookware --room kitchen \
           --condition scratched --frequency daily --food-contact --heat
swapit score                      # o que trocar primeiro
swapit swap itm_xxxx --to cast-iron-skillet --status sourcing --add-task "comprar frigideira 10in"
swapit procure itm_xxxx           # -> passar o resumo para a skill `procurer`
swapit report --open              # HTML compartilhável

Combinação com outras skills

  • procurer — swapit procure <item> constrói a necessidade ("substitua 3 garrafas de policarbonato por vidro/aço") e o prompt pronto para o procurer; o procurer retorna fontes citadas + uma estimativa de orçamento.
  • bookkeeping (P6) — uma descoberta nova e durável de perigo/produto (por exemplo, uma classe de item recém-caracterizada) é arquivada proativamente em research/entities/ e pode depois fluir para o commons.
  • health — contexto de exposição pessoal. content-creation — postagens educacionais a partir do grafo.

Disciplina de fundamentação

O conhecimento inicial cita apenas órgãos autoritativos (NIEHS, ATSDR/CDC, US EPA, US FDA, ECHA/EU REACH, CA OEHHA Prop 65, WHO, EWG). Cada registro carrega ≥1 fonte; verified: false marca estes como de grau de referência (não obtidos recentemente) — execute uma passagem com fontes (ou o commons) para atualizar. selfheal falha se algum nó perder sua citação. Esta é uma orientação ao consumidor baseada na ciência da saúde pública, não aconselhamento médico ou jurídico.

Recursos

  • scripts/swapit.py — ponto de entrada da CLI + manipuladores de comando
  • scripts/state.py — camada de estado de dois reinos (PRIVATE_FIELDS define o limite de sincronização)
  • scripts/ops.py — o caminho de gravação de mutação de estado único (compartilhado pela CLI + painel)
  • scripts/knowledge.py — carregamento do grafo de conhecimento + resolução de arestas
  • scripts/risk.py — mecanismo de pontuação de risco de exposição
  • scripts/report.py — gerador de relatório HTML autocontido (Categoria C)
  • scripts/server.py — painel ao vivo swapit serve (http.server da stdlib, apenas localhost)
  • scripts/anonymize.py — a porta de privacidade: construtores de fatos de allowlist + varredura de campos proibidos
  • scripts/sync.py — cliente de sincronização commons (fila, prévia --dry-run, push/pull, merge)
  • scripts/selfheal.py — validador de integridade
  • templates/dashboard.html — o painel ao vivo (CSS/JS inline, Categoria C)
  • commons/ — servidor de referência commons em rede (FastAPI + SQLite; implantação controlada)
  • seed/{hazards,item-classes,alternatives}.jsonl — conhecimento inicial fundamentado
  • tests/ — testes de risco, conhecimento, auto-cura, CLI, privacidade/anonymize, sincronização, relatório e servidor

Colaboração (o commons)

As contribuições são apenas fatos genéricos — swapit contribute product|hazard|alternative|procurement|item-class constrói um fato anônimo (um mapeamento público produto→classe-de-item, uma correção de aresta de perigo, uma alternativa, uma oferta de onde-comprar, ou um novo nó de taxonomia), aplica-o localmente e o enfileira. swapit sync --dry-run mostra exatamente o que seria enviado; swapit sync envia a fila e puxa o conhecimento da comunidade (opt-in, após --configure). Fatos idênticos de usuários diferentes corroboram (endereçados por conteúdo) em vez de duplicar; o commons serve um fato assim que dois contribuidores distintos o corroboram (corroboration >= 2) — a moderação é controlada por corroboração, não por confiança, porque confidence é fornecido pelo chamador e um único submissor poderia, de outra forma, auto-aprovar. A invariante de privacidade é imposta em ambos os lados (porta anonymize do cliente + barreira de segurança do servidor) — o inventário nunca cruza.

Commons de onde-comprar (obtenção)

Um fato procurement_option é uma oferta pública: uma alternativa mais segura vendida por um varejista em uma região (ISO-3166-1 alpha-2), com url, preço_mín/preço_máx + moeda + data_de, área e disponibilidade opcionais. É endereçado por conteúdo em (alternativa, varejista, região) — a mesma oferta corrobora entre usuários; uma região diferente é um fato diferente (o eixo de escala geográfica). Preço/url/área são dados de mercado refináveis: uma corroboração com data_de estritamente mais recente atualiza o preço para frente, nunca regredindo dados mais recentes. A costura de privacidade é nítida — a oferta pública usa varejista + preço_* e nunca o fornecedor/custo privados (onde você comprou e o que você pagou permanecem no Reino 2). swapit procure <item> --região <CC> exibe ofertas conhecidas e registra novas que você encontrar — crescendo um conjunto de dados aberto, detalhado e geo-escalado que qualquer um pode usar.

Roteiro

  • M1 (lançado, 0.1.0) — modelo de dados, conhecimento inicial, CLI, mecanismo de risco, relatório HTML estático, auto-cura.
  • M2 (lançado, 0.2.0) — swapit serve: painel local ao vivo com leitura/gravação de volta ao estado.
  • M3 (0.3.0) — colaboração anônima + commons em rede (commons/, FastAPI + SQLite). Invariante de privacidade imposta por serialização de allowlist + testes difusos no cliente e no servidor.
  • M4 (esta versão, 0.4.0) — commons de obtenção geo-escalado + crescimento de taxonomia: os tipos de fato procurement_option (onde-comprar público, chaveado por (alternativa, varejista, região), atualização de preço apenas para frente) e item_class (crescimento de taxonomia controlado por corroboração); procure exibe + registra ofertas; ofertas iniciais nos EUA/CO/DE/GB; paridade de hash entre idiomas fixada por vetores fixos. A implantação ao vivo na infraestrutura broomva.tech está condicionada a autorização explícita (credenciais/DNS); a skill é totalmente funcional offline sem ela.

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'.

Habilidades Relacionadas